ZGlmZiAtLWdpdCBhL2NhbWVyYS9BbmRyb2lkLm1rIGIvY2FtZXJhL0FuZHJvaWQubWsKaW5kZXggZGE1YWM1OS4uNDcxY2IwZCAxMDA2NDQKLS0tIGEvY2FtZXJhL0FuZHJvaWQubWsKKysrIGIvY2FtZXJhL0FuZHJvaWQubWsKQEAgLTI4LDE0ICsyOCwxMyBAQAogCUlDYW1lcmFDbGllbnQuY3BwIFwKIAlJQ2FtZXJhU2VydmljZS5jcHAgXAogCUlDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY3BwIFwKKwlJQ2FtZXJhU2VydmljZVByb3h5LmNwcCBcCiAJSUNhbWVyYVJlY29yZGluZ1Byb3h5LmNwcCBcCiAJSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuY3BwIFwKLQlJUHJvQ2FtZXJhVXNlci5jcHAgXAotCUlQcm9DYW1lcmFDYWxsYmFja3MuY3BwIFwKIAljYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmNwcCBcCiAJY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmNwcCBcCiAJY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5jcHAgXAotCVByb0NhbWVyYS5jcHAgXAorCWNhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAgXAogCUNhbWVyYUJhc2UuY3BwIFwKIAlDYW1lcmFVdGlscy5jcHAgXAogCVZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwCmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FtZXJhLmNwcCBiL2NhbWVyYS9DYW1lcmEuY3BwCmluZGV4IDNhOWZiNGMuLjliZjMxMzQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmEuY3BwCisrKyBiL2NhbWVyYS9DYW1lcmEuY3BwCkBAIC05Nyw3ICs5Nyw4IEBACiAgICAgICAgIGMtPm1TdGF0dXMgPSBOT19FUlJPUjsKICAgICAgICAgY2FtZXJhID0gYzsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgY29ubmVjdGluZyB0byBjYW1lcmE6ICVkIiwgY2FtZXJhSWQpOworICAgICAgICBBTE9HVygiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgY29ubmVjdGluZyB0byBjYW1lcmEgJWQ6ICVkICglcykiLAorICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBzdGF0dXMsIHN0cmVycm9yKC1zdGF0dXMpKTsKICAgICAgICAgYy5jbGVhcigpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYUJhc2UuY3BwIGIvY2FtZXJhL0NhbWVyYUJhc2UuY3BwCmluZGV4IDY1YTFhNDcuLjVkNTBhYTggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFCYXNlLmNwcAorKysgYi9jYW1lcmEvQ2FtZXJhQmFzZS5jcHAKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVNlcnZpY2UuaD4KIAogLy8gbmVlZGVkIHRvIGluc3RhbnRpYXRlCi0jaW5jbHVkZSA8Y2FtZXJhL1Byb0NhbWVyYS5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KIAogI2luY2x1ZGUgPHN5c3RlbS9jYW1lcmFfbWV0YWRhdGEuaD4KQEAgLTIxNyw3ICsyMTYsNiBAQAogICAgIHJldHVybiBjcy0+cmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwogfQogCi10ZW1wbGF0ZSBjbGFzcyBDYW1lcmFCYXNlPFByb0NhbWVyYT47CiB0ZW1wbGF0ZSBjbGFzcyBDYW1lcmFCYXNlPENhbWVyYT47CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAgYi9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwCmluZGV4IDA0MzQzN2YuLjQ2YmNjMWQgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcApAQCAtNzQsNyArNzQsNyBAQAogICAgIGNsZWFyKCk7CiB9CiAKLWNvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiBDYW1lcmFNZXRhZGF0YTo6Z2V0QW5kTG9jaygpIHsKK2NvbnN0IGNhbWVyYV9tZXRhZGF0YV90KiBDYW1lcmFNZXRhZGF0YTo6Z2V0QW5kTG9jaygpIGNvbnN0IHsKICAgICBtTG9ja2VkID0gdHJ1ZTsKICAgICByZXR1cm4gbUJ1ZmZlcjsKIH0KQEAgLTI4OSw2ICsyODksMTcgQEAKICAgICAgICAgQUxPR0UoIiVzOiBUYWcgJWQgbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCB0YWcpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKyAgICAvLyBTYWZldHkgY2hlY2sgLSBlbnN1cmUgdGhhdCBkYXRhIGlzbid0IHBvaW50aW5nIHRvIHRoaXMgbWV0YWRhdGEsIHNpbmNlCisgICAgLy8gdGhhdCB3b3VsZCBnZXQgaW52YWxpZGF0ZWQgaWYgYSByZXNpemUgaXMgbmVlZGVkCisgICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUobUJ1ZmZlcik7CisgICAgdWludHB0cl90IGJ1ZkFkZHIgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4obUJ1ZmZlcik7CisgICAgdWludHB0cl90IGRhdGFBZGRyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGRhdGEpOworICAgIGlmIChkYXRhQWRkciA+IGJ1ZkFkZHIgJiYgZGF0YUFkZHIgPCAoYnVmQWRkciArIGJ1ZmZlclNpemUpKSB7CisgICAgICAgIEFMT0dFKCIlczogVXBkYXRlIGF0dGVtcHRlZCB3aXRoIGRhdGEgZnJvbSB0aGUgc2FtZSBtZXRhZGF0YSBidWZmZXIhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCiAgICAgc2l6ZV90IGRhdGFfc2l6ZSA9IGNhbGN1bGF0ZV9jYW1lcmFfbWV0YWRhdGFfZW50cnlfZGF0YV9zaXplKHR5cGUsCiAgICAgICAgICAgICBkYXRhX2NvdW50KTsKIApAQCAtNTgzLDcgKzU5NCw3IEBACiAgICAgICovCiAgICAgV3JpdGFibGVCbG9iIGJsb2I7CiAgICAgZG8gewotICAgICAgICByZXMgPSBkYXRhLndyaXRlQmxvYihibG9iU2l6ZSwgJmJsb2IpOworICAgICAgICByZXMgPSBkYXRhLndyaXRlQmxvYihibG9iU2l6ZSwgZmFsc2UsICZibG9iKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcCBiL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcAppbmRleCBlNWU0ZTkwLi42ODk2OWNmIDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCkBAIC01MjYsOCArNTI2LDEyIEBACiAgICAgICAgICFzdHJjbXAoZm9ybWF0LCBQSVhFTF9GT1JNQVRfUkdCQTg4ODgpID8KICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4IDogICAgLy8gUkdCODg4OAogICAgICAgICAhc3RyY21wKGZvcm1hdCwgUElYRUxfRk9STUFUX0JBWUVSX1JHR0IpID8KLSAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfUkFXX1NFTlNPUiA6ICAgLy8gUmF3IHNlbnNvciBkYXRhCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JBVzE2IDogICAvLyBSYXcgc2Vuc29yIGRhdGEKICAgICAgICAgLTE7CiB9CiAKK2Jvb2wgQ2FtZXJhUGFyYW1ldGVyczo6aXNFbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU1hcC5pc0VtcHR5KCk7Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvSUNhbWVyYVJlY29yZGluZ1Byb3h5LmNwcCBiL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHkuY3BwCmluZGV4IDNkYzBmZmIuLjUxN2I2NGYgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHkuY3BwCisrKyBiL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHkuY3BwCkBAIC0zMSw2ICszMSwxMSBAQAogICAgIFJFTEVBU0VfUkVDT1JESU5HX0ZSQU1FLAogfTsKIAordWludDhfdCBJQ2FtZXJhUmVjb3JkaW5nUHJveHk6OmJhc2VPYmplY3QgPSAwOworCitzaXplX3QgSUNhbWVyYVJlY29yZGluZ1Byb3h5OjpnZXRDb21tb25CYXNlQWRkcmVzcygpIHsKKyAgICByZXR1cm4gKHNpemVfdCkmYmFzZU9iamVjdDsKK30KIAogY2xhc3MgQnBDYW1lcmFSZWNvcmRpbmdQcm94eTogcHVibGljIEJwSW50ZXJmYWNlPElDYW1lcmFSZWNvcmRpbmdQcm94eT4KIHsKQEAgLTEwNiw0ICsxMTEsMyBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuY3BwIGIvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmNwcAppbmRleCBmYzNlNDM3Li5iMzU5ZjU3IDEwMDY0NAotLS0gYS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuY3BwCisrKyBiL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5jcHAKQEAgLTIsMTYgKzIsMTYgQEAKICoqCiAqKiBDb3B5cmlnaHQgMjAwOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogKioKLSoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyAKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAgCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiAqKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKLSoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKi8KIApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+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+IGtleVN0YXR1c0xpc3Q7CisgICAgICAgICAgICBEcm1QbHVnaW46OktleVN0YXR1cyBrZXlTdGF0dXM7CisgICAgICAgICAgICB1aW50OF90IGtleUlkMVtdID0geydrJywgJ2UnLCAneScsICcxJ307CisgICAgICAgICAgICBrZXlTdGF0dXMubUtleUlkLmNsZWFyKCk7CisgICAgICAgICAgICBrZXlTdGF0dXMubUtleUlkLmFwcGVuZEFycmF5KGtleUlkMSwgc2l6ZW9mKGtleUlkMSkpOworICAgICAgICAgICAga2V5U3RhdHVzLm1UeXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9Vc2FibGU7CisgICAgICAgICAgICBrZXlTdGF0dXNMaXN0LmFkZChrZXlTdGF0dXMpOworCisgICAgICAgICAgICB1aW50OF90IGtleUlkMltdID0geydrJywgJ2UnLCAneScsICcyJ307CisgICAgICAgICAgICBrZXlTdGF0dXMubUtleUlkLmNsZWFyKCk7CisgICAgICAgICAgICBrZXlTdGF0dXMubUtleUlkLmFwcGVuZEFycmF5KGtleUlkMiwgc2l6ZW9mKGtleUlkMikpOworICAgICAgICAgICAga2V5U3RhdHVzLm1UeXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9FeHBpcmVkOworICAgICAgICAgICAga2V5U3RhdHVzTGlzdC5hZGQoa2V5U3RhdHVzKTsKKworICAgICAgICAgICAgdWludDhfdCBrZXlJZDNbXSA9IHsnaycsICdlJywgJ3knLCAnMyd9OworICAgICAgICAgICAga2V5U3RhdHVzLm1LZXlJZC5jbGVhcigpOworICAgICAgICAgICAga2V5U3RhdHVzLm1LZXlJZC5hcHBlbmRBcnJheShrZXlJZDMsIHNpemVvZihrZXlJZDMpKTsKKyAgICAgICAgICAgIGtleVN0YXR1cy5tVHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfT3V0cHV0Tm90QWxsb3dlZDsKKyAgICAgICAgICAgIGtleVN0YXR1c0xpc3QuYWRkKGtleVN0YXR1cyk7CisKKyAgICAgICAgICAgIHVpbnQ4X3Qga2V5SWQ0W10gPSB7J2snLCAnZScsICd5JywgJzQnfTsKKyAgICAgICAgICAgIGtleVN0YXR1cy5tS2V5SWQuY2xlYXIoKTsKKyAgICAgICAgICAgIGtleVN0YXR1cy5tS2V5SWQuYXBwZW5kQXJyYXkoa2V5SWQ0LCBzaXplb2Yoa2V5SWQ0KSk7CisgICAgICAgICAgICBrZXlTdGF0dXMubVR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX1N0YXR1c1BlbmRpbmc7CisgICAgICAgICAgICBrZXlTdGF0dXNMaXN0LmFkZChrZXlTdGF0dXMpOworCisgICAgICAgICAgICB1aW50OF90IGtleUlkNVtdID0geydrJywgJ2UnLCAneScsICc1J307CisgICAgICAgICAgICBrZXlTdGF0dXMubUtleUlkLmNsZWFyKCk7CisgICAgICAgICAgICBrZXlTdGF0dXMubUtleUlkLmFwcGVuZEFycmF5KGtleUlkNSwgc2l6ZW9mKGtleUlkNSkpOworICAgICAgICAgICAga2V5U3RhdHVzLm1UeXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9JbnRlcm5hbEVycm9yOworICAgICAgICAgICAga2V5U3RhdHVzTGlzdC5hZGQoa2V5U3RhdHVzKTsKKworICAgICAgICAgICAgc2VuZEtleXNDaGFuZ2UocFNlc3Npb25JZCwgJmtleVN0YXR1c0xpc3QsIHRydWUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbVN0cmluZ1Byb3BlcnRpZXMuYWRkKG5hbWUsIHZhbHVlKTsKICAgICAgICAgfQpAQCAtNzI4LDcgKzc5OSw3IEBACiAgICAgc3NpemVfdAogICAgIE1vY2tDcnlwdG9QbHVnaW46OmRlY3J5cHQoYm9vbCBzZWN1cmUsIGNvbnN0IHVpbnQ4X3Qga2V5WzE2XSwgY29uc3QgdWludDhfdCBpdlsxNl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlIG1vZGUsIGNvbnN0IHZvaWQgKnNyY1B0ciwgY29uc3QgU3ViU2FtcGxlICpzdWJTYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMsIHZvaWQgKmRzdFB0ciwgQVN0cmluZyAqZXJyb3JEZXRhaWxNc2cpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcywgdm9pZCAqZHN0UHRyLCBBU3RyaW5nICogLyogZXJyb3JEZXRhaWxNc2cgKi8pCiAgICAgewogICAgICAgICBBTE9HRCgiTW9ja0NyeXB0b1BsdWdpbjo6ZGVjcnlwdChzZWN1cmU9JWQsIGtleT0lcywgaXY9JXMsIG1vZGU9JWQsIHNyYz0lcCwgIgogICAgICAgICAgICAgICAic3ViU2FtcGxlcz0lcywgZHN0PSVwKSIsCkBAIC03NTcsNyArODI4LDcgQEAKICAgICB7CiAgICAgICAgIFN0cmluZzggcmVzdWx0OwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVN1YlNhbXBsZXM7IGkrKykgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiWyV6dV0ge2NsZWFyOiV6dSwgZW5jcnlwdGVkOiV6dX0gIiwgaSwKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlslenVdIHtjbGVhcjoldSwgZW5jcnlwdGVkOiV1fSAiLCBpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mQ2xlYXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzW2ldLm1OdW1CeXRlc09mRW5jcnlwdGVkRGF0YSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL21vY2svTW9ja0RybUNyeXB0b1BsdWdpbi5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9Nb2NrRHJtQ3J5cHRvUGx1Z2luLmgKaW5kZXggZDFkODA1OC4uZDBmMmRkYiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9Nb2NrRHJtQ3J5cHRvUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvbW9jay9Nb2NrRHJtQ3J5cHRvUGx1Z2luLmgKQEAgLTYyLDcgKzYyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmluaXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJm1pbWVUeXBlLCBLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gY29uc3QgJm9wdGlvbmFsUGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnJlcXVlc3QsIFN0cmluZzggJmRlZmF1bHRVcmwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmcmVxdWVzdCwgU3RyaW5nOCAmZGVmYXVsdFVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlSZXF1ZXN0VHlwZSAqa2V5UmVxdWVzdFR5cGUpOwogCiAgICAgICAgIHN0YXR1c190IHByb3ZpZGVLZXlSZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmcmVzcG9uc2UsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaAppbmRleCAxMjU0ZDNjLi45NTNkNzExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmgKQEAgLTU2LDcgKzU2LDcgQEAKICAgICAgKiB0aHJlYWQtc2FmZXR5LCBpdCBzaW1wbHkgcHJldmVudHMgdGhlIGNhbWVyYV9tZXRhZGF0YV90IHBvaW50ZXIgcmV0dXJuZWQKICAgICAgKiBoZXJlIGZyb20gYmVpbmcgYWNjaWRlbnRhbGx5IGludmFsaWRhdGVkIGJ5IENhbWVyYU1ldGFkYXRhIG9wZXJhdGlvbnMuCiAgICAgICovCi0gICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QqIGdldEFuZExvY2soKTsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCogZ2V0QW5kTG9jaygpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogVW5sb2NrIHRoZSBDYW1lcmFNZXRhZGF0YSBmb3IgdXNlIGFnYWluLiBBZnRlciB0aGlzIHVubG9jaywgdGhlIHBvaW50ZXIKQEAgLTIwOCw3ICsyMDgsNyBAQAogCiAgIHByaXZhdGU6CiAgICAgY2FtZXJhX21ldGFkYXRhX3QgKm1CdWZmZXI7Ci0gICAgYm9vbCAgICAgICAgICAgICAgIG1Mb2NrZWQ7CisgICAgbXV0YWJsZSBib29sICAgICAgIG1Mb2NrZWQ7CiAKICAgICAvKioKICAgICAgKiBDaGVjayBpZiB0YWcgaGFzIGEgZ2l2ZW4gdHlwZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oIGIvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oCmluZGV4IGM2MDc0ZmMuLmJhMzNmZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaAorKysgYi9pbmNsdWRlL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmgKQEAgLTEwOCw2ICsxMDgsOSBAQAogICAgICAqLwogICAgIHZvaWQgZ2V0U3VwcG9ydGVkUHJldmlld0Zvcm1hdHMoVmVjdG9yPGludD4mIGZvcm1hdHMpIGNvbnN0OwogCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIG5vIGtleXMgYXJlIHByZXNlbnQKKyAgICBib29sIGlzRW1wdHkoKSBjb25zdDsKKwogICAgIC8vIFBhcmFtZXRlciBrZXlzIHRvIGNvbW11bmljYXRlIGJldHdlZW4gY2FtZXJhIGFwcGxpY2F0aW9uIGFuZCBkcml2ZXIuCiAgICAgLy8gVGhlIGFjY2VzcyAocmVhZC93cml0ZSwgcmVhZCBvbmx5LCBvciB3cml0ZSBvbmx5KSBpcyB2aWV3ZWQgZnJvbSB0aGUKICAgICAvLyBwZXJzcGVjdGl2ZSBvZiBhcHBsaWNhdGlvbnMsIG5vdCBkcml2ZXIuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhUmVjb3JkaW5nUHJveHkuaCBiL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eS5oCmluZGV4IDJhYWMyODQuLjRlZGY5Y2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eS5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eS5oCkBAIC04Myw2ICs4MywxMiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHN0YXJ0UmVjb3JkaW5nKGNvbnN0IHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyPiYgbGlzdGVuZXIpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBzdG9wUmVjb3JkaW5nKCkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHJlbGVhc2VSZWNvcmRpbmdGcmFtZShjb25zdCBzcDxJTWVtb3J5PiYgbWVtKSA9IDA7CisKKyAgICAvLyBiLzI4NDY2NzAxCisgICAgc3RhdGljICBzaXplX3QgICAgICAgICAgZ2V0Q29tbW9uQmFzZUFkZHJlc3MoKTsKKyAgcHJpdmF0ZToKKworICAgIHN0YXRpYyAgdWludDhfdCAgICAgICAgIGJhc2VPYmplY3Q7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5oIGIvaW5jbHVkZS9jYW1lcmEvSUNhbWVyYVNlcnZpY2UuaAppbmRleCBmN2YwNmJiLi4xYjY4YjVmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NhbWVyYS9JQ2FtZXJhU2VydmljZS5oCisrKyBiL2luY2x1ZGUvY2FtZXJhL0lDYW1lcmFTZXJ2aWNlLmgKQEAgLTI1LDggKzI1LDYgQEAKIAogY2xhc3MgSUNhbWVyYTsKIGNsYXNzIElDYW1lcmFDbGllbnQ7Ci1jbGFzcyBJUHJvQ2FtZXJhVXNlcjsKLWNsYXNzIElQcm9DYW1lcmFDYWxsYmFja3M7CiBjbGFzcyBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOwogY2xhc3MgSUNhbWVyYURldmljZVVzZXI7CiBjbGFzcyBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOwpAQCAtNDQsNyArNDIsNiBAQAogICAgICAgICBHRVRfTlVNQkVSX09GX0NBTUVSQVMgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAogICAgICAgICBHRVRfQ0FNRVJBX0lORk8sCiAgICAgICAgIENPTk5FQ1QsCi0gICAgICAgIENPTk5FQ1RfUFJPLAogICAgICAgICBDT05ORUNUX0RFVklDRSwKICAgICAgICAgQUREX0xJU1RFTkVSLAogICAgICAgICBSRU1PVkVfTElTVEVORVIsCkBAIC01Myw2ICs1MCw4IEBACiAgICAgICAgIEdFVF9MRUdBQ1lfUEFSQU1FVEVSUywKICAgICAgICAgU1VQUE9SVFNfQ0FNRVJBX0FQSSwKICAgICAgICAgQ09OTkVDVF9MRUdBQ1ksCisgICAgICAgIFNFVF9UT1JDSF9NT0RFLAorICAgICAgICBOT1RJRllfU1lTVEVNX0VWRU5ULAogICAgIH07CiAKICAgICBlbnVtIHsKQEAgLTY1LDEzICs2NCwzNCBAQAogICAgIH07CiAKICAgICBlbnVtIHsKKyAgICAgICAgQ0FNRVJBX1RZUEVfQkFDS1dBUkRfQ09NUEFUSUJMRSA9IDAsCisgICAgICAgIENBTUVSQV9UWVBFX0FMTCA9IDEsCisgICAgfTsKKworICAgIGVudW0gewogICAgICAgICBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVEID0gLTEKLSAgICAgIH07CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEtlZXAgdXAtdG8tZGF0ZSB3aXRoIGRlY2xhcmF0aW9ucyBpbgorICAgICAqIGZyYW1ld29ya3MvYmFzZS9zZXJ2aWNlcy9jb3JlL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL2NhbWVyYS9DYW1lcmFTZXJ2aWNlLmphdmEKKyAgICAgKgorICAgICAqIFRoZXNlIGV2ZW50IGNvZGVzIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIHdpdGggdGhlIG5vdGlmeVN5c3RlbUV2ZW50IGNhbGwuCisgICAgICovCisgICAgZW51bSB7CisgICAgICAgIE5PX0VWRU5UID0gMCwKKyAgICAgICAgVVNFUl9TV0lUQ0hFRCwKKyAgICB9OwogCiBwdWJsaWM6CiAgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShDYW1lcmFTZXJ2aWNlKTsKIAorICAgIC8vIEdldCB0aGUgbnVtYmVyIG9mIGNhbWVyYXMgdGhhdCBzdXBwb3J0IGJhc2ljIGNvbG9yIGNhbWVyYSBvcGVyYXRpb24KKyAgICAvLyAodHlwZSBDQU1FUkFfVFlQRV9CQUNLV0FSRF9DT01QQVRJQkxFKQogICAgIHZpcnR1YWwgaW50MzJfdCAgZ2V0TnVtYmVyT2ZDYW1lcmFzKCkgPSAwOworICAgIC8vIEdldCB0aGUgbnVtYmVyIG9mIGNhbWVyYXMgb2YgdGhlIHNwZWNpZmllZCB0eXBlLCBvbmUgb2YgQ0FNRVJBX1RZUEVfKgorICAgIC8vIGVudW1zCisgICAgdmlydHVhbCBpbnQzMl90ICBnZXROdW1iZXJPZkNhbWVyYXMoaW50IGNhbWVyYVR5cGUpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUluZm8oaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3RydWN0IENhbWVyYUluZm8qIGNhbWVyYUluZm8pID0gMDsKQEAgLTEwNCwxMyArMTI0LDYgQEAKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPElDYW1lcmE+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+JiBzdXJmYWNlKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBxdWVyeVN1cmZhY2VNZWRpYVNvdXJjZSgpID0gMDsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU9NWC5oIGIvaW5jbHVkZS9tZWRpYS9JT01YLmgKaW5kZXggNmU0YTRhYy4uODNhMTc3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9JT01YLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9JT01YLmgKQEAgLTIwLDEwICsyMCwxNSBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlckNvbnN1bWVyLmg+CiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CisKICNpbmNsdWRlIDxPTVhfQ29yZS5oPgogI2luY2x1ZGUgPE9NWF9WaWRlby5oPgogCkBAIC04MCwxNCArODUsMTYgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0YXRlKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfU1RBVEVUWVBFKiBzdGF0ZSkgPSAwOwogCisgICAgLy8gVGhpcyB3aWxsIHNldCAqdHlwZSB0byBwcmV2aW91cyBtZXRhZGF0YSBidWZmZXIgdHlwZSBvbiBPTVggZXJyb3IgKG5vdCBvbiBiaW5kZXIgZXJyb3IpLCBhbmQKKyAgICAvLyBuZXcgbWV0YWRhdGEgYnVmZmVyIHR5cGUgb24gc3VjY2Vzcy4KICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlKSA9IDA7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlLCBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUgPSBOVUxMKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAogICAgICAgICAgICAgT01YX1UzMiBtYXhGcmFtZVdpZHRoLCBPTVhfVTMyIG1heEZyYW1lSGVpZ2h0KSA9IDA7CiAKLSAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCiAgICAgICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgPSAwOwogCkBAIC05Nyw5ICsxMDQsMTAgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEdyYXBoaWNCdWZmZXJVc2FnZSgKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfVTMyKiB1c2FnZSkgPSAwOwogCisgICAgLy8gVXNlIHxwYXJhbXN8IGFzIGFuIE9NWCBidWZmZXIsIGJ1dCBsaW1pdCB0aGUgc2l6ZSBvZiB0aGUgT01YIGJ1ZmZlciB0byB8YWxsb3R0ZWRTaXplfC4KICAgICB2aXJ0dWFsIHN0YXR1c190IHVzZUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAotICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIE9NWF9CT09MIGNyb3NzUHJvY2VzcyA9IE9NWF9GQUxTRSkgPSAwOworICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIE9NWF9VMzIgYWxsb3R0ZWRTaXplLCBPTVhfQk9PTCBjcm9zc1Byb2Nlc3MgPSBPTVhfRkFMU0UpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgdXNlR3JhcGhpY0J1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LApAQCAtMTA5LDkgKzExNywyMyBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsCiAgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmZ3JhcGhpY0J1ZmZlciwgYnVmZmVyX2lkIGJ1ZmZlcikgPSAwOwogCisgICAgLy8gVGhpcyB3aWxsIHNldCAqdHlwZSB0byByZXN1bHRpbmcgbWV0YWRhdGEgYnVmZmVyIHR5cGUgb24gT01YIGVycm9yIChub3Qgb24gYmluZGVyIGVycm9yKSBhcworICAgIC8vIHdlbGwgYXMgb24gc3VjY2Vzcy4KICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUlucHV0U3VyZmFjZSgKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LAotICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyKSA9IDA7CisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIsCisgICAgICAgICAgICBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUgPSBOVUxMKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVBlcnNpc3RlbnRJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIsCisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAqYnVmZmVyQ29uc3VtZXIpID0gMDsKKworICAgIC8vIFRoaXMgd2lsbCBzZXQgKnR5cGUgdG8gcmVzdWx0aW5nIG1ldGFkYXRhIGJ1ZmZlciB0eXBlIG9uIE9NWCBlcnJvciAobm90IG9uIGJpbmRlciBlcnJvcikgYXMKKyAgICAvLyB3ZWxsIGFzIG9uIHN1Y2Nlc3MuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICZidWZmZXJDb25zdW1lciwKKyAgICAgICAgICAgIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzaWduYWxFbmRPZklucHV0U3RyZWFtKG5vZGVfaWQgbm9kZSkgPSAwOwogCkBAIC0xMjMsMjAgKzE0NSwzMiBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIHNpemVfdCBzaXplLAogICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIHZvaWQgKipidWZmZXJfZGF0YSkgPSAwOwogCisgICAgLy8gQWxsb2NhdGUgYW4gT01YIGJ1ZmZlciBvZiBzaXplIHxhbGxvdGVkU2l6ZXwuIFVzZSB8cGFyYW1zfCBhcyB0aGUgYmFja3VwIGJ1ZmZlciwgd2hpY2gKKyAgICAvLyBtYXkgYmUgbGFyZ2VyLgogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXJXaXRoQmFja3VwKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCi0gICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgT01YX0JPT0wgY3Jvc3NQcm9jZXNzID0gT01YX0ZBTFNFKSA9IDA7CisgICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgT01YX1UzMiBhbGxvdHRlZFNpemUsIE9NWF9CT09MIGNyb3NzUHJvY2VzcyA9IE9NWF9GQUxTRSkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBmcmVlQnVmZmVyKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGJ1ZmZlcl9pZCBidWZmZXIpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmlsbEJ1ZmZlcihub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIpID0gMDsKKyAgICBlbnVtIHsKKyAgICAgICAga0ZlbmNlVGltZW91dE1zID0gMTAwMAorICAgIH07CisgICAgLy8gQ2FsbHMgT01YX0ZpbGxCdWZmZXIgb24gYnVmZmVyLCBhbmQgcGFzc2VzIHxmZW5jZUZkfCB0byBjb21wb25lbnQgaWYgaXQgc3VwcG9ydHMKKyAgICAvLyBmZW5jZXMuIE90aGVyd2lzZSwgaXQgd2FpdHMgb24gfGZlbmNlRmR8IGJlZm9yZSBjYWxsaW5nIE9NWF9GaWxsQnVmZmVyLgorICAgIC8vIFRha2VzIG93bmVyc2hpcCBvZiB8ZmVuY2VGZHwgZXZlbiBpZiB0aGlzIGNhbGwgZmFpbHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBmaWxsQnVmZmVyKG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgaW50IGZlbmNlRmQgPSAtMSkgPSAwOwogCisgICAgLy8gQ2FsbHMgT01YX0VtcHR5QnVmZmVyIG9uIGJ1ZmZlciAoYWZ0ZXIgdXBkYXRpbmcgYnVmZmVyIGhlYWRlciB3aXRoIHxyYW5nZV9vZmZzZXR8LAorICAgIC8vIHxyYW5nZV9sZW5ndGh8LCB8ZmxhZ3N8IGFuZCB8dGltZXN0YW1wfCkuIFBhc3NlcyB8ZmVuY2VGZHwgdG8gY29tcG9uZW50IGlmIGl0CisgICAgLy8gc3VwcG9ydHMgZmVuY2VzLiBPdGhlcndpc2UsIGl0IHdhaXRzIG9uIHxmZW5jZUZkfCBiZWZvcmUgY2FsbGluZyBPTVhfRW1wdHlCdWZmZXIuCisgICAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIHxmZW5jZUZkfCBldmVuIGlmIHRoaXMgY2FsbCBmYWlscy4KICAgICB2aXJ0dWFsIHN0YXR1c190IGVtcHR5QnVmZmVyKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLAogICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciwKICAgICAgICAgICAgIE9NWF9VMzIgcmFuZ2Vfb2Zmc2V0LCBPTVhfVTMyIHJhbmdlX2xlbmd0aCwKLSAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXApID0gMDsKKyAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXAsIGludCBmZW5jZUZkID0gLTEpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RXh0ZW5zaW9uSW5kZXgoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsCkBAIC0xNDcsNiArMTgxLDcgQEAKICAgICAgICAgSU5URVJOQUxfT1BUSU9OX1NVU1BFTkQsICAvLyBkYXRhIGlzIGEgYm9vbAogICAgICAgICBJTlRFUk5BTF9PUFRJT05fUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0RFTEFZLCAgLy8gZGF0YSBpcyBhbiBpbnQ2NF90CiAgICAgICAgIElOVEVSTkFMX09QVElPTl9NQVhfVElNRVNUQU1QX0dBUCwgLy8gZGF0YSBpcyBpbnQ2NF90CisgICAgICAgIElOVEVSTkFMX09QVElPTl9NQVhfRlBTLCAvLyBkYXRhIGlzIGZsb2F0CiAgICAgICAgIElOVEVSTkFMX09QVElPTl9TVEFSVF9USU1FLCAvLyBkYXRhIGlzIGFuIGludDY0X3QKICAgICAgICAgSU5URVJOQUxfT1BUSU9OX1RJTUVfTEFQU0UsIC8vIGRhdGEgaXMgYW4gaW50NjRfdFsyXQogICAgIH07CkBAIC0xNjMsMTAgKzE5OCwxMSBAQAogICAgICAgICBFVkVOVCwKICAgICAgICAgRU1QVFlfQlVGRkVSX0RPTkUsCiAgICAgICAgIEZJTExfQlVGRkVSX0RPTkUsCi0KKyAgICAgICAgRlJBTUVfUkVOREVSRUQsCiAgICAgfSB0eXBlOwogCiAgICAgSU9NWDo6bm9kZV9pZCBub2RlOworICAgIGludCBmZW5jZUZkOyAvLyB1c2VkIGZvciBFTVBUWV9CVUZGRVJfRE9ORSBhbmQgRklMTF9CVUZGRVJfRE9ORTsgY2xpZW50IG11c3QgY2xvc2UgdGhpcwogCiAgICAgdW5pb24gewogICAgICAgICAvLyBpZiB0eXBlID09IEVWRU5UCkBAIC0xOTAsNiArMjI2LDExIEBACiAgICAgICAgICAgICBPTVhfVElDS1MgdGltZXN0YW1wOwogICAgICAgICB9IGV4dGVuZGVkX2J1ZmZlcl9kYXRhOwogCisgICAgICAgIC8vIGlmIHR5cGUgPT0gRlJBTUVfUkVOREVSRUQKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIE9NWF9USUNLUyB0aW1lc3RhbXA7CisgICAgICAgICAgICBPTVhfUzY0IG5hbm9UaW1lOworICAgICAgICB9IHJlbmRlcl9kYXRhOwogICAgIH0gdTsKIH07CiAKQEAgLTE5Nyw3ICsyMzgsOCBAQAogcHVibGljOgogICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoT01YT2JzZXJ2ZXIpOwogCi0gICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZShjb25zdCBvbXhfbWVzc2FnZSAmbXNnKSA9IDA7CisgICAgLy8gSGFuZGxlIChsaXN0IG9mKSBtZXNzYWdlcy4KKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlcyhjb25zdCBzdGQ6Omxpc3Q8b214X21lc3NhZ2U+ICZtZXNzYWdlcykgPSAwOwogfTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTIyOSw0ICsyNzEsMTUgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZyhhbmRyb2lkOjpNZXRhZGF0YUJ1ZmZlclR5cGUgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIGtNZXRhZGF0YUJ1ZmZlclR5cGVDYW1lcmFTb3VyY2U6ICAgcmV0dXJuICJDYW1lcmFTb3VyY2UiOworICAgICAgICBjYXNlIGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlOiAgcmV0dXJuICJHcmFsbG9jU291cmNlIjsKKyAgICAgICAgY2FzZSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyOiAgICAgIHJldHVybiAiQU5XQnVmZmVyIjsKKyAgICAgICAgY2FzZSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZDogICAgICAgIHJldHVybiAiSW52YWxpZCI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogI2VuZGlmICAvLyBBTkRST0lEX0lPTVhfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSVJlc291cmNlTWFuYWdlckNsaWVudC5oIGIvaW5jbHVkZS9tZWRpYS9JUmVzb3VyY2VNYW5hZ2VyQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEwY2Q4OAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvSVJlc291cmNlTWFuYWdlckNsaWVudC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9JUkVTT1VSQ0VNQU5BR0VSQ0xJRU5UX0gKKyNkZWZpbmUgQU5EUk9JRF9JUkVTT1VSQ0VNQU5BR0VSQ0xJRU5UX0gKKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSVJlc291cmNlTWFuYWdlckNsaWVudDogcHVibGljIElJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKFJlc291cmNlTWFuYWdlckNsaWVudCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgcmVjbGFpbVJlc291cmNlKCkgPSAwOworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXROYW1lKCkgPSAwOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCblJlc291cmNlTWFuYWdlckNsaWVudDogcHVibGljIEJuSW50ZXJmYWNlPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+Cit7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCAmZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsICpyZXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0lSRVNPVVJDRU1BTkFHRVJDTElFTlRfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oIGIvaW5jbHVkZS9tZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNGY2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0lSRVNPVVJDRU1BTkFHRVJTRVJWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9JUkVTT1VSQ0VNQU5BR0VSU0VSVklDRV9ICisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4gIC8vIGZvciBzdGF0dXNfdAorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lSZXNvdXJjZU1hbmFnZXJDbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVJlc291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFSZXNvdXJjZVBvbGljeS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOiBwdWJsaWMgSUludGVyZmFjZQoreworcHVibGljOgorICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoUmVzb3VyY2VNYW5hZ2VyU2VydmljZSk7CisKKyAgICB2aXJ0dWFsIHZvaWQgY29uZmlnKGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlUG9saWN5PiAmcG9saWNpZXMpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBhZGRSZXNvdXJjZSgKKyAgICAgICAgICAgIGludCBwaWQsCisgICAgICAgICAgICBpbnQ2NF90IGNsaWVudElkLAorICAgICAgICAgICAgY29uc3Qgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50LAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPE1lZGlhUmVzb3VyY2U+ICZyZXNvdXJjZXMpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVSZXNvdXJjZShpbnQgcGlkLCBpbnQ2NF90IGNsaWVudElkKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgcmVjbGFpbVJlc291cmNlKAorICAgICAgICAgICAgaW50IGNhbGxpbmdQaWQsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gJnJlc291cmNlcykgPSAwOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCblJlc291cmNlTWFuYWdlclNlcnZpY2U6IHB1YmxpYyBCbkludGVyZmFjZTxJUmVzb3VyY2VNYW5hZ2VyU2VydmljZT4KK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsICZkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwgKnJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSVJFU09VUkNFTUFOQUdFUlNFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JU3RyZWFtU291cmNlLmggYi9pbmNsdWRlL21lZGlhL0lTdHJlYW1Tb3VyY2UuaAppbmRleCA2NzcxMTliLi40YTZhYWZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0lTdHJlYW1Tb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL0lTdHJlYW1Tb3VyY2UuaApAQCAtMjMsNyArMjMsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU1lc3NhZ2U7Ci1zdHJ1Y3QgSU1lbW9yeTsKK2NsYXNzIElNZW1vcnk7CiBzdHJ1Y3QgSVN0cmVhbUxpc3RlbmVyOwogCiBzdHJ1Y3QgSVN0cmVhbVNvdXJjZSA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKQEAgLTgxLDYgKzgxLDEzIEBACiAgICAgLy8gd2l0aCB0aGUgbmV4dCBQVFMgb2NjdXJpbmcgaW4gdGhlIHN0cmVhbS4gVGhlIHZhbHVlIGlzIG9mIHR5cGUgaW50NjRfdC4KICAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qga0tleU1lZGlhVGltZVVzOwogCisgICAgLy8gT3B0aW9uYWxseSBzaWduYWxsZWQgYXMgcGFydCBvZiBhIGRpc2NvbnRpbnVpdHkgdGhhdCBpbmNsdWRlcworICAgIC8vIERJU0NPTlRJTlVJVFlfVElNRS4gSXQgaW5kaWNhdGVzIHRoZSBtZWRpYSB0aW1lIChpbiB1cykgb2YgYSByZWNlbnQKKyAgICAvLyBzYW1wbGUgZnJvbSB0aGUgc2FtZSBjb250ZW50LCBhbmQgaXMgdXNlZCBhcyBhIGhpbnQgZm9yIHRoZSBwYXJzZXIgdG8KKyAgICAvLyBoYW5kbGUgUFRTIHdyYXBhcm91bmQuIFRoaXMgaXMgcmVxdWlyZWQgd2hlbiBhIG5ldyBwYXJzZXIgaXMgY3JlYXRlZAorICAgIC8vIHRvIGNvbnRpbnVlIHBhcnNpbmcgY29udGVudCBmcm9tIHRoZSBzYW1lIHRpbWVsaW5lLgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBrS2V5UmVjZW50TWVkaWFUaW1lVXM7CisKICAgICB2aXJ0dWFsIHZvaWQgaXNzdWVDb21tYW5kKAogICAgICAgICAgICAgQ29tbWFuZCBjbWQsIGJvb2wgc3luY2hyb25vdXMsIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnID0gTlVMTCkgPSAwOwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaAppbmRleCBjZDU2YWRiLi40MDY3YjQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNJbmZvLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oCkBAIC0zMiw5ICszMiwxMSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU1lc3NhZ2U7Ci1zdHJ1Y3QgUGFyY2VsOworY2xhc3MgUGFyY2VsOwogc3RydWN0IENvZGVjQ2FwYWJpbGl0aWVzOwogCit0eXBlZGVmIEtleWVkVmVjdG9yPEFTdHJpbmcsIEFTdHJpbmc+IENvZGVjU2V0dGluZ3M7CisKIHN0cnVjdCBNZWRpYUNvZGVjSW5mbyA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBzdHJ1Y3QgUHJvZmlsZUxldmVsIHsKICAgICAgICAgdWludDMyX3QgbVByb2ZpbGU7CkBAIC0xMDQsNiArMTA2LDcgQEAKICAgICBNZWRpYUNvZGVjSW5mbyhBU3RyaW5nIG5hbWUsIGJvb2wgZW5jb2RlciwgY29uc3QgY2hhciAqbWltZSk7CiAgICAgdm9pZCBhZGRRdWlyayhjb25zdCBjaGFyICpuYW1lKTsKICAgICBzdGF0dXNfdCBhZGRNaW1lKGNvbnN0IGNoYXIgKm1pbWUpOworICAgIHN0YXR1c190IHVwZGF0ZU1pbWUoY29uc3QgY2hhciAqbWltZSk7CiAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZUNhcGFiaWxpdGllcyhjb25zdCBDb2RlY0NhcGFiaWxpdGllcyAmY2Fwcyk7CiAgICAgdm9pZCBhZGREZXRhaWwoY29uc3QgQVN0cmluZyAma2V5LCBjb25zdCBBU3RyaW5nICZ2YWx1ZSk7CiAgICAgdm9pZCBhZGRGZWF0dXJlKGNvbnN0IEFTdHJpbmcgJmtleSwgaW50MzJfdCB2YWx1ZSk7CkBAIC0xMTQsNiArMTE3LDcgQEAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUNvZGVjSW5mbyk7CiAKICAgICBmcmllbmQgY2xhc3MgTWVkaWFDb2RlY0xpc3Q7CisgICAgZnJpZW5kIGNsYXNzIE1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzVGVzdDsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oCmluZGV4IDM4ZGJiMjAuLmJjZTZlZTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oCkBAIC0yNSw2ICsyNSw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgRGF0YVNvdXJjZTsKIHN0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIAogLy8gQWJzdHJhY3QgYmFzZSBjbGFzcwpAQCAtNDAsNiArNDEsNyBAQAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIHNvdXJjZSkgPSAwOwogICAgIHZpcnR1YWwgVmlkZW9GcmFtZSogZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pID0gMDsKICAgICB2aXJ0dWFsIE1lZGlhQWxidW1BcnQqIGV4dHJhY3RBbGJ1bUFydCgpID0gMDsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIqIGV4dHJhY3RNZXRhZGF0YShpbnQga2V5Q29kZSkgPSAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oCmluZGV4IDRhNmJmMjguLmRlODI1NTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmgKQEAgLTI2LDggKzI2LDEwIEBACiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UaW1lc3RhbXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9BVlN5bmNTZXR0aW5ncy5oPgogI2luY2x1ZGUgPG1lZGlhL01ldGFkYXRhLmg+CiAKIC8vIEZ3ZCBkZWNsIHRvIG1ha2Ugc3VyZSBldmVyeW9uZSBhZ3JlZXMgdGhhdCB0aGUgc2NvcGUgb2Ygc3RydWN0IHNvY2thZGRyX2luIGlzCkBAIC0zNiw2ICszOCw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgRGF0YVNvdXJjZTsKIGNsYXNzIFBhcmNlbDsKIGNsYXNzIFN1cmZhY2U7CiBjbGFzcyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwpAQCAtMTEwLDIwICsxMTMsMzUgQEAKICAgICAgICAgICAgICAgICBBdWRpb0NhbGxiYWNrIGNiID0gTlVMTCwKICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUgPSBOVUxMLAogICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMKSA9IDA7CisgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCwKKyAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgdWludDMyX3Qgc3VnZ2VzdGVkRnJhbWVDb3VudCA9IDApID0gMDsKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHN0YXJ0KCkgPSAwOwotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgIHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpID0gMDsKKworICAgICAgICAvKiBJbnB1dCBwYXJhbWV0ZXIgfHNpemV8IGlzIGluIGJ5dGUgdW5pdHMgc3RvcmVkIGluIHxidWZmZXJ8LgorICAgICAgICAgKiBEYXRhIGlzIGNvcGllZCBvdmVyIGFuZCBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gKD49IDApCisgICAgICAgICAqIGlzIHJldHVybmVkLCBvciBubyBkYXRhIGlzIGNvcGllZCBhbmQgYSBuZWdhdGl2ZSBzdGF0dXMgY29kZQorICAgICAgICAgKiBpcyByZXR1cm5lZCAoZXZlbiB3aGVuIHxibG9ja2luZ3wgaXMgdHJ1ZSkuCisgICAgICAgICAqIFdoZW4gfGJsb2NraW5nfCBpcyBmYWxzZSwgQXVkaW9TaW5rIHdpbGwgaW1tZWRpYXRlbHkgcmV0dXJuIGFmdGVyCisgICAgICAgICAqIHBhcnQgb2Ygb3IgZnVsbCB8YnVmZmVyfCBpcyBjb3BpZWQgb3Zlci4KKyAgICAgICAgICogV2hlbiB8YmxvY2tpbmd8IGlzIHRydWUsIEF1ZGlvU2luayB3aWxsIHdhaXQgdG8gY29weSB0aGUgZW50aXJlCisgICAgICAgICAqIGJ1ZmZlciwgdW5sZXNzIGFuIGVycm9yIG9jY3VycyBvciB0aGUgY29weSBvcGVyYXRpb24gaXMKKyAgICAgICAgICogcHJlbWF0dXJlbHkgc3RvcHBlZC4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3NpemVfdCAgICAgd3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBibG9ja2luZyA9IHRydWUpID0gMDsKKwogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHN0b3AoKSA9IDA7CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgZmx1c2goKSA9IDA7CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcGF1c2UoKSA9IDA7CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgY2xvc2UoKSA9IDA7CiAKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQbGF5YmFja1JhdGVQZXJtaWxsZShpbnQzMl90IHJhdGUpIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlJiByYXRlKSA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0UGxheWJhY2tSYXRlKEF1ZGlvUGxheWJhY2tSYXRlKiByYXRlIC8qIG5vbm51bGwgKi8pID0gMDsKICAgICAgICAgdmlydHVhbCBib29sICAgICAgICBuZWVkc1RyYWlsaW5nUGFkZGluZygpIHsgcmV0dXJuIHRydWU7IH0KIAotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykgeyByZXR1cm4gTk9fRVJST1I7IH07Ci0gICAgICAgIHZpcnR1YWwgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKSB7IHJldHVybiBTdHJpbmc4OjplbXB0eSgpOyB9OworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgLyoga2V5VmFsdWVQYWlycyAqLykgeyByZXR1cm4gTk9fRVJST1I7IH0KKyAgICAgICAgdmlydHVhbCBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIC8qIGtleXMgKi8pIHsgcmV0dXJuIFN0cmluZzg6OmVtcHR5KCk7IH0KICAgICB9OwogCiAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllckJhc2UoKSA6IG1Db29raWUoMCksIG1Ob3RpZnkoMCkge30KQEAgLTEzMSw3ICsxNDksNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCkgPSAwOwogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaGFyZHdhcmVPdXRwdXQoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFVJRCh1aWRfdCB1aWQpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFVJRCh1aWRfdCAvKiB1aWQgKi8pIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIApAQCAtMTQyLDcgKzE2MCwxMSBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSkgeworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJU3RyZWFtU291cmNlPiYgLyogc291cmNlICovKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIC8qIHNvdXJjZSAqLykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC0xNTYsNiArMTc4LDMxIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdG9wKCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcGF1c2UoKSA9IDA7CiAgICAgdmlydHVhbCBib29sICAgICAgICBpc1BsYXlpbmcoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlJiByYXRlKSB7CisgICAgICAgIC8vIGJ5IGRlZmF1bHQsIHBsYXllcnMgb25seSBzdXBwb3J0IHNldHRpbmcgcmF0ZSB0byB0aGUgZGVmYXVsdAorICAgICAgICBpZiAoIWlzQXVkaW9QbGF5YmFja1JhdGVFcXVhbChyYXRlLCBBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlKiByYXRlIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKnJhdGUgPSBBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQ7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MmIHN5bmMsIGZsb2F0IC8qIHZpZGVvRnBzICovKSB7CisgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHBsYXllcnMgb25seSBzdXBwb3J0IHNldHRpbmcgc3luYyBzb3VyY2UgdG8gZGVmYXVsdDsgYWxsIG90aGVyIHN5bmMKKyAgICAgICAgLy8gc2V0dGluZ3MgYXJlIGlnbm9yZWQuIFRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IGZvciBnZXR0ZXJzIHRvIHJldHVybiBzZXQgdmFsdWVzLgorICAgICAgICBpZiAoc3luYy5tU291cmNlICE9IEFWU1lOQ19TT1VSQ0VfREVGQVVMVCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0U3luY1NldHRpbmdzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN5bmNTZXR0aW5ncyogc3luYyAvKiBub25udWxsICovLCBmbG9hdCogdmlkZW9GcHMgLyogbm9ubnVsbCAqLykgeworICAgICAgICAqc3luYyA9IEFWU3luY1NldHRpbmdzKCk7CisgICAgICAgICp2aWRlb0ZwcyA9IC0xLmY7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZWVrVG8oaW50IG1zZWMpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldEN1cnJlbnRQb3NpdGlvbihpbnQgKm1zZWMpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldER1cmF0aW9uKGludCAqbXNlYykgPSAwOwpAQCAtMTY2LDEzICsyMTMsMTMgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSA9IDA7CiAKICAgICAvLyBkZWZhdWx0IG5vLW9wIGltcGxlbWVudGF0aW9uIG9mIG9wdGlvbmFsIGV4dGVuc2lvbnMKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFJldHJhbnNtaXRFbmRwb2ludChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4qIGVuZHBvaW50KSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRSZXRyYW5zbWl0RW5kcG9pbnQoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luKiAvKiBlbmRwb2ludCAqLykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmV0cmFuc21pdEVuZHBvaW50KHN0cnVjdCBzb2NrYWRkcl9pbiogZW5kcG9pbnQpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJldHJhbnNtaXRFbmRwb2ludChzdHJ1Y3Qgc29ja2FkZHJfaW4qIC8qIGVuZHBvaW50ICovKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXROZXh0UGxheWVyKGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZT4mIG5leHQpIHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE5leHRQbGF5ZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlPiYgLyogbmV4dCAqLykgewogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCkBAIC0xOTIsOCArMjM5LDggQEAKICAgICAvLyAgICAgICAgICAgIHRoZSBrbm93biBtZXRhZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuCiAgICAgLy8gQHBhcmFtW2lub3V0XSByZWNvcmRzIFBhcmNlbCB3aGVyZSB0aGUgcGxheWVyIGFwcGVuZHMgaXRzIG1ldGFkYXRhLgogICAgIC8vIEByZXR1cm4gT0sgaWYgdGhlIGNhbGwgd2FzIHN1Y2Nlc3NmdWwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRNZXRhZGF0YShjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgaWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsICpyZWNvcmRzKSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRNZXRhZGF0YShjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgLyogaWRzICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiAvKiByZWNvcmRzICovKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9OwogCkBAIC0yMTYsNyArMjYzLDcgQEAKICAgICAgICAgaWYgKG5vdGlmeUNCKSBub3RpZnlDQihjb29raWUsIG1zZywgZXh0MSwgZXh0Miwgb2JqKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdCB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCAvKiBmZCAqLywgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgLyogYXJncyAqLykgY29uc3QgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCmluZGV4IGYwNjFkMjIuLmUwMjkxOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCkBAIC01OCwyNCArNTgsNiBAQAogICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfTElTVF9FTkQgPSAyMDA1LAogfTsKIAotLyoqCi0gKiBTZXQgQ0lGIGFzIGRlZmF1bHQgbWF4aW11bSBpbXBvcnQgYW5kIGV4cG9ydCByZXNvbHV0aW9uIG9mIHZpZGVvIGVkaXRvci4KLSAqIFRoZSBtYXhpbXVtIGltcG9ydCBhbmQgZXhwb3J0IHJlc29sdXRpb25zIGFyZSBwbGF0Zm9ybSBzcGVjaWZpYywKLSAqIHdoaWNoIHNob3VsZCBiZSBkZWZpbmVkIGluIG1lZGlhX3Byb2ZpbGVzLnhtbC4KLSAqIFNldCBkZWZhdWx0IG1heGltdW0gcHJlZmV0Y2ggWVVWIGZyYW1lcyB0byA2LCB3aGljaCBtZWFucyB2aWRlbyBlZGl0b3IgY2FuCi0gKiBxdWV1ZSB1cCB0byA2IFlVViBmcmFtZXMgaW4gdGhlIHZpZGVvIGVuY29kZXIgc291cmNlLgotICogVGhpcyB2YWx1ZSBpcyB1c2VkIHRvIGxpbWl0IHRoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgYnkgdmlkZW8gZWRpdG9yCi0gKiBlbmdpbmUgd2hlbiB0aGUgZW5jb2RlciBjb25zdW1lcyBZVVYgZnJhbWVzIGF0IGEgbG93ZXIgc3BlZWQKLSAqIHRoYW4gdmlkZW8gZWRpdG9yIGVuZ2luZSBwcm9kdWNlcy4KLSAqLwotZW51bSB2aWRlb2VkaXRvcl9jYXBhYmlsaXR5IHsKLSAgICBWSURFT0VESVRPUl9ERUZBVUxUX01BWF9JTlBVVF9GUkFNRV9XSURUSCA9IDM1MiwKLSAgICBWSURFT0VESVRPUl9ERUZVQUxUX01BWF9JTlBVVF9GUkFNRV9IRUlHSFQgPSAyODgsCi0gICAgVklERU9FRElUT1JfREVGQVVMVF9NQVhfT1VUUFVUX0ZSQU1FX1dJRFRIID0gMzUyLAotICAgIFZJREVPRURJVE9SX0RFRlVBTFRfTUFYX09VVFBVVF9GUkFNRV9IRUlHSFQgPSAyODgsCi0gICAgVklERU9FRElUT1JfREVGQVVMVF9NQVhfUFJFRkVUQ0hfWVVWX0ZSQU1FUyA9IDYKLX07Ci0KIGVudW0gdmlkZW9fZGVjb2RlciB7CiAgICAgVklERU9fREVDT0RFUl9XTVYsCiB9OwpAQCAtMTQ4LDMyICsxMzAsNiBAQAogICAgIGludCBnZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZShjb25zdCBjaGFyICpuYW1lLCB2aWRlb19lbmNvZGVyIGNvZGVjKSBjb25zdDsKIAogICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcGFyYW0gbmFtZSBmb3IgdGhlIHZpZGVvIGVkaXRvciBjYXAKLSAgICAgKiBwYXJhbSBvciAtMSBpZiBlcnJvci4KLSAgICAgKiBTdXBwb3J0ZWQgcGFyYW0gbmFtZSBhcmU6Ci0gICAgICogdmlkZW9lZGl0b3IuaW5wdXQud2lkdGgubWF4IC0gbWF4IGlucHV0IHZpZGVvIGZyYW1lIHdpZHRoCi0gICAgICogdmlkZW9lZGl0b3IuaW5wdXQuaGVpZ2h0Lm1heCAtIG1heCBpbnB1dCB2aWRlbyBmcmFtZSBoZWlnaHQKLSAgICAgKiB2aWRlb2VkaXRvci5vdXRwdXQud2lkdGgubWF4IC0gbWF4IG91dHB1dCB2aWRlbyBmcmFtZSB3aWR0aAotICAgICAqIHZpZGVvZWRpdG9yLm91dHB1dC5oZWlnaHQubWF4IC0gbWF4IG91dHB1dCB2aWRlbyBmcmFtZSBoZWlnaHQKLSAgICAgKiBtYXhQcmVmZXRjaFlVVkZyYW1lcyAtIG1heCBwcmVmZXRjaCBZVVYgZnJhbWVzIGluIHZpZGVvIGVkaXRvciBlbmdpbmUuIFRoaXMgdmFsdWUgaXMgdXNlZAotICAgICAqIHRvIGxpbWl0IHRoZSBtZW1vcnkgY29uc3VtcHRpb24uCi0gICAgICovCi0gICAgaW50IGdldFZpZGVvRWRpdG9yQ2FwUGFyYW1CeU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHBhcmFtIG5hbWUgZm9yIHRoZSB2aWRlbyBlZGl0b3IgZXhwb3J0IGNvZGVjIGZvcm1hdAotICAgICAqIHBhcmFtIG9yIC0xIGlmIGVycm9yLgotICAgICAqIFN1cHBvcnRlZCBwYXJhbSBuYW1lIGFyZToKLSAgICAgKiB2aWRlb2VkaXRvci5leHBvcnQucHJvZmlsZSAtIGV4cG9ydCB2aWRlbyBwcm9maWxlCi0gICAgICogdmlkZW9lZGl0b3IuZXhwb3J0LmxldmVsIC0gZXhwb3J0IHZpZGVvIGxldmVsCi0gICAgICogU3VwcG9ydGVkIHBhcmFtIGNvZGVjIGFyZToKLSAgICAgKiAxIGZvciBoMjYzCi0gICAgICogMiBmb3IgaDI2NAotICAgICAqIDMgZm9yIG1wZWc0Ci0gICAgICovCi0gICAgaW50IGdldFZpZGVvRWRpdG9yRXhwb3J0UGFyYW1CeU5hbWUoY29uc3QgY2hhciAqbmFtZSwgaW50IGNvZGVjKSBjb25zdDsKLQotICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGF1ZGlvIGVuY29kZXJzIHN1cHBvcnRlZC4KICAgICAgKi8KICAgICBWZWN0b3I8YXVkaW9fZW5jb2Rlcj4gZ2V0QXVkaW9FbmNvZGVycygpIGNvbnN0OwpAQCAtMjIxLDcgKzE3Nyw3IEBACiAKICAgICBNZWRpYVByb2ZpbGVzJiBvcGVyYXRvcj0oY29uc3QgTWVkaWFQcm9maWxlcyYpOyAgLy8gRG9uJ3QgY2FsbCBtZQogICAgIE1lZGlhUHJvZmlsZXMoY29uc3QgTWVkaWFQcm9maWxlcyYpOyAgICAgICAgICAgICAvLyBEb24ndCBjYWxsIG1lCi0gICAgTWVkaWFQcm9maWxlcygpIHsgbVZpZGVvRWRpdG9yQ2FwID0gTlVMTDsgfSAgICAgICAgLy8gRHVtbXkgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgIE1lZGlhUHJvZmlsZXMoKSB7fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEdW1teSBkZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgfk1lZGlhUHJvZmlsZXMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGRlbGV0ZSBtZQogCiAgICAgc3RydWN0IFZpZGVvQ29kZWMgewpAQCAtMzY2LDMxICszMjIsNiBAQAogICAgICAgICBpbnQgbUNhbWVyYUlkOwogICAgICAgICBWZWN0b3I8aW50PiBtTGV2ZWxzOwogICAgIH07Ci0gICAgc3RydWN0IEV4cG9ydFZpZGVvUHJvZmlsZSB7Ci0gICAgICAgIEV4cG9ydFZpZGVvUHJvZmlsZShpbnQgY29kZWMsIGludCBwcm9maWxlLCBpbnQgbGV2ZWwpCi0gICAgICAgICAgICA6bUNvZGVjKGNvZGVjKSxtUHJvZmlsZShwcm9maWxlKSxtTGV2ZWwobGV2ZWwpIHt9Ci0gICAgICAgIH5FeHBvcnRWaWRlb1Byb2ZpbGUoKSB7fQotICAgICAgICBpbnQgbUNvZGVjOwotICAgICAgICBpbnQgbVByb2ZpbGU7Ci0gICAgICAgIGludCBtTGV2ZWw7Ci0gICAgfTsKLSAgICBzdHJ1Y3QgVmlkZW9FZGl0b3JDYXAgewotICAgICAgICBWaWRlb0VkaXRvckNhcChpbnQgaW5GcmFtZVdpZHRoLCBpbnQgaW5GcmFtZUhlaWdodCwKLSAgICAgICAgICAgIGludCBvdXRGcmFtZVdpZHRoLCBpbnQgb3V0RnJhbWVIZWlnaHQsIGludCBmcmFtZXMpCi0gICAgICAgICAgICA6IG1NYXhJbnB1dEZyYW1lV2lkdGgoaW5GcmFtZVdpZHRoKSwKLSAgICAgICAgICAgICAgbU1heElucHV0RnJhbWVIZWlnaHQoaW5GcmFtZUhlaWdodCksCi0gICAgICAgICAgICAgIG1NYXhPdXRwdXRGcmFtZVdpZHRoKG91dEZyYW1lV2lkdGgpLAotICAgICAgICAgICAgICBtTWF4T3V0cHV0RnJhbWVIZWlnaHQob3V0RnJhbWVIZWlnaHQpLAotICAgICAgICAgICAgICBtTWF4UHJlZmV0Y2hZVVZGcmFtZXMoZnJhbWVzKSB7fQotCi0gICAgICAgIH5WaWRlb0VkaXRvckNhcCgpIHt9Ci0KLSAgICAgICAgaW50IG1NYXhJbnB1dEZyYW1lV2lkdGg7Ci0gICAgICAgIGludCBtTWF4SW5wdXRGcmFtZUhlaWdodDsKLSAgICAgICAgaW50IG1NYXhPdXRwdXRGcmFtZVdpZHRoOwotICAgICAgICBpbnQgbU1heE91dHB1dEZyYW1lSGVpZ2h0OwotICAgICAgICBpbnQgbU1heFByZWZldGNoWVVWRnJhbWVzOwotICAgIH07CiAKICAgICBpbnQgZ2V0Q2FtY29yZGVyUHJvZmlsZUluZGV4KGludCBjYW1lcmFJZCwgY2FtY29yZGVyX3F1YWxpdHkgcXVhbGl0eSkgY29uc3Q7CiAgICAgdm9pZCBpbml0UmVxdWlyZWRQcm9maWxlUmVmcyhjb25zdCBWZWN0b3I8aW50PiYgY2FtZXJhSWRzKTsKQEAgLTQwMyw3ICszMzQsNiBAQAogICAgIHN0YXRpYyB2b2lkIGxvZ0F1ZGlvRW5jb2RlckNhcChjb25zdCBBdWRpb0VuY29kZXJDYXAmIGNhcCk7CiAgICAgc3RhdGljIHZvaWQgbG9nVmlkZW9EZWNvZGVyQ2FwKGNvbnN0IFZpZGVvRGVjb2RlckNhcCYgY2FwKTsKICAgICBzdGF0aWMgdm9pZCBsb2dBdWRpb0RlY29kZXJDYXAoY29uc3QgQXVkaW9EZWNvZGVyQ2FwJiBjYXApOwotICAgIHN0YXRpYyB2b2lkIGxvZ1ZpZGVvRWRpdG9yQ2FwKGNvbnN0IFZpZGVvRWRpdG9yQ2FwJiBjYXApOwogCiAgICAgLy8gSWYgdGhlIHhtbCBjb25maWd1cmF0aW9uIGZpbGUgZG9lcyBleGlzdCwgdXNlIHRoZSBzZXR0aW5ncwogICAgIC8vIGZyb20gdGhlIHhtbApAQCAtNDE1LDkgKzM0NSw2IEBACiAgICAgc3RhdGljIFZpZGVvRGVjb2RlckNhcCogY3JlYXRlVmlkZW9EZWNvZGVyQ2FwKGNvbnN0IGNoYXIgKiphdHRzKTsKICAgICBzdGF0aWMgVmlkZW9FbmNvZGVyQ2FwKiBjcmVhdGVWaWRlb0VuY29kZXJDYXAoY29uc3QgY2hhciAqKmF0dHMpOwogICAgIHN0YXRpYyBBdWRpb0VuY29kZXJDYXAqIGNyZWF0ZUF1ZGlvRW5jb2RlckNhcChjb25zdCBjaGFyICoqYXR0cyk7Ci0gICAgc3RhdGljIFZpZGVvRWRpdG9yQ2FwKiBjcmVhdGVWaWRlb0VkaXRvckNhcCgKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqYXR0cywgTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpOwotICAgIHN0YXRpYyBFeHBvcnRWaWRlb1Byb2ZpbGUqIGNyZWF0ZUV4cG9ydFZpZGVvUHJvZmlsZShjb25zdCBjaGFyICoqYXR0cyk7CiAKICAgICBzdGF0aWMgQ2FtY29yZGVyUHJvZmlsZSogY3JlYXRlQ2FtY29yZGVyUHJvZmlsZSgKICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhSWQsIGNvbnN0IGNoYXIgKiphdHRzLCBWZWN0b3I8aW50PiYgY2FtZXJhSWRzKTsKQEAgLTQ2MSw4ICszODgsNiBAQAogICAgIHN0YXRpYyB2b2lkIGNyZWF0ZURlZmF1bHRFbmNvZGVyT3V0cHV0RmlsZUZvcm1hdHMoTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpOwogICAgIHN0YXRpYyB2b2lkIGNyZWF0ZURlZmF1bHRJbWFnZUVuY29kaW5nUXVhbGl0eUxldmVscyhNZWRpYVByb2ZpbGVzICpwcm9maWxlcyk7CiAgICAgc3RhdGljIHZvaWQgY3JlYXRlRGVmYXVsdEltYWdlRGVjb2RpbmdNYXhNZW1vcnkoTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpOwotICAgIHN0YXRpYyB2b2lkIGNyZWF0ZURlZmF1bHRWaWRlb0VkaXRvckNhcChNZWRpYVByb2ZpbGVzICpwcm9maWxlcyk7Ci0gICAgc3RhdGljIHZvaWQgY3JlYXRlRGVmYXVsdEV4cG9ydFZpZGVvUHJvZmlsZXMoTWVkaWFQcm9maWxlcyAqcHJvZmlsZXMpOwogCiAgICAgc3RhdGljIFZpZGVvRW5jb2RlckNhcCogY3JlYXRlRGVmYXVsdEgyNjNWaWRlb0VuY29kZXJDYXAoKTsKICAgICBzdGF0aWMgVmlkZW9FbmNvZGVyQ2FwKiBjcmVhdGVEZWZhdWx0TTR2VmlkZW9FbmNvZGVyQ2FwKCk7CkBAIC01MjAsOCArNDQ1LDYgQEAKIAogICAgIFJlcXVpcmVkUHJvZmlsZXMgKm1SZXF1aXJlZFByb2ZpbGVSZWZzOwogICAgIFZlY3RvcjxpbnQ+ICAgICAgICAgICAgICBtQ2FtZXJhSWRzOwotICAgIFZpZGVvRWRpdG9yQ2FwKiBtVmlkZW9FZGl0b3JDYXA7Ci0gICAgVmVjdG9yPEV4cG9ydFZpZGVvUHJvZmlsZSo+IG1WaWRlb0VkaXRvckV4cG9ydFByb2ZpbGVzOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaAppbmRleCBkN2FjMzAyLi5kNmNjNGJiIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCkBAIC0yNiwxMCArMjYsMTIgQEAKIAogY2xhc3MgSUNhbWVyYVJlY29yZGluZ1Byb3h5OwogY2xhc3MgU3VyZmFjZTsKK2NsYXNzIElHcmFwaGljQnVmZmVyQ29uc3VtZXI7CiBjbGFzcyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwogCiBzdHJ1Y3QgTWVkaWFSZWNvcmRlckJhc2UgewotICAgIE1lZGlhUmVjb3JkZXJCYXNlKCkge30KKyAgICBNZWRpYVJlY29yZGVyQmFzZShjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSkKKyAgICAgICAgOiBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSB7fQogICAgIHZpcnR1YWwgfk1lZGlhUmVjb3JkZXJCYXNlKCkge30KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdCgpID0gMDsKQEAgLTQzLDcgKzQ1LDYgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbWVyYShjb25zdCBzcDxJQ2FtZXJhPiYgY2FtZXJhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eT4mIHByb3h5KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmV2aWV3U3VyZmFjZShjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyICpwYXRoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRwdXRGaWxlQXV4aWxpYXJ5KGludCBmZCkge3JldHVybiBJTlZBTElEX09QRVJBVElPTjt9CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcykgPSAwOwpAQCAtNTYsOCArNTcsMTMgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlc2V0KCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWF4QW1wbGl0dWRlKGludCAqbWF4KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+JiBzdXJmYWNlKSA9IDA7CiAgICAgdmlydHVhbCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBxdWVyeVN1cmZhY2VNZWRpYVNvdXJjZSgpIGNvbnN0ID0gMDsKIAorCitwcm90ZWN0ZWQ6CisgICAgU3RyaW5nMTYgbU9wUGFja2FnZU5hbWU7CisKIHByaXZhdGU6CiAgICAgTWVkaWFSZWNvcmRlckJhc2UoY29uc3QgTWVkaWFSZWNvcmRlckJhc2UgJik7CiAgICAgTWVkaWFSZWNvcmRlckJhc2UgJm9wZXJhdG9yPShjb25zdCBNZWRpYVJlY29yZGVyQmFzZSAmKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZXNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBmMmNhZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFSZXNvdXJjZS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBBTkRST0lEX01FRElBX1JFU09VUkNFX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9SRVNPVVJDRV9ICisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2V4dGVybiBjb25zdCBjaGFyIGtSZXNvdXJjZVNlY3VyZUNvZGVjW107CitleHRlcm4gY29uc3QgY2hhciBrUmVzb3VyY2VOb25TZWN1cmVDb2RlY1tdOworZXh0ZXJuIGNvbnN0IGNoYXIga1Jlc291cmNlQXVkaW9Db2RlY1tdOworZXh0ZXJuIGNvbnN0IGNoYXIga1Jlc291cmNlVmlkZW9Db2RlY1tdOworZXh0ZXJuIGNvbnN0IGNoYXIga1Jlc291cmNlR3JhcGhpY01lbW9yeVtdOworCitjbGFzcyBNZWRpYVJlc291cmNlIHsKK3B1YmxpYzoKKyAgICBNZWRpYVJlc291cmNlKCk7CisgICAgTWVkaWFSZXNvdXJjZShTdHJpbmc4IHR5cGUsIHVpbnQ2NF90IHZhbHVlKTsKKyAgICBNZWRpYVJlc291cmNlKFN0cmluZzggdHlwZSwgU3RyaW5nOCBzdWJUeXBlLCB1aW50NjRfdCB2YWx1ZSk7CisKKyAgICB2b2lkIHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKTsKKyAgICB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0OworCisgICAgU3RyaW5nOCB0b1N0cmluZygpIGNvbnN0OworCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1lZGlhUmVzb3VyY2UgJm90aGVyKSBjb25zdDsKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgTWVkaWFSZXNvdXJjZSAmb3RoZXIpIGNvbnN0OworCisgICAgU3RyaW5nOCBtVHlwZTsKKyAgICBTdHJpbmc4IG1TdWJUeXBlOworICAgIHVpbnQ2NF90IG1WYWx1ZTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9SRVNPVVJDRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhUmVzb3VyY2VQb2xpY3kuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFSZXNvdXJjZVBvbGljeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYzJlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhUmVzb3VyY2VQb2xpY3kuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9SRVNPVVJDRV9QT0xJQ1lfSAorI2RlZmluZSBBTkRST0lEX01FRElBX1JFU09VUkNFX1BPTElDWV9ICisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2V4dGVybiBjb25zdCBjaGFyIGtQb2xpY3lTdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzW107CitleHRlcm4gY29uc3QgY2hhciBrUG9saWN5U3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWNbXTsKKworY2xhc3MgTWVkaWFSZXNvdXJjZVBvbGljeSB7CitwdWJsaWM6CisgICAgTWVkaWFSZXNvdXJjZVBvbGljeSgpOworICAgIE1lZGlhUmVzb3VyY2VQb2xpY3koU3RyaW5nOCB0eXBlLCBTdHJpbmc4IHZhbHVlKTsKKworICAgIHZvaWQgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpOworICAgIHZvaWQgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Q7CisKKyAgICBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3Q7CisKKyAgICBTdHJpbmc4IG1UeXBlOworICAgIFN0cmluZzggbVZhbHVlOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1JFU09VUkNFX1BPTElDWV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1JpbmdCdWZmZXIuaCBiL2luY2x1ZGUvbWVkaWEvUmluZ0J1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmN2MwMGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL1JpbmdCdWZmZXIuaApAQCAtMCwwICsxLDM2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBBTkRST0lEX1NFUlZJQ0VfVVRJTFNfUklOR19CVUZGRVJfSAorI2RlZmluZSBBTkRST0lEX1NFUlZJQ0VfVVRJTFNfUklOR19CVUZGRVJfSAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbXBpbGVyLmg+CisKKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIEEgUmluZ0J1ZmZlciBjbGFzcyB0aGF0IG1haW50YWlucyBhbiBhcnJheSBvZiBvYmplY3RzIHRoYXQgY2FuIGdyb3cgdXAgdG8gYSBjZXJ0YWluIHNpemUuCisgKiBFbGVtZW50cyBhZGRlZCB0byB0aGUgUmluZ0J1ZmZlciBhcmUgaW5zZXJ0ZWQgaW4gdGhlIGxvZ2ljYWwgZnJvbnQgb2YgdGhlIGJ1ZmZlciwgYW5kCisgKiBpbnZhbGlkYXRlIGFsbCBjdXJyZW50IGl0ZXJhdG9ycyBmb3IgdGhhdCBSaW5nQnVmZmVyIG9iamVjdC4KKyAqLwordGVtcGxhdGUgPGNsYXNzIFQ+CitjbGFzcyBSaW5nQnVmZmVyIGZpbmFsIHsKK3B1YmxpYzoKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIFJpbmdCdWZmZXIgdGhhdCBjYW4gZ3JvdyB1cCB0byB0aGUgZ2l2ZW4gbGVuZ3RoLgorICAgICAqLworICAgIFJpbmdCdWZmZXIoc2l6ZV90IGxlbmd0aCk7CisKKyAgICAvKioKKyAgICAgKiBGb3J3YXJkIGl0ZXJhdG9yIHRvIHRoaXMgY2xhc3MuICBJbXBsZW1lbnRzIGFuIHN0ZDpmb3J3YXJkX2l0ZXJhdG9yLgorICAgICAqLworICAgIGNsYXNzIGl0ZXJhdG9yIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgVD4geworICAgIHB1YmxpYzoKKyAgICAgICAgaXRlcmF0b3IoVCogcHRyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IHBvcywgc2l6ZV90IGN0cik7CisKKyAgICAgICAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKTsKKworICAgICAgICBpdGVyYXRvciBvcGVyYXRvcisrKGludCk7CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiByaHMpOworCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgcmhzKTsKKworICAgICAgICBUJiBvcGVyYXRvciooKTsKKworICAgICAgICBUKiBvcGVyYXRvci0+KCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBUKiBtUHRyOworICAgICAgICBzaXplX3QgbVNpemU7CisgICAgICAgIHNpemVfdCBtUG9zOworICAgICAgICBzaXplX3QgbUN0cjsKKyAgICB9OworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgZm9yd2FyZCBpdGVyYXRvciB0byB0aGlzIGNsYXNzLiAgSW1wbGVtZW50cyBhbiBzdGQ6Zm9yd2FyZF9pdGVyYXRvci4KKyAgICAgKi8KKyAgICBjbGFzcyBjb25zdF9pdGVyYXRvciA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIFQ+IHsKKyAgICBwdWJsaWM6CisgICAgICAgIGNvbnN0X2l0ZXJhdG9yKGNvbnN0IFQqIHB0ciwgc2l6ZV90IHNpemUsIHNpemVfdCBwb3MsIHNpemVfdCBjdHIpOworCisgICAgICAgIGNvbnN0X2l0ZXJhdG9yJiBvcGVyYXRvcisrKCk7CisKKyAgICAgICAgY29uc3RfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpOworCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBjb25zdF9pdGVyYXRvciYgcmhzKTsKKworICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgY29uc3RfaXRlcmF0b3ImIHJocyk7CisKKyAgICAgICAgY29uc3QgVCYgb3BlcmF0b3IqKCk7CisKKyAgICAgICAgY29uc3QgVCogb3BlcmF0b3ItPigpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgVCogbVB0cjsKKyAgICAgICAgc2l6ZV90IG1TaXplOworICAgICAgICBzaXplX3QgbVBvczsKKyAgICAgICAgc2l6ZV90IG1DdHI7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEFkZHMgaXRlbSB0byB0aGUgZnJvbnQgb2YgdGhpcyBSaW5nQnVmZmVyLiAgSWYgdGhlIFJpbmdCdWZmZXIgaXMgYXQgaXRzIG1heGltdW0gbGVuZ3RoLAorICAgICAqIHRoaXMgd2lsbCByZXN1bHQgaW4gdGhlIGxhc3QgZWxlbWVudCBiZWluZyByZXBsYWNlZCAodGhpcyBpcyBkb25lIHVzaW5nIHRoZSBlbGVtZW50J3MKKyAgICAgKiBhc3NpZ25tZW50IG9wZXJhdG9yKS4KKyAgICAgKgorICAgICAqIEFsbCBjdXJyZW50IGl0ZXJhdG9ycyBhcmUgaW52YWxpZGF0ZWQuCisgICAgICovCisgICAgdm9pZCBhZGQoY29uc3QgVCYgaXRlbSk7CisKKyAgICAvKioKKyAgICAgKiBNb3ZlcyBpdGVtIHRvIHRoZSBmcm9udCBvZiB0aGlzIFJpbmdCdWZmZXIuICBGb2xsb3dpbmcgYSBjYWxsIHRvIHRoaXMsIGl0ZW0gc2hvdWxkIG5vCisgICAgICogbG9uZ2VyIGJlIHVzZWQuICBJZiB0aGUgUmluZ0J1ZmZlciBpcyBhdCBpdHMgbWF4aW11bSBsZW5ndGgsIHRoaXMgd2lsbCByZXN1bHQgaW4gdGhlCisgICAgICogbGFzdCBlbGVtZW50IGJlaW5nIHJlcGxhY2VkICh0aGlzIGlzIGRvbmUgdXNpbmcgdGhlIGVsZW1lbnQncyBhc3NpZ25tZW50IG9wZXJhdG9yKS4KKyAgICAgKgorICAgICAqIEFsbCBjdXJyZW50IGl0ZXJhdG9ycyBhcmUgaW52YWxpZGF0ZWQuCisgICAgICovCisgICAgdm9pZCBhZGQoVCYmIGl0ZW0pOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGl0ZW0gaW4tcGxhY2UgaW4gdGhlIGZyb250IG9mIHRoaXMgUmluZ0J1ZmZlciB1c2luZyB0aGUgZ2l2ZW4gYXJndW1lbnRzLiAgSWYKKyAgICAgKiB0aGUgUmluZ0J1ZmZlciBpcyBhdCBpdHMgbWF4aW11bSBsZW5ndGgsIHRoaXMgd2lsbCByZXN1bHQgaW4gdGhlIGxhc3QgZWxlbWVudCBiZWluZworICAgICAqIHJlcGxhY2VkICh0aGlzIGlzIGRvbmUgdXNpbmcgdGhlIGVsZW1lbnQncyBhc3NpZ25tZW50IG9wZXJhdG9yKS4KKyAgICAgKgorICAgICAqIEFsbCBjdXJyZW50IGl0ZXJhdG9ycyBhcmUgaW52YWxpZGF0ZWQuCisgICAgICovCisgICAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+CisgICAgdm9pZCBlbXBsYWNlKEFyZ3MmJi4uLiBhcmdzKTsKKworICAgIC8qKgorICAgICAqIEdldCBhbiBpdGVyYXRvciB0byB0aGUgZnJvbnQgb2YgdGhpcyBSaW5nQnVmZmVyLgorICAgICAqLworICAgIGl0ZXJhdG9yIGJlZ2luKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYW4gaXRlcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGlzIFJpbmdCdWZmZXIuCisgICAgICovCisgICAgaXRlcmF0b3IgZW5kKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBjb25zdF9pdGVyYXRvciB0byB0aGUgZnJvbnQgb2YgdGhpcyBSaW5nQnVmZmVyLgorICAgICAqLworICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBjb25zdF9pdGVyYXRvciB0byB0aGUgZW5kIG9mIHRoaXMgUmluZ0J1ZmZlci4KKyAgICAgKi8KKyAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgZWxlbWVudCBhdCBhIGdpdmVuIGluZGV4LiAgSWYgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZSBmb3IKKyAgICAgKiB0aGlzIHJpbmdidWZmZXIsIFswLCBzaXplKSwgdGhlIGJlaGF2aW9yIGZvciB0aGlzIGlzIHVuZGVmaW5lZC4KKyAgICAgKi8KKyAgICBUJiBvcGVyYXRvcltdKHNpemVfdCBpbmRleCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBjb25zdCByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgYXQgYSBnaXZlbiBpbmRleC4gIElmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKKyAgICAgKiBmb3IgdGhpcyByaW5nYnVmZmVyLCBbMCwgc2l6ZSksIHRoZSBiZWhhdmlvciBmb3IgdGhpcyBpcyB1bmRlZmluZWQuCisgICAgICovCisgICAgY29uc3QgVCYgb3BlcmF0b3JbXShzaXplX3QgaW5kZXgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHNpemUgb2YgdGhpcyBSaW5nQnVmZmVyLgorICAgICAqLworICAgIHNpemVfdCBzaXplKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gdGhpcyBSaW5nQnVmZmVyIGFuZCBzZXQgdGhlIHNpemUgdG8gMC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCk7CisKK3ByaXZhdGU6CisgICAgc2l6ZV90IG1Gcm9udElkeDsKKyAgICBzaXplX3QgbU1heEJ1ZmZlclNpemU7CisgICAgc3RkOjp2ZWN0b3I8VD4gbUJ1ZmZlcjsKK307IC8vIGNsYXNzIFJpbmdCdWZmZXIKKworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1JpbmdCdWZmZXI8VD46OlJpbmdCdWZmZXIoc2l6ZV90IGxlbmd0aCkgOiBtRnJvbnRJZHh7MH0sIG1NYXhCdWZmZXJTaXple2xlbmd0aH0ge30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitSaW5nQnVmZmVyPFQ+OjppdGVyYXRvcjo6aXRlcmF0b3IoVCogcHRyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IHBvcywgc2l6ZV90IGN0cikgOgorICAgICAgICBtUHRye3B0cn0sIG1TaXple3NpemV9LCBtUG9ze3Bvc30sIG1DdHJ7Y3RyfSB7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3R5cGVuYW1lIFJpbmdCdWZmZXI8VD46Oml0ZXJhdG9yJiBSaW5nQnVmZmVyPFQ+OjppdGVyYXRvcjo6b3BlcmF0b3IrKygpIHsKKyAgICArK21DdHI7CisKKyAgICBpZiAoQ0NfVU5MSUtFTFkobUN0ciA9PSBtU2l6ZSkpIHsKKyAgICAgICAgbVBvcyA9IG1TaXplOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgbVBvcyA9ICgoQ0NfVU5MSUtFTFkobVBvcyA9PSAwKSkgPyBtU2l6ZSAtIDEgOiBtUG9zIC0gMSk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3R5cGVuYW1lIFJpbmdCdWZmZXI8VD46Oml0ZXJhdG9yIFJpbmdCdWZmZXI8VD46Oml0ZXJhdG9yOjpvcGVyYXRvcisrKGludCkgeworICAgIGl0ZXJhdG9yIHRtcHttUHRyLCBtU2l6ZSwgbVBvcywgbUN0cn07CisgICAgKysoKnRoaXMpOworICAgIHJldHVybiB0bXA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorYm9vbCBSaW5nQnVmZmVyPFQ+OjppdGVyYXRvcjo6b3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgcmhzKSB7CisgICAgcmV0dXJuIChtUHRyICsgbVBvcykgPT0gKHJocy5tUHRyICsgcmhzLm1Qb3MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2Jvb2wgUmluZ0J1ZmZlcjxUPjo6aXRlcmF0b3I6Om9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIHJocykgeworICAgIHJldHVybiAobVB0ciArIG1Qb3MpICE9IChyaHMubVB0ciArIHJocy5tUG9zKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitUJiBSaW5nQnVmZmVyPFQ+OjppdGVyYXRvcjo6b3BlcmF0b3IqKCkgeworICAgIHJldHVybiAqKG1QdHIgKyBtUG9zKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitUKiBSaW5nQnVmZmVyPFQ+OjppdGVyYXRvcjo6b3BlcmF0b3ItPigpIHsKKyAgICByZXR1cm4gbVB0ciArIG1Qb3M7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorUmluZ0J1ZmZlcjxUPjo6Y29uc3RfaXRlcmF0b3I6OmNvbnN0X2l0ZXJhdG9yKGNvbnN0IFQqIHB0ciwgc2l6ZV90IHNpemUsIHNpemVfdCBwb3MsIHNpemVfdCBjdHIpIDoKKyAgICAgICAgbVB0cntwdHJ9LCBtU2l6ZXtzaXplfSwgbVBvc3twb3N9LCBtQ3Rye2N0cn0ge30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit0eXBlbmFtZSBSaW5nQnVmZmVyPFQ+Ojpjb25zdF9pdGVyYXRvciYgUmluZ0J1ZmZlcjxUPjo6Y29uc3RfaXRlcmF0b3I6Om9wZXJhdG9yKysoKSB7CisgICAgKyttQ3RyOworCisgICAgaWYgKENDX1VOTElLRUxZKG1DdHIgPT0gbVNpemUpKSB7CisgICAgICAgIG1Qb3MgPSBtU2l6ZTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG1Qb3MgPSAoKENDX1VOTElLRUxZKG1Qb3MgPT0gMCkpID8gbVNpemUgLSAxIDogbVBvcyAtIDEpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit0eXBlbmFtZSBSaW5nQnVmZmVyPFQ+Ojpjb25zdF9pdGVyYXRvciBSaW5nQnVmZmVyPFQ+Ojpjb25zdF9pdGVyYXRvcjo6b3BlcmF0b3IrKyhpbnQpIHsKKyAgICBjb25zdF9pdGVyYXRvciB0bXB7bVB0ciwgbVNpemUsIG1Qb3MsIG1DdHJ9OworICAgICsrKCp0aGlzKTsKKyAgICByZXR1cm4gdG1wOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2Jvb2wgUmluZ0J1ZmZlcjxUPjo6Y29uc3RfaXRlcmF0b3I6Om9wZXJhdG9yPT0oY29uc3QgY29uc3RfaXRlcmF0b3ImIHJocykgeworICAgIHJldHVybiAobVB0ciArIG1Qb3MpID09IChyaHMubVB0ciArIHJocy5tUG9zKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Citib29sIFJpbmdCdWZmZXI8VD46OmNvbnN0X2l0ZXJhdG9yOjpvcGVyYXRvciE9KGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiByaHMpIHsKKyAgICByZXR1cm4gKG1QdHIgKyBtUG9zKSAhPSAocmhzLm1QdHIgKyByaHMubVBvcyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3QgVCYgUmluZ0J1ZmZlcjxUPjo6Y29uc3RfaXRlcmF0b3I6Om9wZXJhdG9yKigpIHsKKyAgICByZXR1cm4gKihtUHRyICsgbVBvcyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3QgVCogUmluZ0J1ZmZlcjxUPjo6Y29uc3RfaXRlcmF0b3I6Om9wZXJhdG9yLT4oKSB7CisgICAgcmV0dXJuIG1QdHIgKyBtUG9zOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3ZvaWQgUmluZ0J1ZmZlcjxUPjo6YWRkKGNvbnN0IFQmIGl0ZW0pIHsKKyAgICBpZiAobUJ1ZmZlci5zaXplKCkgPCBtTWF4QnVmZmVyU2l6ZSkgeworICAgICAgICBtQnVmZmVyLnB1c2hfYmFjayhpdGVtKTsKKyAgICAgICAgbUZyb250SWR4ID0gKChtRnJvbnRJZHggKyAxKSAlIG1NYXhCdWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1CdWZmZXJbbUZyb250SWR4XSA9IGl0ZW07CisgICAgbUZyb250SWR4ID0gKChtRnJvbnRJZHggKyAxKSAlIG1NYXhCdWZmZXJTaXplKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit2b2lkIFJpbmdCdWZmZXI8VD46OmFkZChUJiYgaXRlbSkgeworICAgIGlmIChtQnVmZmVyLnNpemUoKSAhPSBtTWF4QnVmZmVyU2l6ZSkgeworICAgICAgICBtQnVmZmVyLnB1c2hfYmFjayhzdGQ6OmZvcndhcmQ8VD4oaXRlbSkpOworICAgICAgICBtRnJvbnRJZHggPSAoKG1Gcm9udElkeCArIDEpICUgbU1heEJ1ZmZlclNpemUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gT25seSB3b3JrcyBmb3IgdHlwZXMgd2l0aCBtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IKKyAgICBtQnVmZmVyW21Gcm9udElkeF0gPSBzdGQ6OmZvcndhcmQ8VD4oaXRlbSk7CisgICAgbUZyb250SWR4ID0gKChtRnJvbnRJZHggKyAxKSAlIG1NYXhCdWZmZXJTaXplKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJncz4KK3ZvaWQgUmluZ0J1ZmZlcjxUPjo6ZW1wbGFjZShBcmdzJiYuLi4gYXJncykgeworICAgIGlmIChtQnVmZmVyLnNpemUoKSAhPSBtTWF4QnVmZmVyU2l6ZSkgeworICAgICAgICBtQnVmZmVyLmVtcGxhY2VfYmFjayhzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOworICAgICAgICBtRnJvbnRJZHggPSAoKG1Gcm9udElkeCArIDEpICUgbU1heEJ1ZmZlclNpemUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gT25seSB3b3JrcyBmb3IgdHlwZXMgd2l0aCBtb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IKKyAgICBtQnVmZmVyW21Gcm9udElkeF0gPSBUKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CisgICAgbUZyb250SWR4ID0gKChtRnJvbnRJZHggKyAxKSAlIG1NYXhCdWZmZXJTaXplKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit0eXBlbmFtZSBSaW5nQnVmZmVyPFQ+OjppdGVyYXRvciBSaW5nQnVmZmVyPFQ+OjpiZWdpbigpIHsKKyAgICBzaXplX3QgdG1wID0gKG1CdWZmZXIuc2l6ZSgpID09IDApID8gMCA6IG1CdWZmZXIuc2l6ZSgpIC0gMTsKKyAgICByZXR1cm4gaXRlcmF0b3IobUJ1ZmZlci5kYXRhKCksIG1CdWZmZXIuc2l6ZSgpLCAobUZyb250SWR4ID09IDApID8gdG1wIDogbUZyb250SWR4IC0gMSwgMCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgordHlwZW5hbWUgUmluZ0J1ZmZlcjxUPjo6aXRlcmF0b3IgUmluZ0J1ZmZlcjxUPjo6ZW5kKCkgeworICAgIHNpemVfdCBzID0gbUJ1ZmZlci5zaXplKCk7CisgICAgcmV0dXJuIGl0ZXJhdG9yKG1CdWZmZXIuZGF0YSgpLCBzLCBzLCBzKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Cit0eXBlbmFtZSBSaW5nQnVmZmVyPFQ+Ojpjb25zdF9pdGVyYXRvciBSaW5nQnVmZmVyPFQ+OjpiZWdpbigpIGNvbnN0IHsKKyAgICBzaXplX3QgdG1wID0gKG1CdWZmZXIuc2l6ZSgpID09IDApID8gMCA6IG1CdWZmZXIuc2l6ZSgpIC0gMTsKKyAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IobUJ1ZmZlci5kYXRhKCksIG1CdWZmZXIuc2l6ZSgpLAorICAgICAgICAgICAgKG1Gcm9udElkeCA9PSAwKSA/IHRtcCA6IG1Gcm9udElkeCAtIDEsIDApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3R5cGVuYW1lIFJpbmdCdWZmZXI8VD46OmNvbnN0X2l0ZXJhdG9yIFJpbmdCdWZmZXI8VD46OmVuZCgpIGNvbnN0IHsKKyAgICBzaXplX3QgcyA9IG1CdWZmZXIuc2l6ZSgpOworICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihtQnVmZmVyLmRhdGEoKSwgcywgcywgcyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorVCYgUmluZ0J1ZmZlcjxUPjo6b3BlcmF0b3JbXShzaXplX3QgaW5kZXgpIHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGluZGV4ID49IG1CdWZmZXIuc2l6ZSgpLCAiSW5kZXggJXp1IG91dCBvZiBib3VuZHMsIHNpemUgaXMgJXp1LiIsCisgICAgICAgICAgICBpbmRleCwgbUJ1ZmZlci5zaXplKCkpOworICAgIHNpemVfdCBwb3MgPSAoaW5kZXggPj0gbUZyb250SWR4KSA/CisgICAgICAgICAgICBtQnVmZmVyLnNpemUoKSAtIDEgLSAoaW5kZXggLSBtRnJvbnRJZHgpIDogbUZyb250SWR4IC0gMSAtIGluZGV4OworICAgIHJldHVybiBtQnVmZmVyW3Bvc107Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3QgVCYgUmluZ0J1ZmZlcjxUPjo6b3BlcmF0b3JbXShzaXplX3QgaW5kZXgpIGNvbnN0IHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGluZGV4ID49IG1CdWZmZXIuc2l6ZSgpLCAiSW5kZXggJXp1IG91dCBvZiBib3VuZHMsIHNpemUgaXMgJXp1LiIsCisgICAgICAgICAgICBpbmRleCwgbUJ1ZmZlci5zaXplKCkpOworICAgIHNpemVfdCBwb3MgPSAoaW5kZXggPj0gbUZyb250SWR4KSA/CisgICAgICAgICAgICBtQnVmZmVyLnNpemUoKSAtIDEgLSAoaW5kZXggLSBtRnJvbnRJZHgpIDogbUZyb250SWR4IC0gMSAtIGluZGV4OworICAgIHJldHVybiBtQnVmZmVyW3Bvc107Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorc2l6ZV90IFJpbmdCdWZmZXI8VD46OnNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1CdWZmZXIuc2l6ZSgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3ZvaWQgUmluZ0J1ZmZlcjxUPjo6Y2xlYXIoKSB7CisgICAgbUJ1ZmZlci5jbGVhcigpOworICAgIG1Gcm9udElkeCA9IDA7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1NFUlZJQ0VfVVRJTFNfUklOR19CVUZGRVJfSAorCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oIGIvaW5jbHVkZS9tZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmgKaW5kZXggMDRjNWZkMC4uZDQyMzk2MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmgKQEAgLTIxLDYgKzIxLDcgQEAKIC8vIE5vbi1ibG9ja2luZyBzaW5nbGUtcmVhZGVyIC8gc2luZ2xlLXdyaXRlciBtdWx0aS13b3JkIGF0b21pYyBsb2FkIC8gc3RvcmUKIAogI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMSw2ICszMiwxMiBAQAogICAgIGNsYXNzIE11dGF0b3I7CiAgICAgY2xhc3MgT2JzZXJ2ZXI7CiAKKyAgICBlbnVtIFNTUV9TVEFUVVMgeworICAgICAgICBTU1FfUEVORElORywgLyogPSAwICovCisgICAgICAgIFNTUV9SRUFELAorICAgICAgICBTU1FfRE9ORSwKKyAgICB9OworCiAgICAgc3RydWN0IFNoYXJlZCB7CiAgICAgICAgIC8vIG5lZWRzIHRvIGJlIHBhcnQgb2YgYSB1bmlvbiBzbyBkb24ndCBkZWZpbmUgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvcgogCkBAIC00MSwyOCArNDgsNTYgQEAKICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBpbml0KCkgeyBtQWNrID0gMDsgbVNlcXVlbmNlID0gMDsgfQogCiAgICAgICAgIHZvbGF0aWxlIGludDMyX3QgICAgbUFjazsKLSNpZiAwCi0gICAgICAgIGludCAgICAgICAgICAgICAgICAgbVBhZFs3XTsKLSAgICAgICAgLy8gY2FjaGUgbGluZSBib3VuZGFyeQotI2VuZGlmCiAgICAgICAgIHZvbGF0aWxlIGludDMyX3QgICAgbVNlcXVlbmNlOwogICAgICAgICBUICAgICAgICAgICAgICAgICAgIG1WYWx1ZTsKICAgICB9OwogCiAgICAgY2xhc3MgTXV0YXRvciB7CiAgICAgcHVibGljOgotICAgICAgICBNdXRhdG9yKFNoYXJlZCAqc2hhcmVkKTsKLSAgICAgICAgLyp2aXJ0dWFsKi8gfk11dGF0b3IoKSB7IH0KKyAgICAgICAgTXV0YXRvcihTaGFyZWQgKnNoYXJlZCkKKyAgICAgICAgICAgIDogbVNlcXVlbmNlKDApLCBtU2hhcmVkKHNoYXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZXhhY3RseSBvbmUgb2YgTXV0YXRvciBhbmQgT2JzZXJ2ZXIgbXVzdCBpbml0aWFsaXplLCBjdXJyZW50bHkgaXQgaXMgT2JzZXJ2ZXIKKyAgICAgICAgICAgIC8vIHNoYXJlZC0+aW5pdCgpOworICAgICAgICB9CiAKICAgICAgICAgLy8gcHVzaCBuZXcgdmFsdWUgb250byBzdGF0ZSBxdWV1ZSwgb3ZlcndyaXRpbmcgcHJldmlvdXMgdmFsdWU7CiAgICAgICAgIC8vIHJldHVybnMgYSBzZXF1ZW5jZSBudW1iZXIgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBhY2soKQotICAgICAgICBpbnQzMl90IHB1c2goY29uc3QgVCYgdmFsdWUpOworICAgICAgICBpbnQzMl90IHB1c2goY29uc3QgVCYgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNoYXJlZCAqc2hhcmVkID0gbVNoYXJlZDsKKyAgICAgICAgICAgIGludDMyX3Qgc2VxdWVuY2UgPSBtU2VxdWVuY2U7CisgICAgICAgICAgICBzZXF1ZW5jZSsrOworICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9zdG9yZShzZXF1ZW5jZSwgJnNoYXJlZC0+bVNlcXVlbmNlKTsKKyAgICAgICAgICAgIHNoYXJlZC0+bVZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICBzZXF1ZW5jZSsrOworICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZShzZXF1ZW5jZSwgJnNoYXJlZC0+bVNlcXVlbmNlKTsKKyAgICAgICAgICAgIG1TZXF1ZW5jZSA9IHNlcXVlbmNlOworICAgICAgICAgICAgLy8gY29uc2lkZXIgc2lnbmFsbGluZyBhIGZ1dGV4IGhlcmUsIGlmIHdlIGtub3cgdGhhdCBvYnNlcnZlciBpcyB3YWl0aW5nCisgICAgICAgICAgICByZXR1cm4gc2VxdWVuY2U7CisgICAgICAgIH0KIAotICAgICAgICAvLyByZXR1cm4gdHJ1ZSBpZiBtb3N0IHJlY2VudCBwdXNoIGhhcyBiZWVuIG9ic2VydmVkCi0gICAgICAgIGJvb2wgYWNrKCk7CisgICAgICAgIC8vIHJldHVybnMgdGhlIHN0YXR1cyBvZiB0aGUgbGFzdCBzdGF0ZSBwdXNoLiAgVGhpcyBtYXkgYmUgYSBzdGFsZSB2YWx1ZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gU1NRX1BFTkRJTkcsIG9yIDAsIG1lYW5zIGl0IGhhcyBub3QgYmVlbiBvYnNlcnZlZAorICAgICAgICAvLyBTU1FfUkVBRCBtZWFucyBpdCBoYXMgYmVlbiByZWFkCisgICAgICAgIC8vIFNTUV9ET05FIG1lYW5zIGl0IGhhcyBiZWVuIGFjdGVkIHVwb24sIGFmdGVyIE9ic2VydmVyOjpkb25lKCkgaXMgY2FsbGVkCisgICAgICAgIGVudW0gU1NRX1NUQVRVUyBhY2soKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU1FfRE9ORSwgcHJldmVudCBhbnkgc3VidGxlIGRhdGEtcmFjZXMgb2Ygc3Vic2VxdWVudCByZWFkcworICAgICAgICAgICAgLy8gYmVpbmcgcGVyZm9ybWVkIChvdXQtb2Ytb3JkZXIpIGJlZm9yZSB0aGUgYWNrIHJlYWQsIHNob3VsZCB0aGUgY2FsbGVyIGJlCisgICAgICAgICAgICAvLyBkZXBlbmRpbmcgb24gc2VxdWVudGlhbGl0eSBvZiByZWFkcy4KKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYWNrID0gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZtU2hhcmVkLT5tQWNrKTsKKyAgICAgICAgICAgIHJldHVybiBhY2sgLSBtU2VxdWVuY2UgJiB+MSA/IFNTUV9QRU5ESU5HIC8qIHNlcSBkaWZmZXIgKi8gOgorICAgICAgICAgICAgICAgICAgICBhY2sgJiAxID8gU1NRX0RPTkUgOiBTU1FfUkVBRDsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIHJldHVybiB0cnVlIGlmIGEgcHVzaCB3aXRoIHNwZWNpZmllZCBzZXF1ZW5jZSBudW1iZXIgb3IgbGF0ZXIgaGFzIGJlZW4gb2JzZXJ2ZWQKLSAgICAgICAgYm9vbCBhY2soaW50MzJfdCBzZXF1ZW5jZSk7CisgICAgICAgIGJvb2wgYWNrKGludDMyX3Qgc2VxdWVuY2UpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRoaXMgcmVsaWVzIG9uIDIncyBjb21wbGVtZW50IHJvbGxvdmVyIHRvIGRldGVjdCBhbiBhbmNpZW50IHNlcXVlbmNlIG51bWJlcgorICAgICAgICAgICAgcmV0dXJuIG1TaGFyZWQtPm1BY2sgLSBzZXF1ZW5jZSA+PSAwOworICAgICAgICB9CiAKICAgICBwcml2YXRlOgogICAgICAgICBpbnQzMl90ICAgICBtU2VxdWVuY2U7CkBAIC03MSwxMSArMTA2LDU0IEBACiAKICAgICBjbGFzcyBPYnNlcnZlciB7CiAgICAgcHVibGljOgotICAgICAgICBPYnNlcnZlcihTaGFyZWQgKnNoYXJlZCk7Ci0gICAgICAgIC8qdmlydHVhbCovIH5PYnNlcnZlcigpIHsgfQorICAgICAgICBPYnNlcnZlcihTaGFyZWQgKnNoYXJlZCkKKyAgICAgICAgICAgIDogbVNlcXVlbmNlKDApLCBtU2VlZCgxKSwgbVNoYXJlZChzaGFyZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGV4YWN0bHkgb25lIG9mIE11dGF0b3IgYW5kIE9ic2VydmVyIG11c3QgaW5pdGlhbGl6ZSwgY3VycmVudGx5IGl0IGlzIE9ic2VydmVyCisgICAgICAgICAgICBzaGFyZWQtPmluaXQoKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIHJldHVybiB0cnVlIGlmIHZhbHVlIGhhcyBjaGFuZ2VkCi0gICAgICAgIGJvb2wgcG9sbChUJiB2YWx1ZSk7CisgICAgICAgIGJvb2wgcG9sbChUJiB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2hhcmVkICpzaGFyZWQgPSBtU2hhcmVkOworICAgICAgICAgICAgaW50MzJfdCBiZWZvcmUgPSBzaGFyZWQtPm1TZXF1ZW5jZTsKKyAgICAgICAgICAgIGlmIChiZWZvcmUgPT0gbVNlcXVlbmNlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgdHJpZXMgPSAwOyA7ICkgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBNQVhfVFJJRVMgPSA1OworICAgICAgICAgICAgICAgIGlmIChiZWZvcmUgJiAxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgrK3RyaWVzID49IE1BWF9UUklFUykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJlZm9yZSA9IHNoYXJlZC0+bVNlcXVlbmNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfbWVtb3J5X2JhcnJpZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgVCB0ZW1wID0gc2hhcmVkLT5tVmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYWZ0ZXIgPSBhbmRyb2lkX2F0b21pY19yZWxlYXNlX2xvYWQoJnNoYXJlZC0+bVNlcXVlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFmdGVyID09IGJlZm9yZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0ZW1wOworICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkLT5tQWNrID0gYmVmb3JlOworICAgICAgICAgICAgICAgICAgICAgICAgbVNlcXVlbmNlID0gYmVmb3JlOyAvLyBtU2VxdWVuY2UgaXMgZXZlbiBhZnRlciBwb2xsIHN1Y2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgrK3RyaWVzID49IE1BWF9UUklFUykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJlZm9yZSA9IGFmdGVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIChvcHRpb25hbCkgdXNlZCB0byBpbmRpY2F0ZSB0byB0aGUgTXV0YXRvciB0aGF0IHRoZSBzdGF0ZSB0aGF0IGhhcyBiZWVuIHBvbGxlZAorICAgICAgICAvLyBoYXMgYWxzbyBiZWVuIGFjdGVkIHVwb24uCisgICAgICAgIHZvaWQgZG9uZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYWNrID0gbVNoYXJlZC0+bUFjayArIDE7CisgICAgICAgICAgICAvLyBlbnN1cmUgYWxsIHByZXZpb3VzIHdyaXRlcyBoYXZlIGJlZW4gcGVyZm9ybWVkLgorICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9zdG9yZShhY2ssICZtU2hhcmVkLT5tQWNrKTsgLy8gbVNlcXVlbmNlIGlzIG9kZCBhZnRlciAiZG9uZSIKKyAgICAgICAgfQogCiAgICAgcHJpdmF0ZToKICAgICAgICAgaW50MzJfdCAgICAgbVNlcXVlbmNlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9TdHJpbmdBcnJheS5oIGIvaW5jbHVkZS9tZWRpYS9TdHJpbmdBcnJheS5oCmluZGV4IGFlNDcwODUuLjQ4ZDk4YmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvU3RyaW5nQXJyYXkuaAorKysgYi9pbmNsdWRlL21lZGlhL1N0cmluZ0FycmF5LmgKQEAgLTE2LDcgKzE2LDcgQEAKIAogLy8KIC8vIFNvcnRhYmxlIGFycmF5IG9mIHN0cmluZ3MuICBTVEwtaXNoLCBidXQgU1RMLWZyZWUuCi0vLyAgCisvLwogI2lmbmRlZiBfTElCU19NRURJQV9TVFJJTkdfQVJSQVlfSAogI2RlZmluZSBfTElCU19NRURJQV9TVFJJTkdfQVJSQVlfSAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1Zpc3VhbGl6ZXIuaCBiL2luY2x1ZGUvbWVkaWEvVmlzdWFsaXplci5oCmluZGV4IDYxNjdkZDYuLjE4NmUwMTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvVmlzdWFsaXplci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvVmlzdWFsaXplci5oCkBAIC02NSw3ICs2NSw4IEBACiAgICAgLyogQ29uc3RydWN0b3IuCiAgICAgICogU2VlIEF1ZGlvRWZmZWN0IGNvbnN0cnVjdG9yIGZvciBkZXRhaWxzIG9uIHBhcmFtZXRlcnMuCiAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBWaXN1YWxpemVyKGludDMyX3QgcHJpb3JpdHkgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgVmlzdWFsaXplcihjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkID0gMCk7CkBAIC05NCw3ICs5NSw4IEBACiAKICAgICAvLyBpbnN0YWxsIGEgY2FsbGJhY2sgdG8gcmVjZWl2ZSBwZXJpb2RpYyBjYXB0dXJlcy4gVGhlIGNhcHR1cmUgcmF0ZSBpcyBzcGVjaWZpZWQgaW4gbWlsbGlIZXJ0egogICAgIC8vIGFuZCB0aGUgY2FwdHVyZSBmb3JtYXQgaXMgYWNjb3JkaW5nIHRvIGZsYWdzICAoc2VlIGNhbGxiYWNrX2ZsYWdzKS4KLSAgICBzdGF0dXNfdCBzZXRDYXB0dXJlQ2FsbEJhY2soY2FwdHVyZV9jYmtfdCBjYmssIHZvaWQqIHVzZXIsIHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCByYXRlKTsKKyAgICBzdGF0dXNfdCBzZXRDYXB0dXJlQ2FsbEJhY2soY2FwdHVyZV9jYmtfdCBjYmssIHZvaWQqIHVzZXIsIHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCByYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZmFsc2UpOwogCiAgICAgLy8gc2V0IHRoZSBjYXB0dXJlIHNpemUgY2FwdHVyZSBzaXplIG11c3QgYmUgYSBwb3dlciBvZiB0d28gaW4gdGhlIHJhbmdlCiAgICAgLy8gW1ZJU1VBTElaRVJfQ0FQVFVSRV9TSVpFX01BWC4gVklTVUFMSVpFUl9DQVBUVVJFX1NJWkVfTUlOXQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmggYi9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaAppbmRleCA4NGI5ODQ2Li44ZWQwN2VlIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaAorKysgYi9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaApAQCAtMjUsNiArMjUsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NsYXNzIElEYXRhU291cmNlOwogc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOwogY2xhc3MgSU1lZGlhUGxheWVyU2VydmljZTsKIGNsYXNzIElNZWRpYU1ldGFkYXRhUmV0cmlldmVyOwpAQCAtNTcsNiArNTgsNyBAQAogICAgIE1FVEFEQVRBX0tFWV9JU19EUk0gICAgICAgICAgPSAyMiwKICAgICBNRVRBREFUQV9LRVlfTE9DQVRJT04gICAgICAgID0gMjMsCiAgICAgTUVUQURBVEFfS0VZX1ZJREVPX1JPVEFUSU9OICA9IDI0LAorICAgIE1FVEFEQVRBX0tFWV9DQVBUVVJFX0ZSQU1FUkFURSA9IDI1LAogCiAgICAgLy8gQWRkIG1vcmUgaGVyZS4uLgogfTsKQEAgLTc0LDYgKzc2LDcgQEAKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCk7CiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKKyAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPElEYXRhU291cmNlPiYgZGF0YVNvdXJjZSk7CiAgICAgc3A8SU1lbW9yeT4gZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pOwogICAgIHNwPElNZW1vcnk+IGV4dHJhY3RBbGJ1bUFydCgpOwogICAgIGNvbnN0IGNoYXIqIGV4dHJhY3RNZXRhZGF0YShpbnQga2V5Q29kZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmggYi9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKaW5kZXggNTgzMDkzMy4uM2ZlNzQ5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbWVkaWFwbGF5ZXIuaApAQCAtMjAsNiArMjAsOCBAQAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRGVhdGhOb3RpZmllci5oPgpAQCAtMzIsOCArMzQsOSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIFN1cmZhY2U7CitzdHJ1Y3QgQVZTeW5jU2V0dGluZ3M7CiBjbGFzcyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworY2xhc3MgU3VyZmFjZTsKIAogZW51bSBtZWRpYV9ldmVudF90eXBlIHsKICAgICBNRURJQV9OT1AgICAgICAgICAgICAgICA9IDAsIC8vIGludGVyZmFjZSB0ZXN0IG1lc3NhZ2UKQEAgLTUwLDYgKzUzLDcgQEAKICAgICBNRURJQV9FUlJPUiAgICAgICAgICAgICA9IDEwMCwKICAgICBNRURJQV9JTkZPICAgICAgICAgICAgICA9IDIwMCwKICAgICBNRURJQV9TVUJUSVRMRV9EQVRBICAgICA9IDIwMSwKKyAgICBNRURJQV9NRVRBX0RBVEEgICAgICAgICA9IDIwMiwKIH07CiAKIC8vIEdlbmVyaWMgZXJyb3IgY29kZXMgZm9yIHRoZSBtZWRpYSBwbGF5ZXIgZnJhbWV3b3JrLiAgRXJyb3JzIGFyZSBmYXRhbCwgdGhlCkBAIC0xODMsNiArMTg3LDcgQEAKICAgICBNRURJQV9UUkFDS19UWVBFX0FVRElPID0gMiwKICAgICBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCA9IDMsCiAgICAgTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSA9IDQsCisgICAgTUVESUFfVFJBQ0tfVFlQRV9NRVRBREFUQSA9IDUsCiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yMTEsNiArMjE2LDcgQEAKIAogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4gJnNvdXJjZSk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0VmlkZW9TdXJmYWNlVGV4dHVyZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBidWZmZXJQcm9kdWNlcik7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0TGlzdGVuZXIoY29uc3Qgc3A8TWVkaWFQbGF5ZXJMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKQEAgLTIyMCw2ICsyMjYsMTIgQEAKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzdG9wKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcGF1c2UoKTsKICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBpc1BsYXlpbmcoKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlJiByYXRlKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlKiByYXRlIC8qIG5vbm51bGwgKi8pOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyYgc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRTeW5jU2V0dGluZ3MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN5bmNTZXR0aW5ncyogc3luYyAvKiBub25udWxsICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHZpZGVvRnBzIC8qIG5vbm51bGwgKi8pOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldFZpZGVvV2lkdGgoaW50ICp3KTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRWaWRlb0hlaWdodChpbnQgKmgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNlZWtUbyhpbnQgbXNlYyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaCBiL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCmluZGV4IGIwYTYyYTcuLjE1ZmY4MmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCkBAIC0zMiw2ICszMiw3IEBACiBjbGFzcyBJQ2FtZXJhOwogY2xhc3MgSUNhbWVyYVJlY29yZGluZ1Byb3h5OwogY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3N0cnVjdCBQZXJzaXN0ZW50U3VyZmFjZTsKIGNsYXNzIFN1cmZhY2U7CiAKIHR5cGVkZWYgdm9pZCAoKm1lZGlhX2NvbXBsZXRpb25fZikoc3RhdHVzX3Qgc3RhdHVzLCB2b2lkICpjb29raWUpOwpAQCAtMjA5LDcgKzIxMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgSU1lZGlhRGVhdGhOb3RpZmllcgogewogcHVibGljOgotICAgIE1lZGlhUmVjb3JkZXIoKTsKKyAgICBNZWRpYVJlY29yZGVyKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKTsKICAgICB+TWVkaWFSZWNvcmRlcigpOwogCiAgICAgdm9pZCAgICAgICAgZGllZCgpOwpAQCAtMjIxLDcgKzIyMiw2IEBACiAgICAgc3RhdHVzX3QgICAgc2V0T3V0cHV0Rm9ybWF0KGludCBvZik7CiAgICAgc3RhdHVzX3QgICAgc2V0VmlkZW9FbmNvZGVyKGludCB2ZSk7CiAgICAgc3RhdHVzX3QgICAgc2V0QXVkaW9FbmNvZGVyKGludCBhZSk7Ci0gICAgc3RhdHVzX3QgICAgc2V0T3V0cHV0RmlsZShjb25zdCBjaGFyKiBwYXRoKTsKICAgICBzdGF0dXNfdCAgICBzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKICAgICBzdGF0dXNfdCAgICBzZXRWaWRlb1NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKICAgICBzdGF0dXNfdCAgICBzZXRWaWRlb0ZyYW1lUmF0ZShpbnQgZnJhbWVzX3Blcl9zZWNvbmQpOwpAQCAtMjM3LDYgKzIzNyw3IEBACiAgICAgc3RhdHVzX3QgICAgY2xvc2UoKTsKICAgICBzdGF0dXNfdCAgICByZWxlYXNlKCk7CiAgICAgdm9pZCAgICAgICAgbm90aWZ5KGludCBtc2csIGludCBleHQxLCBpbnQgZXh0Mik7CisgICAgc3RhdHVzX3QgICAgc2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiYgc3VyZmFjZSk7CiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gICAgIHF1ZXJ5U3VyZmFjZU1lZGlhU291cmNlRnJvbU1lZGlhU2VydmVyKCk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL05CQUlPLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL05CQUlPLmgKaW5kZXggZDQyMjU3Ni4uZDliYmM4ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkFJTy5oCisrKyBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJBSU8uaApAQCAtMjMxLDcgKzIzMSw4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH0KIAogcHJvdGVjdGVkOgotICAgIE5CQUlPX1NpbmsoY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQgPSBGb3JtYXRfSW52YWxpZCkgOiBOQkFJT19Qb3J0KGZvcm1hdCksIG1GcmFtZXNXcml0dGVuKDApIHsgfQorICAgIE5CQUlPX1NpbmsoY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQgPSBGb3JtYXRfSW52YWxpZCkgOiBOQkFJT19Qb3J0KGZvcm1hdCksIG1GcmFtZXNXcml0dGVuKDApCisgICAgICAgICAgICB7IH0KICAgICB2aXJ0dWFsIH5OQkFJT19TaW5rKCkgeyB9CiAKICAgICAvLyBJbXBsZW1lbnRhdGlvbnMgYXJlIGZyZWUgdG8gaWdub3JlIHRoZXNlIGlmIHRoZXkgZG9uJ3QgbmVlZCB0aGVtCkBAIC0zMjIsNyArMzIzLDggQEAKICAgICB2aXJ0dWFsIHZvaWQgICAgb25UaW1lc3RhbXAoY29uc3QgQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgeyB9CiAKIHByb3RlY3RlZDoKLSAgICBOQkFJT19Tb3VyY2UoY29uc3QgTkJBSU9fRm9ybWF0JiBmb3JtYXQgPSBGb3JtYXRfSW52YWxpZCkgOiBOQkFJT19Qb3J0KGZvcm1hdCksIG1GcmFtZXNSZWFkKDApIHsgfQorICAgIE5CQUlPX1NvdXJjZShjb25zdCBOQkFJT19Gb3JtYXQmIGZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkKSA6IE5CQUlPX1BvcnQoZm9ybWF0KSwgbUZyYW1lc1JlYWQoMCkKKyAgICAgICAgICAgIHsgfQogICAgIHZpcnR1YWwgfk5CQUlPX1NvdXJjZSgpIHsgfQogCiAgICAgLy8gSW1wbGVtZW50YXRpb25zIGFyZSBmcmVlIHRvIGlnbm9yZSB0aGVzZSBpZiB0aGV5IGRvbid0IG5lZWQgdGhlbQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9OQkxvZy5oCmluZGV4IGJjYmJjMDQuLjEyOTdiNTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTkJMb2cuaAorKysgYi9pbmNsdWRlL21lZGlhL25iYWlvL05CTG9nLmgKQEAgLTIxLDcgKzIxLDcgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmFpby9yb3VuZHVwLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcm91bmR1cC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FBQ1dyaXRlci5oCmluZGV4IGQyMjcwN2EuLmFhNjBhMTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQUNXcml0ZXIuaApAQCAtMjQsMTAgKzI0LDkgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IE1lZGlhU291cmNlOwotc3RydWN0IE1ldGFEYXRhOworY2xhc3MgTWV0YURhdGE7CiAKIHN0cnVjdCBBQUNXcml0ZXIgOiBwdWJsaWMgTWVkaWFXcml0ZXIgewotICAgIEFBQ1dyaXRlcihjb25zdCBjaGFyICpmaWxlbmFtZSk7CiAgICAgQUFDV3JpdGVyKGludCBmZCk7CiAKICAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCmluZGV4IDc4MjU1MDguLjhiOWU5M2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaApAQCAtMjAsOSArMjAsMTEgQEAKIAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmg+CiAjaW5jbHVkZSA8T01YX0F1ZGlvLmg+CiAKQEAgLTQ0LDkgKzQ2LDEyIEBACiAgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlQWxsb2NhdGVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUNvbmZpZ3VyZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlQ3JlYXRlSW5wdXRTdXJmYWNlKCk7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiAmc3VyZmFjZSk7CiAgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU3RhcnQoKTsKICAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQgPSBmYWxzZSk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpOworCiAgICAgdmlydHVhbCB2b2lkIHNpZ25hbEZsdXNoKCk7CiAgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlc3VtZSgpOwogCkBAIC0xMDUsNiArMTEwLDEwIEBACiAgICAgZW51bSB7CiAgICAgICAgIGtXaGF0U2V0dXAgICAgICAgICAgICAgICAgICAgPSAnc2V0dScsCiAgICAgICAgIGtXaGF0T01YTWVzc2FnZSAgICAgICAgICAgICAgPSAnb214ICcsCisgICAgICAgIC8vIHNhbWUgYXMga1doYXRPTVhNZXNzYWdlIC0gYnV0IG9ubHkgdXNlZCB3aXRoCisgICAgICAgIC8vIGhhbmRsZU1lc3NhZ2UgZHVyaW5nIE9NWCBtZXNzYWdlLWxpc3QgaGFuZGxpbmcKKyAgICAgICAga1doYXRPTVhNZXNzYWdlSXRlbSAgICAgICAgICA9ICdvbXhJJywKKyAgICAgICAga1doYXRPTVhNZXNzYWdlTGlzdCAgICAgICAgICA9ICdvbXhMJywKICAgICAgICAga1doYXRJbnB1dEJ1ZmZlckZpbGxlZCAgICAgICA9ICdpbnBGJywKICAgICAgICAga1doYXRPdXRwdXRCdWZmZXJEcmFpbmVkICAgICA9ICdvdXREJywKICAgICAgICAga1doYXRTaHV0ZG93biAgICAgICAgICAgICAgICA9ICdzaHV0JywKQEAgLTExMywxMiArMTIyLDE0IEBACiAgICAgICAgIGtXaGF0RHJhaW5EZWZlcnJlZE1lc3NhZ2VzICAgPSAnZHJhaScsCiAgICAgICAgIGtXaGF0QWxsb2NhdGVDb21wb25lbnQgICAgICAgPSAnYWxsbycsCiAgICAgICAgIGtXaGF0Q29uZmlndXJlQ29tcG9uZW50ICAgICAgPSAnY29uZicsCisgICAgICAgIGtXaGF0U2V0U3VyZmFjZSAgICAgICAgICAgICAgPSAnc2V0UycsCiAgICAgICAgIGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlICAgICAgPSAnY2lzZicsCisgICAgICAgIGtXaGF0U2V0SW5wdXRTdXJmYWNlICAgICAgICAgPSAnc2lzZicsCiAgICAgICAgIGtXaGF0U2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSAgPSAnZW9pcycsCiAgICAgICAgIGtXaGF0U3RhcnQgICAgICAgICAgICAgICAgICAgPSAnc3RhcicsCiAgICAgICAgIGtXaGF0UmVxdWVzdElEUkZyYW1lICAgICAgICAgPSAncmlkcicsCiAgICAgICAgIGtXaGF0U2V0UGFyYW1ldGVycyAgICAgICAgICAgPSAnc2V0UCcsCi0gICAgICAgIGtXaGF0U3VibWl0T3V0cHV0TWV0YURhdGFCdWZmZXJJZkVPUyA9ICdzdWJtJywKKyAgICAgICAga1doYXRTdWJtaXRPdXRwdXRNZXRhZGF0YUJ1ZmZlcklmRU9TID0gJ3N1Ym0nLAogICAgICAgICBrV2hhdE9NWERpZWQgICAgICAgICAgICAgICAgID0gJ09NWGQnLAogICAgICAgICBrV2hhdFJlbGVhc2VDb2RlY0luc3RhbmNlICAgID0gJ3JlbEMnLAogICAgIH07CkBAIC0xMzQsNiArMTQ1LDEyIEBACiAgICAgICAgIGtGbGFnSXNHcmFsbG9jVXNhZ2VQcm90ZWN0ZWQgICAgICAgICAgICAgICAgICA9IDQsCiAgICAgfTsKIAorICAgIGVudW0geworICAgICAgICBrVmlkZW9HcmFsbG9jVXNhZ2UgPSAoR1JBTExPQ19VU0FHRV9IV19URVhUVVJFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHUkFMTE9DX1VTQUdFX0VYVEVSTkFMX0RJU1ApLAorICAgIH07CisKICAgICBzdHJ1Y3QgQnVmZmVySW5mbyB7CiAgICAgICAgIGVudW0gU3RhdHVzIHsKICAgICAgICAgICAgIE9XTkVEX0JZX1VTLApAQCAtMTQxLDE2ICsxNTgsMzkgQEAKICAgICAgICAgICAgIE9XTkVEX0JZX1VQU1RSRUFNLAogICAgICAgICAgICAgT1dORURfQllfRE9XTlNUUkVBTSwKICAgICAgICAgICAgIE9XTkVEX0JZX05BVElWRV9XSU5ET1csCisgICAgICAgICAgICBVTlJFQ09HTklaRUQsICAgICAgICAgICAgLy8gbm90IGEgdHJhY2tlZCBidWZmZXIKICAgICAgICAgfTsKIAorICAgICAgICBzdGF0aWMgaW5saW5lIFN0YXR1cyBnZXRTYWZlU3RhdHVzKEJ1ZmZlckluZm8gKmluZm8pIHsKKyAgICAgICAgICAgIHJldHVybiBpbmZvID09IE5VTEwgPyBVTlJFQ09HTklaRUQgOiBpbmZvLT5tU3RhdHVzOworICAgICAgICB9CisKICAgICAgICAgSU9NWDo6YnVmZmVyX2lkIG1CdWZmZXJJRDsKICAgICAgICAgU3RhdHVzIG1TdGF0dXM7CiAgICAgICAgIHVuc2lnbmVkIG1EZXF1ZXVlZEF0OwogCiAgICAgICAgIHNwPEFCdWZmZXI+IG1EYXRhOwogICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBtR3JhcGhpY0J1ZmZlcjsKKyAgICAgICAgaW50IG1GZW5jZUZkOworICAgICAgICBGcmFtZVJlbmRlclRyYWNrZXI6OkluZm8gKm1SZW5kZXJJbmZvOworCisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgZmllbGQgYW5kIDQgbWV0aG9kcyBhcmUgdXNlZCBmb3IgZGVidWdnaW5nIG9ubHkKKyAgICAgICAgYm9vbCBtSXNSZWFkRmVuY2U7CisgICAgICAgIC8vIFN0b3JlIHxmZW5jZUZkfCBhbmQgc2V0IHJlYWQvd3JpdGUgZmxhZy4gTG9nIGVycm9yLCBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgZmVuY2Ugc3RvcmVkLgorICAgICAgICB2b2lkIHNldFJlYWRGZW5jZShpbnQgZmVuY2VGZCwgY29uc3QgY2hhciAqZGJnKTsKKyAgICAgICAgdm9pZCBzZXRXcml0ZUZlbmNlKGludCBmZW5jZUZkLCBjb25zdCBjaGFyICpkYmcpOworICAgICAgICAvLyBMb2cgZXJyb3IsIGlmIHRoZSBjdXJyZW50IGZlbmNlIGlzIG5vdCBhIHJlYWQvd3JpdGUgZmVuY2UuCisgICAgICAgIHZvaWQgY2hlY2tSZWFkRmVuY2UoY29uc3QgY2hhciAqZGJnKTsKKyAgICAgICAgdm9pZCBjaGVja1dyaXRlRmVuY2UoY29uc3QgY2hhciAqZGJnKTsKICAgICB9OwogCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKl9hc1N0cmluZyhCdWZmZXJJbmZvOjpTdGF0dXMgcyk7CisgICAgdm9pZCBkdW1wQnVmZmVycyhPTVhfVTMyIHBvcnRJbmRleCk7CisKKyAgICAvLyBJZiB8ZmR8IGlzIG5vbi1uZWdhdGl2ZSwgd2FpdHMgZm9yIGZlbmNlIHdpdGggfGZkfCBhbmQgbG9ncyBhbiBlcnJvciBpZiBpdCBmYWlscy4gUmV0dXJucworICAgIC8vIHRoZSBlcnJvciBjb2RlIG9yIE9LIG9uIHN1Y2Nlc3MuIElmIHxmZHwgaXMgbmVnYXRpdmUsIGl0IHJldHVybnMgT0sKKyAgICBzdGF0dXNfdCB3YWl0Rm9yRmVuY2UoaW50IGZkLCBjb25zdCBjaGFyICpkYmcpOworCiAjaWYgVFJBQ0tfQlVGRkVSX1RJTUlORwogICAgIHN0cnVjdCBCdWZmZXJTdGF0cyB7CiAgICAgICAgIGludDY0X3QgbUVtcHR5QnVmZmVyVGltZVVzOwpAQCAtMTgxLDEwICsyMjEsMTIgQEAKICAgICBzcDxNZW1vcnlEZWFsZXI+IG1EZWFsZXJbMl07CiAKICAgICBzcDxBTmF0aXZlV2luZG93PiBtTmF0aXZlV2luZG93OworICAgIGludCBtTmF0aXZlV2luZG93VXNhZ2VCaXRzOwogICAgIHNwPEFNZXNzYWdlPiBtSW5wdXRGb3JtYXQ7CiAgICAgc3A8QU1lc3NhZ2U+IG1PdXRwdXRGb3JtYXQ7CiAgICAgc3A8QU1lc3NhZ2U+IG1CYXNlT3V0cHV0Rm9ybWF0OwogCisgICAgRnJhbWVSZW5kZXJUcmFja2VyIG1SZW5kZXJUcmFja2VyOyAvLyByZW5kZXIgaW5mb3JtYXRpb24gZm9yIGJ1ZmZlcnMgcmVuZGVyZWQgYnkgQUNvZGVjCiAgICAgVmVjdG9yPEJ1ZmZlckluZm8+IG1CdWZmZXJzWzJdOwogICAgIGJvb2wgbVBvcnRFT1NbMl07CiAgICAgc3RhdHVzX3QgbUlucHV0RU9TUmVzdWx0OwpAQCAtMTkyLDEyICsyMzQsMTUgQEAKICAgICBMaXN0PHNwPEFNZXNzYWdlPiA+IG1EZWZlcnJlZFF1ZXVlOwogCiAgICAgYm9vbCBtU2VudEZvcm1hdDsKKyAgICBib29sIG1Jc1ZpZGVvOwogICAgIGJvb2wgbUlzRW5jb2RlcjsKLSAgICBib29sIG1Vc2VNZXRhZGF0YU9uRW5jb2Rlck91dHB1dDsKICAgICBib29sIG1GYXRhbEVycm9yOwogICAgIGJvb2wgbVNodXRkb3duSW5Qcm9ncmVzczsKICAgICBib29sIG1FeHBsaWNpdFNodXRkb3duOwogCisgICAgYm9vbCBtSGFzTGFzdENyb3A7CisgICAgYW5kcm9pZF9uYXRpdmVfcmVjdF90IG1MYXN0Q3JvcDsKKwogICAgIC8vIElmICJtS2VlcENvbXBvbmVudEFsbG9jYXRlZCIgd2Ugb25seSB0cmFuc2l0aW9uIGJhY2sgdG8gTG9hZGVkIHN0YXRlCiAgICAgLy8gYW5kIGRvIG5vdCByZWxlYXNlIHRoZSBjb21wb25lbnQgaW5zdGFuY2UuCiAgICAgYm9vbCBtS2VlcENvbXBvbmVudEFsbG9jYXRlZDsKQEAgLTIwOSwxMiArMjU0LDE1IEBACiAgICAgYm9vbCBtQ2hhbm5lbE1hc2tQcmVzZW50OwogICAgIGludDMyX3QgbUNoYW5uZWxNYXNrOwogICAgIHVuc2lnbmVkIG1EZXF1ZXVlQ291bnRlcjsKLSAgICBib29sIG1TdG9yZU1ldGFEYXRhSW5PdXRwdXRCdWZmZXJzOwotICAgIGludDMyX3QgbU1ldGFEYXRhQnVmZmVyc1RvU3VibWl0OworICAgIE1ldGFkYXRhQnVmZmVyVHlwZSBtSW5wdXRNZXRhZGF0YVR5cGU7CisgICAgTWV0YWRhdGFCdWZmZXJUeXBlIG1PdXRwdXRNZXRhZGF0YVR5cGU7CisgICAgYm9vbCBtTGVnYWN5QWRhcHRpdmVFeHBlcmltZW50OworICAgIGludDMyX3QgbU1ldGFkYXRhQnVmZmVyc1RvU3VibWl0OwogICAgIHNpemVfdCBtTnVtVW5kZXF1ZXVlZEJ1ZmZlcnM7CiAKICAgICBpbnQ2NF90IG1SZXBlYXRGcmFtZURlbGF5VXM7CiAgICAgaW50NjRfdCBtTWF4UHRzR2FwVXM7CisgICAgZmxvYXQgbU1heEZwczsKIAogICAgIGludDY0X3QgbVRpbWVQZXJGcmFtZVVzOwogICAgIGludDY0X3QgbVRpbWVQZXJDYXB0dXJlVXM7CkBAIC0yMjgsMTcgKzI3NiwyOSBAQAogICAgIHN0YXR1c190IGZyZWVCdWZmZXJzT25Qb3J0KE9NWF9VMzIgcG9ydEluZGV4KTsKICAgICBzdGF0dXNfdCBmcmVlQnVmZmVyKE9NWF9VMzIgcG9ydEluZGV4LCBzaXplX3QgaSk7CiAKKyAgICBzdGF0dXNfdCBoYW5kbGVTZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKKyAgICBzdGF0dXNfdCBzZXR1cE5hdGl2ZVdpbmRvd1NpemVGb3JtYXRBbmRVc2FnZSgKKyAgICAgICAgICAgIEFOYXRpdmVXaW5kb3cgKm5hdGl2ZVdpbmRvdyAvKiBub25udWxsICovLCBpbnQgKmZpbmFsVXNhZ2UgLyogbm9ubnVsbCAqLyk7CisKICAgICBzdGF0dXNfdCBjb25maWd1cmVPdXRwdXRCdWZmZXJzRnJvbU5hdGl2ZVdpbmRvdygKICAgICAgICAgICAgIE9NWF9VMzIgKm5CdWZmZXJDb3VudCwgT01YX1UzMiAqbkJ1ZmZlclNpemUsCiAgICAgICAgICAgICBPTVhfVTMyICpuTWluVW5kZXF1ZXVlZEJ1ZmZlcnMpOwotICAgIHN0YXR1c190IGFsbG9jYXRlT3V0cHV0TWV0YURhdGFCdWZmZXJzKCk7Ci0gICAgc3RhdHVzX3Qgc3VibWl0T3V0cHV0TWV0YURhdGFCdWZmZXIoKTsKLSAgICB2b2lkIHNpZ25hbFN1Ym1pdE91dHB1dE1ldGFEYXRhQnVmZmVySWZFT1Nfd29ya2Fyb3VuZCgpOworICAgIHN0YXR1c190IGFsbG9jYXRlT3V0cHV0TWV0YWRhdGFCdWZmZXJzKCk7CisgICAgc3RhdHVzX3Qgc3VibWl0T3V0cHV0TWV0YWRhdGFCdWZmZXIoKTsKKyAgICB2b2lkIHNpZ25hbFN1Ym1pdE91dHB1dE1ldGFkYXRhQnVmZmVySWZFT1Nfd29ya2Fyb3VuZCgpOwogICAgIHN0YXR1c190IGFsbG9jYXRlT3V0cHV0QnVmZmVyc0Zyb21OYXRpdmVXaW5kb3coKTsKICAgICBzdGF0dXNfdCBjYW5jZWxCdWZmZXJUb05hdGl2ZVdpbmRvdyhCdWZmZXJJbmZvICppbmZvKTsKICAgICBzdGF0dXNfdCBmcmVlT3V0cHV0QnVmZmVyc05vdE93bmVkQnlDb21wb25lbnQoKTsKICAgICBCdWZmZXJJbmZvICpkZXF1ZXVlQnVmZmVyRnJvbU5hdGl2ZVdpbmRvdygpOwogCisgICAgaW5saW5lIGJvb2wgc3RvcmluZ01ldGFkYXRhSW5EZWNvZGVkQnVmZmVycygpIHsKKyAgICAgICAgcmV0dXJuIG1PdXRwdXRNZXRhZGF0YVR5cGUgPj0gMCAmJiAhbUlzRW5jb2RlcjsKKyAgICB9CisKKyAgICBpbmxpbmUgYm9vbCB1c2luZ01ldGFkYXRhT25FbmNvZGVyT3V0cHV0KCkgeworICAgICAgICByZXR1cm4gbU91dHB1dE1ldGFkYXRhVHlwZSA+PSAwICYmIG1Jc0VuY29kZXI7CisgICAgfQorCiAgICAgQnVmZmVySW5mbyAqZmluZEJ1ZmZlckJ5SUQoCiAgICAgICAgICAgICB1aW50MzJfdCBwb3J0SW5kZXgsIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRCwKICAgICAgICAgICAgIHNzaXplX3QgKmluZGV4ID0gTlVMTCk7CkBAIC0yOTksNiArMzU5LDkgQEAKICAgICBzdGF0dXNfdCBzZXR1cFJhd0F1ZGlvRm9ybWF0KAogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBudW1DaGFubmVscyk7CiAKKyAgICBzdGF0dXNfdCBzZXRQcmlvcml0eShpbnQzMl90IHByaW9yaXR5KTsKKyAgICBzdGF0dXNfdCBzZXRPcGVyYXRpbmdSYXRlKGZsb2F0IHJhdGVGbG9hdCwgYm9vbCBpc1ZpZGVvKTsKKwogICAgIHN0YXR1c190IHNldE1pbkJ1ZmZlclNpemUoT01YX1UzMiBwb3J0SW5kZXgsIHNpemVfdCBzaXplKTsKIAogICAgIHN0YXR1c190IHNldHVwTVBFRzRFbmNvZGVyUGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CkBAIC0zMTYsOCArMzc5LDYgQEAKIAogICAgIHN0YXR1c190IGluaXROYXRpdmVXaW5kb3coKTsKIAotICAgIHN0YXR1c190IHB1c2hCbGFua0J1ZmZlcnNUb05hdGl2ZVdpbmRvdygpOwotCiAgICAgLy8gUmV0dXJucyB0cnVlIGlmZiBhbGwgYnVmZmVycyBvbiB0aGUgZ2l2ZW4gcG9ydCBoYXZlIHN0YXR1cwogICAgIC8vIE9XTkVEX0JZX1VTIG9yIE9XTkVEX0JZX05BVElWRV9XSU5ET1cuCiAgICAgYm9vbCBhbGxZb3VyQnVmZmVyc0FyZUJlbG9uZ1RvVXMoT01YX1UzMiBwb3J0SW5kZXgpOwpAQCAtMzMyLDYgKzM5MywyMyBAQAogICAgIHZvaWQgZGVmZXJNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIHByb2Nlc3NEZWZlcnJlZE1lc3NhZ2VzKCk7CiAKKyAgICB2b2lkIG9uRnJhbWVSZW5kZXJlZChpbnQ2NF90IG1lZGlhVGltZVVzLCBuc2Vjc190IHN5c3RlbU5hbm8pOworICAgIC8vIGNhbGxlZCB3aGVuIHdlIGhhdmUgZGVxdWV1ZWQgYSBidWZmZXIgfGJ1ZnwgZnJvbSB0aGUgbmF0aXZlIHdpbmRvdyB0byB0cmFjayByZW5kZXIgaW5mby4KKyAgICAvLyB8ZmVuY2VGZHwgaXMgdGhlIGRlcXVldWUgZmVuY2UsIGFuZCB8aW5mb3wgcG9pbnRzIHRvIHRoZSBidWZmZXIgaW5mbyB3aGVyZSB0aGlzIGJ1ZmZlciBpcworICAgIC8vIHN0b3JlZC4KKyAgICB2b2lkIHVwZGF0ZVJlbmRlckluZm9Gb3JEZXF1ZXVlZEJ1ZmZlcigKKyAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIgKmJ1ZiwgaW50IGZlbmNlRmQsIEJ1ZmZlckluZm8gKmluZm8pOworCisgICAgLy8gQ2hlY2tzIHRvIHNlZSBpZiBhbnkgZnJhbWVzIGhhdmUgcmVuZGVyZWQgdXAgdW50aWwgfHVudGlsfCwgYW5kIHRvIG5vdGlmeSBjbGllbnQKKyAgICAvLyAoTWVkaWFDb2RlYykgb2YgcmVuZGVyZWQgZnJhbWVzIHVwLXVudGlsIHRoZSBmcmFtZSBwb2ludGVkIHRvIGJ5IHx1bnRpbHwgb3IgdGhlIGZpcnN0CisgICAgLy8gdW5yZW5kZXJlZCBmcmFtZS4gVGhlc2UgZnJhbWVzIGFyZSByZW1vdmVkIGZyb20gdGhlIHJlbmRlciBxdWV1ZS4KKyAgICAvLyBJZiB8ZHJvcEluY29tcGxldGV8IGlzIHRydWUsIHVucmVuZGVyZWQgZnJhbWVzIHVwLXVudGlsIHx1bnRpbHwgd2lsbCBiZSBkcm9wcGVkIGZyb20gdGhlCisgICAgLy8gcXVldWUsIGFsbG93aW5nIGFsbCByZW5kZXJlZCBmcmFtZWQgdXAgdGlsbCB0aGVuIHRvIGJlIG5vdGlmaWVkIG9mLgorICAgIC8vIChUaGlzIHdpbGwgZWZmZWN0aXZlbHkgY2xlYXIgdGhlIHJlbmRlciBxdWV1ZSB1cC11bnRpbCAoYW5kIGluY2x1ZGluZykgfHVudGlsfC4pCisgICAgLy8gSWYgfHVudGlsfCBpcyBOVUxMLCBvciBpcyBub3QgaW4gdGhlIHJlbmRlcmVkIHF1ZXVlLCB0aGlzIG1ldGhvZCB3aWxsIGNoZWNrIGFsbCBmcmFtZXMuCisgICAgdm9pZCBub3RpZnlPZlJlbmRlcmVkRnJhbWVzKAorICAgICAgICAgICAgYm9vbCBkcm9wSW5jb21wbGV0ZSA9IGZhbHNlLCBGcmFtZVJlbmRlclRyYWNrZXI6OkluZm8gKnVudGlsID0gTlVMTCk7CisKICAgICB2b2lkIHNlbmRGb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSk7CiAgICAgc3RhdHVzX3QgZ2V0UG9ydEZvcm1hdChPTVhfVTMyIHBvcnRJbmRleCwgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FNUldyaXRlci5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BTVJXcml0ZXIuaAppbmRleCAzOTJmOTY4Li5iMzhiZTU1IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FNUldyaXRlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmgKQEAgLTI2LDEwICsyNiw5IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBNZWRpYVNvdXJjZTsKLXN0cnVjdCBNZXRhRGF0YTsKK2NsYXNzIE1ldGFEYXRhOwogCiBzdHJ1Y3QgQU1SV3JpdGVyIDogcHVibGljIE1lZGlhV3JpdGVyIHsKLSAgICBBTVJXcml0ZXIoY29uc3QgY2hhciAqZmlsZW5hbWUpOwogICAgIEFNUldyaXRlcihpbnQgZmQpOwogCiAgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmgKaW5kZXggMTRhZmI4NS4uZTBjZDk2NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaApAQCAtMjUsOSArMjUsMTAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBNZWRpYVNvdXJjZTsKK3N0cnVjdCBBdWRpb1BsYXliYWNrUmF0ZTsKIGNsYXNzIEF1ZGlvVHJhY2s7Ci1jbGFzcyBBd2Vzb21lUGxheWVyOworc3RydWN0IEF3ZXNvbWVQbGF5ZXI7CitjbGFzcyBNZWRpYVNvdXJjZTsKIAogY2xhc3MgQXVkaW9QbGF5ZXIgOiBwdWJsaWMgVGltZVNvdXJjZSB7CiBwdWJsaWM6CkBAIC03Myw3ICs3NCw4IEBACiAgICAgYm9vbCBpc1NlZWtpbmcoKTsKICAgICBib29sIHJlYWNoZWRFT1Moc3RhdHVzX3QgKmZpbmFsU3RhdHVzKTsKIAotICAgIHN0YXR1c190IHNldFBsYXliYWNrUmF0ZVBlcm1pbGxlKGludDMyX3QgcmF0ZVBlcm1pbGxlKTsKKyAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpOworICAgIHN0YXR1c190IGdldFBsYXliYWNrUmF0ZShBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSAvKiBub25udWxsICovKTsKIAogICAgIHZvaWQgbm90aWZ5QXVkaW9FT1MoKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oCmluZGV4IDRjOWFhYWQuLjMwNzQ5MTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmgKQEAgLTM1LDggKzM1LDEwIEBACiAgICAgLy8gX25vdF8gYSBiaXRtYXNrIG9mIGF1ZGlvX2NoYW5uZWxzX3QgY29uc3RhbnRzLgogICAgIEF1ZGlvU291cmNlKAogICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICB1aW50MzJfdCBjaGFubmVscyA9IDEpOworICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbHMsCisgICAgICAgICAgICB1aW50MzJfdCBvdXRTYW1wbGVSYXRlID0gMCk7CiAKICAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKIApAQCAtNzcsMTEgKzc5LDEzIEBACiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKICAgICBib29sIG1TdGFydGVkOwogICAgIGludDMyX3QgbVNhbXBsZVJhdGU7CisgICAgaW50MzJfdCBtT3V0U2FtcGxlUmF0ZTsKIAogICAgIGJvb2wgbVRyYWNrTWF4QW1wbGl0dWRlOwogICAgIGludDY0X3QgbVN0YXJ0VGltZVVzOwogICAgIGludDE2X3QgbU1heEFtcGxpdHVkZTsKICAgICBpbnQ2NF90IG1QcmV2U2FtcGxlVGltZVVzOworICAgIGludDY0X3QgbUZpcnN0U2FtcGxlVGltZVVzOwogICAgIGludDY0X3QgbUluaXRpYWxSZWFkVGltZVVzOwogICAgIGludDY0X3QgbU51bUZyYW1lc1JlY2VpdmVkOwogICAgIGludDY0X3QgbU51bUNsaWVudE93bmVkQnVmZmVyczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQnVmZmVyUHJvZHVjZXJXcmFwcGVyLmggYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0J1ZmZlclByb2R1Y2VyV3JhcHBlci5oCmluZGV4IGQ4YWNmMzAuLjRjYWEyYzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQnVmZmVyUHJvZHVjZXJXcmFwcGVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9CdWZmZXJQcm9kdWNlcldyYXBwZXIuaApAQCAtMTksNiArMTksNyBAQAogI2RlZmluZSBCVUZGRVJfUFJPRFVDRVJfV1JBUFBFUl9IXwogCiAjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmgKaW5kZXggZGQwYTEwNi4uNmM5MzhhNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuaAorKysgYi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5oCkBAIC04Myw3ICs4Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplIHZpZGVvU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0b3JlTWV0YURhdGFJblZpZGVvQnVmZmVycyA9IGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RvcmVNZXRhRGF0YUluVmlkZW9CdWZmZXJzID0gdHJ1ZSk7CiAKICAgICB2aXJ0dWFsIH5DYW1lcmFTb3VyY2UoKTsKIApAQCAtMTQ5LDYgKzE0OSw4IEBACiAgICAgaW50MzJfdCAgbU51bUlucHV0QnVmZmVyczsKICAgICBpbnQzMl90ICBtVmlkZW9GcmFtZVJhdGU7CiAgICAgaW50MzJfdCAgbUNvbG9yRm9ybWF0OworICAgIGludDMyX3QgIG1FbmNvZGVyRm9ybWF0OworICAgIGludDMyX3QgIG1FbmNvZGVyRGF0YVNwYWNlOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAKICAgICBzcDxDYW1lcmE+ICAgbUNhbWVyYTsKQEAgLTE4OCw3ICsxOTAsNyBAQAogICAgIHZvaWQgcmVsZWFzZUNhbWVyYSgpOwogCiBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBDYW1lcmFTb3VyY2VMaXN0ZW5lcjsKKyAgICBmcmllbmQgc3RydWN0IENhbWVyYVNvdXJjZUxpc3RlbmVyOwogCiAgICAgTXV0ZXggbUxvY2s7CiAgICAgQ29uZGl0aW9uIG1GcmFtZUF2YWlsYWJsZUNvbmRpdGlvbjsKQEAgLTIzNCw2ICsyMzYsOSBAQAogICAgIHN0YXR1c190IGNoZWNrRnJhbWVSYXRlKGNvbnN0IENhbWVyYVBhcmFtZXRlcnMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZVJhdGUpOwogCisgICAgc3RhdGljIHZvaWQgYWRqdXN0SW5jb21pbmdBTldCdWZmZXIoSU1lbW9yeSogZGF0YSk7CisgICAgc3RhdGljIHZvaWQgYWRqdXN0T3V0Z29pbmdBTldCdWZmZXIoSU1lbW9yeSogZGF0YSk7CisKICAgICB2b2lkIHN0b3BDYW1lcmFSZWNvcmRpbmcoKTsKICAgICBzdGF0dXNfdCByZXNldCgpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oIGIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaAppbmRleCAxYmYyN2E2Li5iYjM2MDUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmgKQEAgLTI2LDYgKzI2LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7CitzdHJ1Y3QgUGVyc2lzdGVudFN1cmZhY2U7CiAKIHN0cnVjdCBDb2RlY0Jhc2UgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIGVudW0gewpAQCAtMzksOCArNDAsMTAgQEAKICAgICAgICAga1doYXRDb21wb25lbnRBbGxvY2F0ZWQgID0gJ2NBbGwnLAogICAgICAgICBrV2hhdENvbXBvbmVudENvbmZpZ3VyZWQgPSAnY0NvbicsCiAgICAgICAgIGtXaGF0SW5wdXRTdXJmYWNlQ3JlYXRlZCA9ICdpc2ZjJywKKyAgICAgICAga1doYXRJbnB1dFN1cmZhY2VBY2NlcHRlZCA9ICdpc2ZhJywKICAgICAgICAga1doYXRTaWduYWxlZElucHV0RU9TICAgID0gJ3Nlb3MnLAogICAgICAgICBrV2hhdEJ1ZmZlcnNBbGxvY2F0ZWQgICAgPSAnYWxsYycsCisgICAgICAgIGtXaGF0T3V0cHV0RnJhbWVzUmVuZGVyZWQgPSAnb3V0UicsCiAgICAgfTsKIAogICAgIHZpcnR1YWwgdm9pZCBzZXROb3RpZmljYXRpb25NZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSA9IDA7CkBAIC00OCwxMiArNTEsMTYgQEAKICAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVBbGxvY2F0ZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUNvbmZpZ3VyZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTZXRJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gJnN1cmZhY2UpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTdGFydCgpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQgPSBmYWxzZSkgPSAwOwogCiAgICAgLy8gcmVxdWlyZSBhbiBleHBsaWNpdCBtZXNzYWdlIGhhbmRsZXIKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+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+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVJhZGlvPiYgcmFkaW8pID0gMDsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQm5SYWRpb1NlcnZpY2U6IHB1YmxpYyBCbkludGVyZmFjZTxJUmFkaW9TZXJ2aWNlPgoreworcHVibGljOgorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb25UcmFuc2FjdCggdWludDMyX3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vQU5EUk9JRF9IQVJEV0FSRV9JUkFESU9fU0VSVklDRV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3JhZGlvL1JhZGlvLmggYi9pbmNsdWRlL3JhZGlvL1JhZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRkZmRkMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcmFkaW8vUmFkaW8uaApAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19ICisKKyNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDxyYWRpby9SYWRpb0NhbGxiYWNrLmg+CisjaW5jbHVkZSA8cmFkaW8vSVJhZGlvLmg+CisjaW5jbHVkZSA8cmFkaW8vSVJhZGlvU2VydmljZS5oPgorI2luY2x1ZGUgPHJhZGlvL0lSYWRpb0NsaWVudC5oPgorI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lbW9yeURlYWxlcjsKKworY2xhc3MgUmFkaW8gOiBwdWJsaWMgQm5SYWRpb0NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAoreworcHVibGljOgorCisgICAgdmlydHVhbCB+UmFkaW8oKTsKKworICAgIHN0YXRpYyAgc3RhdHVzX3QgbGlzdE1vZHVsZXMoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcyk7CisgICAgc3RhdGljICBzcDxSYWRpbz4gYXR0YWNoKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2l0aEF1ZGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxSYWRpb0NhbGxiYWNrPiYgY2FsbGJhY2spOworCisKKyAgICAgICAgICAgIHZvaWQgZGV0YWNoKCk7CisKKyAgICAgICAgICAgIHN0YXR1c190IHNldENvbmZpZ3VyYXRpb24oY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpOworCisgICAgICAgICAgICBzdGF0dXNfdCBnZXRDb25maWd1cmF0aW9uKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKTsKKworICAgICAgICAgICAgc3RhdHVzX3Qgc2V0TXV0ZShib29sIG11dGUpOworCisgICAgICAgICAgICBzdGF0dXNfdCBnZXRNdXRlKGJvb2wgKm11dGUpOworCisgICAgICAgICAgICBzdGF0dXNfdCBzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCk7CisKKyAgICAgICAgICAgIHN0YXR1c190IHNjYW4ocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgdHVuZSh1bnNpZ25lZCBpbnQgY2hhbm5lbCwgdW5zaWduZWQgaW50IHN1YkNoYW5uZWwpOworCisgICAgICAgICAgICBzdGF0dXNfdCBjYW5jZWwoKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZ2V0UHJvZ3JhbUluZm9ybWF0aW9uKHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8gKmluZm8pOworCisgICAgICAgICAgICBzdGF0dXNfdCBoYXNDb250cm9sKGJvb2wgKmhhc0NvbnRyb2wpOworCisgICAgICAgICAgICAvLyBCcFJhZGlvQ2xpZW50CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgb25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpOworCisgICAgICAgICAgICAvL0lCaW5kZXI6OkRlYXRoUmVjaXBpZW50CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKKworcHJpdmF0ZToKKyAgICAgICAgICAgIFJhZGlvKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxSYWRpb0NhbGxiYWNrPiYpOworICAgICAgICAgICAgc3RhdGljIGNvbnN0IHNwPElSYWRpb1NlcnZpY2U+IGdldFJhZGlvU2VydmljZSgpOworCisgICAgICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtTG9jazsKKyAgICAgICAgICAgIHNwPElSYWRpbz4gICAgICAgICAgICAgIG1JUmFkaW87CisgICAgICAgICAgICBjb25zdCByYWRpb19oYW5kbGVfdCAgICBtSGFuZGxlOworICAgICAgICAgICAgc3A8UmFkaW9DYWxsYmFjaz4gICAgICAgbUNhbGxiYWNrOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vQU5EUk9JRF9IQVJEV0FSRV9SQURJT19ICmRpZmYgLS1naXQgYS9pbmNsdWRlL3JhZGlvL1JhZGlvQ2FsbGJhY2suaCBiL2luY2x1ZGUvcmFkaW8vUmFkaW9DYWxsYmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhN2YxYTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3JhZGlvL1JhZGlvQ2FsbGJhY2suaApAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1JBRElPX0NBTExCQUNLX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19DQUxMQkFDS19ICisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgUmFkaW9DYWxsYmFjayA6IHB1YmxpYyBSZWZCYXNlCit7CitwdWJsaWM6CisKKyAgICAgICAgICAgIFJhZGlvQ2FsbGJhY2soKSB7fQorICAgIHZpcnR1YWwgflJhZGlvQ2FsbGJhY2soKSB7fQorCisgICAgdmlydHVhbCB2b2lkIG9uRXZlbnQoc3RydWN0IHJhZGlvX2V2ZW50ICpldmVudCkgPSAwOworCit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy9BTkRST0lEX0hBUkRXQVJFX1JBRElPX0NBTExCQUNLX0gKZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmgKaW5kZXggNDM4OWIwMi4uM2RjZWRjNSAxMDA2NDQKLS0tIGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmgKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmgKQEAgLTMxLDYgKzMxLDcgQEAKIG5hbWVzcGFjZSBpbWdfdXRpbHMgewogCiAjZGVmaW5lIE5FTEVNUyh4KSAoKGludCkgKHNpemVvZih4KSAvIHNpemVvZigoeClbMF0pKSkKKyNkZWZpbmUgQ0xBTVAoeCwgbG93LCBoaWdoKSAoKCh4KSA+IChoaWdoKSkgPyAoaGlnaCkgOiAoKCh4KSA8IChsb3cpKSA/IChsb3cpIDogKHgpKSkKIAogLyoqCiAgKiBVdGlsaXR5IGNsYXNzIGZvciBidWlsZGluZyB2YWx1ZXMgZm9yIHRoZSBPcGNvZGVMaXN0IHRhZ3Mgc3BlY2lmaWVkCkBAIC0xMDcsMTMgKzEwOCw0OSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWFwUGxhbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIG1hcEdhaW5zKTsKIAorICAgICAgICAvKioKKyAgICAgICAgICogQWRkIFdhcnBSZWN0aWxpbmVhciBvcGNvZGUgZm9yIHRoZSBnaXZlbiBtZXRhZGF0YSBwYXJhbWV0ZXJzLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkV2FycFJlY3RpbGluZWFyRm9yTWV0YWRhdGEoY29uc3QgZmxvYXQqIGtDb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJyYXlXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcnJheUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBvcHRpY2FsQ2VudGVyWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBvcHRpY2FsQ2VudGVyWSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhIFdhcnBSZWN0aWxpbmVhciBvcGNvZGUuCisgICAgICAgICAqCisgICAgICAgICAqIG51bVBsYW5lcyAtIE51bWJlciBvZiBwbGFuZXMgaW5jbHVkZWQgaW4gdGhpcyBvcGNvZGUuCisgICAgICAgICAqIG9wdGljYWxDZW50ZXJYLCBvcHRpY2FsQ2VudGVyWSAtIE5vcm1hbGl6ZWQgeCx5IGNvb3JkaW5hdGVzIG9mIHRoZSBzZW5zb3Igb3B0aWNhbAorICAgICAgICAgKiAgICAgICAgICBjZW50ZXIgcmVsYXRpdmUgdG8gdGhlIHRvcCxsZWZ0IHBpeGVsIG9mIHRoZSBwcm9kdWNlZCBpbWFnZXMgKGUuZy4gWzAuNSwgMC41XQorICAgICAgICAgKiAgICAgICAgICBnaXZlcyBhIHNlbnNvciBvcHRpY2FsIGNlbnRlciBpbiB0aGUgaW1hZ2UgY2VudGVyLgorICAgICAgICAgKiBrQ29lZmZzIC0gQSBsaXN0IG9mIGNvZWZmaWNpZW50cyBmb3IgdGhlIHBvbHlub21pYWwgZXF1YXRpb24gcmVwcmVzZW50aW5nIHRoZSBkaXN0b3J0aW9uCisgICAgICAgICAqICAgICAgICAgIGNvcnJlY3Rpb24uICBGb3IgZWFjaCBwbGFuZSwgNiBjb2VmZmljaWVudHMgbXVzdCBiZSBpbmNsdWRlZDoKKyAgICAgICAgICogICAgICAgICAge2tfcjAsIGtfcjEsIGtfcjIsIGtfcjMsIGtfdDAsIGtfdDF9LiAgU2VlIHRoZSBETkcgMS40IHNwZWNpZmljYXRpb24gZm9yIGFuCisgICAgICAgICAqICAgICAgICAgIG91dGxpbmUgb2YgdGhlIHBvbHlub21pYWwgdXNlZCBoZXJlLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkV2FycFJlY3RpbGluZWFyKHVpbnQzMl90IG51bVBsYW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG9wdGljYWxDZW50ZXJYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgb3B0aWNhbENlbnRlclksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSoga0NvZWZmcyk7CisKICAgICAgICAgLy8gVE9ETzogQWRkIG90aGVyIE9wY29kZSBtZXRob2RzCiAgICAgcHJvdGVjdGVkOgogICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgRkxBR19PUFRJT05BTCA9IDB4MXU7CiAgICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBGTEFHX09QVElPTkFMX0ZPUl9QUkVWSUVXID0gMHgydTsKIAorICAgICAgICAvLyBPcGNvZGUgSURzCiAgICAgICAgIGVudW0geworICAgICAgICAgICAgV0FSUF9SRUNUSUxJTkVBUl9JRCA9IDEsCiAgICAgICAgICAgICBHQUlOX01BUF9JRCA9IDksCisgICAgICAgIH07CisKKyAgICAgICAgLy8gTFNNIG1vc2FpYyBpbmRpY2VzCisgICAgICAgIGVudW0gewogICAgICAgICAgICAgTFNNX1JfSU5EID0gMCwKICAgICAgICAgICAgIExTTV9HRV9JTkQgPSAxLAogICAgICAgICAgICAgTFNNX0dPX0lORCA9IDIsCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwCmluZGV4IGQzYjRhMzUuLmIyMTM0MDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwCkBAIC0xNiw2ICsxNiwxMCBAQAogCiAjaW5jbHVkZSA8aW1nX3V0aWxzL0RuZ1V0aWxzLmg+CiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8bWF0aC5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaW1nX3V0aWxzIHsKIApAQCAtMjI5LDcgKzIzMyw3IEBACiAgICAgZXJyID0gbUVuZGlhbk91dC53cml0ZSh2ZXJzaW9uLCAwLCBORUxFTVModmVyc2lvbikpOwogICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CiAKLSAgICAvLyBEbyBub3QgaW5jbHVkZSBvcHRpb25hbCBmbGFnIGZvciBwcmV2aWV3LCBhcyB0aGlzIGNhbiBoYXZlIGEgbGFyZ2UgZWZmZWN0IG9uIHRoZSBvdXRwdXQuCisgICAgLy8gQWxsb3cgdGhpcyBvcGNvZGUgdG8gYmUgc2tpcHBlZCBpZiBub3Qgc3VwcG9ydGVkCiAgICAgdWludDMyX3QgZmxhZ3MgPSBGTEFHX09QVElPTkFMOwogCiAgICAgZXJyID0gbUVuZGlhbk91dC53cml0ZSgmZmxhZ3MsIDAsIDEpOwpAQCAtMjc4LDUgKzI4Miw5NiBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgT3Bjb2RlTGlzdEJ1aWxkZXI6OmFkZFdhcnBSZWN0aWxpbmVhckZvck1ldGFkYXRhKGNvbnN0IGZsb2F0KiBrQ29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFycmF5V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJyYXlIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgb3B0aWNhbENlbnRlclgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgb3B0aWNhbENlbnRlclkpIHsKKyAgICBpZiAoYWN0aXZlQXJyYXlXaWR0aCA8PSAxIHx8IGFjdGl2ZUFycmF5SGVpZ2h0IDw9IDEpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgYWRkIG9wY29kZSBmb3IgYWN0aXZlIGFycmF5IHdpdGggZGltZW5zaW9ucyB3PSUiIFBSSXUzMiAiLCBoPSUiIFBSSXUzMiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGFjdGl2ZUFycmF5V2lkdGgsIGFjdGl2ZUFycmF5SGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBkb3VibGUgbm9ybWFsaXplZE9DWCA9IG9wdGljYWxDZW50ZXJYIC8gc3RhdGljX2Nhc3Q8ZG91YmxlPihhY3RpdmVBcnJheVdpZHRoIC0gMSk7CisgICAgZG91YmxlIG5vcm1hbGl6ZWRPQ1kgPSBvcHRpY2FsQ2VudGVyWSAvIHN0YXRpY19jYXN0PGRvdWJsZT4oYWN0aXZlQXJyYXlIZWlnaHQgLSAxKTsKKworICAgIG5vcm1hbGl6ZWRPQ1ggPSBDTEFNUChub3JtYWxpemVkT0NYLCAwLCAxKTsKKyAgICBub3JtYWxpemVkT0NZID0gQ0xBTVAobm9ybWFsaXplZE9DWSwgMCwgMSk7CisKKyAgICAvLyBDb252ZXJzaW9uIGZhY3RvcnMgZnJvbSBDYW1lcmEyIEsgZmFjdG9ycyB0byBETkcgc3BlYy4gSyBmYWN0b3JzOgorICAgIC8vCisgICAgLy8gICAgICBOb3RlOiB0aGVzZSBhcmUgbmVjZXNzYXJ5IGJlY2F1c2Ugb3VyIHVuaXQgc3lzdGVtIGFzc3VtZXMgYQorICAgIC8vICAgICAgbm9ybWFsaXplZCBtYXggcmFkaXVzIG9mIHNxcnQoMiksIHdoZXJlYXMgdGhlIERORyBzcGVjJ3MKKyAgICAvLyAgICAgIFdhcnBSZWN0aWxpbmVhciBvcGNvZGUgYXNzdW1lcyBhIG5vcm1hbGl6ZWQgbWF4IHJhZGl1cyBvZiAxLgorICAgIC8vICAgICAgVGh1cywgZWFjaCBLIGNvZWZmaWNpZW50IG11c3QgaW5jbHVkZSB0aGUgZG9tYWluIHNjYWxpbmcKKyAgICAvLyAgICAgIGZhY3RvciAodGhlIERORyBkb21haW4gaXMgc2NhbGVkIGJ5IHNxcnQoMikgdG8gZW11bGF0ZSB0aGUKKyAgICAvLyAgICAgIGRvbWFpbiB1c2VkIGJ5IHRoZSBDYW1lcmEyIHNwZWNpZmljYXRpb24pLgorCisgICAgY29uc3QgZG91YmxlIGNfMCA9IHNxcnQoMik7CisgICAgY29uc3QgZG91YmxlIGNfMSA9IDIgKiBzcXJ0KDIpOworICAgIGNvbnN0IGRvdWJsZSBjXzIgPSA0ICogc3FydCgyKTsKKyAgICBjb25zdCBkb3VibGUgY18zID0gOCAqIHNxcnQoMik7CisgICAgY29uc3QgZG91YmxlIGNfNCA9IDI7CisgICAgY29uc3QgZG91YmxlIGNfNSA9IDI7CisKKyAgICBjb25zdCBkb3VibGUgY29lZmZzW10gPSB7IGNfMCAqIGtDb2VmZnNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjXzEgKiBrQ29lZmZzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY18yICoga0NvZWZmc1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfMyAqIGtDb2VmZnNbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjXzQgKiBrQ29lZmZzWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY181ICoga0NvZWZmc1s1XSB9OworCisKKyAgICByZXR1cm4gYWRkV2FycFJlY3RpbGluZWFyKC8qbnVtUGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvcHRpY2FsQ2VudGVyWCovbm9ybWFsaXplZE9DWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3B0aWNhbENlbnRlclkqL25vcm1hbGl6ZWRPQ1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZnMpOworfQorCitzdGF0dXNfdCBPcGNvZGVMaXN0QnVpbGRlcjo6YWRkV2FycFJlY3RpbGluZWFyKHVpbnQzMl90IG51bVBsYW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG9wdGljYWxDZW50ZXJYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgb3B0aWNhbENlbnRlclksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSoga0NvZWZmcykgeworCisgICAgdWludDMyX3Qgb3Bjb2RlSWQgPSBXQVJQX1JFQ1RJTElORUFSX0lEOworCisgICAgc3RhdHVzX3QgZXJyID0gbUVuZGlhbk91dC53cml0ZSgmb3Bjb2RlSWQsIDAsIDEpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICB1aW50OF90IHZlcnNpb25bXSA9IHsxLCAzLCAwLCAwfTsKKyAgICBlcnIgPSBtRW5kaWFuT3V0LndyaXRlKHZlcnNpb24sIDAsIE5FTEVNUyh2ZXJzaW9uKSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIC8vIEFsbG93IHRoaXMgb3Bjb2RlIHRvIGJlIHNraXBwZWQgaWYgbm90IHN1cHBvcnRlZAorICAgIHVpbnQzMl90IGZsYWdzID0gRkxBR19PUFRJT05BTDsKKworICAgIGVyciA9IG1FbmRpYW5PdXQud3JpdGUoJmZsYWdzLCAwLCAxKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgY29uc3QgdWludDMyX3QgTlVNQkVSX0NFTlRFUl9BUkdTID0gMjsKKyAgICBjb25zdCB1aW50MzJfdCBOVU1CRVJfQ09FRkZTID0gbnVtUGxhbmVzICogNjsKKyAgICB1aW50MzJfdCB0b3RhbFNpemUgPSAoTlVNQkVSX0NFTlRFUl9BUkdTICsgTlVNQkVSX0NPRUZGUykgKiBzaXplb2YoZG91YmxlKSArIHNpemVvZih1aW50MzJfdCk7CisKKyAgICBlcnIgPSBtRW5kaWFuT3V0LndyaXRlKCZ0b3RhbFNpemUsIDAsIDEpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBtRW5kaWFuT3V0LndyaXRlKCZudW1QbGFuZXMsIDAsIDEpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBtRW5kaWFuT3V0LndyaXRlKGtDb2VmZnMsIDAsIE5VTUJFUl9DT0VGRlMpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBtRW5kaWFuT3V0LndyaXRlKCZvcHRpY2FsQ2VudGVyWCwgMCwgMSk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IG1FbmRpYW5PdXQud3JpdGUoJm9wdGljYWxDZW50ZXJZLCAwLCAxKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgbUNvdW50Kys7CisKKyAgICByZXR1cm4gT0s7Cit9CisKIH0gLypuYW1lc3BhY2UgaW1nX3V0aWxzKi8KIH0gLypuYW1lc3BhY2UgYW5kcm9pZCovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCmluZGV4IDZkMzBkNjQuLmRiNzg2NWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCkBAIC0yNCwxMCArMjQsMTIgQEAKIAogI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9hdWRpb19lZmZlY3RzX2NvbmYuaD4KIAogc3RhdGljIGxpc3RfZWxlbV90ICpnRWZmZWN0TGlzdDsgLy8gbGlzdCBvZiBlZmZlY3RfZW50cnlfdDogYWxsIGN1cnJlbnRseSBjcmVhdGVkIGVmZmVjdHMKIHN0YXRpYyBsaXN0X2VsZW1fdCAqZ0xpYnJhcnlMaXN0OyAvLyBsaXN0IG9mIGxpYl9lbnRyeV90OiBhbGwgY3VycmVudGx5IGxvYWRlZCBsaWJyYXJpZXMKK3N0YXRpYyBsaXN0X2VsZW1fdCAqZ1NraXBwZWRFZmZlY3RzOyAvLyBsaXN0IG9mIGVmZmVjdHMgc2tpcHBlZCBiZWNhdXNlIG9mIGR1cGxpY2F0ZSB1dWlkCiAvLyBsaXN0IG9mIGVmZmVjdF9kZXNjcmlwdG9yIGFuZCBsaXN0IG9mIHN1YiBlZmZlY3RzIDogYWxsIGN1cnJlbnRseSBsb2FkZWQKIC8vIEl0IGRvZXMgbm90IGNvbnRhaW4gZWZmZWN0cyB3aXRob3V0IHN1YiBlZmZlY3RzLgogc3RhdGljIGxpc3Rfc3ViX2VsZW1fdCAqZ1N1YkVmZmVjdExpc3Q7CkBAIC02MywxMCArNjUsMTAgQEAKICAgICAgICAgICAgICAgIGxpYl9lbnRyeV90ICoqbGliLAogICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqKmRlc2MpOwogLy8gVG8gc2VhcmNoIGEgc3ViZWZmZWN0IGluIHRoZSBnU3ViRWZmZWN0TGlzdAotaW50IGZpbmRTdWJFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKK3N0YXRpYyBpbnQgZmluZFN1YkVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAogICAgICAgICAgICAgICAgbGliX2VudHJ5X3QgKipsaWIsCiAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICoqZGVzYyk7Ci1zdGF0aWMgdm9pZCBkdW1wRWZmZWN0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLCBjaGFyICpzdHIsIHNpemVfdCBsZW4pOworc3RhdGljIHZvaWQgZHVtcEVmZmVjdERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgY2hhciAqc3RyLCBzaXplX3QgbGVuLCBpbnQgaW5kZW50KTsKIHN0YXRpYyBpbnQgc3RyaW5nVG9VdWlkKGNvbnN0IGNoYXIgKnN0ciwgZWZmZWN0X3V1aWRfdCAqdXVpZCk7CiBzdGF0aWMgaW50IHV1aWRUb1N0cmluZyhjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLCBjaGFyICpzdHIsIHNpemVfdCBtYXhMZW4pOwogCkBAIC0yMzcsOCArMjM5LDggQEAKICAgICB9CiAKICNpZiAoTE9HX05ERUJVRyA9PSAwKQotICAgIGNoYXIgc3RyWzI1Nl07Ci0gICAgZHVtcEVmZmVjdERlc2NyaXB0b3IocERlc2NyaXB0b3IsIHN0ciwgMjU2KTsKKyAgICBjaGFyIHN0cls1MTJdOworICAgIGR1bXBFZmZlY3REZXNjcmlwdG9yKHBEZXNjcmlwdG9yLCBzdHIsIHNpemVvZihzdHIpLCAwIC8qIGluZGVudCAqLyk7CiAgICAgQUxPR1YoIkVmZmVjdFF1ZXJ5RWZmZWN0KCkgZGVzYzolcyIsIHN0cik7CiAjZW5kaWYKICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0xpYkxvY2spOwpAQCAtNDQ2LDEyICs0NDgsMTkgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCisgICAgLy8gaWdub3JlIGVmZmVjdHMgb3Igbm90PworICAgIGNvbnN0IGJvb2wgaWdub3JlRnhDb25mRmlsZXMgPSBwcm9wZXJ0eV9nZXRfYm9vbChQUk9QRVJUWV9JR05PUkVfRUZGRUNUUywgZmFsc2UpOworCiAgICAgcHRocmVhZF9tdXRleF9pbml0KCZnTGliTG9jaywgTlVMTCk7CiAKLSAgICBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9WRU5ET1JfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKLSAgICAgICAgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSk7Ci0gICAgfSBlbHNlIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUsIFJfT0spID09IDApIHsKLSAgICAgICAgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoQVVESU9fRUZGRUNUX0RFRkFVTFRfQ09ORklHX0ZJTEUpOworICAgIGlmIChpZ25vcmVGeENvbmZGaWxlcykgeworICAgICAgICBBTE9HSSgiQXVkaW8gZWZmZWN0cyBpbiBjb25maWd1cmF0aW9uIGZpbGVzIHdpbGwgYmUgaWdub3JlZCIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgeworICAgICAgICAgICAgbG9hZEVmZmVjdENvbmZpZ0ZpbGUoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSk7CisgICAgICAgIH0gZWxzZSBpZiAoYWNjZXNzKEFVRElPX0VGRkVDVF9ERUZBVUxUX0NPTkZJR19GSUxFLCBSX09LKSA9PSAwKSB7CisgICAgICAgICAgICBsb2FkRWZmZWN0Q29uZmlnRmlsZShBVURJT19FRkZFQ1RfREVGQVVMVF9DT05GSUdfRklMRSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICB1cGRhdGVOdW1FZmZlY3RzKCk7CkBAIC01MDMsMTUgKzUxMiwzMSBAQAogICAgIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgKmRlc2M7CiAgICAgbGlzdF9lbGVtX3QgKmU7CiAgICAgbGliX2VudHJ5X3QgKmw7CisgICAgY2hhciBwYXRoW1BBVEhfTUFYXTsKKyAgICBjaGFyICpzdHI7CisgICAgc2l6ZV90IGxlbjsKIAogICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBQQVRIX1RBRyk7CiAgICAgaWYgKG5vZGUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CisgICAgLy8gYXVkaW9fZWZmZWN0cy5jb25mIGFsd2F5cyBzcGVjaWZpZXMgMzIgYml0IGxpYiBwYXRoOiBjb252ZXJ0IHRvIDY0IGJpdCBwYXRoIGlmIG5lZWRlZAorICAgIHN0cmxjcHkocGF0aCwgbm9kZS0+dmFsdWUsIFBBVEhfTUFYKTsKKyNpZmRlZiBfX0xQNjRfXworICAgIHN0ciA9IHN0cnN0cihwYXRoLCAiL2xpYi8iKTsKKyAgICBpZiAoc3RyID09IE5VTEwpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIGxlbiA9IHN0ciAtIHBhdGg7CisgICAgcGF0aFtsZW5dID0gJ1wwJzsKKyAgICBzdHJsY2F0KHBhdGgsICIvbGliNjQvIiwgUEFUSF9NQVgpOworICAgIHN0cmxjYXQocGF0aCwgbm9kZS0+dmFsdWUgKyBsZW4gKyBzdHJsZW4oIi9saWIvIiksIFBBVEhfTUFYKTsKKyNlbmRpZgorICAgIGlmIChzdHJsZW4ocGF0aCkgPj0gUEFUSF9NQVggLSAxKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKIAotICAgIGhkbCA9IGRsb3Blbihub2RlLT52YWx1ZSwgUlRMRF9OT1cpOworICAgIGhkbCA9IGRsb3BlbihwYXRoLCBSVExEX05PVyk7CiAgICAgaWYgKGhkbCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkTGlicmFyeSgpIGZhaWxlZCB0byBvcGVuICVzIiwgbm9kZS0+dmFsdWUpOworICAgICAgICBBTE9HVygibG9hZExpYnJhcnkoKSBmYWlsZWQgdG8gb3BlbiAlcyIsIHBhdGgpOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIApAQCAtNTM1LDcgKzU2MCw3IEBACiAgICAgLy8gYWRkIGVudHJ5IGZvciBsaWJyYXJ5IGluIGdMaWJyYXJ5TGlzdAogICAgIGwgPSBtYWxsb2Moc2l6ZW9mKGxpYl9lbnRyeV90KSk7CiAgICAgbC0+bmFtZSA9IHN0cm5kdXAobmFtZSwgUEFUSF9NQVgpOwotICAgIGwtPnBhdGggPSBzdHJuZHVwKG5vZGUtPnZhbHVlLCBQQVRIX01BWCk7CisgICAgbC0+cGF0aCA9IHN0cm5kdXAocGF0aCwgUEFUSF9NQVgpOwogICAgIGwtPmhhbmRsZSA9IGhkbDsKICAgICBsLT5kZXNjID0gZGVzYzsKICAgICBsLT5lZmZlY3RzID0gTlVMTDsKQEAgLTU0Nyw3ICs1NzIsNyBAQAogICAgIGUtPm5leHQgPSBnTGlicmFyeUxpc3Q7CiAgICAgZ0xpYnJhcnlMaXN0ID0gZTsKICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZ0xpYkxvY2spOwotICAgIEFMT0dWKCJnZXRMaWJyYXJ5KCkgbGlua2VkIGxpYnJhcnkgJXAgZm9yIHBhdGggJXMiLCBsLCBub2RlLT52YWx1ZSk7CisgICAgQUxPR1YoImdldExpYnJhcnkoKSBsaW5rZWQgbGlicmFyeSAlcCBmb3IgcGF0aCAlcyIsIGwsIHBhdGgpOwogCiAgICAgcmV0dXJuIDA7CiAKQEAgLTU5NSw4ICs2MjAsOCBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAjaWYgKExPR19OREVCVUc9PTApCi0gICAgY2hhciBzWzI1Nl07Ci0gICAgZHVtcEVmZmVjdERlc2NyaXB0b3IoZCwgcywgMjU2KTsKKyAgICBjaGFyIHNbNTEyXTsKKyAgICBkdW1wRWZmZWN0RGVzY3JpcHRvcihkLCBzLCBzaXplb2YocyksIDAgLyogaW5kZW50ICovKTsKICAgICBBTE9HVigiYWRkU3ViRWZmZWN0KCkgcmVhZCBkZXNjcmlwdG9yICVwOiVzIixkLCBzKTsKICNlbmRpZgogICAgIGlmIChFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoZC0+YXBpVmVyc2lvbikgIT0KQEAgLTY2MCw2ICs2ODUsMTMgQEAKICAgICAgICAgQUxPR1coImxvYWRFZmZlY3QoKSBpbnZhbGlkIHV1aWQgJXMiLCBub2RlLT52YWx1ZSk7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KKyAgICBsaWJfZW50cnlfdCAqdG1wOworICAgIGJvb2wgc2tpcCA9IGZhbHNlOworICAgIGlmIChmaW5kRWZmZWN0KE5VTEwsICZ1dWlkLCAmdG1wLCBOVUxMKSA9PSAwKSB7CisgICAgICAgIEFMT0dXKCJza2lwcGluZyBkdXBsaWNhdGUgdXVpZCAlcyAlcyIsIG5vZGUtPnZhbHVlLAorICAgICAgICAgICAgICAgIG5vZGUtPm5leHQgPyAiYW5kIGl0cyBzdWItZWZmZWN0cyIgOiAiIik7CisgICAgICAgIHNraXAgPSB0cnVlOworICAgIH0KIAogICAgIGQgPSBtYWxsb2Moc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKICAgICBpZiAobC0+ZGVzYy0+Z2V0X2Rlc2NyaXB0b3IoJnV1aWQsIGQpICE9IDApIHsKQEAgLTY3MCw4ICs3MDIsOCBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAjaWYgKExPR19OREVCVUc9PTApCi0gICAgY2hhciBzWzI1Nl07Ci0gICAgZHVtcEVmZmVjdERlc2NyaXB0b3IoZCwgcywgMjU2KTsKKyAgICBjaGFyIHNbNTEyXTsKKyAgICBkdW1wRWZmZWN0RGVzY3JpcHRvcihkLCBzLCBzaXplb2YocyksIDAgLyogaW5kZW50ICovKTsKICAgICBBTE9HVigibG9hZEVmZmVjdCgpIHJlYWQgZGVzY3JpcHRvciAlcDolcyIsZCwgcyk7CiAjZW5kaWYKICAgICBpZiAoRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKGQtPmFwaVZlcnNpb24pICE9CkBAIC02ODIsOCArNzE0LDE0IEBACiAgICAgfQogICAgIGUgPSBtYWxsb2Moc2l6ZW9mKGxpc3RfZWxlbV90KSk7CiAgICAgZS0+b2JqZWN0ID0gZDsKLSAgICBlLT5uZXh0ID0gbC0+ZWZmZWN0czsKLSAgICBsLT5lZmZlY3RzID0gZTsKKyAgICBpZiAoc2tpcCkgeworICAgICAgICBlLT5uZXh0ID0gZ1NraXBwZWRFZmZlY3RzOworICAgICAgICBnU2tpcHBlZEVmZmVjdHMgPSBlOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9IGVsc2UgeworICAgICAgICBlLT5uZXh0ID0gbC0+ZWZmZWN0czsKKyAgICAgICAgbC0+ZWZmZWN0cyA9IGU7CisgICAgfQogCiAgICAgLy8gQWZ0ZXIgdGhlIFVVSUQgbm9kZSBpbiB0aGUgY29uZmlnX3RyZWUsIGlmIG5vZGUtPm5leHQgaXMgdmFsaWQsCiAgICAgLy8gdGhhdCB3b3VsZCBiZSBzdWIgZWZmZWN0IG5vZGUuCkBAIC04NzYsMjIgKzkxNCwzMCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXZvaWQgZHVtcEVmZmVjdERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgY2hhciAqc3RyLCBzaXplX3QgbGVuKSB7Cit2b2lkIGR1bXBFZmZlY3REZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgaW50IGluZGVudCkgewogICAgIGNoYXIgc1syNTZdOworICAgIGNoYXIgc3NbMjU2XTsKKyAgICBjaGFyIGlkdFtpbmRlbnQgKyAxXTsKIAotICAgIHNucHJpbnRmKHN0ciwgbGVuLCAiXG5FZmZlY3QgRGVzY3JpcHRvciAlcDpcbiIsIGRlc2MpOwotICAgIHN0cm5jYXQoc3RyLCAiLSBUWVBFOiAiLCBsZW4pOwotICAgIHV1aWRUb1N0cmluZygmZGVzYy0+dXVpZCwgcywgMjU2KTsKLSAgICBzbnByaW50ZihzdHIsIGxlbiwgIi0gVVVJRDogJXNcbiIsIHMpOwotICAgIHV1aWRUb1N0cmluZygmZGVzYy0+dHlwZSwgcywgMjU2KTsKLSAgICBzbnByaW50ZihzdHIsIGxlbiwgIi0gVFlQRTogJXNcbiIsIHMpOwotICAgIHNwcmludGYocywgIi0gYXBpVmVyc2lvbjogJTA4WFxuLSBmbGFnczogJTA4WFxuIiwKLSAgICAgICAgICAgIGRlc2MtPmFwaVZlcnNpb24sIGRlc2MtPmZsYWdzKTsKLSAgICBzdHJuY2F0KHN0ciwgcywgbGVuKTsKLSAgICBzcHJpbnRmKHMsICItIG5hbWU6ICVzXG4iLCBkZXNjLT5uYW1lKTsKLSAgICBzdHJuY2F0KHN0ciwgcywgbGVuKTsKLSAgICBzcHJpbnRmKHMsICItIGltcGxlbWVudG9yOiAlc1xuIiwgZGVzYy0+aW1wbGVtZW50b3IpOwotICAgIHN0cm5jYXQoc3RyLCBzLCBsZW4pOworICAgIG1lbXNldChpZHQsICcgJywgaW5kZW50KTsKKyAgICBpZHRbaW5kZW50XSA9IDA7CisKKyAgICBzdHJbMF0gPSAwOworCisgICAgc25wcmludGYocywgc2l6ZW9mKHMpLCAiJXMlcyAvICVzXG4iLCBpZHQsIGRlc2MtPm5hbWUsIGRlc2MtPmltcGxlbWVudG9yKTsKKyAgICBzdHJsY2F0KHN0ciwgcywgbGVuKTsKKworICAgIHV1aWRUb1N0cmluZygmZGVzYy0+dXVpZCwgcywgc2l6ZW9mKHMpKTsKKyAgICBzbnByaW50Zihzcywgc2l6ZW9mKHNzKSwgIiVzICBVVUlEOiAlc1xuIiwgaWR0LCBzKTsKKyAgICBzdHJsY2F0KHN0ciwgc3MsIGxlbik7CisKKyAgICB1dWlkVG9TdHJpbmcoJmRlc2MtPnR5cGUsIHMsIHNpemVvZihzKSk7CisgICAgc25wcmludGYoc3MsIHNpemVvZihzcyksICIlcyAgVFlQRTogJXNcbiIsIGlkdCwgcyk7CisgICAgc3RybGNhdChzdHIsIHNzLCBsZW4pOworCisgICAgc3ByaW50ZihzLCAiJXMgIGFwaVZlcnNpb246ICUwOFhcbiVzICBmbGFnczogJTA4WFxuIiwgaWR0LAorICAgICAgICAgICAgZGVzYy0+YXBpVmVyc2lvbiwgaWR0LCBkZXNjLT5mbGFncyk7CisgICAgc3RybGNhdChzdHIsIHMsIGxlbik7CiB9CiAKIGludCBzdHJpbmdUb1V1aWQoY29uc3QgY2hhciAqc3RyLCBlZmZlY3RfdXVpZF90ICp1dWlkKQpAQCAtOTM0LDMgKzk4MCw0MCBAQAogICAgIHJldHVybiAwOwogfQogCitpbnQgRWZmZWN0RHVtcEVmZmVjdHMoaW50IGZkKSB7CisgICAgY2hhciBzWzUxMl07CisgICAgbGlzdF9lbGVtX3QgKmUgPSBnTGlicmFyeUxpc3Q7CisgICAgbGliX2VudHJ5X3QgKmwgPSBOVUxMOworICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmQgPSBOVUxMOworICAgIGludCBmb3VuZCA9IDA7CisgICAgaW50IHJldCA9IDA7CisKKyAgICB3aGlsZSAoZSkgeworICAgICAgICBsID0gKGxpYl9lbnRyeV90ICopZS0+b2JqZWN0OworICAgICAgICBsaXN0X2VsZW1fdCAqZWZ4ID0gbC0+ZWZmZWN0czsKKyAgICAgICAgZHByaW50ZihmZCwgIkxpYnJhcnkgJXNcbiIsIGwtPm5hbWUpOworICAgICAgICBpZiAoIWVmeCkgeworICAgICAgICAgICAgZHByaW50ZihmZCwgIiAgKG5vIGVmZmVjdHMpXG4iKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoZWZ4KSB7CisgICAgICAgICAgICBkID0gKGVmZmVjdF9kZXNjcmlwdG9yX3QgKillZngtPm9iamVjdDsKKyAgICAgICAgICAgIGR1bXBFZmZlY3REZXNjcmlwdG9yKGQsIHMsIHNpemVvZihzKSwgMik7CisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiJXMiLCBzKTsKKyAgICAgICAgICAgIGVmeCA9IGVmeC0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBlID0gZS0+bmV4dDsKKyAgICB9CisKKyAgICBlID0gZ1NraXBwZWRFZmZlY3RzOworICAgIGlmIChlKSB7CisgICAgICAgIGRwcmludGYoZmQsICJTa2lwcGVkIGVmZmVjdHNcbiIpOworICAgICAgICB3aGlsZShlKSB7CisgICAgICAgICAgICBkID0gKGVmZmVjdF9kZXNjcmlwdG9yX3QgKillLT5vYmplY3Q7CisgICAgICAgICAgICBkdW1wRWZmZWN0RGVzY3JpcHRvcihkLCBzLCBzaXplb2YocyksIDIgLyogaW5kZW50ICovKTsKKyAgICAgICAgICAgIGRwcmludGYoZmQsICIlcyIsIHMpOworICAgICAgICAgICAgZSA9IGUtPm5leHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNGYWN0b3J5LmggYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuaAppbmRleCA1NjBiNDg1Li41MTg4MDBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuaApAQCAtMjYsNiArMjYsNyBAQAogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAorI2RlZmluZSBQUk9QRVJUWV9JR05PUkVfRUZGRUNUUyAicm8uYXVkaW8uaWdub3JlX2VmZmVjdHMiCiAKIHR5cGVkZWYgc3RydWN0IGxpc3RfZWxlbV9zIHsKICAgICB2b2lkICpvYmplY3Q7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAppbmRleCA0MGM3ZmVmLi4xNGExYTc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKQEAgLTI3LDYgKzI3LDcgQEAKIAogI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KICNpbmNsdWRlICJFZmZlY3RCdW5kbGUuaCIKKyNpbmNsdWRlICJtYXRoLmgiCiAKIAogLy8gZWZmZWN0X2hhbmRsZV90IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgYmFzcyBib29zdApAQCAtODMwLDMyICs4MzEsNjkgQEAKICAgICBpbnQgZ2FpbkNvcnJlY3Rpb24gPSAwOwogICAgIC8vQ291bnQgdGhlIGVuZXJneSBjb250cmlidXRpb24gcGVyIGJhbmQgZm9yIEVRIGFuZCBCYXNzQm9vc3Qgb25seSBpZiB0aGV5IGFyZSBhY3RpdmUuCiAgICAgZmxvYXQgZW5lcmd5Q29udHJpYnV0aW9uID0gMDsKKyAgICBmbG9hdCBlbmVyZ3lDcm9zcyA9IDA7CisgICAgZmxvYXQgZW5lcmd5QmFzc0Jvb3N0ID0gMDsKKyAgICBmbG9hdCBjcm9zc0NvcnJlY3Rpb24gPSAwOwogCiAgICAgLy9FUSBjb250cmlidXRpb24KICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkVxdWFsaXplckVuYWJsZWQgPT0gTFZNX1RSVUUpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7Ci0gICAgICAgICAgICBmbG9hdCBiYW5kRW5lcmd5ID0gKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV0gKgotICAgICAgICAgICAgICAgICAgICBMaW1pdExldmVsX2JhbmRFbmVyZ3lDb250cmlidXRpb25baV0pLzE1LjA7CisgICAgICAgICAgICBmbG9hdCBiYW5kRmFjdG9yID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YmFuZEdhaW5kQltpXS8xNS4wOworICAgICAgICAgICAgZmxvYXQgYmFuZENvZWZmaWNpZW50ID0gTGltaXRMZXZlbF9iYW5kRW5lcmd5Q29lZmZpY2llbnRbaV07CisgICAgICAgICAgICBmbG9hdCBiYW5kRW5lcmd5ID0gYmFuZEZhY3RvciAqIGJhbmRDb2VmZmljaWVudCAqIGJhbmRDb2VmZmljaWVudDsKICAgICAgICAgICAgIGlmIChiYW5kRW5lcmd5ID4gMCkKICAgICAgICAgICAgICAgICBlbmVyZ3lDb250cmlidXRpb24gKz0gYmFuZEVuZXJneTsKICAgICAgICAgfQorCisgICAgICAgIC8vY3Jvc3MgRVEgY29lZmZpY2llbnRzCisgICAgICAgIGZsb2F0IGJhbmRGYWN0b3JTdW0gPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTLTE7IGkrKykgeworICAgICAgICAgICAgZmxvYXQgYmFuZEZhY3RvcjEgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldLzE1LjA7CisgICAgICAgICAgICBmbG9hdCBiYW5kRmFjdG9yMiA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaSsxXS8xNS4wOworCisgICAgICAgICAgICBpZiAoYmFuZEZhY3RvcjEgPiAwICYmIGJhbmRGYWN0b3IyID4gMCkgeworICAgICAgICAgICAgICAgIGZsb2F0IGNyb3NzRW5lcmd5ID0gYmFuZEZhY3RvcjEgKiBiYW5kRmFjdG9yMiAqCisgICAgICAgICAgICAgICAgICAgICAgICBMaW1pdExldmVsX2JhbmRFbmVyZ3lDcm9zc0NvZWZmaWNpZW50W2ldOworICAgICAgICAgICAgICAgIGJhbmRGYWN0b3JTdW0gKz0gYmFuZEZhY3RvcjEgKiBiYW5kRmFjdG9yMjsKKworICAgICAgICAgICAgICAgIGlmIChjcm9zc0VuZXJneSA+IDApCisgICAgICAgICAgICAgICAgICAgIGVuZXJneUNyb3NzICs9IGNyb3NzRW5lcmd5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJhbmRGYWN0b3JTdW0gLT0gMS4wOworICAgICAgICBpZiAoYmFuZEZhY3RvclN1bSA+IDApCisgICAgICAgICAgICBjcm9zc0NvcnJlY3Rpb24gPSBiYW5kRmFjdG9yU3VtICogMC43OwogICAgIH0KIAogICAgIC8vQmFzc0Jvb3N0IGNvbnRyaWJ1dGlvbgogICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPT0gTFZNX1RSVUUpIHsKLSAgICAgICAgZmxvYXQgYmFuZEVuZXJneSA9IChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCAqCi0gICAgICAgICAgICAgICAgTGltaXRMZXZlbF9iYXNzQm9vc3RFbmVyZ3lDb250cmlidXRpb24pLzEwMDAuMDsKLSAgICAgICAgaWYgKGJhbmRFbmVyZ3kgPiAwKQotICAgICAgICAgICAgZW5lcmd5Q29udHJpYnV0aW9uICs9IGJhbmRFbmVyZ3k7CisgICAgICAgIGZsb2F0IGJvb3N0RmFjdG9yID0gKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkJhc3NTdHJlbmd0aFNhdmVkKS8xMDAwLjA7CisgICAgICAgIGZsb2F0IGJvb3N0Q29lZmZpY2llbnQgPSBMaW1pdExldmVsX2Jhc3NCb29zdEVuZXJneUNvZWZmaWNpZW50OworCisgICAgICAgIGVuZXJneUNvbnRyaWJ1dGlvbiArPSBib29zdEZhY3RvciAqIGJvb3N0Q29lZmZpY2llbnQgKiBib29zdENvZWZmaWNpZW50OworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgeworICAgICAgICAgICAgZmxvYXQgYmFuZEZhY3RvciA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV0vMTUuMDsKKyAgICAgICAgICAgIGZsb2F0IGJhbmRDcm9zc0NvZWZmaWNpZW50ID0gTGltaXRMZXZlbF9iYXNzQm9vc3RFbmVyZ3lDcm9zc0NvZWZmaWNpZW50W2ldOworICAgICAgICAgICAgZmxvYXQgYmFuZEVuZXJneSA9IGJvb3N0RmFjdG9yICogYmFuZEZhY3RvciAqCisgICAgICAgICAgICAgICAgICAgIGJhbmRDcm9zc0NvZWZmaWNpZW50OworICAgICAgICAgICAgaWYgKGJhbmRFbmVyZ3kgPiAwKQorICAgICAgICAgICAgICAgIGVuZXJneUJhc3NCb29zdCArPSBiYW5kRW5lcmd5OworICAgICAgICB9CiAgICAgfQogCiAgICAgLy9WaXJ0dWFsaXplciBjb250cmlidXRpb24KICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9PSBMVk1fVFJVRSkgewotICAgICAgICAgICAgICAgICAgIGVuZXJneUNvbnRyaWJ1dGlvbiArPSBMaW1pdExldmVsX3ZpcnR1YWxpemVyQ29udHJpYnV0aW9uOwotICAgICAgICB9CisgICAgICAgIGVuZXJneUNvbnRyaWJ1dGlvbiArPSBMaW1pdExldmVsX3ZpcnR1YWxpemVyQ29udHJpYnV0aW9uICoKKyAgICAgICAgICAgICAgICBMaW1pdExldmVsX3ZpcnR1YWxpemVyQ29udHJpYnV0aW9uOworICAgIH0KKworICAgIGRvdWJsZSB0b3RhbEVuZXJneUVzdGltYXRpb24gPSBzcXJ0KGVuZXJneUNvbnRyaWJ1dGlvbiArIGVuZXJneUNyb3NzICsgZW5lcmd5QmFzc0Jvb3N0KSAtCisgICAgICAgICAgICBjcm9zc0NvcnJlY3Rpb247CisgICAgQUxPR1YoIiBUT1RBTCBlbmVyZ3kgZXN0aW1hdGlvbjogJTAuMmYiLCB0b3RhbEVuZXJneUVzdGltYXRpb24pOwogCiAgICAgLy9yb3VuZG9mZgotICAgIGludCBtYXhMZXZlbFJvdW5kID0gKGludCkoZW5lcmd5Q29udHJpYnV0aW9uICsgMC45OSk7CisgICAgaW50IG1heExldmVsUm91bmQgPSAoaW50KSh0b3RhbEVuZXJneUVzdGltYXRpb24gKyAwLjk5KTsKICAgICBpZiAobWF4TGV2ZWxSb3VuZCArIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnZvbHVtZSA+IDApIHsKICAgICAgICAgZ2FpbkNvcnJlY3Rpb24gPSBtYXhMZXZlbFJvdW5kICsgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+dm9sdW1lOwogICAgIH0KQEAgLTMwNTMsNyArMzA5MSwxMCBAQAogICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfY29tbWFuZCBjbWRDb2RlIENhc2U6IEVGRkVDVF9DTURfR0VUX1BBUkFNIHN0YXJ0Iik7CiAKICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopcENtZERhdGE7Ci0KKyAgICAgICAgICAgIGlmIChTSVpFX01BWCAtIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgPCAoc2l6ZV90KXAtPnBzaXplKSB7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNjM0NzUwOSIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgfHwKICAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpIHx8CiAgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaAppbmRleCBiMzA3MWY0Li45NDU5Yjg3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaApAQCAtMjAwLDEwICsyMDAsMTYgQEAKICAqIHVwZGF0ZWQuCiAgKi8KIAotc3RhdGljIGNvbnN0IGZsb2F0IExpbWl0TGV2ZWxfYmFuZEVuZXJneUNvbnRyaWJ1dGlvbltGSVZFQkFORF9OVU1CQU5EU10gPSB7Ci0gICAgICAgIDUuMCwgNi41LCA2LjQ1LCA0LjgsIDEuNyB9Oworc3RhdGljIGNvbnN0IGZsb2F0IExpbWl0TGV2ZWxfYmFuZEVuZXJneUNvZWZmaWNpZW50W0ZJVkVCQU5EX05VTUJBTkRTXSA9IHsKKyAgICAgICAgNy41NiwgOS42OSwgOS41OSwgNy4zNywgMi44OH07CiAKLXN0YXRpYyBjb25zdCBmbG9hdCBMaW1pdExldmVsX2Jhc3NCb29zdEVuZXJneUNvbnRyaWJ1dGlvbiA9IDYuNzsKK3N0YXRpYyBjb25zdCBmbG9hdCBMaW1pdExldmVsX2JhbmRFbmVyZ3lDcm9zc0NvZWZmaWNpZW50W0ZJVkVCQU5EX05VTUJBTkRTLTFdID0geworICAgICAgICAxMjYuMCwgMTE1LjAsIDEyNS4wLCAxMDQuMCB9OworCitzdGF0aWMgY29uc3QgZmxvYXQgTGltaXRMZXZlbF9iYXNzQm9vc3RFbmVyZ3lDcm9zc0NvZWZmaWNpZW50W0ZJVkVCQU5EX05VTUJBTkRTXSA9IHsKKyAgICAgICAgMjIxLjIxLCAyMDguMTAsIDI4LjE2LCAwLjAsIDAuMCB9OworCitzdGF0aWMgY29uc3QgZmxvYXQgTGltaXRMZXZlbF9iYXNzQm9vc3RFbmVyZ3lDb2VmZmljaWVudCA9IDcuMTI7CiAKIHN0YXRpYyBjb25zdCBmbG9hdCBMaW1pdExldmVsX3ZpcnR1YWxpemVyQ29udHJpYnV0aW9uID0gMS45OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAppbmRleCBhNDhhNGUzLi40ZGM4YjQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKQEAgLTE5NTYsNyArMTk1NiwxMCBAQAogICAgICAgICAgICAgLy9BTE9HVigiXHRSZXZlcmJfY29tbWFuZCBjbWRDb2RlIENhc2U6ICIKICAgICAgICAgICAgIC8vICAgICAgICAiRUZGRUNUX0NNRF9HRVRfUEFSQU0gc3RhcnQiKTsKICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpwID0gKGVmZmVjdF9wYXJhbV90ICopcENtZERhdGE7Ci0KKyAgICAgICAgICAgIGlmIChTSVpFX01BWCAtIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgPCAoc2l6ZV90KXAtPnBzaXplKSB7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNjM0NzUwOSIpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSA8IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgfHwKICAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpIHx8CiAgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5tayBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQubWsKaW5kZXggNjBlMmQ4Mi4uOWY4MzZmMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLm1rCkBAIC03LDYgKzcsOSBAQAogTE9DQUxfTU9EVUxFOj0gbGlibWVkaWFfaGVscGVyCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogCitMT0NBTF9DX0ZMQUdTICs9IC1XZXJyb3IgLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQorCiBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQpAQCAtMTksNiArMjIsNyBAQAogICAgIElBdWRpb1RyYWNrLmNwcCBcCiAgICAgSUF1ZGlvUmVjb3JkLmNwcCBcCiAgICAgSUNyeXB0by5jcHAgXAorICAgIElEYXRhU291cmNlLmNwcCBcCiAgICAgSURybS5jcHAgXAogICAgIElEcm1DbGllbnQuY3BwIFwKICAgICBJSERDUC5jcHAgXApAQCAtMzYsNiArNDAsOCBAQAogICAgIElNZWRpYVJlY29yZGVyLmNwcCBcCiAgICAgSVJlbW90ZURpc3BsYXkuY3BwIFwKICAgICBJUmVtb3RlRGlzcGxheUNsaWVudC5jcHAgXAorICAgIElSZXNvdXJjZU1hbmFnZXJDbGllbnQuY3BwIFwKKyAgICBJUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAgXAogICAgIElTdHJlYW1Tb3VyY2UuY3BwIFwKICAgICBNZWRpYUNvZGVjSW5mby5jcHAgXAogICAgIE1lZGlhVXRpbHMuY3BwIFwKQEAgLTU0LDYgKzYwLDggQEAKICAgICBDaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcCBcCiAgICAgSU1lZGlhRGVhdGhOb3RpZmllci5jcHAgXAogICAgIE1lZGlhUHJvZmlsZXMuY3BwIFwKKyAgICBNZWRpYVJlc291cmNlLmNwcCBcCisgICAgTWVkaWFSZXNvdXJjZVBvbGljeS5jcHAgXAogICAgIElFZmZlY3QuY3BwIFwKICAgICBJRWZmZWN0Q2xpZW50LmNwcCBcCiAgICAgQXVkaW9FZmZlY3QuY3BwIFwKQEAgLTYyLDE1ICs3MCwxMSBAQAogICAgIFN0cmluZ0FycmF5LmNwcCBcCiAgICAgQXVkaW9Qb2xpY3kuY3BwCiAKLUxPQ0FMX1NSQ19GSUxFUyArPSAuLi9saWJuYmFpby9yb3VuZHVwLmMKLQogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGlidWkgbGlibG9nIGxpYmN1dGlscyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlic29uaXZveCBsaWJpY3V1YyBsaWJpY3VpMThuIGxpYmV4cGF0IFwKICAgICAgICAgbGliY2FtZXJhX2NsaWVudCBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKICAgICAgICAgbGliZ3VpIGxpYmRsIGxpYmF1ZGlvdXRpbHMgbGlibmJhaW8KIAotTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJpbnN0YW50c3NxCi0KIExPQ0FMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlibWVkaWFfaGVscGVyCiAKIExPQ0FMX01PRFVMRTo9IGxpYm1lZGlhCkBAIC04NCwxNCArODgsOCBAQAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKSBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCisKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIAotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyArPSBTaW5nbGVTdGF0ZVF1ZXVlLmNwcAotTE9DQUxfQ0ZMQUdTICs9IC1EU0lOR0xFX1NUQVRFX1FVRVVFX0lOU1RBTlRJQVRJT05TPSciU2luZ2xlU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLmNwcCInCi0KLUxPQ0FMX01PRFVMRSA6PSBsaWJpbnN0YW50c3NxCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb0VmZmVjdC5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb0VmZmVjdC5jcHAKaW5kZXggYWYxMDNjMS4uZmY4MjU0NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9FZmZlY3QuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvRWZmZWN0LmNwcApAQCAtMzUsMTMgKzM1LDE0IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1BdWRpb0VmZmVjdDo6QXVkaW9FZmZlY3QoKQotICAgIDogbVN0YXR1cyhOT19JTklUKQorQXVkaW9FZmZlY3Q6OkF1ZGlvRWZmZWN0KGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKQorICAgIDogbVN0YXR1cyhOT19JTklUKSwgbU9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSkKIHsKIH0KIAogCiBBdWRpb0VmZmVjdDo6QXVkaW9FZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAogICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCiAgICAgICAgICAgICAgICAgZWZmZWN0X2NhbGxiYWNrX3QgY2JmLApAQCAtNDksMTIgKzUwLDEzIEBACiAgICAgICAgICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbwogICAgICAgICAgICAgICAgICkKLSAgICA6IG1TdGF0dXMoTk9fSU5JVCkKKyAgICA6IG1TdGF0dXMoTk9fSU5JVCksIG1PcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpCiB7CiAgICAgbVN0YXR1cyA9IHNldCh0eXBlLCB1dWlkLCBwcmlvcml0eSwgY2JmLCB1c2VyLCBzZXNzaW9uSWQsIGlvKTsKIH0KIAogQXVkaW9FZmZlY3Q6OkF1ZGlvRWZmZWN0KGNvbnN0IGNoYXIgKnR5cGVTdHIsCisgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXVpZFN0ciwKICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAogICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiwKQEAgLTYyLDcgKzY0LDcgQEAKICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvCiAgICAgICAgICAgICAgICAgKQotICAgIDogbVN0YXR1cyhOT19JTklUKQorICAgIDogbVN0YXR1cyhOT19JTklUKSwgbU9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSkKIHsKICAgICBlZmZlY3RfdXVpZF90IHR5cGU7CiAgICAgZWZmZWN0X3V1aWRfdCAqcFR5cGUgPSBOVUxMOwpAQCAtMTI4LDE2ICsxMzAsMTggQEAKICAgICBtSUVmZmVjdENsaWVudCA9IG5ldyBFZmZlY3RDbGllbnQodGhpcyk7CiAKICAgICBpRWZmZWN0ID0gYXVkaW9GbGluZ2VyLT5jcmVhdGVFZmZlY3QoKGVmZmVjdF9kZXNjcmlwdG9yX3QgKikmbURlc2NyaXB0b3IsCi0gICAgICAgICAgICBtSUVmZmVjdENsaWVudCwgcHJpb3JpdHksIGlvLCBtU2Vzc2lvbklkLCAmbVN0YXR1cywgJm1JZCwgJmVuYWJsZWQpOworICAgICAgICAgICAgbUlFZmZlY3RDbGllbnQsIHByaW9yaXR5LCBpbywgbVNlc3Npb25JZCwgbU9wUGFja2FnZU5hbWUsICZtU3RhdHVzLCAmbUlkLCAmZW5hYmxlZCk7CiAKICAgICBpZiAoaUVmZmVjdCA9PSAwIHx8IChtU3RhdHVzICE9IE5PX0VSUk9SICYmIG1TdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpKSB7CiAgICAgICAgIEFMT0dFKCJzZXQoKTogQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgZWZmZWN0LCBzdGF0dXM6ICVkIiwgbVN0YXR1cyk7CisgICAgICAgIGlmIChpRWZmZWN0ID09IDApIHsKKyAgICAgICAgICAgIG1TdGF0dXMgPSBOT19JTklUOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBtU3RhdHVzOwogICAgIH0KIAogICAgIG1FbmFibGVkID0gKHZvbGF0aWxlIGludDMyX3QpZW5hYmxlZDsKIAotICAgIG1JRWZmZWN0ID0gaUVmZmVjdDsKICAgICBjYmxrID0gaUVmZmVjdC0+Z2V0Q2JsaygpOwogICAgIGlmIChjYmxrID09IDApIHsKICAgICAgICAgbVN0YXR1cyA9IE5PX0lOSVQ7CkBAIC0xNDUsNiArMTQ5LDcgQEAKICAgICAgICAgcmV0dXJuIG1TdGF0dXM7CiAgICAgfQogCisgICAgbUlFZmZlY3QgPSBpRWZmZWN0OwogICAgIG1DYmxrTWVtb3J5ID0gY2JsazsKICAgICBtQ2JsayA9IHN0YXRpY19jYXN0PGVmZmVjdF9wYXJhbV9jYmxrX3QqPihjYmxrLT5wb2ludGVyKCkpOwogICAgIGludCBidWZPZmZzZXQgPSAoKHNpemVvZihlZmZlY3RfcGFyYW1fY2Jsa190KSAtIDEpIC8gc2l6ZW9mKGludCkgKyAxKSAqIHNpemVvZihpbnQpOwpAQCAtMTc1LDExICsxODAsMTEgQEAKICAgICAgICAgICAgIG1JRWZmZWN0LT5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtSUVmZmVjdCktPnVubGlua1RvRGVhdGgobUlFZmZlY3RDbGllbnQpOwogICAgICAgICB9CisgICAgICAgIG1JRWZmZWN0LmNsZWFyKCk7CisgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CisgICAgICAgIG1JRWZmZWN0Q2xpZW50LmNsZWFyKCk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKICAgICB9Ci0gICAgbUlFZmZlY3QuY2xlYXIoKTsKLSAgICBtSUVmZmVjdENsaWVudC5jbGVhcigpOwotICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CiB9CiAKIApAQCAtNDg2LDQgKzQ5MSw0IEBACiB9CiAKIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUGFyYW1ldGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvUGFyYW1ldGVyLmNwcAppbmRleCAzM2RiZjBiLi44YzhjZjQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1BhcmFtZXRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9QYXJhbWV0ZXIuY3BwCkBAIC0xODAsNCArMTgwLDQgQEAKICAgICB9CiB9CiAKLX07ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9Qb2xpY3kuY3BwIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9Qb2xpY3kuY3BwCmluZGV4IGQyZDA5NzEuLjlkMDcwMTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUG9saWN5LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1BvbGljeS5jcHAKQEAgLTY4LDYgKzY4LDcgQEAKICAgICBtRm9ybWF0LmZvcm1hdCA9IChhdWRpb19mb3JtYXRfdClwYXJjZWwtPnJlYWRJbnQzMigpOwogICAgIG1Sb3V0ZUZsYWdzID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKICAgICBtUmVnaXN0cmF0aW9uSWQgPSBwYXJjZWwtPnJlYWRTdHJpbmc4KCk7CisgICAgbUNiRmxhZ3MgPSAodWludDMyX3QpcGFyY2VsLT5yZWFkSW50MzIoKTsKICAgICBzaXplX3Qgc2l6ZSA9IChzaXplX3QpcGFyY2VsLT5yZWFkSW50MzIoKTsKICAgICBpZiAoc2l6ZSA+IE1BWF9DUklURVJJQV9QRVJfTUlYKSB7CiAgICAgICAgIHNpemUgPSBNQVhfQ1JJVEVSSUFfUEVSX01JWDsKQEAgLTg5LDYgKzkwLDcgQEAKICAgICBwYXJjZWwtPndyaXRlSW50MzIobUZvcm1hdC5mb3JtYXQpOwogICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtUm91dGVGbGFncyk7CiAgICAgcGFyY2VsLT53cml0ZVN0cmluZzgobVJlZ2lzdHJhdGlvbklkKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIobUNiRmxhZ3MpOwogICAgIHNpemVfdCBzaXplID0gbUNyaXRlcmlhLnNpemUoKTsKICAgICBpZiAoc2l6ZSA+IE1BWF9DUklURVJJQV9QRVJfTUlYKSB7CiAgICAgICAgIHNpemUgPSBNQVhfQ1JJVEVSSUFfUEVSX01JWDsKQEAgLTExMiw0ICsxMTQsNCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvUmVjb3JkLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvUmVjb3JkLmNwcAppbmRleCAwN2NhMTRmLi4wMTFiMzFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1JlY29yZC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9SZWNvcmQuY3BwCkBAIC02NSw5ICs2NSwxMCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotQXVkaW9SZWNvcmQ6OkF1ZGlvUmVjb3JkKCkKLSAgICA6IG1TdGF0dXMoTk9fSU5JVCksIG1TZXNzaW9uSWQoQVVESU9fU0VTU0lPTl9BTExPQ0FURSksCi0gICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKQorQXVkaW9SZWNvcmQ6OkF1ZGlvUmVjb3JkKGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lKQorICAgIDogbVN0YXR1cyhOT19JTklUKSwgbU9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSksIG1TZXNzaW9uSWQoQVVESU9fU0VTU0lPTl9BTExPQ0FURSksCisgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKSwKKyAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpCiB7CiB9CiAKQEAgLTc2LDYgKzc3LDcgQEAKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCiAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICBjYWxsYmFja190IGNiZiwKICAgICAgICAgdm9pZCogdXNlciwKQEAgLTgzLDE1ICs4NSwyMCBAQAogICAgICAgICBpbnQgc2Vzc2lvbklkLAogICAgICAgICB0cmFuc2Zlcl90eXBlIHRyYW5zZmVyVHlwZSwKICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgaW50IHVpZCwKKyAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzKQotICAgIDogbVN0YXR1cyhOT19JTklUKSwgbVNlc3Npb25JZChBVURJT19TRVNTSU9OX0FMTE9DQVRFKSwKKyAgICA6IG1TdGF0dXMoTk9fSU5JVCksCisgICAgICBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwKKyAgICAgIG1TZXNzaW9uSWQoQVVESU9fU0VTU0lPTl9BTExPQ0FURSksCiAgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksCiAgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXAoU1BfREVGQVVMVCksCi0gICAgICBtUHJveHkoTlVMTCkKKyAgICAgIG1Qcm94eShOVUxMKSwKKyAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpCiB7CiAgICAgbVN0YXR1cyA9IHNldChpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgY2JmLCB1c2VyLAogICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBmbGFncywKLSAgICAgICAgICAgIHBBdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgIHVpZCwgcGlkLCBwQXR0cmlidXRlcyk7CiB9CiAKIEF1ZGlvUmVjb3JkOjp+QXVkaW9SZWNvcmQoKQpAQCAtMTA3LDEyICsxMTQsMTggQEAKICAgICAgICAgICAgIG1BdWRpb1JlY29yZFRocmVhZC0+cmVxdWVzdEV4aXRBbmRXYWl0KCk7CiAgICAgICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQuY2xlYXIoKTsKICAgICAgICAgfQorICAgICAgICAvLyBObyBsb2NrIGhlcmU6IHdvcnN0IGNhc2Ugd2UgcmVtb3ZlIGEgTlVMTCBjYWxsYmFjayB3aGljaCB3aWxsIGJlIGEgbm9wCisgICAgICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCAmJiBtSW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjaywgbUlucHV0KTsKKyAgICAgICAgfQogICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQXVkaW9SZWNvcmQpLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKICAgICAgICAgbUF1ZGlvUmVjb3JkLmNsZWFyKCk7CiAgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgIG1CdWZmZXJNZW1vcnkuY2xlYXIoKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIC0xKTsKKyAgICAgICAgQUxPR1YoIn5BdWRpb1JlY29yZCwgcmVsZWFzaW5nIHNlc3Npb24gaWQgJWQiLAorICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQpOworICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIC0xIC8qcGlkKi8pOwogICAgIH0KIH0KIApAQCAtMTI5LDEyICsxNDIsMTUgQEAKICAgICAgICAgaW50IHNlc3Npb25JZCwKICAgICAgICAgdHJhbnNmZXJfdHlwZSB0cmFuc2ZlclR5cGUsCiAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIGludCB1aWQsCisgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcykKIHsKICAgICBBTE9HVigic2V0KCk6IGlucHV0U291cmNlICVkLCBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXp1LCAiCi0gICAgICAgICAgIm5vdGlmaWNhdGlvbkZyYW1lcyAldSwgc2Vzc2lvbklkICVkLCB0cmFuc2ZlclR5cGUgJWQsIGZsYWdzICUjeCIsCisgICAgICAgICAgIm5vdGlmaWNhdGlvbkZyYW1lcyAldSwgc2Vzc2lvbklkICVkLCB0cmFuc2ZlclR5cGUgJWQsIGZsYWdzICUjeCwgb3BQYWNrYWdlTmFtZSAlcyAiCisgICAgICAgICAgInVpZCAlZCwgcGlkICVkIiwKICAgICAgICAgICBpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgbm90aWZpY2F0aW9uRnJhbWVzLAotICAgICAgICAgIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBmbGFncyk7CisgICAgICAgICAgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIGZsYWdzLCBTdHJpbmc4KG1PcFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwgdWlkLCBwaWQpOwogCiAgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKICAgICBjYXNlIFRSQU5TRkVSX0RFRkFVTFQ6CkBAIC0xNTksOCArMTc1LDYgQEAKICAgICB9CiAgICAgbVRyYW5zZmVyID0gdHJhbnNmZXJUeXBlOwogCi0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwotCiAgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvUmVjb3JkICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1JlY29yZCAhPSAwKSB7CiAgICAgICAgIEFMT0dFKCJUcmFjayBhbHJlYWR5IGluIHVzZSIpOwpAQCAtMTg5LDEzICsyMDMsOSBAQAogICAgIH0KIAogICAgIC8vIHZhbGlkYXRlIHBhcmFtZXRlcnMKLSAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGZvcm1hdCAlI3giLCBmb3JtYXQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICAvLyBUZW1wb3JhcnkgcmVzdHJpY3Rpb246IEF1ZGlvRmxpbmdlciBjdXJyZW50bHkgc3VwcG9ydHMgMTYtYml0IFBDTSBvbmx5Ci0gICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICBBTE9HRSgiRm9ybWF0ICUjeCBpcyBub3Qgc3VwcG9ydGVkIiwgZm9ybWF0KTsKKyAgICAvLyBBdWRpb0ZsaW5nZXIgY2FwdHVyZSBvbmx5IHN1cHBvcnRzIGxpbmVhciBQQ00KKyAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpIHx8ICFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKKyAgICAgICAgQUxPR0UoIkZvcm1hdCAlI3ggaXMgbm90IGxpbmVhciBwY20iLCBmb3JtYXQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBtRm9ybWF0ID0gZm9ybWF0OwpAQCAtMjI3LDE2ICsyMzcsMzAgQEAKICAgICB9CiAgICAgQUxPR1YoInNldCgpOiBtU2Vzc2lvbklkICVkIiwgbVNlc3Npb25JZCk7CiAKKyAgICBpbnQgY2FsbGluZ3BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgbXlwaWQgPSBnZXRwaWQoKTsKKyAgICBpZiAodWlkID09IC0xIHx8IChjYWxsaW5ncGlkICE9IG15cGlkKSkgeworICAgICAgICBtQ2xpZW50VWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1DbGllbnRVaWQgPSB1aWQ7CisgICAgfQorICAgIGlmIChwaWQgPT0gLTEgfHwgKGNhbGxpbmdwaWQgIT0gbXlwaWQpKSB7CisgICAgICAgIG1DbGllbnRQaWQgPSBjYWxsaW5ncGlkOworICAgIH0gZWxzZSB7CisgICAgICAgIG1DbGllbnRQaWQgPSBwaWQ7CisgICAgfQorCiAgICAgbUZsYWdzID0gZmxhZ3M7CiAgICAgbUNiZiA9IGNiZjsKIAogICAgIGlmIChjYmYgIT0gTlVMTCkgewogICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQgPSBuZXcgQXVkaW9SZWNvcmRUaHJlYWQoKnRoaXMsIHRocmVhZENhbkNhbGxKYXZhKTsKICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLT5ydW4oIkF1ZGlvUmVjb3JkIiwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CisgICAgICAgIC8vIHRocmVhZCBiZWdpbnMgaW4gcGF1c2VkIHN0YXRlLCBhbmQgd2lsbCBub3QgcmVmZXJlbmNlIHVzIHVudGlsIHN0YXJ0KCkKICAgICB9CiAKICAgICAvLyBjcmVhdGUgdGhlIElBdWRpb1JlY29yZAotICAgIHN0YXR1c190IHN0YXR1cyA9IG9wZW5SZWNvcmRfbCgwIC8qZXBvY2gqLyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3BlblJlY29yZF9sKDAgLyplcG9jaCovLCBtT3BQYWNrYWdlTmFtZSk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIGlmIChtQXVkaW9SZWNvcmRUaHJlYWQgIT0gMCkgewpAQCAtMjg0LDkgKzMwOCwxMCBAQAogICAgIG1OZXdQb3NpdGlvbiA9IG1Qcm94eS0+Z2V0UG9zaXRpb24oKSArIG1VcGRhdGVQZXJpb2Q7CiAgICAgaW50MzJfdCBmbGFncyA9IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmbUNibGstPm1GbGFncyk7CiAKKyAgICBtQWN0aXZlID0gdHJ1ZTsKKwogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIGlmICghKGZsYWdzICYgQ0JMS19JTlZBTElEKSkgewotICAgICAgICBBTE9HVigibUF1ZGlvUmVjb3JkLT5zdGFydCgpIik7CiAgICAgICAgIHN0YXR1cyA9IG1BdWRpb1JlY29yZC0+c3RhcnQoZXZlbnQsIHRyaWdnZXJTZXNzaW9uKTsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBERUFEX09CSkVDVCkgewogICAgICAgICAgICAgZmxhZ3MgfD0gQ0JMS19JTlZBTElEOwpAQCAtMjk3LDkgKzMyMiw5IEBACiAgICAgfQogCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBtQWN0aXZlID0gZmFsc2U7CiAgICAgICAgIEFMT0dFKCJzdGFydCgpIHN0YXR1cyAlZCIsIHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbUFjdGl2ZSA9IHRydWU7CiAgICAgICAgIHNwPEF1ZGlvUmVjb3JkVGhyZWFkPiB0ID0gbUF1ZGlvUmVjb3JkVGhyZWFkOwogICAgICAgICBpZiAodCAhPSAwKSB7CiAgICAgICAgICAgICB0LT5yZXN1bWUoKTsKQEAgLTM1Miw2ICszNzcsMTAgQEAKICAgICBtTWFya2VyUG9zaXRpb24gPSBtYXJrZXI7CiAgICAgbU1hcmtlclJlYWNoZWQgPSBmYWxzZTsKIAorICAgIHNwPEF1ZGlvUmVjb3JkVGhyZWFkPiB0ID0gbUF1ZGlvUmVjb3JkVGhyZWFkOworICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgdC0+d2FrZSgpOworICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTM3OCw2ICs0MDcsMTAgQEAKICAgICBtTmV3UG9zaXRpb24gPSBtUHJveHktPmdldFBvc2l0aW9uKCkgKyB1cGRhdGVQZXJpb2Q7CiAgICAgbVVwZGF0ZVBlcmlvZCA9IHVwZGF0ZVBlcmlvZDsKIAorICAgIHNwPEF1ZGlvUmVjb3JkVGhyZWFkPiB0ID0gbUF1ZGlvUmVjb3JkVGhyZWFkOworICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgdC0+d2FrZSgpOworICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTQwOCwxNSArNDQxLDQyIEBACiB1aW50MzJfdCBBdWRpb1JlY29yZDo6Z2V0SW5wdXRGcmFtZXNMb3N0KCkgY29uc3QKIHsKICAgICAvLyBubyBuZWVkIHRvIGNoZWNrIG1BY3RpdmUsIGJlY2F1c2UgaWYgaW5hY3RpdmUgdGhpcyB3aWxsIHJldHVybiAwLCB3aGljaCBpcyB3aGF0IHdlIHdhbnQKLSAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmdldElucHV0RnJhbWVzTG9zdChnZXRJbnB1dCgpKTsKKyAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmdldElucHV0RnJhbWVzTG9zdChnZXRJbnB1dFByaXZhdGUoKSk7Cit9CisKKy8vIC0tLS0gRXhwbGljaXQgUm91dGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXR1c190IEF1ZGlvUmVjb3JkOjpzZXRJbnB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIGlmIChtU2VsZWN0ZWREZXZpY2VJZCAhPSBkZXZpY2VJZCkgeworICAgICAgICBtU2VsZWN0ZWREZXZpY2VJZCA9IGRldmljZUlkOworICAgICAgICAvLyBzdG9wIGNhcHR1cmUgc28gdGhhdCBhdWRpbyBwb2xpY3kgbWFuYWdlciBkb2VzIG5vdCByZWplY3QgdGhlIG5ldyBpbnN0YW5jZSBzdGFydCByZXF1ZXN0CisgICAgICAgIC8vIGFzIG9ubHkgb25lIGNhcHR1cmUgY2FuIGJlIGFjdGl2ZSBhdCBhIHRpbWUuCisgICAgICAgIGlmIChtQXVkaW9SZWNvcmQgIT0gMCAmJiBtQWN0aXZlKSB7CisgICAgICAgICAgICBtQXVkaW9SZWNvcmQtPnN0b3AoKTsKKyAgICAgICAgfQorICAgICAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX0lOVkFMSUQsICZtQ2Jsay0+bUZsYWdzKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCithdWRpb19wb3J0X2hhbmRsZV90IEF1ZGlvUmVjb3JkOjpnZXRJbnB1dERldmljZSgpIHsKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1TZWxlY3RlZERldmljZUlkOworfQorCithdWRpb19wb3J0X2hhbmRsZV90IEF1ZGlvUmVjb3JkOjpnZXRSb3V0ZWREZXZpY2VJZCgpIHsKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgaWYgKG1JbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VJZEZvcklvKG1JbnB1dCk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gbXVzdCBiZSBjYWxsZWQgd2l0aCBtTG9jayBoZWxkCi1zdGF0dXNfdCBBdWRpb1JlY29yZDo6b3BlblJlY29yZF9sKHNpemVfdCBlcG9jaCkKK3N0YXR1c190IEF1ZGlvUmVjb3JkOjpvcGVuUmVjb3JkX2woc2l6ZV90IGVwb2NoLCBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSkKIHsKLSAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhdWRpb0ZsaW5nZXIgPT0gMCkgewogICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBhdWRpb2ZsaW5nZXIiKTsKQEAgLTQzMSwxMiArNDkxLDE2IEBACiAgICAgfQogCiAgICAgLy8gQ2xpZW50IGNhbiBvbmx5IGV4cHJlc3MgYSBwcmVmZXJlbmNlIGZvciBGQVNULiAgU2VydmVyIHdpbGwgcGVyZm9ybSBhZGRpdGlvbmFsIHRlc3RzLgotICAgIGlmICgobUZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSAmJiAhKAotICAgICAgICAgICAgLy8gdXNlIGNhc2U6IGNhbGxiYWNrIHRyYW5zZmVyIG1vZGUKLSAgICAgICAgICAgIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfQ0FMTEJBQ0spICYmCisgICAgaWYgKChtRmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpICYmICEoKAorICAgICAgICAgICAgLy8gZWl0aGVyIG9mIHRoZXNlIHVzZSBjYXNlczoKKyAgICAgICAgICAgIC8vIHVzZSBjYXNlIDE6IGNhbGxiYWNrIHRyYW5zZmVyIG1vZGUKKyAgICAgICAgICAgIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfQ0FMTEJBQ0spIHx8CisgICAgICAgICAgICAvLyB1c2UgY2FzZSAyOiBvYnRhaW4vcmVsZWFzZSBtb2RlCisgICAgICAgICAgICAobVRyYW5zZmVyID09IFRSQU5TRkVSX09CVEFJTikpICYmCiAgICAgICAgICAgICAvLyBtYXRjaGluZyBzYW1wbGUgcmF0ZQogICAgICAgICAgICAgKG1TYW1wbGVSYXRlID09IGFmU2FtcGxlUmF0ZSkpKSB7Ci0gICAgICAgIEFMT0dXKCJBVURJT19JTlBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IGNsaWVudCIpOworICAgICAgICBBTE9HVygiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCBieSBjbGllbnQ7IHRyYW5zZmVyICVkLCB0cmFjayAldSBIeiwgcHJpbWFyeSAldSBIeiIsCisgICAgICAgICAgICAgICAgbVRyYW5zZmVyLCBtU2FtcGxlUmF0ZSwgYWZTYW1wbGVSYXRlKTsKICAgICAgICAgLy8gb25jZSBkZW5pZWQsIGRvIG5vdCByZXF1ZXN0IGFnYWluIGlmIElBdWRpb1JlY29yZCBpcyByZS1jcmVhdGVkCiAgICAgICAgIG1GbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX0lOUFVUX0ZMQUdfRkFTVCk7CiAgICAgfQpAQCAtNDUxLDkgKzUxNSwxNiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwICYmIG1JbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2ssIG1JbnB1dCk7CisgICAgfQorCiAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQ7Ci0gICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldElucHV0Rm9yQXR0cigmbUF0dHJpYnV0ZXMsICZpbnB1dCwgKGF1ZGlvX3Nlc3Npb25fdCltU2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1GbGFncyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldElucHV0Rm9yQXR0cigmbUF0dHJpYnV0ZXMsICZpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc2Vzc2lvbl90KW1TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzLCBtU2VsZWN0ZWREZXZpY2VJZCk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvIGlucHV0IGZvciByZWNvcmQgc291cmNlICVkLCBzYW1wbGUgcmF0ZSAldSwgZm9ybWF0ICUjeCwgIgpAQCAtNDc2LDExICs1NDcsMTQgQEAKICAgICBzcDxJTWVtb3J5PiBpTWVtOyAgICAgICAgICAgLy8gZm9yIGNibGsKICAgICBzcDxJTWVtb3J5PiBidWZmZXJNZW07CiAgICAgc3A8SUF1ZGlvUmVjb3JkPiByZWNvcmQgPSBhdWRpb0ZsaW5nZXItPm9wZW5SZWNvcmQoaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlNZW0sCkBAIC01NzcsNiArNjUxLDEwIEBACiAgICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcih0aGlzKTsKICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQXVkaW9SZWNvcmQpLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAKKyAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDApIHsKKyAgICAgICAgQXVkaW9TeXN0ZW06OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLCBtSW5wdXQpOworICAgIH0KKwogICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKQEAgLTU4OCwxNSArNjY2LDIxIEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgQXVkaW9SZWNvcmQ6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGF1ZGlvQnVmZmVyLCBpbnQzMl90IHdhaXRDb3VudCkKK3N0YXR1c190IEF1ZGlvUmVjb3JkOjpvYnRhaW5CdWZmZXIoQnVmZmVyKiBhdWRpb0J1ZmZlciwgaW50MzJfdCB3YWl0Q291bnQsIHNpemVfdCAqbm9uQ29udGlnKQogewogICAgIGlmIChhdWRpb0J1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIGlmIChub25Db250aWcgIT0gTlVMTCkgeworICAgICAgICAgICAgKm5vbkNvbnRpZyA9IDA7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9PQlRBSU4pIHsKICAgICAgICAgYXVkaW9CdWZmZXItPmZyYW1lQ291bnQgPSAwOwogICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IDA7CiAgICAgICAgIGF1ZGlvQnVmZmVyLT5yYXcgPSBOVUxMOworICAgICAgICBpZiAobm9uQ29udGlnICE9IE5VTEwpIHsKKyAgICAgICAgICAgICpub25Db250aWcgPSAwOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTYxNSw3ICs2OTksNyBAQAogICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCB3YWl0Q291bnQgJWQiLCBfX2Z1bmNfXywgd2FpdENvdW50KTsKICAgICAgICAgcmVxdWVzdGVkID0gTlVMTDsKICAgICB9Ci0gICAgcmV0dXJuIG9idGFpbkJ1ZmZlcihhdWRpb0J1ZmZlciwgcmVxdWVzdGVkKTsKKyAgICByZXR1cm4gb2J0YWluQnVmZmVyKGF1ZGlvQnVmZmVyLCByZXF1ZXN0ZWQsIE5VTEwgLyplbGFwc2VkKi8sIG5vbkNvbnRpZyk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpvYnRhaW5CdWZmZXIoQnVmZmVyKiBhdWRpb0J1ZmZlciwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICpyZXF1ZXN0ZWQsCkBAIC02ODQsOSArNzY4LDkgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi12b2lkIEF1ZGlvUmVjb3JkOjpyZWxlYXNlQnVmZmVyKEJ1ZmZlciogYXVkaW9CdWZmZXIpCit2b2lkIEF1ZGlvUmVjb3JkOjpyZWxlYXNlQnVmZmVyKGNvbnN0IEJ1ZmZlciogYXVkaW9CdWZmZXIpCiB7Ci0gICAgLy8gYWxsIFRSQU5TRkVSXyogYXJlIHZhbGlkCisgICAgLy8gRklYTUUgYWRkIGVycm9yIGNoZWNraW5nIG9uIG1vZGUsIGJ5IGFkZGluZyBhbiBpbnRlcm5hbCB2ZXJzaW9uCiAKICAgICBzaXplX3Qgc3RlcENvdW50ID0gYXVkaW9CdWZmZXItPnNpemUgLyBtRnJhbWVTaXplOwogICAgIGlmIChzdGVwQ291bnQgPT0gMCkgewpAQCAtNzA0LDcgKzc4OCw3IEBACiAgICAgLy8gdGhlIHNlcnZlciBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IGRpc2FibGUgcmVjb3JkZXIgb24gb3ZlcnJ1biwgc28gbm8gbmVlZCB0byByZXN0YXJ0CiB9CiAKLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUmVjb3JkOjpnZXRJbnB1dCgpIGNvbnN0CithdWRpb19pb19oYW5kbGVfdCBBdWRpb1JlY29yZDo6Z2V0SW5wdXRQcml2YXRlKCkgY29uc3QKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgcmV0dXJuIG1JbnB1dDsKQEAgLTcxMiw3ICs3OTYsNyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXNzaXplX3QgQXVkaW9SZWNvcmQ6OnJlYWQodm9pZCogYnVmZmVyLCBzaXplX3QgdXNlclNpemUpCitzc2l6ZV90IEF1ZGlvUmVjb3JkOjpyZWFkKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHVzZXJTaXplLCBib29sIGJsb2NraW5nKQogewogICAgIGlmIChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC03MzEsNyArODE1LDggQEAKICAgICB3aGlsZSAodXNlclNpemUgPj0gbUZyYW1lU2l6ZSkgewogICAgICAgICBhdWRpb0J1ZmZlci5mcmFtZUNvdW50ID0gdXNlclNpemUgLyBtRnJhbWVTaXplOwogCi0gICAgICAgIHN0YXR1c190IGVyciA9IG9idGFpbkJ1ZmZlcigmYXVkaW9CdWZmZXIsICZDbGllbnRQcm94eTo6a0ZvcmV2ZXIpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBvYnRhaW5CdWZmZXIoJmF1ZGlvQnVmZmVyLAorICAgICAgICAgICAgICAgIGJsb2NraW5nID8gJkNsaWVudFByb3h5OjprRm9yZXZlciA6ICZDbGllbnRQcm94eTo6a05vbkJsb2NraW5nKTsKICAgICAgICAgaWYgKGVyciA8IDApIHsKICAgICAgICAgICAgIGlmIChyZWFkID4gMCkgewogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtODYzLDggKzk0OCwxMSBAQAogICAgIGlmICghbWFya2VyUmVhY2hlZCAmJiBwb3NpdGlvbiA8IG1hcmtlclBvc2l0aW9uKSB7CiAgICAgICAgIG1pbkZyYW1lcyA9IG1hcmtlclBvc2l0aW9uIC0gcG9zaXRpb247CiAgICAgfQotICAgIGlmICh1cGRhdGVQZXJpb2QgPiAwICYmIHVwZGF0ZVBlcmlvZCA8IG1pbkZyYW1lcykgewotICAgICAgICBtaW5GcmFtZXMgPSB1cGRhdGVQZXJpb2Q7CisgICAgaWYgKHVwZGF0ZVBlcmlvZCA+IDApIHsKKyAgICAgICAgdWludDMyX3QgcmVtYWluaW5nID0gbmV3UG9zaXRpb24gLSBwb3NpdGlvbjsKKyAgICAgICAgaWYgKHJlbWFpbmluZyA8IG1pbkZyYW1lcykgeworICAgICAgICAgICAgbWluRnJhbWVzID0gcmVtYWluaW5nOworICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gSWYgPiAwLCBwb2xsIHBlcmlvZGljYWxseSB0byByZWNvdmVyIGZyb20gYSBzdHVjayBzZXJ2ZXIuICBBIGdvb2QgdmFsdWUgaXMgMi4KQEAgLTk5MCwxNCArMTA3OCwxMyBAQAogewogICAgIEFMT0dXKCJkZWFkIElBdWRpb1JlY29yZCwgY3JlYXRpbmcgYSBuZXcgb25lIGZyb20gJXMoKSIsIGZyb20pOwogICAgICsrbVNlcXVlbmNlOwotICAgIHN0YXR1c190IHJlc3VsdDsKIAogICAgIC8vIGlmIHRoZSBuZXcgSUF1ZGlvUmVjb3JkIGlzIGNyZWF0ZWQsIG9wZW5SZWNvcmRfbCgpIHdpbGwgbW9kaWZ5IHRoZQogICAgIC8vIGZvbGxvd2luZyBtZW1iZXIgdmFyaWFibGVzOiBtQXVkaW9SZWNvcmQsIG1DYmxrTWVtb3J5LCBtQ2JsaywgbUJ1ZmZlck1lbW9yeS4KICAgICAvLyBJdCB3aWxsIGFsc28gZGVsZXRlIHRoZSBzdHJvbmcgcmVmZXJlbmNlcyBvbiBwcmV2aW91cyBJQXVkaW9SZWNvcmQgYW5kIElNZW1vcnkKICAgICBzaXplX3QgcG9zaXRpb24gPSBtUHJveHktPmdldFBvc2l0aW9uKCk7CiAgICAgbU5ld1Bvc2l0aW9uID0gcG9zaXRpb24gKyBtVXBkYXRlUGVyaW9kOwotICAgIHJlc3VsdCA9IG9wZW5SZWNvcmRfbChwb3NpdGlvbik7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gb3BlblJlY29yZF9sKHBvc2l0aW9uLCBtT3BQYWNrYWdlTmFtZSk7CiAgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewogICAgICAgICBpZiAobUFjdGl2ZSkgewogICAgICAgICAgICAgLy8gY2FsbGJhY2sgdGhyZWFkIG9yIHN5bmMgZXZlbnQgaGFzbid0IGNoYW5nZWQKQEAgLTEwMTMsNiArMTEwMCw0OCBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXR1c190IEF1ZGlvUmVjb3JkOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spCit7CisgICAgaWYgKGNhbGxiYWNrID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzIGFkZGluZyBOVUxMIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobURldmljZUNhbGxiYWNrID09IGNhbGxiYWNrKSB7CisgICAgICAgIEFMT0dXKCIlcyBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGlmIChtSW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVygiJXMgY2FsbGJhY2sgYWxyZWFkeSBwcmVzZW50ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2ssIG1JbnB1dCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY2FsbGJhY2ssIG1JbnB1dCk7CisgICAgfQorICAgIG1EZXZpY2VDYWxsYmFjayA9IGNhbGxiYWNrOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUmVjb3JkOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKAorICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKQoreworICAgIGlmIChjYWxsYmFjayA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlcyByZW1vdmluZyBOVUxMIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobURldmljZUNhbGxiYWNrICE9IGNhbGxiYWNrKSB7CisgICAgICAgIEFMT0dXKCIlcyByZW1vdmluZyBkaWZmZXJlbnQgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBpZiAobUlucHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjaywgbUlucHV0KTsKKyAgICB9CisgICAgbURldmljZUNhbGxiYWNrID0gMDsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogdm9pZCBBdWRpb1JlY29yZDo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQpAQCAtMTA2OSw4ICsxMTk4LDggQEAKICAgICBjYXNlIE5TX05FVkVSOgogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgY2FzZSBOU19XSEVORVZFUjoKLSAgICAgICAgLy8gRklYTUUgaW5jcmVhc2UgcG9sbCBpbnRlcnZhbCwgb3IgbWFrZSBldmVudC1kcml2ZW4KLSAgICAgICAgbnMgPSAxMDAwMDAwMDAwTEw7CisgICAgICAgIC8vIEV2ZW50IGRyaXZlbjogY2FsbCB3YWtlKCkgd2hlbiBjYWxsYmFjayBub3RpZmljYXRpb25zIGNvbmRpdGlvbnMgY2hhbmdlLgorICAgICAgICBucyA9IElOVDY0X01BWDsKICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCiAgICAgZGVmYXVsdDoKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihucyA8IDAsICJwcm9jZXNzQXVkaW9CdWZmZXIoKSByZXR1cm5lZCAlIiBQUklkNjQsIG5zKTsKQEAgLTExMDMsNiArMTIzMiwyMSBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb1JlY29yZDo6QXVkaW9SZWNvcmRUaHJlYWQ6Ondha2UoKQoreworICAgIEF1dG9NdXRleCBfbChtTXlMb2NrKTsKKyAgICBpZiAoIW1QYXVzZWQpIHsKKyAgICAgICAgLy8gd2FrZSgpIG1pZ2h0IGJlIGNhbGxlZCB3aGlsZSBzZXJ2aWNpbmcgYSBjYWxsYmFjayAtIGlnbm9yZSB0aGUgbmV4dAorICAgICAgICAvLyBwYXVzZSB0aW1lIGFuZCBjYWxsIHByb2Nlc3NBdWRpb0J1ZmZlci4KKyAgICAgICAgbUlnbm9yZU5leHRQYXVzZWRJbnQgPSB0cnVlOworICAgICAgICBpZiAobVBhdXNlZEludCAmJiBtUGF1c2VkTnMgPiAwKSB7CisgICAgICAgICAgICAvLyBhdWRpbyByZWNvcmQgaXMgYWN0aXZlIGFuZCBpbnRlcm5hbGx5IHBhdXNlZCB3aXRoIHRpbWVvdXQuCisgICAgICAgICAgICBtUGF1c2VkSW50ID0gZmFsc2U7CisgICAgICAgICAgICBtTXlDb25kLnNpZ25hbCgpOworICAgICAgICB9CisgICAgfQorfQorCiB2b2lkIEF1ZGlvUmVjb3JkOjpBdWRpb1JlY29yZFRocmVhZDo6cGF1c2VJbnRlcm5hbChuc2Vjc190IG5zKQogewogICAgIEF1dG9NdXRleCBfbChtTXlMb2NrKTsKQEAgLTExMTIsNCArMTI1Niw0IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvU3lzdGVtLmNwcAppbmRleCA5Y2FlMjFjLi4zYmZiMDlhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQXVkaW9TeXN0ZW0uY3BwCkBAIC0zMiwyMyArMzIsMTIgQEAKIAogLy8gY2xpZW50IHNpbmdsZXRvbiBmb3IgQXVkaW9GbGluZ2VyIGJpbmRlciBpbnRlcmZhY2UKIE11dGV4IEF1ZGlvU3lzdGVtOjpnTG9jazsKLU11dGV4IEF1ZGlvU3lzdGVtOjpnTG9ja0NhY2hlOwogTXV0ZXggQXVkaW9TeXN0ZW06OmdMb2NrQVBTOwotTXV0ZXggQXVkaW9TeXN0ZW06OmdMb2NrQVBDOwogc3A8SUF1ZGlvRmxpbmdlcj4gQXVkaW9TeXN0ZW06OmdBdWRpb0ZsaW5nZXI7CiBzcDxBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50PiBBdWRpb1N5c3RlbTo6Z0F1ZGlvRmxpbmdlckNsaWVudDsKIGF1ZGlvX2Vycm9yX2NhbGxiYWNrIEF1ZGlvU3lzdGVtOjpnQXVkaW9FcnJvckNhbGxiYWNrID0gTlVMTDsKK2R5bmFtaWNfcG9saWN5X2NhbGxiYWNrIEF1ZGlvU3lzdGVtOjpnRHluUG9saWN5Q2FsbGJhY2sgPSBOVUxMOwogCi0vLyBDYWNoZWQgdmFsdWVzIGZvciBvdXRwdXQgaGFuZGxlcwotRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBBdWRpb1N5c3RlbTo6T3V0cHV0RGVzY3JpcHRvciAqPiBBdWRpb1N5c3RlbTo6Z091dHB1dHMoTlVMTCk7Ci0KLS8vIENhY2hlZCB2YWx1ZXMgZm9yIHJlY29yZGluZyBxdWVyaWVzLCBhbGwgcHJvdGVjdGVkIGJ5IGdMb2NrCi11aW50MzJfdCBBdWRpb1N5c3RlbTo6Z1ByZXZJblNhbXBsaW5nUmF0ZTsKLWF1ZGlvX2Zvcm1hdF90IEF1ZGlvU3lzdGVtOjpnUHJldkluRm9ybWF0OwotYXVkaW9fY2hhbm5lbF9tYXNrX3QgQXVkaW9TeXN0ZW06OmdQcmV2SW5DaGFubmVsTWFzazsKLXNpemVfdCBBdWRpb1N5c3RlbTo6Z0luQnVmZlNpemUgPSAwOyAgICAvLyB6ZXJvIGluZGljYXRlcyBjYWNoZSBpcyBpbnZhbGlkCi0KLXNwPEF1ZGlvU3lzdGVtOjpBdWRpb1BvcnRDYWxsYmFjaz4gQXVkaW9TeXN0ZW06OmdBdWRpb1BvcnRDYWxsYmFjazsKIAogLy8gZXN0YWJsaXNoIGJpbmRlciBpbnRlcmZhY2UgdG8gQXVkaW9GbGluZ2VyIHNlcnZpY2UKIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpCkBAIC04Nyw2ICs3NiwyNSBAQAogICAgIHJldHVybiBhZjsKIH0KIAorY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRmxpbmdlckNsaWVudD4gQXVkaW9TeXN0ZW06OmdldEF1ZGlvRmxpbmdlckNsaWVudCgpCit7CisgICAgLy8gY2FsbGluZyBnZXRfYXVkaW9fZmxpbmdlcigpIHdpbGwgaW5pdGlhbGl6ZSBnQXVkaW9GbGluZ2VyQ2xpZW50IGlmIG5lZWRlZAorICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gMDsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOworICAgIHJldHVybiBnQXVkaW9GbGluZ2VyQ2xpZW50OworfQorCitzcDxBdWRpb0lvRGVzY3JpcHRvcj4gQXVkaW9TeXN0ZW06OmdldElvRGVzY3JpcHRvcihhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkKK3sKKyAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gZGVzYzsKKyAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXJDbGllbnQ+IGFmYyA9IGdldEF1ZGlvRmxpbmdlckNsaWVudCgpOworICAgIGlmIChhZmMgIT0gMCkgeworICAgICAgICBkZXNjID0gYWZjLT5nZXRJb0Rlc2NyaXB0b3IoaW9IYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gZGVzYzsKK30KKwogLyogc3RhdGljICovIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpjaGVja0F1ZGlvRmxpbmdlcigpCiB7CiAgICAgaWYgKGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5jaGVja1NlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmF1ZGlvX2ZsaW5nZXIiKSkgIT0gMCkgewpAQCAtMjYwLDE4ICsyNjgsMTMgQEAKIHsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrQ2FjaGUpOwotCi0gICAgT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyA9IEF1ZGlvU3lzdGVtOjpnT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgIGlmIChvdXRwdXREZXNjID09IE5VTEwpIHsKKyAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IGdldElvRGVzY3JpcHRvcihvdXRwdXQpOworICAgIGlmIChvdXRwdXREZXNjID09IDApIHsKICAgICAgICAgQUxPR1YoImdldE91dHB1dFNhbXBsaW5nUmF0ZSgpIG5vIG91dHB1dCBkZXNjcmlwdG9yIGZvciBvdXRwdXQgJWQgaW4gZ091dHB1dHMiLCBvdXRwdXQpOwotICAgICAgICBnTG9ja0NhY2hlLnVubG9jaygpOwogICAgICAgICAqc2FtcGxpbmdSYXRlID0gYWYtPnNhbXBsZVJhdGUob3V0cHV0KTsKLSAgICAgICAgZ0xvY2tDYWNoZS5sb2NrKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoImdldE91dHB1dFNhbXBsaW5nUmF0ZSgpIHJlYWRpbmcgZnJvbSBvdXRwdXQgZGVzYyIpOwotICAgICAgICAqc2FtcGxpbmdSYXRlID0gb3V0cHV0RGVzYy0+c2FtcGxpbmdSYXRlOworICAgICAgICAqc2FtcGxpbmdSYXRlID0gb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZTsKICAgICB9CiAgICAgaWYgKCpzYW1wbGluZ1JhdGUgPT0gMCkgewogICAgICAgICBBTE9HRSgiQXVkaW9TeXN0ZW06OmdldFNhbXBsaW5nUmF0ZSBmYWlsZWQgZm9yIG91dHB1dCAlZCIsIG91dHB1dCk7CkBAIC0zMDQsMTYgKzMwNywxMSBAQAogewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2tDYWNoZSk7Ci0KLSAgICBPdXRwdXREZXNjcmlwdG9yICpvdXRwdXREZXNjID0gQXVkaW9TeXN0ZW06OmdPdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgaWYgKG91dHB1dERlc2MgPT0gTlVMTCkgewotICAgICAgICBnTG9ja0NhY2hlLnVubG9jaygpOworICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gZ2V0SW9EZXNjcmlwdG9yKG91dHB1dCk7CisgICAgaWYgKG91dHB1dERlc2MgPT0gMCkgewogICAgICAgICAqZnJhbWVDb3VudCA9IGFmLT5mcmFtZUNvdW50KG91dHB1dCk7Ci0gICAgICAgIGdMb2NrQ2FjaGUubG9jaygpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgICpmcmFtZUNvdW50ID0gb3V0cHV0RGVzYy0+ZnJhbWVDb3VudDsKKyAgICAgICAgKmZyYW1lQ291bnQgPSBvdXRwdXREZXNjLT5tRnJhbWVDb3VudDsKICAgICB9CiAgICAgaWYgKCpmcmFtZUNvdW50ID09IDApIHsKICAgICAgICAgQUxPR0UoIkF1ZGlvU3lzdGVtOjpnZXRGcmFtZUNvdW50IGZhaWxlZCBmb3Igb3V0cHV0ICVkIiwgb3V0cHV0KTsKQEAgLTM0NiwxNiArMzQ0LDExIEBACiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9ja0NhY2hlKTsKLQotICAgIE91dHB1dERlc2NyaXB0b3IgKm91dHB1dERlc2MgPSBBdWRpb1N5c3RlbTo6Z091dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgIGdMb2NrQ2FjaGUudW5sb2NrKCk7CisgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBnZXRJb0Rlc2NyaXB0b3Iob3V0cHV0KTsKKyAgICBpZiAob3V0cHV0RGVzYyA9PSAwKSB7CiAgICAgICAgICpsYXRlbmN5ID0gYWYtPmxhdGVuY3kob3V0cHV0KTsKLSAgICAgICAgZ0xvY2tDYWNoZS5sb2NrKCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgKmxhdGVuY3kgPSBvdXRwdXREZXNjLT5sYXRlbmN5OworICAgICAgICAqbGF0ZW5jeSA9IG91dHB1dERlc2MtPm1MYXRlbmN5OwogICAgIH0KIAogICAgIEFMT0dWKCJnZXRMYXRlbmN5KCkgb3V0cHV0ICVkLCBsYXRlbmN5ICVkIiwgb3V0cHV0LCAqbGF0ZW5jeSk7CkBAIC0zNjYsMzQgKzM1OSwxMSBAQAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldElucHV0QnVmZmVyU2l6ZSh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBzaXplX3QqIGJ1ZmZTaXplKQogewotICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwotICAgIGlmIChhZiA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXJDbGllbnQ+IGFmYyA9IGdldEF1ZGlvRmxpbmdlckNsaWVudCgpOworICAgIGlmIChhZmMgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrQ2FjaGUpOwotICAgIC8vIERvIHdlIGhhdmUgYSBzdGFsZSBnSW5CdWZmZXJTaXplIG9yIGFyZSB3ZSByZXF1ZXN0aW5nIHRoZSBpbnB1dCBidWZmZXIgc2l6ZSBmb3IgbmV3IHZhbHVlcwotICAgIHNpemVfdCBpbkJ1ZmZTaXplID0gZ0luQnVmZlNpemU7Ci0gICAgaWYgKChpbkJ1ZmZTaXplID09IDApIHx8IChzYW1wbGVSYXRlICE9IGdQcmV2SW5TYW1wbGluZ1JhdGUpIHx8IChmb3JtYXQgIT0gZ1ByZXZJbkZvcm1hdCkKLSAgICAgICAgfHwgKGNoYW5uZWxNYXNrICE9IGdQcmV2SW5DaGFubmVsTWFzaykpIHsKLSAgICAgICAgZ0xvY2tDYWNoZS51bmxvY2soKTsKLSAgICAgICAgaW5CdWZmU2l6ZSA9IGFmLT5nZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7Ci0gICAgICAgIGdMb2NrQ2FjaGUubG9jaygpOwotICAgICAgICBpZiAoaW5CdWZmU2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQXVkaW9TeXN0ZW06OmdldElucHV0QnVmZmVyU2l6ZSBmYWlsZWQgc2FtcGxlUmF0ZSAlZCBmb3JtYXQgJSN4IGNoYW5uZWxNYXNrICV4IiwKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIC8vIEEgYmVuaWduIHJhY2UgaXMgcG9zc2libGUgaGVyZTogd2UgY291bGQgb3ZlcndyaXRlIGEgZnJlc2hlciBjYWNoZSBlbnRyeQotICAgICAgICAvLyBzYXZlIHRoZSByZXF1ZXN0IHBhcmFtcwotICAgICAgICBnUHJldkluU2FtcGxpbmdSYXRlID0gc2FtcGxlUmF0ZTsKLSAgICAgICAgZ1ByZXZJbkZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgZ1ByZXZJbkNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7Ci0KLSAgICAgICAgZ0luQnVmZlNpemUgPSBpbkJ1ZmZTaXplOwotICAgIH0KLSAgICAqYnVmZlNpemUgPSBpbkJ1ZmZTaXplOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHJldHVybiBhZmMtPmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBidWZmU2l6ZSk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2YWx1ZSkKQEAgLTQ1Myw4ICs0MjMsMjYgQEAKICAgICByZXR1cm4gYWYtPmdldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbihzZXNzaW9uSWQpOwogfQogCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3lzdGVtUmVhZHkoKQoreworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gYWYtPnN5c3RlbVJlYWR5KCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCisKK3ZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvRmxpbmdlckNsaWVudDo6Y2xlYXJJb0NhY2hlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1Jb0Rlc2NyaXB0b3JzLmNsZWFyKCk7CisgICAgbUluQnVmZlNpemUgPSAwOworICAgIG1JblNhbXBsaW5nUmF0ZSA9IDA7CisgICAgbUluRm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CisgICAgbUluQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7Cit9CisKIHZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvRmxpbmdlckNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQogewogICAgIGF1ZGlvX2Vycm9yX2NhbGxiYWNrIGNiID0gTlVMTDsKQEAgLTQ2NCwxMSArNDUyLDggQEAKICAgICAgICAgY2IgPSBnQXVkaW9FcnJvckNhbGxiYWNrOwogICAgIH0KIAotICAgIHsKLSAgICAgICAgLy8gY2xlYXIgb3V0cHV0IGhhbmRsZXMgYW5kIHN0cmVhbSB0byBvdXRwdXQgbWFwIGNhY2hlcwotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2tDYWNoZSk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpnT3V0cHV0cy5jbGVhcigpOwotICAgIH0KKyAgICAvLyBjbGVhciBvdXRwdXQgaGFuZGxlcyBhbmQgc3RyZWFtIHRvIG91dHB1dCBtYXAgY2FjaGVzCisgICAgY2xlYXJJb0NhY2hlKCk7CiAKICAgICBpZiAoY2IpIHsKICAgICAgICAgY2IoREVBRF9PQkpFQ1QpOwpAQCAtNDc2LDc2ICs0NjEsMTkxIEBACiAgICAgQUxPR1coIkF1ZGlvRmxpbmdlciBzZXJ2ZXIgZGllZCEiKTsKIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50Ojppb0NvbmZpZ0NoYW5nZWQoaW50IGV2ZW50LCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKLSAgICAgICAgY29uc3Qgdm9pZCAqcGFyYW0yKSB7Cit2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4mIGlvRGVzYykgewogICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBldmVudCAlZCIsIGV2ZW50KTsKLSAgICBjb25zdCBPdXRwdXREZXNjcmlwdG9yICpkZXNjOwotICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtOwogCi0gICAgaWYgKGlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSByZXR1cm47CisgICAgaWYgKGlvRGVzYyA9PSAwIHx8IGlvRGVzYy0+bUlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSByZXR1cm47CiAKLSAgICBNdXRleDo6QXV0b2xvY2sgX2woQXVkaW9TeXN0ZW06OmdMb2NrQ2FjaGUpOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIFZlY3RvciA8IHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+ID4gY2FsbGJhY2tzOwogCi0gICAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgU1RSRUFNX0NPTkZJR19DSEFOR0VEOgotICAgICAgICBicmVhazsKLSAgICBjYXNlIE9VVFBVVF9PUEVORUQ6IHsKLSAgICAgICAgaWYgKGdPdXRwdXRzLmluZGV4T2ZLZXkoaW9IYW5kbGUpID49IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBvcGVuaW5nIGFscmVhZHkgZXhpc3Rpbmcgb3V0cHV0ISAlZCIsIGlvSGFuZGxlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbTIgPT0gTlVMTCkgYnJlYWs7Ci0gICAgICAgIGRlc2MgPSAoY29uc3QgT3V0cHV0RGVzY3JpcHRvciAqKXBhcmFtMjsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKLSAgICAgICAgT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyA9ICBuZXcgT3V0cHV0RGVzY3JpcHRvcigqZGVzYyk7Ci0gICAgICAgIGdPdXRwdXRzLmFkZChpb0hhbmRsZSwgb3V0cHV0RGVzYyk7Ci0gICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgb3V0cHV0IHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCBjaGFubmVsIG1hc2sgJSN4IGZyYW1lQ291bnQgJXp1ICIKLSAgICAgICAgICAgICAgICAibGF0ZW5jeSAlZCIsCi0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+c2FtcGxpbmdSYXRlLCBvdXRwdXREZXNjLT5mb3JtYXQsIG91dHB1dERlc2MtPmNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmZyYW1lQ291bnQsIG91dHB1dERlc2MtPmxhdGVuY3kpOworICAgICAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX09QRU5FRDoKKyAgICAgICAgY2FzZSBBVURJT19JTlBVVF9PUEVORUQ6IHsKKyAgICAgICAgICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBvbGREZXNjID0gZ2V0SW9EZXNjcmlwdG9yKGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChvbGREZXNjID09IDApIHsKKyAgICAgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5hZGQoaW9EZXNjLT5tSW9IYW5kbGUsIGlvRGVzYyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRldmljZUlkID0gb2xkRGVzYy0+Z2V0RGV2aWNlSWQoKTsKKyAgICAgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5yZXBsYWNlVmFsdWVGb3IoaW9EZXNjLT5tSW9IYW5kbGUsIGlvRGVzYyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpb0Rlc2MtPmdldERldmljZUlkKCkgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIGRldmljZUlkID0gaW9EZXNjLT5nZXREZXZpY2VJZCgpOworICAgICAgICAgICAgICAgIHNzaXplX3QgaW9JbmRleCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5pbmRleE9mS2V5KGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoaW9JbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcyA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy52YWx1ZUF0KGlvSW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgJXMgb3BlbmVkICVkIHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCBjaGFubmVsIG1hc2sgJSN4ICIKKyAgICAgICAgICAgICAgICAgICAgImZyYW1lQ291bnQgJXp1IGRldmljZUlkICVkIiwgZXZlbnQgPT0gQVVESU9fT1VUUFVUX09QRU5FRCA/ICJvdXRwdXQiIDogImlucHV0IiwKKyAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT5tSW9IYW5kbGUsIGlvRGVzYy0+bVNhbXBsaW5nUmF0ZSwgaW9EZXNjLT5tRm9ybWF0LCBpb0Rlc2MtPm1DaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT5tRnJhbWVDb3VudCwgaW9EZXNjLT5nZXREZXZpY2VJZCgpKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0NMT1NFRDoKKyAgICAgICAgY2FzZSBBVURJT19JTlBVVF9DTE9TRUQ6IHsKKyAgICAgICAgICAgIGlmIChnZXRJb0Rlc2NyaXB0b3IoaW9EZXNjLT5tSW9IYW5kbGUpID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiaW9Db25maWdDaGFuZ2VkKCkgY2xvc2luZyB1bmtub3duICVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBldmVudCA9PSBBVURJT19PVVRQVVRfQ0xPU0VEID8gIm91dHB1dCIgOiAiaW5wdXQiLCBpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgJXMgJWQgY2xvc2VkIiwKKyAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEFVRElPX09VVFBVVF9DTE9TRUQgPyAib3V0cHV0IiA6ICJpbnB1dCIsIGlvRGVzYy0+bUlvSGFuZGxlKTsKKworICAgICAgICAgICAgbUlvRGVzY3JpcHRvcnMucmVtb3ZlSXRlbShpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja3MucmVtb3ZlSXRlbShpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEOgorICAgICAgICBjYXNlIEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VEOiB7CisgICAgICAgICAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gb2xkRGVzYyA9IGdldElvRGVzY3JpcHRvcihpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICBpZiAob2xkRGVzYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImlvQ29uZmlnQ2hhbmdlZCgpIG1vZGlmeWluZyB1bmtub3duIG91dHB1dCEgJWQiLCBpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRldmljZUlkID0gb2xkRGVzYy0+Z2V0RGV2aWNlSWQoKTsKKyAgICAgICAgICAgIG1Jb0Rlc2NyaXB0b3JzLnJlcGxhY2VWYWx1ZUZvcihpb0Rlc2MtPm1Jb0hhbmRsZSwgaW9EZXNjKTsKKworICAgICAgICAgICAgaWYgKGRldmljZUlkICE9IGlvRGVzYy0+Z2V0RGV2aWNlSWQoKSkgeworICAgICAgICAgICAgICAgIGRldmljZUlkID0gaW9EZXNjLT5nZXREZXZpY2VJZCgpOworICAgICAgICAgICAgICAgIHNzaXplX3QgaW9JbmRleCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5pbmRleE9mS2V5KGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoaW9JbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcyA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy52YWx1ZUF0KGlvSW5kZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgY29uZmlnIGZvciAlcyAlZCBzYW1wbGluZ1JhdGUgJXUsIGZvcm1hdCAlI3ggIgorICAgICAgICAgICAgICAgICAgICAiY2hhbm5lbCBtYXNrICUjeCBmcmFtZUNvdW50ICV6dSBkZXZpY2VJZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRCA/ICJvdXRwdXQiIDogImlucHV0IiwKKyAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT5tSW9IYW5kbGUsIGlvRGVzYy0+bVNhbXBsaW5nUmF0ZSwgaW9EZXNjLT5tRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBpb0Rlc2MtPm1DaGFubmVsTWFzaywgaW9EZXNjLT5tRnJhbWVDb3VudCwgaW9EZXNjLT5nZXREZXZpY2VJZCgpKTsKKwogICAgICAgICB9IGJyZWFrOwotICAgIGNhc2UgT1VUUFVUX0NMT1NFRDogewotICAgICAgICBpZiAoZ091dHB1dHMuaW5kZXhPZktleShpb0hhbmRsZSkgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiaW9Db25maWdDaGFuZ2VkKCkgY2xvc2luZyB1bmtub3duIG91dHB1dCEgJWQiLCBpb0hhbmRsZSk7Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgb3V0cHV0ICVkIGNsb3NlZCIsIGlvSGFuZGxlKTsKLQotICAgICAgICBnT3V0cHV0cy5yZW1vdmVJdGVtKGlvSGFuZGxlKTsKLSAgICAgICAgfSBicmVhazsKLQotICAgIGNhc2UgT1VUUFVUX0NPTkZJR19DSEFOR0VEOiB7Ci0gICAgICAgIGludCBpbmRleCA9IGdPdXRwdXRzLmluZGV4T2ZLZXkoaW9IYW5kbGUpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiaW9Db25maWdDaGFuZ2VkKCkgbW9kaWZ5aW5nIHVua25vd24gb3V0cHV0ISAlZCIsIGlvSGFuZGxlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYXJhbTIgPT0gTlVMTCkgYnJlYWs7Ci0gICAgICAgIGRlc2MgPSAoY29uc3QgT3V0cHV0RGVzY3JpcHRvciAqKXBhcmFtMjsKLQotICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgbmV3IGNvbmZpZyBmb3Igb3V0cHV0ICVkIHNhbXBsaW5nUmF0ZSAldSwgZm9ybWF0ICUjeCBjaGFubmVsIG1hc2sgJSN4ICIKLSAgICAgICAgICAgICAgICAiZnJhbWVDb3VudCAlenUgbGF0ZW5jeSAlZCIsCi0gICAgICAgICAgICAgICAgaW9IYW5kbGUsIGRlc2MtPnNhbXBsaW5nUmF0ZSwgZGVzYy0+Zm9ybWF0LAotICAgICAgICAgICAgICAgIGRlc2MtPmNoYW5uZWxNYXNrLCBkZXNjLT5mcmFtZUNvdW50LCBkZXNjLT5sYXRlbmN5KTsKLSAgICAgICAgT3V0cHV0RGVzY3JpcHRvciAqb3V0cHV0RGVzYyA9IGdPdXRwdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICBkZWxldGUgb3V0cHV0RGVzYzsKLSAgICAgICAgb3V0cHV0RGVzYyA9ICBuZXcgT3V0cHV0RGVzY3JpcHRvcigqZGVzYyk7Ci0gICAgICAgIGdPdXRwdXRzLnJlcGxhY2VWYWx1ZUZvcihpb0hhbmRsZSwgb3V0cHV0RGVzYyk7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIElOUFVUX09QRU5FRDoKLSAgICBjYXNlIElOUFVUX0NMT1NFRDoKLSAgICBjYXNlIElOUFVUX0NPTkZJR19DSEFOR0VEOgotICAgICAgICBicmVhazsKLQorICAgIH0KKyAgICAvLyBjYWxsYmFja3Muc2l6ZSgpICE9IDAgPT4gIGlvRGVzYy0+bUlvSGFuZGxlIGFuZCBkZXZpY2VJZCBhcmUgdmFsaWQKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhbGxiYWNrcy5zaXplKCk7IGkrKykgeworICAgICAgICBjYWxsYmFja3NbaV0tPm9uQXVkaW9EZXZpY2VVcGRhdGUoaW9EZXNjLT5tSW9IYW5kbGUsIGRldmljZUlkKTsKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9TeXN0ZW06OnNldEVycm9yQ2FsbGJhY2soYXVkaW9fZXJyb3JfY2FsbGJhY2sgY2IpCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50OjpnZXRJbnB1dEJ1ZmZlclNpemUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgc2l6ZV90KiBidWZmU2l6ZSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgLy8gRG8gd2UgaGF2ZSBhIHN0YWxlIG1JbkJ1ZmZTaXplIG9yIGFyZSB3ZSByZXF1ZXN0aW5nIHRoZSBpbnB1dCBidWZmZXIgc2l6ZSBmb3IgbmV3IHZhbHVlcworICAgIGlmICgobUluQnVmZlNpemUgPT0gMCkgfHwgKHNhbXBsZVJhdGUgIT0gbUluU2FtcGxpbmdSYXRlKSB8fCAoZm9ybWF0ICE9IG1JbkZvcm1hdCkKKyAgICAgICAgfHwgKGNoYW5uZWxNYXNrICE9IG1JbkNoYW5uZWxNYXNrKSkgeworICAgICAgICBzaXplX3QgaW5CdWZmU2l6ZSA9IGFmLT5nZXRJbnB1dEJ1ZmZlclNpemUoc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7CisgICAgICAgIGlmIChpbkJ1ZmZTaXplID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJBdWRpb1N5c3RlbTo6Z2V0SW5wdXRCdWZmZXJTaXplIGZhaWxlZCBzYW1wbGVSYXRlICVkIGZvcm1hdCAlI3ggY2hhbm5lbE1hc2sgJXgiLAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgLy8gQSBiZW5pZ24gcmFjZSBpcyBwb3NzaWJsZSBoZXJlOiB3ZSBjb3VsZCBvdmVyd3JpdGUgYSBmcmVzaGVyIGNhY2hlIGVudHJ5CisgICAgICAgIC8vIHNhdmUgdGhlIHJlcXVlc3QgcGFyYW1zCisgICAgICAgIG1JblNhbXBsaW5nUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgICAgIG1JbkZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgbUluQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKKworICAgICAgICBtSW5CdWZmU2l6ZSA9IGluQnVmZlNpemU7CisgICAgfQorCisgICAgKmJ1ZmZTaXplID0gbUluQnVmZlNpemU7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3NwPEF1ZGlvSW9EZXNjcmlwdG9yPiBBdWRpb1N5c3RlbTo6QXVkaW9GbGluZ2VyQ2xpZW50OjpnZXRJb0Rlc2NyaXB0b3IoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpCit7CisgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGRlc2M7CisgICAgc3NpemVfdCBpbmRleCA9IG1Jb0Rlc2NyaXB0b3JzLmluZGV4T2ZLZXkoaW9IYW5kbGUpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIGRlc2MgPSBtSW9EZXNjcmlwdG9ycy52YWx1ZUF0KGluZGV4KTsKKyAgICB9CisgICAgcmV0dXJuIGRlc2M7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIFZlY3RvciA8IHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+ID4gY2FsbGJhY2tzOworICAgIHNzaXplX3QgaW9JbmRleCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5pbmRleE9mS2V5KGF1ZGlvSW8pOworICAgIGlmIChpb0luZGV4ID49IDApIHsKKyAgICAgICAgY2FsbGJhY2tzID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnZhbHVlQXQoaW9JbmRleCk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgY2JJbmRleCA9IDA7IGNiSW5kZXggPCBjYWxsYmFja3Muc2l6ZSgpOyBjYkluZGV4KyspIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrc1tjYkluZGV4XSA9PSBjYWxsYmFjaykgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorICAgIGNhbGxiYWNrcy5hZGQoY2FsbGJhY2spOworCisgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnJlcGxhY2VWYWx1ZUZvcihhdWRpb0lvLCBjYWxsYmFja3MpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OkF1ZGlvRmxpbmdlckNsaWVudDo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3NpemVfdCBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmluZGV4T2ZLZXkoYXVkaW9Jbyk7CisgICAgaWYgKGlvSW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgVmVjdG9yIDwgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gPiBjYWxsYmFja3MgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MudmFsdWVBdChpb0luZGV4KTsKKworICAgIHNpemVfdCBjYkluZGV4OworICAgIGZvciAoY2JJbmRleCA9IDA7IGNiSW5kZXggPCBjYWxsYmFja3Muc2l6ZSgpOyBjYkluZGV4KyspIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrc1tjYkluZGV4XSA9PSBjYWxsYmFjaykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNiSW5kZXggPT0gY2FsbGJhY2tzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGNhbGxiYWNrcy5yZW1vdmVBdChjYkluZGV4KTsKKyAgICBpZiAoY2FsbGJhY2tzLnNpemUoKSAhPSAwKSB7CisgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrcy5yZXBsYWNlVmFsdWVGb3IoYXVkaW9JbywgY2FsbGJhY2tzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja3MucmVtb3ZlSXRlbShhdWRpb0lvKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKiBzdGF0aWMgKi8gdm9pZCBBdWRpb1N5c3RlbTo6c2V0RXJyb3JDYWxsYmFjayhhdWRpb19lcnJvcl9jYWxsYmFjayBjYikKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOwogICAgIGdBdWRpb0Vycm9yQ2FsbGJhY2sgPSBjYjsKIH0KIAorLypzdGF0aWMqLyB2b2lkIEF1ZGlvU3lzdGVtOjpzZXREeW5Qb2xpY3lDYWxsYmFjayhkeW5hbWljX3BvbGljeV9jYWxsYmFjayBjYikKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOworICAgIGdEeW5Qb2xpY3lDYWxsYmFjayA9IGNiOworfQorCiAvLyBjbGllbnQgc2luZ2xldG9uIGZvciBBdWRpb1BvbGljeVNlcnZpY2UgYmluZGVyIGludGVyZmFjZQogLy8gcHJvdGVjdGVkIGJ5IGdMb2NrQVBTCiBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiBBdWRpb1N5c3RlbTo6Z0F1ZGlvUG9saWN5U2VydmljZTsKQEAgLTU5MCwxOCArNjkwLDIyIEBACiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgY29uc3QgY2hhciAqYWRkcmVzcyA9ICIiOworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSAiIjsKIAogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogCiAgICAgaWYgKGRldmljZV9hZGRyZXNzICE9IE5VTEwpIHsKICAgICAgICAgYWRkcmVzcyA9IGRldmljZV9hZGRyZXNzOwogICAgIH0KLQotICAgIHJldHVybiBhcHMtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLCBhZGRyZXNzKTsKKyAgICBpZiAoZGV2aWNlX25hbWUgIT0gTlVMTCkgeworICAgICAgICBuYW1lID0gZGV2aWNlX25hbWU7CisgICAgfQorICAgIHJldHVybiBhcHMtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLCBhZGRyZXNzLCBuYW1lKTsKIH0KIAogYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKQEAgLTY1MywxNyArNzU3LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIGFwcy0+Z2V0T3V0cHV0Rm9yQXR0cihhdHRyLCBvdXRwdXQsIHNlc3Npb24sIHN0cmVhbSwKKyAgICByZXR1cm4gYXBzLT5nZXRPdXRwdXRGb3JBdHRyKGF0dHIsIG91dHB1dCwgc2Vzc2lvbiwgc3RyZWFtLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgb2ZmbG9hZEluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIG9mZmxvYWRJbmZvKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKQEAgLTY5NiwxNCArODAyLDE3IEBACiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIGFwcy0+Z2V0SW5wdXRGb3JBdHRyKGF0dHIsIGlucHV0LCBzZXNzaW9uLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzKTsKKyAgICByZXR1cm4gYXBzLT5nZXRJbnB1dEZvckF0dHIoCisgICAgICAgICAgICBhdHRyLCBpbnB1dCwgc2Vzc2lvbiwgdWlkLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzLCBzZWxlY3RlZERldmljZUlkKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCkBAIC04NTgsMTggKzk2NywxNiBAQAogICAgIC8vIGNhbGxlZCBieSByZXN0b3JlVHJhY2tfbCgpLCB3aGljaCBuZWVkcyBuZXcgSUF1ZGlvRmxpbmdlciBhbmQgSUF1ZGlvUG9saWN5U2VydmljZSBpbnN0YW5jZXMKICAgICBBTE9HVigiY2xlYXJBdWRpb0NvbmZpZ0NhY2hlKCkiKTsKICAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9ja0NhY2hlKTsKLSAgICAgICAgZ091dHB1dHMuY2xlYXIoKTsKLSAgICB9Ci0gICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2spOworICAgICAgICBpZiAoZ0F1ZGlvRmxpbmdlckNsaWVudCAhPSAwKSB7CisgICAgICAgICAgICBnQXVkaW9GbGluZ2VyQ2xpZW50LT5jbGVhcklvQ2FjaGUoKTsKKyAgICAgICAgfQogICAgICAgICBnQXVkaW9GbGluZ2VyLmNsZWFyKCk7CiAgICAgfQogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrQVBTKTsKICAgICAgICAgZ0F1ZGlvUG9saWN5U2VydmljZS5jbGVhcigpOwogICAgIH0KLSAgICAvLyBEbyBub3QgY2xlYXIgZ0F1ZGlvUG9ydENhbGxiYWNrCiB9CiAKIGJvb2wgQXVkaW9TeXN0ZW06OmlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgaW5mbykKQEAgLTkyOSwxMCArMTAzNiw3NSBAQAogICAgIHJldHVybiBhcHMtPnNldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOwogfQogCi12b2lkIEF1ZGlvU3lzdGVtOjpzZXRBdWRpb1BvcnRDYWxsYmFjayhzcDxBdWRpb1BvcnRDYWxsYmFjaz4gY2FsbEJhY2spCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6YWRkQXVkaW9Qb3J0Q2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Qb3J0Q2FsbGJhY2s+JiBjYWxsYmFjaykKIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2tBUEMpOwotICAgIGdBdWRpb1BvcnRDYWxsYmFjayA9IGNhbGxCYWNrOworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2tBUFMpOworICAgIGlmIChnQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGludCByZXQgPSBnQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5hZGRBdWRpb1BvcnRDYWxsYmFjayhjYWxsYmFjayk7CisgICAgaWYgKHJldCA9PSAxKSB7CisgICAgICAgIGFwcy0+c2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZCh0cnVlKTsKKyAgICB9CisgICAgcmV0dXJuIChyZXQgPCAwKSA/IElOVkFMSURfT1BFUkFUSU9OIDogTk9fRVJST1I7Cit9CisKKy8qc3RhdGljKi8KK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb1BvcnRDYWxsYmFjayhjb25zdCBzcDxBdWRpb1BvcnRDYWxsYmFjaz4mIGNhbGxiYWNrKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2tBUFMpOworICAgIGlmIChnQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGludCByZXQgPSBnQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5yZW1vdmVBdWRpb1BvcnRDYWxsYmFjayhjYWxsYmFjayk7CisgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgIGFwcy0+c2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChmYWxzZSk7CisgICAgfQorICAgIHJldHVybiAocmV0IDwgMCkgPyBJTlZBTElEX09QRVJBVElPTiA6IE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKQoreworICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlckNsaWVudD4gYWZjID0gZ2V0QXVkaW9GbGluZ2VyQ2xpZW50KCk7CisgICAgaWYgKGFmYyA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBhZmMtPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY2FsbGJhY2ssIGF1ZGlvSW8pOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgICAgIGlmIChhZiAhPSAwKSB7CisgICAgICAgICAgICBhZi0+cmVnaXN0ZXJDbGllbnQoYWZjKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKQoreworICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlckNsaWVudD4gYWZjID0gZ2V0QXVkaW9GbGluZ2VyQ2xpZW50KCk7CisgICAgaWYgKGFmYyA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gYWZjLT5yZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGNhbGxiYWNrLCBhdWRpb0lvKTsKK30KKworYXVkaW9fcG9ydF9oYW5kbGVfdCBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlSWRGb3JJbyhhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKQoreworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGRlc2MgPSBnZXRJb0Rlc2NyaXB0b3IoYXVkaW9Jbyk7CisgICAgaWYgKGRlc2MgPT0gMCkgeworICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIGRlc2MtPmdldERldmljZUlkKCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjphY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCkBAIC05NjUsMTQgKzExMzcsOTIgQEAKICAgICByZXR1cm4gYXBzLT5yZWdpc3RlclBvbGljeU1peGVzKG1peGVzLCByZWdpc3RyYXRpb24pOwogfQogCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpoYW5kbGUpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5zdGFydEF1ZGlvU291cmNlKHNvdXJjZSwgYXR0cmlidXRlcywgaGFuZGxlKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0b3BBdWRpb1NvdXJjZShhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5zdG9wQXVkaW9Tb3VyY2UoaGFuZGxlKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK2ludCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjphZGRBdWRpb1BvcnRDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9Qb3J0Q2FsbGJhY2s+JiBjYWxsYmFjaykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvUG9ydENhbGxiYWNrcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUF1ZGlvUG9ydENhbGxiYWNrc1tpXSA9PSBjYWxsYmFjaykgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorICAgIG1BdWRpb1BvcnRDYWxsYmFja3MuYWRkKGNhbGxiYWNrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9ydENhbGxiYWNrcy5zaXplKCk7Cit9CisKK2ludCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpyZW1vdmVBdWRpb1BvcnRDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9Qb3J0Q2FsbGJhY2s+JiBjYWxsYmFjaykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNpemVfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBtQXVkaW9Qb3J0Q2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtQXVkaW9Qb3J0Q2FsbGJhY2tzW2ldID09IGNhbGxiYWNrKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA9PSBtQXVkaW9Qb3J0Q2FsbGJhY2tzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1BdWRpb1BvcnRDYWxsYmFja3MucmVtb3ZlQXQoaSk7CisgICAgcmV0dXJuIG1BdWRpb1BvcnRDYWxsYmFja3Muc2l6ZSgpOworfQorCisKK3ZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6b25BdWRpb1BvcnRMaXN0VXBkYXRlKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvUG9ydENhbGxiYWNrcy5zaXplKCk7IGkrKykgeworICAgICAgICBtQXVkaW9Qb3J0Q2FsbGJhY2tzW2ldLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1BvcnRDYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUF1ZGlvUG9ydENhbGxiYWNrc1tpXS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgIH0KK30KKwordm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZSgKKyAgICAgICAgU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSkKK3sKKyAgICBBTE9HVigiQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZSglcywgJWQpIiwgcmVnSWQuc3RyaW5nKCksIHN0YXRlKTsKKyAgICBkeW5hbWljX3BvbGljeV9jYWxsYmFjayBjYiA9IE5VTEw7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woQXVkaW9TeXN0ZW06OmdMb2NrKTsKKyAgICAgICAgY2IgPSBnRHluUG9saWN5Q2FsbGJhY2s7CisgICAgfQorCisgICAgaWYgKGNiICE9IE5VTEwpIHsKKyAgICAgICAgY2IoRFlOQU1JQ19QT0xJQ1lfRVZFTlRfTUlYX1NUQVRFX1VQREFURSwgcmVnSWQsIHN0YXRlKTsKKyAgICB9Cit9CisKIHZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQogewogICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrQVBDKTsKLSAgICAgICAgaWYgKGdBdWRpb1BvcnRDYWxsYmFjayAhPSAwKSB7Ci0gICAgICAgICAgICBnQXVkaW9Qb3J0Q2FsbGJhY2stPm9uU2VydmljZURpZWQoKTsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Qb3J0Q2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtQXVkaW9Qb3J0Q2FsbGJhY2tzW2ldLT5vblNlcnZpY2VEaWVkKCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgewpAQCAtOTgzLDIwICsxMjMzLDQgQEAKICAgICBBTE9HVygiQXVkaW9Qb2xpY3lTZXJ2aWNlIHNlcnZlciBkaWVkISIpOwogfQogCi12b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrQVBDKTsKLSAgICBpZiAoZ0F1ZGlvUG9ydENhbGxiYWNrICE9IDApIHsKLSAgICAgICAgZ0F1ZGlvUG9ydENhbGxiYWNrLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrQVBDKTsKLSAgICBpZiAoZ0F1ZGlvUG9ydENhbGxiYWNrICE9IDApIHsKLSAgICAgICAgZ0F1ZGlvUG9ydENhbGxiYWNrLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7Ci0gICAgfQotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcAppbmRleCA3MzVkYjVjLi40NDRmNGQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrLmNwcApAQCAtMzMsMTEgKzMzLDI4IEBACiAKICNkZWZpbmUgV0FJVF9QRVJJT0RfTVMgICAgICAgICAgICAgICAgICAxMAogI2RlZmluZSBXQUlUX1NUUkVBTV9FTkRfVElNRU9VVF9TRUMgICAgIDEyMAotCitzdGF0aWMgY29uc3QgaW50IGtNYXhMb29wQ291bnROb3RpZmljYXRpb25zID0gMzI7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCisvLyBUT0RPOiBNb3ZlIHRvIGEgc2VwYXJhdGUgLmgKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW5saW5lIGNvbnN0IFQgJm1pbihjb25zdCBUICZ4LCBjb25zdCBUICZ5KSB7CisgICAgcmV0dXJuIHggPCB5ID8geCA6IHk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIGlubGluZSBjb25zdCBUICZtYXgoY29uc3QgVCAmeCwgY29uc3QgVCAmeSkgeworICAgIHJldHVybiB4ID4geSA/IHggOiB5OworfQorCitzdGF0aWMgaW5saW5lIG5zZWNzX3QgZnJhbWVzVG9OYW5vc2Vjb25kcyhzc2l6ZV90IGZyYW1lcywgdWludDMyX3Qgc2FtcGxlUmF0ZSwgZmxvYXQgc3BlZWQpCit7CisgICAgcmV0dXJuICgoZG91YmxlKWZyYW1lcyAqIDEwMDAwMDAwMDApIC8gKChkb3VibGUpc2FtcGxlUmF0ZSAqIHNwZWVkKTsKK30KKwogc3RhdGljIGludDY0X3QgY29udmVydFRpbWVzcGVjVG9Vcyhjb25zdCBzdHJ1Y3QgdGltZXNwZWMgJnR2KQogewogICAgIHJldHVybiB0di50dl9zZWMgKiAxMDAwMDAwbGwgKyB0di50dl9uc2VjIC8gMTAwMDsKQEAgLTUxLDYgKzY4LDQyIEBACiAgICAgcmV0dXJuIGNvbnZlcnRUaW1lc3BlY1RvVXModHYpOwogfQogCisvLyBGSVhNRTogd2UgZG9uJ3QgdXNlIHRoZSBwaXRjaCBzZXR0aW5nIGluIHRoZSB0aW1lIHN0cmV0Y2hlciAobm90IHdvcmtpbmcpOworLy8gaW5zdGVhZCB3ZSBlbXVsYXRlIGl0IHVzaW5nIG91ciBzYW1wbGUgcmF0ZSBjb252ZXJ0ZXIuCitzdGF0aWMgY29uc3QgYm9vbCBrRml4UGl0Y2ggPSB0cnVlOyAvLyBlbmFibGUgcGl0Y2ggZml4CitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGFkanVzdFNhbXBsZVJhdGUodWludDMyX3Qgc2FtcGxlUmF0ZSwgZmxvYXQgcGl0Y2gpCit7CisgICAgcmV0dXJuIGtGaXhQaXRjaCA/IChzYW1wbGVSYXRlICogcGl0Y2ggKyAwLjUpIDogc2FtcGxlUmF0ZTsKK30KKworc3RhdGljIGlubGluZSBmbG9hdCBhZGp1c3RTcGVlZChmbG9hdCBzcGVlZCwgZmxvYXQgcGl0Y2gpCit7CisgICAgcmV0dXJuIGtGaXhQaXRjaCA/IHNwZWVkIC8gbWF4KHBpdGNoLCBBVURJT19USU1FU1RSRVRDSF9QSVRDSF9NSU5fREVMVEEpIDogc3BlZWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgZmxvYXQgYWRqdXN0UGl0Y2goZmxvYXQgcGl0Y2gpCit7CisgICAgcmV0dXJuIGtGaXhQaXRjaCA/IEFVRElPX1RJTUVTVFJFVENIX1BJVENIX05PUk1BTCA6IHBpdGNoOworfQorCisvLyBNdXN0IG1hdGNoIHNpbWlsYXIgY29tcHV0YXRpb24gaW4gY3JlYXRlVHJhY2tfbCBpbiBUaHJlYWRzLmNwcC4KKy8vIFRPRE86IE1vdmUgdG8gYSBjb21tb24gbGlicmFyeQorc3RhdGljIHNpemVfdCBjYWxjdWxhdGVNaW5GcmFtZUNvdW50KAorICAgICAgICB1aW50MzJfdCBhZkxhdGVuY3lNcywgdWludDMyX3QgYWZGcmFtZUNvdW50LCB1aW50MzJfdCBhZlNhbXBsZVJhdGUsCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGZsb2F0IHNwZWVkKQoreworICAgIC8vIEVuc3VyZSB0aGF0IGJ1ZmZlciBkZXB0aCBjb3ZlcnMgYXQgbGVhc3QgYXVkaW8gaGFyZHdhcmUgbGF0ZW5jeQorICAgIHVpbnQzMl90IG1pbkJ1ZkNvdW50ID0gYWZMYXRlbmN5TXMgLyAoKDEwMDAgKiBhZkZyYW1lQ291bnQpIC8gYWZTYW1wbGVSYXRlKTsKKyAgICBpZiAobWluQnVmQ291bnQgPCAyKSB7CisgICAgICAgIG1pbkJ1ZkNvdW50ID0gMjsKKyAgICB9CisgICAgQUxPR1YoImNhbGN1bGF0ZU1pbkZyYW1lQ291bnQgYWZMYXRlbmN5ICV1ICBhZkZyYW1lQ291bnQgJXUgIGFmU2FtcGxlUmF0ZSAldSAgIgorICAgICAgICAgICAgInNhbXBsZVJhdGUgJXUgIHNwZWVkICVmICBtaW5CdWZDb3VudDogJXUiLAorICAgICAgICAgICAgYWZMYXRlbmN5TXMsIGFmRnJhbWVDb3VudCwgYWZTYW1wbGVSYXRlLCBzYW1wbGVSYXRlLCBzcGVlZCwgbWluQnVmQ291bnQpOworICAgIHJldHVybiBtaW5CdWZDb3VudCAqIHNvdXJjZUZyYW1lc05lZWRlZFdpdGhUaW1lc3RyZXRjaCgKKyAgICAgICAgICAgIHNhbXBsZVJhdGUsIGFmRnJhbWVDb3VudCwgYWZTYW1wbGVSYXRlLCBzcGVlZCk7Cit9CisKIC8vIHN0YXRpYwogc3RhdHVzX3QgQXVkaW9UcmFjazo6Z2V0TWluRnJhbWVDb3VudCgKICAgICAgICAgc2l6ZV90KiBmcmFtZUNvdW50LApAQCAtNjEsMTIgKzExNCwxMSBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIC8vIEZJWE1FIG1lcmdlIHdpdGggc2ltaWxhciBjb2RlIGluIGNyZWF0ZVRyYWNrX2woKSwgZXhjZXB0IHdlJ3JlIG1pc3NpbmcKLSAgICAvLyAgICAgICBzb21lIGluZm9ybWF0aW9uIGhlcmUgdGhhdCBpcyBhdmFpbGFibGUgaW4gY3JlYXRlVHJhY2tfbCgpOgorICAgIC8vIEZJWE1FIGhhbmRsZSBpbiBzZXJ2ZXIsIGxpa2UgY3JlYXRlVHJhY2tfbCgpLCBwb3NzaWJsZSBtaXNzaW5nIGluZm86CiAgICAgLy8gICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0CiAgICAgLy8gICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0CiAgICAgLy8gICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sKLSAgICAvLyAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncworICAgIC8vICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzIChGQVNUKQogICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZTsKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBzdHJlYW1UeXBlKTsKQEAgLTkwLDIzICsxNDIsMjAgQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKLSAgICAvLyBFbnN1cmUgdGhhdCBidWZmZXIgZGVwdGggY292ZXJzIGF0IGxlYXN0IGF1ZGlvIGhhcmR3YXJlIGxhdGVuY3kKLSAgICB1aW50MzJfdCBtaW5CdWZDb3VudCA9IGFmTGF0ZW5jeSAvICgoMTAwMCAqIGFmRnJhbWVDb3VudCkgLyBhZlNhbXBsZVJhdGUpOwotICAgIGlmIChtaW5CdWZDb3VudCA8IDIpIHsKLSAgICAgICAgbWluQnVmQ291bnQgPSAyOwotICAgIH0KKyAgICAvLyBXaGVuIGNhbGxlZCBmcm9tIGNyZWF0ZVRyYWNrLCBzcGVlZCBpcyAxLjBmIChub3JtYWwgc3BlZWQpLgorICAgIC8vIFRoaXMgaXMgcmVjaGVja2VkIGFnYWluIG9uIHNldHRpbmcgcGxheWJhY2sgcmF0ZSAoVE9ETzogb24gc2V0dGluZyBzYW1wbGUgcmF0ZSwgdG9vKS4KKyAgICAqZnJhbWVDb3VudCA9IGNhbGN1bGF0ZU1pbkZyYW1lQ291bnQoYWZMYXRlbmN5LCBhZkZyYW1lQ291bnQsIGFmU2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSwgMS4wZik7CiAKLSAgICAqZnJhbWVDb3VudCA9IChzYW1wbGVSYXRlID09IDApID8gYWZGcmFtZUNvdW50ICogbWluQnVmQ291bnQgOgotICAgICAgICAgICAgYWZGcmFtZUNvdW50ICogbWluQnVmQ291bnQgKiB1aW50NjRfdChzYW1wbGVSYXRlKSAvIGFmU2FtcGxlUmF0ZTsKLSAgICAvLyBUaGUgZm9ybXVsYSBhYm92ZSBzaG91bGQgYWx3YXlzIHByb2R1Y2UgYSBub24temVybyB2YWx1ZSwgYnV0IHJldHVybiBhbiBlcnJvcgotICAgIC8vIGluIHRoZSB1bmxpa2VseSBldmVudCB0aGF0IGl0IGRvZXMgbm90LCBhcyB0aGF0J3MgcGFydCBvZiB0aGUgQVBJIGNvbnRyYWN0LgorICAgIC8vIFRoZSBmb3JtdWxhIGFib3ZlIHNob3VsZCBhbHdheXMgcHJvZHVjZSBhIG5vbi16ZXJvIHZhbHVlIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzOgorICAgIC8vIEF1ZGlvVHJhY2suU0FNUExFX1JBVEVfSFpfTUlOIDw9IHNhbXBsZVJhdGUgPD0gQXVkaW9UcmFjay5TQU1QTEVfUkFURV9IWl9NQVguCisgICAgLy8gUmV0dXJuIGVycm9yIGluIHRoZSB1bmxpa2VseSBldmVudCB0aGF0IGl0IGRvZXMgbm90LCBhcyB0aGF0J3MgcGFydCBvZiB0aGUgQVBJIGNvbnRyYWN0LgogICAgIGlmICgqZnJhbWVDb3VudCA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb1RyYWNrOjpnZXRNaW5GcmFtZUNvdW50IGZhaWxlZCBmb3Igc3RyZWFtVHlwZSAlZCwgc2FtcGxlUmF0ZSAlZCIsCisgICAgICAgIEFMT0dFKCJBdWRpb1RyYWNrOjpnZXRNaW5GcmFtZUNvdW50IGZhaWxlZCBmb3Igc3RyZWFtVHlwZSAlZCwgc2FtcGxlUmF0ZSAldSIsCiAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIEFMT0dWKCJnZXRNaW5GcmFtZUNvdW50PSV6dTogYWZGcmFtZUNvdW50PSV6dSwgbWluQnVmQ291bnQ9JWQsIGFmU2FtcGxlUmF0ZT0lZCwgYWZMYXRlbmN5PSVkIiwKLSAgICAgICAgICAgICpmcmFtZUNvdW50LCBhZkZyYW1lQ291bnQsIG1pbkJ1ZkNvdW50LCBhZlNhbXBsZVJhdGUsIGFmTGF0ZW5jeSk7CisgICAgQUxPR1YoImdldE1pbkZyYW1lQ291bnQ9JXp1OiBhZkZyYW1lQ291bnQ9JXp1LCBhZlNhbXBsZVJhdGU9JXUsIGFmTGF0ZW5jeT0ldSIsCisgICAgICAgICAgICAqZnJhbWVDb3VudCwgYWZGcmFtZUNvdW50LCBhZlNhbXBsZVJhdGUsIGFmTGF0ZW5jeSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC0xMTcsNyArMTY2LDggQEAKICAgICAgIG1Jc1RpbWVkKGZhbHNlKSwKICAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwKICAgICAgIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKSwKLSAgICAgIG1QYXVzZWRQb3NpdGlvbigwKQorICAgICAgbVBhdXNlZFBvc2l0aW9uKDApLAorICAgICAgbVNlbGVjdGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkKIHsKICAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTjsKICAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX1VOS05PV047CkBAIC0xNDAsMTcgKzE5MCwxOSBAQAogICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8sCiAgICAgICAgIGludCB1aWQsCiAgICAgICAgIHBpZF90IHBpZCwKLSAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcykKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKKyAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCkKICAgICA6IG1TdGF0dXMoTk9fSU5JVCksCiAgICAgICBtSXNUaW1lZChmYWxzZSksCiAgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksCiAgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXAoU1BfREVGQVVMVCksCi0gICAgICBtUGF1c2VkUG9zaXRpb24oMCkKKyAgICAgIG1QYXVzZWRQb3NpdGlvbigwKSwKKyAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpCiB7CiAgICAgbVN0YXR1cyA9IHNldChzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgZnJhbWVDb3VudCwgZmxhZ3MsIGNiZiwgdXNlciwgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICAgICAgMCAvKnNoYXJlZEJ1ZmZlciovLCBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLAotICAgICAgICAgICAgb2ZmbG9hZEluZm8sIHVpZCwgcGlkLCBwQXR0cmlidXRlcyk7CisgICAgICAgICAgICBvZmZsb2FkSW5mbywgdWlkLCBwaWQsIHBBdHRyaWJ1dGVzLCBkb05vdFJlY29ubmVjdCk7CiB9CiAKIEF1ZGlvVHJhY2s6OkF1ZGlvVHJhY2soCkBAIC0xNjgsMTcgKzIyMCwxOSBAQAogICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8sCiAgICAgICAgIGludCB1aWQsCiAgICAgICAgIHBpZF90IHBpZCwKLSAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcykKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKKyAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCkKICAgICA6IG1TdGF0dXMoTk9fSU5JVCksCiAgICAgICBtSXNUaW1lZChmYWxzZSksCiAgICAgICBtUHJldmlvdXNQcmlvcml0eShBTkRST0lEX1BSSU9SSVRZX05PUk1BTCksCiAgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXAoU1BfREVGQVVMVCksCi0gICAgICBtUGF1c2VkUG9zaXRpb24oMCkKKyAgICAgIG1QYXVzZWRQb3NpdGlvbigwKSwKKyAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpCiB7CiAgICAgbVN0YXR1cyA9IHNldChzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgMCAvKmZyYW1lQ291bnQqLywgZmxhZ3MsIGNiZiwgdXNlciwgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICAgICAgc2hhcmVkQnVmZmVyLCBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBvZmZsb2FkSW5mbywKLSAgICAgICAgICAgIHVpZCwgcGlkLCBwQXR0cmlidXRlcyk7CisgICAgICAgICAgICB1aWQsIHBpZCwgcEF0dHJpYnV0ZXMsIGRvTm90UmVjb25uZWN0KTsKIH0KIAogQXVkaW9UcmFjazo6fkF1ZGlvVHJhY2soKQpAQCAtMTk0LDEzICsyNDgsMTcgQEAKICAgICAgICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKICAgICAgICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkLmNsZWFyKCk7CiAgICAgICAgIH0KKyAgICAgICAgLy8gTm8gbG9jayBoZXJlOiB3b3JzdCBjYXNlIHdlIHJlbW92ZSBhIE5VTEwgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBhIG5vcAorICAgICAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDAgJiYgbU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLCBtT3V0cHV0KTsKKyAgICAgICAgfQogICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQXVkaW9UcmFjayktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwogICAgICAgICBtQXVkaW9UcmFjay5jbGVhcigpOwogICAgICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOwogICAgICAgICBtU2hhcmVkQnVmZmVyLmNsZWFyKCk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICAgICAgQUxPR1YoIn5BdWRpb1RyYWNrLCByZWxlYXNpbmcgc2Vzc2lvbiBpZCBmcm9tICVkIG9uIGJlaGFsZiBvZiAlZCIsCi0gICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgQUxPR1YoIn5BdWRpb1RyYWNrLCByZWxlYXNpbmcgc2Vzc2lvbiBpZCAlZCBmcm9tICVkIG9uIGJlaGFsZiBvZiAlZCIsCisgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkLCBtQ2xpZW50UGlkKTsKICAgICB9CiB9CkBAIC0yMjIsMTIgKzI4MCwxMyBAQAogICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8sCiAgICAgICAgIGludCB1aWQsCiAgICAgICAgIHBpZF90IHBpZCwKLSAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcykKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKKyAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCkKIHsKICAgICBBTE9HVigic2V0KCk6IHN0cmVhbVR5cGUgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKLSAgICAgICAgICAiZmxhZ3MgIyV4LCBub3RpZmljYXRpb25GcmFtZXMgJXUsIHNlc3Npb25JZCAlZCwgdHJhbnNmZXJUeXBlICVkIiwKKyAgICAgICAgICAiZmxhZ3MgIyV4LCBub3RpZmljYXRpb25GcmFtZXMgJXUsIHNlc3Npb25JZCAlZCwgdHJhbnNmZXJUeXBlICVkLCB1aWQgJWQsIHBpZCAlZCIsCiAgICAgICAgICAgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgZmxhZ3MsIG5vdGlmaWNhdGlvbkZyYW1lcywKLSAgICAgICAgICBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSk7CisgICAgICAgICAgc2Vzc2lvbklkLCB0cmFuc2ZlclR5cGUsIHVpZCwgcGlkKTsKIAogICAgIHN3aXRjaCAodHJhbnNmZXJUeXBlKSB7CiAgICAgY2FzZSBUUkFOU0ZFUl9ERUZBVUxUOgpAQCAtMjY0LDE0ICszMjMsMTMgQEAKICAgICB9CiAgICAgbVNoYXJlZEJ1ZmZlciA9IHNoYXJlZEJ1ZmZlcjsKICAgICBtVHJhbnNmZXIgPSB0cmFuc2ZlclR5cGU7CisgICAgbURvTm90UmVjb25uZWN0ID0gZG9Ob3RSZWNvbm5lY3Q7CiAKLSAgICBBTE9HVl9JRihzaGFyZWRCdWZmZXIgIT0gMCwgInNoYXJlZEJ1ZmZlcjogJXAsIHNpemU6ICVkIiwgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksCisgICAgQUxPR1ZfSUYoc2hhcmVkQnVmZmVyICE9IDAsICJzaGFyZWRCdWZmZXI6ICVwLCBzaXplOiAlenUiLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwKICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlci0+c2l6ZSgpKTsKIAogICAgIEFMT0dWKCJzZXQoKSBzdHJlYW1UeXBlICVkIGZyYW1lQ291bnQgJXp1IGZsYWdzICUwNHgiLCBzdHJlYW1UeXBlLCBmcmFtZUNvdW50LCBmbGFncyk7CiAKLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7Ci0KICAgICAvLyBpbnZhcmlhbnQgdGhhdCBtQXVkaW9UcmFjayAhPSAwIGlzIHRydWUgb25seSBhZnRlciBzZXQoKSByZXR1cm5zIHN1Y2Nlc3NmdWxseQogICAgIGlmIChtQXVkaW9UcmFjayAhPSAwKSB7CiAgICAgICAgIEFMT0dFKCJUcmFjayBhbHJlYWR5IGluIHVzZSIpOwpAQCAtMjk1LDYgKzM1Myw5IEBACiAgICAgICAgIEFMT0dWKCJCdWlsZGluZyBBdWRpb1RyYWNrIHdpdGggYXR0cmlidXRlczogdXNhZ2U9JWQgY29udGVudD0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCiAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMudXNhZ2UsIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSwgbUF0dHJpYnV0ZXMuZmxhZ3MsIG1BdHRyaWJ1dGVzLnRhZ3MpOwogICAgICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworICAgICAgICBpZiAoKG1BdHRyaWJ1dGVzLmZsYWdzICYgQVVESU9fRkxBR19IV19BVl9TWU5DKSAhPSAwKSB7CisgICAgICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIHRoZXNlIGJlbG93IHNob3VsZCBwcm9iYWJseSBjb21lIGZyb20gdGhlIGF1ZGlvRmxpbmdlciB0b28uLi4KQEAgLTMxNywxMiArMzc4LDYgQEAKICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOwogICAgIG1DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7CiAKLSAgICAvLyBBdWRpb0ZsaW5nZXIgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgOC1iaXQgZGF0YSBpbiBzaGFyZWQgbWVtb3J5Ci0gICAgaWYgKGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUICYmIHNoYXJlZEJ1ZmZlciAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCI4LWJpdCBkYXRhIGluIHNoYXJlZCBtZW1vcnkgaXMgbm90IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQogICAgIC8vIGZvcmNlIGRpcmVjdCBmbGFnIGlmIGZvcm1hdCBpcyBub3QgbGluZWFyIFBDTQogICAgIC8vIG9yIG9mZmxvYWQgd2FzIHJlcXVlc3RlZAogICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKQpAQCAtMzQ2LDEyICs0MDEsOSBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IHNpemVvZih1aW50OF90KTsKICAgICAgICAgfQotICAgICAgICBtRnJhbWVTaXplQUYgPSBtRnJhbWVTaXplOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dfQVNTRVJUKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSk7CiAgICAgICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7Ci0gICAgICAgIG1GcmFtZVNpemVBRiA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoCi0gICAgICAgICAgICAgICAgZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQgPyBBVURJT19GT1JNQVRfUENNXzE2X0JJVCA6IGZvcm1hdCk7CiAgICAgICAgIC8vIGNyZWF0ZVRyYWNrIHdpbGwgcmV0dXJuIGFuIGVycm9yIGlmIFBDTSBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCBieSBzZXJ2ZXIsCiAgICAgICAgIC8vIHNvIG5vIG5lZWQgdG8gY2hlY2sgZm9yIHNwZWNpZmljIFBDTSBmb3JtYXRzIGhlcmUKICAgICB9CkBAIC0zNjEsNiArNDEzLDggQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgIG1PcmlnaW5hbFNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgIG1QbGF5YmFja1JhdGUgPSBBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQ7CiAKICAgICAvLyBNYWtlIGNvcHkgb2YgaW5wdXQgcGFyYW1ldGVyIG9mZmxvYWRJbmZvIHNvIHRoYXQgaW4gdGhlIGZ1dHVyZToKICAgICAvLyAgKGEpIGNyZWF0ZVRyYWNrX2wgZG9lc24ndCBuZWVkIGl0IGFzIGFuIGlucHV0IHBhcmFtZXRlcgpAQCAtNDAzLDYgKzQ1Nyw3IEBACiAgICAgaWYgKGNiZiAhPSBOVUxMKSB7CiAgICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkID0gbmV3IEF1ZGlvVHJhY2tUaHJlYWQoKnRoaXMsIHRocmVhZENhbkNhbGxKYXZhKTsKICAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQtPnJ1bigiQXVkaW9UcmFjayIsIEFORFJPSURfUFJJT1JJVFlfQVVESU8sIDAgLypzdGFjayovKTsKKyAgICAgICAgLy8gdGhyZWFkIGJlZ2lucyBpbiBwYXVzZWQgc3RhdGUsIGFuZCB3aWxsIG5vdCByZWZlcmVuY2UgdXMgdW50aWwgc3RhcnQoKQogICAgIH0KIAogICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvVHJhY2sKQEAgLTQyMCwxMiArNDc1LDE0IEBACiAgICAgbVN0YXR1cyA9IE5PX0VSUk9SOwogICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7CiAgICAgbVVzZXJEYXRhID0gdXNlcjsKLSAgICBtTG9vcFBlcmlvZCA9IDA7CisgICAgbUxvb3BDb3VudCA9IDA7CisgICAgbUxvb3BTdGFydCA9IDA7CisgICAgbUxvb3BFbmQgPSAwOworICAgIG1Mb29wQ291bnROb3RpZmllZCA9IDA7CiAgICAgbU1hcmtlclBvc2l0aW9uID0gMDsKICAgICBtTWFya2VyUmVhY2hlZCA9IGZhbHNlOwogICAgIG1OZXdQb3NpdGlvbiA9IDA7CiAgICAgbVVwZGF0ZVBlcmlvZCA9IDA7Ci0gICAgbVNlcnZlciA9IDA7CiAgICAgbVBvc2l0aW9uID0gMDsKICAgICBtUmVsZWFzZWQgPSAwOwogICAgIG1TdGFydFVzID0gMDsKQEAgLTQzMyw2ICs0OTAsOSBAQAogICAgIG1TZXF1ZW5jZSA9IDE7CiAgICAgbU9ic2VydmVkU2VxdWVuY2UgPSBtU2VxdWVuY2U7CiAgICAgbUluVW5kZXJydW4gPSBmYWxzZTsKKyAgICBtUHJldmlvdXNUaW1lc3RhbXBWYWxpZCA9IGZhbHNlOworICAgIG1UaW1lc3RhbXBTdGFydHVwR2xpdGNoUmVwb3J0ZWQgPSBmYWxzZTsKKyAgICBtUmV0cm9ncmFkZU1vdGlvblJlcG9ydGVkID0gZmFsc2U7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC00NTksNiArNTE5LDEwIEBACiAgICAgaWYgKHByZXZpb3VzU3RhdGUgPT0gU1RBVEVfU1RPUFBFRCB8fCBwcmV2aW91c1N0YXRlID09IFNUQVRFX0ZMVVNIRUQpIHsKICAgICAgICAgLy8gcmVzZXQgY3VycmVudCBwb3NpdGlvbiBhcyBzZWVuIGJ5IGNsaWVudCB0byAwCiAgICAgICAgIG1Qb3NpdGlvbiA9IDA7CisgICAgICAgIG1QcmV2aW91c1RpbWVzdGFtcFZhbGlkID0gZmFsc2U7CisgICAgICAgIG1UaW1lc3RhbXBTdGFydHVwR2xpdGNoUmVwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgbVJldHJvZ3JhZGVNb3Rpb25SZXBvcnRlZCA9IGZhbHNlOworCiAgICAgICAgIC8vIEZvciBvZmZsb2FkZWQgdHJhY2tzLCB3ZSBkb24ndCBrbm93IGlmIHRoZSBoYXJkd2FyZSBjb3VudGVycyBhcmUgcmVhbGx5IHplcm8gaGVyZSwKICAgICAgICAgLy8gc2luY2UgdGhlIGZsdXNoIGlzIGFzeW5jaHJvbm91cyBhbmQgc3RvcCBtYXkgbm90IGZ1bGx5IGRyYWluLgogICAgICAgICAvLyBXZSBzYXZlIHRoZSB0aW1lIHdoZW4gdGhlIHRyYWNrIGlzIHN0YXJ0ZWQgdG8gbGF0ZXIgdmVyaWZ5IHdoZXRoZXIKQEAgLTUzMSwxNCArNTk1LDEyIEBACiAgICAgLy8gdGhlIHBsYXliYWNrIGhlYWQgcG9zaXRpb24gd2lsbCByZXNldCB0byAwLCBzbyBpZiBhIG1hcmtlciBpcyBzZXQsIHdlIG5lZWQKICAgICAvLyB0byBhY3RpdmF0ZSBpdCBhZ2FpbgogICAgIG1NYXJrZXJSZWFjaGVkID0gZmFsc2U7Ci0jaWYgMAotICAgIC8vIEZvcmNlIGZsdXNoIGlmIGEgc2hhcmVkIGJ1ZmZlciBpcyB1c2VkIG90aGVyd2lzZSBhdWRpb2ZsaW5nZXIKLSAgICAvLyB3aWxsIG5vdCBzdG9wIGJlZm9yZSBlbmQgb2YgYnVmZmVyIGlzIHJlYWNoZWQuCi0gICAgLy8gSXQgbWF5IGJlIG5lZWRlZCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBzdG9wIHBsYXliYWNrLCBsaWtlbHkgaW4gY2FzZSBsb29waW5nIGlzIG9uLgorCiAgICAgaWYgKG1TaGFyZWRCdWZmZXIgIT0gMCkgewotICAgICAgICBmbHVzaF9sKCk7CisgICAgICAgIC8vIGNsZWFyIGJ1ZmZlciBwb3NpdGlvbiBhbmQgbG9vcCBjb3VudC4KKyAgICAgICAgbVN0YXRpY1Byb3h5LT5zZXRCdWZmZXJQb3NpdGlvbkFuZExvb3AoMCAvKiBwb3NpdGlvbiAqLywKKyAgICAgICAgICAgICAgICAwIC8qIGxvb3BTdGFydCAqLywgMCAvKiBsb29wRW5kICovLCAwIC8qIGxvb3BDb3VudCAqLyk7CiAgICAgfQotI2VuZGlmCiAKICAgICBzcDxBdWRpb1RyYWNrVGhyZWFkPiB0ID0gbUF1ZGlvVHJhY2tUaHJlYWQ7CiAgICAgaWYgKHQgIT0gMCkgewpAQCAtNjY5LDI0ICs3MzEsMzEgQEAKIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0U2FtcGxlUmF0ZSh1aW50MzJfdCByYXRlKQogewotICAgIGlmIChtSXNUaW1lZCB8fCBpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgaWYgKHJhdGUgPT0gbVNhbXBsZVJhdGUpIHsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBpZiAobUlzVGltZWQgfHwgaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgfHwgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0KLSAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgaWYgKG1PdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQorICAgIC8vIE5PVEU6IGl0IGlzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUsIGJ1dCBoaWdobHkgdW5saWtlbHksIHRoYXQgYSBkZXZpY2UgY2hhbmdlCisgICAgLy8gY291bGQgbWVhbiBhIHByZXZpb3VzbHkgYWxsb3dlZCBzYW1wbGluZyByYXRlIGlzIG5vIGxvbmdlciBhbGxvd2VkLgogICAgIHVpbnQzMl90IGFmU2FtcGxpbmdSYXRlOwogICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0U2FtcGxpbmdSYXRlKG1PdXRwdXQsICZhZlNhbXBsaW5nUmF0ZSkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIGlmIChyYXRlID09IDAgfHwgcmF0ZSA+IGFmU2FtcGxpbmdSYXRlICogQVVESU9fUkVTQU1QTEVSX0RPV05fUkFUSU9fTUFYKSB7CisgICAgLy8gcGl0Y2ggaXMgZW11bGF0ZWQgYnkgYWRqdXN0aW5nIHNwZWVkIGFuZCBzYW1wbGVSYXRlCisgICAgY29uc3QgdWludDMyX3QgZWZmZWN0aXZlU2FtcGxlUmF0ZSA9IGFkanVzdFNhbXBsZVJhdGUocmF0ZSwgbVBsYXliYWNrUmF0ZS5tUGl0Y2gpOworICAgIGlmIChyYXRlID09IDAgfHwgZWZmZWN0aXZlU2FtcGxlUmF0ZSA+IGFmU2FtcGxpbmdSYXRlICogQVVESU9fUkVTQU1QTEVSX0RPV05fUkFUSU9fTUFYKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorICAgIC8vIFRPRE86IFNob3VsZCB3ZSBhbHNvIGNoZWNrIGlmIHRoZSBidWZmZXIgc2l6ZSBpcyBjb21wYXRpYmxlPwogCiAgICAgbVNhbXBsZVJhdGUgPSByYXRlOwotICAgIG1Qcm94eS0+c2V0U2FtcGxlUmF0ZShyYXRlKTsKKyAgICBtUHJveHktPnNldFNhbXBsZVJhdGUoZWZmZWN0aXZlU2FtcGxlUmF0ZSk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC03MTQsNiArNzgzLDY5IEBACiAgICAgcmV0dXJuIG1TYW1wbGVSYXRlOwogfQogCit1aW50MzJfdCBBdWRpb1RyYWNrOjpnZXRPcmlnaW5hbFNhbXBsZVJhdGUoKSBjb25zdAoreworICAgIGlmIChtSXNUaW1lZCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gbU9yaWdpbmFsU2FtcGxlUmF0ZTsKK30KKworc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpCit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIGlmIChpc0F1ZGlvUGxheWJhY2tSYXRlRXF1YWwocGxheWJhY2tSYXRlLCBtUGxheWJhY2tSYXRlKSkgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIGlmIChtSXNUaW1lZCB8fCBpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGlmIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgLy8gcGl0Y2ggaXMgZW11bGF0ZWQgYnkgYWRqdXN0aW5nIHNwZWVkIGFuZCBzYW1wbGVSYXRlCisgICAgY29uc3QgdWludDMyX3QgZWZmZWN0aXZlUmF0ZSA9IGFkanVzdFNhbXBsZVJhdGUobVNhbXBsZVJhdGUsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOworICAgIGNvbnN0IGZsb2F0IGVmZmVjdGl2ZVNwZWVkID0gYWRqdXN0U3BlZWQocGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CisgICAgY29uc3QgZmxvYXQgZWZmZWN0aXZlUGl0Y2ggPSBhZGp1c3RQaXRjaChwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICBBdWRpb1BsYXliYWNrUmF0ZSBwbGF5YmFja1JhdGVUZW1wID0gcGxheWJhY2tSYXRlOworICAgIHBsYXliYWNrUmF0ZVRlbXAubVNwZWVkID0gZWZmZWN0aXZlU3BlZWQ7CisgICAgcGxheWJhY2tSYXRlVGVtcC5tUGl0Y2ggPSBlZmZlY3RpdmVQaXRjaDsKKworICAgIGlmICghaXNBdWRpb1BsYXliYWNrUmF0ZVZhbGlkKHBsYXliYWNrUmF0ZVRlbXApKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIC8vIENoZWNrIGlmIHRoZSBidWZmZXIgc2l6ZSBpcyBjb21wYXRpYmxlLgorICAgIGlmICghaXNTYW1wbGVSYXRlU3BlZWRBbGxvd2VkX2woZWZmZWN0aXZlUmF0ZSwgZWZmZWN0aXZlU3BlZWQpKSB7CisgICAgICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUoJWYsICVmKSBmYWlsZWQiLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDaGVjayByZXNhbXBsZXIgcmF0aW9zIGFyZSB3aXRoaW4gYm91bmRzCisgICAgaWYgKGVmZmVjdGl2ZVJhdGUgPiBtU2FtcGxlUmF0ZSAqIEFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWCkgeworICAgICAgICBBTE9HVigic2V0UGxheWJhY2tSYXRlKCVmLCAlZikgZmFpbGVkLiBSZXNhbXBsZSByYXRlIGV4Y2VlZHMgbWF4IGFjY2VwdGVkIHZhbHVlIiwKKyAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoZWZmZWN0aXZlUmF0ZSAqIEFVRElPX1JFU0FNUExFUl9VUF9SQVRJT19NQVggPCBtU2FtcGxlUmF0ZSkgeworICAgICAgICBBTE9HVigic2V0UGxheWJhY2tSYXRlKCVmLCAlZikgZmFpbGVkLiBSZXNhbXBsZSByYXRlIGJlbG93IG1pbiBhY2NlcHRlZCB2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbVBsYXliYWNrUmF0ZSA9IHBsYXliYWNrUmF0ZTsKKyAgICAvL3NldCBlZmZlY3RpdmUgcmF0ZXMKKyAgICBtUHJveHktPnNldFBsYXliYWNrUmF0ZShwbGF5YmFja1JhdGVUZW1wKTsKKyAgICBtUHJveHktPnNldFNhbXBsZVJhdGUoZWZmZWN0aXZlUmF0ZSk7IC8vIEZJWE1FOiBub3QgcXVpdGUgImF0b21pYyIgd2l0aCBzZXRQbGF5YmFja1JhdGUKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2NvbnN0IEF1ZGlvUGxheWJhY2tSYXRlJiBBdWRpb1RyYWNrOjpnZXRQbGF5YmFja1JhdGUoKSBjb25zdAoreworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbVBsYXliYWNrUmF0ZTsKK30KKwogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0TG9vcCh1aW50MzJfdCBsb29wU3RhcnQsIHVpbnQzMl90IGxvb3BFbmQsIGludCBsb29wQ291bnQpCiB7CiAgICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCB8fCBtSXNUaW1lZCB8fCBpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKQEAgLTc0MCwxMCArODcyLDE1IEBACiAKIHZvaWQgQXVkaW9UcmFjazo6c2V0TG9vcF9sKHVpbnQzMl90IGxvb3BTdGFydCwgdWludDMyX3QgbG9vcEVuZCwgaW50IGxvb3BDb3VudCkKIHsKLSAgICAvLyBTZXR0aW5nIHRoZSBsb29wIHdpbGwgcmVzZXQgbmV4dCBub3RpZmljYXRpb24gdXBkYXRlIHBlcmlvZCAobGlrZSBzZXRQb3NpdGlvbikuCi0gICAgbU5ld1Bvc2l0aW9uID0gdXBkYXRlQW5kR2V0UG9zaXRpb25fbCgpICsgbVVwZGF0ZVBlcmlvZDsKLSAgICBtTG9vcFBlcmlvZCA9IGxvb3BDb3VudCAhPSAwID8gbG9vcEVuZCAtIGxvb3BTdGFydCA6IDA7CisgICAgLy8gV2UgZG8gbm90IHVwZGF0ZSB0aGUgcGVyaW9kaWMgbm90aWZpY2F0aW9uIHBvaW50LgorICAgIC8vIG1OZXdQb3NpdGlvbiA9IHVwZGF0ZUFuZEdldFBvc2l0aW9uX2woKSArIG1VcGRhdGVQZXJpb2Q7CisgICAgbUxvb3BDb3VudCA9IGxvb3BDb3VudDsKKyAgICBtTG9vcEVuZCA9IGxvb3BFbmQ7CisgICAgbUxvb3BTdGFydCA9IGxvb3BTdGFydDsKKyAgICBtTG9vcENvdW50Tm90aWZpZWQgPSBsb29wQ291bnQ7CiAgICAgbVN0YXRpY1Byb3h5LT5zZXRMb29wKGxvb3BTdGFydCwgbG9vcEVuZCwgbG9vcENvdW50KTsKKworICAgIC8vIFdha2luZyB0aGUgQXVkaW9UcmFja1RocmVhZCBpcyBub3QgbmVlZGVkIGFzIHRoaXMgY2Fubm90IGJlIGNhbGxlZCB3aGVuIGFjdGl2ZS4KIH0KIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0TWFya2VyUG9zaXRpb24odWludDMyX3QgbWFya2VyKQpAQCAtNzU3LDYgKzg5NCwxMCBAQAogICAgIG1NYXJrZXJQb3NpdGlvbiA9IG1hcmtlcjsKICAgICBtTWFya2VyUmVhY2hlZCA9IGZhbHNlOwogCisgICAgc3A8QXVkaW9UcmFja1RocmVhZD4gdCA9IG1BdWRpb1RyYWNrVGhyZWFkOworICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgdC0+d2FrZSgpOworICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTc4Niw2ICs5MjcsMTAgQEAKICAgICBtTmV3UG9zaXRpb24gPSB1cGRhdGVBbmRHZXRQb3NpdGlvbl9sKCkgKyB1cGRhdGVQZXJpb2Q7CiAgICAgbVVwZGF0ZVBlcmlvZCA9IHVwZGF0ZVBlcmlvZDsKIAorICAgIHNwPEF1ZGlvVHJhY2tUaHJlYWQ+IHQgPSBtQXVkaW9UcmFja1RocmVhZDsKKyAgICBpZiAodCAhPSAwKSB7CisgICAgICAgIHQtPndha2UoKTsKKyAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC04MjMsMTIgKzk2OCwxMSBAQAogICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQUNUSVZFKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CisgICAgLy8gQWZ0ZXIgc2V0dGluZyB0aGUgcG9zaXRpb24sIHVzZSBmdWxsIHVwZGF0ZSBwZXJpb2QgYmVmb3JlIG5vdGlmaWNhdGlvbi4KICAgICBtTmV3UG9zaXRpb24gPSB1cGRhdGVBbmRHZXRQb3NpdGlvbl9sKCkgKyBtVXBkYXRlUGVyaW9kOwotICAgIG1Mb29wUGVyaW9kID0gMDsKLSAgICAvLyBGSVhNRSBDaGVjayB3aGV0aGVyIGxvb3BzIGFuZCBzZXR0aW5nIHBvc2l0aW9uIGFyZSBpbmNvbXBhdGlibGUgaW4gb2xkIGNvZGUuCi0gICAgLy8gSWYgd2UgdXNlIHNldExvb3AgZm9yIGJvdGggcHVycG9zZXMgd2UgbG9zZSB0aGUgY2FwYWJpbGl0eSB0byBzZXQgdGhlIHBvc2l0aW9uIHdoaWxlIGxvb3BpbmcuCi0gICAgbVN0YXRpY1Byb3h5LT5zZXRMb29wKHBvc2l0aW9uLCBtRnJhbWVDb3VudCwgMCk7CisgICAgbVN0YXRpY1Byb3h5LT5zZXRCdWZmZXJQb3NpdGlvbihwb3NpdGlvbik7CiAKKyAgICAvLyBXYWtpbmcgdGhlIEF1ZGlvVHJhY2tUaHJlYWQgaXMgbm90IG5lZWRlZCBhcyB0aGlzIGNhbm5vdCBiZSBjYWxsZWQgd2hlbiBhY3RpdmUuCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC04NDksMTUgKzk5MywxOCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IGhhbEZyYW1lczsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpnZXRSZW5kZXJQb3NpdGlvbihtT3V0cHV0LCAmaGFsRnJhbWVzLCAmZHNwRnJhbWVzKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGhhbEZyYW1lczsgLy8gYWN0dWFsbHkgdW51c2VkCisgICAgICAgICAgICAodm9pZCkgQXVkaW9TeXN0ZW06OmdldFJlbmRlclBvc2l0aW9uKG1PdXRwdXQsICZoYWxGcmFtZXMsICZkc3BGcmFtZXMpOworICAgICAgICAgICAgLy8gRklYTUU6IG9uIGdldFJlbmRlclBvc2l0aW9uKCkgZXJyb3IsIHdlIHJldHVybiBPSyB3aXRoIGZyYW1lIHBvc2l0aW9uIDAuCiAgICAgICAgIH0KICAgICAgICAgLy8gRklYTUU6IGRzcEZyYW1lcyBtYXkgbm90IGJlIHplcm8gaW4gKG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEIHx8IG1TdGF0ZSA9PSBTVEFURV9GTFVTSEVEKQogICAgICAgICAvLyBkdWUgdG8gaGFyZHdhcmUgbGF0ZW5jeS4gV2UgbGVhdmUgdGhpcyBiZWhhdmlvciBmb3Igbm93LgogICAgICAgICAqcG9zaXRpb24gPSBkc3BGcmFtZXM7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKG1DYmxrLT5tRmxhZ3MgJiBDQkxLX0lOVkFMSUQpIHsKLSAgICAgICAgICAgIHJlc3RvcmVUcmFja19sKCJnZXRQb3NpdGlvbiIpOworICAgICAgICAgICAgKHZvaWQpIHJlc3RvcmVUcmFja19sKCJnZXRQb3NpdGlvbiIpOworICAgICAgICAgICAgLy8gRklYTUU6IGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEphdmEgQVBJIHdlIGlnbm9yZSB0aGUgcmVzdG9yZVRyYWNrX2woKQorICAgICAgICAgICAgLy8gZXJyb3IgaGVyZSAoZS5nLiBERUFEX09CSkVDVCkgYW5kIHJldHVybiBPSyB3aXRoIHRoZSBsYXN0IHJlY29yZGVkIHNlcnZlciBwb3NpdGlvbi4KICAgICAgICAgfQogCiAgICAgICAgIC8vIElBdWRpb1RyYWNrOjpzdG9wKCkgaXNuJ3Qgc3luY2hyb25vdXM7IHdlIGRvbid0IGtub3cgd2hlbiBwcmVzZW50YXRpb24gY29tcGxldGVzCkBAIC04OTMsMTAgKzEwNDAsMTkgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBtTmV3UG9zaXRpb24gPSBtVXBkYXRlUGVyaW9kOwotICAgIG1Mb29wUGVyaW9kID0gMDsKLSAgICAvLyBGSVhNRSBUaGUgbmV3IGNvZGUgY2Fubm90IHJlbG9hZCB3aGlsZSBrZWVwaW5nIGEgbG9vcCBzcGVjaWZpZWQuCi0gICAgLy8gTmVlZCB0byBjaGVjayBob3cgdGhlIG9sZCBjb2RlIGhhbmRsZWQgdGhpcywgYW5kIHdoZXRoZXIgaXQncyBhIHNpZ25pZmljYW50IGNoYW5nZS4KLSAgICBtU3RhdGljUHJveHktPnNldExvb3AoMCwgbUZyYW1lQ291bnQsIDApOworICAgICh2b2lkKSB1cGRhdGVBbmRHZXRQb3NpdGlvbl9sKCk7CisgICAgbVBvc2l0aW9uID0gMDsKKyAgICBtUHJldmlvdXNUaW1lc3RhbXBWYWxpZCA9IGZhbHNlOworI2lmIDAKKyAgICAvLyBUaGUgZG9jdW1lbnRhdGlvbiBpcyBub3QgY2xlYXIgb24gdGhlIGJlaGF2aW9yIG9mIHJlbG9hZCgpIGFuZCB0aGUgcmVzdG9yYXRpb24KKyAgICAvLyBvZiBsb29wIGNvdW50LiBIaXN0b3JpY2FsbHkgd2UgaGF2ZSBub3QgcmVzdG9yZWQgbG9vcCBjb3VudCwgc3RhcnQsIGVuZCwKKyAgICAvLyBidXQgaXQgbWFrZXMgc2Vuc2UgaWYgb25lIGRlc2lyZXMgdG8gcmVwZWF0IHBsYXlpbmcgYSBwYXJ0aWN1bGFyIHNvdW5kLgorICAgIGlmIChtTG9vcENvdW50ICE9IDApIHsKKyAgICAgICAgbUxvb3BDb3VudE5vdGlmaWVkID0gbUxvb3BDb3VudDsKKyAgICAgICAgbVN0YXRpY1Byb3h5LT5zZXRMb29wKG1Mb29wU3RhcnQsIG1Mb29wRW5kLCBtTG9vcENvdW50KTsKKyAgICB9CisjZW5kaWYKKyAgICBtU3RhdGljUHJveHktPnNldEJ1ZmZlclBvc2l0aW9uKDApOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtOTA2LDYgKzEwNjIsMjggQEAKICAgICByZXR1cm4gbU91dHB1dDsKIH0KIAorc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgaWYgKG1TZWxlY3RlZERldmljZUlkICE9IGRldmljZUlkKSB7CisgICAgICAgIG1TZWxlY3RlZERldmljZUlkID0gZGV2aWNlSWQ7CisgICAgICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfSU5WQUxJRCwgJm1DYmxrLT5tRmxhZ3MpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2F1ZGlvX3BvcnRfaGFuZGxlX3QgQXVkaW9UcmFjazo6Z2V0T3V0cHV0RGV2aWNlKCkgeworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbVNlbGVjdGVkRGV2aWNlSWQ7Cit9CisKK2F1ZGlvX3BvcnRfaGFuZGxlX3QgQXVkaW9UcmFjazo6Z2V0Um91dGVkRGV2aWNlSWQoKSB7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIGlmIChtT3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIH0KKyAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmdldERldmljZUlkRm9ySW8obU91dHB1dCk7Cit9CisKIHN0YXR1c190IEF1ZGlvVHJhY2s6OmF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwpAQCAtOTM1LDE5ICsxMTEzLDIzIEBACiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KIAorICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCAmJiBtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjaywgbU91dHB1dCk7CisgICAgfQogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBtU3RyZWFtVHlwZTsKICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIgPSAobVN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpID8gJm1BdHRyaWJ1dGVzIDogTlVMTDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cihhdHRyLCAmb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19zZXNzaW9uX3QpbVNlc3Npb25JZCwgJnN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MsIG1PZmZsb2FkSW5mbyk7CiAKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoYXR0ciwgJm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fc2Vzc2lvbl90KW1TZXNzaW9uSWQsICZzdHJlYW1UeXBlLCBtQ2xpZW50VWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzLCBtU2VsZWN0ZWREZXZpY2VJZCwgbU9mZmxvYWRJbmZvKTsKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwgb3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvIG91dHB1dCBmb3Igc3RyZWFtIHR5cGUgJWQsIHVzYWdlICVkLCBzYW1wbGUgcmF0ZSAldSwgZm9ybWF0ICUjeCwiCisgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvIG91dHB1dCBmb3Igc2Vzc2lvbiAlZCwgc3RyZWFtIHR5cGUgJWQsIHVzYWdlICVkLCBzYW1wbGUgcmF0ZSAldSwgZm9ybWF0ICUjeCwiCiAgICAgICAgICAgICAgICIgY2hhbm5lbCBtYXNrICUjeCwgZmxhZ3MgJSN4IiwKLSAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgbUF0dHJpYnV0ZXMudXNhZ2UsIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1GbGFncyk7CisgICAgICAgICAgICAgIG1TZXNzaW9uSWQsIHN0cmVhbVR5cGUsIG1BdHRyaWJ1dGVzLnVzYWdlLCBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtRmxhZ3MpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICB7CkBAIC05NTUsMjkgKzExMzcsMjcgQEAKICAgICAvLyB3ZSBtdXN0IHJlbGVhc2UgaXQgb3Vyc2VsdmVzIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcuCiAKICAgICAvLyBOb3QgYWxsIG9mIHRoZXNlIHZhbHVlcyBhcmUgbmVlZGVkIHVuZGVyIGFsbCBjb25kaXRpb25zLCBidXQgaXQgaXMgZWFzaWVyIHRvIGdldCB0aGVtIGFsbAotCi0gICAgdWludDMyX3QgYWZMYXRlbmN5OwotICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRMYXRlbmN5KG91dHB1dCwgJmFmTGF0ZW5jeSk7CisgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldExhdGVuY3kob3V0cHV0LCAmbUFmTGF0ZW5jeSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiZ2V0TGF0ZW5jeSglZCkgZmFpbGVkIHN0YXR1cyAlZCIsIG91dHB1dCwgc3RhdHVzKTsKICAgICAgICAgZ290byByZWxlYXNlOwogICAgIH0KKyAgICBBTE9HVigiY3JlYXRlVHJhY2tfbCgpIG91dHB1dCAlZCBhZkxhdGVuY3kgJXUiLCBvdXRwdXQsIG1BZkxhdGVuY3kpOwogCi0gICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKLSAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0RnJhbWVDb3VudChvdXRwdXQsICZhZkZyYW1lQ291bnQpOworICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRGcmFtZUNvdW50KG91dHB1dCwgJm1BZkZyYW1lQ291bnQpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoImdldEZyYW1lQ291bnQob3V0cHV0PSVkKSBzdGF0dXMgJWQiLCBvdXRwdXQsIHN0YXR1cyk7CiAgICAgICAgIGdvdG8gcmVsZWFzZTsKICAgICB9CiAKLSAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7Ci0gICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldFNhbXBsaW5nUmF0ZShvdXRwdXQsICZhZlNhbXBsZVJhdGUpOworICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRTYW1wbGluZ1JhdGUob3V0cHV0LCAmbUFmU2FtcGxlUmF0ZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiZ2V0U2FtcGxpbmdSYXRlKG91dHB1dD0lZCkgc3RhdHVzICVkIiwgb3V0cHV0LCBzdGF0dXMpOwogICAgICAgICBnb3RvIHJlbGVhc2U7CiAgICAgfQogICAgIGlmIChtU2FtcGxlUmF0ZSA9PSAwKSB7Ci0gICAgICAgIG1TYW1wbGVSYXRlID0gYWZTYW1wbGVSYXRlOworICAgICAgICBtU2FtcGxlUmF0ZSA9IG1BZlNhbXBsZVJhdGU7CisgICAgICAgIG1PcmlnaW5hbFNhbXBsZVJhdGUgPSBtQWZTYW1wbGVSYXRlOwogICAgIH0KICAgICAvLyBDbGllbnQgZGVjaWRlcyB3aGV0aGVyIHRoZSB0cmFjayBpcyBUSU1FRCAoc2VlIGJlbG93KSwgYnV0IGNhbiBvbmx5IGV4cHJlc3MgYSBwcmVmZXJlbmNlCiAgICAgLy8gZm9yIEZBU1QuICBTZXJ2ZXIgd2lsbCBwZXJmb3JtIGFkZGl0aW9uYWwgdGVzdHMuCkBAIC05ODYsMjMgKzExNjYsMjMgQEAKICAgICAgICAgICAgIC8vIHVzZSBjYXNlIDE6IHNoYXJlZCBidWZmZXIKICAgICAgICAgICAgIChtU2hhcmVkQnVmZmVyICE9IDApIHx8CiAgICAgICAgICAgICAvLyB1c2UgY2FzZSAyOiBjYWxsYmFjayB0cmFuc2ZlciBtb2RlCi0gICAgICAgICAgICAobVRyYW5zZmVyID09IFRSQU5TRkVSX0NBTExCQUNLKSkgJiYKKyAgICAgICAgICAgIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfQ0FMTEJBQ0spIHx8CisgICAgICAgICAgICAvLyB1c2UgY2FzZSAzOiBvYnRhaW4vcmVsZWFzZSBtb2RlCisgICAgICAgICAgICAobVRyYW5zZmVyID09IFRSQU5TRkVSX09CVEFJTikpICYmCiAgICAgICAgICAgICAvLyBtYXRjaGluZyBzYW1wbGUgcmF0ZQotICAgICAgICAgICAgKG1TYW1wbGVSYXRlID09IGFmU2FtcGxlUmF0ZSkpKSB7Ci0gICAgICAgIEFMT0dXKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBjbGllbnQiKTsKKyAgICAgICAgICAgIChtU2FtcGxlUmF0ZSA9PSBtQWZTYW1wbGVSYXRlKSkpIHsKKyAgICAgICAgQUxPR1coIkFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IGNsaWVudDsgdHJhbnNmZXIgJWQsIHRyYWNrICV1IEh6LCBvdXRwdXQgJXUgSHoiLAorICAgICAgICAgICAgICAgIG1UcmFuc2ZlciwgbVNhbXBsZVJhdGUsIG1BZlNhbXBsZVJhdGUpOwogICAgICAgICAvLyBvbmNlIGRlbmllZCwgZG8gbm90IHJlcXVlc3QgYWdhaW4gaWYgSUF1ZGlvVHJhY2sgaXMgcmUtY3JlYXRlZAogICAgICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChtRmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7CiAgICAgfQotICAgIEFMT0dWKCJjcmVhdGVUcmFja19sKCkgb3V0cHV0ICVkIGFmTGF0ZW5jeSAlZCIsIG91dHB1dCwgYWZMYXRlbmN5KTsKIAogICAgIC8vIFRoZSBjbGllbnQncyBBdWRpb1RyYWNrIGJ1ZmZlciBpcyBkaXZpZGVkIGludG8gbiBwYXJ0cyBmb3IgcHVycG9zZSBvZiB3YWtldXAgYnkgc2VydmVyLCB3aGVyZQogICAgIC8vICBuID0gMSAgIGZhc3QgdHJhY2sgd2l0aCBzaW5nbGUgYnVmZmVyaW5nOyBuQnVmZmVyaW5nIGlzIGlnbm9yZWQKICAgICAvLyAgbiA9IDIgICBmYXN0IHRyYWNrIHdpdGggZG91YmxlIGJ1ZmZlcmluZwotICAgIC8vICBuID0gMiAgIG5vcm1hbCB0cmFjaywgbm8gc2FtcGxlIHJhdGUgY29udmVyc2lvbgotICAgIC8vICBuID0gMyAgIG5vcm1hbCB0cmFjaywgd2l0aCBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uCi0gICAgLy8gICAgICAgICAgKHBlc3NpbWlzdGljOyBzb21lIG5vbi0xOjEgY29udmVyc2lvbiByYXRpb3MgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0cmlwbGUtYnVmZmVyaW5nKQotICAgIC8vICBuID4gMyAgIHZlcnkgaGlnaCBsYXRlbmN5IG9yIHZlcnkgc21hbGwgbm90aWZpY2F0aW9uIGludGVydmFsOyBuQnVmZmVyaW5nIGlzIGlnbm9yZWQKLSAgICBjb25zdCB1aW50MzJfdCBuQnVmZmVyaW5nID0gKG1TYW1wbGVSYXRlID09IGFmU2FtcGxlUmF0ZSkgPyAyIDogMzsKKyAgICAvLyAgbiA9IDIgICBub3JtYWwgdHJhY2ssIChpbmNsdWRpbmcgdGhvc2Ugd2l0aCBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uKQorICAgIC8vICBuID49IDMgIHZlcnkgaGlnaCBsYXRlbmN5IG9yIHZlcnkgc21hbGwgbm90aWZpY2F0aW9uIGludGVydmFsICh1bnVzZWQpLgorICAgIGNvbnN0IHVpbnQzMl90IG5CdWZmZXJpbmcgPSAyOwogCiAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IG1Ob3RpZmljYXRpb25GcmFtZXNSZXE7CiAKQEAgLTEwMTMsMTggKzExOTMsMTggQEAKICAgICAgICAgICAgIC8vIFNhbWUgY29tbWVudCBhcyBiZWxvdyBhYm91dCBpZ25vcmluZyBmcmFtZUNvdW50IHBhcmFtZXRlciBmb3Igc2V0KCkKICAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtU2hhcmVkQnVmZmVyLT5zaXplKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoZnJhbWVDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBmcmFtZUNvdW50ID0gYWZGcmFtZUNvdW50OworICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1BZkZyYW1lQ291bnQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgIT0gZnJhbWVDb3VudCkgewogICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9IGZyYW1lQ291bnQ7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1TaGFyZWRCdWZmZXIgIT0gMCkgewotCi0gICAgICAgIC8vIEVuc3VyZSB0aGF0IGJ1ZmZlciBhbGlnbm1lbnQgbWF0Y2hlcyBjaGFubmVsIGNvdW50Ci0gICAgICAgIC8vIDgtYml0IGRhdGEgaW4gc2hhcmVkIG1lbW9yeSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBieSBBdWRpb0ZsaW5nZXIKLSAgICAgICAgc2l6ZV90IGFsaWdubWVudCA9IGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoCi0gICAgICAgICAgICAgICAgbUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUID8gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgOiBtRm9ybWF0KTsKKyAgICAgICAgLy8gRklYTUU6IEVuc3VyZSBjbGllbnQgc2lkZSBtZW1vcnkgYnVmZmVycyBuZWVkCisgICAgICAgIC8vIG5vdCBoYXZlIGFkZGl0aW9uYWwgYWxpZ25tZW50IGJleW9uZCBzYW1wbGUKKyAgICAgICAgLy8gKGUuZy4gMTYgYml0IHN0ZXJlbyBhY2Nlc3NlZCBhcyAzMiBiaXQgZnJhbWUpLgorICAgICAgICBzaXplX3QgYWxpZ25tZW50ID0gYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRm9ybWF0KTsKICAgICAgICAgaWYgKGFsaWdubWVudCAmIDEpIHsKKyAgICAgICAgICAgIC8vIGZvciBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQgKG5vdCBleHBvc2VkIHRocm91Z2ggSmF2YSkuCiAgICAgICAgICAgICBhbGlnbm1lbnQgPSAxOwogICAgICAgICB9CiAgICAgICAgIGlmIChtQ2hhbm5lbENvdW50ID4gMSkgewpAQCAtMTA0Miw0MCArMTIyMiwxOSBAQAogICAgICAgICAvLyB0aGVyZSdzIG5vIGZyYW1lQ291bnQgcGFyYW1ldGVyLgogICAgICAgICAvLyBCdXQgd2hlbiBpbml0aWFsaXppbmcgYSBzaGFyZWQgYnVmZmVyIEF1ZGlvVHJhY2sgdmlhIHNldCgpLAogICAgICAgICAvLyB0aGVyZSBfaXNfIGEgZnJhbWVDb3VudCBwYXJhbWV0ZXIuICBXZSBzaWxlbnRseSBpZ25vcmUgaXQuCi0gICAgICAgIGZyYW1lQ291bnQgPSBtU2hhcmVkQnVmZmVyLT5zaXplKCkgLyBtRnJhbWVTaXplQUY7Ci0KLSAgICB9IGVsc2UgaWYgKCEobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkpIHsKLQotICAgICAgICAvLyBGSVhNRSBtb3ZlIHRoZXNlIGNhbGN1bGF0aW9ucyBhbmQgYXNzb2NpYXRlZCBjaGVja3MgdG8gc2VydmVyCi0KLSAgICAgICAgLy8gRW5zdXJlIHRoYXQgYnVmZmVyIGRlcHRoIGNvdmVycyBhdCBsZWFzdCBhdWRpbyBoYXJkd2FyZSBsYXRlbmN5Ci0gICAgICAgIHVpbnQzMl90IG1pbkJ1ZkNvdW50ID0gYWZMYXRlbmN5IC8gKCgxMDAwICogYWZGcmFtZUNvdW50KS9hZlNhbXBsZVJhdGUpOwotICAgICAgICBBTE9HVigiYWZGcmFtZUNvdW50PSV6dSwgbWluQnVmQ291bnQ9JWQsIGFmU2FtcGxlUmF0ZT0ldSwgYWZMYXRlbmN5PSVkIiwKLSAgICAgICAgICAgICAgICBhZkZyYW1lQ291bnQsIG1pbkJ1ZkNvdW50LCBhZlNhbXBsZVJhdGUsIGFmTGF0ZW5jeSk7Ci0gICAgICAgIGlmIChtaW5CdWZDb3VudCA8PSBuQnVmZmVyaW5nKSB7Ci0gICAgICAgICAgICBtaW5CdWZDb3VudCA9IG5CdWZmZXJpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgbWluRnJhbWVDb3VudCA9IGFmRnJhbWVDb3VudCAqIG1pbkJ1ZkNvdW50ICogdWludDY0X3QobVNhbXBsZVJhdGUpIC8gYWZTYW1wbGVSYXRlOwotICAgICAgICBBTE9HVigibWluRnJhbWVDb3VudDogJXp1LCBhZkZyYW1lQ291bnQ9JXp1LCBtaW5CdWZDb3VudD0lZCwgc2FtcGxlUmF0ZT0ldSwgYWZTYW1wbGVSYXRlPSV1IgotICAgICAgICAgICAgICAgICIsIGFmTGF0ZW5jeT0lZCIsCi0gICAgICAgICAgICAgICAgbWluRnJhbWVDb3VudCwgYWZGcmFtZUNvdW50LCBtaW5CdWZDb3VudCwgbVNhbXBsZVJhdGUsIGFmU2FtcGxlUmF0ZSwgYWZMYXRlbmN5KTsKLQotICAgICAgICBpZiAoZnJhbWVDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBmcmFtZUNvdW50ID0gbWluRnJhbWVDb3VudDsKLSAgICAgICAgfSBlbHNlIGlmIChmcmFtZUNvdW50IDwgbWluRnJhbWVDb3VudCkgewotICAgICAgICAgICAgLy8gbm90IEFMT0dXIGJlY2F1c2UgaXQgaGFwcGVucyBhbGwgdGhlIHRpbWUgd2hlbiBwbGF5aW5nIGtleSBjbGlja3Mgb3ZlciBBMkRQCi0gICAgICAgICAgICBBTE9HVigiTWluaW11bSBidWZmZXIgc2l6ZSBjb3JyZWN0ZWQgZnJvbSAlenUgdG8gJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIG1pbkZyYW1lQ291bnQpOwotICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1pbkZyYW1lQ291bnQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgYXBwbGljYXRpb24gaXMgbm90aWZpZWQgd2l0aCBzdWZmaWNpZW50IG1hcmdpbiBiZWZvcmUgdW5kZXJydW4KLSAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPT0gMCB8fCBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID4gZnJhbWVDb3VudC9uQnVmZmVyaW5nKSB7Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gZnJhbWVDb3VudC9uQnVmZmVyaW5nOwotICAgICAgICB9Ci0KKyAgICAgICAgZnJhbWVDb3VudCA9IG1TaGFyZWRCdWZmZXItPnNpemUoKSAvIG1GcmFtZVNpemU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gRm9yIGZhc3QgdHJhY2tzLCB0aGUgZnJhbWUgY291bnQgY2FsY3VsYXRpb25zIGFuZCBjaGVja3MgYXJlIGRvbmUgYnkgc2VydmVyCisgICAgICAgIC8vIEZvciBmYXN0IHRyYWNrcyB0aGUgZnJhbWUgY291bnQgY2FsY3VsYXRpb25zIGFuZCBjaGVja3MgYXJlIGRvbmUgYnkgc2VydmVyCisKKyAgICAgICAgaWYgKChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBmb3Igbm9ybWFsIHRyYWNrcyBwcmVjb21wdXRlIHRoZSBmcmFtZSBjb3VudCBiYXNlZCBvbiBzcGVlZC4KKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBtaW5GcmFtZUNvdW50ID0gY2FsY3VsYXRlTWluRnJhbWVDb3VudCgKKyAgICAgICAgICAgICAgICAgICAgbUFmTGF0ZW5jeSwgbUFmRnJhbWVDb3VudCwgbUFmU2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1JhdGUubVNwZWVkKTsKKyAgICAgICAgICAgIGlmIChmcmFtZUNvdW50IDwgbWluRnJhbWVDb3VudCkgeworICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgPSBtaW5GcmFtZUNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCiAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCB0cmFja0ZsYWdzID0gSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfREVGQVVMVDsKQEAgLTExMDEsMTIgKzEyNjAsMTAgQEAKIAogICAgIHNpemVfdCB0ZW1wID0gZnJhbWVDb3VudDsgICAvLyB0ZW1wIG1heSBiZSByZXBsYWNlZCBieSBhIHJldmlzZWQgdmFsdWUgb2YgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHdlIHdpbGwgc3RpbGwgbmVlZCB0aGUgb3JpZ2luYWwgdmFsdWUgYWxzbworICAgIGludCBvcmlnaW5hbFNlc3Npb25JZCA9IG1TZXNzaW9uSWQ7CiAgICAgc3A8SUF1ZGlvVHJhY2s+IHRyYWNrID0gYXVkaW9GbGluZ2VyLT5jcmVhdGVUcmFjayhzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb0ZsaW5nZXIgb25seSBzZWVzIDE2LWJpdCBQQ00KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV84X0JJVCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIDogbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFja0ZsYWdzLApAQCAtMTExNiw2ICsxMjczLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOworICAgIEFMT0dFX0lGKG9yaWdpbmFsU2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fQUxMT0NBVEUgJiYgbVNlc3Npb25JZCAhPSBvcmlnaW5hbFNlc3Npb25JZCwKKyAgICAgICAgICAgICJzZXNzaW9uIElEIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsIG9yaWdpbmFsU2Vzc2lvbklkLCBtU2Vzc2lvbklkKTsKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIkF1ZGlvRmxpbmdlciBjb3VsZCBub3QgY3JlYXRlIHRyYWNrLCBzdGF0dXM6ICVkIiwgc3RhdHVzKTsKQEAgLTExNjEsMjMgKzEzMjAsMTAgQEAKICAgICAgICAgaWYgKHRyYWNrRmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSB7CiAgICAgICAgICAgICBBTE9HVigiQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCBzdWNjZXNzZnVsOyBmcmFtZUNvdW50ICV6dSIsIGZyYW1lQ291bnQpOwogICAgICAgICAgICAgbUF3YWl0Qm9vc3QgPSB0cnVlOwotICAgICAgICAgICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIFRoZW9yZXRpY2FsbHkgZG91YmxlLWJ1ZmZlcmluZyBpcyBub3QgcmVxdWlyZWQgZm9yIGZhc3QgdHJhY2tzLAotICAgICAgICAgICAgICAgIC8vIGR1ZSB0byB0aWdodGVyIHNjaGVkdWxpbmcuICBCdXQgaW4gcHJhY3RpY2UsIHRvIGFjY29tbW9kYXRlIGtlcm5lbHMgd2l0aAotICAgICAgICAgICAgICAgIC8vIHNjaGVkdWxpbmcgaml0dGVyLCBhbmQgYXBwcyB3aXRoIGNvbXB1dGF0aW9uIGppdHRlciwgd2UgdXNlIGRvdWJsZS1idWZmZXJpbmcuCi0gICAgICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPT0gMCB8fCBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID4gZnJhbWVDb3VudC9uQnVmZmVyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBmcmFtZUNvdW50L25CdWZmZXJpbmc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR1YoIkFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IHNlcnZlcjsgZnJhbWVDb3VudCAlenUiLCBmcmFtZUNvdW50KTsKICAgICAgICAgICAgIC8vIG9uY2UgZGVuaWVkLCBkbyBub3QgcmVxdWVzdCBhZ2FpbiBpZiBJQXVkaW9UcmFjayBpcyByZS1jcmVhdGVkCiAgICAgICAgICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChtRmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7Ci0gICAgICAgICAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPT0gMCB8fCBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID4gZnJhbWVDb3VudC9uQnVmZmVyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSBmcmFtZUNvdW50L25CdWZmZXJpbmc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIGlmIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSB7CkBAIC0xMjAwLDYgKzEzNDYsMTYgQEAKICAgICAgICAgICAgIC8vcmV0dXJuIE5PX0lOSVQ7CiAgICAgICAgIH0KICAgICB9CisgICAgLy8gTWFrZSBzdXJlIHRoYXQgYXBwbGljYXRpb24gaXMgbm90aWZpZWQgd2l0aCBzdWZmaWNpZW50IG1hcmdpbiBiZWZvcmUgdW5kZXJydW4KKyAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwICYmIGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKKyAgICAgICAgLy8gVGhlb3JldGljYWxseSBkb3VibGUtYnVmZmVyaW5nIGlzIG5vdCByZXF1aXJlZCBmb3IgZmFzdCB0cmFja3MsCisgICAgICAgIC8vIGR1ZSB0byB0aWdodGVyIHNjaGVkdWxpbmcuICBCdXQgaW4gcHJhY3RpY2UsIHRvIGFjY29tbW9kYXRlIGtlcm5lbHMgd2l0aAorICAgICAgICAvLyBzY2hlZHVsaW5nIGppdHRlciwgYW5kIGFwcHMgd2l0aCBjb21wdXRhdGlvbiBqaXR0ZXIsIHdlIHVzZSBkb3VibGUtYnVmZmVyaW5nCisgICAgICAgIC8vIGZvciBmYXN0IHRyYWNrcyBqdXN0IGxpa2Ugbm9ybWFsIHN0cmVhbWluZyB0cmFja3MuCisgICAgICAgIGlmIChtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID09IDAgfHwgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA+IGZyYW1lQ291bnQgLyBuQnVmZmVyaW5nKSB7CisgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gZnJhbWVDb3VudCAvIG5CdWZmZXJpbmc7CisgICAgICAgIH0KKyAgICB9CiAKICAgICAvLyBXZSByZXRhaW4gYSBjb3B5IG9mIHRoZSBJL08gaGFuZGxlLCBidXQgZG9uJ3Qgb3duIHRoZSByZWZlcmVuY2UKICAgICBtT3V0cHV0ID0gb3V0cHV0OwpAQCAtMTIxMSwxNCArMTM2NywxOSBAQAogICAgIC8vIGFkZHJlc3Mgc3BhY2UuICBBdWRpb0ZsaW5nZXI6OlRyYWNrQmFzZTo6bUJ1ZmZlciBpcyBmb3IgdGhlIHNlcnZlciBhZGRyZXNzIHNwYWNlLgogICAgIHZvaWQqIGJ1ZmZlcnM7CiAgICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCkgewotICAgICAgICBidWZmZXJzID0gKGNoYXIqKWNibGsgKyBzaXplb2YoYXVkaW9fdHJhY2tfY2Jsa190KTsKKyAgICAgICAgYnVmZmVycyA9IGNibGsgKyAxOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGJ1ZmZlcnMgPSBtU2hhcmVkQnVmZmVyLT5wb2ludGVyKCk7CisgICAgICAgIGlmIChidWZmZXJzID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGJ1ZmZlciBwb2ludGVyIik7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIG1BdWRpb1RyYWNrLT5hdHRhY2hBdXhFZmZlY3QobUF1eEVmZmVjdElkKTsKKyAgICAvLyBGSVhNRSBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHNwZWVkIG9yIGZ1dHVyZSBzYW1wbGUgcmF0ZSBjaGFuZ2VzICh1bnRpbCByZXN0b3JlVHJhY2spCiAgICAgLy8gRklYTUUgZG9uJ3QgYmVsaWV2ZSB0aGlzIGxpZQotICAgIG1MYXRlbmN5ID0gYWZMYXRlbmN5ICsgKDEwMDAqZnJhbWVDb3VudCkgLyBtU2FtcGxlUmF0ZTsKKyAgICBtTGF0ZW5jeSA9IG1BZkxhdGVuY3kgKyAoMTAwMCpmcmFtZUNvdW50KSAvIG1TYW1wbGVSYXRlOwogCiAgICAgbUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwogICAgIC8vIElmIElBdWRpb1RyYWNrIGlzIHJlLWNyZWF0ZWQsIGRvbid0IGxldCB0aGUgcmVxdWVzdGVkIGZyYW1lQ291bnQKQEAgLTEyMjcsMTIgKzEzODgsMTUgQEAKICAgICAgICAgbVJlcUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwogICAgIH0KIAorICAgIC8vIHJlc2V0IHNlcnZlciBwb3NpdGlvbiB0byAwIGFzIHdlIGhhdmUgbmV3IGNibGsuCisgICAgbVNlcnZlciA9IDA7CisKICAgICAvLyB1cGRhdGUgcHJveHkKICAgICBpZiAobVNoYXJlZEJ1ZmZlciA9PSAwKSB7CiAgICAgICAgIG1TdGF0aWNQcm94eS5jbGVhcigpOwotICAgICAgICBtUHJveHkgPSBuZXcgQXVkaW9UcmFja0NsaWVudFByb3h5KGNibGssIGJ1ZmZlcnMsIGZyYW1lQ291bnQsIG1GcmFtZVNpemVBRik7CisgICAgICAgIG1Qcm94eSA9IG5ldyBBdWRpb1RyYWNrQ2xpZW50UHJveHkoY2JsaywgYnVmZmVycywgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbVN0YXRpY1Byb3h5ID0gbmV3IFN0YXRpY0F1ZGlvVHJhY2tDbGllbnRQcm94eShjYmxrLCBidWZmZXJzLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplQUYpOworICAgICAgICBtU3RhdGljUHJveHkgPSBuZXcgU3RhdGljQXVkaW9UcmFja0NsaWVudFByb3h5KGNibGssIGJ1ZmZlcnMsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUpOwogICAgICAgICBtUHJveHkgPSBtU3RhdGljUHJveHk7CiAgICAgfQogCkBAIC0xMjQxLDEyICsxNDA1LDI0IEBACiAgICAgICAgICAgICBnYWluX2Zyb21fZmxvYXQobVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX1JJR0hUXSkpKTsKIAogICAgIG1Qcm94eS0+c2V0U2VuZExldmVsKG1TZW5kTGV2ZWwpOwotICAgIG1Qcm94eS0+c2V0U2FtcGxlUmF0ZShtU2FtcGxlUmF0ZSk7CisgICAgY29uc3QgdWludDMyX3QgZWZmZWN0aXZlU2FtcGxlUmF0ZSA9IGFkanVzdFNhbXBsZVJhdGUobVNhbXBsZVJhdGUsIG1QbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICBjb25zdCBmbG9hdCBlZmZlY3RpdmVTcGVlZCA9IGFkanVzdFNwZWVkKG1QbGF5YmFja1JhdGUubVNwZWVkLCBtUGxheWJhY2tSYXRlLm1QaXRjaCk7CisgICAgY29uc3QgZmxvYXQgZWZmZWN0aXZlUGl0Y2ggPSBhZGp1c3RQaXRjaChtUGxheWJhY2tSYXRlLm1QaXRjaCk7CisgICAgbVByb3h5LT5zZXRTYW1wbGVSYXRlKGVmZmVjdGl2ZVNhbXBsZVJhdGUpOworCisgICAgQXVkaW9QbGF5YmFja1JhdGUgcGxheWJhY2tSYXRlVGVtcCA9IG1QbGF5YmFja1JhdGU7CisgICAgcGxheWJhY2tSYXRlVGVtcC5tU3BlZWQgPSBlZmZlY3RpdmVTcGVlZDsKKyAgICBwbGF5YmFja1JhdGVUZW1wLm1QaXRjaCA9IGVmZmVjdGl2ZVBpdGNoOworICAgIG1Qcm94eS0+c2V0UGxheWJhY2tSYXRlKHBsYXliYWNrUmF0ZVRlbXApOwogICAgIG1Qcm94eS0+c2V0TWluaW11bShtTm90aWZpY2F0aW9uRnJhbWVzQWN0KTsKIAogICAgIG1EZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIodGhpcyk7CiAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUF1ZGlvVHJhY2spLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAKKyAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDApIHsKKyAgICAgICAgQXVkaW9TeXN0ZW06OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLCBtT3V0cHV0KTsKKyAgICB9CisKICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCkBAIC0xMjU4LDE1ICsxNDM0LDIxIEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgQXVkaW9UcmFjazo6b2J0YWluQnVmZmVyKEJ1ZmZlciogYXVkaW9CdWZmZXIsIGludDMyX3Qgd2FpdENvdW50KQorc3RhdHVzX3QgQXVkaW9UcmFjazo6b2J0YWluQnVmZmVyKEJ1ZmZlciogYXVkaW9CdWZmZXIsIGludDMyX3Qgd2FpdENvdW50LCBzaXplX3QgKm5vbkNvbnRpZykKIHsKICAgICBpZiAoYXVkaW9CdWZmZXIgPT0gTlVMTCkgeworICAgICAgICBpZiAobm9uQ29udGlnICE9IE5VTEwpIHsKKyAgICAgICAgICAgICpub25Db250aWcgPSAwOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIGlmIChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfT0JUQUlOKSB7CiAgICAgICAgIGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSAwOwogICAgICAgICBhdWRpb0J1ZmZlci0+cmF3ID0gTlVMTDsKKyAgICAgICAgaWYgKG5vbkNvbnRpZyAhPSBOVUxMKSB7CisgICAgICAgICAgICAqbm9uQ29udGlnID0gMDsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC0xMjg1LDcgKzE0NjcsNyBAQAogICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCB3YWl0Q291bnQgJWQiLCBfX2Z1bmNfXywgd2FpdENvdW50KTsKICAgICAgICAgcmVxdWVzdGVkID0gTlVMTDsKICAgICB9Ci0gICAgcmV0dXJuIG9idGFpbkJ1ZmZlcihhdWRpb0J1ZmZlciwgcmVxdWVzdGVkKTsKKyAgICByZXR1cm4gb2J0YWluQnVmZmVyKGF1ZGlvQnVmZmVyLCByZXF1ZXN0ZWQsIE5VTEwgLyplbGFwc2VkKi8sIG5vbkNvbnRpZyk7CiB9CiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6Om9idGFpbkJ1ZmZlcihCdWZmZXIqIGF1ZGlvQnVmZmVyLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnJlcXVlc3RlZCwKQEAgLTEzNTIsNyArMTUzNCw3IEBACiAgICAgfSB3aGlsZSAoKHN0YXR1cyA9PSBERUFEX09CSkVDVCkgJiYgKHRyeUNvdW50ZXItLSA+IDApKTsKIAogICAgIGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ID0gYnVmZmVyLm1GcmFtZUNvdW50OwotICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gYnVmZmVyLm1GcmFtZUNvdW50ICogbUZyYW1lU2l6ZUFGOworICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gYnVmZmVyLm1GcmFtZUNvdW50ICogbUZyYW1lU2l6ZTsKICAgICBhdWRpb0J1ZmZlci0+cmF3ID0gYnVmZmVyLm1SYXc7CiAgICAgaWYgKG5vbkNvbnRpZyAhPSBOVUxMKSB7CiAgICAgICAgICpub25Db250aWcgPSBidWZmZXIubU5vbkNvbnRpZzsKQEAgLTEzNjAsMTMgKzE1NDIsMTQgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi12b2lkIEF1ZGlvVHJhY2s6OnJlbGVhc2VCdWZmZXIoQnVmZmVyKiBhdWRpb0J1ZmZlcikKK3ZvaWQgQXVkaW9UcmFjazo6cmVsZWFzZUJ1ZmZlcihjb25zdCBCdWZmZXIqIGF1ZGlvQnVmZmVyKQogeworICAgIC8vIEZJWE1FIGFkZCBlcnJvciBjaGVja2luZyBvbiBtb2RlLCBieSBhZGRpbmcgYW4gaW50ZXJuYWwgdmVyc2lvbgogICAgIGlmIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU0hBUkVEKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzaXplX3Qgc3RlcENvdW50ID0gYXVkaW9CdWZmZXItPnNpemUgLyBtRnJhbWVTaXplQUY7CisgICAgc2l6ZV90IHN0ZXBDb3VudCA9IGF1ZGlvQnVmZmVyLT5zaXplIC8gbUZyYW1lU2l6ZTsKICAgICBpZiAoc3RlcENvdW50ID09IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTE0MzEsMTUgKzE2MTQsOCBAQAogICAgICAgICAgICAgcmV0dXJuIHNzaXplX3QoZXJyKTsKICAgICAgICAgfQogCi0gICAgICAgIHNpemVfdCB0b1dyaXRlOwotICAgICAgICBpZiAobUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUICYmICEobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSkgewotICAgICAgICAgICAgLy8gRGl2aWRlIGNhcGFjaXR5IGJ5IDIgdG8gdGFrZSBleHBhbnNpb24gaW50byBhY2NvdW50Ci0gICAgICAgICAgICB0b1dyaXRlID0gYXVkaW9CdWZmZXIuc2l6ZSA+PiAxOwotICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX3U4KGF1ZGlvQnVmZmVyLmkxNiwgKGNvbnN0IHVpbnQ4X3QgKikgYnVmZmVyLCB0b1dyaXRlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRvV3JpdGUgPSBhdWRpb0J1ZmZlci5zaXplOwotICAgICAgICAgICAgbWVtY3B5KGF1ZGlvQnVmZmVyLmk4LCBidWZmZXIsIHRvV3JpdGUpOwotICAgICAgICB9CisgICAgICAgIHNpemVfdCB0b1dyaXRlID0gYXVkaW9CdWZmZXIuc2l6ZTsKKyAgICAgICAgbWVtY3B5KGF1ZGlvQnVmZmVyLmk4LCBidWZmZXIsIHRvV3JpdGUpOwogICAgICAgICBidWZmZXIgPSAoKGNvbnN0IGNoYXIgKikgYnVmZmVyKSArIHRvV3JpdGU7CiAgICAgICAgIHVzZXJTaXplIC09IHRvV3JpdGU7CiAgICAgICAgIHdyaXR0ZW4gKz0gdG9Xcml0ZTsKQEAgLTE1NTgsMTAgKzE3MzQsMTAgQEAKICAgICAgICAgLy8gQXVkaW9TeXN0ZW0gY2FjaGUuIFdlIHNob3VsZCBub3QgZXhpdCBoZXJlIGJ1dCBhZnRlciBjYWxsaW5nIHRoZSBjYWxsYmFjayBzbwogICAgICAgICAvLyB0aGF0IHRoZSB1cHBlciBsYXllcnMgY2FuIHJlY3JlYXRlIHRoZSB0cmFjawogICAgICAgICBpZiAoIWlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpIHx8IChtU2VxdWVuY2UgPT0gbU9ic2VydmVkU2VxdWVuY2UpKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZXN0b3JlVHJhY2tfbCgicHJvY2Vzc0F1ZGlvQnVmZmVyIik7Ci0gICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIC8vIFJ1biBhZ2FpbiBpbW1lZGlhdGVseSwgYnV0IHdpdGggYSBuZXcgSUF1ZGlvVHJhY2sKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzIF9fdW51c2VkID0gcmVzdG9yZVRyYWNrX2woInByb2Nlc3NBdWRpb0J1ZmZlciIpOworICAgICAgICAgICAgLy8gRklYTUUgdW51c2VkIHN0YXR1cworICAgICAgICAgICAgLy8gYWZ0ZXIgcmVzdG9yYXRpb24sIGNvbnRpbnVlIGJlbG93IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBsb29wIGFuZCBidWZmZXIgZXZlbnRzCisgICAgICAgICAgICAvLyBhcmUgbm90aWZpZWQgYmVjYXVzZSB0aGV5IGhhdmUgYmVlbiBjbGVhcmVkIGZyb20gbUNibGstPm1GbGFncyBhYm92ZS4KICAgICAgICAgfQogICAgIH0KIApAQCAtMTYxMCw5ICsxNzg2LDkgQEAKICAgICB9CiAKICAgICAvLyBDYWNoZSBvdGhlciBmaWVsZHMgdGhhdCB3aWxsIGJlIG5lZWRlZCBzb29uCi0gICAgdWludDMyX3QgbG9vcFBlcmlvZCA9IG1Mb29wUGVyaW9kOwogICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKLSAgICB1aW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSBtTm90aWZpY2F0aW9uRnJhbWVzQWN0OworICAgIGZsb2F0IHNwZWVkID0gbVBsYXliYWNrUmF0ZS5tU3BlZWQ7CisgICAgY29uc3QgdWludDMyX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdDsKICAgICBpZiAobVJlZnJlc2hSZW1haW5pbmcpIHsKICAgICAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSBmYWxzZTsKICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcyA9IG5vdGlmaWNhdGlvbkZyYW1lczsKQEAgLTE2MjIsMTMgKzE3OTgsNDIgQEAKICAgICB1aW50MzJfdCBzZXF1ZW5jZSA9IG1TZXF1ZW5jZTsKICAgICBzcDxBdWRpb1RyYWNrQ2xpZW50UHJveHk+IHByb3h5ID0gbVByb3h5OwogCisgICAgLy8gRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgbmV3IGxvb3AgY2FsbGJhY2socykgdGhhdCB3aWxsIGJlIG5lZWRlZCwgd2hpbGUgbG9ja2VkLgorICAgIGludCBsb29wQ291bnROb3RpZmljYXRpb25zID0gMDsKKyAgICB1aW50MzJfdCBsb29wUGVyaW9kID0gMDsgLy8gdGltZSBpbiBmcmFtZXMgZm9yIG5leHQgRVZFTlRfTE9PUF9FTkQgb3IgRVZFTlRfQlVGRkVSX0VORAorCisgICAgaWYgKG1Mb29wQ291bnQgPiAwKSB7CisgICAgICAgIGludCBsb29wQ291bnQ7CisgICAgICAgIHNpemVfdCBidWZmZXJQb3NpdGlvbjsKKyAgICAgICAgbVN0YXRpY1Byb3h5LT5nZXRCdWZmZXJQb3NpdGlvbkFuZExvb3BDb3VudCgmYnVmZmVyUG9zaXRpb24sICZsb29wQ291bnQpOworICAgICAgICBsb29wUGVyaW9kID0gKChsb29wQ291bnQgPiAwKSA/IG1Mb29wRW5kIDogbUZyYW1lQ291bnQpIC0gYnVmZmVyUG9zaXRpb247CisgICAgICAgIGxvb3BDb3VudE5vdGlmaWNhdGlvbnMgPSBtaW4obUxvb3BDb3VudE5vdGlmaWVkIC0gbG9vcENvdW50LCBrTWF4TG9vcENvdW50Tm90aWZpY2F0aW9ucyk7CisgICAgICAgIG1Mb29wQ291bnROb3RpZmllZCA9IGxvb3BDb3VudDsgLy8gZGlzY2FyZCBhbnkgZXhjZXNzIG5vdGlmaWNhdGlvbnMKKyAgICB9IGVsc2UgaWYgKG1Mb29wQ291bnQgPCAwKSB7CisgICAgICAgIC8vIEZJWE1FOiBXZSdyZSBub3QgYWNjdXJhdGUgd2l0aCBub3RpZmljYXRpb24gY291bnQgYW5kIHBvc2l0aW9uIHdpdGggaW5maW5pdGUgbG9vcGluZworICAgICAgICAvLyBzaW5jZSBsb29wQ291bnQgZnJvbSBzZXJ2ZXIgc2lkZSB3aWxsIGFsd2F5cyByZXR1cm4gLTEgKHdlIGNvdWxkIGRlY3JlbWVudCBpdCkuCisgICAgICAgIHNpemVfdCBidWZmZXJQb3NpdGlvbiA9IG1TdGF0aWNQcm94eS0+Z2V0QnVmZmVyUG9zaXRpb24oKTsKKyAgICAgICAgbG9vcENvdW50Tm90aWZpY2F0aW9ucyA9IGludCgoZmxhZ3MgJiAoQ0JMS19MT09QX0NZQ0xFIHwgQ0JMS19MT09QX0ZJTkFMKSkgIT0gMCk7CisgICAgICAgIGxvb3BQZXJpb2QgPSBtTG9vcEVuZCAtIGJ1ZmZlclBvc2l0aW9uOworICAgIH0gZWxzZSBpZiAoLyogbUxvb3BDb3VudCA9PSAwICYmICovIG1TaGFyZWRCdWZmZXIgIT0gMCkgeworICAgICAgICBzaXplX3QgYnVmZmVyUG9zaXRpb24gPSBtU3RhdGljUHJveHktPmdldEJ1ZmZlclBvc2l0aW9uKCk7CisgICAgICAgIGxvb3BQZXJpb2QgPSBtRnJhbWVDb3VudCAtIGJ1ZmZlclBvc2l0aW9uOworICAgIH0KKwogICAgIC8vIFRoZXNlIGZpZWxkcyBkb24ndCBuZWVkIHRvIGJlIGNhY2hlZCwgYmVjYXVzZSB0aGV5IGFyZSBhc3NpZ25lZCBvbmx5IGJ5IHNldCgpOgotICAgIC8vICAgICBtVHJhbnNmZXIsIG1DYmYsIG1Vc2VyRGF0YSwgbUZvcm1hdCwgbUZyYW1lU2l6ZSwgbUZyYW1lU2l6ZUFGLCBtRmxhZ3MKKyAgICAvLyAgICAgbVRyYW5zZmVyLCBtQ2JmLCBtVXNlckRhdGEsIG1Gb3JtYXQsIG1GcmFtZVNpemUsIG1GbGFncwogICAgIC8vIG1GbGFncyBpcyBhbHNvIGFzc2lnbmVkIGJ5IGNyZWF0ZVRyYWNrX2woKSwgYnV0IG5vdCB0aGUgYml0IHdlIGNhcmUgYWJvdXQuCiAKICAgICBtTG9jay51bmxvY2soKTsKIAorICAgIC8vIGdldCBhbmNob3IgdGltZSB0byBhY2NvdW50IGZvciBjYWxsYmFja3MuCisgICAgY29uc3QgbnNlY3NfdCB0aW1lQmVmb3JlQ2FsbGJhY2tzID0gc3lzdGVtVGltZSgpOworCiAgICAgaWYgKHdhaXRTdHJlYW1FbmQpIHsKKyAgICAgICAgLy8gRklYTUU6ICBJbnN0ZWFkIG9mIGJsb2NraW5nIGluIHByb3h5LT53YWl0U3RyZWFtRW5kRG9uZSgpLCBDYWxsYmFjayB0aHJlYWQKKyAgICAgICAgLy8gc2hvdWxkIHdhaXQgb24gcHJveHkgZnV0ZXggYW5kIGhhbmRsZSBDQkxLX1NUUkVBTV9FTkRfRE9ORSB3aXRoaW4gdGhpcyBmdW5jdGlvbgorICAgICAgICAvLyAoYW5kIG1ha2Ugc3VyZSB3ZSBkb24ndCBjYWxsYmFjayBmb3IgbW9yZSBkYXRhIHdoaWxlIHdlJ3JlIHN0b3BwaW5nKS4KKyAgICAgICAgLy8gVGhpcyBoZWxwcyB3aXRoIHBvc2l0aW9uLCBtYXJrZXIgbm90aWZpY2F0aW9ucywgYW5kIHRyYWNrIGludmFsaWRhdGlvbi4KICAgICAgICAgc3RydWN0IHRpbWVzcGVjIHRpbWVvdXQ7CiAgICAgICAgIHRpbWVvdXQudHZfc2VjID0gV0FJVF9TVFJFQU1fRU5EX1RJTUVPVVRfU0VDOwogICAgICAgICB0aW1lb3V0LnR2X25zZWMgPSAwOwpAQCAtMTY2MiwxMCArMTg2Nyw5IEBACiAgICAgaWYgKG5ld1VuZGVycnVuKSB7CiAgICAgICAgIG1DYmYoRVZFTlRfVU5ERVJSVU4sIG1Vc2VyRGF0YSwgTlVMTCk7CiAgICAgfQotICAgIC8vIEZJWE1FIHdlIHdpbGwgbWlzcyBsb29wcyBpZiBsb29wIGN5Y2xlIHdhcyBzaWduYWxlZCBzZXZlcmFsIHRpbWVzIHNpbmNlIGxhc3QgY2FsbAotICAgIC8vICAgICAgIHRvIHByb2Nlc3NBdWRpb0J1ZmZlcigpCi0gICAgaWYgKGZsYWdzICYgKENCTEtfTE9PUF9DWUNMRSB8IENCTEtfTE9PUF9GSU5BTCkpIHsKKyAgICB3aGlsZSAobG9vcENvdW50Tm90aWZpY2F0aW9ucyA+IDApIHsKICAgICAgICAgbUNiZihFVkVOVF9MT09QX0VORCwgbVVzZXJEYXRhLCBOVUxMKTsKKyAgICAgICAgLS1sb29wQ291bnROb3RpZmljYXRpb25zOwogICAgIH0KICAgICBpZiAoZmxhZ3MgJiBDQkxLX0JVRkZFUl9FTkQpIHsKICAgICAgICAgbUNiZihFVkVOVF9CVUZGRVJfRU5ELCBtVXNlckRhdGEsIE5VTEwpOwpAQCAtMTcwMSwxMCArMTkwNSwxMSBAQAogICAgICAgICBtaW5GcmFtZXMgPSBtYXJrZXJQb3NpdGlvbiAtIHBvc2l0aW9uOwogICAgIH0KICAgICBpZiAobG9vcFBlcmlvZCA+IDAgJiYgbG9vcFBlcmlvZCA8IG1pbkZyYW1lcykgeworICAgICAgICAvLyBsb29wUGVyaW9kIGlzIGFscmVhZHkgYWRqdXN0ZWQgZm9yIGFjdHVhbCBwb3NpdGlvbi4KICAgICAgICAgbWluRnJhbWVzID0gbG9vcFBlcmlvZDsKICAgICB9Ci0gICAgaWYgKHVwZGF0ZVBlcmlvZCA+IDAgJiYgdXBkYXRlUGVyaW9kIDwgbWluRnJhbWVzKSB7Ci0gICAgICAgIG1pbkZyYW1lcyA9IHVwZGF0ZVBlcmlvZDsKKyAgICBpZiAodXBkYXRlUGVyaW9kID4gMCkgeworICAgICAgICBtaW5GcmFtZXMgPSBtaW4obWluRnJhbWVzLCB1aW50MzJfdChuZXdQb3NpdGlvbiAtIHBvc2l0aW9uKSk7CiAgICAgfQogCiAgICAgLy8gSWYgPiAwLCBwb2xsIHBlcmlvZGljYWxseSB0byByZWNvdmVyIGZyb20gYSBzdHVjayBzZXJ2ZXIuICBBIGdvb2QgdmFsdWUgaXMgMi4KQEAgLTE3MTMsMTIgKzE5MTgsMTcgQEAKICAgICAgICAgbWluRnJhbWVzID0ga1BvbGwgKiBub3RpZmljYXRpb25GcmFtZXM7CiAgICAgfQogCisgICAgLy8gVGhpcyAiZnVkZ2UgZmFjdG9yIiBhdm9pZHMgc29ha2luZyBDUFUsIGFuZCBjb21wZW5zYXRlcyBmb3IgbGF0ZSBwcm9ncmVzcyBieSBzZXJ2ZXIKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrV2FpdFBlcmlvZE5zID0gV0FJVF9QRVJJT0RfTVMgKiAxMDAwMDAwTEw7CisgICAgY29uc3QgbnNlY3NfdCB0aW1lQWZ0ZXJDYWxsYmFja3MgPSBzeXN0ZW1UaW1lKCk7CisKICAgICAvLyBDb252ZXJ0IGZyYW1lIHVuaXRzIHRvIHRpbWUgdW5pdHMKICAgICBuc2Vjc190IG5zID0gTlNfV0hFTkVWRVI7CiAgICAgaWYgKG1pbkZyYW1lcyAhPSAodWludDMyX3QpIH4wKSB7Ci0gICAgICAgIC8vIFRoaXMgImZ1ZGdlIGZhY3RvciIgYXZvaWRzIHNvYWtpbmcgQ1BVLCBhbmQgY29tcGVuc2F0ZXMgZm9yIGxhdGUgcHJvZ3Jlc3MgYnkgc2VydmVyCi0gICAgICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtGdWRnZU5zID0gMTAwMDAwMDBMTDsgLy8gMTAgbXMKLSAgICAgICAgbnMgPSAoKG1pbkZyYW1lcyAqIDEwMDAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlKSArIGtGdWRnZU5zOworICAgICAgICBucyA9IGZyYW1lc1RvTmFub3NlY29uZHMobWluRnJhbWVzLCBzYW1wbGVSYXRlLCBzcGVlZCkgKyBrV2FpdFBlcmlvZE5zOworICAgICAgICBucyAtPSAodGltZUFmdGVyQ2FsbGJhY2tzIC0gdGltZUJlZm9yZUNhbGxiYWNrcyk7ICAvLyBhY2NvdW50IGZvciBjYWxsYmFjayB0aW1lCisgICAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSB3YXJuIGlmIHRoZSBjYWxsYmFjayB0aW1lIGlzIHRvbyBsb25nPworICAgICAgICBpZiAobnMgPCAwKSBucyA9IDA7CiAgICAgfQogCiAgICAgLy8gSWYgbm90IHN1cHBseWluZyBkYXRhIGJ5IEVWRU5UX01PUkVfREFUQSwgdGhlbiB3ZSdyZSBkb25lCkBAIC0xNzI2LDYgKzE5MzYsMTMgQEAKICAgICAgICAgcmV0dXJuIG5zOwogICAgIH0KIAorICAgIC8vIEVWRU5UX01PUkVfREFUQSBjYWxsYmFjayBoYW5kbGluZy4KKyAgICAvLyBUaW1pbmcgZm9yIGxpbmVhciBwY20gYXVkaW8gZGF0YSBmb3JtYXRzIGNhbiBiZSBkZXJpdmVkIGRpcmVjdGx5IGZyb20gdGhlCisgICAgLy8gYnVmZmVyIGZpbGwgbGV2ZWwuCisgICAgLy8gVGltaW5nIGZvciBjb21wcmVzc2VkIGRhdGEgaXMgbm90IGRpcmVjdGx5IGF2YWlsYWJsZSBmcm9tIHRoZSBidWZmZXIgZmlsbCBsZXZlbCwKKyAgICAvLyByYXRoZXIgaW5kaXJlY3RseSBmcm9tIHdhaXRpbmcgZm9yIGJsb2NraW5nIG1vZGUgY2FsbGJhY2tzIG9yIHdhaXRpbmcgZm9yIG9idGFpbigpCisgICAgLy8gdG8gcmV0dXJuIGEgY2VydGFpbiBmaWxsIGxldmVsLgorCiAgICAgc3RydWN0IHRpbWVzcGVjIHRpbWVvdXQ7CiAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICpyZXF1ZXN0ZWQgPSAmQ2xpZW50UHJveHk6OmtGb3JldmVyOwogICAgIGlmIChucyAhPSBOU19XSEVORVZFUikgewpAQCAtMTc1NiwyNCArMTk3MywyMSBAQAogICAgICAgICAgICAgcmV0dXJuIE5TX05FVkVSOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1SZXRyeU9uUGFydGlhbEJ1ZmZlciAmJiAhaXNPZmZsb2FkZWQoKSkgeworICAgICAgICBpZiAobVJldHJ5T25QYXJ0aWFsQnVmZmVyICYmIGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKICAgICAgICAgICAgIG1SZXRyeU9uUGFydGlhbEJ1ZmZlciA9IGZhbHNlOwogICAgICAgICAgICAgaWYgKGF2YWlsIDwgbVJlbWFpbmluZ0ZyYW1lcykgewotICAgICAgICAgICAgICAgIGludDY0X3QgbXlucyA9ICgobVJlbWFpbmluZ0ZyYW1lcyAtIGF2YWlsKSAqIDExMDAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOwotICAgICAgICAgICAgICAgIGlmIChucyA8IDAgfHwgbXlucyA8IG5zKSB7CisgICAgICAgICAgICAgICAgaWYgKG5zID4gMCkgeyAvLyBhY2NvdW50IGZvciBvYnRhaW4gdGltZQorICAgICAgICAgICAgICAgICAgICBjb25zdCBuc2Vjc190IHRpbWVOb3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICAgICAgICAgICAgIG5zID0gbWF4KChuc2Vjc190KTAsIG5zIC0gKHRpbWVOb3cgLSB0aW1lQWZ0ZXJDYWxsYmFja3MpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbnNlY3NfdCBteW5zID0gZnJhbWVzVG9OYW5vc2Vjb25kcyhtUmVtYWluaW5nRnJhbWVzIC0gYXZhaWwsIHNhbXBsZVJhdGUsIHNwZWVkKTsKKyAgICAgICAgICAgICAgICBpZiAobnMgPCAwIC8qIE5TX1dIRU5FVkVSICovIHx8IG15bnMgPCBucykgewogICAgICAgICAgICAgICAgICAgICBucyA9IG15bnM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBuczsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vIERpdmlkZSBidWZmZXIgc2l6ZSBieSAyIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBleHBhbnNpb24KLSAgICAgICAgLy8gZHVlIHRvIDggdG8gMTYgYml0IGNvbnZlcnNpb246IHRoZSBjYWxsYmFjayBtdXN0IGZpbGwgb25seSBoYWxmCi0gICAgICAgIC8vIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKLSAgICAgICAgaWYgKG1Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV84X0JJVCAmJiAhKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkpIHsKLSAgICAgICAgICAgIGF1ZGlvQnVmZmVyLnNpemUgPj49IDE7Ci0gICAgICAgIH0KLQogICAgICAgICBzaXplX3QgcmVxU2l6ZSA9IGF1ZGlvQnVmZmVyLnNpemU7CiAgICAgICAgIG1DYmYoRVZFTlRfTU9SRV9EQVRBLCBtVXNlckRhdGEsICZhdWRpb0J1ZmZlcik7CiAgICAgICAgIHNpemVfdCB3cml0dGVuU2l6ZSA9IGF1ZGlvQnVmZmVyLnNpemU7CkBAIC0xNzkwLDE2ICsyMDA0LDQ1IEBACiAgICAgICAgICAgICAvLyBLZWVwIHRoaXMgdGhyZWFkIGdvaW5nIHRvIGhhbmRsZSB0aW1lZCBldmVudHMgYW5kCiAgICAgICAgICAgICAvLyBzdGlsbCB0cnkgdG8gZ2V0IG1vcmUgZGF0YSBpbiBpbnRlcnZhbHMgb2YgV0FJVF9QRVJJT0RfTVMKICAgICAgICAgICAgIC8vIGJ1dCBkb24ndCBqdXN0IGxvb3AgYW5kIGJsb2NrIHRoZSBDUFUsIHNvIHdhaXQKLSAgICAgICAgICAgIHJldHVybiBXQUlUX1BFUklPRF9NUyAqIDEwMDAwMDBMTDsKKworICAgICAgICAgICAgLy8gbUNiZihFVkVOVF9NT1JFX0RBVEEsIC4uLikgbWlnaHQgZWl0aGVyCisgICAgICAgICAgICAvLyAoMSkgQmxvY2sgdW50aWwgaXQgY2FuIGZpbGwgdGhlIGJ1ZmZlciwgcmV0dXJuaW5nIDAgc2l6ZSBvbiBFT1MuCisgICAgICAgICAgICAvLyAoMikgQmxvY2sgdW50aWwgaXQgY2FuIGZpbGwgdGhlIGJ1ZmZlciwgcmV0dXJuaW5nIDAgZGF0YSAoc2lsZW5jZSkgb24gRU9TLgorICAgICAgICAgICAgLy8gKDMpIFJldHVybiAwIHNpemUgd2hlbiBubyBkYXRhIGlzIGF2YWlsYWJsZSwgZG9lcyBub3Qgd2FpdCBmb3IgbW9yZSBkYXRhLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICgxKSBhbmQgKDIpIG9jY3VycyB3aXRoIEF1ZGlvUGxheWVyL0F3ZXNvbWVQbGF5ZXI7ICgzKSBvY2N1cnMgd2l0aCBOdVBsYXllci4KKyAgICAgICAgICAgIC8vIFdlIHRyeSB0byBjb21wdXRlIHRoZSB3YWl0IHRpbWUgdG8gYXZvaWQgYSB0aWdodCBzbGVlcC13YWl0IGN5Y2xlLAorICAgICAgICAgICAgLy8gZXNwZWNpYWxseSBmb3IgY2FzZSAoMykuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhlIGRlY2lzaW9uIHRvIHN1cHBvcnQgKDEpIGFuZCAoMikgYWZmZWN0IHRoZSBzaXppbmcgb2YgbVJlbWFpbmluZ0ZyYW1lcworICAgICAgICAgICAgLy8gYW5kIHRoaXMgbG9vcDsgd2hlcmVhcyBmb3IgY2FzZSAoMykgd2UgY291bGQgc2ltcGx5IGNoZWNrIG9uY2Ugd2l0aCB0aGUgZnVsbAorICAgICAgICAgICAgLy8gYnVmZmVyIHNpemUgYW5kIHNraXAgdGhlIGxvb3AgZW50aXJlbHkuCisKKyAgICAgICAgICAgIG5zZWNzX3QgbXluczsKKyAgICAgICAgICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgLy8gdGltZSB0byB3YWl0IGJhc2VkIG9uIGJ1ZmZlciBvY2N1cGFuY3kKKyAgICAgICAgICAgICAgICBjb25zdCBuc2Vjc190IGRhdGFucyA9IG1SZW1haW5pbmdGcmFtZXMgPD0gYXZhaWwgPyAwIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1RvTmFub3NlY29uZHMobVJlbWFpbmluZ0ZyYW1lcyAtIGF2YWlsLCBzYW1wbGVSYXRlLCBzcGVlZCk7CisgICAgICAgICAgICAgICAgLy8gYXVkaW8gZmxpbmdlciB0aHJlYWQgYnVmZmVyIHNpemUgKFRPRE86IGFkanVzdCBmb3IgZmFzdCB0cmFja3MpCisgICAgICAgICAgICAgICAgY29uc3QgbnNlY3NfdCBhZm5zID0gZnJhbWVzVG9OYW5vc2Vjb25kcyhtQWZGcmFtZUNvdW50LCBtQWZTYW1wbGVSYXRlLCBzcGVlZCk7CisgICAgICAgICAgICAgICAgLy8gYWRkIGEgaGFsZiB0aGUgQXVkaW9GbGluZ2VyIGJ1ZmZlciB0aW1lIHRvIGF2b2lkIHNvYWtpbmcgQ1BVIGlmIGRhdGFucyBpcyAwLgorICAgICAgICAgICAgICAgIG15bnMgPSBkYXRhbnMgKyAoYWZucyAvIDIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogVGhpcyBjb3VsZCBwaW5nIHF1aXRlIGEgYml0IGlmIHRoZSBidWZmZXIgaXNuJ3QgZnVsbC4KKyAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2hlbiBtU3RhdGUgaXMgc3RvcHBpbmcgd2Ugd2FpdFN0cmVhbUVuZCwgc28gaXQgbmV2ZXIgZ2V0cyBoZXJlLgorICAgICAgICAgICAgICAgIG15bnMgPSBrV2FpdFBlcmlvZE5zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5zID4gMCkgeyAvLyBhY2NvdW50IGZvciBvYnRhaW4gYW5kIGNhbGxiYWNrIHRpbWUKKyAgICAgICAgICAgICAgICBjb25zdCBuc2Vjc190IHRpbWVOb3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgICAgICAgICAgbnMgPSBtYXgoKG5zZWNzX3QpMCwgbnMgLSAodGltZU5vdyAtIHRpbWVBZnRlckNhbGxiYWNrcykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5zIDwgMCAvKiBOU19XSEVORVZFUiAqLyB8fCBteW5zIDwgbnMpIHsKKyAgICAgICAgICAgICAgICBucyA9IG15bnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnM7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzhfQklUICYmICEobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSkgewotICAgICAgICAgICAgLy8gOCB0byAxNiBiaXQgY29udmVyc2lvbiwgbm90ZSB0aGF0IHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIHRoZSBzYW1lIGFkZHJlc3MKLSAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV91OChhdWRpb0J1ZmZlci5pMTYsIChjb25zdCB1aW50OF90ICopIGF1ZGlvQnVmZmVyLmk4LCB3cml0dGVuU2l6ZSk7Ci0gICAgICAgICAgICBhdWRpb0J1ZmZlci5zaXplIDw8PSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IHJlbGVhc2VkRnJhbWVzID0gYXVkaW9CdWZmZXIuc2l6ZSAvIG1GcmFtZVNpemVBRjsKKyAgICAgICAgc2l6ZV90IHJlbGVhc2VkRnJhbWVzID0gd3JpdHRlblNpemUgLyBtRnJhbWVTaXplOwogICAgICAgICBhdWRpb0J1ZmZlci5mcmFtZUNvdW50ID0gcmVsZWFzZWRGcmFtZXM7CiAgICAgICAgIG1SZW1haW5pbmdGcmFtZXMgLT0gcmVsZWFzZWRGcmFtZXM7CiAgICAgICAgIGlmIChtaXNhbGlnbm1lbnQgPj0gcmVsZWFzZWRGcmFtZXMpIHsKQEAgLTE4MjcsNyArMjA3MCw3IEBACiAgICAgICAgIC8vIHRoYXQgdG90YWwgdG8gYSBzdW0gPT0gbm90aWZpY2F0aW9uRnJhbWVzLgogICAgICAgICBpZiAoMCA8IG1pc2FsaWdubWVudCAmJiBtaXNhbGlnbm1lbnQgPD0gbVJlbWFpbmluZ0ZyYW1lcykgewogICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcyA9IG1pc2FsaWdubWVudDsKLSAgICAgICAgICAgIHJldHVybiAobVJlbWFpbmluZ0ZyYW1lcyAqIDExMDAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOworICAgICAgICAgICAgcmV0dXJuICgoZG91YmxlKW1SZW1haW5pbmdGcmFtZXMgKiAxMTAwMDAwMDAwKSAvICgoZG91YmxlKXNhbXBsZVJhdGUgKiBzcGVlZCk7CiAgICAgICAgIH0KICNlbmRpZgogCkBAIC0xODQ0LDUxICsyMDg3LDQ5IEBACiAgICAgQUxPR1coImRlYWQgSUF1ZGlvVHJhY2ssICVzLCBjcmVhdGluZyBhIG5ldyBvbmUgZnJvbSAlcygpIiwKICAgICAgICAgICBpc09mZmxvYWRlZE9yRGlyZWN0X2woKSA/ICJPZmZsb2FkZWQgb3IgRGlyZWN0IiA6ICJQQ00iLCBmcm9tKTsKICAgICArK21TZXF1ZW5jZTsKLSAgICBzdGF0dXNfdCByZXN1bHQ7CiAKICAgICAvLyByZWZyZXNoIHRoZSBhdWRpbyBjb25maWd1cmF0aW9uIGNhY2hlIGluIHRoaXMgcHJvY2VzcyB0byBtYWtlIHN1cmUgd2UgZ2V0IG5ldwogICAgIC8vIG91dHB1dCBwYXJhbWV0ZXJzIGFuZCBuZXcgSUF1ZGlvRmxpbmdlciBpbiBjcmVhdGVUcmFja19sKCkKICAgICBBdWRpb1N5c3RlbTo6Y2xlYXJBdWRpb0NvbmZpZ0NhY2hlKCk7CiAKLSAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkpIHsKLSAgICAgICAgLy8gRklYTUUgcmUtY3JlYXRpb24gb2Ygb2ZmbG9hZGVkIHRyYWNrcyBpcyBub3QgeWV0IGltcGxlbWVudGVkCisgICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpIHx8IG1Eb05vdFJlY29ubmVjdCkgeworICAgICAgICAvLyBGSVhNRSByZS1jcmVhdGlvbiBvZiBvZmZsb2FkZWQgYW5kIGRpcmVjdCB0cmFja3MgaXMgbm90IHlldCBpbXBsZW1lbnRlZDsKKyAgICAgICAgLy8gcmVjb25zaWRlciBlbmFibGluZyBmb3IgbGluZWFyIFBDTSBlbmNvZGluZ3Mgd2hlbiBwb3NpdGlvbiBjYW4gYmUgcHJlc2VydmVkLgogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQogCiAgICAgLy8gc2F2ZSB0aGUgb2xkIHN0YXRpYyBidWZmZXIgcG9zaXRpb24KLSAgICBzaXplX3QgYnVmZmVyUG9zaXRpb24gPSBtU3RhdGljUHJveHkgIT0gTlVMTCA/IG1TdGF0aWNQcm94eS0+Z2V0QnVmZmVyUG9zaXRpb24oKSA6IDA7CisgICAgc2l6ZV90IGJ1ZmZlclBvc2l0aW9uID0gMDsKKyAgICBpbnQgbG9vcENvdW50ID0gMDsKKyAgICBpZiAobVN0YXRpY1Byb3h5ICE9IDApIHsKKyAgICAgICAgbVN0YXRpY1Byb3h5LT5nZXRCdWZmZXJQb3NpdGlvbkFuZExvb3BDb3VudCgmYnVmZmVyUG9zaXRpb24sICZsb29wQ291bnQpOworICAgIH0KIAogICAgIC8vIElmIGEgbmV3IElBdWRpb1RyYWNrIGlzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkLCBjcmVhdGVUcmFja19sKCkgd2lsbCBtb2RpZnkgdGhlCiAgICAgLy8gZm9sbG93aW5nIG1lbWJlciB2YXJpYWJsZXM6IG1BdWRpb1RyYWNrLCBtQ2Jsa01lbW9yeSBhbmQgbUNibGsuCiAgICAgLy8gSXQgd2lsbCBhbHNvIGRlbGV0ZSB0aGUgc3Ryb25nIHJlZmVyZW5jZXMgb24gcHJldmlvdXMgSUF1ZGlvVHJhY2sgYW5kIElNZW1vcnkuCiAgICAgLy8gSWYgYSBuZXcgSUF1ZGlvVHJhY2sgY2Fubm90IGJlIGNyZWF0ZWQsIHRoZSBwcmV2aW91cyAoZGVhZCkgaW5zdGFuY2Ugd2lsbCBiZSBsZWZ0IGludGFjdC4KLSAgICByZXN1bHQgPSBjcmVhdGVUcmFja19sKCk7Ci0KLSAgICAvLyB0YWtlIHRoZSBmcmFtZXMgdGhhdCB3aWxsIGJlIGxvc3QgYnkgdHJhY2sgcmVjcmVhdGlvbiBpbnRvIGFjY291bnQgaW4gc2F2ZWQgcG9zaXRpb24KLSAgICAodm9pZCkgdXBkYXRlQW5kR2V0UG9zaXRpb25fbCgpOwotICAgIG1Qb3NpdGlvbiA9IG1SZWxlYXNlZDsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBjcmVhdGVUcmFja19sKCk7CiAKICAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIC8vIGNvbnRpbnVlIHBsYXliYWNrIGZyb20gbGFzdCBrbm93biBwb3NpdGlvbiwgYnV0Ci0gICAgICAgIC8vIGRvbid0IGF0dGVtcHQgdG8gcmVzdG9yZSBsb29wIGFmdGVyIGludmFsaWRhdGlvbjsgaXQncyBkaWZmaWN1bHQgYW5kIG5vdCB3b3J0aHdoaWxlCi0gICAgICAgIGlmIChtU3RhdGljUHJveHkgIT0gTlVMTCkgewotICAgICAgICAgICAgbUxvb3BQZXJpb2QgPSAwOwotICAgICAgICAgICAgbVN0YXRpY1Byb3h5LT5zZXRMb29wKGJ1ZmZlclBvc2l0aW9uLCBtRnJhbWVDb3VudCwgMCk7CisgICAgICAgIC8vIHRha2UgdGhlIGZyYW1lcyB0aGF0IHdpbGwgYmUgbG9zdCBieSB0cmFjayByZWNyZWF0aW9uIGludG8gYWNjb3VudCBpbiBzYXZlZCBwb3NpdGlvbgorICAgICAgICAvLyBGb3Igc3RyZWFtaW5nIHRyYWNrcywgdGhpcyBpcyB0aGUgYW1vdW50IHdlIG9idGFpbmVkIGZyb20gdGhlIHVzZXIvY2xpZW50CisgICAgICAgIC8vIChub3QgdGhlIG51bWJlciBhY3R1YWxseSBjb25zdW1lZCBhdCB0aGUgc2VydmVyIC0gdGhvc2UgYXJlIGFscmVhZHkgbG9zdCkuCisgICAgICAgIGlmIChtU3RhdGljUHJveHkgPT0gMCkgeworICAgICAgICAgICAgbVBvc2l0aW9uID0gbVJlbGVhc2VkOwogICAgICAgICB9Ci0gICAgICAgIC8vIEZJWE1FIEhvdyBkbyB3ZSBzaW11bGF0ZSB0aGUgZmFjdCB0aGF0IGFsbCBmcmFtZXMgcHJlc2VudCBpbiB0aGUgYnVmZmVyIGF0IHRoZSB0aW1lIG9mCi0gICAgICAgIC8vICAgICAgIHRyYWNrIGRlc3RydWN0aW9uIGhhdmUgYmVlbiBwbGF5ZWQ/IFRoaXMgaXMgY3JpdGljYWwgZm9yIFNvdW5kUG9vbCBpbXBsZW1lbnRhdGlvbgotICAgICAgICAvLyAgICAgICBUaGlzIG11c3QgYmUgYnJva2VuLCBhbmQgbmVlZHMgdG8gYmUgdGVzdGVkL2RlYnVnZ2VkLgotI2lmIDAKLSAgICAgICAgLy8gcmVzdG9yZSB3cml0ZSBpbmRleCBhbmQgc2V0IG90aGVyIGluZGV4ZXMgdG8gcmVmbGVjdCBlbXB0eSBidWZmZXIgc3RhdHVzCi0gICAgICAgIGlmICghc3RyY21wKGZyb20sICJzdGFydCIpKSB7Ci0gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBhIGNsaWVudCByZWx5aW5nIG9uIGNhbGxiYWNrIGV2ZW50cyBpbmRpY2F0aW5nIHVuZGVycnVuIG9yCi0gICAgICAgICAgICAvLyB0aGUgYWN0dWFsIGFtb3VudCBvZiBhdWRpbyBmcmFtZXMgcGxheWVkIChlLmcgU291bmRQb29sKSByZWNlaXZlcyB0aGVtLgotICAgICAgICAgICAgaWYgKG1TaGFyZWRCdWZmZXIgPT0gMCkgewotICAgICAgICAgICAgICAgIC8vIHJlc3RhcnQgcGxheWJhY2sgZXZlbiBpZiBidWZmZXIgaXMgbm90IGNvbXBsZXRlbHkgZmlsbGVkLgotICAgICAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfRk9SQ0VSRUFEWSwgJm1DYmxrLT5tRmxhZ3MpOworICAgICAgICAvLyBDb250aW51ZSBwbGF5YmFjayBmcm9tIGxhc3Qga25vd24gcG9zaXRpb24gYW5kIHJlc3RvcmUgbG9vcC4KKyAgICAgICAgaWYgKG1TdGF0aWNQcm94eSAhPSAwKSB7CisgICAgICAgICAgICBpZiAobG9vcENvdW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICBtU3RhdGljUHJveHktPnNldEJ1ZmZlclBvc2l0aW9uQW5kTG9vcChidWZmZXJQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb29wU3RhcnQsIG1Mb29wRW5kLCBsb29wQ291bnQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU3RhdGljUHJveHktPnNldEJ1ZmZlclBvc2l0aW9uKGJ1ZmZlclBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyUG9zaXRpb24gPT0gbUZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoInJlc3RvcmluZyB0cmFjayBhdCBlbmQgb2Ygc3RhdGljIGJ1ZmZlciIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotI2VuZGlmCiAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQUNUSVZFKSB7CiAgICAgICAgICAgICByZXN1bHQgPSBtQXVkaW9UcmFjay0+c3RhcnQoKTsKICAgICAgICAgfQpAQCAtMTkyMyw2ICsyMTY0LDE5IEBACiAgICAgcmV0dXJuIG1Qb3NpdGlvbiArPSAodWludDMyX3QpIGRlbHRhOwogfQogCitib29sIEF1ZGlvVHJhY2s6OmlzU2FtcGxlUmF0ZVNwZWVkQWxsb3dlZF9sKHVpbnQzMl90IHNhbXBsZVJhdGUsIGZsb2F0IHNwZWVkKSBjb25zdAoreworICAgIC8vIGFwcGxpY2FibGUgZm9yIG1peGluZyB0cmFja3Mgb25seSAobm90IG9mZmxvYWRlZCBvciBkaXJlY3QpCisgICAgaWYgKG1TdGF0aWNQcm94eSAhPSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOyAvLyBzdGF0aWMgdHJhY2tzIGRvIG5vdCBoYXZlIGlzc3VlcyB3aXRoIGJ1ZmZlciBzaXppbmcuCisgICAgfQorICAgIGNvbnN0IHNpemVfdCBtaW5GcmFtZUNvdW50ID0KKyAgICAgICAgICAgIGNhbGN1bGF0ZU1pbkZyYW1lQ291bnQobUFmTGF0ZW5jeSwgbUFmRnJhbWVDb3VudCwgbUFmU2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSwgc3BlZWQpOworICAgIEFMT0dWKCJpc1NhbXBsZVJhdGVTcGVlZEFsbG93ZWRfbCBtRnJhbWVDb3VudCAlenUgIG1pbkZyYW1lQ291bnQgJXp1IiwKKyAgICAgICAgICAgIG1GcmFtZUNvdW50LCBtaW5GcmFtZUNvdW50KTsKKyAgICByZXR1cm4gbUZyYW1lQ291bnQgPj0gbWluRnJhbWVDb3VudDsKK30KKwogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKQEAgLTE5MzIsNiArMjE4NiwxMSBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6Z2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworCisgICAgYm9vbCBwcmV2aW91c1RpbWVzdGFtcFZhbGlkID0gbVByZXZpb3VzVGltZXN0YW1wVmFsaWQ7CisgICAgLy8gU2V0IGZhbHNlIGhlcmUgdG8gY292ZXIgYWxsIHRoZSBlcnJvciByZXR1cm4gY2FzZXMuCisgICAgbVByZXZpb3VzVGltZXN0YW1wVmFsaWQgPSBmYWxzZTsKKwogICAgIC8vIEZJWE1FIG5vdCBpbXBsZW1lbnRlZCBmb3IgZmFzdCB0cmFja3M7IHNob3VsZCB1c2UgcHJveHkgYW5kIFNTUQogICAgIGlmIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTE5NTYsNyArMjIxNSwxMiBAQAogICAgIH0KIAogICAgIGlmIChtQ2Jsay0+bUZsYWdzICYgQ0JMS19JTlZBTElEKSB7Ci0gICAgICAgIHJlc3RvcmVUcmFja19sKCJnZXRUaW1lc3RhbXAiKTsKKyAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gcmVzdG9yZVRyYWNrX2woImdldFRpbWVzdGFtcCIpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICAvLyBwZXIgZ2V0VGltZXN0YW1wKCkgQVBJIGRvYyBpbiBoZWFkZXIsIHdlIHJldHVybiBERUFEX09CSkVDVCBoZXJlLAorICAgICAgICAgICAgLy8gcmVjb21tZW5kaW5nIHRoYXQgdGhlIHRyYWNrIGJlIHJlY3JlYXRlZC4KKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIFRoZSBwcmVzZW50ZWQgZnJhbWUgY291bnQgbXVzdCBhbHdheXMgbGFnIGJlaGluZCB0aGUgY29uc3VtZWQgZnJhbWUgY291bnQuCkBAIC0xOTc1LDcgKzIyMzksMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgYSBwZW5kaW5nIGZsdXNoIG9yIHN0b3AgaGFzIGNvbXBsZXRlZCwgYXMgdGhvc2UgY29tbWFuZHMgbWF5Ci0gICAgICAgIC8vIGJlIGFzeW5jaHJvbm91cyBvciByZXR1cm4gbmVhciBmaW5pc2guCisgICAgICAgIC8vIGJlIGFzeW5jaHJvbm91cyBvciByZXR1cm4gbmVhciBmaW5pc2ggb3IgZXhoaWJpdCBnbGl0Y2h5IGJlaGF2aW9yLgorICAgICAgICAvLworICAgICAgICAvLyBPcmlnaW5hbGx5IHRoaXMgc2hvd2VkIHVwIGFzIHRoZSBmaXJzdCB0aW1lc3RhbXAgYmVpbmcgYSBjb250aW51YXRpb24gb2YKKyAgICAgICAgLy8gdGhlIHByZXZpb3VzIHNvbmcgdW5kZXIgZ2FwbGVzcyBwbGF5YmFjay4KKyAgICAgICAgLy8gSG93ZXZlciwgd2Ugc29tZXRpbWVzIHNlZSB6ZXJvIHRpbWVzdGFtcHMsIHRoZW4gYSBnbGl0Y2ggb2YKKyAgICAgICAgLy8gdGhlIHByZXZpb3VzIHNvbmcncyBwb3NpdGlvbiwgYW5kIHRoZW4gY29ycmVjdCB0aW1lc3RhbXBzIGFmdGVyd2FyZHMuCiAgICAgICAgIGlmIChtU3RhcnRVcyAhPSAwICYmIG1TYW1wbGVSYXRlICE9IDApIHsKICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga1RpbWVKaXR0ZXJVcyA9IDEwMDAwMDsgLy8gMTAwIG1zCiAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IGsxU2VjVXMgPSAxMDAwMDAwOwpAQCAtMTk4OCwyMCArMjI1NywzNCBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7ICAvLyBzdGFsZSB0aW1lc3RhbXAgdGltZSwgb2NjdXJzIGJlZm9yZSBzdGFydC4KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBkZWx0YVRpbWVVcyA9IHRpbWVzdGFtcFRpbWVVcyAtIG1TdGFydFVzOwotICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgZGVsdGFQb3NpdGlvbkJ5VXMgPSB0aW1lc3RhbXAubVBvc2l0aW9uICogMTAwMDAwMExMIC8gbVNhbXBsZVJhdGU7CisgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBkZWx0YVBvc2l0aW9uQnlVcyA9IChkb3VibGUpdGltZXN0YW1wLm1Qb3NpdGlvbiAqIDEwMDAwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gKChkb3VibGUpbVNhbXBsZVJhdGUgKiBtUGxheWJhY2tSYXRlLm1TcGVlZCk7CiAKICAgICAgICAgICAgICAgICBpZiAoZGVsdGFQb3NpdGlvbkJ5VXMgPiBkZWx0YVRpbWVVcyArIGtUaW1lSml0dGVyVXMpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGNvdW50ZXIgY2FuJ3QgY291bnQgZmFzdGVyIHRoYW4gdGhlIHNhbXBsZSByYXRlCi0gICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBzdGFydCB0aW1lLiAgSWYgZ3JlYXRlciwgdGhlbiB0aGF0IG1lYW5zIHdlIGhhdmUgZmFpbGVkCisgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBzdGFydCB0aW1lLiAgSWYgZ3JlYXRlciwgdGhlbiB0aGF0IG1lYW5zIHdlIG1heSBoYXZlIGZhaWxlZAogICAgICAgICAgICAgICAgICAgICAvLyB0byBjb21wbGV0ZWx5IGZsdXNoIG9yIHN0b3AgdGhlIHByZXZpb3VzIHBsYXlpbmcgdHJhY2suCi0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJpbmNvbXBsZXRlIGZsdXNoIG9yIHN0b3A6IgorICAgICAgICAgICAgICAgICAgICBBTE9HV19JRighbVRpbWVzdGFtcFN0YXJ0dXBHbGl0Y2hSZXBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0VGltZXN0YW1wIHN0YXJ0dXAgZ2xpdGNoIGRldGVjdGVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZGVsdGFUaW1lVXMoJWxsZCkgZGVsdGFQb3NpdGlvblVzKCVsbGQpIHRzbVBvc2l0aW9uKCV1KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkZWx0YVRpbWVVcywgKGxvbmcgbG9uZylkZWx0YVBvc2l0aW9uQnlVcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFN0YXJ0dXBHbGl0Y2hSZXBvcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c1RpbWVzdGFtcFZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVByZXZpb3VzVGltZXN0YW1wLm1Qb3NpdGlvbiA9PSAwIC8qIHNob3VsZCBiZSB0cnVlIGlmIHZhbGlkICovKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAgPSBtUHJldmlvdXNUaW1lc3RhbXA7CisgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNUaW1lc3RhbXBWYWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZGVsdGFQb3NpdGlvbkJ5VXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtU3RhcnRVcyA9IDA7IC8vIGRvbid0IGNoZWNrIGFnYWluLCB3ZSBnb3QgdmFsaWQgbm9uemVybyBwb3NpdGlvbi4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TdGFydFVzID0gMDsgLy8gZG9uJ3QgY2hlY2sgYWdhaW4sIHN0YXJ0IHRpbWUgZXhwaXJlZC4KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TdGFydFVzID0gMDsgLy8gbm8gbmVlZCB0byBjaGVjayBhZ2Fpbiwgc3RhcnQgdGltZXN0YW1wIGhhcyBlaXRoZXIgZXhwaXJlZCBvciB1bm5lZWRlZC4KKyAgICAgICAgICAgIG1UaW1lc3RhbXBTdGFydHVwR2xpdGNoUmVwb3J0ZWQgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbWFwcGluZyBiZXR3ZWVuIGxvY2FsIGNvbnN1bWVkIChtUG9zaXRpb24pIGFuZCBzZXJ2ZXIgY29uc3VtZWQgKG1TZXJ2ZXIpCkBAIC0yMDI5LDYgKzIzMTIsNDYgQEAKICAgICAgICAgLy8gSUF1ZGlvVHJhY2suICBBbmQgdGltZXN0YW1wLm1Qb3NpdGlvbiBpcyBpbml0aWFsbHkgaW4gc2VydmVyJ3MKICAgICAgICAgLy8gcG9pbnQgb2Ygdmlldywgc28gd2UgbmVlZCB0byBhcHBseSB0aGUgc2FtZSBmdWRnZSBmYWN0b3IgdG8gaXQuCiAgICAgfQorCisgICAgLy8gUHJldmVudCByZXRyb2dyYWRlIG1vdGlvbiBpbiB0aW1lc3RhbXAuCisgICAgLy8gVGhpcyBpcyBzb21ldGltZXMgY2F1c2VkIGJ5IGVycmF0aWMgcmVwb3J0cyBvZiB0aGUgYXZhaWxhYmxlIHNwYWNlIGluIHRoZSBBTFNBIGRyaXZlcnMuCisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBpZiAocHJldmlvdXNUaW1lc3RhbXBWYWxpZCkgeworI2RlZmluZSBUSU1FX1RPX05BTk9TKHRpbWUpICgodWludDY0X3QpdGltZS50dl9zZWMgKiAxMDAwMDAwMDAwICsgdGltZS50dl9uc2VjKQorICAgICAgICAgICAgY29uc3QgdWludDY0X3QgcHJldmlvdXNUaW1lTmFub3MgPSBUSU1FX1RPX05BTk9TKG1QcmV2aW91c1RpbWVzdGFtcC5tVGltZSk7CisgICAgICAgICAgICBjb25zdCB1aW50NjRfdCBjdXJyZW50VGltZU5hbm9zID0gVElNRV9UT19OQU5PUyh0aW1lc3RhbXAubVRpbWUpOworI3VuZGVmIFRJTUVfVE9fTkFOT1MKKyAgICAgICAgICAgIGlmIChjdXJyZW50VGltZU5hbm9zIDwgcHJldmlvdXNUaW1lTmFub3MpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygicmV0cm9ncmFkZSB0aW1lc3RhbXAgdGltZSIpOworICAgICAgICAgICAgICAgIC8vIEZJWE1FIENvbnNpZGVyIGJsb2NraW5nIHRoaXMgZnJvbSBwcm9wYWdhdGluZyB1cHdhcmRzLgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBMb29raW5nIGF0IHNpZ25lZCBkZWx0YSB3aWxsIHdvcmsgZXZlbiB3aGVuIHRoZSB0aW1lc3RhbXBzCisgICAgICAgICAgICAvLyBhcmUgd3JhcHBpbmcgYXJvdW5kLgorICAgICAgICAgICAgaW50MzJfdCBkZWx0YVBvc2l0aW9uID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odGltZXN0YW1wLm1Qb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICAtIG1QcmV2aW91c1RpbWVzdGFtcC5tUG9zaXRpb24pOworICAgICAgICAgICAgLy8gcG9zaXRpb24gY2FuIGJvYmJsZSBzbGlnaHRseSBhcyBhbiBhcnRpZmFjdDsgdGhpcyBoaWRlcyB0aGUgYm9iYmxlCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBNSU5JTVVNX1BPU0lUSU9OX0RFTFRBID0gODsKKyAgICAgICAgICAgIGlmIChkZWx0YVBvc2l0aW9uIDwgMCkgeworICAgICAgICAgICAgICAgIC8vIE9ubHkgcmVwb3J0IG9uY2UgcGVyIHBvc2l0aW9uIGluc3RlYWQgb2Ygc3BhbW1pbmcgdGhlIGxvZy4KKyAgICAgICAgICAgICAgICBpZiAoIW1SZXRyb2dyYWRlTW90aW9uUmVwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coInJldHJvZ3JhZGUgdGltZXN0YW1wIHBvc2l0aW9uIGNvcnJlY3RlZCwgJWQgPSAldSAtICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzVGltZXN0YW1wLm1Qb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIG1SZXRyb2dyYWRlTW90aW9uUmVwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVJldHJvZ3JhZGVNb3Rpb25SZXBvcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRlbHRhUG9zaXRpb24gPCBNSU5JTVVNX1BPU0lUSU9OX0RFTFRBKSB7CisgICAgICAgICAgICAgICAgdGltZXN0YW1wID0gbVByZXZpb3VzVGltZXN0YW1wOyAgLy8gVXNlIGxhc3QgdmFsaWQgdGltZXN0YW1wLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1QcmV2aW91c1RpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgbVByZXZpb3VzVGltZXN0YW1wVmFsaWQgPSB0cnVlOworICAgIH0KKwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTIwNzUsNyArMjM5OCw4IEBACiAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIGZvcm1hdCglZCksIGNoYW5uZWwgY291bnQoJWQpLCBmcmFtZSBjb3VudCglenUpXG4iLCBtRm9ybWF0LAogICAgICAgICAgICAgbUNoYW5uZWxDb3VudCwgbUZyYW1lQ291bnQpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgc2FtcGxlIHJhdGUoJXUpLCBzdGF0dXMoJWQpXG4iLCBtU2FtcGxlUmF0ZSwgbVN0YXR1cyk7CisgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIHNhbXBsZSByYXRlKCV1KSwgc3BlZWQoJWYpLCBzdGF0dXMoJWQpXG4iLAorICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1QbGF5YmFja1JhdGUubVNwZWVkLCBtU3RhdHVzKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIHN0YXRlKCVkKSwgbGF0ZW5jeSAoJWQpXG4iLCBtU3RhdGUsIG1MYXRlbmN5KTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CkBAIC0yMDg5LDYgKzI0MTMsNDggQEAKICAgICByZXR1cm4gbVByb3h5LT5nZXRVbmRlcnJ1bkZyYW1lcygpOwogfQogCitzdGF0dXNfdCBBdWRpb1RyYWNrOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spCit7CisgICAgaWYgKGNhbGxiYWNrID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzIGFkZGluZyBOVUxMIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobURldmljZUNhbGxiYWNrID09IGNhbGxiYWNrKSB7CisgICAgICAgIEFMT0dXKCIlcyBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGlmIChtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCkgeworICAgICAgICAgICAgQUxPR1coIiVzIGNhbGxiYWNrIGFscmVhZHkgcHJlc2VudCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLCBtT3V0cHV0KTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjYWxsYmFjaywgbU91dHB1dCk7CisgICAgfQorICAgIG1EZXZpY2VDYWxsYmFjayA9IGNhbGxiYWNrOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvVHJhY2s6OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spCit7CisgICAgaWYgKGNhbGxiYWNrID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzIHJlbW92aW5nIE5VTEwgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gY2FsbGJhY2spIHsKKyAgICAgICAgQUxPR1coIiVzIHJlbW92aW5nIGRpZmZlcmVudCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIGlmIChtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKG1EZXZpY2VDYWxsYmFjaywgbU91dHB1dCk7CisgICAgfQorICAgIG1EZXZpY2VDYWxsYmFjayA9IDA7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIHZvaWQgQXVkaW9UcmFjazo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKQpAQCAtMjE0OCw4ICsyNTE0LDggQEAKICAgICBjYXNlIE5TX05FVkVSOgogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgY2FzZSBOU19XSEVORVZFUjoKLSAgICAgICAgLy8gRklYTUUgaW5jcmVhc2UgcG9sbCBpbnRlcnZhbCwgb3IgbWFrZSBldmVudC1kcml2ZW4KLSAgICAgICAgbnMgPSAxMDAwMDAwMDAwTEw7CisgICAgICAgIC8vIEV2ZW50IGRyaXZlbjogY2FsbCB3YWtlKCkgd2hlbiBjYWxsYmFjayBub3RpZmljYXRpb25zIGNvbmRpdGlvbnMgY2hhbmdlLgorICAgICAgICBucyA9IElOVDY0X01BWDsKICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCiAgICAgZGVmYXVsdDoKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihucyA8IDAsICJwcm9jZXNzQXVkaW9CdWZmZXIoKSByZXR1cm5lZCAlIiBQUklkNjQsIG5zKTsKQEAgLTIxODIsNiArMjU0OCwyMSBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb1RyYWNrOjpBdWRpb1RyYWNrVGhyZWFkOjp3YWtlKCkKK3sKKyAgICBBdXRvTXV0ZXggX2wobU15TG9jayk7CisgICAgaWYgKCFtUGF1c2VkKSB7CisgICAgICAgIC8vIHdha2UoKSBtaWdodCBiZSBjYWxsZWQgd2hpbGUgc2VydmljaW5nIGEgY2FsbGJhY2sgLSBpZ25vcmUgdGhlIG5leHQKKyAgICAgICAgLy8gcGF1c2UgdGltZSBhbmQgY2FsbCBwcm9jZXNzQXVkaW9CdWZmZXIuCisgICAgICAgIG1JZ25vcmVOZXh0UGF1c2VkSW50ID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1QYXVzZWRJbnQgJiYgbVBhdXNlZE5zID4gMCkgeworICAgICAgICAgICAgLy8gYXVkaW8gdHJhY2sgaXMgYWN0aXZlIGFuZCBpbnRlcm5hbGx5IHBhdXNlZCB3aXRoIHRpbWVvdXQuCisgICAgICAgICAgICBtUGF1c2VkSW50ID0gZmFsc2U7CisgICAgICAgICAgICBtTXlDb25kLnNpZ25hbCgpOworICAgICAgICB9CisgICAgfQorfQorCiB2b2lkIEF1ZGlvVHJhY2s6OkF1ZGlvVHJhY2tUaHJlYWQ6OnBhdXNlSW50ZXJuYWwobnNlY3NfdCBucykKIHsKICAgICBBdXRvTXV0ZXggX2wobU15TG9jayk7CkBAIC0yMTg5LDQgKzI1NzAsNCBAQAogICAgIG1QYXVzZWROcyA9IG5zOwogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQXVkaW9UcmFja1NoYXJlZC5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmNwcAppbmRleCBmZjI0NDc1Li42YTUxYTc2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmNwcApAQCAtMjgsNyArMjgsMjEgQEAKIC8vIHVzZWQgdG8gY2xhbXAgYSB2YWx1ZSB0byBzaXplX3QuICBUT0RPOiBtb3ZlIHRvIGFub3RoZXIgZmlsZS4KIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogc2l6ZV90IGNsYW1wVG9TaXplKFQgeCkgewotICAgIHJldHVybiB4ID4gU0laRV9NQVggPyBTSVpFX01BWCA6IHggPCAwID8gMCA6IChzaXplX3QpIHg7CisgICAgcmV0dXJuIHNpemVvZihUKSA+IHNpemVvZihzaXplX3QpICYmIHggPiAoVCkgU0laRV9NQVggPyBTSVpFX01BWCA6IHggPCAwID8gMCA6IChzaXplX3QpIHg7Cit9CisKKy8vIGluY3JlbWVudFNlcXVlbmNlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBuZXh0IHNlcXVlbmNlIHZhbHVlCisvLyBmb3IgdGhlIGxvb3AgYW5kIHBvc2l0aW9uIHNlcXVlbmNlIGNvdW50ZXJzLiAgSXQgc2hvdWxkIHJldHVybgorLy8gYSB2YWx1ZSBiZXR3ZWVuICJvdGhlciIgKyAxIGFuZCAib3RoZXIiICsgSU5UMzJfTUFYLCB0aGUgY2hvaWNlIG9mCisvLyB3aGljaCBuZWVkcyB0byBiZSB0aGUgImxlYXN0IHJlY2VudGx5IHVzZWQiIHNlcXVlbmNlIHZhbHVlIGZvciAic2VsZiIuCisvLyBJbiBnZW5lcmFsLCB0aGlzIG1lYW5zIChuZXdfc2VsZikgcmV0dXJuZWQgaXMgbWF4KHNlbGYsIG90aGVyKSArIDEuCisKK3N0YXRpYyB1aW50MzJfdCBpbmNyZW1lbnRTZXF1ZW5jZSh1aW50MzJfdCBzZWxmLCB1aW50MzJfdCBvdGhlcikgeworICAgIGludDMyX3QgZGlmZiA9IHNlbGYgLSBvdGhlcjsKKyAgICBpZiAoZGlmZiA+PSAwICYmIGRpZmYgPCBJTlQzMl9NQVgpIHsKKyAgICAgICAgcmV0dXJuIHNlbGYgKyAxOyAvLyB3ZSdyZSBhbHJlYWR5IGFoZWFkIG9mIG90aGVyLgorICAgIH0KKyAgICByZXR1cm4gb3RoZXIgKyAxOyAvLyB3ZSdyZSBiZWhpbmQsIHNvIG1vdmUganVzdCBhaGVhZCBvZiBvdGhlci4KIH0KIAogYXVkaW9fdHJhY2tfY2Jsa190OjphdWRpb190cmFja19jYmxrX3QoKQpAQCAtMzYwLDYgKzM3NCw5IEBACiAgICAgc2l6ZV90IGluY3JlbWVudCA9IG1GcmFtZUNvdW50UDIgPDwgMTsKICAgICBzaXplX3QgbWFzayA9IGluY3JlbWVudCAtIDE7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7CisgICAgLy8gbUZsdXNoIGlzIDMyIGJpdHMgY29uY2F0ZW5hdGVkIGFzIFsgZmx1c2hfY291bnRlciBdIFsgbmV3ZnJvbnRfb2Zmc2V0IF0KKyAgICAvLyBTaG91bGQgbmV3Rmx1c2ggPSBjYmxrLT51Lm1TdHJlYW1pbmcubVJlYXI/ICBPbmx5IHByb2JsZW0gaXMKKyAgICAvLyBpZiB5b3Ugd2FudCB0byBmbHVzaCB0d2ljZSB0byB0aGUgc2FtZSByZWFyIGxvY2F0aW9uIGFmdGVyIGEgMzIgYml0IHdyYXAuCiAgICAgaW50MzJfdCBuZXdGbHVzaCA9IChjYmxrLT51Lm1TdHJlYW1pbmcubVJlYXIgJiBtYXNrKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAoKGNibGstPnUubVN0cmVhbWluZy5tRmx1c2ggJiB+bWFzaykgKyBpbmNyZW1lbnQpOwogICAgIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUobmV3Rmx1c2gsICZjYmxrLT51Lm1TdHJlYW1pbmcubUZsdXNoKTsKQEAgLTQwOSw3ICs0MjYsNiBAQAogICAgICAgICAgICAgZ290byBlbmQ7CiAgICAgICAgIH0KICAgICAgICAgLy8gY2hlY2sgZm9yIG9idGFpbkJ1ZmZlciBpbnRlcnJ1cHRlZCBieSBjbGllbnQKLSAgICAgICAgLy8gY2hlY2sgZm9yIG9idGFpbkJ1ZmZlciBpbnRlcnJ1cHRlZCBieSBjbGllbnQKICAgICAgICAgaWYgKGZsYWdzICYgQ0JMS19JTlRFUlJVUFQpIHsKICAgICAgICAgICAgIEFMT0dWKCJ3YWl0U3RyZWFtRW5kRG9uZSgpIGludGVycnVwdGVkIGJ5IGNsaWVudCIpOwogICAgICAgICAgICAgc3RhdHVzID0gLUVJTlRSOwpAQCAtNDg1LDggKzUwMSwxMSBAQAogU3RhdGljQXVkaW9UcmFja0NsaWVudFByb3h5OjpTdGF0aWNBdWRpb1RyYWNrQ2xpZW50UHJveHkoYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrLCB2b2lkICpidWZmZXJzLAogICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwgc2l6ZV90IGZyYW1lU2l6ZSkKICAgICA6IEF1ZGlvVHJhY2tDbGllbnRQcm94eShjYmxrLCBidWZmZXJzLCBmcmFtZUNvdW50LCBmcmFtZVNpemUpLAotICAgICAgbU11dGF0b3IoJmNibGstPnUubVN0YXRpYy5tU2luZ2xlU3RhdGVRdWV1ZSksIG1CdWZmZXJQb3NpdGlvbigwKQorICAgICAgbU11dGF0b3IoJmNibGstPnUubVN0YXRpYy5tU2luZ2xlU3RhdGVRdWV1ZSksCisgICAgICBtUG9zTG9vcE9ic2VydmVyKCZjYmxrLT51Lm1TdGF0aWMubVBvc0xvb3BRdWV1ZSkKIHsKKyAgICBtZW1zZXQoJm1TdGF0ZSwgMCwgc2l6ZW9mKG1TdGF0ZSkpOworICAgIG1lbXNldCgmbVBvc0xvb3AsIDAsIHNpemVvZihtUG9zTG9vcCkpOwogfQogCiB2b2lkIFN0YXRpY0F1ZGlvVHJhY2tDbGllbnRQcm94eTo6Zmx1c2goKQpAQCAtNTAxLDMwICs1MjAsNzIgQEAKICAgICAgICAgLy8gRklYTUUgU2hvdWxkIHJldHVybiBhbiBlcnJvciBzdGF0dXMKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBTdGF0aWNBdWRpb1RyYWNrU3RhdGUgbmV3U3RhdGU7Ci0gICAgbmV3U3RhdGUubUxvb3BTdGFydCA9ICh1aW50MzJfdCkgbG9vcFN0YXJ0OwotICAgIG5ld1N0YXRlLm1Mb29wRW5kID0gKHVpbnQzMl90KSBsb29wRW5kOwotICAgIG5ld1N0YXRlLm1Mb29wQ291bnQgPSBsb29wQ291bnQ7Ci0gICAgc2l6ZV90IGJ1ZmZlclBvc2l0aW9uOwotICAgIGlmIChsb29wQ291bnQgPT0gMCB8fCAoYnVmZmVyUG9zaXRpb24gPSBnZXRCdWZmZXJQb3NpdGlvbigpKSA+PSBsb29wRW5kKSB7Ci0gICAgICAgIGJ1ZmZlclBvc2l0aW9uID0gbG9vcFN0YXJ0OworICAgIG1TdGF0ZS5tTG9vcFN0YXJ0ID0gKHVpbnQzMl90KSBsb29wU3RhcnQ7CisgICAgbVN0YXRlLm1Mb29wRW5kID0gKHVpbnQzMl90KSBsb29wRW5kOworICAgIG1TdGF0ZS5tTG9vcENvdW50ID0gbG9vcENvdW50OworICAgIG1TdGF0ZS5tTG9vcFNlcXVlbmNlID0gaW5jcmVtZW50U2VxdWVuY2UobVN0YXRlLm1Mb29wU2VxdWVuY2UsIG1TdGF0ZS5tUG9zaXRpb25TZXF1ZW5jZSk7CisgICAgLy8gc2V0IHBhdGNoLXVwIHZhcmlhYmxlcyB1bnRpbCB0aGUgbVN0YXRlIGlzIGFja25vd2xlZGdlZCBieSB0aGUgU2VydmVyUHJveHkuCisgICAgLy8gb2JzZXJ2ZWQgYnVmZmVyIHBvc2l0aW9uIGFuZCBsb29wIGNvdW50IHdpbGwgZnJlZXplIHVudGlsIHRoZW4gdG8gZ2l2ZSB0aGUKKyAgICAvLyBpbGx1c2lvbiBvZiBhIHN5bmNocm9ub3VzIGNoYW5nZS4KKyAgICBnZXRCdWZmZXJQb3NpdGlvbkFuZExvb3BDb3VudChOVUxMLCBOVUxMKTsKKyAgICAvLyBwcmVzZXJ2ZSBiZWhhdmlvciB0byByZXN0YXJ0IGF0IG1TdGF0ZS5tTG9vcFN0YXJ0IGlmIHBvc2l0aW9uIGV4Y2VlZHMgbVN0YXRlLm1Mb29wRW5kLgorICAgIGlmIChtU3RhdGUubUxvb3BDb3VudCAhPSAwICYmIG1Qb3NMb29wLm1CdWZmZXJQb3NpdGlvbiA+PSBtU3RhdGUubUxvb3BFbmQpIHsKKyAgICAgICAgbVBvc0xvb3AubUJ1ZmZlclBvc2l0aW9uID0gbVN0YXRlLm1Mb29wU3RhcnQ7CiAgICAgfQotICAgIG1CdWZmZXJQb3NpdGlvbiA9IGJ1ZmZlclBvc2l0aW9uOyAvLyBzbmFwc2hvdCBidWZmZXIgcG9zaXRpb24gdW50aWwgbG9vcCBpcyBhY2tub3dsZWRnZWQuCi0gICAgKHZvaWQpIG1NdXRhdG9yLnB1c2gobmV3U3RhdGUpOworICAgIG1Qb3NMb29wLm1Mb29wQ291bnQgPSBtU3RhdGUubUxvb3BDb3VudDsKKyAgICAodm9pZCkgbU11dGF0b3IucHVzaChtU3RhdGUpOworfQorCit2b2lkIFN0YXRpY0F1ZGlvVHJhY2tDbGllbnRQcm94eTo6c2V0QnVmZmVyUG9zaXRpb24oc2l6ZV90IHBvc2l0aW9uKQoreworICAgIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIG9uIGEgNjQtYml0IGNsaWVudAorICAgIGlmIChwb3NpdGlvbiA+IFVJTlQzMl9NQVgpIHsKKyAgICAgICAgLy8gRklYTUUgU2hvdWxkIHJldHVybiBhbiBlcnJvciBzdGF0dXMKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtU3RhdGUubVBvc2l0aW9uID0gKHVpbnQzMl90KSBwb3NpdGlvbjsKKyAgICBtU3RhdGUubVBvc2l0aW9uU2VxdWVuY2UgPSBpbmNyZW1lbnRTZXF1ZW5jZShtU3RhdGUubVBvc2l0aW9uU2VxdWVuY2UsIG1TdGF0ZS5tTG9vcFNlcXVlbmNlKTsKKyAgICAvLyBzZXQgcGF0Y2gtdXAgdmFyaWFibGVzIHVudGlsIHRoZSBtU3RhdGUgaXMgYWNrbm93bGVkZ2VkIGJ5IHRoZSBTZXJ2ZXJQcm94eS4KKyAgICAvLyBvYnNlcnZlZCBidWZmZXIgcG9zaXRpb24gYW5kIGxvb3AgY291bnQgd2lsbCBmcmVlemUgdW50aWwgdGhlbiB0byBnaXZlIHRoZQorICAgIC8vIGlsbHVzaW9uIG9mIGEgc3luY2hyb25vdXMgY2hhbmdlLgorICAgIGlmIChtU3RhdGUubUxvb3BDb3VudCA+IDApIHsgIC8vIG9ubHkgY2hlY2sgaWYgbG9vcCBjb3VudCBpcyBjaGFuZ2luZworICAgICAgICBnZXRCdWZmZXJQb3NpdGlvbkFuZExvb3BDb3VudChOVUxMLCBOVUxMKTsgLy8gZ2V0IGxhc3QgcG9zaXRpb24KKyAgICB9CisgICAgbVBvc0xvb3AubUJ1ZmZlclBvc2l0aW9uID0gcG9zaXRpb247CisgICAgaWYgKHBvc2l0aW9uID49IG1TdGF0ZS5tTG9vcEVuZCkgeworICAgICAgICAvLyBubyBvbmdvaW5nIGxvb3AgaXMgcG9zc2libGUgaWYgcG9zaXRpb24gaXMgZ3JlYXRlciB0aGFuIGxvb3BFbmQuCisgICAgICAgIG1Qb3NMb29wLm1Mb29wQ291bnQgPSAwOworICAgIH0KKyAgICAodm9pZCkgbU11dGF0b3IucHVzaChtU3RhdGUpOworfQorCit2b2lkIFN0YXRpY0F1ZGlvVHJhY2tDbGllbnRQcm94eTo6c2V0QnVmZmVyUG9zaXRpb25BbmRMb29wKHNpemVfdCBwb3NpdGlvbiwgc2l6ZV90IGxvb3BTdGFydCwKKyAgICAgICAgc2l6ZV90IGxvb3BFbmQsIGludCBsb29wQ291bnQpCit7CisgICAgc2V0TG9vcChsb29wU3RhcnQsIGxvb3BFbmQsIGxvb3BDb3VudCk7CisgICAgc2V0QnVmZmVyUG9zaXRpb24ocG9zaXRpb24pOwogfQogCiBzaXplX3QgU3RhdGljQXVkaW9UcmFja0NsaWVudFByb3h5OjpnZXRCdWZmZXJQb3NpdGlvbigpCiB7Ci0gICAgc2l6ZV90IGJ1ZmZlclBvc2l0aW9uOwotICAgIGlmIChtTXV0YXRvci5hY2soKSkgewotICAgICAgICBidWZmZXJQb3NpdGlvbiA9IChzaXplX3QpIG1DYmxrLT51Lm1TdGF0aWMubUJ1ZmZlclBvc2l0aW9uOwotICAgICAgICBpZiAoYnVmZmVyUG9zaXRpb24gPiBtRnJhbWVDb3VudCkgewotICAgICAgICAgICAgYnVmZmVyUG9zaXRpb24gPSBtRnJhbWVDb3VudDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ1ZmZlclBvc2l0aW9uID0gbUJ1ZmZlclBvc2l0aW9uOworICAgIGdldEJ1ZmZlclBvc2l0aW9uQW5kTG9vcENvdW50KE5VTEwsIE5VTEwpOworICAgIHJldHVybiBtUG9zTG9vcC5tQnVmZmVyUG9zaXRpb247Cit9CisKK3ZvaWQgU3RhdGljQXVkaW9UcmFja0NsaWVudFByb3h5OjpnZXRCdWZmZXJQb3NpdGlvbkFuZExvb3BDb3VudCgKKyAgICAgICAgc2l6ZV90ICpwb3NpdGlvbiwgaW50ICpsb29wQ291bnQpCit7CisgICAgaWYgKG1NdXRhdG9yLmFjaygpID09IFN0YXRpY0F1ZGlvVHJhY2tTaW5nbGVTdGF0ZVF1ZXVlOjpTU1FfRE9ORSkgeworICAgICAgICAgaWYgKG1Qb3NMb29wT2JzZXJ2ZXIucG9sbChtUG9zTG9vcCkpIHsKKyAgICAgICAgICAgICA7IC8vIGEgdmFsaWQgbVBvc0xvb3Agc2hvdWxkIGJlIGF2YWlsYWJsZSBpZiBhY2tEb25lIGlzIHRydWUuCisgICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBidWZmZXJQb3NpdGlvbjsKKyAgICBpZiAocG9zaXRpb24gIT0gTlVMTCkgeworICAgICAgICAqcG9zaXRpb24gPSBtUG9zTG9vcC5tQnVmZmVyUG9zaXRpb247CisgICAgfQorICAgIGlmIChsb29wQ291bnQgIT0gTlVMTCkgeworICAgICAgICAqbG9vcENvdW50ID0gbVBvc0xvb3AubUxvb3BDb3VudDsKKyAgICB9CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNTU1LDEzICs2MTYsMjQgQEAKICAgICAgICAgZnJvbnQgPSBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250OwogICAgICAgICBpZiAoZmx1c2ggIT0gbUZsdXNoKSB7CiAgICAgICAgICAgICAvLyBlZmZlY3RpdmVseSBvYnRhaW4gdGhlbiByZWxlYXNlIHdoYXRldmVyIGlzIGluIHRoZSBidWZmZXIKLSAgICAgICAgICAgIHNpemVfdCBtYXNrID0gKG1GcmFtZUNvdW50UDIgPDwgMSkgLSAxOworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG92ZXJmbG93Qml0ID0gbUZyYW1lQ291bnRQMiA8PCAxOworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG1hc2sgPSBvdmVyZmxvd0JpdCAtIDE7CiAgICAgICAgICAgICBpbnQzMl90IG5ld0Zyb250ID0gKGZyb250ICYgfm1hc2spIHwgKGZsdXNoICYgbWFzayk7CiAgICAgICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBuZXdGcm9udDsKKyAgICAgICAgICAgIGlmIChmaWxsZWQgPj0gKHNzaXplX3Qpb3ZlcmZsb3dCaXQpIHsKKyAgICAgICAgICAgICAgICAvLyBmcm9udCBhbmQgcmVhciBvZmZzZXRzIHNwYW4gdGhlIG92ZXJmbG93IGJpdCBvZiB0aGUgcDIgbWFzaworICAgICAgICAgICAgICAgIC8vIHNvIHJlYmFzaW5nIG5ld0Zyb250IG9uIHRoZSBmcm9udCBvZmZzZXQgaXMgb2ZmIGJ5IHRoZSBvdmVyZmxvdyBiaXQuCisgICAgICAgICAgICAgICAgLy8gYWRqdXN0IG5ld0Zyb250IHRvIG1hdGNoIHJlYXIgb2Zmc2V0LgorICAgICAgICAgICAgICAgIEFMT0dWKCJmbHVzaCB3cmFwOiBmaWxsZWQgJXp4ID49IG92ZXJmbG93Qml0ICV6eCIsIGZpbGxlZCwgb3ZlcmZsb3dCaXQpOworICAgICAgICAgICAgICAgIG5ld0Zyb250ICs9IG92ZXJmbG93Qml0OworICAgICAgICAgICAgICAgIGZpbGxlZCAtPSBvdmVyZmxvd0JpdDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFJhdGhlciB0aGFuIHNodXR0aW5nIGRvd24gb24gYSBjb3JydXB0IGZsdXNoLCBqdXN0IHRyZWF0IGl0IGFzIGEgZnVsbCBmbHVzaAogICAgICAgICAgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJtRmx1c2ggJSN4IC0+ICUjeCwgZnJvbnQgJSN4LCByZWFyICUjeCwgbWFzayAlI3gsIG5ld0Zyb250ICUjeCwgZmlsbGVkICVkPSUjeCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtRmx1c2gsIGZsdXNoLCBmcm9udCwgcmVhciwgbWFzaywgbmV3RnJvbnQsIGZpbGxlZCwgZmlsbGVkKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgibUZsdXNoICUjeCAtPiAlI3gsIGZyb250ICUjeCwgcmVhciAlI3gsIG1hc2sgJSN4LCBuZXdGcm9udCAlI3gsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJmaWxsZWQgJXpkPSUjeCIsCisgICAgICAgICAgICAgICAgICAgICAgICBtRmx1c2gsIGZsdXNoLCBmcm9udCwgcmVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCltYXNrLCBuZXdGcm9udCwgZmlsbGVkLCAodW5zaWduZWQpZmlsbGVkKTsKICAgICAgICAgICAgICAgICBuZXdGcm9udCA9IHJlYXI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtRmx1c2ggPSBmbHVzaDsKQEAgLTczNCwxOCArODA2LDIzIEBACiAgICAgKHZvaWQpIGFuZHJvaWRfYXRvbWljX29yKENCTEtfVU5ERVJSVU4sICZjYmxrLT5tRmxhZ3MpOwogfQogCitBdWRpb1BsYXliYWNrUmF0ZSBBdWRpb1RyYWNrU2VydmVyUHJveHk6OmdldFBsYXliYWNrUmF0ZSgpCit7ICAgLy8gZG8gbm90IGNhbGwgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIHdpdGhvdXQgaG9sZGluZyBsb2NrCisgICAgbVBsYXliYWNrUmF0ZU9ic2VydmVyLnBvbGwobVBsYXliYWNrUmF0ZSk7CisgICAgcmV0dXJuIG1QbGF5YmFja1JhdGU7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6OlN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eShhdWRpb190cmFja19jYmxrX3QqIGNibGssIHZvaWQgKmJ1ZmZlcnMsCiAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LCBzaXplX3QgZnJhbWVTaXplKQogICAgIDogQXVkaW9UcmFja1NlcnZlclByb3h5KGNibGssIGJ1ZmZlcnMsIGZyYW1lQ291bnQsIGZyYW1lU2l6ZSksCi0gICAgICBtT2JzZXJ2ZXIoJmNibGstPnUubVN0YXRpYy5tU2luZ2xlU3RhdGVRdWV1ZSksIG1Qb3NpdGlvbigwKSwKKyAgICAgIG1PYnNlcnZlcigmY2Jsay0+dS5tU3RhdGljLm1TaW5nbGVTdGF0ZVF1ZXVlKSwKKyAgICAgIG1Qb3NMb29wTXV0YXRvcigmY2Jsay0+dS5tU3RhdGljLm1Qb3NMb29wUXVldWUpLAogICAgICAgbUZyYW1lc1JlYWR5U2FmZShmcmFtZUNvdW50KSwgbUZyYW1lc1JlYWR5KGZyYW1lQ291bnQpLAogICAgICAgbUZyYW1lc1JlYWR5SXNDYWxsZWRCeU11bHRpcGxlVGhyZWFkcyhmYWxzZSkKIHsKLSAgICBtU3RhdGUubUxvb3BTdGFydCA9IDA7Ci0gICAgbVN0YXRlLm1Mb29wRW5kID0gMDsKLSAgICBtU3RhdGUubUxvb3BDb3VudCA9IDA7CisgICAgbWVtc2V0KCZtU3RhdGUsIDAsIHNpemVvZihtU3RhdGUpKTsKIH0KIAogdm9pZCBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6OmZyYW1lc1JlYWR5SXNDYWxsZWRCeU11bHRpcGxlVGhyZWFkcygpCkBAIC03NjIsNTUgKzgzOSw5NyBAQAogICAgIHJldHVybiBtRnJhbWVzUmVhZHlTYWZlOwogfQogCi1zc2l6ZV90IFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6cG9sbFBvc2l0aW9uKCkKK3N0YXR1c190IFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6dXBkYXRlU3RhdGVXaXRoTG9vcCgKKyAgICAgICAgU3RhdGljQXVkaW9UcmFja1N0YXRlICpsb2NhbFN0YXRlLCBjb25zdCBTdGF0aWNBdWRpb1RyYWNrU3RhdGUgJnVwZGF0ZSkgY29uc3QKIHsKLSAgICBzaXplX3QgcG9zaXRpb24gPSBtUG9zaXRpb247Ci0gICAgU3RhdGljQXVkaW9UcmFja1N0YXRlIHN0YXRlOwotICAgIGlmIChtT2JzZXJ2ZXIucG9sbChzdGF0ZSkpIHsKKyAgICBpZiAobG9jYWxTdGF0ZS0+bUxvb3BTZXF1ZW5jZSAhPSB1cGRhdGUubUxvb3BTZXF1ZW5jZSkgewogICAgICAgICBib29sIHZhbGlkID0gZmFsc2U7Ci0gICAgICAgIHNpemVfdCBsb29wU3RhcnQgPSBzdGF0ZS5tTG9vcFN0YXJ0OwotICAgICAgICBzaXplX3QgbG9vcEVuZCA9IHN0YXRlLm1Mb29wRW5kOwotICAgICAgICBpZiAoc3RhdGUubUxvb3BDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAobG9vcFN0YXJ0ID4gbUZyYW1lQ291bnQpIHsKLSAgICAgICAgICAgICAgICBsb29wU3RhcnQgPSBtRnJhbWVDb3VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGlnbm9yZSBsb29wRW5kCi0gICAgICAgICAgICBtUG9zaXRpb24gPSBwb3NpdGlvbiA9IGxvb3BTdGFydDsKLSAgICAgICAgICAgIG1GcmFtZXNSZWFkeSA9IG1GcmFtZUNvdW50IC0gbVBvc2l0aW9uOwotICAgICAgICAgICAgbVN0YXRlLm1Mb29wQ291bnQgPSAwOworICAgICAgICBjb25zdCBzaXplX3QgbG9vcFN0YXJ0ID0gdXBkYXRlLm1Mb29wU3RhcnQ7CisgICAgICAgIGNvbnN0IHNpemVfdCBsb29wRW5kID0gdXBkYXRlLm1Mb29wRW5kOworICAgICAgICBzaXplX3QgcG9zaXRpb24gPSBsb2NhbFN0YXRlLT5tUG9zaXRpb247CisgICAgICAgIGlmICh1cGRhdGUubUxvb3BDb3VudCA9PSAwKSB7CiAgICAgICAgICAgICB2YWxpZCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUubUxvb3BDb3VudCA+PSAtMSkgeworICAgICAgICB9IGVsc2UgaWYgKHVwZGF0ZS5tTG9vcENvdW50ID49IC0xKSB7CiAgICAgICAgICAgICBpZiAobG9vcFN0YXJ0IDwgbG9vcEVuZCAmJiBsb29wRW5kIDw9IG1GcmFtZUNvdW50ICYmCiAgICAgICAgICAgICAgICAgICAgIGxvb3BFbmQgLSBsb29wU3RhcnQgPj0gTUlOX0xPT1ApIHsKICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpcyBncmVhdGVyIHRoYW4gdGhlIGVuZCBvZiB0aGUgbG9vcAogICAgICAgICAgICAgICAgIC8vIHdlICJ3cmFwIiB0byB0aGUgbG9vcCBzdGFydC4gVGhpcyBtaWdodCBjYXVzZSBhbiBhdWRpYmxlIHBvcC4KICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPj0gbG9vcEVuZCkgewotICAgICAgICAgICAgICAgICAgICBtUG9zaXRpb24gPSBwb3NpdGlvbiA9IGxvb3BTdGFydDsKKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBsb29wU3RhcnQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5tTG9vcENvdW50ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GcmFtZXNSZWFkeSA9IElOVDY0X01BWDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBtRnJhbWVzUmVhZHkgaXMgNjQgYml0cyB0byBoYW5kbGUgdGhlIGVmZmVjdGl2ZSBudW1iZXIgb2YgZnJhbWVzCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIHN0YXRpYyBhdWRpbyB0cmFjayBjb250YWlucywgaW5jbHVkaW5nIGxvb3BzLgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBMYXRlciBjb25zaWRlciBmaXhpbmcgb3ZlcmZsb3csIGJ1dCBkb2VzIG5vdCBzZWVtIG5lZWRlZCBub3cKLSAgICAgICAgICAgICAgICAgICAgLy8gYXMgd2lsbCBub3Qgb3ZlcmZsb3cgaWYgbG9vcFN0YXJ0IGFuZCBsb29wRW5kIGFyZSBKYXZhICJpbnRzIi4KLSAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1JlYWR5ID0gaW50NjRfdChzdGF0ZS5tTG9vcENvdW50KSAqIChsb29wRW5kIC0gbG9vcFN0YXJ0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUZyYW1lQ291bnQgLSBtUG9zaXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1TdGF0ZSA9IHN0YXRlOwogICAgICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoIXZhbGlkIHx8IG1Qb3NpdGlvbiA+IG1GcmFtZUNvdW50KSB7CisgICAgICAgIGlmICghdmFsaWQgfHwgcG9zaXRpb24gPiBtRnJhbWVDb3VudCkgeworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKyAgICAgICAgbG9jYWxTdGF0ZS0+bVBvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgIGxvY2FsU3RhdGUtPm1Mb29wQ291bnQgPSB1cGRhdGUubUxvb3BDb3VudDsKKyAgICAgICAgbG9jYWxTdGF0ZS0+bUxvb3BFbmQgPSBsb29wRW5kOworICAgICAgICBsb2NhbFN0YXRlLT5tTG9vcFN0YXJ0ID0gbG9vcFN0YXJ0OworICAgICAgICBsb2NhbFN0YXRlLT5tTG9vcFNlcXVlbmNlID0gdXBkYXRlLm1Mb29wU2VxdWVuY2U7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RhdGljQXVkaW9UcmFja1NlcnZlclByb3h5Ojp1cGRhdGVTdGF0ZVdpdGhQb3NpdGlvbigKKyAgICAgICAgU3RhdGljQXVkaW9UcmFja1N0YXRlICpsb2NhbFN0YXRlLCBjb25zdCBTdGF0aWNBdWRpb1RyYWNrU3RhdGUgJnVwZGF0ZSkgY29uc3QKK3sKKyAgICBpZiAobG9jYWxTdGF0ZS0+bVBvc2l0aW9uU2VxdWVuY2UgIT0gdXBkYXRlLm1Qb3NpdGlvblNlcXVlbmNlKSB7CisgICAgICAgIGlmICh1cGRhdGUubVBvc2l0aW9uID4gbUZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9IGVsc2UgaWYgKGxvY2FsU3RhdGUtPm1Mb29wQ291bnQgIT0gMCAmJiB1cGRhdGUubVBvc2l0aW9uID49IGxvY2FsU3RhdGUtPm1Mb29wRW5kKSB7CisgICAgICAgICAgICBsb2NhbFN0YXRlLT5tTG9vcENvdW50ID0gMDsgLy8gZGlzYWJsZSBsb29wIGNvdW50IGlmIHBvc2l0aW9uIGlzIGJleW9uZCBsb29wIGVuZC4KKyAgICAgICAgfQorICAgICAgICBsb2NhbFN0YXRlLT5tUG9zaXRpb24gPSB1cGRhdGUubVBvc2l0aW9uOworICAgICAgICBsb2NhbFN0YXRlLT5tUG9zaXRpb25TZXF1ZW5jZSA9IHVwZGF0ZS5tUG9zaXRpb25TZXF1ZW5jZTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzc2l6ZV90IFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6cG9sbFBvc2l0aW9uKCkKK3sKKyAgICBTdGF0aWNBdWRpb1RyYWNrU3RhdGUgc3RhdGU7CisgICAgaWYgKG1PYnNlcnZlci5wb2xsKHN0YXRlKSkgeworICAgICAgICBTdGF0aWNBdWRpb1RyYWNrU3RhdGUgdHJ5c3RhdGUgPSBtU3RhdGU7CisgICAgICAgIGJvb2wgcmVzdWx0OworICAgICAgICBjb25zdCBpbnQzMl90IGRpZmZTZXEgPSBzdGF0ZS5tTG9vcFNlcXVlbmNlIC0gc3RhdGUubVBvc2l0aW9uU2VxdWVuY2U7CisKKyAgICAgICAgaWYgKGRpZmZTZXEgPCAwKSB7CisgICAgICAgICAgICByZXN1bHQgPSB1cGRhdGVTdGF0ZVdpdGhMb29wKCZ0cnlzdGF0ZSwgc3RhdGUpID09IE9LICYmCisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXRlV2l0aFBvc2l0aW9uKCZ0cnlzdGF0ZSwgc3RhdGUpID09IE9LOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gdXBkYXRlU3RhdGVXaXRoUG9zaXRpb24oJnRyeXN0YXRlLCBzdGF0ZSkgPT0gT0sgJiYKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3RhdGVXaXRoTG9vcCgmdHJ5c3RhdGUsIHN0YXRlKSA9PSBPSzsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICAgICAgbU9ic2VydmVyLmRvbmUoKTsKKyAgICAgICAgICAgIC8vIGNhdXRpb246IG5vIHVwZGF0ZSBvY2N1cnMgc28gc2VydmVyIHN0YXRlIHdpbGwgYmUgaW5jb25zaXN0ZW50IHdpdGggY2xpZW50IHN0YXRlLgogICAgICAgICAgICAgQUxPR0UoIiVzIGNsaWVudCBwdXNoZWQgYW4gaW52YWxpZCBzdGF0ZSwgc2h1dHRpbmcgZG93biIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIG1Jc1NodXRkb3duID0gdHJ1ZTsKICAgICAgICAgICAgIHJldHVybiAoc3NpemVfdCkgTk9fSU5JVDsKICAgICAgICAgfQorICAgICAgICBtU3RhdGUgPSB0cnlzdGF0ZTsKKyAgICAgICAgaWYgKG1TdGF0ZS5tTG9vcENvdW50ID09IC0xKSB7CisgICAgICAgICAgICBtRnJhbWVzUmVhZHkgPSBJTlQ2NF9NQVg7CisgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlLm1Mb29wQ291bnQgPT0gMCkgeworICAgICAgICAgICAgbUZyYW1lc1JlYWR5ID0gbUZyYW1lQ291bnQgLSBtU3RhdGUubVBvc2l0aW9uOworICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZS5tTG9vcENvdW50ID4gMCkgeworICAgICAgICAgICAgLy8gVE9ETzogTGF0ZXIgY29uc2lkZXIgZml4aW5nIG92ZXJmbG93LCBidXQgZG9lcyBub3Qgc2VlbSBuZWVkZWQgbm93CisgICAgICAgICAgICAvLyBhcyB3aWxsIG5vdCBvdmVyZmxvdyBpZiBsb29wU3RhcnQgYW5kIGxvb3BFbmQgYXJlIEphdmEgImludHMiLgorICAgICAgICAgICAgbUZyYW1lc1JlYWR5ID0gaW50NjRfdChtU3RhdGUubUxvb3BDb3VudCkgKiAobVN0YXRlLm1Mb29wRW5kIC0gbVN0YXRlLm1Mb29wU3RhcnQpCisgICAgICAgICAgICAgICAgICAgICsgbUZyYW1lQ291bnQgLSBtU3RhdGUubVBvc2l0aW9uOworICAgICAgICB9CiAgICAgICAgIG1GcmFtZXNSZWFkeVNhZmUgPSBjbGFtcFRvU2l6ZShtRnJhbWVzUmVhZHkpOwogICAgICAgICAvLyBUaGlzIG1heSBvdmVyZmxvdywgYnV0IGNsaWVudCBpcyBub3Qgc3VwcG9zZWQgdG8gcmVseSBvbiBpdAotICAgICAgICBtQ2Jsay0+dS5tU3RhdGljLm1CdWZmZXJQb3NpdGlvbiA9ICh1aW50MzJfdCkgcG9zaXRpb247CisgICAgICAgIFN0YXRpY0F1ZGlvVHJhY2tQb3NMb29wIHBvc0xvb3A7CisKKyAgICAgICAgcG9zTG9vcC5tTG9vcENvdW50ID0gKGludDMyX3QpIG1TdGF0ZS5tTG9vcENvdW50OworICAgICAgICBwb3NMb29wLm1CdWZmZXJQb3NpdGlvbiA9ICh1aW50MzJfdCkgbVN0YXRlLm1Qb3NpdGlvbjsKKyAgICAgICAgbVBvc0xvb3BNdXRhdG9yLnB1c2gocG9zTG9vcCk7CisgICAgICAgIG1PYnNlcnZlci5kb25lKCk7IC8vIHNhZmUgdG8gcmVhZCBtU3RhdGljIHZhcmlhYmxlcy4KICAgICB9Ci0gICAgcmV0dXJuIChzc2l6ZV90KSBwb3NpdGlvbjsKKyAgICByZXR1cm4gKHNzaXplX3QpIG1TdGF0ZS5tUG9zaXRpb247CiB9CiAKIHN0YXR1c190IFN0YXRpY0F1ZGlvVHJhY2tTZXJ2ZXJQcm94eTo6b2J0YWluQnVmZmVyKEJ1ZmZlciogYnVmZmVyLCBib29sIGFja0ZsdXNoIF9fdW51c2VkKQpAQCAtODQ5LDcgKzk2OCw3IEBACiAgICAgfQogICAgIC8vIEFzIG1GcmFtZXNSZWFkeSBpcyB0aGUgdG90YWwgcmVtYWluaW5nIGZyYW1lcyBpbiB0aGUgc3RhdGljIGF1ZGlvIHRyYWNrLAogICAgIC8vIGl0IGlzIGFsd2F5cyBsYXJnZXIgb3IgZXF1YWwgdG8gYXZhaWwuCi0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRnJhbWVzUmVhZHkgPCBhdmFpbCk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRnJhbWVzUmVhZHkgPCAoaW50NjRfdCkgYXZhaWwpOwogICAgIGJ1ZmZlci0+bU5vbkNvbnRpZyA9IG1GcmFtZXNSZWFkeSA9PSBJTlQ2NF9NQVggPyBTSVpFX01BWCA6IGNsYW1wVG9TaXplKG1GcmFtZXNSZWFkeSAtIGF2YWlsKTsKICAgICBtVW5yZWxlYXNlZCA9IGF2YWlsOwogICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTg1OCw3ICs5NzcsNyBAQAogdm9pZCBTdGF0aWNBdWRpb1RyYWNrU2VydmVyUHJveHk6OnJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpCiB7CiAgICAgc2l6ZV90IHN0ZXBDb3VudCA9IGJ1ZmZlci0+bUZyYW1lQ291bnQ7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRighKHN0ZXBDb3VudCA8PSBtRnJhbWVzUmVhZHkpKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEoKGludDY0X3QpIHN0ZXBDb3VudCA8PSBtRnJhbWVzUmVhZHkpKTsKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEoc3RlcENvdW50IDw9IG1VbnJlbGVhc2VkKSk7CiAgICAgaWYgKHN0ZXBDb3VudCA9PSAwKSB7CiAgICAgICAgIC8vIHByZXZlbnQgYWNjaWRlbnRhbCByZS11c2Ugb2YgYnVmZmVyCkBAIC04NjgsMTEgKzk4NywxMiBAQAogICAgIH0KICAgICBtVW5yZWxlYXNlZCAtPSBzdGVwQ291bnQ7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiBjYmxrID0gbUNibGs7Ci0gICAgc2l6ZV90IHBvc2l0aW9uID0gbVBvc2l0aW9uOworICAgIHNpemVfdCBwb3NpdGlvbiA9IG1TdGF0ZS5tUG9zaXRpb247CiAgICAgc2l6ZV90IG5ld1Bvc2l0aW9uID0gcG9zaXRpb24gKyBzdGVwQ291bnQ7CiAgICAgaW50MzJfdCBzZXRGbGFncyA9IDA7CiAgICAgaWYgKCEocG9zaXRpb24gPD0gbmV3UG9zaXRpb24gJiYgbmV3UG9zaXRpb24gPD0gbUZyYW1lQ291bnQpKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBuZXdQb3NpdGlvbiAlenUgb3V0c2lkZSBbJXp1LCAlenVdIiwgX19mdW5jX18sIG5ld1Bvc2l0aW9uLCBwb3NpdGlvbiwgbUZyYW1lQ291bnQpOworICAgICAgICBBTE9HVygiJXMgbmV3UG9zaXRpb24gJXp1IG91dHNpZGUgWyV6dSwgJXp1XSIsIF9fZnVuY19fLCBuZXdQb3NpdGlvbiwgcG9zaXRpb24sCisgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQpOwogICAgICAgICBuZXdQb3NpdGlvbiA9IG1GcmFtZUNvdW50OwogICAgIH0gZWxzZSBpZiAobVN0YXRlLm1Mb29wQ291bnQgIT0gMCAmJiBuZXdQb3NpdGlvbiA9PSBtU3RhdGUubUxvb3BFbmQpIHsKICAgICAgICAgbmV3UG9zaXRpb24gPSBtU3RhdGUubUxvb3BTdGFydDsKQEAgLTg4NSw3ICsxMDA1LDcgQEAKICAgICBpZiAobmV3UG9zaXRpb24gPT0gbUZyYW1lQ291bnQpIHsKICAgICAgICAgc2V0RmxhZ3MgfD0gQ0JMS19CVUZGRVJfRU5EOwogICAgIH0KLSAgICBtUG9zaXRpb24gPSBuZXdQb3NpdGlvbjsKKyAgICBtU3RhdGUubVBvc2l0aW9uID0gbmV3UG9zaXRpb247CiAgICAgaWYgKG1GcmFtZXNSZWFkeSAhPSBJTlQ2NF9NQVgpIHsKICAgICAgICAgbUZyYW1lc1JlYWR5IC09IHN0ZXBDb3VudDsKICAgICB9CkBAIC04OTMsNyArMTAxMywxMCBAQAogCiAgICAgY2Jsay0+bVNlcnZlciArPSBzdGVwQ291bnQ7CiAgICAgLy8gVGhpcyBtYXkgb3ZlcmZsb3csIGJ1dCBjbGllbnQgaXMgbm90IHN1cHBvc2VkIHRvIHJlbHkgb24gaXQKLSAgICBjYmxrLT51Lm1TdGF0aWMubUJ1ZmZlclBvc2l0aW9uID0gKHVpbnQzMl90KSBuZXdQb3NpdGlvbjsKKyAgICBTdGF0aWNBdWRpb1RyYWNrUG9zTG9vcCBwb3NMb29wOworICAgIHBvc0xvb3AubUJ1ZmZlclBvc2l0aW9uID0gbVN0YXRlLm1Qb3NpdGlvbjsKKyAgICBwb3NMb29wLm1Mb29wQ291bnQgPSBtU3RhdGUubUxvb3BDb3VudDsKKyAgICBtUG9zTG9vcE11dGF0b3IucHVzaChwb3NMb29wKTsKICAgICBpZiAoc2V0RmxhZ3MgIT0gMCkgewogICAgICAgICAodm9pZCkgYW5kcm9pZF9hdG9taWNfb3Ioc2V0RmxhZ3MsICZjYmxrLT5tRmxhZ3MpOwogICAgICAgICAvLyB0aGlzIHdvdWxkIGJlIGEgZ29vZCBwbGFjZSB0byB3YWtlIGEgZnV0ZXgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuY3BwIGIvbWVkaWEvbGlibWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5jcHAKaW5kZXggNDE5OTRkYy4uMzAyMDEzNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5jcHAKQEAgLTg5LDcgKzg5LDYgQEAKICAgICAgICAgLy8gdHJ5IGNvbWJpbmVkIGRldGVjdGlvbiBvZiBhcnRpc3QvYWxidW0vdGl0bGUgZXRjLgogICAgICAgICBjaGFyIGJ1ZlsxMDI0XTsKICAgICAgICAgYnVmWzBdID0gMDsKLSAgICAgICAgaW50IGlkeDsKICAgICAgICAgYm9vbCBhbGxwcmludGFibGUgPSB0cnVlOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IG1OYW1lcy5nZXRFbnRyeShpKTsKQEAgLTE2OSw3ICsxNjgsNiBAQAogICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IG1OYW1lcy5nZXRFbnRyeShpKTsKICAgICAgICAgICAgIHVpbnQ4X3QqIHNyYyA9ICh1aW50OF90ICopbVZhbHVlcy5nZXRFbnRyeShpKTsKICAgICAgICAgICAgIGludCBsZW4gPSBzdHJsZW4oKGNoYXIgKilzcmMpOwotICAgICAgICAgICAgdWludDhfdCogZGVzdCA9IHNyYzsKIAogICAgICAgICAgICAgQUxPR1YoIkBAQCBjaGVja2luZyAlcyIsIG5hbWUpOwogICAgICAgICAgICAgY29uc3QgY2hhciAqcyA9IG1WYWx1ZXMuZ2V0RW50cnkoaSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCmluZGV4IGE5NGY5Y2UuLjBiZjUwM2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb0ZsaW5nZXIuY3BwCkBAIC04MCw3ICs4MCw4IEBACiAgICAgUkVMRUFTRV9BVURJT19QQVRDSCwKICAgICBMSVNUX0FVRElPX1BBVENIRVMsCiAgICAgU0VUX0FVRElPX1BPUlRfQ09ORklHLAotICAgIEdFVF9BVURJT19IV19TWU5DCisgICAgR0VUX0FVRElPX0hXX1NZTkMsCisgICAgU1lTVEVNX1JFQURZCiB9OwogCiAjZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0CkBAIC0xNzQsOSArMTc1LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+JiBjYmxrLApAQCAtMTkwLDExICsxOTMsMTMgQEAKICAgICAgICAgZGF0YS53cml0ZUludDMyKHNhbXBsZVJhdGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZm9ybWF0KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KG9wUGFja2FnZU5hbWUpOwogICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IHBGcmFtZUNvdW50ICE9IE5VTEwgPyAqcEZyYW1lQ291bnQgOiAwOwogICAgICAgICBkYXRhLndyaXRlSW50NjQoZnJhbWVDb3VudCk7CiAgICAgICAgIHRyYWNrX2ZsYWdzX3QgbEZsYWdzID0gZmxhZ3MgIT0gTlVMTCA/ICpmbGFncyA6ICh0cmFja19mbGFnc190KSBUUkFDS19ERUZBVUxUOwogICAgICAgICBkYXRhLndyaXRlSW50MzIobEZsYWdzKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSB0aWQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGNsaWVudFVpZCk7CiAgICAgICAgIGludCBsU2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURTsKICAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICBsU2Vzc2lvbklkID0gKnNlc3Npb25JZDsKQEAgLTcwMiw2ICs3MDcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICplbmFibGVkKQpAQCAtNzIyLDYgKzcyOCw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwcmlvcml0eSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgb3V0cHV0KTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb25JZCk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihvcFBhY2thZ2VOYW1lKTsKIAogICAgICAgICBzdGF0dXNfdCBsU3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CkBAIC04OTcsNiArOTA0LDEyIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIChhdWRpb19od19zeW5jX3QpcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3lzdGVtUmVhZHkoKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgcmV0dXJuIHJlbW90ZSgpLT50cmFuc2FjdChTWVNURU1fUkVBRFksIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBdWRpb0ZsaW5nZXIsICJhbmRyb2lkLm1lZGlhLklBdWRpb0ZsaW5nZXIiKTsKQEAgLTk1MCwxOCArOTYzLDE5IEBACiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lID0gZGF0YS5yZWFkU3RyaW5nMTYoKTsKICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gZGF0YS5yZWFkSW50NjQoKTsKICAgICAgICAgICAgIHRyYWNrX2ZsYWdzX3QgZmxhZ3MgPSAodHJhY2tfZmxhZ3NfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHBpZF90IHRpZCA9IChwaWRfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBjbGllbnRVaWQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBzaXplX3Qgbm90aWZpY2F0aW9uRnJhbWVzID0gZGF0YS5yZWFkSW50NjQoKTsKICAgICAgICAgICAgIHNwPElNZW1vcnk+IGNibGs7CiAgICAgICAgICAgICBzcDxJTWVtb3J5PiBidWZmZXJzOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgICAgICAgICBzcDxJQXVkaW9SZWNvcmQ+IHJlY29yZCA9IG9wZW5SZWNvcmQoaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssICZmcmFtZUNvdW50LCAmZmxhZ3MsIHRpZCwgJnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgJm5vdGlmaWNhdGlvbkZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgY2JsaywgYnVmZmVycywgJnN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIG9wUGFja2FnZU5hbWUsICZmcmFtZUNvdW50LCAmZmxhZ3MsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50VWlkLCAmc2Vzc2lvbklkLCAmbm90aWZpY2F0aW9uRnJhbWVzLCBjYmxrLCBidWZmZXJzLCAmc3RhdHVzKTsKICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKHJlY29yZCAhPSAwKSAhPSAoc3RhdHVzID09IE5PX0VSUk9SKSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChmcmFtZUNvdW50KTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGZsYWdzKTsKQEAgLTEyNTMsMTIgKzEyNjcsMTMgQEAKICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaW50IHNlc3Npb25JZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lID0gZGF0YS5yZWFkU3RyaW5nMTYoKTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgICAgICAgICAgaW50IGlkID0gMDsKICAgICAgICAgICAgIGludCBlbmFibGVkID0gMDsKIAogICAgICAgICAgICAgc3A8SUVmZmVjdD4gZWZmZWN0ID0gY3JlYXRlRWZmZWN0KCZkZXNjLCBjbGllbnQsIHByaW9yaXR5LCBvdXRwdXQsIHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgJnN0YXR1cywgJmlkLCAmZW5hYmxlZCk7CisgICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUsICZzdGF0dXMsICZpZCwgJmVuYWJsZWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlkKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVuYWJsZWQpOwpAQCAtMTM5OCw2ICsxNDEzLDExIEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oKGF1ZGlvX3Nlc3Npb25fdClkYXRhLnJlYWRJbnQzMigpKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgU1lTVEVNX1JFQURZOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3lzdGVtUmVhZHkoKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpAQCAtMTQwNSw0ICsxNDI1LDQgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmNwcAppbmRleCAxYzI5OWY3Li4zNDI5ZDM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmNwcApAQCAtMzksMjUgKzM5LDE4IEBACiAgICAgewogICAgIH0KIAotICAgIHZvaWQgaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IHZvaWQgKnBhcmFtMikKKyAgICB2b2lkIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiYgaW9EZXNjKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlckNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGV2ZW50KTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBpb0hhbmRsZSk7Ci0gICAgICAgIGlmIChldmVudCA9PSBBdWRpb1N5c3RlbTo6U1RSRUFNX0NPTkZJR19DSEFOR0VEKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBzdHJlYW0gPSAqKGNvbnN0IHVpbnQzMl90ICopcGFyYW0yOwotICAgICAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCBzdHJlYW0gJWQiLCBzdHJlYW0pOwotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0cmVhbSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQgIT0gQXVkaW9TeXN0ZW06Ok9VVFBVVF9DTE9TRUQgJiYgZXZlbnQgIT0gQXVkaW9TeXN0ZW06OklOUFVUX0NMT1NFRCkgewotICAgICAgICAgICAgY29uc3QgQXVkaW9TeXN0ZW06Ok91dHB1dERlc2NyaXB0b3IgKmRlc2MgPQotICAgICAgICAgICAgICAgICAgICAoY29uc3QgQXVkaW9TeXN0ZW06Ok91dHB1dERlc2NyaXB0b3IgKilwYXJhbTI7Ci0gICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoZGVzYy0+c2FtcGxpbmdSYXRlKTsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihkZXNjLT5mb3JtYXQpOwotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGRlc2MtPmNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQ2NChkZXNjLT5mcmFtZUNvdW50KTsKLSAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihkZXNjLT5sYXRlbmN5KTsKLSAgICAgICAgfQorICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICBkYXRhLndyaXRlKCZpb0Rlc2MtPm1QYXRjaCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaW9EZXNjLT5tU2FtcGxpbmdSYXRlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGlvRGVzYy0+bUZvcm1hdCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihpb0Rlc2MtPm1DaGFubmVsTWFzayk7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChpb0Rlc2MtPm1GcmFtZUNvdW50KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGlvRGVzYy0+bUxhdGVuY3kpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSU9fQ09ORklHX0NIQU5HRUQsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgIH0KIH07CkBAIC03MiwyNCArNjUsMTYgQEAKICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICBjYXNlIElPX0NPTkZJR19DSEFOR0VEOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlckNsaWVudCwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IGV2ZW50ID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgY29uc3Qgdm9pZCAqcGFyYW0yID0gTlVMTDsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpPdXRwdXREZXNjcmlwdG9yIGRlc2M7Ci0gICAgICAgICAgICB1aW50MzJfdCBzdHJlYW07Ci0gICAgICAgICAgICBpZiAoZXZlbnQgPT0gQXVkaW9TeXN0ZW06OlNUUkVBTV9DT05GSUdfQ0hBTkdFRCkgewotICAgICAgICAgICAgICAgIHN0cmVhbSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICAgICAgcGFyYW0yID0gJnN0cmVhbTsKLSAgICAgICAgICAgICAgICBBTE9HVigiU1RSRUFNX0NPTkZJR19DSEFOR0VEIHN0cmVhbSAlZCIsIHN0cmVhbSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50ICE9IEF1ZGlvU3lzdGVtOjpPVVRQVVRfQ0xPU0VEICYmIGV2ZW50ICE9IEF1ZGlvU3lzdGVtOjpJTlBVVF9DTE9TRUQpIHsKLSAgICAgICAgICAgICAgICBkZXNjLnNhbXBsaW5nUmF0ZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICAgICAgZGVzYy5mb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICAgICAgZGVzYy5jaGFubmVsTWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICBkZXNjLmZyYW1lQ291bnQgPSBkYXRhLnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgICAgIGRlc2MubGF0ZW5jeSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICAgICAgcGFyYW0yID0gJmRlc2M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoZXZlbnQsIGlvSGFuZGxlLCBwYXJhbTIpOworICAgICAgICAgICAgYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50ID0gKGF1ZGlvX2lvX2NvbmZpZ19ldmVudClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGlvRGVzYyA9IG5ldyBBdWRpb0lvRGVzY3JpcHRvcigpOworICAgICAgICAgICAgaW9EZXNjLT5tSW9IYW5kbGUgPSAoYXVkaW9faW9faGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBkYXRhLnJlYWQoJmlvRGVzYy0+bVBhdGNoLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7CisgICAgICAgICAgICBpb0Rlc2MtPm1TYW1wbGluZ1JhdGUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW9EZXNjLT5tRm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW9EZXNjLT5tQ2hhbm5lbE1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpb0Rlc2MtPm1GcmFtZUNvdW50ID0gZGF0YS5yZWFkSW50NjQoKTsKKyAgICAgICAgICAgIGlvRGVzYy0+bUxhdGVuY3kgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW9Db25maWdDaGFuZ2VkKGV2ZW50LCBpb0Rlc2MpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpAQCAtOTksNCArODQsNCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCmluZGV4IDFiOGNhMmQuLjc2YjU5MjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuY3BwCkBAIC03MSw2ICs3MSw5IEBACiAgICAgUkVMRUFTRV9TT1VORFRSSUdHRVJfU0VTU0lPTiwKICAgICBHRVRfUEhPTkVfU1RBVEUsCiAgICAgUkVHSVNURVJfUE9MSUNZX01JWEVTLAorICAgIFNUQVJUX0FVRElPX1NPVVJDRSwKKyAgICBTVE9QX0FVRElPX1NPVVJDRSwKKyAgICBTRVRfQVVESU9fUE9SVF9DQUxMQkFDS19FTkFCTEVELAogfTsKIAogI2RlZmluZSBNQVhfSVRFTVNfUEVSX0xJU1QgMTAyNApAQCAtODYsMTMgKzg5LDE1IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZGV2aWNlKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXRlKSk7CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKGRldmljZV9hZGRyZXNzKTsKKyAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcoZGV2aWNlX25hbWUpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0RFVklDRV9DT05ORUNUSU9OX1NUQVRFLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KQEAgLTE2NywxMCArMTcyLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKICAgICAgICAgewogICAgICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtMjAyLDEwICsyMDksMTIgQEAKICAgICAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMSk7CiAgICAgICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKCpzdHJlYW0pOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHVpZCk7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoc2FtcGxpbmdSYXRlKTsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGZvcm1hdCkpOwogICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGZsYWdzKSk7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoc2VsZWN0ZWREZXZpY2VJZCk7CiAgICAgICAgICAgICAvLyBoYXNPZmZsb2FkSW5mbwogICAgICAgICAgICAgaWYgKG9mZmxvYWRJbmZvID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIoMCk7CkBAIC0yNjksMTAgKzI3OCwxMiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC0yODYsMTAgKzI5NywxMiBAQAogICAgICAgICB9CiAgICAgICAgIGRhdGEud3JpdGUoYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMih1aWQpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoc2FtcGxpbmdSYXRlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZm9ybWF0KSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihjaGFubmVsTWFzayk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmbGFncyk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZWxlY3RlZERldmljZUlkKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9JTlBVVF9GT1JfQVRUUiwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTYzNCw2ICs2NDcsMTQgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFR0lTVEVSX0NMSUVOVCwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoZW5hYmxlZCA/IDEgOiAwKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BVURJT19QT1JUX0NBTExCQUNLX0VOQUJMRUQsIGRhdGEsICZyZXBseSk7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpCkBAIC03MTAsNiArNzMxLDQyIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmhhbmRsZSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCB8fCBhdHRyaWJ1dGVzID09IE5VTEwgfHwgaGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZGF0YS53cml0ZShzb3VyY2UsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcpKTsKKyAgICAgICAgZGF0YS53cml0ZShhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVF9BVURJT19TT1VSQ0UsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgICpoYW5kbGUgPSAoYXVkaW9faW9faGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGhhbmRsZSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTVE9QX0FVRElPX1NPVVJDRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEF1ZGlvUG9saWN5U2VydmljZSwgImFuZHJvaWQubWVkaWEuSUF1ZGlvUG9saWN5U2VydmljZSIpOwpAQCAtNzI4LDkgKzc4NSwxMSBAQAogICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlID0KICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyA9IGRhdGEucmVhZENTdHJpbmcoKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lID0gZGF0YS5yZWFkQ1N0cmluZygpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcykpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX25hbWUpKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTgwNiwxMSArODY1LDEzIEBACiAgICAgICAgICAgICBpZiAoaGFzU3RyZWFtKSB7CiAgICAgICAgICAgICAgICAgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpZF90IHVpZCA9ICh1aWRfdClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0KICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX291dHB1dF9mbGFnc190PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBib29sIGhhc09mZmxvYWRJbmZvID0gZGF0YS5yZWFkSW50MzIoKSAhPSAwOwogICAgICAgICAgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3Qgb2ZmbG9hZEluZm87CiAgICAgICAgICAgICBpZiAoaGFzT2ZmbG9hZEluZm8pIHsKQEAgLTgxOCw5ICs4NzksOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gMDsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldE91dHB1dEZvckF0dHIoaGFzQXR0cmlidXRlcyA/ICZhdHRyIDogTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwgc2Vzc2lvbiwgJnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwgc2Vzc2lvbiwgJnN0cmVhbSwgdWlkLAogICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzLCBoYXNPZmZsb2FkSW5mbyA/ICZvZmZsb2FkSW5mbyA6IE5VTEwpOworICAgICAgICAgICAgICAgICAgICBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgaGFzT2ZmbG9hZEluZm8gPyAmb2ZmbG9hZEluZm8gOiBOVUxMKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihvdXRwdXQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RyZWFtKTsKQEAgLTg2NSwxNCArOTI2LDE2IEBACiAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cjsKICAgICAgICAgICAgIGRhdGEucmVhZCgmYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwogICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICB1aWRfdCB1aWQgPSAodWlkX3QpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSAoYXVkaW9fZm9ybWF0X3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dDsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldElucHV0Rm9yQXR0cigmYXR0ciwgJmlucHV0LCBzZXNzaW9uLAorICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IHt9OworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0SW5wdXRGb3JBdHRyKCZhdHRyLCAmaW5wdXQsIHNlc3Npb24sIHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBzZWxlY3RlZERldmljZUlkKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW5wdXQpOwpAQCAtMTE2OSw2ICsxMjMyLDEyIEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKKyAgICAgICAgY2FzZSBTRVRfQVVESU9fUE9SVF9DQUxMQkFDS19FTkFCTEVEOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChkYXRhLnJlYWRJbnQzMigpID09IDEpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCiAgICAgICAgIGNhc2UgQUNRVUlSRV9TT1VORFRSSUdHRVJfU0VTU0lPTjogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+IGNsaWVudCA9IGludGVyZmFjZV9jYXN0PElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+KApAQCAtMTIyMSw2ICsxMjkwLDI3IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKKyAgICAgICAgY2FzZSBTVEFSVF9BVURJT19TT1VSQ0U6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgc291cmNlOworICAgICAgICAgICAgZGF0YS5yZWFkKCZzb3VyY2UsIHNpemVvZihzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcpKTsKKyAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzOworICAgICAgICAgICAgZGF0YS5yZWFkKCZhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUgPSB7fTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0QXVkaW9Tb3VyY2UoJnNvdXJjZSwgJmF0dHJpYnV0ZXMsICZoYW5kbGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGhhbmRsZSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBTVE9QX0FVRElPX1NPVVJDRTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSA9IChhdWRpb19pb19oYW5kbGVfdClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RvcEF1ZGlvU291cmNlKGhhbmRsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KQEAgLTEyMjgsNCArMTMxOCw0IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAKaW5kZXggZTgwMjI3Ny4uNjVjYzdkNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAKQEAgLTI5LDcgKzI5LDggQEAKIAogZW51bSB7CiAgICAgUE9SVF9MSVNUX1VQREFURSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi0gICAgUEFUQ0hfTElTVF9VUERBVEUKKyAgICBQQVRDSF9MSVNUX1VQREFURSwKKyAgICBNSVhfU1RBVEVfVVBEQVRFCiB9OwogCiBjbGFzcyBCcEF1ZGlvUG9saWN5U2VydmljZUNsaWVudCA6IHB1YmxpYyBCcEludGVyZmFjZTxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PgpAQCAtNTMsNiArNTQsMTUgQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChQQVRDSF9MSVNUX1VQREFURSwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgfQorCisgICAgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzgocmVnSWQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGUpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTUlYX1NUQVRFX1VQREFURSwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CisgICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEF1ZGlvUG9saWN5U2VydmljZUNsaWVudCwgImFuZHJvaWQubWVkaWEuSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCIpOwpAQCAtNzMsNiArODMsMTMgQEAKICAgICAgICAgICAgIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICBjYXNlIE1JWF9TVEFURV9VUERBVEU6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBTdHJpbmc4IHJlZ0lkID0gZGF0YS5yZWFkU3RyaW5nOCgpOworICAgICAgICAgICAgaW50MzJfdCBzdGF0ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShyZWdJZCwgc3RhdGUpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KQEAgLTgwLDQgKzk3LDQgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUmVjb3JkLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lBdWRpb1JlY29yZC5jcHAKaW5kZXggOGE0YTM4My4uOWQ4MDc1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9SZWNvcmQuY3BwCkBAIC05MSw0ICs5MSw0IEBACiAgICAgfQogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUF1ZGlvVHJhY2suY3BwIGIvbWVkaWEvbGlibWVkaWEvSUF1ZGlvVHJhY2suY3BwCmluZGV4IGRmMjA5ZmQuLjY1MWNiNjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lBdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JQXVkaW9UcmFjay5jcHAKQEAgLTI5Miw0ICsyOTIsNCBAQAogICAgIH0KIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lDcnlwdG8uY3BwIGIvbWVkaWEvbGlibWVkaWEvSUNyeXB0by5jcHAKaW5kZXggZjUxYWFhMi4uMjJmOGFmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSUNyeXB0by5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUNyeXB0by5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC0zNCw2ICszNSw3IEBACiAgICAgUkVRVUlSRVNfU0VDVVJFX0NPTVBPTkVOVCwKICAgICBERUNSWVBULAogICAgIE5PVElGWV9SRVNPTFVUSU9OLAorICAgIFNFVF9NRURJQURSTV9TRVNTSU9OLAogfTsKIAogc3RydWN0IEJwQ3J5cHRvIDogcHVibGljIEJwSW50ZXJmYWNlPElDcnlwdG8+IHsKQEAgLTk3LDcgKzk5LDcgQEAKICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3Qga2V5WzE2XSwKICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgaXZbMTZdLAogICAgICAgICAgICAgQ3J5cHRvUGx1Z2luOjpNb2RlIG1vZGUsCi0gICAgICAgICAgICBjb25zdCB2b2lkICpzcmNQdHIsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmc2hhcmVkQnVmZmVyLCBzaXplX3Qgb2Zmc2V0LAogICAgICAgICAgICAgY29uc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgKnN1YlNhbXBsZXMsIHNpemVfdCBudW1TdWJTYW1wbGVzLAogICAgICAgICAgICAgdm9pZCAqZHN0UHRyLAogICAgICAgICAgICAgQVN0cmluZyAqZXJyb3JEZXRhaWxNc2cpIHsKQEAgLTEyNiw3ICsxMjgsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgZGF0YS53cml0ZUludDMyKHRvdGFsU2l6ZSk7Ci0gICAgICAgIGRhdGEud3JpdGUoc3JjUHRyLCB0b3RhbFNpemUpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHNoYXJlZEJ1ZmZlcikpOworICAgICAgICBkYXRhLndyaXRlSW50MzIob2Zmc2V0KTsKIAogICAgICAgICBkYXRhLndyaXRlSW50MzIobnVtU3ViU2FtcGxlcyk7CiAgICAgICAgIGRhdGEud3JpdGUoc3ViU2FtcGxlcywgc2l6ZW9mKENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlKSAqIG51bVN1YlNhbXBsZXMpOwpAQCAtMTM5LDcgKzE0Miw3IEBACiAKICAgICAgICAgc3NpemVfdCByZXN1bHQgPSByZXBseS5yZWFkSW50MzIoKTsKIAotICAgICAgICBpZiAocmVzdWx0ID49IEVSUk9SX0RSTV9WRU5ET1JfTUlOICYmIHJlc3VsdCA8PSBFUlJPUl9EUk1fVkVORE9SX01BWCkgeworICAgICAgICBpZiAoaXNDcnlwdG9FcnJvcihyZXN1bHQpKSB7CiAgICAgICAgICAgICBlcnJvckRldGFpbE1zZy0+c2V0VG8ocmVwbHkucmVhZENTdHJpbmcoKSk7CiAgICAgICAgIH0KIApAQCAtMTU5LDcgKzE2MiwyOCBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTk9USUZZX1JFU09MVVRJT04sIGRhdGEsICZyZXBseSk7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYURybVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNyeXB0bzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCBzZXNzaW9uSWQpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX01FRElBRFJNX1NFU1NJT04sIGRhdGEsICZyZXBseSk7CisKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKwogcHJpdmF0ZToKKyAgICB2b2lkIHJlYWRWZWN0b3IoUGFyY2VsICZyZXBseSwgVmVjdG9yPHVpbnQ4X3Q+ICZ2ZWN0b3IpIGNvbnN0IHsKKyAgICAgICAgdWludDMyX3Qgc2l6ZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB2ZWN0b3IuaW5zZXJ0QXQoKHNpemVfdCkwLCBzaXplKTsKKyAgICAgICAgcmVwbHkucmVhZCh2ZWN0b3IuZWRpdEFycmF5KCksIHNpemUpOworICAgIH0KKworICAgIHZvaWQgd3JpdGVWZWN0b3IoUGFyY2VsICZkYXRhLCBWZWN0b3I8dWludDhfdD4gY29uc3QgJnZlY3RvcikgY29uc3QgeworICAgICAgICBkYXRhLndyaXRlSW50MzIodmVjdG9yLnNpemUoKSk7CisgICAgICAgIGRhdGEud3JpdGUodmVjdG9yLmFycmF5KCksIHZlY3Rvci5zaXplKCkpOworICAgIH0KKwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEJwQ3J5cHRvKTsKIH07CiAKQEAgLTE2Nyw2ICsxOTEsMTcgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAordm9pZCBCbkNyeXB0bzo6cmVhZFZlY3Rvcihjb25zdCBQYXJjZWwgJmRhdGEsIFZlY3Rvcjx1aW50OF90PiAmdmVjdG9yKSBjb25zdCB7CisgICAgdWludDMyX3Qgc2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgdmVjdG9yLmluc2VydEF0KChzaXplX3QpMCwgc2l6ZSk7CisgICAgZGF0YS5yZWFkKHZlY3Rvci5lZGl0QXJyYXkoKSwgc2l6ZSk7Cit9CisKK3ZvaWQgQm5DcnlwdG86OndyaXRlVmVjdG9yKFBhcmNlbCAqcmVwbHksIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmdmVjdG9yKSBjb25zdCB7CisgICAgcmVwbHktPndyaXRlSW50MzIodmVjdG9yLnNpemUoKSk7CisgICAgcmVwbHktPndyaXRlKHZlY3Rvci5hcnJheSgpLCB2ZWN0b3Iuc2l6ZSgpKTsKK30KKwogc3RhdHVzX3QgQm5DcnlwdG86Om9uVHJhbnNhY3QoCiAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsICZkYXRhLCBQYXJjZWwgKnJlcGx5LCB1aW50MzJfdCBmbGFncykgewogICAgIHN3aXRjaCAoY29kZSkgewpAQCAtMjQ1LDkgKzI4MCw5IEBACiAgICAgICAgICAgICBkYXRhLnJlYWQoaXYsIHNpemVvZihpdikpOwogCiAgICAgICAgICAgICBzaXplX3QgdG90YWxTaXplID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHZvaWQgKnNyY0RhdGEgPSBtYWxsb2ModG90YWxTaXplKTsKLSAgICAgICAgICAgIG1lbXNldChzcmNEYXRhLCAwLCB0b3RhbFNpemUpOwotICAgICAgICAgICAgZGF0YS5yZWFkKHNyY0RhdGEsIHRvdGFsU2l6ZSk7CisgICAgICAgICAgICBzcDxJTWVtb3J5PiBzaGFyZWRCdWZmZXIgPQorICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZW1vcnk+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0ID0gZGF0YS5yZWFkSW50MzIoKTsKIAogICAgICAgICAgICAgaW50MzJfdCBudW1TdWJTYW1wbGVzID0gZGF0YS5yZWFkSW50MzIoKTsKIApAQCAtMjYyLDggKzI5Nyw3IEBACiAgICAgICAgICAgICBpZiAoc2VjdXJlKSB7CiAgICAgICAgICAgICAgICAgc2VjdXJlQnVmZmVySWQgPSByZWludGVycHJldF9jYXN0PHZvaWQgKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90PihkYXRhLnJlYWRJbnQ2NCgpKSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRzdFB0ciA9IG1hbGxvYyh0b3RhbFNpemUpOwotICAgICAgICAgICAgICAgIG1lbXNldChkc3RQdHIsIDAsIHRvdGFsU2l6ZSk7CisgICAgICAgICAgICAgICAgZHN0UHRyID0gY2FsbG9jKDEsIHRvdGFsU2l6ZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEFTdHJpbmcgZXJyb3JEZXRhaWxNc2c7CkBAIC0yODcsMTMgKzMyMSwxNyBAQAogCiAgICAgICAgICAgICBpZiAob3ZlcmZsb3cgfHwgc3VtU3Vic2FtcGxlU2l6ZXMgIT0gdG90YWxTaXplKSB7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodG90YWxTaXplID4gc2hhcmVkQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAtRUlOVkFMOworICAgICAgICAgICAgfSBlbHNlIGlmICgoc2l6ZV90KW9mZnNldCA+IHNoYXJlZEJ1ZmZlci0+c2l6ZSgpIC0gdG90YWxTaXplKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gLUVJTlZBTDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZGVjcnlwdCgKICAgICAgICAgICAgICAgICAgICAgc2VjdXJlLAogICAgICAgICAgICAgICAgICAgICBrZXksCiAgICAgICAgICAgICAgICAgICAgIGl2LAogICAgICAgICAgICAgICAgICAgICBtb2RlLAotICAgICAgICAgICAgICAgICAgICBzcmNEYXRhLAorICAgICAgICAgICAgICAgICAgICBzaGFyZWRCdWZmZXIsIG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywgbnVtU3ViU2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgc2VjdXJlID8gc2VjdXJlQnVmZmVySWQgOiBkc3RQdHIsCiAgICAgICAgICAgICAgICAgICAgICZlcnJvckRldGFpbE1zZyk7CkBAIC0zMDEsOCArMzM5LDcgQEAKIAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKIAotICAgICAgICAgICAgaWYgKHJlc3VsdCA+PSBFUlJPUl9EUk1fVkVORE9SX01JTgotICAgICAgICAgICAgICAgICYmIHJlc3VsdCA8PSBFUlJPUl9EUk1fVkVORE9SX01BWCkgeworICAgICAgICAgICAgaWYgKGlzQ3J5cHRvRXJyb3IocmVzdWx0KSkgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUNTdHJpbmcoZXJyb3JEZXRhaWxNc2cuY19zdHIoKSk7CiAgICAgICAgICAgICB9CiAKQEAgLTMxOCw5ICszNTUsNiBAQAogICAgICAgICAgICAgZGVsZXRlW10gc3ViU2FtcGxlczsKICAgICAgICAgICAgIHN1YlNhbXBsZXMgPSBOVUxMOwogCi0gICAgICAgICAgICBmcmVlKHNyY0RhdGEpOwotICAgICAgICAgICAgc3JjRGF0YSA9IE5VTEw7Ci0KICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogCkBAIC0zMzUsNiArMzY5LDE1IEBACiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIFNFVF9NRURJQURSTV9TRVNTSU9OOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDsKKyAgICAgICAgICAgIHJlYWRWZWN0b3IoZGF0YSwgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldE1lZGlhRHJtU2Vzc2lvbihzZXNzaW9uSWQpKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lEYXRhU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lEYXRhU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmQxZDY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvSURhdGFTb3VyY2UuY3BwCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIklEYXRhU291cmNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8bWVkaWEvSURhdGFTb3VyY2UuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSB7CisgICAgR0VUX0lNRU1PUlkgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAorICAgIFJFQURfQVQsCisgICAgR0VUX1NJWkUsCisgICAgQ0xPU0UsCit9OworCitzdHJ1Y3QgQnBEYXRhU291cmNlIDogcHVibGljIEJwSW50ZXJmYWNlPElEYXRhU291cmNlPiB7CisgICAgQnBEYXRhU291cmNlKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKSA6IEJwSW50ZXJmYWNlPElEYXRhU291cmNlPihpbXBsKSB7fQorCisgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRJTWVtb3J5KCkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRGF0YVNvdXJjZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9JTUVNT1JZLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSByZXBseS5yZWFkU3Ryb25nQmluZGVyKCk7CisgICAgICAgIHJldHVybiBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihiaW5kZXIpOworICAgIH0KKworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEYXRhU291cmNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50NjQob2Zmc2V0KTsKKyAgICAgICAgZGF0YS53cml0ZUludDY0KHNpemUpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVBRF9BVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQ2NCgpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90KiBzaXplKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEYXRhU291cmNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1NJWkUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAqc2l6ZSA9IHJlcGx5LnJlYWRJbnQ2NCgpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURhdGFTb3VyY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDTE9TRSwgZGF0YSwgJnJlcGx5KTsKKyAgICB9Cit9OworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoRGF0YVNvdXJjZSwgImFuZHJvaWQubWVkaWEuSURhdGFTb3VyY2UiKTsKKworc3RhdHVzX3QgQm5EYXRhU291cmNlOjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBzd2l0Y2ggKGNvZGUpIHsKKyAgICAgICAgY2FzZSBHRVRfSU1FTU9SWTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEYXRhU291cmNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoZ2V0SU1lbW9yeSgpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgUkVBRF9BVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEYXRhU291cmNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBvZmY2NF90IG9mZnNldCA9IChvZmY2NF90KSBkYXRhLnJlYWRJbnQ2NCgpOworICAgICAgICAgICAgc2l6ZV90IHNpemUgPSAoc2l6ZV90KSBkYXRhLnJlYWRJbnQ2NCgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQocmVhZEF0KG9mZnNldCwgc2l6ZSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEdFVF9TSVpFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURhdGFTb3VyY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIG9mZjY0X3Qgc2l6ZTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGdldFNpemUoJnNpemUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDY0KHNpemUpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIENMT1NFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURhdGFTb3VyY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lEcm0uY3BwIGIvbWVkaWEvbGlibWVkaWEvSURybS5jcHAKaW5kZXggYjA4ZmE4Mi4uNmY2NTMwYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSURybS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSURybS5jcHAKQEAgLTY3LDcgKzY3LDEwIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChJTklUX0NIRUNLLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoSU5JVF9DSEVDSywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CkBAIC03Nyw3ICs4MCwxMSBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZSh1dWlkLCAxNik7CiAgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KG1pbWVUeXBlKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KElTX0NSWVBUT19TVVBQT1JURUQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChJU19DUllQVE9fU1VQUE9SVEVELCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQ6IGJpbmRlciBjYWxsIGZhaWxlZDogJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpICE9IDA7CiAgICAgfQpAQCAtODcsNyArOTQsMTAgQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGUodXVpZCwgMTYpOwogCi0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChDUkVBVEVfUExVR0lOLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX1BMVUdJTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CkBAIC05NSw3ICsxMDUsMTAgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGRlc3Ryb3lQbHVnaW4oKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChERVNUUk9ZX1BMVUdJTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KERFU1RST1lfUExVR0lOLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTEwNCw3ICsxMTcsMTAgQEAKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKIAotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9TRVNTSU9OLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9TRVNTSU9OLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAgICAgICAgIHJlYWRWZWN0b3IocmVwbHksIHNlc3Npb25JZCk7CiAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwpAQCAtMTE1LDcgKzEzMSwxMCBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKIAogICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCBzZXNzaW9uSWQpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ0xPU0VfU0VTU0lPTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KENMT1NFX1NFU1NJT04sIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQpAQCAtMTI1LDcgKzE0NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpbml0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZtaW1lVHlwZSwgRHJtUGx1Z2luOjpLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gY29uc3QgJm9wdGlvbmFsUGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnJlcXVlc3QsIFN0cmluZzggJmRlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnJlcXVlc3QsIFN0cmluZzggJmRlZmF1bHRVcmwsCisgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSAqa2V5UmVxdWVzdFR5cGUpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKIApAQCAtMTM5LDEwICsxNTksMTUgQEAKICAgICAgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KG9wdGlvbmFsUGFyYW1ldGVycy5rZXlBdChpKSk7CiAgICAgICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChvcHRpb25hbFBhcmFtZXRlcnMudmFsdWVBdChpKSk7CiAgICAgICAgIH0KLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9LRVlfUkVRVUVTVCwgZGF0YSwgJnJlcGx5KTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0tFWV9SRVFVRVNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAKICAgICAgICAgcmVhZFZlY3RvcihyZXBseSwgcmVxdWVzdCk7CiAgICAgICAgIGRlZmF1bHRVcmwgPSByZXBseS5yZWFkU3RyaW5nOCgpOworICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBzdGF0aWNfY2FzdDxEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlPihyZXBseS5yZWFkSW50MzIoKSk7CiAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTE1NCw3ICsxNzksMTIgQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIHNlc3Npb25JZCk7CiAgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIHJlc3BvbnNlKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFBST1ZJREVfS0VZX1JFU1BPTlNFLCBkYXRhLCAmcmVwbHkpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChQUk9WSURFX0tFWV9SRVNQT05TRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCiAgICAgICAgIHJlYWRWZWN0b3IocmVwbHksIGtleVNldElkKTsKIAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CkBAIC0xNjUsNyArMTk1LDEwIEBACiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogCiAgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIGtleVNldElkKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTU9WRV9LRVlTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX0tFWVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQpAQCAtMTc3LDcgKzIxMCwxMCBAQAogCiAgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIHNlc3Npb25JZCk7CiAgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIGtleVNldElkKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFU1RPUkVfS0VZUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFU1RPUkVfS0VZUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CkBAIC0xODgsNyArMjI0LDEwIEBACiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogCiAgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIHNlc3Npb25JZCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChRVUVSWV9LRVlfU1RBVFVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUVVFUllfS0VZX1NUQVRVUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQogCiAgICAgICAgIGluZm9NYXAuY2xlYXIoKTsKICAgICAgICAgc2l6ZV90IGNvdW50ID0gcmVwbHkucmVhZEludDMyKCk7CkBAIC0yMDksNyArMjQ4LDEwIEBACiAKICAgICAgICAgZGF0YS53cml0ZVN0cmluZzgoY2VydFR5cGUpOwogICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChjZXJ0QXV0aG9yaXR5KTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QUk9WSVNJT05fUkVRVUVTVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QUk9WSVNJT05fUkVRVUVTVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQogCiAgICAgICAgIHJlYWRWZWN0b3IocmVwbHksIHJlcXVlc3QpOwogICAgICAgICBkZWZhdWx0VXJsID0gcmVwbHkucmVhZFN0cmluZzgoKTsKQEAgLTIyNCw3ICsyNjYsMTAgQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAKICAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwgcmVzcG9uc2UpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUFJPVklERV9QUk9WSVNJT05fUkVTUE9OU0UsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChQUk9WSURFX1BST1ZJU0lPTl9SRVNQT05TRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQogCiAgICAgICAgIHJlYWRWZWN0b3IocmVwbHksIGNlcnRpZmljYXRlKTsKICAgICAgICAgcmVhZFZlY3RvcihyZXBseSwgd3JhcHBlZEtleSk7CkBAIC0yMzYsNyArMjgxLDEwIEBACiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFVOUFJPVklTSU9OX0RFVklDRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFVOUFJPVklTSU9OX0RFVklDRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CkBAIC0yNDUsNyArMjkzLDEwIEBACiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9TRUNVUkVfU1RPUFMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU0VDVVJFX1NUT1BTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAKICAgICAgICAgc2VjdXJlU3RvcHMuY2xlYXIoKTsKICAgICAgICAgdWludDMyX3QgY291bnQgPSByZXBseS5yZWFkSW50MzIoKTsKQEAgLTI2Miw3ICszMTMsMTAgQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAKICAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwgc3NpZCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU0VDVVJFX1NUT1AsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU0VDVVJFX1NUT1AsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KIAogICAgICAgICByZWFkVmVjdG9yKHJlcGx5LCBzZWN1cmVTdG9wKTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwpAQCAtMjczLDcgKzMyNywxMCBAQAogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKIAogICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCBzc1JlbGVhc2UpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9TRUNVUkVfU1RPUFMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRUxFQVNFX1NFQ1VSRV9TVE9QUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CkBAIC0yODIsNyArMzM5LDEwIEBACiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfQUxMX1NFQ1VSRV9TVE9QUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTEVBU0VfQUxMX1NFQ1VSRV9TVE9QUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CkBAIC0yOTIsNyArMzUyLDEwIEBACiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogCiAgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KG5hbWUpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1BST1BFUlRZX1NUUklORywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QUk9QRVJUWV9TVFJJTkcsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KIAogICAgICAgICB2YWx1ZSA9IHJlcGx5LnJlYWRTdHJpbmc4KCk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKQEAgLTMwMyw3ICszNjYsMTAgQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAKICAgICAgICAgZGF0YS53cml0ZVN0cmluZzgobmFtZSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfUFJPUEVSVFlfQllURV9BUlJBWSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QUk9QRVJUWV9CWVRFX0FSUkFZLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAKICAgICAgICAgcmVhZFZlY3RvcihyZXBseSwgdmFsdWUpOwogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CkBAIC0zMTUsNyArMzgxLDEwIEBACiAKICAgICAgICAgZGF0YS53cml0ZVN0cmluZzgobmFtZSk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KHZhbHVlKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9QUk9QRVJUWV9TVFJJTkcsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfUFJPUEVSVFlfU1RSSU5HLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTMyNyw3ICszOTYsMTAgQEAKIAogICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChuYW1lKTsKICAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwgdmFsdWUpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1BST1BFUlRZX0JZVEVfQVJSQVksIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfUFJPUEVSVFlfQllURV9BUlJBWSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CkBAIC0zNDAsNyArNDEyLDEwIEBACiAKICAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwgc2Vzc2lvbklkKTsKICAgICAgICAgZGF0YS53cml0ZVN0cmluZzgoYWxnb3JpdGhtKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9DSVBIRVJfQUxHT1JJVEhNLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0NJUEhFUl9BTEdPUklUSE0sIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIApAQCAtMzUxLDcgKzQyNiwxMCBAQAogCiAgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIHNlc3Npb25JZCk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KGFsZ29yaXRobSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTUFDX0FMR09SSVRITSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9NQUNfQUxHT1JJVEhNLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKQEAgLTM2OCw3ICs0NDYsMTAgQEAKICAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwgaW5wdXQpOwogICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCBpdik7CiAKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEVOQ1JZUFQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChFTkNSWVBULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAgICAgICAgIHJlYWRWZWN0b3IocmVwbHksIG91dHB1dCk7CiAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwpAQCAtMzg3LDcgKzQ2OCwxMCBAQAogICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCBpbnB1dCk7CiAgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIGl2KTsKIAotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoREVDUllQVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KERFQ1JZUFQsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KICAgICAgICAgcmVhZFZlY3RvcihyZXBseSwgb3V0cHV0KTsKIAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CkBAIC00MDQsNyArNDg4LDEwIEBACiAgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIGtleUlkKTsKICAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwgbWVzc2FnZSk7CiAKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNJR04sIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTSUdOLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAgICAgICAgIHJlYWRWZWN0b3IocmVwbHksIHNpZ25hdHVyZSk7CiAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwpAQCAtNDIzLDcgKzUxMCwxMCBAQAogICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCBtZXNzYWdlKTsKICAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwgc2lnbmF0dXJlKTsKIAotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoVkVSSUZZLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoVkVSSUZZLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAgICAgICAgIG1hdGNoID0gKGJvb2wpcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CkBAIC00NDEsNyArNTMxLDEwIEBACiAgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIG1lc3NhZ2UpOwogICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCB3cmFwcGVkS2V5KTsKIAotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0lHTl9SU0EsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTSUdOX1JTQSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQogICAgICAgICByZWFkVmVjdG9yKHJlcGx5LCBzaWduYXR1cmUpOwogCiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKQEAgLTQ1MSw3ICs1NDQsMTAgQEAKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihsaXN0ZW5lcikpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0xJU1RFTkVSLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0xJU1RFTkVSLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKQEAgLTU2MiwxMyArNjU4LDE1IEBACiAKICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiByZXF1ZXN0OwogICAgICAgICAgICAgU3RyaW5nOCBkZWZhdWx0VXJsOworICAgICAgICAgICAgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSBrZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1Vua25vd247CiAKLSAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGdldEtleVJlcXVlc3Qoc2Vzc2lvbklkLCBpbml0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZVR5cGUsIGtleVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsUGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCwgZGVmYXVsdFVybCk7CisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXRLZXlSZXF1ZXN0KHNlc3Npb25JZCwgaW5pdERhdGEsIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICBrZXlUeXBlLCBvcHRpb25hbFBhcmFtZXRlcnMsIHJlcXVlc3QsIGRlZmF1bHRVcmwsCisgICAgICAgICAgICAgICAgICAgICZrZXlSZXF1ZXN0VHlwZSk7CisKICAgICAgICAgICAgIHdyaXRlVmVjdG9yKHJlcGx5LCByZXF1ZXN0KTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzgoZGVmYXVsdFVybCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihrZXlSZXF1ZXN0VHlwZSkpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQpAQCAtODE0LDcgKzkxMiw3IEBACiAgICAgICAgICAgICByZWFkVmVjdG9yKGRhdGEsIGtleUlkKTsKICAgICAgICAgICAgIHJlYWRWZWN0b3IoZGF0YSwgbWVzc2FnZSk7CiAgICAgICAgICAgICByZWFkVmVjdG9yKGRhdGEsIHNpZ25hdHVyZSk7Ci0gICAgICAgICAgICBib29sIG1hdGNoOworICAgICAgICAgICAgYm9vbCBtYXRjaCA9IGZhbHNlOwogICAgICAgICAgICAgdWludDMyX3QgcmVzdWx0ID0gdmVyaWZ5KHNlc3Npb25JZCwga2V5SWQsIG1lc3NhZ2UsIHNpZ25hdHVyZSwgbWF0Y2gpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobWF0Y2gpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lEcm1DbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWEvSURybUNsaWVudC5jcHAKaW5kZXggZjUwNzE1ZS4uNDkwYzZlZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSURybUNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSURybUNsaWVudC5jcHAKQEAgLTc4LDQgKzc4LDQgQEAKICAgICB9CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JRWZmZWN0LmNwcCBiL21lZGlhL2xpYm1lZGlhL0lFZmZlY3QuY3BwCmluZGV4IDJmNmE5MWUuLmZhZjU3OTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lFZmZlY3QuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lFZmZlY3QuY3BwCkBAIC0yMTQsNCArMjE0LDQgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSUVmZmVjdENsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JRWZmZWN0Q2xpZW50LmNwcAppbmRleCBhZWY0MzcxLi4xMzIyZTcyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JRWZmZWN0Q2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JRWZmZWN0Q2xpZW50LmNwcApAQCAtMTQxLDQgKzE0MSw0IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lIRENQLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lIRENQLmNwcAppbmRleCA3OTk0NGVlLi5mM2E4OTAyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JSERDUC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSUhEQ1AuY3BwCkBAIC0yODQsMTEgKzI4NCwxNyBAQAogICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICB1aW50MzJfdCBzdHJlYW1DVFIgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgdm9pZCAqb3V0RGF0YSA9IG1hbGxvYyhzaXplKTsKKyAgICAgICAgICAgIHZvaWQgKm91dERhdGEgPSBOVUxMOwogICAgICAgICAgICAgdWludDY0X3QgaW5wdXRDVFI7CiAKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGVuY3J5cHROYXRpdmUoZ3JhcGhpY0J1ZmZlciwgb2Zmc2V0LCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1DVFIsICZpbnB1dENUUiwgb3V0RGF0YSk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBFUlJPUl9PVVRfT0ZfUkFOR0U7CisKKyAgICAgICAgICAgIG91dERhdGEgPSBtYWxsb2Moc2l6ZSk7CisKKyAgICAgICAgICAgIGlmIChvdXREYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBlbmNyeXB0TmF0aXZlKGdyYXBoaWNCdWZmZXIsIG9mZnNldCwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUNUUiwgJmlucHV0Q1RSLCBvdXREYXRhKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhQ29kZWNMaXN0LmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUNvZGVjTGlzdC5jcHAKaW5kZXggYmY3YzVjYS4uZTJkZjEwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhQ29kZWNMaXN0LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFDb2RlY0xpc3QuY3BwCkBAIC0zMCw2ICszMCw3IEBACiAgICAgQ1JFQVRFID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKICAgICBDT1VOVF9DT0RFQ1MsCiAgICAgR0VUX0NPREVDX0lORk8sCisgICAgR0VUX0dMT0JBTF9TRVRUSU5HUywKICAgICBGSU5EX0NPREVDX0JZX1RZUEUsCiAgICAgRklORF9DT0RFQ19CWV9OQU1FLAogfTsKQEAgLTY0LDYgKzY1LDE5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICB2aXJ0dWFsIGNvbnN0IHNwPEFNZXNzYWdlPiBnZXRHbG9iYWxTZXR0aW5ncygpIGNvbnN0CisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFDb2RlY0xpc3Q6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfR0xPQkFMX1NFVFRJTkdTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgcmV0dXJuIEFNZXNzYWdlOjpGcm9tUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCiAgICAgdmlydHVhbCBzc2l6ZV90IGZpbmRDb2RlY0J5VHlwZSgKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUsIGJvb2wgZW5jb2Rlciwgc2l6ZV90IHN0YXJ0SW5kZXggPSAwKSBjb25zdAogICAgIHsKQEAgLTEyNSw2ICsxMzksMjAgQEAKICAgICAgICAgfQogICAgICAgICBicmVhazsKIAorICAgICAgICBjYXNlIEdFVF9HTE9CQUxfU0VUVElOR1M6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFDb2RlY0xpc3QsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiBpbmZvID0gZ2V0R2xvYmFsU2V0dGluZ3MoKTsKKyAgICAgICAgICAgIGlmIChpbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihPSyk7CisgICAgICAgICAgICAgICAgaW5mby0+d3JpdGVUb1BhcmNlbChyZXBseSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKC1FUkFOR0UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCiAgICAgICAgIGNhc2UgRklORF9DT0RFQ19CWV9UWVBFOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhQ29kZWNMaXN0LCBkYXRhLCByZXBseSk7CkBAIC0xNjAsNCArMTg4LDQgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRGVhdGhOb3RpZmllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFEZWF0aE5vdGlmaWVyLmNwcAppbmRleCBmNWMzNDBhLi5jNDNlZjY2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFEZWF0aE5vdGlmaWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFEZWF0aE5vdGlmaWVyLmNwcApAQCAtMTA4LDQgKzEwOCw0IEBACiAgICAgfQogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uY3BwCmluZGV4IGE1YTM3MTQuLjBkZGEwYmU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uY3BwCkBAIC03MCw3ICs3MCw3IEBACiAgICAgICAgIGludDMyX3QgZXhjZXB0aW9uQ29kZSA9IHJlcGx5LnJlYWRFeGNlcHRpb25Db2RlKCk7CiAKICAgICAgICAgaWYgKGV4Y2VwdGlvbkNvZGUpIHsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gcmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpOwpAQCAtMTA3LDcgKzEwNywxNCBAQAogICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgIH0KIAotICAgICAgICBzaXplX3QgbGVuID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGludDMyX3QgbGVuT3JFcnJvckNvZGUgPSByZXBseS5yZWFkSW50MzIoKTsKKworICAgICAgICAvLyBOZWdhdGl2ZSB2YWx1ZXMgYXJlIGVycm9yIGNvZGVzCisgICAgICAgIGlmIChsZW5PckVycm9yQ29kZSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBsZW5PckVycm9yQ29kZTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBsZW4gPSBsZW5PckVycm9yQ29kZTsKIAogICAgICAgICBpZiAobGVuID4gc2l6ZSkgewogICAgICAgICAgICAgQUxPR0UoInJlcXVlc3RlZCAlenUsIGdvdCAlenUiLCBzaXplLCBsZW4pOwpAQCAtMTg2LDUgKzE5Myw0IEBACiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoCiAgICAgICAgIE1lZGlhSFRUUENvbm5lY3Rpb24sICJhbmRyb2lkLm1lZGlhLklNZWRpYUhUVFBDb25uZWN0aW9uIik7CiAKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmNwcAppbmRleCAxMjYwNTgyLi4wYzE2YTJiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuY3BwCkBAIC00NCw2ICs0NCw3IEBACiAgICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gbWFrZSBIVFRQIGNvbm5lY3Rpb24gKGVyciA9ICVkKSIsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCkBAIC01NCw1ICs1NSw0IEBACiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoCiAgICAgICAgIE1lZGlhSFRUUFNlcnZpY2UsICJhbmRyb2lkLm1lZGlhLklNZWRpYUhUVFBTZXJ2aWNlIik7CiAKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUxvZ1NlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhTG9nU2VydmljZS5jcHAKaW5kZXggYTRhZjdiNy4uMTUzNjMzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhTG9nU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhTG9nU2VydmljZS5jcHAKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihzaGFyZWQpKTsKICAgICAgICAgZGF0YS53cml0ZUludDY0KChpbnQ2NF90KSBzaXplKTsKICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcobmFtZSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRUdJU1RFUl9XUklURVIsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyBfX3VudXNlZCA9IHJlbW90ZSgpLT50cmFuc2FjdChSRUdJU1RFUl9XUklURVIsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIC8vIEZJWE1FIGlnbm9yZXMgc3RhdHVzCiAgICAgfQogCkBAIC01Myw3ICs1Myw3IEBACiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYUxvZ1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoc2hhcmVkKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChVTlJFR0lTVEVSX1dSSVRFUiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzIF9fdW51c2VkID0gcmVtb3RlKCktPnRyYW5zYWN0KFVOUkVHSVNURVJfV1JJVEVSLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICAvLyBGSVhNRSBpZ25vcmVzIHN0YXR1cwogICAgIH0KIApAQCAtOTEsNCArOTEsNCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAKaW5kZXggYWEyNjY1YS4uOTc2NWYwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPG1lZGlhL0lEYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KQEAgLTY1LDYgKzY2LDcgQEAKICAgICBESVNDT05ORUNUID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKICAgICBTRVRfREFUQV9TT1VSQ0VfVVJMLAogICAgIFNFVF9EQVRBX1NPVVJDRV9GRCwKKyAgICBTRVRfREFUQV9TT1VSQ0VfQ0FMTEJBQ0ssCiAgICAgR0VUX0ZSQU1FX0FUX1RJTUUsCiAgICAgRVhUUkFDVF9BTEJVTV9BUlQsCiAgICAgRVhUUkFDVF9NRVRBREFUQSwKQEAgLTEyNSw2ICsxMjcsMTUgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SURhdGFTb3VyY2U+JiBzb3VyY2UpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihzb3VyY2UpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9EQVRBX1NPVVJDRV9DQUxMQkFDSywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKwogICAgIHNwPElNZW1vcnk+IGdldEZyYW1lQXRUaW1lKGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uKQogICAgIHsKICAgICAgICAgQUxPR1YoImdldFRpbWVBdFRpbWU6IHRpbWUoJSIgUFJJZDY0ICIgdXMpIGFuZCBvcHRpb24oJWQpIiwgdGltZVVzLCBvcHRpb24pOwpAQCAtMjM1LDYgKzI0NiwxMyBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0RGF0YVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfREFUQV9TT1VSQ0VfQ0FMTEJBQ0s6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFNZXRhZGF0YVJldHJpZXZlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8SURhdGFTb3VyY2U+IHNvdXJjZSA9CisgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SURhdGFTb3VyY2U+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldERhdGFTb3VyY2Uoc291cmNlKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgR0VUX0ZSQU1FX0FUX1RJTUU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFNZXRhZGF0YVJldHJpZXZlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMgPSBkYXRhLnJlYWRJbnQ2NCgpOwpAQCAtMjk3LDQgKzMxNSw0IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCmluZGV4IGMxYjkwMjUuLjk0MmFlYzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcApAQCAtMjEsNiArMjEsMTAgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KIAorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSA8bWVkaWEvQVZTeW5jU2V0dGluZ3MuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lEYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JU3RyZWFtU291cmNlLmg+CkBAIC0zNSwxMCArMzksMTUgQEAKICAgICBTRVRfREFUQV9TT1VSQ0VfVVJMLAogICAgIFNFVF9EQVRBX1NPVVJDRV9GRCwKICAgICBTRVRfREFUQV9TT1VSQ0VfU1RSRUFNLAorICAgIFNFVF9EQVRBX1NPVVJDRV9DQUxMQkFDSywKICAgICBQUkVQQVJFX0FTWU5DLAogICAgIFNUQVJULAogICAgIFNUT1AsCiAgICAgSVNfUExBWUlORywKKyAgICBTRVRfUExBWUJBQ0tfU0VUVElOR1MsCisgICAgR0VUX1BMQVlCQUNLX1NFVFRJTkdTLAorICAgIFNFVF9TWU5DX1NFVFRJTkdTLAorICAgIEdFVF9TWU5DX1NFVFRJTkdTLAogICAgIFBBVVNFLAogICAgIFNFRUtfVE8sCiAgICAgR0VUX0NVUlJFTlRfUE9TSVRJT04sCkBAIC0xMjAsNiArMTI5LDE0IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPElEYXRhU291cmNlPiAmc291cmNlKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihzb3VyY2UpKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9EQVRBX1NPVVJDRV9DQUxMQkFDSywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKwogICAgIC8vIHBhc3MgdGhlIGJ1ZmZlcmVkIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgdG8gdGhlIG1lZGlhIHBsYXllciBzZXJ2aWNlCiAgICAgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlVGV4dHVyZShjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpCiAgICAgewpAQCAtMTY0LDYgKzE4MSw2MyBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUZsb2F0KHJhdGUubVNwZWVkKTsKKyAgICAgICAgZGF0YS53cml0ZUZsb2F0KHJhdGUubVBpdGNoKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KXJhdGUubUZhbGxiYWNrTW9kZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClyYXRlLm1TdHJldGNoTW9kZSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfUExBWUJBQ0tfU0VUVElOR1MsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlKiByYXRlIC8qIG5vbm51bGwgKi8pCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfUExBWUJBQ0tfU0VUVElOR1MsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAqcmF0ZSA9IEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVDsKKyAgICAgICAgICAgIHJhdGUtPm1TcGVlZCA9IHJlcGx5LnJlYWRGbG9hdCgpOworICAgICAgICAgICAgcmF0ZS0+bVBpdGNoID0gcmVwbHkucmVhZEZsb2F0KCk7CisgICAgICAgICAgICByYXRlLT5tRmFsbGJhY2tNb2RlID0gKEF1ZGlvVGltZXN0cmV0Y2hGYWxsYmFja01vZGUpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICByYXRlLT5tU3RyZXRjaE1vZGUgPSAoQXVkaW9UaW1lc3RyZXRjaFN0cmV0Y2hNb2RlKXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzJiBzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClzeW5jLm1Tb3VyY2UpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpc3luYy5tQXVkaW9BZGp1c3RNb2RlKTsKKyAgICAgICAgZGF0YS53cml0ZUZsb2F0KHN5bmMubVRvbGVyYW5jZSk7CisgICAgICAgIGRhdGEud3JpdGVGbG9hdCh2aWRlb0Zwc0hpbnQpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1NZTkNfU0VUVElOR1MsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBnZXRTeW5jU2V0dGluZ3MoQVZTeW5jU2V0dGluZ3MqIHN5bmMgLyogbm9ubnVsbCAqLywgZmxvYXQqIHZpZGVvRnBzIC8qIG5vbm51bGwgKi8pCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFQbGF5ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU1lOQ19TRVRUSU5HUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIEFWU3luY1NldHRpbmdzIHNldHRpbmdzOworICAgICAgICAgICAgc2V0dGluZ3MubVNvdXJjZSA9IChBVlN5bmNTb3VyY2UpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICBzZXR0aW5ncy5tQXVkaW9BZGp1c3RNb2RlID0gKEFWU3luY0F1ZGlvQWRqdXN0TW9kZSlyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHNldHRpbmdzLm1Ub2xlcmFuY2UgPSByZXBseS5yZWFkRmxvYXQoKTsKKyAgICAgICAgICAgICpzeW5jID0gc2V0dGluZ3M7CisgICAgICAgICAgICAqdmlkZW9GcHMgPSByZXBseS5yZWFkRmxvYXQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKwogICAgIHN0YXR1c190IHBhdXNlKCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTM5Niw2ICs0NzAsMTMgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldERhdGFTb3VyY2Uoc291cmNlKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KKyAgICAgICAgY2FzZSBTRVRfREFUQV9TT1VSQ0VfQ0FMTEJBQ0s6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNwPElEYXRhU291cmNlPiBzb3VyY2UgPQorICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElEYXRhU291cmNlPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXREYXRhU291cmNlKHNvdXJjZSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CiAgICAgICAgIGNhc2UgU0VUX1ZJREVPX1NVUkZBQ0VURVhUVVJFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBidWZmZXJQcm9kdWNlciA9CkBAIC00MjYsNiArNTA3LDUzIEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNFVF9QTEFZQkFDS19TRVRUSU5HUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgcmF0ZSA9IEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVDsKKyAgICAgICAgICAgIHJhdGUubVNwZWVkID0gZGF0YS5yZWFkRmxvYXQoKTsKKyAgICAgICAgICAgIHJhdGUubVBpdGNoID0gZGF0YS5yZWFkRmxvYXQoKTsKKyAgICAgICAgICAgIHJhdGUubUZhbGxiYWNrTW9kZSA9IChBdWRpb1RpbWVzdHJldGNoRmFsbGJhY2tNb2RlKWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICByYXRlLm1TdHJldGNoTW9kZSA9IChBdWRpb1RpbWVzdHJldGNoU3RyZXRjaE1vZGUpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldFBsYXliYWNrU2V0dGluZ3MocmF0ZSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEdFVF9QTEFZQkFDS19TRVRUSU5HUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVBsYXllciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgcmF0ZSA9IEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVDsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGdldFBsYXliYWNrU2V0dGluZ3MoJnJhdGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVGbG9hdChyYXRlLm1TcGVlZCk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlRmxvYXQocmF0ZS5tUGl0Y2gpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KXJhdGUubUZhbGxiYWNrTW9kZSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3QpcmF0ZS5tU3RyZXRjaE1vZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNFVF9TWU5DX1NFVFRJTkdTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBBVlN5bmNTZXR0aW5ncyBzeW5jOworICAgICAgICAgICAgc3luYy5tU291cmNlID0gKEFWU3luY1NvdXJjZSlkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc3luYy5tQXVkaW9BZGp1c3RNb2RlID0gKEFWU3luY0F1ZGlvQWRqdXN0TW9kZSlkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc3luYy5tVG9sZXJhbmNlID0gZGF0YS5yZWFkRmxvYXQoKTsKKyAgICAgICAgICAgIGZsb2F0IHZpZGVvRnBzSGludCA9IGRhdGEucmVhZEZsb2F0KCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRTeW5jU2V0dGluZ3Moc3luYywgdmlkZW9GcHNIaW50KSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX1NZTkNfU0VUVElOR1M6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIEFWU3luY1NldHRpbmdzIHN5bmM7CisgICAgICAgICAgICBmbG9hdCB2aWRlb0ZwczsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGdldFN5bmNTZXR0aW5ncygmc3luYywgJnZpZGVvRnBzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3Qpc3luYy5tU291cmNlKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigoaW50MzJfdClzeW5jLm1BdWRpb0FkanVzdE1vZGUpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUZsb2F0KHN5bmMubVRvbGVyYW5jZSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlRmxvYXQodmlkZW9GcHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFBBVVNFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihwYXVzZSgpKTsKQEAgLTU2MSw0ICs2ODksNCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJDbGllbnQuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyQ2xpZW50LmNwcAppbmRleCBhNjcwYzk2Li5kNjA4Mzg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllckNsaWVudC5jcHAKQEAgLTc1LDQgKzc1LDQgQEAKICAgICB9CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IGZlZWEyNjcuLjA1Zjg2NzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC03OCwxMCArNzgsMTEgQEAKICAgICAgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElNZWRpYVBsYXllcj4ocmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHNwPElNZWRpYVJlY29yZGVyPiBjcmVhdGVNZWRpYVJlY29yZGVyKCkKKyAgICB2aXJ0dWFsIHNwPElNZWRpYVJlY29yZGVyPiBjcmVhdGVNZWRpYVJlY29yZGVyKGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KG9wUGFja2FnZU5hbWUpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ1JFQVRFX01FRElBX1JFQ09SREVSLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhUmVjb3JkZXI+KHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgfQpAQCAtMTI4LDExICsxMjksMTIgQEAKICAgICAgICAgcmV0dXJuIHJlbW90ZSgpLT50cmFuc2FjdChQVUxMX0JBVFRFUllfREFUQSwgZGF0YSwgcmVwbHkpOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3A8SVJlbW90ZURpc3BsYXk+IGxpc3RlbkZvclJlbW90ZURpc3BsYXkoY29uc3Qgc3A8SVJlbW90ZURpc3BsYXlDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBpZmFjZSkKKyAgICB2aXJ0dWFsIHNwPElSZW1vdGVEaXNwbGF5PiBsaXN0ZW5Gb3JSZW1vdGVEaXNwbGF5KGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgY29uc3Qgc3A8SVJlbW90ZURpc3BsYXlDbGllbnQ+JiBjbGllbnQsIGNvbnN0IFN0cmluZzgmIGlmYWNlKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KG9wUGFja2FnZU5hbWUpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCkpOwogICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChpZmFjZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChMSVNURU5fRk9SX1JFTU9URV9ESVNQTEFZLCBkYXRhLCAmcmVwbHkpOwpAQCAtMTY2LDcgKzE2OCw4IEBACiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQ1JFQVRFX01FRElBX1JFQ09SREVSOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyU2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3A8SU1lZGlhUmVjb3JkZXI+IHJlY29yZGVyID0gY3JlYXRlTWVkaWFSZWNvcmRlcigpOworICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYgb3BQYWNrYWdlTmFtZSA9IGRhdGEucmVhZFN0cmluZzE2KCk7CisgICAgICAgICAgICBzcDxJTWVkaWFSZWNvcmRlcj4gcmVjb3JkZXIgPSBjcmVhdGVNZWRpYVJlY29yZGVyKG9wUGFja2FnZU5hbWUpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHJlY29yZGVyKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC0yMTQsMTAgKzIxNywxMSBAQAogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIExJU1RFTl9GT1JfUkVNT1RFX0RJU1BMQVk6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lID0gZGF0YS5yZWFkU3RyaW5nMTYoKTsKICAgICAgICAgICAgIHNwPElSZW1vdGVEaXNwbGF5Q2xpZW50PiBjbGllbnQoCiAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElSZW1vdGVEaXNwbGF5Q2xpZW50PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSkpOwogICAgICAgICAgICAgU3RyaW5nOCBpZmFjZShkYXRhLnJlYWRTdHJpbmc4KCkpOwotICAgICAgICAgICAgc3A8SVJlbW90ZURpc3BsYXk+IGRpc3BsYXkobGlzdGVuRm9yUmVtb3RlRGlzcGxheShjbGllbnQsIGlmYWNlKSk7CisgICAgICAgICAgICBzcDxJUmVtb3RlRGlzcGxheT4gZGlzcGxheShsaXN0ZW5Gb3JSZW1vdGVEaXNwbGF5KG9wUGFja2FnZU5hbWUsIGNsaWVudCwgaWZhY2UpKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihkaXNwbGF5KSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC0yMzQsNCArMjM4LDQgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCmluZGV4IGE3MzNiNjguLmVlM2I1ODQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKQEAgLTM1LDYgKzM1LDcgQEAKICAgICBSRUxFQVNFID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKICAgICBJTklULAogICAgIENMT1NFLAorICAgIFNFVF9JTlBVVF9TVVJGQUNFLAogICAgIFFVRVJZX1NVUkZBQ0VfTUVESUFTT1VSQ0UsCiAgICAgUkVTRVQsCiAgICAgU1RPUCwKQEAgLTQ2LDcgKzQ3LDYgQEAKICAgICBTRVRfT1VUUFVUX0ZPUk1BVCwKICAgICBTRVRfVklERU9fRU5DT0RFUiwKICAgICBTRVRfQVVESU9fRU5DT0RFUiwKLSAgICBTRVRfT1VUUFVUX0ZJTEVfUEFUSCwKICAgICBTRVRfT1VUUFVUX0ZJTEVfRkQsCiAgICAgU0VUX1ZJREVPX1NJWkUsCiAgICAgU0VUX1ZJREVPX0ZSQU1FUkFURSwKQEAgLTc2LDYgKzc2LDE2IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBzZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4mIHN1cmZhY2UpCisgICAgeworICAgICAgICBBTE9HVigic2V0SW5wdXRTdXJmYWNlKCVwKSIsIHN1cmZhY2UuZ2V0KCkpOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFSZWNvcmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihzdXJmYWNlKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfSU5QVVRfU1VSRkFDRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKwogICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHF1ZXJ5U3VyZmFjZU1lZGlhU291cmNlKCkKICAgICB7CiAgICAgICAgIEFMT0dWKCJRdWVyeSBTdXJmYWNlTWVkaWFTb3VyY2UiKTsKQEAgLTE1OCwxNiArMTY4LDYgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAotICAgIHN0YXR1c190IHNldE91dHB1dEZpbGUoY29uc3QgY2hhciogcGF0aCkKLSAgICB7Ci0gICAgICAgIEFMT0dWKCJzZXRPdXRwdXRGaWxlKCVzKSIsIHBhdGgpOwotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFSZWNvcmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcocGF0aCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfT1VUUFVUX0ZJTEVfUEFUSCwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwotICAgIH0KLQogICAgIHN0YXR1c190IHNldE91dHB1dEZpbGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpIHsKICAgICAgICAgQUxPR1YoInNldE91dHB1dEZpbGUoJWQsICUiIFBSSWQ2NCAiLCAlIiBQUklkNjQgIikiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC0zMDAsNyArMzAwLDggQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdHVzX3QgQm5NZWRpYVJlY29yZGVyOjpvblRyYW5zYWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKQogewogICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICBjYXNlIFJFTEVBU0U6IHsKQEAgLTM5MCwxMyArMzkxLDYgQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKIAogICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFNFVF9PVVRQVVRfRklMRV9QQVRIOiB7Ci0gICAgICAgICAgICBBTE9HVigiU0VUX09VVFBVVF9GSUxFX1BBVEgiKTsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgY29uc3QgY2hhciogcGF0aCA9IGRhdGEucmVhZENTdHJpbmcoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNldE91dHB1dEZpbGUocGF0aCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFNFVF9PVVRQVVRfRklMRV9GRDogewogICAgICAgICAgICAgQUxPR1YoIlNFVF9PVVRQVVRfRklMRV9GRCIpOwogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyLCBkYXRhLCByZXBseSk7CkBAIC00NDUsNyArNDM5LDggQEAKICAgICAgICAgY2FzZSBTRVRfUFJFVklFV19TVVJGQUNFOiB7CiAgICAgICAgICAgICBBTE9HVigiU0VUX1BSRVZJRVdfU1VSRkFDRSIpOwogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBzdXJmYWNlID0gaW50ZXJmYWNlX2Nhc3Q8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gc3VyZmFjZSA9IGludGVyZmFjZV9jYXN0PElHcmFwaGljQnVmZmVyUHJvZHVjZXI+KAorICAgICAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRQcmV2aWV3U3VyZmFjZShzdXJmYWNlKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC00NTgsNiArNDUzLDE0IEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRDYW1lcmEoY2FtZXJhLCBwcm94eSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNFVF9JTlBVVF9TVVJGQUNFOiB7CisgICAgICAgICAgICBBTE9HVigiU0VUX0lOUFVUX1NVUkZBQ0UiKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gc3VyZmFjZSA9IGludGVyZmFjZV9jYXN0PElHcmFwaGljQnVmZmVyQ29uc3VtZXI+KAorICAgICAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRJbnB1dFN1cmZhY2Uoc3VyZmFjZSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIFFVRVJZX1NVUkZBQ0VfTUVESUFTT1VSQ0U6IHsKICAgICAgICAgICAgIEFMT0dWKCJRVUVSWV9TVVJGQUNFX01FRElBU09VUkNFIik7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUmVjb3JkZXIsIGRhdGEsIHJlcGx5KTsKQEAgLTQ3OSw0ICs0ODIsNCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKaW5kZXggZTc5MDdlMy4uNjc5NWQyMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyQ2xpZW50LmNwcApAQCAtNjcsNCArNjcsNCBAQAogICAgIH0KIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwIGIvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKaW5kZXggYzdjNzMzZS4uMzY1ZDlhYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfSW5kZXhFeHQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00Myw2ICs0NCw4IEBACiAgICAgVVNFX0JVRkZFUiwKICAgICBVU0VfR1JBUEhJQ19CVUZGRVIsCiAgICAgQ1JFQVRFX0lOUFVUX1NVUkZBQ0UsCisgICAgQ1JFQVRFX1BFUlNJU1RFTlRfSU5QVVRfU1VSRkFDRSwKKyAgICBTRVRfSU5QVVRfU1VSRkFDRSwKICAgICBTSUdOQUxfRU5EX09GX0lOUFVUX1NUUkVBTSwKICAgICBTVE9SRV9NRVRBX0RBVEFfSU5fQlVGRkVSUywKICAgICBQUkVQQVJFX0ZPUl9BREFQVElWRV9QTEFZQkFDSywKQEAgLTI0NSwxMiArMjQ4LDEzIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHVzZUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAotICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIE9NWF9CT09MIC8qIGNyb3NzUHJvY2VzcyAqLykgeworICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIE9NWF9VMzIgYWxsb3R0ZWRTaXplLCBPTVhfQk9PTCAvKiBjcm9zc1Byb2Nlc3MgKi8pIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIocGFyYW1zKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihhbGxvdHRlZFNpemUpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoVVNFX0JVRkZFUiwgZGF0YSwgJnJlcGx5KTsKIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKQEAgLTMwNSw3ICszMDksNyBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVJbnB1dFN1cmZhY2UoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwKLSAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlcikgeworICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyLCBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBzdGF0dXNfdCBlcnI7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtMzE3LDYgKzMyMSwzNSBAQAogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCisgICAgICAgIC8vIHJlYWQgdHlwZSBldmVuIGlmIGNyZWF0ZUlucHV0U3VyZmFjZSBmYWlsZWQKKyAgICAgICAgaW50IG5lZ290aWF0ZWRUeXBlID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmICh0eXBlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICp0eXBlID0gKE1ldGFkYXRhQnVmZmVyVHlwZSluZWdvdGlhdGVkVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgKmJ1ZmZlclByb2R1Y2VyID0gSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6YXNJbnRlcmZhY2UoCisgICAgICAgICAgICAgICAgcmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKKworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGVyc2lzdGVudElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlciwKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICpidWZmZXJDb25zdW1lcikgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChDUkVBVEVfUEVSU0lTVEVOVF9JTlBVVF9TVVJGQUNFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiYmluZGVyIHRyYW5zYWN0aW9uIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCiAgICAgICAgIGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtMzI0LDEwICszNTcsMzggQEAKIAogICAgICAgICAqYnVmZmVyUHJvZHVjZXIgPSBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjphc0ludGVyZmFjZSgKICAgICAgICAgICAgICAgICByZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICAqYnVmZmVyQ29uc3VtZXIgPSBJR3JhcGhpY0J1ZmZlckNvbnN1bWVyOjphc0ludGVyZmFjZSgKKyAgICAgICAgICAgICAgICByZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwogCiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICZidWZmZXJDb25zdW1lciwgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydF9pbmRleCk7CisgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyQ29uc3VtZXIpKTsKKworICAgICAgICBlcnIgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0lOUFVUX1NVUkZBQ0UsIGRhdGEsICZyZXBseSk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coImJpbmRlciB0cmFuc2FjdGlvbiBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICAvLyByZWFkIHR5cGUgZXZlbiBpZiBzZXRJbnB1dFN1cmZhY2UgZmFpbGVkCisgICAgICAgIGludCBuZWdvdGlhdGVkVHlwZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBpZiAodHlwZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAqdHlwZSA9IChNZXRhZGF0YUJ1ZmZlclR5cGUpbmVnb3RpYXRlZFR5cGU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzaWduYWxFbmRPZklucHV0U3RyZWFtKG5vZGVfaWQgbm9kZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIHN0YXR1c190IGVycjsKQEAgLTM0Myw3ICs0MDQsNyBAQAogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcmVNZXRhRGF0YUluQnVmZmVycygKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUpIHsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUsIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CkBAIC0zNTEsOCArNDEyLDEzIEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigodWludDMyX3QpZW5hYmxlKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUT1JFX01FVEFfREFUQV9JTl9CVUZGRVJTLCBkYXRhLCAmcmVwbHkpOwogCi0gICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAvLyByZWFkIHR5cGUgZXZlbiBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzIGZhaWxlZAorICAgICAgICBpbnQgbmVnb3RpYXRlZFR5cGUgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKHR5cGUgIT0gTlVMTCkgeworICAgICAgICAgICAgKnR5cGUgPSAoTWV0YWRhdGFCdWZmZXJUeXBlKW5lZ290aWF0ZWRUeXBlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCkBAIC00MTUsMTIgKzQ4MSwxMyBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcldpdGhCYWNrdXAoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKLSAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfQk9PTCAvKiBjcm9zc1Byb2Nlc3MgKi8pIHsKKyAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfVTMyIGFsbG90dGVkU2l6ZSwgT01YX0JPT0wgLyogY3Jvc3NQcm9jZXNzICovKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClub2RlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBvcnRfaW5kZXgpOwogICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHBhcmFtcykpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoYWxsb3R0ZWRTaXplKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEFMTE9DX0JVRkZFUl9XSVRIX0JBQ0tVUCwgZGF0YSwgJnJlcGx5KTsKIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKQEAgLTQ0NywxMSArNTE0LDE1IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGZpbGxCdWZmZXIobm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyKSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBmaWxsQnVmZmVyKG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgaW50IGZlbmNlRmQpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KW5vZGUpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpYnVmZmVyKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGZlbmNlRmQgPj0gMCk7CisgICAgICAgIGlmIChmZW5jZUZkID49IDApIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVGaWxlRGVzY3JpcHRvcihmZW5jZUZkLCB0cnVlIC8qIHRha2VPd25lcnNoaXAgKi8pOworICAgICAgICB9CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChGSUxMX0JVRkZFUiwgZGF0YSwgJnJlcGx5KTsKIAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CkBAIC00NjEsNyArNTMyLDcgQEAKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwKICAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIsCiAgICAgICAgICAgICBPTVhfVTMyIHJhbmdlX29mZnNldCwgT01YX1UzMiByYW5nZV9sZW5ndGgsCi0gICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wKSB7CisgICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCkgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpbm9kZSk7CkBAIC00NzAsNiArNTQxLDEwIEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihyYW5nZV9sZW5ndGgpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoZmxhZ3MpOwogICAgICAgICBkYXRhLndyaXRlSW50NjQodGltZXN0YW1wKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGZlbmNlRmQgPj0gMCk7CisgICAgICAgIGlmIChmZW5jZUZkID49IDApIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVGaWxlRGVzY3JpcHRvcihmZW5jZUZkLCB0cnVlIC8qIHRha2VPd25lcnNoaXAgKi8pOworICAgICAgICB9CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChFTVBUWV9CVUZGRVIsIGRhdGEsICZyZXBseSk7CiAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwpAQCAtNjI0LDEwICs2OTksMTIgQEAKICAgICAgICAgICAgIHZvaWQgKnBhcmFtcyA9IE5VTEw7CiAgICAgICAgICAgICBzaXplX3QgcGFnZVNpemUgPSAwOwogICAgICAgICAgICAgc2l6ZV90IGFsbG9jU2l6ZSA9IDA7Ci0gICAgICAgICAgICBpZiAoY29kZSAhPSBTRVRfSU5URVJOQUxfT1BUSU9OICYmIHNpemUgPCA4KSB7CisgICAgICAgICAgICBib29sIGlzVXNhZ2VCaXRzID0gKGluZGV4ID09IChPTVhfSU5ERVhUWVBFKSBPTVhfSW5kZXhQYXJhbUNvbnN1bWVyVXNhZ2VCaXRzKTsKKyAgICAgICAgICAgIGlmICgoaXNVc2FnZUJpdHMgJiYgc2l6ZSA8IDQpIHx8CisgICAgICAgICAgICAgICAgICAgICghaXNVc2FnZUJpdHMgJiYgY29kZSAhPSBTRVRfSU5URVJOQUxfT1BUSU9OICYmIHNpemUgPCA4KSkgewogICAgICAgICAgICAgICAgIC8vIHdlIGV4cGVjdCB0aGUgc3RydWN0dXJlIHRvIGNvbnRhaW4gYXQgbGVhc3QgdGhlIHNpemUgYW5kCiAgICAgICAgICAgICAgICAgLy8gdmVyc2lvbiwgOCBieXRlcyB0b3RhbAotICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI3MjA3Mjc1ICglenUpIiwgc2l6ZSk7CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMjcyMDcyNzUgKCV6dSkgKCVkLyVkKSIsIHNpemUsIGludChpbmRleCksIGludChjb2RlKSk7CiAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzIwNzI3NSIpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBlcnIgPSBOT19NRU1PUlk7CkBAIC02NDYsNyArNzIzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IE5PVF9FTk9VR0hfREFUQTsKICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9VMzIgZGVjbGFyZWRTaXplID0gKihPTVhfVTMyKilwYXJhbXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSAhPSBTRVRfSU5URVJOQUxfT1BUSU9OICYmIGRlY2xhcmVkU2l6ZSA+IHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlICE9IFNFVF9JTlRFUk5BTF9PUFRJT04gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggIT0gKE9NWF9JTkRFWFRZUEUpIE9NWF9JbmRleFBhcmFtQ29uc3VtZXJVc2FnZUJpdHMgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWRTaXplID4gc2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBidWZmZXIgc2F5cyBpdCdzIGJpZ2dlciB0aGFuIGl0IGFjdHVhbGx5IGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImIvMjcyMDcyNzUgKCV1LyV6dSkiLCBkZWNsYXJlZFNpemUsIHNpemUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjcyMDcyNzUiKTsKQEAgLTc1NiwxMCArODM1LDExIEBACiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgc3A8SU1lbW9yeT4gcGFyYW1zID0KICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBPTVhfVTMyIGFsbG90dGVkU2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CiAKICAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXI7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSB1c2VCdWZmZXIoCi0gICAgICAgICAgICAgICAgICAgIG5vZGUsIHBvcnRfaW5kZXgsIHBhcmFtcywgJmJ1ZmZlciwgT01YX1RSVUUgLyogY3Jvc3NQcm9jZXNzICovKTsKKyAgICAgICAgICAgICAgICAgICAgbm9kZSwgcG9ydF9pbmRleCwgcGFyYW1zLCAmYnVmZmVyLCBhbGxvdHRlZFNpemUsIE9NWF9UUlVFIC8qIGNyb3NzUHJvY2VzcyAqLyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOwogCiAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CkBAIC04MTUsOSArODk1LDE0IEBACiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwogCiAgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBidWZmZXJQcm9kdWNlcjsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGNyZWF0ZUlucHV0U3VyZmFjZShub2RlLCBwb3J0X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAmYnVmZmVyUHJvZHVjZXIpOworICAgICAgICAgICAgTWV0YWRhdGFCdWZmZXJUeXBlIHR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZDsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGNyZWF0ZUlucHV0U3VyZmFjZShub2RlLCBwb3J0X2luZGV4LCAmYnVmZmVyUHJvZHVjZXIsICZ0eXBlKTsKIAorICAgICAgICAgICAgaWYgKChlcnIgIT0gT0spICYmICh0eXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVJbnZhbGlkKSkgeworICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjYzMjQzNTgiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIodHlwZSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOwogCiAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CkBAIC04MjcsNiArOTEyLDQ3IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIENSRUFURV9QRVJTSVNURU5UX0lOUFVUX1NVUkZBQ0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOworCisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBidWZmZXJQcm9kdWNlcjsKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGJ1ZmZlckNvbnN1bWVyOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gY3JlYXRlUGVyc2lzdGVudElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlclByb2R1Y2VyLCAmYnVmZmVyQ29uc3VtZXIpOworCisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOworCisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlclByb2R1Y2VyKSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlckNvbnN1bWVyKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VUX0lOUFVUX1NVUkZBQ0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOworCisgICAgICAgICAgICBub2RlX2lkIG5vZGUgPSAobm9kZV9pZClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKKworICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gYnVmZmVyQ29uc3VtZXIgPQorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisKKyAgICAgICAgICAgIE1ldGFkYXRhQnVmZmVyVHlwZSB0eXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUludmFsaWQ7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXRJbnB1dFN1cmZhY2Uobm9kZSwgcG9ydF9pbmRleCwgYnVmZmVyQ29uc3VtZXIsICZ0eXBlKTsKKworICAgICAgICAgICAgaWYgKChlcnIgIT0gT0spICYmICh0eXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVJbnZhbGlkKSkgeworICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjYzMjQzNTgiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIodHlwZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBTSUdOQUxfRU5EX09GX0lOUFVUX1NUUkVBTToKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7CkBAIC04NDcsMTAgKzk3MywxMyBAQAogICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9CT09MIGVuYWJsZSA9IChPTVhfQk9PTClkYXRhLnJlYWRJbnQzMigpOwogCisgICAgICAgICAgICBNZXRhZGF0YUJ1ZmZlclR5cGUgdHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVJbnZhbGlkOwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgICAgICAgICAvLyBvbmx5IGNvbnRyb2wgb3V0cHV0IG1ldGFkYXRhIHZpYSBCaW5kZXIKICAgICAgICAgICAgICAgICBwb3J0X2luZGV4ICE9IDEgLyoga091dHB1dFBvcnRJbmRleCAqLyA/IEJBRF9WQUxVRSA6Ci0gICAgICAgICAgICAgICAgc3RvcmVNZXRhRGF0YUluQnVmZmVycyhub2RlLCBwb3J0X2luZGV4LCBlbmFibGUpOworICAgICAgICAgICAgICAgIHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMobm9kZSwgcG9ydF9pbmRleCwgZW5hYmxlLCAmdHlwZSk7CisKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHR5cGUpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKIAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtOTI5LDEwICsxMDU4LDExIEBACiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXggPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgc3A8SU1lbW9yeT4gcGFyYW1zID0KICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBPTVhfVTMyIGFsbG90dGVkU2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CiAKICAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXI7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBhbGxvY2F0ZUJ1ZmZlcldpdGhCYWNrdXAoCi0gICAgICAgICAgICAgICAgICAgIG5vZGUsIHBvcnRfaW5kZXgsIHBhcmFtcywgJmJ1ZmZlciwgT01YX1RSVUUgLyogY3Jvc3NQcm9jZXNzICovKTsKKyAgICAgICAgICAgICAgICAgICAgbm9kZSwgcG9ydF9pbmRleCwgcGFyYW1zLCAmYnVmZmVyLCBhbGxvdHRlZFNpemUsIE9NWF9UUlVFIC8qIGNyb3NzUHJvY2VzcyAqLyk7CiAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7CiAKQEAgLTk2MSw3ICsxMDkxLDkgQEAKIAogICAgICAgICAgICAgbm9kZV9pZCBub2RlID0gKG5vZGVfaWQpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIgPSAoYnVmZmVyX2lkKWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmaWxsQnVmZmVyKG5vZGUsIGJ1ZmZlcikpOworICAgICAgICAgICAgYm9vbCBoYXZlRmVuY2UgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50IGZlbmNlRmQgPSBoYXZlRmVuY2UgPyA6OmR1cChkYXRhLnJlYWRGaWxlRGVzY3JpcHRvcigpKSA6IC0xOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmlsbEJ1ZmZlcihub2RlLCBidWZmZXIsIGZlbmNlRmQpKTsKIAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CkBAIC05NzYsMTEgKzExMDgsMTAgQEAKICAgICAgICAgICAgIE9NWF9VMzIgcmFuZ2VfbGVuZ3RoID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3MgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgT01YX1RJQ0tTIHRpbWVzdGFtcCA9IGRhdGEucmVhZEludDY0KCk7Ci0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKAotICAgICAgICAgICAgICAgICAgICBlbXB0eUJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUsIGJ1ZmZlciwgcmFuZ2Vfb2Zmc2V0LCByYW5nZV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgdGltZXN0YW1wKSk7CisgICAgICAgICAgICBib29sIGhhdmVGZW5jZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpbnQgZmVuY2VGZCA9IGhhdmVGZW5jZSA/IDo6ZHVwKGRhdGEucmVhZEZpbGVEZXNjcmlwdG9yKCkpIDogLTE7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlbXB0eUJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgbm9kZSwgYnVmZmVyLCByYW5nZV9vZmZzZXQsIHJhbmdlX2xlbmd0aCwgZmxhZ3MsIHRpbWVzdGFtcCwgZmVuY2VGZCkpOwogCiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KQEAgLTEwMTcsMTQgKzExNDgsMjkgQEAKICAgICAgICAgOiBCcEludGVyZmFjZTxJT01YT2JzZXJ2ZXI+KGltcGwpIHsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlKGNvbnN0IG9teF9tZXNzYWdlICZtc2cpIHsKKyAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlcyhjb25zdCBzdGQ6Omxpc3Q8b214X21lc3NhZ2U+ICZtZXNzYWdlcykgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YT2JzZXJ2ZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGUoJm1zZywgc2l6ZW9mKG1zZykpOwotCi0gICAgICAgIEFMT0dWKCJvbk1lc3NhZ2Ugd3JpdGluZyBtZXNzYWdlICVkLCBzaXplICV6dSIsIG1zZy50eXBlLCBzaXplb2YobXNnKSk7Ci0KLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9CU0VSVkVSX09OX01TRywgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CisgICAgICAgIHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWVzc2FnZXMuY2JlZ2luKCk7CisgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICB3aGlsZSAoaXQgIT0gbWVzc2FnZXMuY2VuZCgpKSB7CisgICAgICAgICAgICBjb25zdCBvbXhfbWVzc2FnZSAmbXNnID0gKml0Kys7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWE9ic2VydmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihtc2cubm9kZSk7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihtc2cuZmVuY2VGZCA+PSAwKTsKKyAgICAgICAgICAgIGlmIChtc2cuZmVuY2VGZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgZGF0YS53cml0ZUZpbGVEZXNjcmlwdG9yKG1zZy5mZW5jZUZkLCB0cnVlIC8qIHRha2VPd25lcnNoaXAgKi8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKG1zZy50eXBlKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGUoJm1zZy51LCBzaXplb2YobXNnLnUpKTsKKyAgICAgICAgICAgIEFMT0dWKCJvbk1lc3NhZ2Ugd3JpdGluZyBtZXNzYWdlICVkLCBzaXplICV6dSIsIG1zZy50eXBlLCBzaXplb2YobXNnKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKC0xKTsgLy8gbWFyayBlbmQKKyAgICAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPQlNFUlZFUl9PTl9NU0csIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOworICAgICAgICB9CiAgICAgfQogfTsKIApAQCAtMTAzNiwxNiArMTE4MiwyOCBAQAogICAgICAgICBjYXNlIE9CU0VSVkVSX09OX01TRzoKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YT2JzZXJ2ZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIElPTVg6Om5vZGVfaWQgbm9kZSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8b214X21lc3NhZ2U+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+c2V0RGF0YVNvdXJjZShkYXRhU291cmNlKTsKK30KKwogc3A8SU1lbW9yeT4gTWVkaWFNZXRhZGF0YVJldHJpZXZlcjo6Z2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pCiB7CiAgICAgQUxPR1YoImdldEZyYW1lQXRUaW1lOiB0aW1lKCUiIFBSSWQ2NCAiIHVzKSBvcHRpb24oJWQpIiwgdGltZVVzLCBvcHRpb24pOwpAQCAtMTc2LDQgKzE4OCw0IEBACiAgICAgfQogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFwbGF5ZXIuY3BwCmluZGV4IGFjMDQ3YzkuLmRjY2UzY2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL21lZGlhcGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXBsYXllci5jcHAKQEAgLTMyLDcgKzMyLDEwIEBACiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KIAogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorI2luY2x1ZGUgPG1lZGlhL0FWU3luY1NldHRpbmdzLmg+CisjaW5jbHVkZSA8bWVkaWEvSURhdGFTb3VyY2UuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CiAKQEAgLTE5NCw2ICsxOTcsMjIgQEAKICAgICByZXR1cm4gZXJyOwogfQogCitzdGF0dXNfdCBNZWRpYVBsYXllcjo6c2V0RGF0YVNvdXJjZShjb25zdCBzcDxJRGF0YVNvdXJjZT4gJnNvdXJjZSkKK3sKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZShJRGF0YVNvdXJjZSkiKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+JiBzZXJ2aWNlKGdldE1lZGlhUGxheWVyU2VydmljZSgpKTsKKyAgICBpZiAoc2VydmljZSAhPSAwKSB7CisgICAgICAgIHNwPElNZWRpYVBsYXllcj4gcGxheWVyKHNlcnZpY2UtPmNyZWF0ZSh0aGlzLCBtQXVkaW9TZXNzaW9uSWQpKTsKKyAgICAgICAgaWYgKChOT19FUlJPUiAhPSBkb1NldFJldHJhbnNtaXRFbmRwb2ludChwbGF5ZXIpKSB8fAorICAgICAgICAgICAgKE5PX0VSUk9SICE9IHBsYXllci0+c2V0RGF0YVNvdXJjZShzb3VyY2UpKSkgeworICAgICAgICAgICAgcGxheWVyLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gYXR0YWNoTmV3UGxheWVyKHBsYXllcik7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKIHN0YXR1c190IE1lZGlhUGxheWVyOjppbnZva2UoY29uc3QgUGFyY2VsJiByZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0yNDAsMTAgKzI1OSwxMSBAQAogLy8gbXVzdCBjYWxsIHdpdGggbG9jayBoZWxkCiBzdGF0dXNfdCBNZWRpYVBsYXllcjo6cHJlcGFyZUFzeW5jX2woKQogewotICAgIGlmICggKG1QbGF5ZXIgIT0gMCkgJiYgKCBtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVJfSU5JVElBTElaRUQgfCBNRURJQV9QTEFZRVJfU1RPUFBFRCkgKSApIHsKLSAgICAgICAgbVBsYXllci0+c2V0QXVkaW9TdHJlYW1UeXBlKG1TdHJlYW1UeXBlKTsKKyAgICBpZiAoIChtUGxheWVyICE9IDApICYmICggbUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVJfSU5JVElBTElaRUQgfCBNRURJQV9QTEFZRVJfU1RPUFBFRCkgKSApIHsKICAgICAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgewogICAgICAgICAgICAgbVBsYXllci0+c2V0UGFyYW1ldGVyKEtFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUywgKm1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBsYXllci0+c2V0QXVkaW9TdHJlYW1UeXBlKG1TdHJlYW1UeXBlKTsKICAgICAgICAgfQogICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSX1BSRVBBUklORzsKICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnByZXBhcmVBc3luYygpOwpAQCAtMzcxLDYgKzM5MSw5IEBACiAgICAgICAgIGlmICgobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUl9TVEFSVEVEKSAmJiAhIHRlbXApIHsKICAgICAgICAgICAgIEFMT0dFKCJpbnRlcm5hbC9leHRlcm5hbCBzdGF0ZSBtaXNtYXRjaCBjb3JyZWN0ZWQiKTsKICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVJfUEFVU0VEOworICAgICAgICB9IGVsc2UgaWYgKChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSX1BBVVNFRCkgJiYgdGVtcCkgeworICAgICAgICAgICAgQUxPR0UoImludGVybmFsL2V4dGVybmFsIHN0YXRlIG1pc21hdGNoIGNvcnJlY3RlZCIpOworICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUl9TVEFSVEVEOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0ZW1wOwogICAgIH0KQEAgLTM3OCw2ICs0MDEsNTIgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK3N0YXR1c190IE1lZGlhUGxheWVyOjpzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlJiByYXRlKQoreworICAgIEFMT0dWKCJzZXRQbGF5YmFja1NldHRpbmdzOiAlZiAlZiAlZCAlZCIsCisgICAgICAgICAgICByYXRlLm1TcGVlZCwgcmF0ZS5tUGl0Y2gsIHJhdGUubUZhbGxiYWNrTW9kZSwgcmF0ZS5tU3RyZXRjaE1vZGUpOworICAgIC8vIE5lZ2F0aXZlIHNwZWVkIGFuZCBwaXRjaCBkb2VzIG5vdCBtYWtlIHNlbnNlLiBGdXJ0aGVyIHZhbGlkYXRpb24gd2lsbAorICAgIC8vIGJlIGRvbmUgYnkgdGhlIHJlc3BlY3RpdmUgbWVkaWFwbGF5ZXJzLgorICAgIGlmIChyYXRlLm1TcGVlZCA8IDAuZiB8fCByYXRlLm1QaXRjaCA8IDAuZikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzdGF0dXNfdCBlcnIgPSBtUGxheWVyLT5zZXRQbGF5YmFja1NldHRpbmdzKHJhdGUpOworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgaWYgKHJhdGUubVNwZWVkID09IDAuZiAmJiBtQ3VycmVudFN0YXRlID09IE1FRElBX1BMQVlFUl9TVEFSVEVEKSB7CisgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSX1BBVVNFRDsKKyAgICAgICAgfSBlbHNlIGlmIChyYXRlLm1TcGVlZCAhPSAwLmYgJiYgbUN1cnJlbnRTdGF0ZSA9PSBNRURJQV9QTEFZRVJfUEFVU0VEKSB7CisgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSX1NUQVJURUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OmdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUqIHJhdGUgLyogbm9ubnVsbCAqLykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVBsYXllci0+Z2V0UGxheWJhY2tTZXR0aW5ncyhyYXRlKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OnNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyYgc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KQoreworICAgIEFMT0dWKCJzZXRTeW5jU2V0dGluZ3M6ICV1ICV1ICVmICVmIiwKKyAgICAgICAgICAgIHN5bmMubVNvdXJjZSwgc3luYy5tQXVkaW9BZGp1c3RNb2RlLCBzeW5jLm1Ub2xlcmFuY2UsIHZpZGVvRnBzSGludCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVBsYXllciA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1QbGF5ZXItPnNldFN5bmNTZXR0aW5ncyhzeW5jLCB2aWRlb0Zwc0hpbnQpOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjo6Z2V0U3luY1NldHRpbmdzKAorICAgICAgICBBVlN5bmNTZXR0aW5ncyogc3luYyAvKiBub25udWxsICovLCBmbG9hdCogdmlkZW9GcHMgLyogbm9ubnVsbCAqLykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVBsYXllci0+Z2V0U3luY1NldHRpbmdzKHN5bmMsIHZpZGVvRnBzKTsKK30KKwogc3RhdHVzX3QgTWVkaWFQbGF5ZXI6OmdldFZpZGVvV2lkdGgoaW50ICp3KQogewogICAgIEFMT0dWKCJnZXRWaWRlb1dpZHRoIik7CkBAIC00MTQsNyArNDgzLDggQEAKIHN0YXR1c190IE1lZGlhUGxheWVyOjpnZXREdXJhdGlvbl9sKGludCAqbXNlYykKIHsKICAgICBBTE9HVigiZ2V0RHVyYXRpb25fbCIpOwotICAgIGJvb2wgaXNWYWxpZFN0YXRlID0gKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSX1BSRVBBUkVEIHwgTUVESUFfUExBWUVSX1NUQVJURUQgfCBNRURJQV9QTEFZRVJfUEFVU0VEIHwgTUVESUFfUExBWUVSX1NUT1BQRUQgfCBNRURJQV9QTEFZRVJfUExBWUJBQ0tfQ09NUExFVEUpKTsKKyAgICBib29sIGlzVmFsaWRTdGF0ZSA9IChtQ3VycmVudFN0YXRlICYgKE1FRElBX1BMQVlFUl9QUkVQQVJFRCB8IE1FRElBX1BMQVlFUl9TVEFSVEVEIHwKKyAgICAgICAgICAgIE1FRElBX1BMQVlFUl9QQVVTRUQgfCBNRURJQV9QTEFZRVJfU1RPUFBFRCB8IE1FRElBX1BMQVlFUl9QTEFZQkFDS19DT01QTEVURSkpOwogICAgIGlmIChtUGxheWVyICE9IDAgJiYgaXNWYWxpZFN0YXRlKSB7CiAgICAgICAgIGludCBkdXJhdGlvbk1zOwogICAgICAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5nZXREdXJhdGlvbigmZHVyYXRpb25Ncyk7CkBAIC00NDMsNyArNTEzLDggQEAKIHN0YXR1c190IE1lZGlhUGxheWVyOjpzZWVrVG9fbChpbnQgbXNlYykKIHsKICAgICBBTE9HVigic2Vla1RvICVkIiwgbXNlYyk7Ci0gICAgaWYgKChtUGxheWVyICE9IDApICYmICggbUN1cnJlbnRTdGF0ZSAmICggTUVESUFfUExBWUVSX1NUQVJURUQgfCBNRURJQV9QTEFZRVJfUFJFUEFSRUQgfCBNRURJQV9QTEFZRVJfUEFVU0VEIHwgIE1FRElBX1BMQVlFUl9QTEFZQkFDS19DT01QTEVURSkgKSApIHsKKyAgICBpZiAoKG1QbGF5ZXIgIT0gMCkgJiYgKCBtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVJfU1RBUlRFRCB8IE1FRElBX1BMQVlFUl9QUkVQQVJFRCB8CisgICAgICAgICAgICBNRURJQV9QTEFZRVJfUEFVU0VEIHwgIE1FRElBX1BMQVlFUl9QTEFZQkFDS19DT01QTEVURSkgKSApIHsKICAgICAgICAgaWYgKCBtc2VjIDwgMCApIHsKICAgICAgICAgICAgIEFMT0dXKCJBdHRlbXB0IHRvIHNlZWsgdG8gaW52YWxpZCBwb3NpdGlvbjogJWQiLCBtc2VjKTsKICAgICAgICAgICAgIG1zZWMgPSAwOwpAQCAtNDc3LDcgKzU0OCw4IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KICAgICB9Ci0gICAgQUxPR0UoIkF0dGVtcHQgdG8gcGVyZm9ybSBzZWVrVG8gaW4gd3Jvbmcgc3RhdGU6IG1QbGF5ZXI9JXAsIG1DdXJyZW50U3RhdGU9JXUiLCBtUGxheWVyLmdldCgpLCBtQ3VycmVudFN0YXRlKTsKKyAgICBBTE9HRSgiQXR0ZW1wdCB0byBwZXJmb3JtIHNlZWtUbyBpbiB3cm9uZyBzdGF0ZTogbVBsYXllcj0lcCwgbUN1cnJlbnRTdGF0ZT0ldSIsIG1QbGF5ZXIuZ2V0KCksCisgICAgICAgICAgICBtQ3VycmVudFN0YXRlKTsKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKQEAgLTUwMiw2ICs1NzQsNyBAQAogICAgICAgICAgICAgQUxPR0UoInJlc2V0KCkgZmFpbGVkIHdpdGggcmV0dXJuIGNvZGUgKCVkKSIsIHJldCk7CiAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSX1NUQVRFX0VSUk9SOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBsYXllci0+ZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUl9JRExFOwogICAgICAgICB9CiAgICAgICAgIC8vIHNldERhdGFTb3VyY2UgaGFzIHRvIGJlIGNhbGxlZCBhZ2FpbiB0byBjcmVhdGUgYQpAQCAtNjYzLDI0ICs3MzYsMjggQEAKIHN0YXR1c190IE1lZGlhUGxheWVyOjpzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsJiByZXF1ZXN0KQogewogICAgIEFMT0dWKCJNZWRpYVBsYXllcjo6c2V0UGFyYW1ldGVyKCVkKSIsIGtleSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAoY2hlY2tTdGF0ZUZvcktleVNldF9sKGtleSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBpZiAobVBsYXllciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAgbVBsYXllci0+c2V0UGFyYW1ldGVyKGtleSwgcmVxdWVzdCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIHN3aXRjaCAoa2V5KSB7CiAgICAgY2FzZSBLRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVM6Ci0gICAgICAgIC8vIG5vIHBsYXllciwgc2F2ZSB0aGUgbWFyc2hhbGxlZCBhdWRpbyBhdHRyaWJ1dGVzCisgICAgICAgIC8vIHNhdmUgdGhlIG1hcnNoYWxsZWQgYXVkaW8gYXR0cmlidXRlcwogICAgICAgICBpZiAobUF1ZGlvQXR0cmlidXRlc1BhcmNlbCAhPSBOVUxMKSB7IGRlbGV0ZSBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsOyB9OwogICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsID0gbmV3IFBhcmNlbCgpOwogICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsLT5hcHBlbmRGcm9tKCZyZXF1ZXN0LCAwLCByZXF1ZXN0LmRhdGFTaXplKCkpOwotICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIHN0YXR1cyA9IE9LOworICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyOiBubyBhY3RpdmUgcGxheWVyIik7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgQUxPR1ZfSUYobVBsYXllciA9PSBOVUxMLCAic2V0UGFyYW1ldGVyOiBubyBhY3RpdmUgcGxheWVyIik7CisgICAgICAgIGJyZWFrOwogICAgIH0KKworICAgIGlmIChtUGxheWVyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzID0gbVBsYXllci0+c2V0UGFyYW1ldGVyKGtleSwgcmVxdWVzdCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyOjpnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkKQEAgLTgxOCw2ICs4OTUsOSBAQAogICAgIGNhc2UgTUVESUFfU1VCVElUTEVfREFUQToKICAgICAgICAgQUxPR1YoIlJlY2VpdmVkIHN1YnRpdGxlIGRhdGEgbWVzc2FnZSIpOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIE1FRElBX01FVEFfREFUQToKKyAgICAgICAgQUxPR1YoIlJlY2VpdmVkIHRpbWVkIG1ldGFkYXRhIG1lc3NhZ2UiKTsKKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgQUxPR1YoInVucmVjb2duaXplZCBtZXNzYWdlOiAoJWQsICVkLCAlZCkiLCBtc2csIGV4dDEsIGV4dDIpOwogICAgICAgICBicmVhazsKQEAgLTg1NSw0ICs5MzUsNCBAQAogICAgIHJldHVybiBtUGxheWVyLT5zZXROZXh0UGxheWVyKG5leHQgPT0gTlVMTCA/IE5VTEwgOiBuZXh0LT5tUGxheWVyKTsKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKaW5kZXggODg4ZWY2Ni4uMGViN2RlNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPiAgLy8gZm9yIE1FRElBX0VSUk9SX1NFUlZFUl9ESUVECisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUGVyc2lzdGVudFN1cmZhY2UuaD4KICNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0yNjQsMzIgKzI2NSw2IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6c2V0T3V0cHV0RmlsZShjb25zdCBjaGFyKiBwYXRoKQotewotICAgIEFMT0dWKCJzZXRPdXRwdXRGaWxlKCVzKSIsIHBhdGgpOwotICAgIGlmIChtTWVkaWFSZWNvcmRlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJtZWRpYSByZWNvcmRlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgaWYgKG1Jc091dHB1dEZpbGVTZXQpIHsKLSAgICAgICAgQUxPR0UoIm91dHB1dCBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gc2V0Iik7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgaWYgKCEobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1JFQ09SREVSX0RBVEFTT1VSQ0VfQ09ORklHVVJFRCkpIHsKLSAgICAgICAgQUxPR0UoInNldE91dHB1dEZpbGUgY2FsbGVkIGluIGFuIGludmFsaWQgc3RhdGUoJWQpIiwgbUN1cnJlbnRTdGF0ZSk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCByZXQgPSBtTWVkaWFSZWNvcmRlci0+c2V0T3V0cHV0RmlsZShwYXRoKTsKLSAgICBpZiAoT0sgIT0gcmV0KSB7Ci0gICAgICAgIEFMT0dWKCJzZXRPdXRwdXRGaWxlIGZhaWxlZDogJWQiLCByZXQpOwotICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUkVDT1JERVJfRVJST1I7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIG1Jc091dHB1dEZpbGVTZXQgPSB0cnVlOwotICAgIHJldHVybiByZXQ7Ci19Ci0KIHN0YXR1c190IE1lZGlhUmVjb3JkZXI6OnNldE91dHB1dEZpbGUoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCiB7CiAgICAgQUxPR1YoInNldE91dHB1dEZpbGUoJWQsICUiIFBSSWQ2NCAiLCAlIiBQUklkNjQgIikiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwpAQCAtMzcwLDYgKzM0NSwyNCBAQAogCiAKIAorc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6c2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiYgc3VyZmFjZSkKK3sKKyAgICBBTE9HVigic2V0SW5wdXRTdXJmYWNlIik7CisgICAgaWYgKG1NZWRpYVJlY29yZGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIm1lZGlhIHJlY29yZGVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBib29sIGlzSW52YWxpZFN0YXRlID0gKG1DdXJyZW50U3RhdGUgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1FRElBX1JFQ09SREVSX1BSRVBBUkVEIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9SRUNPUkRFUl9SRUNPUkRJTkcpKTsKKyAgICBpZiAoaXNJbnZhbGlkU3RhdGUpIHsKKyAgICAgICAgQUxPR0UoInNldElucHV0U3VyZmFjZSBpcyBjYWxsZWQgaW4gYW4gaW52YWxpZCBzdGF0ZTogJWQiLCBtQ3VycmVudFN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHJldHVybiBtTWVkaWFSZWNvcmRlci0+c2V0SW5wdXRTdXJmYWNlKHN1cmZhY2UtPmdldEJ1ZmZlckNvbnN1bWVyKCkpOworfQorCiBzdGF0dXNfdCBNZWRpYVJlY29yZGVyOjpzZXRWaWRlb0ZyYW1lUmF0ZShpbnQgZnJhbWVzX3Blcl9zZWNvbmQpCiB7CiAgICAgQUxPR1YoInNldFZpZGVvRnJhbWVSYXRlKCVkKSIsIGZyYW1lc19wZXJfc2Vjb25kKTsKQEAgLTYyMCwxMyArNjEzLDEzIEBACiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCi1NZWRpYVJlY29yZGVyOjpNZWRpYVJlY29yZGVyKCkgOiBtU3VyZmFjZU1lZGlhU291cmNlKE5VTEwpCitNZWRpYVJlY29yZGVyOjpNZWRpYVJlY29yZGVyKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKSA6IG1TdXJmYWNlTWVkaWFTb3VyY2UoTlVMTCkKIHsKICAgICBBTE9HVigiY29uc3RydWN0b3IiKTsKIAogICAgIGNvbnN0IHNwPElNZWRpYVBsYXllclNlcnZpY2U+IHNlcnZpY2UoZ2V0TWVkaWFQbGF5ZXJTZXJ2aWNlKCkpOwogICAgIGlmIChzZXJ2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgbU1lZGlhUmVjb3JkZXIgPSBzZXJ2aWNlLT5jcmVhdGVNZWRpYVJlY29yZGVyKCk7CisgICAgICAgIG1NZWRpYVJlY29yZGVyID0gc2VydmljZS0+Y3JlYXRlTWVkaWFSZWNvcmRlcihvcFBhY2thZ2VOYW1lKTsKICAgICB9CiAgICAgaWYgKG1NZWRpYVJlY29yZGVyICE9IE5VTEwpIHsKICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1JFQ09SREVSX0lETEU7CkBAIC03MDYsNCArNjk5LDQgQEAKICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfRVJST1IsIE1FRElBX0VSUk9SX1NFUlZFUl9ESUVELCAwKTsKIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQubWsKaW5kZXggOWQ4ZmU2Mi4uNGQxYjU4NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTEwLDYgKzEwLDcgQEAKICAgICBBY3Rpdml0eU1hbmFnZXIuY3BwICAgICAgICAgXAogICAgIENyeXB0by5jcHAgICAgICAgICAgICAgICAgICBcCiAgICAgRHJtLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBEcm1TZXNzaW9uTWFuYWdlci5jcHAgICAgICAgXAogICAgIEhEQ1AuY3BwICAgICAgICAgICAgICAgICAgICBcCiAgICAgTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcCAgICAgIFwKICAgICBNZWRpYVBsYXllclNlcnZpY2UuY3BwICAgICAgXApAQCAtMjAsNyArMjEsNiBAQAogICAgIFN0YWdlZnJpZ2h0UGxheWVyLmNwcCAgICAgICBcCiAgICAgU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAgICAgIFwKICAgICBUZXN0UGxheWVyU3R1Yi5jcHAgICAgICAgICAgXAotICAgIFZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwICAgICBcCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gICAgICAgXAogICAgIGxpYmJpbmRlciAgICAgICAgICAgICAgICAgICBcCkBAIC0zMiw2ICszMiw3IEBACiAgICAgbGliZGwgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBsaWJndWkgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGxpYm1lZGlhICAgICAgICAgICAgICAgICAgICBcCisgICAgbGlibWVkaWF1dGlscyAgICAgICAgICAgICAgIFwKICAgICBsaWJzb25pdm94ICAgICAgICAgICAgICAgICAgXAogICAgIGxpYnN0YWdlZnJpZ2h0ICAgICAgICAgICAgICBcCiAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiAgIFwKQEAgLTUzLDYgKzU0LDkgQEAKICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4ICAgICAgICAgICAgICAgICAgXAogICAgICQoVE9QKS9leHRlcm5hbC90cmVtb2xvL1RyZW1vbG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKKwogTE9DQUxfTU9EVUxFOj0gbGlibWVkaWFwbGF5ZXJzZXJ2aWNlCiAKIExPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9DcnlwdG8uY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0NyeXB0by5jcHAKaW5kZXggOGVlN2MwYi4uMTQ3ZDM1ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0NyeXB0by5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0NyeXB0by5jcHAKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgIkNyeXB0by5oIgogCisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9DcnlwdG9BUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgpAQCAtODgsNyArODksNyBAQAogCiAgICAgLy8gZmlyc3QgY2hlY2sgY2FjaGUKICAgICBWZWN0b3I8dWludDhfdD4gdXVpZFZlY3RvcjsKLSAgICB1dWlkVmVjdG9yLmFwcGVuZEFycmF5KHV1aWQsIHNpemVvZih1dWlkKSk7CisgICAgdXVpZFZlY3Rvci5hcHBlbmRBcnJheSh1dWlkLCBzaXplb2YodXVpZFswXSkgKiAxNik7CiAgICAgc3NpemVfdCBpbmRleCA9IG1VVUlEVG9MaWJyYXJ5UGF0aE1hcC5pbmRleE9mS2V5KHV1aWRWZWN0b3IpOwogICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgIGlmIChsb2FkTGlicmFyeUZvclNjaGVtZShtVVVJRFRvTGlicmFyeVBhdGhNYXBbaW5kZXhdLCB1dWlkKSkgewpAQCAtMjM4LDcgKzIzOSw3IEBACiAgICAgICAgIGNvbnN0IHVpbnQ4X3Qga2V5WzE2XSwKICAgICAgICAgY29uc3QgdWludDhfdCBpdlsxNl0sCiAgICAgICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLAotICAgICAgICBjb25zdCB2b2lkICpzcmNQdHIsCisgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZzaGFyZWRCdWZmZXIsIHNpemVfdCBvZmZzZXQsCiAgICAgICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzLCBzaXplX3QgbnVtU3ViU2FtcGxlcywKICAgICAgICAgdm9pZCAqZHN0UHRyLAogICAgICAgICBBU3RyaW5nICplcnJvckRldGFpbE1zZykgewpAQCAtMjUyLDYgKzI1Myw4IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAorICAgIGNvbnN0IHZvaWQgKnNyY1B0ciA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4oc2hhcmVkQnVmZmVyLT5wb2ludGVyKCkpICsgb2Zmc2V0OworCiAgICAgcmV0dXJuIG1QbHVnaW4tPmRlY3J5cHQoCiAgICAgICAgICAgICBzZWN1cmUsIGtleSwgaXYsIG1vZGUsIHNyY1B0ciwgc3ViU2FtcGxlcywgbnVtU3ViU2FtcGxlcywgZHN0UHRyLAogICAgICAgICAgICAgZXJyb3JEZXRhaWxNc2cpOwpAQCAtMjY1LDQgKzI2OCwxNCBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQ3J5cHRvOjpzZXRNZWRpYURybVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgc3RhdHVzX3QgcmVzdWx0ID0gTk9fSU5JVDsKKyAgICBpZiAobUluaXRDaGVjayA9PSBPSyAmJiBtUGx1Z2luICE9IE5VTEwpIHsKKyAgICAgICAgcmVzdWx0ID0gbVBsdWdpbi0+c2V0TWVkaWFEcm1TZXNzaW9uKHNlc3Npb25JZCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQ3J5cHRvLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQ3J5cHRvLmgKaW5kZXggMDAzN2MyZS4uOTllYTk1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0NyeXB0by5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9DcnlwdG8uaApAQCAtNDcsMTIgKzQ3LDE0IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5UmVzb2x1dGlvbih1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFEcm1TZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKTsKKwogICAgIHZpcnR1YWwgc3NpemVfdCBkZWNyeXB0KAogICAgICAgICAgICAgYm9vbCBzZWN1cmUsCiAgICAgICAgICAgICBjb25zdCB1aW50OF90IGtleVsxNl0sCiAgICAgICAgICAgICBjb25zdCB1aW50OF90IGl2WzE2XSwKICAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLAotICAgICAgICAgICAgY29uc3Qgdm9pZCAqc3JjUHRyLAorICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJnNoYXJlZEJ1ZmZlciwgc2l6ZV90IG9mZnNldCwKICAgICAgICAgICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzLCBzaXplX3QgbnVtU3ViU2FtcGxlcywKICAgICAgICAgICAgIHZvaWQgKmRzdFB0ciwKICAgICAgICAgICAgIEFTdHJpbmcgKmVycm9yRGV0YWlsTXNnKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm0uY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5jcHAKaW5kZXggOWQ1YmExNS4uYTdmNmY4YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5jcHAKQEAgLTIzLDYgKzIzLDggQEAKIAogI2luY2x1ZGUgIkRybS5oIgogCisjaW5jbHVkZSAiRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZS5oIgorI2luY2x1ZGUgIkRybVNlc3Npb25NYW5hZ2VyLmgiCiAjaW5jbHVkZSA8bWVkaWEvZHJtL0RybUFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CkBAIC0zMyw2ICszNSwxMCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0YXRpYyBpbmxpbmUgaW50IGdldENhbGxpbmdQaWQoKSB7CisgICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKK30KKwogc3RhdGljIGJvb2wgY2hlY2tQZXJtaXNzaW9uKGNvbnN0IGNoYXIqIHBlcm1pc3Npb25TdHJpbmcpIHsKICNpZm5kZWYgSEFWRV9BTkRST0lEX09TCiAgICAgcmV0dXJuIHRydWU7CkBAIC01OCwxNCArNjQsNDEgQEAKICAgICByZXR1cm4gbWVtY21wKCh2b2lkICopbGhzLmFycmF5KCksICh2b2lkICopcmhzLmFycmF5KCksIHJocy5zaXplKCkpIDwgMDsKIH0KIAorc3RydWN0IERybVNlc3Npb25DbGllbnQgOiBwdWJsaWMgRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZSB7CisgICAgRHJtU2Vzc2lvbkNsaWVudChEcm0qIGRybSkgOiBtRHJtKGRybSkge30KKworICAgIHZpcnR1YWwgYm9vbCByZWNsYWltU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgICAgICBzcDxEcm0+IGRybSA9IG1Ecm0ucHJvbW90ZSgpOworICAgICAgICBpZiAoZHJtID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHN0YXR1c190IGVyciA9IGRybS0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBkcm0tPnNlbmRFdmVudChEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFNlc3Npb25SZWNsYWltZWQsIDAsICZzZXNzaW9uSWQsIE5VTEwpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5Ecm1TZXNzaW9uQ2xpZW50KCkge30KKworcHJpdmF0ZToKKyAgICB3cDxEcm0+IG1Ecm07CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEcm1TZXNzaW9uQ2xpZW50KTsKK307CisKIERybTo6RHJtKCkKICAgICA6IG1Jbml0Q2hlY2soTk9fSU5JVCksCisgICAgICBtRHJtU2Vzc2lvbkNsaWVudChuZXcgRHJtU2Vzc2lvbkNsaWVudCh0aGlzKSksCiAgICAgICBtTGlzdGVuZXIoTlVMTCksCiAgICAgICBtRmFjdG9yeShOVUxMKSwKICAgICAgIG1QbHVnaW4oTlVMTCkgewogfQogCiBEcm06On5Ecm0oKSB7CisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnJlbW92ZURybShtRHJtU2Vzc2lvbkNsaWVudCk7CiAgICAgZGVsZXRlIG1QbHVnaW47CiAgICAgbVBsdWdpbiA9IE5VTEw7CiAgICAgY2xvc2VGYWN0b3J5KCk7CkBAIC0xMDQsMjUgKzEzNyw1NyBAQAogCiAgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKICAgICAgICAgUGFyY2VsIG9iajsKLSAgICAgICAgaWYgKHNlc3Npb25JZCAmJiBzZXNzaW9uSWQtPnNpemUoKSkgewotICAgICAgICAgICAgb2JqLndyaXRlSW50MzIoc2Vzc2lvbklkLT5zaXplKCkpOwotICAgICAgICAgICAgb2JqLndyaXRlKHNlc3Npb25JZC0+YXJyYXkoKSwgc2Vzc2lvbklkLT5zaXplKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb2JqLndyaXRlSW50MzIoMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLT5zaXplKCkpIHsKLSAgICAgICAgICAgIG9iai53cml0ZUludDMyKGRhdGEtPnNpemUoKSk7Ci0gICAgICAgICAgICBvYmoud3JpdGUoZGF0YS0+YXJyYXkoKSwgZGF0YS0+c2l6ZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG9iai53cml0ZUludDMyKDApOwotICAgICAgICB9CisgICAgICAgIHdyaXRlQnl0ZUFycmF5KG9iaiwgc2Vzc2lvbklkKTsKKyAgICAgICAgd3JpdGVCeXRlQXJyYXkob2JqLCBkYXRhKTsKIAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTm90aWZ5TG9jayk7CiAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnkoZXZlbnRUeXBlLCBleHRyYSwgJm9iaik7CiAgICAgfQogfQogCit2b2lkIERybTo6c2VuZEV4cGlyYXRpb25VcGRhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICpzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBleHBpcnlUaW1lSW5NUykKK3sKKyAgICBtRXZlbnRMb2NrLmxvY2soKTsKKyAgICBzcDxJRHJtQ2xpZW50PiBsaXN0ZW5lciA9IG1MaXN0ZW5lcjsKKyAgICBtRXZlbnRMb2NrLnVubG9jaygpOworCisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgUGFyY2VsIG9iajsKKyAgICAgICAgd3JpdGVCeXRlQXJyYXkob2JqLCBzZXNzaW9uSWQpOworICAgICAgICBvYmoud3JpdGVJbnQ2NChleHBpcnlUaW1lSW5NUyk7CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU5vdGlmeUxvY2spOworICAgICAgICBsaXN0ZW5lci0+bm90aWZ5KERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50RXhwaXJhdGlvblVwZGF0ZSwgMCwgJm9iaik7CisgICAgfQorfQorCit2b2lkIERybTo6c2VuZEtleXNDaGFuZ2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICpzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPERybVBsdWdpbjo6S2V5U3RhdHVzPiBjb25zdCAqa2V5U3RhdHVzTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc05ld1VzYWJsZUtleSkKK3sKKyAgICBtRXZlbnRMb2NrLmxvY2soKTsKKyAgICBzcDxJRHJtQ2xpZW50PiBsaXN0ZW5lciA9IG1MaXN0ZW5lcjsKKyAgICBtRXZlbnRMb2NrLnVubG9jaygpOworCisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgUGFyY2VsIG9iajsKKyAgICAgICAgd3JpdGVCeXRlQXJyYXkob2JqLCBzZXNzaW9uSWQpOworCisgICAgICAgIHNpemVfdCBua2V5cyA9IGtleVN0YXR1c0xpc3QtPnNpemUoKTsKKyAgICAgICAgb2JqLndyaXRlSW50MzIoa2V5U3RhdHVzTGlzdC0+c2l6ZSgpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBua2V5czsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBEcm1QbHVnaW46OktleVN0YXR1cyAqa2V5U3RhdHVzID0gJmtleVN0YXR1c0xpc3QtPml0ZW1BdChpKTsKKyAgICAgICAgICAgIHdyaXRlQnl0ZUFycmF5KG9iaiwgJmtleVN0YXR1cy0+bUtleUlkKTsKKyAgICAgICAgICAgIG9iai53cml0ZUludDMyKGtleVN0YXR1cy0+bVR5cGUpOworICAgICAgICB9CisgICAgICAgIG9iai53cml0ZUludDMyKGhhc05ld1VzYWJsZUtleSk7CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU5vdGlmeUxvY2spOworICAgICAgICBsaXN0ZW5lci0+bm90aWZ5KERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50S2V5c0NoYW5nZSwgMCwgJm9iaik7CisgICAgfQorfQorCiAvKgogICogU2VhcmNoIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBmb3IgYSBwbHVnaW4gdGhhdCBzdXBwb3J0cyB0aGUgc2NoZW1lCiAgKiBzcGVjaWZpZWQgYnkgdXVpZApAQCAtMTQ1LDcgKzIxMCw3IEBACiAKICAgICAvLyBmaXJzdCBjaGVjayBjYWNoZQogICAgIFZlY3Rvcjx1aW50OF90PiB1dWlkVmVjdG9yOwotICAgIHV1aWRWZWN0b3IuYXBwZW5kQXJyYXkodXVpZCwgc2l6ZW9mKHV1aWQpKTsKKyAgICB1dWlkVmVjdG9yLmFwcGVuZEFycmF5KHV1aWQsIHNpemVvZih1dWlkWzBdKSAqIDE2KTsKICAgICBzc2l6ZV90IGluZGV4ID0gbVVVSURUb0xpYnJhcnlQYXRoTWFwLmluZGV4T2ZLZXkodXVpZFZlY3Rvcik7CiAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgaWYgKGxvYWRMaWJyYXJ5Rm9yU2NoZW1lKG1VVUlEVG9MaWJyYXJ5UGF0aE1hcFtpbmRleF0sIHV1aWQpKSB7CkBAIC0yOTAsNyArMzU1LDI5IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIHJldHVybiBtUGx1Z2luLT5vcGVuU2Vzc2lvbihzZXNzaW9uSWQpOworICAgIHN0YXR1c190IGVyciA9IG1QbHVnaW4tPm9wZW5TZXNzaW9uKHNlc3Npb25JZCk7CisgICAgaWYgKGVyciA9PSBFUlJPUl9EUk1fUkVTT1VSQ0VfQlVTWSkgeworICAgICAgICBib29sIHJldHJ5ID0gZmFsc2U7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAvLyByZWNsYWltU2Vzc2lvbiBtYXkgY2FsbCBiYWNrIHRvIGNsb3NlU2Vzc2lvbiwgc2luY2UgbUxvY2sgaXMgc2hhcmVkIGJldHdlZW4gRHJtCisgICAgICAgIC8vIGluc3RhbmNlcywgd2Ugc2hvdWxkIHVubG9jayBoZXJlIHRvIGF2b2lkIGRlYWRsb2NrLgorICAgICAgICByZXRyeSA9IERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT5yZWNsYWltU2Vzc2lvbihnZXRDYWxsaW5nUGlkKCkpOworICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtUGx1Z2luID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIGlmIChyZXRyeSkgeworICAgICAgICAgICAgZXJyID0gbVBsdWdpbi0+b3BlblNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT5hZGRTZXNzaW9uKGdldENhbGxpbmdQaWQoKSwgbURybVNlc3Npb25DbGllbnQsIHNlc3Npb25JZCk7CisgICAgfQorICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXR1c190IERybTo6Y2xvc2VTZXNzaW9uKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkKSB7CkBAIC0zMDQsMTQgKzM5MSwxOSBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICByZXR1cm4gbVBsdWdpbi0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgc3RhdHVzX3QgZXJyID0gbVBsdWdpbi0+Y2xvc2VTZXNzaW9uKHNlc3Npb25JZCk7CisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVtb3ZlU2Vzc2lvbihzZXNzaW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0dXNfdCBEcm06OmdldEtleVJlcXVlc3QoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpbml0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZtaW1lVHlwZSwgRHJtUGx1Z2luOjpLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gY29uc3QgJm9wdGlvbmFsUGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnJlcXVlc3QsIFN0cmluZzggJmRlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnJlcXVlc3QsIFN0cmluZzggJmRlZmF1bHRVcmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSAqa2V5UmVxdWVzdFR5cGUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKQEAgLTMyMiw4ICs0MTQsMTEgQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKwogICAgIHJldHVybiBtUGx1Z2luLT5nZXRLZXlSZXF1ZXN0KHNlc3Npb25JZCwgaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsUGFyYW1ldGVycywgcmVxdWVzdCwgZGVmYXVsdFVybCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxQYXJhbWV0ZXJzLCByZXF1ZXN0LCBkZWZhdWx0VXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVJlcXVlc3RUeXBlKTsKIH0KIAogc3RhdHVzX3QgRHJtOjpwcm92aWRlS2V5UmVzcG9uc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCkBAIC0zMzksNiArNDM0LDggQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKwogICAgIHJldHVybiBtUGx1Z2luLT5wcm92aWRlS2V5UmVzcG9uc2Uoc2Vzc2lvbklkLCByZXNwb25zZSwga2V5U2V0SWQpOwogfQogCkBAIC0zNjgsNiArNDY1LDggQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKwogICAgIHJldHVybiBtUGx1Z2luLT5yZXN0b3JlS2V5cyhzZXNzaW9uSWQsIGtleVNldElkKTsKIH0KIApAQCAtMzgzLDYgKzQ4Miw4IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAorICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKICAgICByZXR1cm4gbVBsdWdpbi0+cXVlcnlLZXlTdGF0dXMoc2Vzc2lvbklkLCBpbmZvTWFwKTsKIH0KIApAQCAtNTYyLDYgKzY2Myw4IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAorICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKICAgICByZXR1cm4gbVBsdWdpbi0+c2V0Q2lwaGVyQWxnb3JpdGhtKHNlc3Npb25JZCwgYWxnb3JpdGhtKTsKIH0KIApAQCAtNTc3LDYgKzY4MCw4IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAorICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKICAgICByZXR1cm4gbVBsdWdpbi0+c2V0TWFjQWxnb3JpdGhtKHNlc3Npb25JZCwgYWxnb3JpdGhtKTsKIH0KIApAQCAtNTk1LDYgKzcwMCw4IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAorICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT51c2VTZXNzaW9uKHNlc3Npb25JZCk7CisKICAgICByZXR1cm4gbVBsdWdpbi0+ZW5jcnlwdChzZXNzaW9uSWQsIGtleUlkLCBpbnB1dCwgaXYsIG91dHB1dCk7CiB9CiAKQEAgLTYxMyw2ICs3MjAsOCBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKKyAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOworCiAgICAgcmV0dXJuIG1QbHVnaW4tPmRlY3J5cHQoc2Vzc2lvbklkLCBrZXlJZCwgaW5wdXQsIGl2LCBvdXRwdXQpOwogfQogCkBAIC02MzAsNiArNzM5LDggQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKKwogICAgIHJldHVybiBtUGx1Z2luLT5zaWduKHNlc3Npb25JZCwga2V5SWQsIG1lc3NhZ2UsIHNpZ25hdHVyZSk7CiB9CiAKQEAgLTY0OCw2ICs3NTksOCBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKKyAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOworCiAgICAgcmV0dXJuIG1QbHVnaW4tPnZlcmlmeShzZXNzaW9uSWQsIGtleUlkLCBtZXNzYWdlLCBzaWduYXR1cmUsIG1hdGNoKTsKIH0KIApAQCAtNjcwLDEwICs3ODMsMTIgQEAKICAgICAgICAgcmV0dXJuIC1FUEVSTTsKICAgICB9CiAKKyAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+dXNlU2Vzc2lvbihzZXNzaW9uSWQpOworCiAgICAgcmV0dXJuIG1QbHVnaW4tPnNpZ25SU0Eoc2Vzc2lvbklkLCBhbGdvcml0aG0sIG1lc3NhZ2UsIHdyYXBwZWRLZXksIHNpZ25hdHVyZSk7CiB9CiAKLXZvaWQgRHJtOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ0aGVfbGF0ZV93aG8pCit2b2lkIERybTo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmdGhlX2xhdGVfd2hvIF9fdW51c2VkKQogewogICAgIG1FdmVudExvY2subG9jaygpOwogICAgIG1MaXN0ZW5lci5jbGVhcigpOwpAQCAtNjg1LDQgKzgwMCwxNCBAQAogICAgIGNsb3NlRmFjdG9yeSgpOwogfQogCit2b2lkIERybTo6d3JpdGVCeXRlQXJyYXkoUGFyY2VsICZvYmosIFZlY3Rvcjx1aW50OF90PiBjb25zdCAqYXJyYXkpCit7CisgICAgaWYgKGFycmF5ICYmIGFycmF5LT5zaXplKCkpIHsKKyAgICAgICAgb2JqLndyaXRlSW50MzIoYXJyYXktPnNpemUoKSk7CisgICAgICAgIG9iai53cml0ZShhcnJheS0+YXJyYXkoKSwgYXJyYXktPnNpemUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb2JqLndyaXRlSW50MzIoMCk7CisgICAgfQorfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybS5oCmluZGV4IDI5OTdkYTEuLjA1NjcyM2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm0uaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRHJtLmgKQEAgLTI2LDggKzI2LDkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgRHJtRmFjdG9yeTsKLXN0cnVjdCBEcm1QbHVnaW47CitjbGFzcyBEcm1GYWN0b3J5OworY2xhc3MgRHJtUGx1Z2luOworc3RydWN0IERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U7CiAKIHN0cnVjdCBEcm0gOiBwdWJsaWMgQm5Ecm0sCiAgICAgICAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LApAQCAtNTIsNyArNTMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5pdERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmbWltZVR5cGUsIERybVBsdWdpbjo6S2V5VHlwZSBrZXlUeXBlLAogICAgICAgICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGNvbnN0ICZvcHRpb25hbFBhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZyZXF1ZXN0LCBTdHJpbmc4ICZkZWZhdWx0VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnJlcXVlc3QsIFN0cmluZzggJmRlZmF1bHRVcmwsCisgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpLZXlSZXF1ZXN0VHlwZSAqa2V5UmVxdWVzdFR5cGUpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcm92aWRlS2V5UmVzcG9uc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZyZXNwb25zZSwKQEAgLTEzMSw2ICsxMzMsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAqc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICpkYXRhKTsKIAorICAgIHZpcnR1YWwgdm9pZCBzZW5kRXhwaXJhdGlvblVwZGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QgKnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBleHBpcnlUaW1lSW5NUyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VuZEtleXNDaGFuZ2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICpzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvcjxEcm1QbHVnaW46OktleVN0YXR1cz4gY29uc3QgKmtleVN0YXR1c0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzTmV3VXNhYmxlS2V5KTsKKwogICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ0aGVfbGF0ZV93aG8pOwogCiBwcml2YXRlOgpAQCAtMTM4LDYgKzE0Nyw4IEBACiAKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogCisgICAgc3A8RHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZT4gbURybVNlc3Npb25DbGllbnQ7CisKICAgICBzcDxJRHJtQ2xpZW50PiBtTGlzdGVuZXI7CiAgICAgbXV0YWJsZSBNdXRleCBtRXZlbnRMb2NrOwogICAgIG11dGFibGUgTXV0ZXggbU5vdGlmeUxvY2s7CkBAIC0xNTMsNyArMTY0LDcgQEAKICAgICB2b2lkIGZpbmRGYWN0b3J5Rm9yU2NoZW1lKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pOwogICAgIGJvb2wgbG9hZExpYnJhcnlGb3JTY2hlbWUoY29uc3QgU3RyaW5nOCAmcGF0aCwgY29uc3QgdWludDhfdCB1dWlkWzE2XSk7CiAgICAgdm9pZCBjbG9zZUZhY3RvcnkoKTsKLQorICAgIHZvaWQgd3JpdGVCeXRlQXJyYXkoUGFyY2VsICZvYmosIFZlY3Rvcjx1aW50OF90PiBjb25zdCAqYXJyYXkpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybVNlc3Npb25DbGllbnRJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2ZhZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybVNlc3Npb25DbGllbnRJbnRlcmZhY2UuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBEUk1fUFJPWFlfSU5URVJGQUNFX0hfCisjZGVmaW5lIERSTV9QUk9YWV9JTlRFUkZBQ0VfSF8KKworI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZSA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICB2aXJ0dWFsIGJvb2wgcmVjbGFpbVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpID0gMDsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkRybVNlc3Npb25DbGllbnRJbnRlcmZhY2UoKSB7fQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBEUk1fUFJPWFlfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRHJtU2Vzc2lvbk1hbmFnZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybVNlc3Npb25NYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDFmODgxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RybVNlc3Npb25NYW5hZ2VyLmNwcApAQCAtMCwwICsxLDI0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRHJtU2Vzc2lvbk1hbmFnZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJEcm1TZXNzaW9uTWFuYWdlci5oIgorCisjaW5jbHVkZSAiRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZS5oIgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JUHJvY2Vzc0luZm9TZXJ2aWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBTdHJpbmc4IEdldFNlc3Npb25JZFN0cmluZyhjb25zdCBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCkgeworICAgIFN0cmluZzggc2Vzc2lvbklkU3RyOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2Vzc2lvbklkLnNpemUoKTsgKytpKSB7CisgICAgICAgIHNlc3Npb25JZFN0ci5hcHBlbmRGb3JtYXQoIiV1ICIsIHNlc3Npb25JZFtpXSk7CisgICAgfQorICAgIHJldHVybiBzZXNzaW9uSWRTdHI7Cit9CisKK2Jvb2wgaXNFcXVhbFNlc3Npb25JZChjb25zdCBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZDEsIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkMikgeworICAgIGlmIChzZXNzaW9uSWQxLnNpemUoKSAhPSBzZXNzaW9uSWQyLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2Vzc2lvbklkMS5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoc2Vzc2lvbklkMVtpXSAhPSBzZXNzaW9uSWQyW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3NwPERybVNlc3Npb25NYW5hZ2VyPiBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKSB7CisgICAgc3RhdGljIHNwPERybVNlc3Npb25NYW5hZ2VyPiBkcm1TZXNzaW9uTWFuYWdlciA9IG5ldyBEcm1TZXNzaW9uTWFuYWdlcigpOworICAgIHJldHVybiBkcm1TZXNzaW9uTWFuYWdlcjsKK30KKworRHJtU2Vzc2lvbk1hbmFnZXI6OkRybVNlc3Npb25NYW5hZ2VyKCkKKyAgICA6IG1Qcm9jZXNzSW5mbyhuZXcgUHJvY2Vzc0luZm8oKSksCisgICAgICBtVGltZSgwKSB7fQorCitEcm1TZXNzaW9uTWFuYWdlcjo6RHJtU2Vzc2lvbk1hbmFnZXIoc3A8UHJvY2Vzc0luZm9JbnRlcmZhY2U+IHByb2Nlc3NJbmZvKQorICAgIDogbVByb2Nlc3NJbmZvKHByb2Nlc3NJbmZvKSwKKyAgICAgIG1UaW1lKDApIHt9CisKK0RybVNlc3Npb25NYW5hZ2VyOjp+RHJtU2Vzc2lvbk1hbmFnZXIoKSB7fQorCit2b2lkIERybVNlc3Npb25NYW5hZ2VyOjphZGRTZXNzaW9uKAorICAgICAgICBpbnQgcGlkLCBzcDxEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlPiBkcm0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKSB7CisgICAgQUxPR1YoImFkZFNlc3Npb24ocGlkICVkLCBkcm0gJXAsIHNlc3Npb25JZCAlcykiLCBwaWQsIGRybS5nZXQoKSwKKyAgICAgICAgICAgIEdldFNlc3Npb25JZFN0cmluZyhzZXNzaW9uSWQpLnN0cmluZygpKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBTZXNzaW9uSW5mbyBpbmZvOworICAgIGluZm8uZHJtID0gZHJtOworICAgIGluZm8uc2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgIGluZm8udGltZVN0YW1wID0gZ2V0VGltZV9sKCk7CisgICAgc3NpemVfdCBpbmRleCA9IG1TZXNzaW9uTWFwLmluZGV4T2ZLZXkocGlkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIC8vIG5ldyBwaWQKKyAgICAgICAgU2Vzc2lvbkluZm9zIGluZm9zRm9yUGlkOworICAgICAgICBpbmZvc0ZvclBpZC5wdXNoX2JhY2soaW5mbyk7CisgICAgICAgIG1TZXNzaW9uTWFwLmFkZChwaWQsIGluZm9zRm9yUGlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2Vzc2lvbk1hcC5lZGl0VmFsdWVBdChpbmRleCkucHVzaF9iYWNrKGluZm8pOworICAgIH0KK30KKwordm9pZCBEcm1TZXNzaW9uTWFuYWdlcjo6dXNlU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCkgeworICAgIEFMT0dWKCJ1c2VTZXNzaW9uKCVzKSIsIEdldFNlc3Npb25JZFN0cmluZyhzZXNzaW9uSWQpLnN0cmluZygpKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TZXNzaW9uTWFwLnNpemUoKTsgKytpKSB7CisgICAgICAgIFNlc3Npb25JbmZvcyYgaW5mb3MgPSBtU2Vzc2lvbk1hcC5lZGl0VmFsdWVBdChpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpbmZvcy5zaXplKCk7ICsraikgeworICAgICAgICAgICAgU2Vzc2lvbkluZm8mIGluZm8gPSBpbmZvcy5lZGl0SXRlbUF0KGopOworICAgICAgICAgICAgaWYgKGlzRXF1YWxTZXNzaW9uSWQoc2Vzc2lvbklkLCBpbmZvLnNlc3Npb25JZCkpIHsKKyAgICAgICAgICAgICAgICBpbmZvLnRpbWVTdGFtcCA9IGdldFRpbWVfbCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBEcm1TZXNzaW9uTWFuYWdlcjo6cmVtb3ZlU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCkgeworICAgIEFMT0dWKCJyZW1vdmVTZXNzaW9uKCVzKSIsIEdldFNlc3Npb25JZFN0cmluZyhzZXNzaW9uSWQpLnN0cmluZygpKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TZXNzaW9uTWFwLnNpemUoKTsgKytpKSB7CisgICAgICAgIFNlc3Npb25JbmZvcyYgaW5mb3MgPSBtU2Vzc2lvbk1hcC5lZGl0VmFsdWVBdChpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpbmZvcy5zaXplKCk7ICsraikgeworICAgICAgICAgICAgaWYgKGlzRXF1YWxTZXNzaW9uSWQoc2Vzc2lvbklkLCBpbmZvc1tqXS5zZXNzaW9uSWQpKSB7CisgICAgICAgICAgICAgICAgaW5mb3MucmVtb3ZlQXQoaik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIERybVNlc3Npb25NYW5hZ2VyOjpyZW1vdmVEcm0oc3A8RHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZT4gZHJtKSB7CisgICAgQUxPR1YoInJlbW92ZURybSglcCkiLCBkcm0uZ2V0KCkpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TZXNzaW9uTWFwLnNpemUoKTsgKytpKSB7CisgICAgICAgIFNlc3Npb25JbmZvcyYgaW5mb3MgPSBtU2Vzc2lvbk1hcC5lZGl0VmFsdWVBdChpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpbmZvcy5zaXplKCk7KSB7CisgICAgICAgICAgICBpZiAoaW5mb3Nbal0uZHJtID09IGRybSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJyZW1vdmVkIHNlc3Npb24gKCVzKSIsIEdldFNlc3Npb25JZFN0cmluZyhpbmZvc1tqXS5zZXNzaW9uSWQpLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBqID0gaW5mb3MucmVtb3ZlQXQoaik7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2o7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBEcm1TZXNzaW9uTWFuYWdlcjo6cmVjbGFpbVNlc3Npb24oaW50IGNhbGxpbmdQaWQpIHsKKyAgICBBTE9HVigicmVjbGFpbVNlc3Npb24oJWQpIiwgY2FsbGluZ1BpZCk7CisKKyAgICBzcDxEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlPiBkcm07CisgICAgVmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDsKKyAgICBpbnQgbG93ZXN0UHJpb3JpdHlQaWQ7CisgICAgaW50IGxvd2VzdFByaW9yaXR5OworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgICAgICBpbnQgY2FsbGluZ1ByaW9yaXR5OworICAgICAgICBpZiAoIW1Qcm9jZXNzSW5mby0+Z2V0UHJpb3JpdHkoY2FsbGluZ1BpZCwgJmNhbGxpbmdQcmlvcml0eSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWdldExvd2VzdFByaW9yaXR5X2woJmxvd2VzdFByaW9yaXR5UGlkLCAmbG93ZXN0UHJpb3JpdHkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxvd2VzdFByaW9yaXR5IDw9IGNhbGxpbmdQcmlvcml0eSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFnZXRMZWFzdFVzZWRTZXNzaW9uX2wobG93ZXN0UHJpb3JpdHlQaWQsICZkcm0sICZzZXNzaW9uSWQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFMT0dWKCJyZWNsYWltIHNlc3Npb24oJXMpIG9wZW5lZCBieSBwaWQgJWQiLAorICAgICAgICAgICAgR2V0U2Vzc2lvbklkU3RyaW5nKHNlc3Npb25JZCkuc3RyaW5nKCksIGxvd2VzdFByaW9yaXR5UGlkKTsKKworICAgIHJldHVybiBkcm0tPnJlY2xhaW1TZXNzaW9uKHNlc3Npb25JZCk7Cit9CisKK2ludDY0X3QgRHJtU2Vzc2lvbk1hbmFnZXI6OmdldFRpbWVfbCgpIHsKKyAgICByZXR1cm4gbVRpbWUrKzsKK30KKworYm9vbCBEcm1TZXNzaW9uTWFuYWdlcjo6Z2V0TG93ZXN0UHJpb3JpdHlfbChpbnQqIGxvd2VzdFByaW9yaXR5UGlkLCBpbnQqIGxvd2VzdFByaW9yaXR5KSB7CisgICAgaW50IHBpZCA9IC0xOworICAgIGludCBwcmlvcml0eSA9IC0xOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNlc3Npb25NYXAuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKG1TZXNzaW9uTWFwLnZhbHVlQXQoaSkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIC8vIG5vIG9wZW5lZCBzZXNzaW9uIGJ5IHRoaXMgcHJvY2Vzcy4KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGludCB0ZW1wUGlkID0gbVNlc3Npb25NYXAua2V5QXQoaSk7CisgICAgICAgIGludCB0ZW1wUHJpb3JpdHk7CisgICAgICAgIGlmICghbVByb2Nlc3NJbmZvLT5nZXRQcmlvcml0eSh0ZW1wUGlkLCAmdGVtcFByaW9yaXR5KSkgeworICAgICAgICAgICAgLy8gc2hvdWxkbid0IGhhcHBlbi4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGlkID09IC0xKSB7CisgICAgICAgICAgICBwaWQgPSB0ZW1wUGlkOworICAgICAgICAgICAgcHJpb3JpdHkgPSB0ZW1wUHJpb3JpdHk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAodGVtcFByaW9yaXR5ID4gcHJpb3JpdHkpIHsKKyAgICAgICAgICAgICAgICBwaWQgPSB0ZW1wUGlkOworICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gdGVtcFByaW9yaXR5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChwaWQgIT0gLTEpIHsKKyAgICAgICAgKmxvd2VzdFByaW9yaXR5UGlkID0gcGlkOworICAgICAgICAqbG93ZXN0UHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICB9CisgICAgcmV0dXJuIChwaWQgIT0gLTEpOworfQorCitib29sIERybVNlc3Npb25NYW5hZ2VyOjpnZXRMZWFzdFVzZWRTZXNzaW9uX2woCisgICAgICAgIGludCBwaWQsIHNwPERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U+KiBkcm0sIFZlY3Rvcjx1aW50OF90Piogc2Vzc2lvbklkKSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1TZXNzaW9uTWFwLmluZGV4T2ZLZXkocGlkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQgbGVhc3RVc2VkSW5kZXggPSAtMTsKKyAgICBpbnQ2NF90IG1pblRzID0gTExPTkdfTUFYOworICAgIGNvbnN0IFNlc3Npb25JbmZvcyYgaW5mb3MgPSBtU2Vzc2lvbk1hcC52YWx1ZUF0KGluZGV4KTsKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGluZm9zLnNpemUoKTsgKytqKSB7CisgICAgICAgIGlmIChsZWFzdFVzZWRJbmRleCA9PSAtMSkgeworICAgICAgICAgICAgbGVhc3RVc2VkSW5kZXggPSBqOworICAgICAgICAgICAgbWluVHMgPSBpbmZvc1tqXS50aW1lU3RhbXA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaW5mb3Nbal0udGltZVN0YW1wIDwgbWluVHMpIHsKKyAgICAgICAgICAgICAgICBsZWFzdFVzZWRJbmRleCA9IGo7CisgICAgICAgICAgICAgICAgbWluVHMgPSBpbmZvc1tqXS50aW1lU3RhbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGxlYXN0VXNlZEluZGV4ICE9IC0xKSB7CisgICAgICAgICpkcm0gPSBpbmZvc1tsZWFzdFVzZWRJbmRleF0uZHJtOworICAgICAgICAqc2Vzc2lvbklkID0gaW5mb3NbbGVhc3RVc2VkSW5kZXhdLnNlc3Npb25JZDsKKyAgICB9CisgICAgcmV0dXJuIChsZWFzdFVzZWRJbmRleCAhPSAtMSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRHJtU2Vzc2lvbk1hbmFnZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9Ecm1TZXNzaW9uTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNWMyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRHJtU2Vzc2lvbk1hbmFnZXIuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBEUk1fU0VTU0lPTl9NQU5BR0VSX0hfCisKKyNkZWZpbmUgRFJNX1NFU1NJT05fTUFOQUdFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEcm1TZXNzaW9uTWFuYWdlclRlc3Q7CitzdHJ1Y3QgRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZTsKK3N0cnVjdCBQcm9jZXNzSW5mb0ludGVyZmFjZTsKKworYm9vbCBpc0VxdWFsU2Vzc2lvbklkKGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkMSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQyKTsKKworc3RydWN0IFNlc3Npb25JbmZvIHsKKyAgICBzcDxEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlPiBkcm07CisgICAgVmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDsKKyAgICBpbnQ2NF90IHRpbWVTdGFtcDsKK307CisKK3R5cGVkZWYgVmVjdG9yPFNlc3Npb25JbmZvID4gU2Vzc2lvbkluZm9zOwordHlwZWRlZiBLZXllZFZlY3RvcjxpbnQsIFNlc3Npb25JbmZvcyA+IFBpZFNlc3Npb25JbmZvc01hcDsKKworc3RydWN0IERybVNlc3Npb25NYW5hZ2VyIDogcHVibGljIFJlZkJhc2UgeworICAgIHN0YXRpYyBzcDxEcm1TZXNzaW9uTWFuYWdlcj4gSW5zdGFuY2UoKTsKKworICAgIERybVNlc3Npb25NYW5hZ2VyKCk7CisgICAgRHJtU2Vzc2lvbk1hbmFnZXIoc3A8UHJvY2Vzc0luZm9JbnRlcmZhY2U+IHByb2Nlc3NJbmZvKTsKKworICAgIHZvaWQgYWRkU2Vzc2lvbihpbnQgcGlkLCBzcDxEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlPiBkcm0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKKyAgICB2b2lkIHVzZVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworICAgIHZvaWQgcmVtb3ZlU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCk7CisgICAgdm9pZCByZW1vdmVEcm0oc3A8RHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZT4gZHJtKTsKKyAgICBib29sIHJlY2xhaW1TZXNzaW9uKGludCBjYWxsaW5nUGlkKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkRybVNlc3Npb25NYW5hZ2VyKCk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIERybVNlc3Npb25NYW5hZ2VyVGVzdDsKKworICAgIGludDY0X3QgZ2V0VGltZV9sKCk7CisgICAgYm9vbCBnZXRMb3dlc3RQcmlvcml0eV9sKGludCogbG93ZXN0UHJpb3JpdHlQaWQsIGludCogbG93ZXN0UHJpb3JpdHkpOworICAgIGJvb2wgZ2V0TGVhc3RVc2VkU2Vzc2lvbl9sKAorICAgICAgICAgICAgaW50IHBpZCwgc3A8RHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZT4qIGRybSwgVmVjdG9yPHVpbnQ4X3Q+KiBzZXNzaW9uSWQpOworCisgICAgc3A8UHJvY2Vzc0luZm9JbnRlcmZhY2U+IG1Qcm9jZXNzSW5mbzsKKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworICAgIFBpZFNlc3Npb25JbmZvc01hcCBtU2Vzc2lvbk1hcDsKKyAgICBpbnQ2NF90IG1UaW1lOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtU2Vzc2lvbk1hbmFnZXIpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBEUk1fU0VTU0lPTl9NQU5BR0VSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwCmluZGV4IDQ4ODg0YjkuLmQ1ZDEyZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwCkBAIC03MCwxMiArNzAsNiBAQAogICAgICAgICByZXR1cm4gU1RBR0VGUklHSFRfUExBWUVSOwogICAgIH0KIAotICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIEVYUEVSSU1FTlRBTCBkZXZlbG9wZXIgc2V0dGluZ3MgcHJvcGVydHkKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJwZXJzaXN0LnN5cy5tZWRpYS51c2UtYXdlc29tZSIsIHZhbHVlLCBOVUxMKQotICAgICAgICAgICAgJiYgIXN0cmNhc2VjbXAoInRydWUiLCB2YWx1ZSkpIHsKLSAgICAgICAgcmV0dXJuIFNUQUdFRlJJR0hUX1BMQVlFUjsKLSAgICB9Ci0KICAgICByZXR1cm4gTlVfUExBWUVSOwogfQogCkBAIC0xMzEsMTIgKzEyNSwxOCBAQAogICAgIEdFVF9QTEFZRVJfVFlQRV9JTVBMKGNsaWVudCwgc291cmNlKTsKIH0KIAorcGxheWVyX3R5cGUgTWVkaWFQbGF5ZXJGYWN0b3J5OjpnZXRQbGF5ZXJUeXBlKGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKSB7CisgICAgR0VUX1BMQVlFUl9UWVBFX0lNUEwoY2xpZW50LCBzb3VyY2UpOworfQorCiAjdW5kZWYgR0VUX1BMQVlFUl9UWVBFX0lNUEwKIAogc3A8TWVkaWFQbGF5ZXJCYXNlPiBNZWRpYVBsYXllckZhY3Rvcnk6OmNyZWF0ZVBsYXllcigKICAgICAgICAgcGxheWVyX3R5cGUgcGxheWVyVHlwZSwKICAgICAgICAgdm9pZCogY29va2llLAotICAgICAgICBub3RpZnlfY2FsbGJhY2tfZiBub3RpZnlGdW5jKSB7CisgICAgICAgIG5vdGlmeV9jYWxsYmFja19mIG5vdGlmeUZ1bmMsCisgICAgICAgIHBpZF90IHBpZCkgewogICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gcDsKICAgICBJRmFjdG9yeSogZmFjdG9yeTsKICAgICBzdGF0dXNfdCBpbml0X3Jlc3VsdDsKQEAgLTE1MCw3ICsxNTAsNyBAQAogCiAgICAgZmFjdG9yeSA9IHNGYWN0b3J5TWFwLnZhbHVlRm9yKHBsYXllclR5cGUpOwogICAgIENIRUNLKE5VTEwgIT0gZmFjdG9yeSk7Ci0gICAgcCA9IGZhY3RvcnktPmNyZWF0ZVBsYXllcigpOworICAgIHAgPSBmYWN0b3J5LT5jcmVhdGVQbGF5ZXIocGlkKTsKIAogICAgIGlmIChwID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgcGxheWVyIG9iamVjdCBvZiB0eXBlICVkLCBjcmVhdGUgZmFpbGVkIiwKQEAgLTIxOCw3ICsyMTgsNyBAQAogICAgICAgICByZXR1cm4gMC4wOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3A8TWVkaWFQbGF5ZXJCYXNlPiBjcmVhdGVQbGF5ZXIoKSB7CisgICAgdmlydHVhbCBzcDxNZWRpYVBsYXllckJhc2U+IGNyZWF0ZVBsYXllcihwaWRfdCAvKiBwaWQgKi8pIHsKICAgICAgICAgQUxPR1YoIiBjcmVhdGUgU3RhZ2VmcmlnaHRQbGF5ZXIiKTsKICAgICAgICAgcmV0dXJuIG5ldyBTdGFnZWZyaWdodFBsYXllcigpOwogICAgIH0KQEAgLTI3Myw5ICsyNzMsMTYgQEAKICAgICAgICAgcmV0dXJuIDEuMDsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHNwPE1lZGlhUGxheWVyQmFzZT4gY3JlYXRlUGxheWVyKCkgeworICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIC8qY2xpZW50Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4mIC8qc291cmNlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgLypjdXJTY29yZSovKSB7CisgICAgICAgIC8vIE9ubHkgTnVQbGF5ZXIgc3VwcG9ydHMgc2V0dGluZyBhIERhdGFTb3VyY2Ugc291cmNlIGRpcmVjdGx5LgorICAgICAgICByZXR1cm4gMS4wOworICAgIH0KKworICAgIHZpcnR1YWwgc3A8TWVkaWFQbGF5ZXJCYXNlPiBjcmVhdGVQbGF5ZXIocGlkX3QgcGlkKSB7CiAgICAgICAgIEFMT0dWKCIgY3JlYXRlIE51UGxheWVyIik7Ci0gICAgICAgIHJldHVybiBuZXcgTnVQbGF5ZXJEcml2ZXI7CisgICAgICAgIHJldHVybiBuZXcgTnVQbGF5ZXJEcml2ZXIocGlkKTsKICAgICB9CiB9OwogCkBAIC0yOTEsNyArMjk4LDcgQEAKICAgICAgICAgcmV0dXJuIDAuMDsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHNwPE1lZGlhUGxheWVyQmFzZT4gY3JlYXRlUGxheWVyKCkgeworICAgIHZpcnR1YWwgc3A8TWVkaWFQbGF5ZXJCYXNlPiBjcmVhdGVQbGF5ZXIocGlkX3QgLyogcGlkICovKSB7CiAgICAgICAgIEFMT0dWKCJDcmVhdGUgVGVzdCBQbGF5ZXIgc3R1YiIpOwogICAgICAgICByZXR1cm4gbmV3IFRlc3RQbGF5ZXJTdHViKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5oCmluZGV4IDU1ZmY5MTguLmUyMmE1NmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJGYWN0b3J5LmgKQEAgLTQzLDcgKzQzLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICYvKnNvdXJjZSovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAvKmN1clNjb3JlKi8pIHsgcmV0dXJuIDAuMDsgfQogCi0gICAgICAgIHZpcnR1YWwgc3A8TWVkaWFQbGF5ZXJCYXNlPiBjcmVhdGVQbGF5ZXIoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgZmxvYXQgc2NvcmVGYWN0b3J5KGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIC8qY2xpZW50Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICYvKnNvdXJjZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAvKmN1clNjb3JlKi8pIHsgcmV0dXJuIDAuMDsgfQorCisgICAgICAgIHZpcnR1YWwgc3A8TWVkaWFQbGF5ZXJCYXNlPiBjcmVhdGVQbGF5ZXIocGlkX3QgcGlkKSA9IDA7CiAgICAgfTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCByZWdpc3RlckZhY3RvcnkoSUZhY3RvcnkqIGZhY3RvcnksCkBAIC01NywxMCArNjEsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGxlbmd0aCk7CiAgICAgc3RhdGljIHBsYXllcl90eXBlIGdldFBsYXllclR5cGUoY29uc3Qgc3A8SU1lZGlhUGxheWVyPiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpOworICAgIHN0YXRpYyBwbGF5ZXJfdHlwZSBnZXRQbGF5ZXJUeXBlKGNvbnN0IHNwPElNZWRpYVBsYXllcj4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKIAogICAgIHN0YXRpYyBzcDxNZWRpYVBsYXllckJhc2U+IGNyZWF0ZVBsYXllcihwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb29raWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeV9jYWxsYmFja19mIG5vdGlmeUZ1bmMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlfY2FsbGJhY2tfZiBub3RpZnlGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQpOwogCiAgICAgc3RhdGljIHZvaWQgcmVnaXN0ZXJCdWlsdGluRmFjdG9yaWVzKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggZDIzNzcyNi4uNGI0MGI5OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTM0LDcgKzM0LDYgQEAKIAogI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KIAotI2luY2x1ZGUgPGJpbmRlci9JQmF0dGVyeVN0YXRzLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgpAQCAtNDYsNiArNDUsNyBAQAogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSVJlbW90ZURpc3BsYXlDbGllbnQuaD4KQEAgLTYwLDYgKzYwLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9CYXR0ZXJ5Tm90aWZpZXIuaD4KIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCkBAIC0yODgsMTYgKzI4OSw5IEBACiAgICAgLy8gcmVzZXQgYmF0dGVyeSBzdGF0cwogICAgIC8vIGlmIHRoZSBtZWRpYXNlcnZlciBoYXMgY3Jhc2hlZCwgYmF0dGVyeSBzdGF0cyBjb3VsZCBiZSBsZWZ0CiAgICAgLy8gaW4gYmFkIHN0YXRlLCByZXNldCB0aGUgc3RhdGUgdXBvbiBzZXJ2aWNlIHN0YXJ0LgotICAgIGNvbnN0IHNwPElTZXJ2aWNlTWFuYWdlcj4gc20oZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCkpOwotICAgIGlmIChzbSAhPSBOVUxMKSB7Ci0gICAgICAgIGNvbnN0IFN0cmluZzE2IG5hbWUoImJhdHRlcnlzdGF0cyIpOwotICAgICAgICBzcDxJQmF0dGVyeVN0YXRzPiBiYXR0ZXJ5U3RhdHMgPQotICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElCYXR0ZXJ5U3RhdHM+KHNtLT5nZXRTZXJ2aWNlKG5hbWUpKTsKLSAgICAgICAgaWYgKGJhdHRlcnlTdGF0cyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBiYXR0ZXJ5U3RhdHMtPm5vdGVSZXNldFZpZGVvKCk7Ci0gICAgICAgICAgICBiYXR0ZXJ5U3RhdHMtPm5vdGVSZXNldEF1ZGlvKCk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgQmF0dGVyeU5vdGlmaWVyJiBub3RpZmllcihCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkpOworICAgIG5vdGlmaWVyLm5vdGVSZXNldFZpZGVvKCk7CisgICAgbm90aWZpZXIubm90ZVJlc2V0QXVkaW8oKTsKIAogICAgIE1lZGlhUGxheWVyRmFjdG9yeTo6cmVnaXN0ZXJCdWlsdGluRmFjdG9yaWVzKCk7CiB9CkBAIC0zMDcsMTAgKzMwMSwxMCBAQAogICAgIEFMT0dWKCJNZWRpYVBsYXllclNlcnZpY2UgZGVzdHJveWVkIik7CiB9CiAKLXNwPElNZWRpYVJlY29yZGVyPiBNZWRpYVBsYXllclNlcnZpY2U6OmNyZWF0ZU1lZGlhUmVjb3JkZXIoKQorc3A8SU1lZGlhUmVjb3JkZXI+IE1lZGlhUGxheWVyU2VydmljZTo6Y3JlYXRlTWVkaWFSZWNvcmRlcihjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSkKIHsKICAgICBwaWRfdCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgc3A8TWVkaWFSZWNvcmRlckNsaWVudD4gcmVjb3JkZXIgPSBuZXcgTWVkaWFSZWNvcmRlckNsaWVudCh0aGlzLCBwaWQpOworICAgIHNwPE1lZGlhUmVjb3JkZXJDbGllbnQ+IHJlY29yZGVyID0gbmV3IE1lZGlhUmVjb3JkZXJDbGllbnQodGhpcywgcGlkLCBvcFBhY2thZ2VOYW1lKTsKICAgICB3cDxNZWRpYVJlY29yZGVyQ2xpZW50PiB3ID0gcmVjb3JkZXI7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIG1NZWRpYVJlY29yZGVyQ2xpZW50cy5hZGQodyk7CkBAIC0zODEsMTIgKzM3NSwxMyBAQAogfQogCiBzcDxJUmVtb3RlRGlzcGxheT4gTWVkaWFQbGF5ZXJTZXJ2aWNlOjpsaXN0ZW5Gb3JSZW1vdGVEaXNwbGF5KAorICAgICAgICBjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSwKICAgICAgICAgY29uc3Qgc3A8SVJlbW90ZURpc3BsYXlDbGllbnQ+JiBjbGllbnQsIGNvbnN0IFN0cmluZzgmIGlmYWNlKSB7CiAgICAgaWYgKCFjaGVja1Blcm1pc3Npb24oImFuZHJvaWQucGVybWlzc2lvbi5DT05UUk9MX1dJRklfRElTUExBWSIpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIHJldHVybiBuZXcgUmVtb3RlRGlzcGxheShjbGllbnQsIGlmYWNlLnN0cmluZygpKTsKKyAgICByZXR1cm4gbmV3IFJlbW90ZURpc3BsYXkob3BQYWNrYWdlTmFtZSwgY2xpZW50LCBpZmFjZS5zdHJpbmcoKSk7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdApAQCAtNDEzLDcgKzQwOCw3IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0CitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07CkBAIC00NDIsNiArNDM3LDkgQEAKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBTb3J0ZWRWZWN0b3I8IHNwPENsaWVudD4gPiBjbGllbnRzOyAvL3RvIHNlcmlhbGlzZSB0aGUgbXV0ZXggdW5sb2NrICYgY2xpZW50IGRlc3RydWN0aW9uLgorICAgIFNvcnRlZFZlY3Rvcjwgc3A8TWVkaWFSZWNvcmRlckNsaWVudD4gPiBtZWRpYVJlY29yZGVyQ2xpZW50czsKKwogICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpKSA9PSBmYWxzZSkgewogICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJQZXJtaXNzaW9uIERlbmlhbDogIgogICAgICAgICAgICAgICAgICJjYW4ndCBkdW1wIE1lZGlhUGxheWVyU2VydmljZSBmcm9tIHBpZD0lZCwgdWlkPSVkXG4iLApAQCAtNDUzLDYgKzQ1MSw3IEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwLCBuID0gbUNsaWVudHMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICAgICBzcDxDbGllbnQ+IGMgPSBtQ2xpZW50c1tpXS5wcm9tb3RlKCk7CiAgICAgICAgICAgICBpZiAoYyAhPSAwKSBjLT5kdW1wKGZkLCBhcmdzKTsKKyAgICAgICAgICAgIGNsaWVudHMuYWRkKGMpOwogICAgICAgICB9CiAgICAgICAgIGlmIChtTWVkaWFSZWNvcmRlckNsaWVudHMuc2l6ZSgpID09IDApIHsKICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgTm8gbWVkaWEgcmVjb3JkZXIgY2xpZW50XG5cbiIpOwpAQCAtNDY1LDYgKzQ2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAiXG4iOwogICAgICAgICAgICAgICAgICAgICBjLT5kdW1wKGZkLCBhcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFSZWNvcmRlckNsaWVudHMuYWRkKGMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjQwLDcgKzY0MCw3IEBACiAgICAgICAgIHAuY2xlYXIoKTsKICAgICB9CiAgICAgaWYgKHAgPT0gTlVMTCkgewotICAgICAgICBwID0gTWVkaWFQbGF5ZXJGYWN0b3J5OjpjcmVhdGVQbGF5ZXIocGxheWVyVHlwZSwgdGhpcywgbm90aWZ5KTsKKyAgICAgICAgcCA9IE1lZGlhUGxheWVyRmFjdG9yeTo6Y3JlYXRlUGxheWVyKHBsYXllclR5cGUsIHRoaXMsIG5vdGlmeSwgbVBpZCk7CiAgICAgfQogCiAgICAgaWYgKHAgIT0gTlVMTCkgewpAQCAtNjYyLDYgKzY2Miw3IEBACiAgICAgfQogCiAgICAgaWYgKCFwLT5oYXJkd2FyZU91dHB1dCgpKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICAgICAgbUF1ZGlvT3V0cHV0ID0gbmV3IEF1ZGlvT3V0cHV0KG1BdWRpb1Nlc3Npb25JZCwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpLAogICAgICAgICAgICAgICAgIG1QaWQsIG1BdWRpb0F0dHJpYnV0ZXMpOwogICAgICAgICBzdGF0aWNfY2FzdDxNZWRpYVBsYXllckludGVyZmFjZSo+KHAuZ2V0KCkpLT5zZXRBdWRpb1NpbmsobUF1ZGlvT3V0cHV0KTsKQEAgLTc0Nyw3ICs3NDgsNyBAQAogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKLSAgICBBTE9HVigic3RfZGV2ICA9ICVsbHUiLCBzYi5zdF9kZXYpOworICAgIEFMT0dWKCJzdF9kZXYgID0gJWxsdSIsIHN0YXRpY19jYXN0PHVpbnQ2NF90PihzYi5zdF9kZXYpKTsKICAgICBBTE9HVigic3RfbW9kZSA9ICV1Iiwgc2Iuc3RfbW9kZSk7CiAgICAgQUxPR1YoInN0X3VpZCAgPSAlbHUiLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihzYi5zdF91aWQpKTsKICAgICBBTE9HVigic3RfZ2lkICA9ICVsdSIsIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHNiLnN0X2dpZCkpOwpAQCAtNzkxLDYgKzc5MiwxOSBAQAogICAgIHJldHVybiBtU3RhdHVzOwogfQogCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6c2V0RGF0YVNvdXJjZSgKKyAgICAgICAgY29uc3Qgc3A8SURhdGFTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbUlEYXRhU291cmNlKHNvdXJjZSk7CisgICAgcGxheWVyX3R5cGUgcGxheWVyVHlwZSA9IE1lZGlhUGxheWVyRmFjdG9yeTo6Z2V0UGxheWVyVHlwZSh0aGlzLCBkYXRhU291cmNlKTsKKyAgICBzcDxNZWRpYVBsYXllckJhc2U+IHAgPSBzZXREYXRhU291cmNlX3ByZShwbGF5ZXJUeXBlKTsKKyAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICAvLyBub3cgc2V0IGRhdGEgc291cmNlCisgICAgc2V0RGF0YVNvdXJjZV9wb3N0KHAsIHAtPnNldERhdGFTb3VyY2UoZGF0YVNvdXJjZSkpOworICAgIHJldHVybiBtU3RhdHVzOworfQorCiB2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpkaXNjb25uZWN0TmF0aXZlV2luZG93KCkgewogICAgIGlmIChtQ29ubmVjdGVkV2luZG93ICE9IE5VTEwpIHsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdChtQ29ubmVjdGVkV2luZG93LmdldCgpLApAQCAtOTY4LDYgKzk4Miw1NCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OnNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHJhdGUpCit7CisgICAgQUxPR1YoIlslZF0gc2V0UGxheWJhY2tTZXR0aW5ncyglZiwgJWYsICVkLCAlZCkiLAorICAgICAgICAgICAgbUNvbm5JZCwgcmF0ZS5tU3BlZWQsIHJhdGUubVBpdGNoLCByYXRlLm1GYWxsYmFja01vZGUsIHJhdGUubVN0cmV0Y2hNb2RlKTsKKyAgICBzcDxNZWRpYVBsYXllckJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKKyAgICBpZiAocCA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICByZXR1cm4gcC0+c2V0UGxheWJhY2tTZXR0aW5ncyhyYXRlKTsKK30KKworc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OmdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUqIHJhdGUgLyogbm9ubnVsbCAqLykKK3sKKyAgICBzcDxNZWRpYVBsYXllckJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKKyAgICBpZiAocCA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICBzdGF0dXNfdCByZXQgPSBwLT5nZXRQbGF5YmFja1NldHRpbmdzKHJhdGUpOworICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1YoIlslZF0gZ2V0UGxheWJhY2tTZXR0aW5ncyglZiwgJWYsICVkLCAlZCkiLAorICAgICAgICAgICAgICAgIG1Db25uSWQsIHJhdGUtPm1TcGVlZCwgcmF0ZS0+bVBpdGNoLCByYXRlLT5tRmFsbGJhY2tNb2RlLCByYXRlLT5tU3RyZXRjaE1vZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJbJWRdIGdldFBsYXliYWNrU2V0dGluZ3MgcmV0dXJuZWQgJWQiLCBtQ29ubklkLCByZXQpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6c2V0U3luY1NldHRpbmdzKAorICAgICAgICBjb25zdCBBVlN5bmNTZXR0aW5ncyYgc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KQoreworICAgIEFMT0dWKCJbJWRdIHNldFN5bmNTZXR0aW5ncygldSwgJXUsICVmLCAlZikiLAorICAgICAgICAgICAgbUNvbm5JZCwgc3luYy5tU291cmNlLCBzeW5jLm1BdWRpb0FkanVzdE1vZGUsIHN5bmMubVRvbGVyYW5jZSwgdmlkZW9GcHNIaW50KTsKKyAgICBzcDxNZWRpYVBsYXllckJhc2U+IHAgPSBnZXRQbGF5ZXIoKTsKKyAgICBpZiAocCA9PSAwKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICByZXR1cm4gcC0+c2V0U3luY1NldHRpbmdzKHN5bmMsIHZpZGVvRnBzSGludCk7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpnZXRTeW5jU2V0dGluZ3MoCisgICAgICAgIEFWU3luY1NldHRpbmdzKiBzeW5jIC8qIG5vbm51bGwgKi8sIGZsb2F0KiB2aWRlb0ZwcyAvKiBub25udWxsICovKQoreworICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gcCA9IGdldFBsYXllcigpOworICAgIGlmIChwID09IDApIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIHN0YXR1c190IHJldCA9IHAtPmdldFN5bmNTZXR0aW5ncyhzeW5jLCB2aWRlb0Zwcyk7CisgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICBBTE9HVigiWyVkXSBnZXRTeW5jU2V0dGluZ3MoJXUsICV1LCAlZiwgJWYpIiwKKyAgICAgICAgICAgICAgICBtQ29ubklkLCBzeW5jLT5tU291cmNlLCBzeW5jLT5tQXVkaW9BZGp1c3RNb2RlLCBzeW5jLT5tVG9sZXJhbmNlLCAqdmlkZW9GcHMpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJbJWRdIGdldFN5bmNTZXR0aW5ncyByZXR1cm5lZCAlZCIsIG1Db25uSWQsIHJldCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpnZXRDdXJyZW50UG9zaXRpb24oaW50ICptc2VjKQogewogICAgIEFMT0dWKCJnZXRDdXJyZW50UG9zaXRpb24iKTsKQEAgLTEwNTEsNiArMTExMyw5IEBACiB7CiAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgIT0gTlVMTCkgeyBmcmVlKG1BdWRpb0F0dHJpYnV0ZXMpOyB9CiAgICAgbUF1ZGlvQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICBpZiAobUF1ZGlvQXR0cmlidXRlcyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQogICAgIHVubWFyc2hhbGxBdWRpb0F0dHJpYnV0ZXMocGFyY2VsLCBtQXVkaW9BdHRyaWJ1dGVzKTsKIAogICAgIEFMT0dWKCJzZXRBdWRpb0F0dHJpYnV0ZXNfbCgpIHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPSVzIiwKQEAgLTEyODYsMjkgKzEzNTEsNDIgQEAKICAgICAgIG1DYWxsYmFja0Nvb2tpZShOVUxMKSwKICAgICAgIG1DYWxsYmFja0RhdGEoTlVMTCksCiAgICAgICBtQnl0ZXNXcml0dGVuKDApLAorICAgICAgbVN0cmVhbVR5cGUoQVVESU9fU1RSRUFNX01VU0lDKSwKKyAgICAgIG1MZWZ0Vm9sdW1lKDEuMCksCisgICAgICBtUmlnaHRWb2x1bWUoMS4wKSwKKyAgICAgIG1QbGF5YmFja1JhdGUoQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUKSwKKyAgICAgIG1TYW1wbGVSYXRlSHooMCksCisgICAgICBtTXNlY3NQZXJGcmFtZSgwKSwKKyAgICAgIG1GcmFtZVNpemUoMCksCiAgICAgICBtU2Vzc2lvbklkKHNlc3Npb25JZCksCiAgICAgICBtVWlkKHVpZCksCiAgICAgICBtUGlkKHBpZCksCi0gICAgICBtRmxhZ3MoQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSkgeworICAgICAgbVNlbmRMZXZlbCgwLjApLAorICAgICAgbUF1eEVmZmVjdElkKDApLAorICAgICAgbUZsYWdzKEFVRElPX09VVFBVVF9GTEFHX05PTkUpCit7CiAgICAgQUxPR1YoIkF1ZGlvT3V0cHV0KCVkKSIsIHNlc3Npb25JZCk7Ci0gICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgbUxlZnRWb2x1bWUgPSAxLjA7Ci0gICAgbVJpZ2h0Vm9sdW1lID0gMS4wOwotICAgIG1QbGF5YmFja1JhdGVQZXJtaWxsZSA9IDEwMDA7Ci0gICAgbVNhbXBsZVJhdGVIeiA9IDA7Ci0gICAgbU1zZWNzUGVyRnJhbWUgPSAwOwotICAgIG1BdXhFZmZlY3RJZCA9IDA7Ci0gICAgbVNlbmRMZXZlbCA9IDAuMDsKKyAgICBpZiAoYXR0ciAhPSBOVUxMKSB7CisgICAgICAgIG1BdHRyaWJ1dGVzID0gKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICBpZiAobUF0dHJpYnV0ZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgbWVtY3B5KG1BdHRyaWJ1dGVzLCBhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICBtU3RyZWFtVHlwZSA9IGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUoYXR0cik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtQXR0cmlidXRlcyA9IE5VTEw7CisgICAgfQorCiAgICAgc2V0TWluQnVmZmVyQ291bnQoKTsKLSAgICBtQXR0cmlidXRlcyA9IGF0dHI7CiB9CiAKIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6On5BdWRpb091dHB1dCgpCiB7CiAgICAgY2xvc2UoKTsKKyAgICBmcmVlKG1BdHRyaWJ1dGVzKTsKICAgICBkZWxldGUgbUNhbGxiYWNrRGF0YTsKIH0KIAorLy9zdGF0aWMKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6c2V0TWluQnVmZmVyQ291bnQoKQogewogICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKQEAgLTEzMTgsOTIgKzEzOTYsMTIzIEBACiAgICAgfQogfQogCisvLyBzdGF0aWMKIGJvb2wgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6aXNPbkVtdWxhdG9yKCkKIHsKLSAgICBzZXRNaW5CdWZmZXJDb3VudCgpOworICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7IC8vIGJlbmlnbiByYWNlIHdydCBvdGhlciB0aHJlYWRzCiAgICAgcmV0dXJuIG1Jc09uRW11bGF0b3I7CiB9CiAKKy8vIHN0YXRpYwogaW50IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmdldE1pbkJ1ZmZlckNvdW50KCkKIHsKLSAgICBzZXRNaW5CdWZmZXJDb3VudCgpOworICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7IC8vIGJlbmlnbiByYWNlIHdydCBvdGhlciB0aHJlYWRzCiAgICAgcmV0dXJuIG1NaW5CdWZmZXJDb3VudDsKIH0KIAogc3NpemVfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpidWZmZXJTaXplKCkgY29uc3QKIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKG1UcmFjayA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gbVRyYWNrLT5mcmFtZUNvdW50KCkgKiBmcmFtZVNpemUoKTsKKyAgICByZXR1cm4gbVRyYWNrLT5mcmFtZUNvdW50KCkgKiBtRnJhbWVTaXplOwogfQogCiBzc2l6ZV90IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmZyYW1lQ291bnQoKSBjb25zdAogeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBtVHJhY2stPmZyYW1lQ291bnQoKTsKIH0KIAogc3NpemVfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpjaGFubmVsQ291bnQoKSBjb25zdAogeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBtVHJhY2stPmNoYW5uZWxDb3VudCgpOwogfQogCiBzc2l6ZV90IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmZyYW1lU2l6ZSgpIGNvbnN0CiB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIG1UcmFjay0+ZnJhbWVTaXplKCk7CisgICAgcmV0dXJuIG1GcmFtZVNpemU7CiB9CiAKIHVpbnQzMl90IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmxhdGVuY3kgKCkgY29uc3QKIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKG1UcmFjayA9PSAwKSByZXR1cm4gMDsKICAgICByZXR1cm4gbVRyYWNrLT5sYXRlbmN5KCk7CiB9CiAKIGZsb2F0IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6Om1zZWNzUGVyRnJhbWUoKSBjb25zdAogeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gbU1zZWNzUGVyRnJhbWU7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikgY29uc3QKIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKG1UcmFjayA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gbVRyYWNrLT5nZXRQb3NpdGlvbihwb3NpdGlvbik7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCAmdHMpIGNvbnN0CiB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIG1UcmFjay0+Z2V0VGltZXN0YW1wKHRzKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Z2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3QKIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKG1UcmFjayA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICAqZnJhbWVzd3JpdHRlbiA9IG1CeXRlc1dyaXR0ZW4gLyBmcmFtZVNpemUoKTsKKyAgICAqZnJhbWVzd3JpdHRlbiA9IG1CeXRlc1dyaXR0ZW4gLyBtRnJhbWVTaXplOwogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKQogeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAobVRyYWNrID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBtVHJhY2stPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7CiB9CiAKIFN0cmluZzggIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykKIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKG1UcmFjayA9PSAwKSByZXR1cm4gU3RyaW5nODo6ZW1wdHkoKTsKICAgICByZXR1cm4gbVRyYWNrLT5nZXRQYXJhbWV0ZXJzKGtleXMpOwogfQogCiB2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OnNldEF1ZGlvQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKiBhdHRyaWJ1dGVzKSB7Ci0gICAgbUF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAoYXR0cmlidXRlcyA9PSBOVUxMKSB7CisgICAgICAgIGZyZWUobUF0dHJpYnV0ZXMpOworICAgICAgICBtQXR0cmlidXRlcyA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1BdHRyaWJ1dGVzID09IE5VTEwpIHsKKyAgICAgICAgICAgIG1BdHRyaWJ1dGVzID0gKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICB9CisgICAgICAgIG1lbWNweShtQXR0cmlidXRlcywgYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICBtU3RyZWFtVHlwZSA9IGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUoYXR0cmlidXRlcyk7CisgICAgfQogfQogCi12b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmRlbGV0ZVJlY3ljbGVkVHJhY2soKQordm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQogewotICAgIEFMT0dWKCJkZWxldGVSZWN5Y2xlZFRyYWNrIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIC8vIGRvIG5vdCBhbGxvdyBkaXJlY3Qgc3RyZWFtIHR5cGUgbW9kaWZpY2F0aW9uIGlmIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHNldAorICAgIGlmIChtQXR0cmlidXRlcyA9PSBOVUxMKSB7CisgICAgICAgIG1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsKKyAgICB9Cit9CiAKK3ZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6ZGVsZXRlUmVjeWNsZWRUcmFja19sKCkKK3sKKyAgICBBTE9HVigiZGVsZXRlUmVjeWNsZWRUcmFja19sIik7CiAgICAgaWYgKG1SZWN5Y2xlZFRyYWNrICE9IDApIHsKIAogICAgICAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBOVUxMKSB7CkBAIC0xNDIxLDMzICsxNTMwLDI4IEBACiAgICAgICAgIC8vIEF1ZGlvRmxpbmdlciB0byBkcmFpbiB0aGUgdHJhY2suCiAKICAgICAgICAgbVJlY3ljbGVkVHJhY2suY2xlYXIoKTsKKyAgICAgICAgY2xvc2VfbCgpOwogICAgICAgICBkZWxldGUgbUNhbGxiYWNrRGF0YTsKICAgICAgICAgbUNhbGxiYWNrRGF0YSA9IE5VTEw7Ci0gICAgICAgIGNsb3NlKCk7CiAgICAgfQogfQogCit2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmNsb3NlX2woKQoreworICAgIG1UcmFjay5jbGVhcigpOworfQorCiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpvcGVuKAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQgY2hhbm5lbENvdW50LCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgYnVmZmVyQ291bnQsCiAgICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSwKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKKyAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvLAorICAgICAgICBib29sIGRvTm90UmVjb25uZWN0LAorICAgICAgICB1aW50MzJfdCBzdWdnZXN0ZWRGcmFtZUNvdW50KQogewotICAgIG1DYWxsYmFjayA9IGNiOwotICAgIG1DYWxsYmFja0Nvb2tpZSA9IGNvb2tpZTsKLQotICAgIC8vIENoZWNrIGFyZ3VtZW50ICJidWZmZXJDb3VudCIgYWdhaW5zdCB0aGUgbWluaW51bSBidWZmZXIgY291bnQKLSAgICBpZiAoYnVmZmVyQ291bnQgPCBtTWluQnVmZmVyQ291bnQpIHsKLSAgICAgICAgQUxPR0QoImJ1ZmZlckNvdW50ICglZCkgaXMgdG9vIHNtYWxsIGFuZCBpbmNyZWFzZWQgdG8gJWQiLCBidWZmZXJDb3VudCwgbU1pbkJ1ZmZlckNvdW50KTsKLSAgICAgICAgYnVmZmVyQ291bnQgPSBtTWluQnVmZmVyQ291bnQ7Ci0KLSAgICB9CiAgICAgQUxPR1YoIm9wZW4oJXUsICVkLCAweCV4LCAweCV4LCAlZCwgJWQgMHgleCkiLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQsIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgIGZvcm1hdCwgYnVmZmVyQ291bnQsIG1TZXNzaW9uSWQsIGZsYWdzKTsKLSAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7Ci0gICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKLSAgICBzaXplX3QgZnJhbWVDb3VudDsKIAogICAgIC8vIG9mZmxvYWRpbmcgaXMgb25seSBzdXBwb3J0ZWQgaW4gY2FsbGJhY2sgbW9kZSBmb3Igbm93LgogICAgIC8vIG9mZmxvYWRJbmZvIG11c3QgYmUgcHJlc2VudCBpZiBvZmZsb2FkIGZsYWcgaXMgc2V0CkBAIC0xNDU2LDIwICsxNTYwLDM2IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCisgICAgLy8gY29tcHV0ZSBmcmFtZSBjb3VudCBmb3IgdGhlIEF1ZGlvVHJhY2sgaW50ZXJuYWwgYnVmZmVyCisgICAgc2l6ZV90IGZyYW1lQ291bnQ7CiAgICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKICAgICAgICAgZnJhbWVDb3VudCA9IDA7IC8vIEF1ZGlvVHJhY2sgd2lsbCBnZXQgZnJhbWUgY291bnQgZnJvbSBBdWRpb0ZsaW5nZXIKICAgICB9IGVsc2UgeworICAgICAgICAvLyB0cnkgdG8gZXN0aW1hdGUgdGhlIGJ1ZmZlciBwcm9jZXNzaW5nIGZldGNoIHNpemUgZnJvbSBBdWRpb0ZsaW5nZXIuCisgICAgICAgIC8vIGZyYW1lc1BlckJ1ZmZlciBpcyBhcHByb3hpbWF0ZSBhbmQgZ2VuZXJhbGx5IGNvcnJlY3QsIGV4Y2VwdCB3aGVuIGl0J3Mgbm90IDotKS4KICAgICAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwogICAgICAgICBzaXplX3QgYWZGcmFtZUNvdW50OwotCiAgICAgICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBtU3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgICAgICB9CiAgICAgICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCZhZlNhbXBsZVJhdGUsIG1TdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgICAgIH0KKyAgICAgICAgY29uc3Qgc2l6ZV90IGZyYW1lc1BlckJ1ZmZlciA9CisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYW1wbGVSYXRlICogYWZGcmFtZUNvdW50IC8gYWZTYW1wbGVSYXRlOwogCi0gICAgICAgIGZyYW1lQ291bnQgPSAoc2FtcGxlUmF0ZSphZkZyYW1lQ291bnQqYnVmZmVyQ291bnQpL2FmU2FtcGxlUmF0ZTsKKyAgICAgICAgaWYgKGJ1ZmZlckNvdW50ID09IDApIHsKKyAgICAgICAgICAgIC8vIHVzZSBzdWdnZXN0ZWRGcmFtZUNvdW50CisgICAgICAgICAgICBidWZmZXJDb3VudCA9IChzdWdnZXN0ZWRGcmFtZUNvdW50ICsgZnJhbWVzUGVyQnVmZmVyIC0gMSkgLyBmcmFtZXNQZXJCdWZmZXI7CisgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2sgYXJndW1lbnQgYnVmZmVyQ291bnQgYWdhaW5zdCB0aGUgbWluaW51bSBidWZmZXIgY291bnQKKyAgICAgICAgaWYgKGJ1ZmZlckNvdW50ICE9IDAgJiYgYnVmZmVyQ291bnQgPCBtTWluQnVmZmVyQ291bnQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJidWZmZXJDb3VudCAoJWQpIGluY3JlYXNlZCB0byAlZCIsIGJ1ZmZlckNvdW50LCBtTWluQnVmZmVyQ291bnQpOworICAgICAgICAgICAgYnVmZmVyQ291bnQgPSBtTWluQnVmZmVyQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gaWYgZnJhbWVDb3VudCBpcyAwLCB0aGVuIEF1ZGlvVHJhY2sgd2lsbCBnZXQgZnJhbWUgY291bnQgZnJvbSBBdWRpb0ZsaW5nZXIKKyAgICAgICAgLy8gd2hpY2ggd2lsbCBiZSB0aGUgbWluaW11bSBzaXplIHBlcm1pdHRlZC4KKyAgICAgICAgZnJhbWVDb3VudCA9IGJ1ZmZlckNvdW50ICogZnJhbWVzUGVyQnVmZmVyOwogICAgIH0KIAogICAgIGlmIChjaGFubmVsTWFzayA9PSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIpIHsKQEAgLTE0ODAsNiArMTYwMCwxMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIG1DYWxsYmFjayA9IGNiOworICAgIG1DYWxsYmFja0Nvb2tpZSA9IGNvb2tpZTsKKwogICAgIC8vIENoZWNrIHdoZXRoZXIgd2UgY2FuIHJlY3ljbGUgdGhlIHRyYWNrCiAgICAgYm9vbCByZXVzZSA9IGZhbHNlOwogICAgIGJvb2wgYm90aE9mZmxvYWRlZCA9IGZhbHNlOwpAQCAtMTUxOSw3ICsxNjQzLDcgQEAKICAgICAvLyB3ZSBtdXN0IGNsb3NlIHRoZSBwcmV2aW91cyBvdXRwdXQgYmVmb3JlIG9wZW5pbmcgYSBuZXcgb25lCiAgICAgaWYgKGJvdGhPZmZsb2FkZWQgJiYgIXJldXNlKSB7CiAgICAgICAgIEFMT0dWKCJib3RoIG9mZmxvYWRlZCBhbmQgbm90IHJlY3ljbGluZyIpOwotICAgICAgICBkZWxldGVSZWN5Y2xlZFRyYWNrKCk7CisgICAgICAgIGRlbGV0ZVJlY3ljbGVkVHJhY2tfbCgpOwogICAgIH0KIAogICAgIHNwPEF1ZGlvVHJhY2s+IHQ7CkBAIC0xNTUwLDcgKzE2NzQsOCBAQAogICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mbywKICAgICAgICAgICAgICAgICAgICAgbVVpZCwKICAgICAgICAgICAgICAgICAgICAgbVBpZCwKLSAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMpOworICAgICAgICAgICAgICAgICAgICBtQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgZG9Ob3RSZWNvbm5lY3QpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdCA9IG5ldyBBdWRpb1RyYWNrKAogICAgICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKQEAgLTE1NjcsMTIgKzE2OTIsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgTlVMTCwgLy8gb2ZmbG9hZCBpbmZvCiAgICAgICAgICAgICAgICAgICAgIG1VaWQsCiAgICAgICAgICAgICAgICAgICAgIG1QaWQsCi0gICAgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgIGRvTm90UmVjb25uZWN0KTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICgodCA9PSAwKSB8fCAodC0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpKSB7CiAgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGNyZWF0ZSBhdWRpbyB0cmFjayIpOwogICAgICAgICAgICAgZGVsZXRlIG5ld2NiZDsKKyAgICAgICAgICAgIC8vIHQgZ29lcyBvdXQgb2Ygc2NvcGUsIHNvIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byB6ZXJvCiAgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIHN1Y2Nlc3NmdWwgQXVkaW9UcmFjayBpbml0aWFsaXphdGlvbiBpbXBsaWVzIGEgbGVnYWN5IHN0cmVhbSB0eXBlIHdhcyBnZW5lcmF0ZWQKQEAgLTE1OTQsNyArMTcyMSw3IEBACiAKICAgICAgICAgaWYgKHJldXNlKSB7CiAgICAgICAgICAgICBBTE9HVigiY2hhaW5pbmcgdG8gbmV4dCBvdXRwdXQgYW5kIHJlY3ljbGluZyB0cmFjayIpOwotICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgIGNsb3NlX2woKTsKICAgICAgICAgICAgIG1UcmFjayA9IG1SZWN5Y2xlZFRyYWNrOwogICAgICAgICAgICAgbVJlY3ljbGVkVHJhY2suY2xlYXIoKTsKICAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tEYXRhICE9IE5VTEwpIHsKQEAgLTE2MDgsNyArMTczNSw3IEBACiAgICAgLy8gd2UncmUgbm90IGdvaW5nIHRvIHJldXNlIHRoZSB0cmFjaywgdW5ibG9jayBhbmQgZmx1c2ggaXQKICAgICAvLyB0aGlzIHdhcyBkb25lIGVhcmxpZXIgaWYgYm90aCB0cmFja3MgYXJlIG9mZmxvYWRlZAogICAgIGlmICghYm90aE9mZmxvYWRlZCkgewotICAgICAgICBkZWxldGVSZWN5Y2xlZFRyYWNrKCk7CisgICAgICAgIGRlbGV0ZVJlY3ljbGVkVHJhY2tfbCgpOwogICAgIH0KIAogICAgIENIRUNLKCh0ICE9IE5VTEwpICYmICgobUNhbGxiYWNrID09IE5VTEwpIHx8IChuZXdjYmQgIT0gTlVMTCkpKTsKQEAgLTE2MTgsMTcgKzE3NDUsMjAgQEAKICAgICB0LT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7CiAKICAgICBtU2FtcGxlUmF0ZUh6ID0gc2FtcGxlUmF0ZTsKLSAgICBtRmxhZ3MgPSBmbGFnczsKLSAgICBtTXNlY3NQZXJGcmFtZSA9IG1QbGF5YmFja1JhdGVQZXJtaWxsZSAvIChmbG9hdCkgc2FtcGxlUmF0ZTsKKyAgICBtRmxhZ3MgPSB0LT5nZXRGbGFncygpOyAvLyB3ZSBzdWdnZXN0IHRoZSBmbGFncyBhYm92ZSwgYnV0IG5ldyBBdWRpb1RyYWNrKCkgbWF5IG5vdCBncmFudCBpdC4KKyAgICBtTXNlY3NQZXJGcmFtZSA9IDFFM2YgLyAobVBsYXliYWNrUmF0ZS5tU3BlZWQgKiBzYW1wbGVSYXRlKTsKKyAgICBtRnJhbWVTaXplID0gdC0+ZnJhbWVTaXplKCk7CiAgICAgdWludDMyX3QgcG9zOwogICAgIGlmICh0LT5nZXRQb3NpdGlvbigmcG9zKSA9PSBPSykgewotICAgICAgICBtQnl0ZXNXcml0dGVuID0gdWludDY0X3QocG9zKSAqIHQtPmZyYW1lU2l6ZSgpOworICAgICAgICBtQnl0ZXNXcml0dGVuID0gdWludDY0X3QocG9zKSAqIG1GcmFtZVNpemU7CiAgICAgfQogICAgIG1UcmFjayA9IHQ7CiAKICAgICBzdGF0dXNfdCByZXMgPSBOT19FUlJPUjsKLSAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgPT0gMCkgewotICAgICAgICByZXMgPSB0LT5zZXRTYW1wbGVSYXRlKG1QbGF5YmFja1JhdGVQZXJtaWxsZSAqIG1TYW1wbGVSYXRlSHogLyAxMDAwKTsKKyAgICAvLyBOb3RlIHNvbWUgb3V0cHV0IGRldmljZXMgbWF5IGdpdmUgdXMgYSBkaXJlY3QgdHJhY2sgZXZlbiB0aG91Z2ggd2UgZG9uJ3Qgc3BlY2lmeSBpdC4KKyAgICAvLyBFeGFtcGxlOiBMaW5lIGFwcGxpY2F0aW9uIGIvMTc0NTk5ODIuCisgICAgaWYgKChtRmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkpID09IDApIHsKKyAgICAgICAgcmVzID0gdC0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1JhdGUpOwogICAgICAgICBpZiAocmVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICB0LT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7CiAgICAgICAgICAgICByZXMgPSB0LT5hdHRhY2hBdXhFZmZlY3QobUF1eEVmZmVjdElkKTsKQEAgLTE2NDEsNiArMTc3MSw3IEBACiBzdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpzdGFydCgpCiB7CiAgICAgQUxPR1YoInN0YXJ0Iik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmIChtQ2FsbGJhY2tEYXRhICE9IE5VTEwpIHsKICAgICAgICAgbUNhbGxiYWNrRGF0YS0+ZW5kVHJhY2tTd2l0Y2goKTsKICAgICB9CkBAIC0xNjUzLDM1ICsxNzg0LDkzIEBACiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6c2V0TmV4dE91dHB1dChjb25zdCBzcDxBdWRpb091dHB1dD4mIG5leHRPdXRwdXQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgbU5leHRPdXRwdXQgPSBuZXh0T3V0cHV0OwogfQogCi0KIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6c3dpdGNoVG9OZXh0T3V0cHV0KCkgewogICAgIEFMT0dWKCJzd2l0Y2hUb05leHRPdXRwdXQiKTsKLSAgICBpZiAobU5leHRPdXRwdXQgIT0gTlVMTCkgewotICAgICAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tEYXRhLT5iZWdpblRyYWNrU3dpdGNoKCk7CisKKyAgICAvLyBUcnkgdG8gYWNxdWlyZSB0aGUgY2FsbGJhY2sgbG9jayBiZWZvcmUgbW92aW5nIHRyYWNrICh3aXRob3V0IGluY3VycmluZyBkZWFkbG9jaykuCisgICAgY29uc3QgdW5zaWduZWQga01heFN3aXRjaFRyaWVzID0gMTAwOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBmb3IgKHVuc2lnbmVkIHRyaWVzID0gMDs7KSB7CisgICAgICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZSBtTmV4dE91dHB1dC0+bUNhbGxiYWNrRGF0YTsKLSAgICAgICAgbU5leHRPdXRwdXQtPm1DYWxsYmFja0RhdGEgPSBtQ2FsbGJhY2tEYXRhOwotICAgICAgICBtQ2FsbGJhY2tEYXRhID0gTlVMTDsKLSAgICAgICAgbU5leHRPdXRwdXQtPm1SZWN5Y2xlZFRyYWNrID0gbVRyYWNrOwotICAgICAgICBtVHJhY2suY2xlYXIoKTsKLSAgICAgICAgbU5leHRPdXRwdXQtPm1TYW1wbGVSYXRlSHogPSBtU2FtcGxlUmF0ZUh6OwotICAgICAgICBtTmV4dE91dHB1dC0+bU1zZWNzUGVyRnJhbWUgPSBtTXNlY3NQZXJGcmFtZTsKLSAgICAgICAgbU5leHRPdXRwdXQtPm1CeXRlc1dyaXR0ZW4gPSBtQnl0ZXNXcml0dGVuOwotICAgICAgICBtTmV4dE91dHB1dC0+bUZsYWdzID0gbUZsYWdzOworICAgICAgICBpZiAobU5leHRPdXRwdXQgIT0gTlVMTCAmJiBtTmV4dE91dHB1dCAhPSB0aGlzKSB7CisgICAgICAgICAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gdHdvIGFsdGVybmF0aXZlIGFwcHJvYWNoZXMKKyNpZiAxCisgICAgICAgICAgICAgICAgQ2FsbGJhY2tEYXRhICpjYWxsYmFja0RhdGEgPSBtQ2FsbGJhY2tEYXRhOworICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIC8vIHByb3BlciBhY3F1aXNpdGlvbiBzZXF1ZW5jZQorICAgICAgICAgICAgICAgIGNhbGxiYWNrRGF0YS0+bG9jaygpOworICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICAvLyBDYXV0aW9uOiBpdCBpcyB1bmxpa2VseSB0aGF0IHNvbWVvbmUgZGVsZXRlZCBvdXIgY2FsbGJhY2sgb3IgY2hhbmdlZCBvdXIgdGFyZ2V0CisgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrRGF0YSAhPSBtQ2FsbGJhY2tEYXRhIHx8IG1OZXh0T3V0cHV0ID09IE5VTEwgfHwgbU5leHRPdXRwdXQgPT0gdGhpcykgeworICAgICAgICAgICAgICAgICAgICAvLyBmYXRhbCBpZiB3ZSBhcmUgc3RhcnZlZCBvdXQuCisgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKyt0cmllcyA+IGtNYXhTd2l0Y2hUcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3dpdGNoVG9OZXh0T3V0cHV0KCkgY2Fubm90IG9idGFpbiBjb3JyZWN0IGxvY2sgc2VxdWVuY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tEYXRhLT51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhbGxiYWNrRGF0YS0+bVN3aXRjaGluZyA9IHRydWU7IC8vIGJlZ2luIHRyYWNrIHN3aXRjaAorI2Vsc2UKKyAgICAgICAgICAgICAgICAvLyB0cnlCZWdpblRyYWNrU3dpdGNoKCkgcmV0dXJucyBmYWxzZSBpZiB0aGUgY2FsbGJhY2sgaGFzIHRoZSBsb2NrLgorICAgICAgICAgICAgICAgIGlmICghbUNhbGxiYWNrRGF0YS0+dHJ5QmVnaW5UcmFja1N3aXRjaCgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZhdGFsIGlmIHdlIGFyZSBzdGFydmVkIG91dC4KKyAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigrK3RyaWVzID4ga01heFN3aXRjaFRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzd2l0Y2hUb05leHRPdXRwdXQoKSBjYW5ub3Qgb2J0YWluIGNhbGxiYWNrIGxvY2siKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHVzbGVlcCg1ICogMTAwMCAvKiB1c2VjICovKTsgLy8gYWxsb3cgY2FsbGJhY2sgdG8gdXNlIEF1ZGlvT3V0cHV0CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBuZXh0TG9jayhtTmV4dE91dHB1dC0+bUxvY2spOworCisgICAgICAgICAgICAvLyBJZiB0aGUgbmV4dCBvdXRwdXQgdHJhY2sgaXMgbm90IE5VTEwsIHRoZW4gaXQgaGFzIGJlZW4KKyAgICAgICAgICAgIC8vIG9wZW5lZCBhbHJlYWR5IGZvciBwbGF5YmFjay4KKyAgICAgICAgICAgIC8vIFRoaXMgaXMgcG9zc2libGUgZXZlbiB3aXRob3V0IHRoZSBuZXh0IHBsYXllciBiZWluZyBzdGFydGVkLAorICAgICAgICAgICAgLy8gZm9yIGV4YW1wbGUsIHRoZSBuZXh0IHBsYXllciBjb3VsZCBiZSBwcmVwYXJlZCBhbmQgc2Vla2VkLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFByZXN1bWluZyBpdCBpc24ndCBhZHZpc2FibGUgdG8gZm9yY2UgdGhlIHRyYWNrIG92ZXIuCisgICAgICAgICAgICAgaWYgKG1OZXh0T3V0cHV0LT5tVHJhY2sgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJSZWN5Y2xpbmcgdHJhY2sgZm9yIGdhcGxlc3MgcGxheWJhY2siKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgbU5leHRPdXRwdXQtPm1DYWxsYmFja0RhdGE7CisgICAgICAgICAgICAgICAgbU5leHRPdXRwdXQtPm1DYWxsYmFja0RhdGEgPSBtQ2FsbGJhY2tEYXRhOworICAgICAgICAgICAgICAgIG1OZXh0T3V0cHV0LT5tUmVjeWNsZWRUcmFjayA9IG1UcmFjazsKKyAgICAgICAgICAgICAgICBtTmV4dE91dHB1dC0+bVNhbXBsZVJhdGVIeiA9IG1TYW1wbGVSYXRlSHo7CisgICAgICAgICAgICAgICAgbU5leHRPdXRwdXQtPm1Nc2Vjc1BlckZyYW1lID0gbU1zZWNzUGVyRnJhbWU7CisgICAgICAgICAgICAgICAgbU5leHRPdXRwdXQtPm1CeXRlc1dyaXR0ZW4gPSBtQnl0ZXNXcml0dGVuOworICAgICAgICAgICAgICAgIG1OZXh0T3V0cHV0LT5tRmxhZ3MgPSBtRmxhZ3M7CisgICAgICAgICAgICAgICAgbU5leHRPdXRwdXQtPm1GcmFtZVNpemUgPSBtRnJhbWVTaXplOworICAgICAgICAgICAgICAgIGNsb3NlX2woKTsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2tEYXRhID0gTlVMTDsgIC8vIGRlc3RydWN0aW9uIGhhbmRsZWQgYnkgbU5leHRPdXRwdXQKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIklnbm9yaW5nIGdhcGxlc3MgcGxheWJhY2sgYmVjYXVzZSBuZXh0IHBsYXllciBoYXMgYWxyZWFkeSBzdGFydGVkIik7CisgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRyYWNrIGluIGNhc2UgcmVzb3VyY2UgbmVlZGVkIGZvciBmdXR1cmUgcGxheWVycy4KKyAgICAgICAgICAgICAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0RhdGEtPmVuZFRyYWNrU3dpdGNoKCk7ICAvLyByZWxlYXNlIGxvY2sgZm9yIGNhbGxiYWNrcyBiZWZvcmUgY2xvc2UuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsb3NlX2woKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKICAgICB9CiB9CiAKLXNzaXplX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6d3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3NzaXplX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6d3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBibG9ja2luZykKIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQ2FsbGJhY2sgIT0gTlVMTCwgIkRvbid0IGNhbGwgd3JpdGUgaWYgc3VwcGx5aW5nIGEgY2FsbGJhY2suIik7CiAKICAgICAvL0FMT0dWKCJ3cml0ZSglcCwgJXUpIiwgYnVmZmVyLCBzaXplKTsKICAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgc3NpemVfdCByZXQgPSBtVHJhY2stPndyaXRlKGJ1ZmZlciwgc2l6ZSk7CisgICAgICAgIHNzaXplX3QgcmV0ID0gbVRyYWNrLT53cml0ZShidWZmZXIsIHNpemUsIGJsb2NraW5nKTsKICAgICAgICAgaWYgKHJldCA+PSAwKSB7CiAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuICs9IHJldDsKICAgICAgICAgfQpAQCAtMTY5MywzMCArMTg4MiwzNyBAQAogdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpzdG9wKCkKIHsKICAgICBBTE9HVigic3RvcCIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBtQnl0ZXNXcml0dGVuID0gMDsKICAgICBpZiAobVRyYWNrICE9IDApIG1UcmFjay0+c3RvcCgpOwogfQogCiB2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmZsdXNoKCkKIHsKICAgICBBTE9HVigiZmx1c2giKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgbUJ5dGVzV3JpdHRlbiA9IDA7CiAgICAgaWYgKG1UcmFjayAhPSAwKSBtVHJhY2stPmZsdXNoKCk7CiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6cGF1c2UoKQogewogICAgIEFMT0dWKCJwYXVzZSIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAobVRyYWNrICE9IDApIG1UcmFjay0+cGF1c2UoKTsKIH0KIAogdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpjbG9zZSgpCiB7CiAgICAgQUxPR1YoImNsb3NlIik7Ci0gICAgbVRyYWNrLmNsZWFyKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGNsb3NlX2woKTsKIH0KIAogdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpCiB7CiAgICAgQUxPR1YoInNldFZvbHVtZSglZiwgJWYpIiwgbGVmdCwgcmlnaHQpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBtTGVmdFZvbHVtZSA9IGxlZnQ7CiAgICAgbVJpZ2h0Vm9sdW1lID0gcmlnaHQ7CiAgICAgaWYgKG1UcmFjayAhPSAwKSB7CkBAIC0xNzI0LDI1ICsxOTIwLDQ0IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpzZXRQbGF5YmFja1JhdGVQZXJtaWxsZShpbnQzMl90IHJhdGVQZXJtaWxsZSkKK3N0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OnNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSkKIHsKLSAgICBBTE9HVigic2V0UGxheWJhY2tSYXRlUGVybWlsbGUoJWQpIiwgcmF0ZVBlcm1pbGxlKTsKLSAgICBzdGF0dXNfdCByZXMgPSBOT19FUlJPUjsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgcmVzID0gbVRyYWNrLT5zZXRTYW1wbGVSYXRlKHJhdGVQZXJtaWxsZSAqIG1TYW1wbGVSYXRlSHogLyAxMDAwKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXMgPSBOT19JTklUOworICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUoJWYgJWYgJWQgJWQpIiwKKyAgICAgICAgICAgICAgICByYXRlLm1TcGVlZCwgcmF0ZS5tUGl0Y2gsIHJhdGUubUZhbGxiYWNrTW9kZSwgcmF0ZS5tU3RyZXRjaE1vZGUpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICAgICAgLy8gcmVtZW1iZXIgcmF0ZSBzbyB0aGF0IHdlIGNhbiBzZXQgaXQgd2hlbiB0aGUgdHJhY2sgaXMgb3BlbmVkCisgICAgICAgIG1QbGF5YmFja1JhdGUgPSByYXRlOworICAgICAgICByZXR1cm4gT0s7CiAgICAgfQotICAgIG1QbGF5YmFja1JhdGVQZXJtaWxsZSA9IHJhdGVQZXJtaWxsZTsKKyAgICBzdGF0dXNfdCByZXMgPSBtVHJhY2stPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKKyAgICBpZiAocmVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIC8vIHJhdGUubVNwZWVkIGlzIGFsd2F5cyBncmVhdGVyIHRoYW4gMCBpZiBzZXRQbGF5YmFja1JhdGUgc3VjY2VlZGVkCisgICAgQ0hFQ0tfR1QocmF0ZS5tU3BlZWQsIDAuZik7CisgICAgbVBsYXliYWNrUmF0ZSA9IHJhdGU7CiAgICAgaWYgKG1TYW1wbGVSYXRlSHogIT0gMCkgewotICAgICAgICBtTXNlY3NQZXJGcmFtZSA9IG1QbGF5YmFja1JhdGVQZXJtaWxsZSAvIChmbG9hdCkgbVNhbXBsZVJhdGVIejsKKyAgICAgICAgbU1zZWNzUGVyRnJhbWUgPSAxRTNmIC8gKHJhdGUubVNwZWVkICogbVNhbXBsZVJhdGVIeik7CiAgICAgfQogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IE1lZGlhUGxheWVyU2VydmljZTo6QXVkaW9PdXRwdXQ6OmdldFBsYXliYWNrUmF0ZShBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSkKK3sKKyAgICBBTE9HVigic2V0UGxheWJhY2tSYXRlIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgKnJhdGUgPSBtVHJhY2stPmdldFBsYXliYWNrUmF0ZSgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6c2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKQogewogICAgIEFMT0dWKCJzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoJWYpIiwgbGV2ZWwpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBtU2VuZExldmVsID0gbGV2ZWw7CiAgICAgaWYgKG1UcmFjayAhPSAwKSB7CiAgICAgICAgIHJldHVybiBtVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChsZXZlbCk7CkBAIC0xNzUzLDYgKzE5NjgsNyBAQAogc3RhdHVzX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6YXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCkKIHsKICAgICBBTE9HVigiYXR0YWNoQXV4RWZmZWN0KCVkKSIsIGVmZmVjdElkKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgbUF1eEVmZmVjdElkID0gZWZmZWN0SWQ7CiAgICAgaWYgKG1UcmFjayAhPSAwKSB7CiAgICAgICAgIHJldHVybiBtVHJhY2stPmF0dGFjaEF1eEVmZmVjdChlZmZlY3RJZCk7CkBAIC0xNzY1LDYgKzE5ODEsNyBAQAogICAgICAgICBpbnQgZXZlbnQsIHZvaWQgKmNvb2tpZSwgdm9pZCAqaW5mbykgewogICAgIC8vQUxPR1YoImNhbGxiYWNrd3JhcHBlciIpOwogICAgIENhbGxiYWNrRGF0YSAqZGF0YSA9IChDYWxsYmFja0RhdGEqKWNvb2tpZTsKKyAgICAvLyBsb2NrIHRvIGVuc3VyZSB3ZSBhcmVuJ3QgY2F1Z2h0IGluIHRoZSBtaWRkbGUgb2YgYSB0cmFjayBzd2l0Y2guCiAgICAgZGF0YS0+bG9jaygpOwogICAgIEF1ZGlvT3V0cHV0ICptZSA9IGRhdGEtPmdldE91dHB1dCgpOwogICAgIEF1ZGlvVHJhY2s6OkJ1ZmZlciAqYnVmZmVyID0gKEF1ZGlvVHJhY2s6OkJ1ZmZlciAqKWluZm87CkBAIC0xNzg0LDIwICsyMDAxLDIzIEBACiAgICAgICAgICAgICAgICAgbWUsIGJ1ZmZlci0+cmF3LCBidWZmZXItPnNpemUsIG1lLT5tQ2FsbGJhY2tDb29raWUsCiAgICAgICAgICAgICAgICAgQ0JfRVZFTlRfRklMTF9CVUZGRVIpOwogCi0gICAgICAgIGlmICgobWUtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpID09IDAgJiYKLSAgICAgICAgICAgIGFjdHVhbFNpemUgPT0gMCAmJiBidWZmZXItPnNpemUgPiAwICYmIG1lLT5tTmV4dE91dHB1dCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyBXZSd2ZSByZWFjaGVkIEVPUyBidXQgdGhlIGF1ZGlvIHRyYWNrIGlzIG5vdCBzdG9wcGVkIHlldCwKLSAgICAgICAgICAgIC8vIGtlZXAgcGxheWluZyBzaWxlbmNlLgorICAgICAgICAvLyBMb2cgd2hlbiBubyBkYXRhIGlzIHJldHVybmVkIGZyb20gdGhlIGNhbGxiYWNrLgorICAgICAgICAvLyAoMSkgV2UgbWF5IGhhdmUgbm8gZGF0YSAoZXNwZWNpYWxseSB3aXRoIG5ldHdvcmsgc3RyZWFtaW5nIHNvdXJjZXMpLgorICAgICAgICAvLyAoMikgV2UgbWF5IGhhdmUgcmVhY2hlZCB0aGUgRU9TIGFuZCB0aGUgYXVkaW8gdHJhY2sgaXMgbm90IHN0b3BwZWQgeWV0LgorICAgICAgICAvLyBOb3RlIHRoYXQgQXdlc29tZVBsYXllci9BdWRpb1BsYXllciB3aWxsIG9ubHkgcmV0dXJuIHplcm8gc2l6ZSB3aGVuIGl0IHJlYWNoZXMgdGhlIEVPUy4KKyAgICAgICAgLy8gTnVQbGF5ZXJSZW5kZXJlciB3aWxsIHJldHVybiB6ZXJvIHdoZW4gaXQgZG9lc24ndCBoYXZlIGRhdGEgKGl0IGRvZXNuJ3QgYmxvY2sgdG8gZmlsbCkuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoaXMgaXMgYSBiZW5pZ24gYnVzeS13YWl0LCB3aXRoIHRoZSBuZXh0IGRhdGEgcmVxdWVzdCBnZW5lcmF0ZWQgMTAgbXMgb3IgbW9yZSBsYXRlcjsKKyAgICAgICAgLy8gbmV2ZXJ0aGVsZXNzIGZvciBwb3dlciByZWFzb25zLCB3ZSBkb24ndCB3YW50IHRvIHNlZSB0b28gbWFueSBvZiB0aGVzZS4KIAotICAgICAgICAgICAgbWVtc2V0KGJ1ZmZlci0+cmF3LCAwLCBidWZmZXItPnNpemUpOwotICAgICAgICAgICAgYWN0dWFsU2l6ZSA9IGJ1ZmZlci0+c2l6ZTsKLSAgICAgICAgfQorICAgICAgICBBTE9HVl9JRihhY3R1YWxTaXplID09IDAgJiYgYnVmZmVyLT5zaXplID4gMCwgImNhbGxiYWNrd3JhcHBlcjogZW1wdHkgYnVmZmVyIHJldHVybmVkIik7CiAKKyAgICAgICAgbWUtPm1CeXRlc1dyaXR0ZW4gKz0gYWN0dWFsU2l6ZTsgIC8vIGJlbmlnbiByYWNlIHdpdGggcmVhZGVyLgogICAgICAgICBidWZmZXItPnNpemUgPSBhY3R1YWxTaXplOwogICAgICAgICB9IGJyZWFrOwogCi0KICAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX1NUUkVBTV9FTkQ6CisgICAgICAgIC8vIGN1cnJlbnRseSBvbmx5IG9jY3VycyBmb3Igb2ZmbG9hZGVkIGNhbGxiYWNrcwogICAgICAgICBBTE9HVigiY2FsbGJhY2t3cmFwcGVyOiBkZWxpdmVyIEVWRU5UX1NUUkVBTV9FTkQiKTsKICAgICAgICAgKCptZS0+bUNhbGxiYWNrKShtZSwgTlVMTCAvKiBidWZmZXIgKi8sIDAgLyogc2l6ZSAqLywKICAgICAgICAgICAgICAgICBtZS0+bUNhbGxiYWNrQ29va2llLCBDQl9FVkVOVF9TVFJFQU1fRU5EKTsKQEAgLTE4MDksNiArMjAyOSwxOSBAQAogICAgICAgICAgICAgICAgIG1lLT5tQ2FsbGJhY2tDb29raWUsIENCX0VWRU5UX1RFQVJfRE9XTik7CiAgICAgICAgIGJyZWFrOwogCisgICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9VTkRFUlJVTjoKKyAgICAgICAgLy8gVGhpcyBvY2N1cnMgd2hlbiB0aGVyZSBpcyBubyBkYXRhIGF2YWlsYWJsZSwgdHlwaWNhbGx5CisgICAgICAgIC8vIHdoZW4gdGhlcmUgaXMgYSBmYWlsdXJlIHRvIHN1cHBseSBkYXRhIHRvIHRoZSBBdWRpb1RyYWNrLiAgSXQgY2FuIGFsc28KKyAgICAgICAgLy8gb2NjdXIgaW4gbm9uLW9mZmxvYWRlZCBtb2RlIHdoZW4gdGhlIGF1ZGlvIGRldmljZSBjb21lcyBvdXQgb2Ygc3RhbmRieS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgYW4gQXVkaW9UcmFjayB1bmRlcnJ1bnMgaXQgb3V0cHV0cyBzaWxlbmNlLiBTaW5jZSB0aGlzIGhhcHBlbnMgc3VkZGVubHkKKyAgICAgICAgLy8gaXQgbWF5IHNvdW5kIGxpa2UgYW4gYXVkaWJsZSBwb3Agb3IgZ2xpdGNoLgorICAgICAgICAvLworICAgICAgICAvLyBUaGUgdW5kZXJydW4gZXZlbnQgaXMgc2VudCBvbmNlIHBlciB0cmFjayB1bmRlcnJ1bjsgdGhlIGNvbmRpdGlvbiBpcyByZXNldAorICAgICAgICAvLyB3aGVuIG1vcmUgZGF0YSBpcyBzZW50IHRvIHRoZSBBdWRpb1RyYWNrLgorICAgICAgICBBTE9HSSgiY2FsbGJhY2t3cmFwcGVyOiBFVkVOVF9VTkRFUlJVTiAoZGlzY2FyZGVkKSIpOworICAgICAgICBicmVhazsKKwogICAgIGRlZmF1bHQ6CiAgICAgICAgIEFMT0dFKCJyZWNlaXZlZCB1bmtub3duIGV2ZW50IHR5cGU6ICVkIGluc2lkZSBDYWxsYmFja1dyYXBwZXIgISIsIGV2ZW50KTsKICAgICB9CkBAIC0xODE4LDExICsyMDUxLDEzIEBACiAKIGludCBNZWRpYVBsYXllclNlcnZpY2U6OkF1ZGlvT3V0cHV0OjpnZXRTZXNzaW9uSWQoKSBjb25zdAogeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gbVNlc3Npb25JZDsKIH0KIAogdWludDMyX3QgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpBdWRpb091dHB1dDo6Z2V0U2FtcGxlUmF0ZSgpIGNvbnN0CiB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmIChtVHJhY2sgPT0gMCkgcmV0dXJuIDA7CiAgICAgcmV0dXJuIG1UcmFjay0+Z2V0U2FtcGxlUmF0ZSgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCmluZGV4IDUwNGRjZDIuLmU4ZTUzNjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKQEAgLTM0LDcgKzM0LDEwIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IEF1ZGlvUGxheWJhY2tSYXRlOwogY2xhc3MgQXVkaW9UcmFjazsKK3N0cnVjdCBBVlN5bmNTZXR0aW5nczsKK2NsYXNzIElEYXRhU291cmNlOwogY2xhc3MgSU1lZGlhUmVjb3JkZXI7CiBjbGFzcyBJTWVkaWFNZXRhZGF0YVJldHJpZXZlcjsKIGNsYXNzIElPTVg7CkBAIC05NCwyMSArOTcsMjQgQEAKICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBidWZmZXJDb3VudCwKICAgICAgICAgICAgICAgICBBdWRpb0NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUsCiAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwpOworICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwsCisgICAgICAgICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCA9IGZhbHNlLAorICAgICAgICAgICAgICAgIHVpbnQzMl90IHN1Z2dlc3RlZEZyYW1lQ291bnQgPSAwKTsKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdGFydCgpOwotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgICAgICAgICB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKTsKKyAgICAgICAgdmlydHVhbCBzc2l6ZV90ICAgICAgICAgd3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBibG9ja2luZyA9IHRydWUpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICBzdG9wKCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGZsdXNoKCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIHBhdXNlKCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIGNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlID0gc3RyZWFtVHlwZTsgfQorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKTsKICAgICAgICAgdmlydHVhbCBhdWRpb19zdHJlYW1fdHlwZV90IGdldEF1ZGlvU3RyZWFtVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1UeXBlOyB9CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldEF1ZGlvQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKiBhdHRyaWJ1dGVzKTsKIAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRQbGF5YmFja1JhdGVQZXJtaWxsZShpbnQzMl90IHJhdGVQZXJtaWxsZSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldFBsYXliYWNrUmF0ZShBdWRpb1BsYXliYWNrUmF0ZSogcmF0ZSAvKiBub25udWxsICovKTsKKwogICAgICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpOwogICAgICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBhdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OwpAQCAtMTI1LDcgKzEzMSw4IEBACiAgICAgICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7CiAgICAgICAgIHN0YXRpYyB2b2lkICAgICAgICAgICAgIENhbGxiYWNrV3JhcHBlcigKICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsIHZvaWQgKm1lLCB2b2lkICppbmZvKTsKLSAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgZGVsZXRlUmVjeWNsZWRUcmFjaygpOworICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICBkZWxldGVSZWN5Y2xlZFRyYWNrX2woKTsKKyAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgY2xvc2VfbCgpOwogCiAgICAgICAgIHNwPEF1ZGlvVHJhY2s+ICAgICAgICAgIG1UcmFjazsKICAgICAgICAgc3A8QXVkaW9UcmFjaz4gICAgICAgICAgbVJlY3ljbGVkVHJhY2s7CkBAIC0xMzUsMzggKzE0Miw1MyBAQAogICAgICAgICBDYWxsYmFja0RhdGEgKiAgICAgICAgICBtQ2FsbGJhY2tEYXRhOwogICAgICAgICB1aW50NjRfdCAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuOwogICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICBtU3RyZWFtVHlwZTsKLSAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICptQXR0cmlidXRlczsKKyAgICAgICAgYXVkaW9fYXR0cmlidXRlc190ICogICAgbUF0dHJpYnV0ZXM7CiAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1MZWZ0Vm9sdW1lOwogICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtUmlnaHRWb2x1bWU7Ci0gICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1QbGF5YmFja1JhdGVQZXJtaWxsZTsKKyAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgICAgICAgbVBsYXliYWNrUmF0ZTsKICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGVIejsgLy8gc2FtcGxlIHJhdGUgb2YgdGhlIGNvbnRlbnQsIGFzIHNldCBpbiBvcGVuKCkKICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbU1zZWNzUGVyRnJhbWU7CisgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemU7CiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQ7CiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1VaWQ7CiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1QaWQ7CiAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1TZW5kTGV2ZWw7CiAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1BdXhFZmZlY3RJZDsKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgICAgbUZsYWdzOworICAgICAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICBtTG9jazsKKworICAgICAgICAvLyBzdGF0aWMgdmFyaWFibGVzIGJlbG93IG5vdCBwcm90ZWN0ZWQgYnkgbXV0ZXgKICAgICAgICAgc3RhdGljIGJvb2wgICAgICAgICAgICAgbUlzT25FbXVsYXRvcjsKICAgICAgICAgc3RhdGljIGludCAgICAgICAgICAgICAgbU1pbkJ1ZmZlckNvdW50OyAgLy8gMTIgZm9yIGVtdWxhdG9yOyBvdGhlcndpc2UgNAotICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAgICBtRmxhZ3M7CiAKICAgICAgICAgLy8gQ2FsbGJhY2tEYXRhIGlzIHdoYXQgaXMgcGFzc2VkIHRvIHRoZSBBdWRpb1RyYWNrIGFzIHRoZSAidXNlciIgZGF0YS4KICAgICAgICAgLy8gV2UgbmVlZCB0byBiZSBhYmxlIHRvIHRhcmdldCB0aGlzIHRvIGEgZGlmZmVyZW50IE91dHB1dCBvbiB0aGUgZmx5LAogICAgICAgICAvLyBzbyB3ZSBjYW4ndCB1c2UgdGhlIE91dHB1dCBpdHNlbGYgZm9yIHRoaXMuCiAgICAgICAgIGNsYXNzIENhbGxiYWNrRGF0YSB7CisgICAgICAgICAgICBmcmllbmQgQXVkaW9PdXRwdXQ7CiAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgIENhbGxiYWNrRGF0YShBdWRpb091dHB1dCAqY29va2llKSB7CiAgICAgICAgICAgICAgICAgbURhdGEgPSBjb29raWU7CiAgICAgICAgICAgICAgICAgbVN3aXRjaGluZyA9IGZhbHNlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQXVkaW9PdXRwdXQgKiAgIGdldE91dHB1dCgpIHsgcmV0dXJuIG1EYXRhO30KKyAgICAgICAgICAgIEF1ZGlvT3V0cHV0ICogICBnZXRPdXRwdXQoKSBjb25zdCB7IHJldHVybiBtRGF0YTsgfQogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHNldE91dHB1dChBdWRpb091dHB1dCogbmV3Y29va2llKSB7IG1EYXRhID0gbmV3Y29va2llOyB9CiAgICAgICAgICAgICAvLyBsb2NrL3VubG9jayBhcmUgdXNlZCBieSB0aGUgY2FsbGJhY2sgYmVmb3JlIGFjY2Vzc2luZyB0aGUgcGF5bG9hZCBvZiB0aGlzIG9iamVjdAotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGxvY2soKSB7IG1Mb2NrLmxvY2soKTsgfQotICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHVubG9jaygpIHsgbUxvY2sudW5sb2NrKCk7IH0KLSAgICAgICAgICAgIC8vIGJlZ2luVHJhY2tTd2l0Y2gvZW5kVHJhY2tTd2l0Y2ggYXJlIHVzZWQgd2hlbiB0aGlzIG9iamVjdCBpcyBiZWluZyBoYW5kZWQgb3ZlcgorICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIGxvY2soKSBjb25zdCB7IG1Mb2NrLmxvY2soKTsgfQorICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIHVubG9jaygpIGNvbnN0IHsgbUxvY2sudW5sb2NrKCk7IH0KKworICAgICAgICAgICAgLy8gdHJ5QmVnaW5UcmFja1N3aXRjaC9lbmRUcmFja1N3aXRjaCBhcmUgdXNlZCB3aGVuIHRoZSBDYWxsYmFja0RhdGEgaXMgaGFuZGVkIG92ZXIKICAgICAgICAgICAgIC8vIHRvIHRoZSBuZXh0IHNpbmsuCi0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgYmVnaW5UcmFja1N3aXRjaCgpIHsgbUxvY2subG9jaygpOyBtU3dpdGNoaW5nID0gdHJ1ZTsgfQorCisgICAgICAgICAgICAvLyB0cnlCZWdpblRyYWNrU3dpdGNoKCkgcmV0dXJucyB0cnVlIG9ubHkgaWYgaXQgb2J0YWlucyB0aGUgbG9jay4KKyAgICAgICAgICAgIGJvb2wgICAgICAgICAgICB0cnlCZWdpblRyYWNrU3dpdGNoKCkgeworICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVN3aXRjaGluZywgInRyeUJlZ2luVHJhY2tTd2l0Y2goKSBhbHJlYWR5IGNhbGxlZCIpOworICAgICAgICAgICAgICAgIGlmIChtTG9jay50cnlMb2NrKCkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtU3dpdGNoaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBlbmRUcmFja1N3aXRjaCgpIHsKICAgICAgICAgICAgICAgICBpZiAobVN3aXRjaGluZykgewogICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKQEAgLTE3NSw3ICsxOTcsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgQXVkaW9PdXRwdXQgKiAgIG1EYXRhOwotICAgICAgICAgICAgbXV0YWJsZSBNdXRleCAgIG1Mb2NrOworICAgICAgICAgICAgbXV0YWJsZSBNdXRleCAgIG1Mb2NrOyAvLyBhIHJlY3Vyc2l2ZSBtdXRleCBtaWdodCBtYWtlIHRoaXMgdW5uZWNlc3NhcnkuCiAgICAgICAgICAgICBib29sICAgICAgICAgICAgbVN3aXRjaGluZzsKICAgICAgICAgICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENhbGxiYWNrRGF0YSk7CiAgICAgICAgIH07CkBAIC0xODcsNyArMjA5LDcgQEAKICAgICBzdGF0aWMgIHZvaWQgICAgICAgICAgICAgICAgaW5zdGFudGlhdGUoKTsKIAogICAgIC8vIElNZWRpYVBsYXllclNlcnZpY2UgaW50ZXJmYWNlCi0gICAgdmlydHVhbCBzcDxJTWVkaWFSZWNvcmRlcj4gIGNyZWF0ZU1lZGlhUmVjb3JkZXIoKTsKKyAgICB2aXJ0dWFsIHNwPElNZWRpYVJlY29yZGVyPiAgY3JlYXRlTWVkaWFSZWNvcmRlcihjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSk7CiAgICAgdm9pZCAgICByZW1vdmVNZWRpYVJlY29yZGVyQ2xpZW50KHdwPE1lZGlhUmVjb3JkZXJDbGllbnQ+IGNsaWVudCk7CiAgICAgdmlydHVhbCBzcDxJTWVkaWFNZXRhZGF0YVJldHJpZXZlcj4gY3JlYXRlTWV0YWRhdGFSZXRyaWV2ZXIoKTsKIApAQCAtMTk5LDggKzIyMSw4IEBACiAgICAgdmlydHVhbCBzcDxJRHJtPiAgICAgICAgICAgIG1ha2VEcm0oKTsKICAgICB2aXJ0dWFsIHNwPElIRENQPiAgICAgICAgICAgbWFrZUhEQ1AoYm9vbCBjcmVhdGVFbmNyeXB0aW9uTW9kdWxlKTsKIAotICAgIHZpcnR1YWwgc3A8SVJlbW90ZURpc3BsYXk+IGxpc3RlbkZvclJlbW90ZURpc3BsYXkoY29uc3Qgc3A8SVJlbW90ZURpc3BsYXlDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBpZmFjZSk7CisgICAgdmlydHVhbCBzcDxJUmVtb3RlRGlzcGxheT4gbGlzdGVuRm9yUmVtb3RlRGlzcGxheShjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElSZW1vdGVEaXNwbGF5Q2xpZW50PiYgY2xpZW50LCBjb25zdCBTdHJpbmc4JiBpZmFjZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICByZW1vdmVDbGllbnQod3A8Q2xpZW50PiBjbGllbnQpOwpAQCAtMjYyLDYgKzI4NCwxMSBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzdG9wKCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHBhdXNlKCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGlzUGxheWluZyhib29sKiBzdGF0ZSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIHNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHJhdGUpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlKiByYXRlIC8qIG5vbm51bGwgKi8pOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MmIHJhdGUsIGZsb2F0IHZpZGVvRnBzSGludCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGdldFN5bmNTZXR0aW5ncyhBVlN5bmNTZXR0aW5ncyogcmF0ZSAvKiBub25udWxsICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHZpZGVvRnBzIC8qIG5vbm51bGwgKi8pOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZWVrVG8oaW50IG1zZWMpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBnZXRDdXJyZW50UG9zaXRpb24oaW50KiBtc2VjKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgZ2V0RHVyYXRpb24oaW50KiBtc2VjKTsKQEAgLTI5Miw2ICszMTksOCBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZXREYXRhU291cmNlKGNvbnN0IHNwPElEYXRhU291cmNlPiAmc291cmNlKTsKKwogCiAgICAgICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gICAgIHNldERhdGFTb3VyY2VfcHJlKHBsYXllcl90eXBlIHBsYXllclR5cGUpOwogICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlX3Bvc3QoY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlPiYgcCwKQEAgLTMwMSw3ICszMzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaik7CiAKICAgICAgICAgICAgICAgICBwaWRfdCAgICAgICAgICAgcGlkKCkgY29uc3QgeyByZXR1cm4gbVBpZDsgfQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBnZXRBdWRpb1Nlc3Npb25JZCgpIHsgcmV0dXJuIG1BdWRpb1Nlc3Npb25JZDsgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKaW5kZXggMTk0YWJiYi4uZjc2MWRlYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcApAQCAtNTUsNiArNTUsMTYgQEAKICAgICByZXR1cm4gb2s7CiB9CiAKK3N0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldElucHV0U3VyZmFjZShjb25zdCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiYgc3VyZmFjZSkKK3sKKyAgICBBTE9HVigic2V0SW5wdXRTdXJmYWNlIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtUmVjb3JkZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgicmVjb3JkZXIgaXMgbm90IGluaXRpYWxpemVkIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbVJlY29yZGVyLT5zZXRJbnB1dFN1cmZhY2Uoc3VyZmFjZSk7Cit9CiAKIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnF1ZXJ5U3VyZmFjZU1lZGlhU291cmNlKCkKIHsKQEAgLTE1NCwxNyArMTY0LDYgQEAKICAgICByZXR1cm4gbVJlY29yZGVyLT5zZXRBdWRpb0VuY29kZXIoKGF1ZGlvX2VuY29kZXIpYWUpOwogfQogCi1zdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpzZXRPdXRwdXRGaWxlKGNvbnN0IGNoYXIqIHBhdGgpCi17Ci0gICAgQUxPR1YoInNldE91dHB1dEZpbGUoJXMpIiwgcGF0aCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtUmVjb3JkZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgicmVjb3JkZXIgaXMgbm90IGluaXRpYWxpemVkIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbVJlY29yZGVyLT5zZXRPdXRwdXRGaWxlKHBhdGgpOwotfQotCiBzdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQogewogICAgIEFMT0dWKCJzZXRPdXRwdXRGaWxlKCVkLCAlbGxkLCAlbGxkKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CkBAIC0zMDEsMTEgKzMwMCwxMiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotTWVkaWFSZWNvcmRlckNsaWVudDo6TWVkaWFSZWNvcmRlckNsaWVudChjb25zdCBzcDxNZWRpYVBsYXllclNlcnZpY2U+JiBzZXJ2aWNlLCBwaWRfdCBwaWQpCitNZWRpYVJlY29yZGVyQ2xpZW50OjpNZWRpYVJlY29yZGVyQ2xpZW50KGNvbnN0IHNwPE1lZGlhUGxheWVyU2VydmljZT4mIHNlcnZpY2UsIHBpZF90IHBpZCwKKyAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpCiB7CiAgICAgQUxPR1YoIkNsaWVudCBjb25zdHJ1Y3RvciIpOwogICAgIG1QaWQgPSBwaWQ7Ci0gICAgbVJlY29yZGVyID0gbmV3IFN0YWdlZnJpZ2h0UmVjb3JkZXI7CisgICAgbVJlY29yZGVyID0gbmV3IFN0YWdlZnJpZ2h0UmVjb3JkZXIob3BQYWNrYWdlTmFtZSk7CiAgICAgbU1lZGlhUGxheWVyU2VydmljZSA9IHNlcnZpY2U7CiB9CiAKQEAgLTMzNiw3ICszMzYsNyBAQAogICAgIHJldHVybiBtUmVjb3JkZXItPnNldENsaWVudE5hbWUoY2xpZW50TmFtZSk7CiB9CiAKLXN0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdCB7CitzdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgewogICAgIGlmIChtUmVjb3JkZXIgIT0gTlVMTCkgewogICAgICAgICByZXR1cm4gbVJlY29yZGVyLT5kdW1wKGZkLCBhcmdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaAppbmRleCBhNjVlYzlmLi4wNTEzMGQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKQEAgLTM4LDcgKzM4LDYgQEAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIHNldE91dHB1dEZvcm1hdChpbnQgb2YpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgc2V0VmlkZW9FbmNvZGVyKGludCB2ZSk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBzZXRBdWRpb0VuY29kZXIoaW50IGFlKTsKLSAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIHNldE91dHB1dEZpbGUoY29uc3QgY2hhciogcGF0aCk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbGVuZ3RoKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIHNldFZpZGVvU2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwpAQCAtNTUsNyArNTQsOCBAQAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgaW5pdCgpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgY2xvc2UoKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIHJlbGVhc2UoKTsKLSAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIHNldElucHV0U3VyZmFjZShjb25zdCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiYgc3VyZmFjZSk7CiAgICAgdmlydHVhbCAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcXVlcnlTdXJmYWNlTWVkaWFTb3VyY2UoKTsKIAogcHJpdmF0ZToKQEAgLTYzLDcgKzYzLDggQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZWNvcmRlckNsaWVudCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXJTZXJ2aWNlPiYgc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICAgICB+TWVkaWFSZWNvcmRlckNsaWVudCgpOwogCiAgICAgcGlkX3QgICAgICAgICAgICAgICAgICBtUGlkOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKaW5kZXggMGY1YTAxYi4uZjZhY2RmNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9WaWRlb0ZyYW1lLmg+CiAjaW5jbHVkZSAiTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuaCIKICNpbmNsdWRlICJTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgiCkBAIC01Niw3ICs1Nyw3IEBACiAgICAgZGlzY29ubmVjdCgpOwogfQogCi1zdGF0dXNfdCBNZXRhZGF0YVJldHJpZXZlckNsaWVudDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qYXJncyovKSBjb25zdAorc3RhdHVzX3QgTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiAvKmFyZ3MqLykKIHsKICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKQEAgLTE0MCw3ICsxNDEsNyBAQAogICAgICAgICBBTE9HRSgiZnN0YXQoJWQpIGZhaWxlZDogJWQsICVzIiwgZmQsIHJldCwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgQUxPR1YoInN0X2RldiAgPSAlbGx1Iiwgc2Iuc3RfZGV2KTsKKyAgICBBTE9HVigic3RfZGV2ICA9ICVsbHUiLCBzdGF0aWNfY2FzdDx1aW50NjRfdD4oc2Iuc3RfZGV2KSk7CiAgICAgQUxPR1YoInN0X21vZGUgPSAldSIsIHNiLnN0X21vZGUpOwogICAgIEFMT0dWKCJzdF91aWQgID0gJWx1Iiwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oc2Iuc3RfdWlkKSk7CiAgICAgQUxPR1YoInN0X2dpZCAgPSAlbHUiLCBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihzYi5zdF9naWQpKTsKQEAgLTE3MywxMCArMTc0LDMwIEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdHVzX3QgTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQ6OnNldERhdGFTb3VyY2UoCisgICAgICAgIGNvbnN0IHNwPElEYXRhU291cmNlPiYgc291cmNlKQoreworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKElEYXRhU291cmNlKSIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKworICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBEYXRhU291cmNlOjpDcmVhdGVGcm9tSURhdGFTb3VyY2Uoc291cmNlKTsKKyAgICBwbGF5ZXJfdHlwZSBwbGF5ZXJUeXBlID0KKyAgICAgICAgTWVkaWFQbGF5ZXJGYWN0b3J5OjpnZXRQbGF5ZXJUeXBlKE5VTEwgLyogY2xpZW50ICovLCBkYXRhU291cmNlKTsKKyAgICBBTE9HVigicGxheWVyIHR5cGUgPSAlZCIsIHBsYXllclR5cGUpOworICAgIHNwPE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXJCYXNlPiBwID0gY3JlYXRlUmV0cmlldmVyKHBsYXllclR5cGUpOworICAgIGlmIChwID09IE5VTEwpIHJldHVybiBOT19JTklUOworICAgIHN0YXR1c190IHJldCA9IHAtPnNldERhdGFTb3VyY2UoZGF0YVNvdXJjZSk7CisgICAgaWYgKHJldCA9PSBOT19FUlJPUikgbVJldHJpZXZlciA9IHA7CisgICAgcmV0dXJuIHJldDsKK30KKworTXV0ZXggTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQ6OnNMb2NrOworCiBzcDxJTWVtb3J5PiBNZXRhZGF0YVJldHJpZXZlckNsaWVudDo6Z2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pCiB7CiAgICAgQUxPR1YoImdldEZyYW1lQXRUaW1lOiB0aW1lKCVsbGQgdXMpIG9wdGlvbiglZCkiLCB0aW1lVXMsIG9wdGlvbik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIE11dGV4OjpBdXRvbG9jayBnbG9jayhzTG9jayk7CiAgICAgbVRodW1ibmFpbC5jbGVhcigpOwogICAgIGlmIChtUmV0cmlldmVyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoInJldHJpZXZlciBpcyBub3QgaW5pdGlhbGl6ZWQiKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgKaW5kZXggOWQzZmJlOS4uZmU3NTQ3YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgKQEAgLTQ5LDExICs0OSwxMiBAQAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICAgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SURhdGFTb3VyY2U+JiBzb3VyY2UpOwogICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgICAgICAgICAgZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pOwogICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gICAgICAgICAgICAgZXh0cmFjdEFsYnVtQXJ0KCk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyKiAgICAgICAgICAgICBleHRyYWN0TWV0YWRhdGEoaW50IGtleUNvZGUpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIE1lZGlhUGxheWVyU2VydmljZTsKQEAgLTYyLDYgKzYzLDcgQEAKICAgICB2aXJ0dWFsIH5NZXRhZGF0YVJldHJpZXZlckNsaWVudCgpOwogCiAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CisgICAgc3RhdGljICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgc0xvY2s7CiAgICAgc3A8TWVkaWFNZXRhZGF0YVJldHJpZXZlckJhc2U+ICAgICAgICAgbVJldHJpZXZlcjsKICAgICBwaWRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGlkOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvUmVtb3RlRGlzcGxheS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvUmVtb3RlRGlzcGxheS5jcHAKaW5kZXggZWI5NTliNC4uMGViNGI1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1JlbW90ZURpc3BsYXkuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9SZW1vdGVEaXNwbGF5LmNwcApAQCAtMjYsMTMgKzI2LDE0IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIFJlbW90ZURpc3BsYXk6OlJlbW90ZURpc3BsYXkoCisgICAgICAgIGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lLAogICAgICAgICBjb25zdCBzcDxJUmVtb3RlRGlzcGxheUNsaWVudD4gJmNsaWVudCwKICAgICAgICAgY29uc3QgY2hhciAqaWZhY2UpCiAgICAgOiBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKICAgICAgIG1OZXRTZXNzaW9uKG5ldyBBTmV0d29ya1Nlc3Npb24pIHsKICAgICBtTG9vcGVyLT5zZXROYW1lKCJ3ZmRfbG9vcGVyIik7CiAKLSAgICBtU291cmNlID0gbmV3IFdpZmlEaXNwbGF5U291cmNlKG1OZXRTZXNzaW9uLCBjbGllbnQpOworICAgIG1Tb3VyY2UgPSBuZXcgV2lmaURpc3BsYXlTb3VyY2Uob3BQYWNrYWdlTmFtZSwgbU5ldFNlc3Npb24sIGNsaWVudCk7CiAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1Tb3VyY2UpOwogCiAgICAgbU5ldFNlc3Npb24tPnN0YXJ0KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvUmVtb3RlRGlzcGxheS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1JlbW90ZURpc3BsYXkuaAppbmRleCA4MmEwMTE2Li5kNDU3M2U5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvUmVtb3RlRGlzcGxheS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9SZW1vdGVEaXNwbGF5LmgKQEAgLTI4LDExICsyOCwxMiBAQAogCiBzdHJ1Y3QgQUxvb3BlcjsKIHN0cnVjdCBBTmV0d29ya1Nlc3Npb247Ci1zdHJ1Y3QgSVJlbW90ZURpc3BsYXlDbGllbnQ7CitjbGFzcyBJUmVtb3RlRGlzcGxheUNsaWVudDsKIHN0cnVjdCBXaWZpRGlzcGxheVNvdXJjZTsKIAogc3RydWN0IFJlbW90ZURpc3BsYXkgOiBwdWJsaWMgQm5SZW1vdGVEaXNwbGF5IHsKICAgICBSZW1vdGVEaXNwbGF5KAorICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYgJm9wUGFja2FnZU5hbWUsCiAgICAgICAgICAgICBjb25zdCBzcDxJUmVtb3RlRGlzcGxheUNsaWVudD4gJmNsaWVudCwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmlmYWNlKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5jcHAKaW5kZXggYjM3YWVlMy4uM2ZlZGQ5YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRQbGF5ZXIuY3BwCkBAIC0xODgsNiArMTg4LDE0IEBACiAgICAgcmV0dXJuIG1QbGF5ZXItPmdldFBhcmFtZXRlcihrZXksIHJlcGx5KTsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRQbGF5ZXI6OnNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpIHsKKyAgICByZXR1cm4gbVBsYXllci0+c2V0UGxheWJhY2tTZXR0aW5ncyhyYXRlKTsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRQbGF5ZXI6OmdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUgLyogbm9ubnVsbCAqLykgeworICAgIHJldHVybiBtUGxheWVyLT5nZXRQbGF5YmFja1NldHRpbmdzKHJhdGUpOworfQorCiBzdGF0dXNfdCBTdGFnZWZyaWdodFBsYXllcjo6Z2V0TWV0YWRhdGEoCiAgICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiAvKiBpZHMgKi8sIFBhcmNlbCAqcmVjb3JkcykgewogICAgIHVzaW5nIG1lZGlhOjpNZXRhZGF0YTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFBsYXllci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmgKaW5kZXggZTZjMzBmZi4uOTYwMTNkZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UGxheWVyLmgKQEAgLTYwLDYgKzYwLDggQEAKICAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9TaW5rKGNvbnN0IHNwPEF1ZGlvU2luaz4gJmF1ZGlvU2luayk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSAvKiBub25udWxsICovKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YWRhdGEoCiAgICAgICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgaWRzLCBQYXJjZWwgKnJlY29yZHMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCmluZGV4IDg2NjM5Y2IuLmU1MjFmYWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKQEAgLTY5LDEyICs2OSwxMiBAQAogfQogCiAKLVN0YWdlZnJpZ2h0UmVjb3JkZXI6OlN0YWdlZnJpZ2h0UmVjb3JkZXIoKQotICAgIDogbVdyaXRlcihOVUxMKSwKK1N0YWdlZnJpZ2h0UmVjb3JkZXI6OlN0YWdlZnJpZ2h0UmVjb3JkZXIoY29uc3QgU3RyaW5nMTYgJm9wUGFja2FnZU5hbWUpCisgICAgOiBNZWRpYVJlY29yZGVyQmFzZShvcFBhY2thZ2VOYW1lKSwKKyAgICAgIG1Xcml0ZXIoTlVMTCksCiAgICAgICBtT3V0cHV0RmQoLTEpLAogICAgICAgbUF1ZGlvU291cmNlKEFVRElPX1NPVVJDRV9DTlQpLAogICAgICAgbVZpZGVvU291cmNlKFZJREVPX1NPVVJDRV9MSVNUX0VORCksCi0gICAgICBtQ2FwdHVyZVRpbWVMYXBzZShmYWxzZSksCiAgICAgICBtU3RhcnRlZChmYWxzZSkgewogCiAgICAgQUxPR1YoIkNvbnN0cnVjdG9yIik7CkBAIC0yMDYsNyArMjA2LDcgQEAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFZpZGVvRnJhbWVSYXRlKGludCBmcmFtZXNfcGVyX3NlY29uZCkgewogICAgIEFMT0dWKCJzZXRWaWRlb0ZyYW1lUmF0ZTogJWQiLCBmcmFtZXNfcGVyX3NlY29uZCk7CiAgICAgaWYgKChmcmFtZXNfcGVyX3NlY29uZCA8PSAwICYmIGZyYW1lc19wZXJfc2Vjb25kICE9IC0xKSB8fAotICAgICAgICBmcmFtZXNfcGVyX3NlY29uZCA+IDEyMCkgeworICAgICAgICBmcmFtZXNfcGVyX3NlY29uZCA+IGtNYXhIaWdoU3BlZWRGcHMpIHsKICAgICAgICAgQUxPR0UoIkludmFsaWQgdmlkZW8gZnJhbWUgcmF0ZTogJWQiLCBmcmFtZXNfcGVyX3NlY29uZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQpAQCAtMjQxLDEyICsyNDEsMTEgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldE91dHB1dEZpbGUoY29uc3QgY2hhciAqIC8qIHBhdGggKi8pIHsKLSAgICBBTE9HRSgic2V0T3V0cHV0RmlsZShjb25zdCBjaGFyKikgbXVzdCBub3QgYmUgY2FsbGVkIik7Ci0gICAgLy8gV2UgZG9uJ3QgYWN0dWFsbHkgc3VwcG9ydCB0aGlzIGF0IGFsbCwgYXMgdGhlIG1lZGlhX3NlcnZlciBwcm9jZXNzCi0gICAgLy8gbm8gbG9uZ2VyIGhhcyBwZXJtaXNzaW9ucyB0byBjcmVhdGUgZmlsZXMuCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRJbnB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+JiBzdXJmYWNlKSB7CisgICAgbVBlcnNpc3RlbnRTdXJmYWNlID0gc3VyZmFjZTsKIAotICAgIHJldHVybiAtRVBFUk07CisgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRPdXRwdXRGaWxlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSB7CkBAIC0yNzEsNiArMjcwLDMxIEBACiAgICAgcmV0dXJuIE9LOwogfQogCisvLyBBdHRlbXB0IHRvIHBhcnNlIGFuIGZsb2F0IGxpdGVyYWwgb3B0aW9uYWxseSBzdXJyb3VuZGVkIGJ5IHdoaXRlc3BhY2UsCisvLyByZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgorc3RhdGljIGJvb2wgc2FmZV9zdHJ0b2YoY29uc3QgY2hhciAqcywgZmxvYXQgKnZhbCkgeworICAgIGNoYXIgKmVuZDsKKworICAgIC8vIEl0IGlzIGxhbWUsIGJ1dCBhY2NvcmRpbmcgdG8gbWFuIHBhZ2UsIHdlIGhhdmUgdG8gc2V0IGVycm5vIHRvIDAKKyAgICAvLyBiZWZvcmUgY2FsbGluZyBzdHJ0b2YoKS4KKyAgICBlcnJubyA9IDA7CisgICAgKnZhbCA9IHN0cnRvZihzLCAmZW5kKTsKKworICAgIGlmIChlbmQgPT0gcyB8fCBlcnJubyA9PSBFUkFOR0UpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFNraXAgdHJhaWxpbmcgd2hpdGVzcGFjZQorICAgIHdoaWxlIChpc3NwYWNlKCplbmQpKSB7CisgICAgICAgICsrZW5kOworICAgIH0KKworICAgIC8vIEZvciBhIHN1Y2Nlc3NmdWwgcmV0dXJuLCB0aGUgc3RyaW5nIG11c3QgY29udGFpbiBub3RoaW5nIGJ1dCBhIHZhbGlkCisgICAgLy8gZmxvYXQgbGl0ZXJhbCBvcHRpb25hbGx5IHN1cnJvdW5kZWQgYnkgd2hpdGVzcGFjZS4KKworICAgIHJldHVybiAqZW5kID09ICdcMCc7Cit9CisKIC8vIEF0dGVtcHQgdG8gcGFyc2UgYW4gaW50NjQgbGl0ZXJhbCBvcHRpb25hbGx5IHN1cnJvdW5kZWQgYnkgd2hpdGVzcGFjZSwKIC8vIHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCiBzdGF0aWMgYm9vbCBzYWZlX3N0cnRvaTY0KGNvbnN0IGNoYXIgKnMsIGludDY0X3QgKnZhbCkgewpAQCAtNTQxLDI5ICs1NjUsMzIgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtVGltZUxhcHNlRW5hYmxlKGludDMyX3QgdGltZUxhcHNlRW5hYmxlKSB7Ci0gICAgQUxPR1YoInNldFBhcmFtVGltZUxhcHNlRW5hYmxlOiAlZCIsIHRpbWVMYXBzZUVuYWJsZSk7CitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQYXJhbUNhcHR1cmVGcHNFbmFibGUoaW50MzJfdCBjYXB0dXJlRnBzRW5hYmxlKSB7CisgICAgQUxPR1YoInNldFBhcmFtQ2FwdHVyZUZwc0VuYWJsZTogJWQiLCBjYXB0dXJlRnBzRW5hYmxlKTsKIAotICAgIGlmKHRpbWVMYXBzZUVuYWJsZSA9PSAwKSB7Ci0gICAgICAgIG1DYXB0dXJlVGltZUxhcHNlID0gZmFsc2U7Ci0gICAgfSBlbHNlIGlmICh0aW1lTGFwc2VFbmFibGUgPT0gMSkgewotICAgICAgICBtQ2FwdHVyZVRpbWVMYXBzZSA9IHRydWU7CisgICAgaWYoY2FwdHVyZUZwc0VuYWJsZSA9PSAwKSB7CisgICAgICAgIG1DYXB0dXJlRnBzRW5hYmxlID0gZmFsc2U7CisgICAgfSBlbHNlIGlmIChjYXB0dXJlRnBzRW5hYmxlID09IDEpIHsKKyAgICAgICAgbUNhcHR1cmVGcHNFbmFibGUgPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UGFyYW1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZShpbnQ2NF90IHRpbWVVcykgewotICAgIEFMT0dWKCJzZXRQYXJhbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlOiAlbGxkIHVzIiwgdGltZVVzKTsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFBhcmFtQ2FwdHVyZUZwcyhmbG9hdCBmcHMpIHsKKyAgICBBTE9HVigic2V0UGFyYW1DYXB0dXJlRnBzOiAlLjJmIiwgZnBzKTsKKworICAgIGludDY0X3QgdGltZVVzID0gKGludDY0X3QpICgxMDAwMDAwLjAgLyBmcHMgKyAwLjVmKTsKIAogICAgIC8vIE5vdCBhbGxvd2luZyB0aW1lIG1vcmUgdGhhbiBhIGRheQogICAgIGlmICh0aW1lVXMgPD0gMCB8fCB0aW1lVXMgPiA4NjQwMCoxRTYpIHsKLSAgICAgICAgQUxPR0UoIlRpbWUgYmV0d2VlbiB0aW1lIGxhcHNlIGZyYW1lIGNhcHR1cmUgKCVsbGQpIGlzIG91dCBvZiByYW5nZSBbMCwgMSBEYXldIiwgdGltZVVzKTsKKyAgICAgICAgQUxPR0UoIlRpbWUgYmV0d2VlbiBmcmFtZSBjYXB0dXJlICglbGxkKSBpcyBvdXQgb2YgcmFuZ2UgWzAsIDEgRGF5XSIsIHRpbWVVcyk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMgPSB0aW1lVXM7CisgICAgbUNhcHR1cmVGcHMgPSBmcHM7CisgICAgbVRpbWVCZXR3ZWVuQ2FwdHVyZVVzID0gdGltZVVzOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtNjg2LDE1ICs3MTMsMTQgQEAKICAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVZpZGVvVGltZVNjYWxlKHRpbWVTY2FsZSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGtleSA9PSAidGltZS1sYXBzZS1lbmFibGUiKSB7Ci0gICAgICAgIGludDMyX3QgdGltZUxhcHNlRW5hYmxlOwotICAgICAgICBpZiAoc2FmZV9zdHJ0b2kzMih2YWx1ZS5zdHJpbmcoKSwgJnRpbWVMYXBzZUVuYWJsZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbVRpbWVMYXBzZUVuYWJsZSh0aW1lTGFwc2VFbmFibGUpOworICAgICAgICBpbnQzMl90IGNhcHR1cmVGcHNFbmFibGU7CisgICAgICAgIGlmIChzYWZlX3N0cnRvaTMyKHZhbHVlLnN0cmluZygpLCAmY2FwdHVyZUZwc0VuYWJsZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbUNhcHR1cmVGcHNFbmFibGUoY2FwdHVyZUZwc0VuYWJsZSk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGtleSA9PSAidGltZS1iZXR3ZWVuLXRpbWUtbGFwc2UtZnJhbWUtY2FwdHVyZSIpIHsKLSAgICAgICAgaW50NjRfdCB0aW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzOwotICAgICAgICBpZiAoc2FmZV9zdHJ0b2k2NCh2YWx1ZS5zdHJpbmcoKSwgJnRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2V0UGFyYW1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZSgKLSAgICAgICAgICAgICAgICAgICAgdGltZUJldHdlZW5UaW1lTGFwc2VGcmFtZUNhcHR1cmVVcyk7CisgICAgfSBlbHNlIGlmIChrZXkgPT0gInRpbWUtbGFwc2UtZnBzIikgeworICAgICAgICBmbG9hdCBmcHM7CisgICAgICAgIGlmIChzYWZlX3N0cnRvZih2YWx1ZS5zdHJpbmcoKSwgJmZwcykpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXRQYXJhbUNhcHR1cmVGcHMoZnBzKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJzZXRQYXJhbWV0ZXI6IGZhaWxlZCB0byBmaW5kIGtleSAlcyIsIGtleS5zdHJpbmcoKSk7CkBAIC04ODIsMTEgKzkwOCwzMiBAQAogfQogCiBzcDxNZWRpYVNvdXJjZT4gU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Y3JlYXRlQXVkaW9Tb3VyY2UoKSB7CisgICAgaW50MzJfdCBzb3VyY2VTYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CisKKyAgICBpZiAobUNhcHR1cmVGcHNFbmFibGUgJiYgbUNhcHR1cmVGcHMgPj0gbUZyYW1lUmF0ZSkgeworICAgICAgICAvLyBVcHNjYWxlIHRoZSBzYW1wbGUgcmF0ZSBmb3Igc2xvdyBtb3Rpb24gcmVjb3JkaW5nLgorICAgICAgICAvLyBGYWlsIGF1ZGlvIHNvdXJjZSBjcmVhdGlvbiBpZiBzb3VyY2Ugc2FtcGxlIHJhdGUgaXMgdG9vIGhpZ2gsIGFzIGl0IGNvdWxkCisgICAgICAgIC8vIGNhdXNlIG91dC1vZi1tZW1vcnkgZHVlIHRvIGxhcmdlIGlucHV0IGJ1ZmZlciBzaXplLiBBbmQgYXVkaW8gcmVjb3JkaW5nCisgICAgICAgIC8vIHByb2JhYmx5IGRvZXNuJ3QgbWFrZSBzZW5zZSBpbiB0aGUgc2NlbmFyaW8sIHNpbmNlIHRoZSBzbG93LWRvd24gZmFjdG9yCisgICAgICAgIC8vIGlzIHByb2JhYmx5IGh1Z2UgKGVnLiBtU2FtcGxlUmF0ZT00OEssIG1DYXB0dXJlRnBzPTI0MCwgbUZyYW1lUmF0ZT0xKS4KKyAgICAgICAgY29uc3Qgc3RhdGljIGludDMyX3QgU0FNUExFX1JBVEVfSFpfTUFYID0gMTkyMDAwOworICAgICAgICBzb3VyY2VTYW1wbGVSYXRlID0KKyAgICAgICAgICAgICAgICAobVNhbXBsZVJhdGUgKiBtQ2FwdHVyZUZwcyArIG1GcmFtZVJhdGUgLyAyKSAvIG1GcmFtZVJhdGU7CisgICAgICAgIGlmIChzb3VyY2VTYW1wbGVSYXRlIDwgbVNhbXBsZVJhdGUgfHwgc291cmNlU2FtcGxlUmF0ZSA+IFNBTVBMRV9SQVRFX0haX01BWCkgeworICAgICAgICAgICAgQUxPR0UoInNvdXJjZSBzYW1wbGUgcmF0ZSBvdXQgb2YgcmFuZ2UhICIKKyAgICAgICAgICAgICAgICAgICAgIihtU2FtcGxlUmF0ZSAlZCwgbUNhcHR1cmVGcHMgJS4yZiwgbUZyYW1lUmF0ZSAlZCIsCisgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtQ2FwdHVyZUZwcywgbUZyYW1lUmF0ZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHNwPEF1ZGlvU291cmNlPiBhdWRpb1NvdXJjZSA9CiAgICAgICAgIG5ldyBBdWRpb1NvdXJjZSgKICAgICAgICAgICAgICAgICBtQXVkaW9Tb3VyY2UsCi0gICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgbUF1ZGlvQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgIHNvdXJjZVNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgbUF1ZGlvQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gYXVkaW9Tb3VyY2UtPmluaXRDaGVjaygpOwogCkBAIC04OTYsNyArOTQzLDYgQEAKICAgICB9CiAKICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlOwotICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgc3dpdGNoIChtQXVkaW9FbmNvZGVyKSB7CiAgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9BTVJfTkI6CiAgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9ERUZBVUxUOgpAQCAtOTM0LDYgKzk4MCw3IEBACiAgICAgaWYgKG1BdWRpb1RpbWVTY2FsZSA+IDApIHsKICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigidGltZS1zY2FsZSIsIG1BdWRpb1RpbWVTY2FsZSk7CiAgICAgfQorICAgIGZvcm1hdC0+c2V0SW50MzIoInByaW9yaXR5IiwgMCAvKiByZWFsdGltZSAqLyk7CiAKICAgICBzcDxNZWRpYVNvdXJjZT4gYXVkaW9FbmNvZGVyID0KICAgICAgICAgICAgIE1lZGlhQ29kZWNTb3VyY2U6OkNyZWF0ZShtTG9vcGVyLCBmb3JtYXQsIGF1ZGlvU291cmNlKTsKQEAgLTExNjUsOCArMTIxMiw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpjaGVja1ZpZGVvRW5jb2RlckNhcGFiaWxpdGllcygKLSAgICAgICAgYm9vbCAqc3VwcG9ydHNDYW1lcmFTb3VyY2VNZXRhRGF0YU1vZGUpIHsKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OmNoZWNrVmlkZW9FbmNvZGVyQ2FwYWJpbGl0aWVzKCkgewogICAgIC8qIGhhcmR3YXJlIGNvZGVjcyBtdXN0IHN1cHBvcnQgY2FtZXJhIHNvdXJjZSBtZXRhIGRhdGEgbW9kZSAqLwogICAgIFZlY3RvcjxDb2RlY0NhcGFiaWxpdGllcz4gY29kZWNzOwogICAgIE9NWENsaWVudCBjbGllbnQ7CkBAIC0xMTc4LDExICsxMjI0LDggQEAKICAgICAgICAgICAgICBtVmlkZW9FbmNvZGVyID09IFZJREVPX0VOQ09ERVJfVlA4ID8gTUVESUFfTUlNRVRZUEVfVklERU9fVlA4IDoKICAgICAgICAgICAgICBtVmlkZW9FbmNvZGVyID09IFZJREVPX0VOQ09ERVJfSDI2NCA/IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyA6ICIiKSwKICAgICAgICAgICAgIGZhbHNlIC8qIGRlY29kZXIgKi8sIHRydWUgLyogaHdDb2RlYyAqLywgJmNvZGVjcyk7Ci0gICAgKnN1cHBvcnRzQ2FtZXJhU291cmNlTWV0YURhdGFNb2RlID0gY29kZWNzLnNpemUoKSA+IDA7Ci0gICAgQUxPR1YoImVuY29kZXIgJXMgY2FtZXJhIHNvdXJjZSBtZXRhLWRhdGEgbW9kZSIsCi0gICAgICAgICAgICAqc3VwcG9ydHNDYW1lcmFTb3VyY2VNZXRhRGF0YU1vZGUgPyAic3VwcG9ydHMiIDogIkRPRVMgTk9UIFNVUFBPUlQiKTsKIAotICAgIGlmICghbUNhcHR1cmVUaW1lTGFwc2UpIHsKKyAgICBpZiAoIW1DYXB0dXJlRnBzRW5hYmxlKSB7CiAgICAgICAgIC8vIERvbnQgY2xpcCBmb3IgdGltZSBsYXBzZSBjYXB0dXJlIGFzIGVuY29kZXIgd2lsbCBoYXZlIGVub3VnaAogICAgICAgICAvLyB0aW1lIHRvIGVuY29kZSBiZWNhdXNlIG9mIHNsb3cgY2FwdHVyZSByYXRlIG9mIHRpbWUgbGFwc2UuCiAgICAgICAgIGNsaXBWaWRlb0JpdFJhdGUoKTsKQEAgLTEzODksMzIgKzE0MzIsMjkgQEAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwQ2FtZXJhU291cmNlKAogICAgICAgICBzcDxDYW1lcmFTb3VyY2U+ICpjYW1lcmFTb3VyY2UpIHsKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBib29sIGVuY29kZXJTdXBwb3J0c0NhbWVyYVNvdXJjZU1ldGFEYXRhTW9kZTsKLSAgICBpZiAoKGVyciA9IGNoZWNrVmlkZW9FbmNvZGVyQ2FwYWJpbGl0aWVzKAotICAgICAgICAgICAgICAgICZlbmNvZGVyU3VwcG9ydHNDYW1lcmFTb3VyY2VNZXRhRGF0YU1vZGUpKSAhPSBPSykgeworICAgIGlmICgoZXJyID0gY2hlY2tWaWRlb0VuY29kZXJDYXBhYmlsaXRpZXMoKSkgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAgICAgU2l6ZSB2aWRlb1NpemU7CiAgICAgdmlkZW9TaXplLndpZHRoID0gbVZpZGVvV2lkdGg7CiAgICAgdmlkZW9TaXplLmhlaWdodCA9IG1WaWRlb0hlaWdodDsKLSAgICBpZiAobUNhcHR1cmVUaW1lTGFwc2UpIHsKLSAgICAgICAgaWYgKG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzIDwgMCkgeworICAgIGlmIChtQ2FwdHVyZUZwc0VuYWJsZSkgeworICAgICAgICBpZiAobVRpbWVCZXR3ZWVuQ2FwdHVyZVVzIDwgMCkgewogICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMgdmFsdWU6ICVsbGQiLAotICAgICAgICAgICAgICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzKTsKKyAgICAgICAgICAgICAgICBtVGltZUJldHdlZW5DYXB0dXJlVXMpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogCiAgICAgICAgIG1DYW1lcmFTb3VyY2VUaW1lTGFwc2UgPSBDYW1lcmFTb3VyY2VUaW1lTGFwc2U6OkNyZWF0ZUZyb21DYW1lcmEoCiAgICAgICAgICAgICAgICAgbUNhbWVyYSwgbUNhbWVyYVByb3h5LCBtQ2FtZXJhSWQsIG1DbGllbnROYW1lLCBtQ2xpZW50VWlkLAogICAgICAgICAgICAgICAgIHZpZGVvU2l6ZSwgbUZyYW1lUmF0ZSwgbVByZXZpZXdTdXJmYWNlLAotICAgICAgICAgICAgICAgIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzLAotICAgICAgICAgICAgICAgIGVuY29kZXJTdXBwb3J0c0NhbWVyYVNvdXJjZU1ldGFEYXRhTW9kZSk7CisgICAgICAgICAgICAgICAgbVRpbWVCZXR3ZWVuQ2FwdHVyZVVzKTsKICAgICAgICAgKmNhbWVyYVNvdXJjZSA9IG1DYW1lcmFTb3VyY2VUaW1lTGFwc2U7CiAgICAgfSBlbHNlIHsKICAgICAgICAgKmNhbWVyYVNvdXJjZSA9IENhbWVyYVNvdXJjZTo6Q3JlYXRlRnJvbUNhbWVyYSgKICAgICAgICAgICAgICAgICBtQ2FtZXJhLCBtQ2FtZXJhUHJveHksIG1DYW1lcmFJZCwgbUNsaWVudE5hbWUsIG1DbGllbnRVaWQsCiAgICAgICAgICAgICAgICAgdmlkZW9TaXplLCBtRnJhbWVSYXRlLAotICAgICAgICAgICAgICAgIG1QcmV2aWV3U3VyZmFjZSwgZW5jb2RlclN1cHBvcnRzQ2FtZXJhU291cmNlTWV0YURhdGFNb2RlKTsKKyAgICAgICAgICAgICAgICBtUHJldmlld1N1cmZhY2UpOwogICAgIH0KICAgICBtQ2FtZXJhLmNsZWFyKCk7CiAgICAgbUNhbWVyYVByb3h5LmNsZWFyKCk7CkBAIC0xNDk5LDE0ICsxNTM5LDEzIEBACiAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkT3BhcXVlKTsKIAogICAgICAgICAvLyBzZXQgdXAgdGltZSBsYXBzZS9zbG93IG1vdGlvbiBmb3Igc3VyZmFjZSBzb3VyY2UKLSAgICAgICAgaWYgKG1DYXB0dXJlVGltZUxhcHNlKSB7Ci0gICAgICAgICAgICBpZiAobVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMgPD0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIG1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZVVzIHZhbHVlOiAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpOworICAgICAgICBpZiAobUNhcHR1cmVGcHNFbmFibGUpIHsKKyAgICAgICAgICAgIGlmIChtVGltZUJldHdlZW5DYXB0dXJlVXMgPD0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIG1UaW1lQmV0d2VlbkNhcHR1cmVVcyB2YWx1ZTogJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBtVGltZUJldHdlZW5DYXB0dXJlVXMpOwogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3JtYXQtPnNldEludDY0KCJ0aW1lLWxhcHNlIiwKLSAgICAgICAgICAgICAgICAgICAgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQ2NCgidGltZS1sYXBzZSIsIG1UaW1lQmV0d2VlbkNhcHR1cmVVcyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE1MjQsNiArMTU2MywxMSBAQAogICAgICAgICBmb3JtYXQtPnNldEludDMyKCJsZXZlbCIsIG1WaWRlb0VuY29kZXJMZXZlbCk7CiAgICAgfQogCisgICAgZm9ybWF0LT5zZXRJbnQzMigicHJpb3JpdHkiLCAwIC8qIHJlYWx0aW1lICovKTsKKyAgICBpZiAobUNhcHR1cmVGcHNFbmFibGUpIHsKKyAgICAgICAgZm9ybWF0LT5zZXRGbG9hdCgib3BlcmF0aW5nLXJhdGUiLCBtQ2FwdHVyZUZwcyk7CisgICAgfQorCiAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwogICAgIGlmIChtSXNNZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzKSB7CiAgICAgICAgIGZsYWdzIHw9IE1lZGlhQ29kZWNTb3VyY2U6OkZMQUdfVVNFX01FVEFEQVRBX0lOUFVUOwpAQCAtMTUzMyw4ICsxNTc3LDggQEAKICAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlY1NvdXJjZTo6RkxBR19VU0VfU1VSRkFDRV9JTlBVVDsKICAgICB9CiAKLSAgICBzcDxNZWRpYUNvZGVjU291cmNlPiBlbmNvZGVyID0KLSAgICAgICAgICAgIE1lZGlhQ29kZWNTb3VyY2U6OkNyZWF0ZShtTG9vcGVyLCBmb3JtYXQsIGNhbWVyYVNvdXJjZSwgZmxhZ3MpOworICAgIHNwPE1lZGlhQ29kZWNTb3VyY2U+IGVuY29kZXIgPSBNZWRpYUNvZGVjU291cmNlOjpDcmVhdGUoCisgICAgICAgICAgICBtTG9vcGVyLCBmb3JtYXQsIGNhbWVyYVNvdXJjZSwgbVBlcnNpc3RlbnRTdXJmYWNlLCBmbGFncyk7CiAgICAgaWYgKGVuY29kZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSB2aWRlbyBlbmNvZGVyIik7CiAgICAgICAgIC8vIFdoZW4gdGhlIGVuY29kZXIgZmFpbHMgdG8gYmUgY3JlYXRlZCwgd2UgbmVlZApAQCAtMTU4OSwxMCArMTYzMywxMSBAQAogCiAgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAgICAgc3A8TWVkaWFXcml0ZXI+IHdyaXRlcjsKKyAgICBzcDxNUEVHNFdyaXRlcj4gbXA0d3JpdGVyOwogICAgIGlmIChtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfV0VCTSkgewogICAgICAgICB3cml0ZXIgPSBuZXcgV2VibVdyaXRlcihtT3V0cHV0RmQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHdyaXRlciA9IG5ldyBNUEVHNFdyaXRlcihtT3V0cHV0RmQpOworICAgICAgICB3cml0ZXIgPSBtcDR3cml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIobU91dHB1dEZkKTsKICAgICB9CiAKICAgICBpZiAobVZpZGVvU291cmNlIDwgVklERU9fU09VUkNFX0xJU1RfRU5EKSB7CkBAIC0xNjE5LDE5ICsxNjY0LDIzIEBACiAgICAgICAgIC8vIFRoaXMgaGVscCBtYWtlIHN1cmUgdGhhdCB0aGUgInJlY29kaW5nIiBzb3VuZCBpcyBzdXBwcmVzc2VkIGZvcgogICAgICAgICAvLyBjYW1jb3JkZXIgYXBwbGljYXRpb25zIGluIHRoZSByZWNvcmRlZCBmaWxlcy4KICAgICAgICAgLy8gVE9ETyBBdWRpbyBzb3VyY2UgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkIGZvciB3ZWJtIG91dHB1dDsgdm9yYmlzIGVuY29kZXIgbmVlZGVkLgotICAgICAgICBpZiAoIW1DYXB0dXJlVGltZUxhcHNlICYmIChtQXVkaW9Tb3VyY2UgIT0gQVVESU9fU09VUkNFX0NOVCkpIHsKKyAgICAgICAgLy8gZGlzYWJsZSBhdWRpbyBmb3IgdGltZSBsYXBzZSByZWNvcmRpbmcKKyAgICAgICAgYm9vbCBkaXNhYmxlQXVkaW8gPSBtQ2FwdHVyZUZwc0VuYWJsZSAmJiBtQ2FwdHVyZUZwcyA8IG1GcmFtZVJhdGU7CisgICAgICAgIGlmICghZGlzYWJsZUF1ZGlvICYmIG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfQ05UKSB7CiAgICAgICAgICAgICBlcnIgPSBzZXR1cEF1ZGlvRW5jb2Rlcih3cml0ZXIpOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKICAgICAgICAgICAgIG1Ub3RhbEJpdFJhdGUgKz0gbUF1ZGlvQml0UmF0ZTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChtQ2FwdHVyZUZwc0VuYWJsZSkgeworICAgICAgICAgICAgbXA0d3JpdGVyLT5zZXRDYXB0dXJlUmF0ZShtQ2FwdHVyZUZwcyk7CisgICAgICAgIH0KKwogICAgICAgICBpZiAobUludGVybGVhdmVEdXJhdGlvblVzID4gMCkgewotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxNUEVHNFdyaXRlciAqPih3cml0ZXIuZ2V0KCkpLT4KLSAgICAgICAgICAgICAgICBzZXRJbnRlcmxlYXZlRHVyYXRpb24obUludGVybGVhdmVEdXJhdGlvblVzKTsKKyAgICAgICAgICAgIG1wNHdyaXRlci0+c2V0SW50ZXJsZWF2ZUR1cmF0aW9uKG1JbnRlcmxlYXZlRHVyYXRpb25Vcyk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1Mb25naXR1ZGV4MTAwMDAgPiAtMzYwMDAwMCAmJiBtTGF0aXR1ZGV4MTAwMDAgPiAtMzYwMDAwMCkgewotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxNUEVHNFdyaXRlciAqPih3cml0ZXIuZ2V0KCkpLT4KLSAgICAgICAgICAgICAgICBzZXRHZW9EYXRhKG1MYXRpdHVkZXgxMDAwMCwgbUxvbmdpdHVkZXgxMDAwMCk7CisgICAgICAgICAgICBtcDR3cml0ZXItPnNldEdlb0RhdGEobUxhdGl0dWRleDEwMDAwLCBtTG9uZ2l0dWRleDEwMDAwKTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAobU1heEZpbGVEdXJhdGlvblVzICE9IDApIHsKQEAgLTE3MDQsNyArMTc1Myw3IEBACiAgICAgQUxPR1YoInN0b3AiKTsKICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKIAotICAgIGlmIChtQ2FwdHVyZVRpbWVMYXBzZSAmJiBtQ2FtZXJhU291cmNlVGltZUxhcHNlICE9IE5VTEwpIHsKKyAgICBpZiAobUNhcHR1cmVGcHNFbmFibGUgJiYgbUNhbWVyYVNvdXJjZVRpbWVMYXBzZSAhPSBOVUxMKSB7CiAgICAgICAgIG1DYW1lcmFTb3VyY2VUaW1lTGFwc2UtPnN0YXJ0UXVpY2tSZWFkUmV0dXJucygpOwogICAgICAgICBtQ2FtZXJhU291cmNlVGltZUxhcHNlID0gTlVMTDsKICAgICB9CkBAIC0xNzE1LDYgKzE3NjQsNyBAQAogICAgIH0KIAogICAgIG1HcmFwaGljQnVmZmVyUHJvZHVjZXIuY2xlYXIoKTsKKyAgICBtUGVyc2lzdGVudFN1cmZhY2UuY2xlYXIoKTsKIAogICAgIGlmIChtT3V0cHV0RmQgPj0gMCkgewogICAgICAgICA6OmNsb3NlKG1PdXRwdXRGZCk7CkBAIC0xNzc4LDggKzE4MjgsOSBAQAogICAgIG1NYXhGaWxlRHVyYXRpb25VcyA9IDA7CiAgICAgbU1heEZpbGVTaXplQnl0ZXMgPSAwOwogICAgIG1UcmFja0V2ZXJ5VGltZUR1cmF0aW9uVXMgPSAwOwotICAgIG1DYXB0dXJlVGltZUxhcHNlID0gZmFsc2U7Ci0gICAgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXMgPSAtMTsKKyAgICBtQ2FwdHVyZUZwc0VuYWJsZSA9IGZhbHNlOworICAgIG1DYXB0dXJlRnBzID0gMC4wZjsKKyAgICBtVGltZUJldHdlZW5DYXB0dXJlVXMgPSAtMTsKICAgICBtQ2FtZXJhU291cmNlVGltZUxhcHNlID0gTlVMTDsKICAgICBtSXNNZXRhRGF0YVN0b3JlZEluVmlkZW9CdWZmZXJzID0gZmFsc2U7CiAgICAgbUVuY29kZXJQcm9maWxlcyA9IE1lZGlhUHJvZmlsZXM6OmdldEluc3RhbmNlKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAppbmRleCA1NGMzOGQzLi5kYTAwYmM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKQEAgLTM1LDEyICszNSwxMyBAQAogY2xhc3MgTWV0YURhdGE7CiBzdHJ1Y3QgQXVkaW9Tb3VyY2U7CiBjbGFzcyBNZWRpYVByb2ZpbGVzOworY2xhc3MgSUdyYXBoaWNCdWZmZXJDb25zdW1lcjsKIGNsYXNzIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CiBjbGFzcyBTdXJmYWNlTWVkaWFTb3VyY2U7Ci1jbGFzcyBBTG9vcGVyOworc3RydWN0IEFMb29wZXI7CiAKIHN0cnVjdCBTdGFnZWZyaWdodFJlY29yZGVyIDogcHVibGljIE1lZGlhUmVjb3JkZXJCYXNlIHsKLSAgICBTdGFnZWZyaWdodFJlY29yZGVyKCk7CisgICAgU3RhZ2VmcmlnaHRSZWNvcmRlcihjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSk7CiAgICAgdmlydHVhbCB+U3RhZ2VmcmlnaHRSZWNvcmRlcigpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0KCk7CkBAIC01Myw3ICs1NCw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb0ZyYW1lUmF0ZShpbnQgZnJhbWVzX3Blcl9zZWNvbmQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FtZXJhKGNvbnN0IHNwPElDYW1lcmE+JiBjYW1lcmEsIGNvbnN0IHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eT4mIHByb3h5KTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZXZpZXdTdXJmYWNlKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBzdXJmYWNlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dEZpbGUoY29uc3QgY2hhciAqcGF0aCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4mIHN1cmZhY2UpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RmlsZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIHBhcmFtcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMaXN0ZW5lcihjb25zdCBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4mIGxpc3RlbmVyKTsKQEAgLTczLDYgKzc0LDcgQEAKICAgICBzcDxJQ2FtZXJhPiBtQ2FtZXJhOwogICAgIHNwPElDYW1lcmFSZWNvcmRpbmdQcm94eT4gbUNhbWVyYVByb3h5OwogICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1QcmV2aWV3U3VyZmFjZTsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBtUGVyc2lzdGVudFN1cmZhY2U7CiAgICAgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+IG1MaXN0ZW5lcjsKICAgICBTdHJpbmcxNiBtQ2xpZW50TmFtZTsKICAgICB1aWRfdCBtQ2xpZW50VWlkOwpAQCAtMTA5LDExICsxMTEsMTEgQEAKICAgICBpbnQzMl90IG1TdGFydFRpbWVPZmZzZXRNczsKICAgICBpbnQzMl90IG1Ub3RhbEJpdFJhdGU7CiAKLSAgICBib29sIG1DYXB0dXJlVGltZUxhcHNlOwotICAgIGludDY0X3QgbVRpbWVCZXR3ZWVuVGltZUxhcHNlRnJhbWVDYXB0dXJlVXM7CisgICAgYm9vbCBtQ2FwdHVyZUZwc0VuYWJsZTsKKyAgICBmbG9hdCBtQ2FwdHVyZUZwczsKKyAgICBpbnQ2NF90IG1UaW1lQmV0d2VlbkNhcHR1cmVVczsKICAgICBzcDxDYW1lcmFTb3VyY2VUaW1lTGFwc2U+IG1DYW1lcmFTb3VyY2VUaW1lTGFwc2U7CiAKLQogICAgIFN0cmluZzggbVBhcmFtczsKIAogICAgIGJvb2wgbUlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVyczsKQEAgLTEyNyw2ICsxMjksOCBAQAogICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1HcmFwaGljQnVmZmVyUHJvZHVjZXI7CiAgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKIAorICAgIHN0YXRpYyBjb25zdCBpbnQga01heEhpZ2hTcGVlZEZwcyA9IDEwMDA7CisKICAgICBzdGF0dXNfdCBwcmVwYXJlSW50ZXJuYWwoKTsKICAgICBzdGF0dXNfdCBzZXR1cE1QRUc0b3JXRUJNUmVjb3JkaW5nKCk7CiAgICAgdm9pZCBzZXR1cE1QRUc0b3JXRUJNTWV0YURhdGEoc3A8TWV0YURhdGE+ICptZXRhKTsKQEAgLTEzNiw4ICsxNDAsNyBAQAogICAgIHN0YXR1c190IHNldHVwUlRQUmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc2V0dXBNUEVHMlRTUmVjb3JkaW5nKCk7CiAgICAgc3A8TWVkaWFTb3VyY2U+IGNyZWF0ZUF1ZGlvU291cmNlKCk7Ci0gICAgc3RhdHVzX3QgY2hlY2tWaWRlb0VuY29kZXJDYXBhYmlsaXRpZXMoCi0gICAgICAgICAgICBib29sICpzdXBwb3J0c0NhbWVyYVNvdXJjZU1ldGFEYXRhTW9kZSk7CisgICAgc3RhdHVzX3QgY2hlY2tWaWRlb0VuY29kZXJDYXBhYmlsaXRpZXMoKTsKICAgICBzdGF0dXNfdCBjaGVja0F1ZGlvRW5jb2RlckNhcGFiaWxpdGllcygpOwogICAgIC8vIEdlbmVyaWMgTWVkaWFTb3VyY2Ugc2V0LXVwLiBSZXR1cm5zIHRoZSBhcHByb3ByaWF0ZQogICAgIC8vIHNvdXJjZSAoQ2FtZXJhU291cmNlIG9yIFN1cmZhY2VNZWRpYVNvdXJjZSkKQEAgLTE1Myw4ICsxNTYsOCBAQAogICAgIHN0YXR1c190IHNldFBhcmFtQXVkaW9OdW1iZXJPZkNoYW5uZWxzKGludDMyX3QgY2hhbm5sZXMpOwogICAgIHN0YXR1c190IHNldFBhcmFtQXVkaW9TYW1wbGluZ1JhdGUoaW50MzJfdCBzYW1wbGVSYXRlKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbUF1ZGlvVGltZVNjYWxlKGludDMyX3QgdGltZVNjYWxlKTsKLSAgICBzdGF0dXNfdCBzZXRQYXJhbVRpbWVMYXBzZUVuYWJsZShpbnQzMl90IHRpbWVMYXBzZUVuYWJsZSk7Ci0gICAgc3RhdHVzX3Qgc2V0UGFyYW1UaW1lQmV0d2VlblRpbWVMYXBzZUZyYW1lQ2FwdHVyZShpbnQ2NF90IHRpbWVVcyk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1DYXB0dXJlRnBzRW5hYmxlKGludDMyX3QgdGltZUxhcHNlRW5hYmxlKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbUNhcHR1cmVGcHMoZmxvYXQgZnBzKTsKICAgICBzdGF0dXNfdCBzZXRQYXJhbVZpZGVvRW5jb2RpbmdCaXRSYXRlKGludDMyX3QgYml0UmF0ZSk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1WaWRlb0lGcmFtZXNJbnRlcnZhbChpbnQzMl90IHNlY29uZHMpOwogICAgIHN0YXR1c190IHNldFBhcmFtVmlkZW9FbmNvZGVyUHJvZmlsZShpbnQzMl90IHByb2ZpbGUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5tawppbmRleCA2NjA5ODc0Li5jZDIwODM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5tawpAQCAtMTYsNiArMTYsNyBAQAogICAgICAgICBTdHJlYW1pbmdTb3VyY2UuY3BwICAgICAgICAgICAgIFwKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgICAgICAgICAgICAgICAgICAgICBcCiAJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUgICAgICAgICAgICBcCiAJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSAgICAgICAgICAgICBcCiAJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cyAgICAgICAgICAgICBcCkBAIC0yNCw2ICsyNSwxNSBAQAogCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZSAgICAgICAgICAgICAgXAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKKworIyBlbmFibGUgZXhwZXJpbWVudHMgb25seSBpbiB1c2VyZGVidWcgYW5kIGVuZyBidWlsZHMKK2lmbmVxICgsJChmaWx0ZXIgdXNlcmRlYnVnIGVuZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkpCitMT0NBTF9DRkxBR1MgKz0gLURFTkFCTEVfU1RBR0VGUklHSFRfRVhQRVJJTUVOVFMKK2VuZGlmCisKK0xPQ0FMX0NMQU5HIDo9IHRydWUKKwogTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfbnVwbGF5ZXIKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gZW5nCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKaW5kZXggNWE1MWJhNi4uZThjMjhkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcApAQCAtNTYsNyArNTYsNyBAQAogICAgICAgbVZpZGVvTGFzdERlcXVldWVUaW1lVXMoMCksCiAgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uKDApLAogICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24oMCksCi0gICAgICBtRHVyYXRpb25VcygwbGwpLAorICAgICAgbUR1cmF0aW9uVXMoLTFsbCksCiAgICAgICBtQXVkaW9Jc1ZvcmJpcyhmYWxzZSksCiAgICAgICBtSXNXaWRldmluZShmYWxzZSksCiAgICAgICBtSXNTZWN1cmUoZmFsc2UpLApAQCAtNjUsMTIgKzY1LDEyIEBACiAgICAgICBtVUlEKHVpZCksCiAgICAgICBtRmQoLTEpLAogICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCksCi0gICAgICBtTWV0YURhdGFTaXplKC0xbGwpLAogICAgICAgbUJpdHJhdGUoLTFsbCksCiAgICAgICBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24oMCksCiAgICAgICBtUGVuZGluZ1JlYWRCdWZmZXJUeXBlcygwKSwKICAgICAgIG1CdWZmZXJpbmcoZmFsc2UpLAotICAgICAgbVByZXBhcmVCdWZmZXJpbmcoZmFsc2UpIHsKKyAgICAgIG1QcmVwYXJlQnVmZmVyaW5nKGZhbHNlKSwKKyAgICAgIG1QcmV2QnVmZmVyUGVyY2VudGFnZSgtMSkgewogICAgIHJlc2V0RGF0YVNvdXJjZSgpOwogICAgIERhdGFTb3VyY2U6OlJlZ2lzdGVyRGVmYXVsdFNuaWZmZXJzKCk7CiB9CkBAIC0xMjQsNiArMTI0LDEyIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2V0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiYgc291cmNlKSB7CisgICAgcmVzZXREYXRhU291cmNlKCk7CisgICAgbURhdGFTb3VyY2UgPSBzb3VyY2U7CisgICAgcmV0dXJuIE9LOworfQorCiBzcDxNZXRhRGF0YT4gTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmdldEZpbGVGb3JtYXRNZXRhKCkgY29uc3QgewogICAgIHJldHVybiBtRmlsZU1ldGE7CiB9CkBAIC0xNDcsMTQgKzE1MywxMSBAQAogICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1Jc1N0cmVhbWluZykgewotICAgICAgICBpZiAobVNuaWZmZWRNSU1FLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPnNuaWZmKCZtaW1lVHlwZSwgJmNvbmZpZGVuY2UsICZkdW1teSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TbmlmZmVkTUlNRSA9IG1pbWVUeXBlLnN0cmluZygpOworICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5zbmlmZigmbWltZVR5cGUsICZjb25maWRlbmNlLCAmZHVtbXkpKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogICAgICAgICBpc1dpZGV2aW5lU3RyZWFtaW5nID0gIXN0cmNhc2VjbXAoCi0gICAgICAgICAgICAgICAgbVNuaWZmZWRNSU1FLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XVk0pOworICAgICAgICAgICAgICAgIG1pbWVUeXBlLnN0cmluZygpLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV1ZNKTsKICAgICB9CiAKICAgICBpZiAoaXNXaWRldmluZVN0cmVhbWluZykgewpAQCAtMTY5LDcgKzE3Miw3IEBACiAgICAgICAgIGV4dHJhY3RvciA9IG1XVk1FeHRyYWN0b3I7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3I6OkNyZWF0ZShtRGF0YVNvdXJjZSwKLSAgICAgICAgICAgICAgICBtU25pZmZlZE1JTUUuZW1wdHkoKSA/IE5VTEw6IG1TbmlmZmVkTUlNRS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBtaW1lVHlwZS5pc0VtcHR5KCkgPyBOVUxMIDogbWltZVR5cGUuc3RyaW5nKCkpOwogICAgIH0KIAogICAgIGlmIChleHRyYWN0b3IgPT0gTlVMTCkgewpAQCAtMzI3LDYgKzMzMCwxMCBAQAogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAorYm9vbCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6aXNTdHJlYW1pbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jc1N0cmVhbWluZzsKK30KKwogTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6On5HZW5lcmljU291cmNlKCkgewogICAgIGlmIChtTG9vcGVyICE9IE5VTEwpIHsKICAgICAgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7CkBAIC0zNDQsNyArMzUxLDcgQEAKICAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOwogICAgIH0KIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQcmVwYXJlQXN5bmMsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQcmVwYXJlQXN5bmMsIHRoaXMpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCkBAIC0zNTcsNiArMzY0LDcgQEAKIAogICAgICAgICBpZiAoIW1VcmkuZW1wdHkoKSkgewogICAgICAgICAgICAgY29uc3QgY2hhciogdXJpID0gbVVyaS5jX3N0cigpOworICAgICAgICAgICAgU3RyaW5nOCBjb250ZW50VHlwZTsKICAgICAgICAgICAgIG1Jc1dpZGV2aW5lID0gIXN0cm5jYXNlY21wKHVyaSwgIndpZGV2aW5lOi8vIiwgMTEpOwogCiAgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgdXJpLCA3KQpAQCAtMzcxLDcgKzM3OSw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1EYXRhU291cmNlID0gRGF0YVNvdXJjZTo6Q3JlYXRlRnJvbVVSSSgKLSAgICAgICAgICAgICAgICAgICBtSFRUUFNlcnZpY2UsIHVyaSwgJm1VcmlIZWFkZXJzLCAmbUNvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgIG1IVFRQU2VydmljZSwgdXJpLCAmbVVyaUhlYWRlcnMsICZjb250ZW50VHlwZSwKICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihtSHR0cFNvdXJjZS5nZXQoKSkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUlzV2lkZXZpbmUgPSBmYWxzZTsKQEAgLTM4NSwzNCArMzkzLDIyIEBACiAgICAgICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoVU5LTk9XTl9FUlJPUik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLQotICAgICAgICBpZiAobURhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkgewotICAgICAgICAgICAgbUNhY2hlZFNvdXJjZSA9IHN0YXRpY19jYXN0PE51Q2FjaGVkU291cmNlMiAqPihtRGF0YVNvdXJjZS5nZXQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGb3Igd2lkZXZpbmUgb3Igb3RoZXIgY2FjaGVkIHN0cmVhbWluZyBjYXNlcywgd2UgbmVlZCB0byB3YWl0IGZvcgotICAgICAgICAvLyBlbm91Z2ggYnVmZmVyaW5nIGJlZm9yZSByZXBvcnRpbmcgcHJlcGFyZWQuCi0gICAgICAgIC8vIE5vdGUgdGhhdCBldmVuIHdoZW4gVVJMIGRvZXNuJ3Qgc3RhcnQgd2l0aCB3aWRldmluZTovLywgbUlzV2lkZXZpbmUKLSAgICAgICAgLy8gY291bGQgc3RpbGwgYmUgc2V0IHRvIHRydWUgbGF0ZXIsIGlmIHRoZSBzdHJlYW1pbmcgb3IgZmlsZSBzb3VyY2UKLSAgICAgICAgLy8gaXMgc25pZmZlZCB0byBiZSB3aWRldmluZS4gV2UgZG9uJ3Qgd2FudCB0byBidWZmZXIgZm9yIGZpbGUgc291cmNlCi0gICAgICAgIC8vIGluIHRoYXQgY2FzZSwgc28gbXVzdCBjaGVjayB0aGUgZmxhZyBub3cuCi0gICAgICAgIG1Jc1N0cmVhbWluZyA9IChtSXNXaWRldmluZSB8fCBtQ2FjaGVkU291cmNlICE9IE5VTEwpOwogICAgIH0KIAotICAgIC8vIGNoZWNrIGluaXRpYWwgY2FjaGluZyBzdGF0dXMKLSAgICBzdGF0dXNfdCBlcnIgPSBwcmVmaWxsQ2FjaGVJZk5lY2Vzc2FyeSgpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgaWYgKGVyciA9PSAtRUFHQUlOKSB7Ci0gICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UHJlcGFyZUFzeW5jLCBpZCgpKSktPnBvc3QoMjAwMDAwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcHJlZmlsbCBkYXRhIGNhY2hlISIpOwotICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKFVOS05PV05fRVJST1IpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAobURhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkgeworICAgICAgICBtQ2FjaGVkU291cmNlID0gc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KG1EYXRhU291cmNlLmdldCgpKTsKICAgICB9CiAKLSAgICAvLyBpbml0IGV4dHJhdG9yIGZyb20gZGF0YSBzb3VyY2UKLSAgICBlcnIgPSBpbml0RnJvbURhdGFTb3VyY2UoKTsKKyAgICAvLyBGb3Igd2lkZXZpbmUgb3Igb3RoZXIgY2FjaGVkIHN0cmVhbWluZyBjYXNlcywgd2UgbmVlZCB0byB3YWl0IGZvcgorICAgIC8vIGVub3VnaCBidWZmZXJpbmcgYmVmb3JlIHJlcG9ydGluZyBwcmVwYXJlZC4KKyAgICAvLyBOb3RlIHRoYXQgZXZlbiB3aGVuIFVSTCBkb2Vzbid0IHN0YXJ0IHdpdGggd2lkZXZpbmU6Ly8sIG1Jc1dpZGV2aW5lCisgICAgLy8gY291bGQgc3RpbGwgYmUgc2V0IHRvIHRydWUgbGF0ZXIsIGlmIHRoZSBzdHJlYW1pbmcgb3IgZmlsZSBzb3VyY2UKKyAgICAvLyBpcyBzbmlmZmVkIHRvIGJlIHdpZGV2aW5lLiBXZSBkb24ndCB3YW50IHRvIGJ1ZmZlciBmb3IgZmlsZSBzb3VyY2UKKyAgICAvLyBpbiB0aGF0IGNhc2UsIHNvIG11c3QgY2hlY2sgdGhlIGZsYWcgbm93LgorICAgIG1Jc1N0cmVhbWluZyA9IChtSXNXaWRldmluZSB8fCBtQ2FjaGVkU291cmNlICE9IE5VTEwpOworCisgICAgLy8gaW5pdCBleHRyYWN0b3IgZnJvbSBkYXRhIHNvdXJjZQorICAgIHN0YXR1c190IGVyciA9IGluaXRGcm9tRGF0YVNvdXJjZSgpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgZnJvbSBkYXRhIHNvdXJjZSEiKTsKQEAgLTQ0MSw3ICs0MzcsNyBAQAogCiAgICAgaWYgKG1Jc1NlY3VyZSkgewogICAgICAgICAvLyBzZWN1cmUgZGVjb2RlcnMgbXVzdCBiZSBpbnN0YW50aWF0ZWQgYmVmb3JlIHN0YXJ0aW5nIHdpZGV2aW5lIHNvdXJjZQotICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWN1cmVEZWNvZGVyc0luc3RhbnRpYXRlZCwgaWQoKSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdFNlY3VyZURlY29kZXJzSW5zdGFudGlhdGVkLCB0aGlzKTsKICAgICAgICAgbm90aWZ5SW5zdGFudGlhdGVTZWN1cmVEZWNvZGVycyhyZXBseSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZmluaXNoUHJlcGFyZUFzeW5jKCk7CkBAIC00NzcsOSArNDczLDYgQEAKIAogdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6bm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKHN0YXR1c190IGVycikgewogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgbU1ldGFEYXRhU2l6ZSA9IC0xbGw7Ci0gICAgICAgIG1Db250ZW50VHlwZSA9ICIiOwotICAgICAgICBtU25pZmZlZE1JTUUgPSAiIjsKICAgICAgICAgewogICAgICAgICAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9IG1EYXRhU291cmNlOwogICAgICAgICAgICAgc3A8TnVDYWNoZWRTb3VyY2UyPiBjYWNoZWRTb3VyY2UgPSBtQ2FjaGVkU291cmNlOwpAQCAtNTAwLDc2ICs0OTMsNiBAQAogICAgIG5vdGlmeVByZXBhcmVkKGVycik7CiB9CiAKLXN0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpwcmVmaWxsQ2FjaGVJZk5lY2Vzc2FyeSgpIHsKLSAgICBDSEVDSyhtRGF0YVNvdXJjZSAhPSBOVUxMKTsKLQotICAgIGlmIChtQ2FjaGVkU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgLy8gbm8gcHJlZmlsbCBpZiB0aGUgZGF0YSBzb3VyY2UgaXMgbm90IGNhY2hlZAotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgLy8gV2UncmUgbm90IGRvaW5nIHRoaXMgZm9yIHN0cmVhbXMgdGhhdCBhcHBlYXIgdG8gYmUgYXVkaW8tb25seQotICAgIC8vIHN0cmVhbXMgdG8gZW5zdXJlIHRoYXQgZXZlbiBsb3cgYmFuZHdpZHRoIHN0cmVhbXMgc3RhcnQKLSAgICAvLyBwbGF5aW5nIGJhY2sgZmFpcmx5IGluc3RhbnRseS4KLSAgICBpZiAoIXN0cm5jYXNlY21wKG1Db250ZW50VHlwZS5zdHJpbmcoKSwgImF1ZGlvLyIsIDYpKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAvLyBXZSdyZSBnb2luZyB0byBwcmVmaWxsIHRoZSBjYWNoZSBiZWZvcmUgdHJ5aW5nIHRvIGluc3RhbnRpYXRlCi0gICAgLy8gdGhlIGV4dHJhY3RvciBiZWxvdywgYXMgdGhlIGxhdHRlciBpcyBhbiBvcGVyYXRpb24gdGhhdCBvdGhlcndpc2UKLSAgICAvLyBjb3VsZCBibG9jayBvbiB0aGUgZGF0YXNvdXJjZSBmb3IgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgdGltZS4KLSAgICAvLyBEdXJpbmcgdGhhdCB0aW1lIHdlJ2QgYmUgdW5hYmxlIHRvIGFib3J0IHRoZSBwcmVwYXJhdGlvbiBwaGFzZQotICAgIC8vIHdpdGhvdXQgdGhpcyBwcmVmaWxsLgotCi0gICAgLy8gSW5pdGlhbGx5IG1ha2Ugc3VyZSB3ZSBoYXZlIGF0IGxlYXN0IDE5MiBLQiBmb3IgdGhlIHNuaWZmCi0gICAgLy8gdG8gY29tcGxldGUgd2l0aG91dCBibG9ja2luZy4KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5CeXRlc0ZvclNuaWZmaW5nID0gMTkyICogMTAyNDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtEZWZhdWx0TWV0YVNpemUgPSAyMDAwMDA7Ci0KLSAgICBzdGF0dXNfdCBmaW5hbFN0YXR1czsKLQotICAgIHNpemVfdCBjYWNoZWREYXRhUmVtYWluaW5nID0KLSAgICAgICAgICAgIG1DYWNoZWRTb3VyY2UtPmFwcHJveERhdGFSZW1haW5pbmcoJmZpbmFsU3RhdHVzKTsKLQotICAgIGlmIChmaW5hbFN0YXR1cyAhPSBPSyB8fCAobU1ldGFEYXRhU2l6ZSA+PSAwCi0gICAgICAgICAgICAmJiAob2ZmNjRfdCljYWNoZWREYXRhUmVtYWluaW5nID49IG1NZXRhRGF0YVNpemUpKSB7Ci0gICAgICAgIEFMT0dWKCJzdG9wIGNhY2hpbmcsIHN0YXR1cyAlZCwgIgotICAgICAgICAgICAgICAgICJtZXRhRGF0YVNpemUgJWxsZCwgY2FjaGVkRGF0YVJlbWFpbmluZyAlenUiLAotICAgICAgICAgICAgICAgIGZpbmFsU3RhdHVzLCBtTWV0YURhdGFTaXplLCBjYWNoZWREYXRhUmVtYWluaW5nKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIEFMT0dWKCJub3cgY2FjaGVkICV6dSBieXRlcyBvZiBkYXRhIiwgY2FjaGVkRGF0YVJlbWFpbmluZyk7Ci0KLSAgICBpZiAobU1ldGFEYXRhU2l6ZSA8IDAKLSAgICAgICAgICAgICYmIGNhY2hlZERhdGFSZW1haW5pbmcgPj0ga01pbkJ5dGVzRm9yU25pZmZpbmcpIHsKLSAgICAgICAgU3RyaW5nOCB0bXA7Ci0gICAgICAgIGZsb2F0IGNvbmZpZGVuY2U7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtZXRhOwotICAgICAgICBpZiAoIW1DYWNoZWRTb3VyY2UtPnNuaWZmKCZ0bXAsICZjb25maWRlbmNlLCAmbWV0YSkpIHsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2Ugc3VjY2Vzc2Z1bGx5IGlkZW50aWZpZWQgdGhlIGZpbGUncyBleHRyYWN0b3IgdG8KLSAgICAgICAgLy8gYmUsIHJlbWVtYmVyIHRoaXMgbWltZSB0eXBlIHNvIHdlIGRvbid0IGhhdmUgdG8KLSAgICAgICAgLy8gc25pZmYgaXQgYWdhaW4gd2hlbiB3ZSBjYWxsIE1lZGlhRXh0cmFjdG9yOjpDcmVhdGUoKQotICAgICAgICBtU25pZmZlZE1JTUUgPSB0bXAuc3RyaW5nKCk7Ci0KLSAgICAgICAgaWYgKG1ldGEgPT0gTlVMTAotICAgICAgICAgICAgICAgIHx8ICFtZXRhLT5maW5kSW50NjQoIm1ldGEtZGF0YS1zaXplIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+KCZtTWV0YURhdGFTaXplKSkpIHsKLSAgICAgICAgICAgIG1NZXRhRGF0YVNpemUgPSBrRGVmYXVsdE1ldGFTaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1NZXRhRGF0YVNpemUgPCAwbGwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIG1ldGFEYXRhU2l6ZSA9ICVsbGQgYnl0ZXMiLCBtTWV0YURhdGFTaXplKTsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIC1FQUdBSU47Ci19Ci0KIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnN0YXJ0KCkgewogICAgIEFMT0dJKCJzdGFydCIpOwogCkBAIC01ODUsNyArNTA4LDcgQEAKICAgICBzZXREcm1QbGF5YmFja1N0YXR1c0lmTmVlZGVkKFBsYXliYWNrOjpTVEFSVCwgZ2V0TGFzdFJlYWRQb3NpdGlvbigpIC8gMTAwMCk7CiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCi0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIHRoaXMpKS0+cG9zdCgpOwogfQogCiB2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzdG9wKCkgewpAQCAtNTk0LDcgKzUxNyw3IEBACiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKICAgICBpZiAobUlzV2lkZXZpbmUgfHwgbUlzU2VjdXJlKSB7CiAgICAgICAgIC8vIEZvciB3aWRldmluZSBvciBzZWN1cmUgc291cmNlcyB3ZSBuZWVkIHRvIHByZXZlbnQgYW55IGZ1cnRoZXIgcmVhZHMuCi0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wV2lkZXZpbmUsIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RvcFdpZGV2aW5lLCB0aGlzKTsKICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwogICAgICAgICAodm9pZCkgbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwogICAgIH0KQEAgLTYxMSw3ICs1MzQsNyBAQAogICAgIHNldERybVBsYXliYWNrU3RhdHVzSWZOZWVkZWQoUGxheWJhY2s6OlNUQVJULCBnZXRMYXN0UmVhZFBvc2l0aW9uKCkgLyAxMDAwKTsKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6ZGlzY29ubmVjdCgpIHsKQEAgLTY0NSw3ICs1NjgsNyBAQAogfQogCiB2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxCdWZmZXJpbmcsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQb2xsQnVmZmVyaW5nLCB0aGlzKTsKICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKTsKICAgICBtc2ctPnBvc3QoMTAwMDAwMGxsKTsKIH0KQEAgLTY1Myw2ICs1NzYsNyBAQAogdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6Y2FuY2VsUG9sbEJ1ZmZlcmluZygpIHsKICAgICBtQnVmZmVyaW5nID0gZmFsc2U7CiAgICAgKyttUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb247CisgICAgbVByZXZCdWZmZXJQZXJjZW50YWdlID0gLTE7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OnJlc3RhcnRQb2xsQnVmZmVyaW5nKCkgewpAQCAtNjYyLDcgKzU4NiwxOSBAQAogICAgIH0KIH0KIAotdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6bm90aWZ5QnVmZmVyaW5nVXBkYXRlKGludCBwZXJjZW50YWdlKSB7Cit2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpub3RpZnlCdWZmZXJpbmdVcGRhdGUoaW50MzJfdCBwZXJjZW50YWdlKSB7CisgICAgLy8gQnVmZmVyaW5nIHBlcmNlbnQgY291bGQgZ28gYmFja3dhcmQgYXMgaXQncyBlc3RpbWF0ZWQgZnJvbSByZW1haW5pbmcKKyAgICAvLyBkYXRhIGFuZCBsYXN0IGFjY2VzcyB0aW1lLiBUaGlzIGNvdWxkIGNhdXNlIHRoZSBidWZmZXJpbmcgcG9zaXRpb24KKyAgICAvLyBkcmF3biBvbiBtZWRpYSBjb250cm9sIHRvIGppdHRlciBzbGlnaHRseS4gUmVtZW1iZXIgcHJldmlvdXNseSByZXBvcnRlZAorICAgIC8vIHBlcmNlbnRhZ2UgYW5kIGRvbid0IGFsbG93IGl0IHRvIGdvIGJhY2t3YXJkLgorICAgIGlmIChwZXJjZW50YWdlIDwgbVByZXZCdWZmZXJQZXJjZW50YWdlKSB7CisgICAgICAgIHBlcmNlbnRhZ2UgPSBtUHJldkJ1ZmZlclBlcmNlbnRhZ2U7CisgICAgfSBlbHNlIGlmIChwZXJjZW50YWdlID4gMTAwKSB7CisgICAgICAgIHBlcmNlbnRhZ2UgPSAxMDA7CisgICAgfQorCisgICAgbVByZXZCdWZmZXJQZXJjZW50YWdlID0gcGVyY2VudGFnZTsKKwogICAgIEFMT0dWKCJub3RpZnlCdWZmZXJpbmdVcGRhdGU6IGJ1ZmZlcmluZyAlZCUlIiwgcGVyY2VudGFnZSk7CiAKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gZHVwTm90aWZ5KCk7CkBAIC03OTQsNyArNzMwLDcgQEAKICAgICAgICAgICAgIHN0b3BCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChjYWNoZWREYXRhUmVtYWluaW5nID49IDApIHsKLSAgICAgICAgQUxPR1YoIm9uUG9sbEJ1ZmZlcmluZzogY2FjaGVkRGF0YVJlbWFpbmluZyAlZCBieXRlcyIsCisgICAgICAgIEFMT0dWKCJvblBvbGxCdWZmZXJpbmc6IGNhY2hlZERhdGFSZW1haW5pbmcgJXpkIGJ5dGVzIiwKICAgICAgICAgICAgICAgICBjYWNoZWREYXRhUmVtYWluaW5nKTsKIAogICAgICAgICBpZiAoY2FjaGVkRGF0YVJlbWFpbmluZyA8IGtMb3dXYXRlck1hcmtCeXRlcykgewpAQCAtODgxLDcgKzgxNyw3IEBACiAgICAgICAgICAgfQogICAgICAgICAgIHJlYWRCdWZmZXIodHJhY2tUeXBlLCB0aW1lVXMsICZhY3R1YWxUaW1lVXMsIGZvcm1hdENoYW5nZSk7CiAgICAgICAgICAgcmVhZEJ1ZmZlcihjb3VudGVycGFydFR5cGUsIC0xLCBOVUxMLCBmb3JtYXRDaGFuZ2UpOwotICAgICAgICAgIEFMT0dWKCJ0aW1lVXMgJWxsZCBhY3R1YWxUaW1lVXMgJWxsZCIsIHRpbWVVcywgYWN0dWFsVGltZVVzKTsKKyAgICAgICAgICBBTE9HVigidGltZVVzICVsbGQgYWN0dWFsVGltZVVzICVsbGQiLCAobG9uZyBsb25nKXRpbWVVcywgKGxvbmcgbG9uZylhY3R1YWxUaW1lVXMpOwogCiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9CkBAIC05NTAsNyArODg2LDcgQEAKICAgICAgICAgICAgICAgbVZpZGVvVHJhY2subVBhY2tldHMtPmNsZWFyKCk7CiAgICAgICAgICAgfQogICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwogICAgICAgICAgIGJyZWFrOwpAQCAtOTkwLDcgKzkyNiw3IEBACiAgICAgICAgIGNvbnN0IGludDY0X3Qgb25lU2VjVXMgPSAxMDAwMDAwbGw7CiAgICAgICAgIGRlbGF5VXMgLT0gb25lU2VjVXM7CiAgICAgfQotICAgIHNwPEFNZXNzYWdlPiBtc2cyID0gbmV3IEFNZXNzYWdlKHNlbmRXaGF0LCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnMiA9IG5ldyBBTWVzc2FnZShzZW5kV2hhdCwgdGhpcyk7CiAgICAgbXNnMi0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtc2dHZW5lcmF0aW9uKTsKICAgICBtc2cyLT5wb3N0KGRlbGF5VXMgPCAwID8gMCA6IGRlbGF5VXMpOwogfQpAQCAtMTAzMCw3ICs5NjYsNyBAQAogfQogCiBzcDxNZXRhRGF0YT4gTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6OmdldEZvcm1hdE1ldGEoYm9vbCBhdWRpbykgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRGb3JtYXQsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRGb3JtYXQsIHRoaXMpOwogICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvIiwgYXVkaW8pOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwpAQCAtMTA1Miw3ICs5ODgsNyBAQAogICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBkb0dldEZvcm1hdE1ldGEoYXVkaW8pOwogICAgIHJlc3BvbnNlLT5zZXRQb2ludGVyKCJmb3JtYXQiLCBmb3JtYXQuZ2V0KCkpOwogCi0gICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKIH0KQEAgLTEwOTIsNyArMTAyOCw5IEBACiAKICAgICBzdGF0dXNfdCByZXN1bHQgPSB0cmFjay0+bVBhY2tldHMtPmRlcXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOwogCi0gICAgaWYgKCF0cmFjay0+bVBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CisgICAgLy8gc3RhcnQgcHVsbGluZyBpbiBtb3JlIGJ1ZmZlcnMgaWYgd2Ugb25seSBoYXZlIG9uZSAob3Igbm8pIGJ1ZmZlciBsZWZ0CisgICAgLy8gc28gdGhhdCBkZWNvZGVyIGhhcyBsZXNzIGNoYW5jZSBvZiBiZWluZyBzdGFydmVkCisgICAgaWYgKHRyYWNrLT5tUGFja2V0cy0+Z2V0QXZhaWxhYmxlQnVmZmVyQ291bnQoJmZpbmFsUmVzdWx0KSA8IDIpIHsKICAgICAgICAgcG9zdFJlYWRCdWZmZXIoYXVkaW8/IE1FRElBX1RSQUNLX1RZUEVfQVVESU8gOiBNRURJQV9UUkFDS19UWVBFX1ZJREVPKTsKICAgICB9CiAKQEAgLTExMTksNyArMTA1Nyw3IEBACiAKICAgICBpZiAobVN1YnRpdGxlVHJhY2subVNvdXJjZSAhPSBOVUxMCiAgICAgICAgICAgICAmJiAhbVN1YnRpdGxlVHJhY2subVBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZW9zUmVzdWx0KSkgewotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGEsIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGEsIHRoaXMpOwogICAgICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbik7CiAgICAgICAgIG1zZy0+cG9zdCgpOwpAQCAtMTEyNyw3ICsxMDY1LDcgQEAKIAogICAgIGlmIChtVGltZWRUZXh0VHJhY2subVNvdXJjZSAhPSBOVUxMCiAgICAgICAgICAgICAmJiAhbVRpbWVkVGV4dFRyYWNrLm1QYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmVvc1Jlc3VsdCkpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZldGNoVGltZWRUZXh0RGF0YSwgaWQoKSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaFRpbWVkVGV4dERhdGEsIHRoaXMpOwogICAgICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24pOwogICAgICAgICBtc2ctPnBvc3QoKTsKQEAgLTExNTYsNiArMTA5NCw3IEBACiAKICAgICBjb25zdCBjaGFyICptaW1lOwogICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIG1pbWUpOwogCiAgICAgaW50MzJfdCB0cmFja1R5cGU7CiAgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKQEAgLTExNzYsOCArMTExNSw2IEBACiAgICAgZm9ybWF0LT5zZXRTdHJpbmcoImxhbmd1YWdlIiwgbGFuZyk7CiAKICAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUpIHsKLSAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lKTsKLQogICAgICAgICBpbnQzMl90IGlzQXV0b3NlbGVjdCA9IDEsIGlzRGVmYXVsdCA9IDAsIGlzRm9yY2VkID0gMDsKICAgICAgICAgbWV0YS0+ZmluZEludDMyKGtLZXlUcmFja0lzQXV0b3NlbGVjdCwgJmlzQXV0b3NlbGVjdCk7CiAgICAgICAgIG1ldGEtPmZpbmRJbnQzMihrS2V5VHJhY2tJc0RlZmF1bHQsICZpc0RlZmF1bHQpOwpAQCAtMTE5Miw3ICsxMTI5LDcgQEAKIH0KIAogc3NpemVfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6Z2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0IHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0U2VsZWN0ZWRUcmFjaywgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldFNlbGVjdGVkVHJhY2ssIHRoaXMpOwogICAgIG1zZy0+c2V0SW50MzIoInR5cGUiLCB0eXBlKTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKQEAgLTEyMTUsNyArMTE1Miw3IEBACiAgICAgc3NpemVfdCBpbmRleCA9IGRvR2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKICAgICByZXNwb25zZS0+c2V0SW50MzIoImluZGV4IiwgaW5kZXgpOwogCi0gICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKIH0KQEAgLTEyNDgsNyArMTE4NSw3IEBACiAKIHN0YXR1c190IE51UGxheWVyOjpHZW5lcmljU291cmNlOjpzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgdGltZVVzKSB7CiAgICAgQUxPR1YoIiVzIHRyYWNrOiAlenUiLCBzZWxlY3QgPyAic2VsZWN0IiA6ICJkZXNlbGVjdCIsIHRyYWNrSW5kZXgpOwotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWxlY3RUcmFjaywgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbGVjdFRyYWNrLCB0aGlzKTsKICAgICBtc2ctPnNldEludDMyKCJ0cmFja0luZGV4IiwgdHJhY2tJbmRleCk7CiAgICAgbXNnLT5zZXRJbnQzMigic2VsZWN0Iiwgc2VsZWN0KTsKICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwpAQCAtMTI3Myw3ICsxMjEwLDcgQEAKICAgICBzdGF0dXNfdCBlcnIgPSBkb1NlbGVjdFRyYWNrKHRyYWNrSW5kZXgsIHNlbGVjdCwgdGltZVVzKTsKICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CiAKLSAgICB1aW50MzJfdCByZXBseUlEOworICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwogfQpAQCAtMTMzNCw3ICsxMjcxLDcgQEAKICAgICAgICAgc3RhdHVzX3QgZW9zUmVzdWx0OyAvLyBpZ25vcmVkCiAgICAgICAgIGlmIChtU3VidGl0bGVUcmFjay5tU291cmNlICE9IE5VTEwKICAgICAgICAgICAgICAgICAmJiAhbVN1YnRpdGxlVHJhY2subVBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZW9zUmVzdWx0KSkgewotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZldGNoU3VidGl0bGVEYXRhLCBpZCgpKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaFN1YnRpdGxlRGF0YSwgdGhpcyk7CiAgICAgICAgICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24pOwogICAgICAgICAgICAgbXNnLT5wb3N0KCk7CkBAIC0xMzQyLDcgKzEyNzksNyBAQAogCiAgICAgICAgIGlmIChtVGltZWRUZXh0VHJhY2subVNvdXJjZSAhPSBOVUxMCiAgICAgICAgICAgICAgICAgJiYgIW1UaW1lZFRleHRUcmFjay5tUGFja2V0cy0+aGFzQnVmZmVyQXZhaWxhYmxlKCZlb3NSZXN1bHQpKSB7Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hUaW1lZFRleHREYXRhLCBpZCgpKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaFRpbWVkVGV4dERhdGEsIHRoaXMpOwogICAgICAgICAgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbik7CiAgICAgICAgICAgICBtc2ctPnBvc3QoKTsKQEAgLTEzNTYsNyArMTI5Myw3IEBACiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KIAotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hhbmdlQVZTb3VyY2UsIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hhbmdlQVZTb3VyY2UsIHRoaXMpOwogICAgICAgICBtc2ctPnNldEludDMyKCJ0cmFja0luZGV4IiwgdHJhY2tJbmRleCk7CiAgICAgICAgIG1zZy0+cG9zdCgpOwogICAgICAgICByZXR1cm4gT0s7CkBAIC0xMzY2LDcgKzEzMDMsNyBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6c2Vla1RvKGludDY0X3Qgc2Vla1RpbWVVcykgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VlaywgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQ2NCgic2Vla1RpbWVVcyIsIHNlZWtUaW1lVXMpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwpAQCAtMTM4Niw3ICsxMzIzLDcgQEAKICAgICBzdGF0dXNfdCBlcnIgPSBkb1NlZWsoc2Vla1RpbWVVcyk7CiAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwogCi0gICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKIH0KQEAgLTE0OTEsNiArMTQyOCwxNCBAQAogICAgICAgICBtZXRhLT5zZXRJbnQzMigidHJhY2tJbmRleCIsIG1TdWJ0aXRsZVRyYWNrLm1JbmRleCk7CiAgICAgfQogCisgICAgdWludDMyX3QgZGF0YVR5cGU7IC8vIHVudXNlZAorICAgIGNvbnN0IHZvaWQgKnNlaURhdGE7CisgICAgc2l6ZV90IHNlaUxlbmd0aDsKKyAgICBpZiAobWItPm1ldGFfZGF0YSgpLT5maW5kRGF0YShrS2V5U0VJLCAmZGF0YVR5cGUsICZzZWlEYXRhLCAmc2VpTGVuZ3RoKSkgeworICAgICAgICBzcDxBQnVmZmVyPiBzZWkgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoc2VpRGF0YSwgc2VpTGVuZ3RoKTs7CisgICAgICAgIG1ldGEtPnNldEJ1ZmZlcigic2VpIiwgc2VpKTsKKyAgICB9CisKICAgICBpZiAoYWN0dWFsVGltZVVzKSB7CiAgICAgICAgICphY3R1YWxUaW1lVXMgPSB0aW1lVXM7CiAgICAgfQpAQCAtMTUwNiw3ICsxNDUxLDcgQEAKIAogICAgIGlmICgobVBlbmRpbmdSZWFkQnVmZmVyVHlwZXMgJiAoMSA8PCB0cmFja1R5cGUpKSA9PSAwKSB7CiAgICAgICAgIG1QZW5kaW5nUmVhZEJ1ZmZlclR5cGVzIHw9ICgxIDw8IHRyYWNrVHlwZSk7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkQnVmZmVyLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlYWRCdWZmZXIsIHRoaXMpOwogICAgICAgICBtc2ctPnNldEludDMyKCJ0cmFja1R5cGUiLCB0cmFja1R5cGUpOwogICAgICAgICBtc2ctPnBvc3QoKTsKICAgICB9CkBAIC0xNTM4LDYgKzE0ODMsOCBAQAogICAgICAgICAgICAgdHJhY2sgPSAmbVZpZGVvVHJhY2s7CiAgICAgICAgICAgICBpZiAobUlzV2lkZXZpbmUpIHsKICAgICAgICAgICAgICAgICBtYXhCdWZmZXJzID0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWF4QnVmZmVycyA9IDQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX0FVRElPOgpAQCAtMTU5NCwxNyArMTU0MSw3IEBACiAgICAgICAgICAgICAgICAgbVZpZGVvVGltZVVzID0gdGltZVVzOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBmb3JtYXRDaGFuZ2UgJiYgc2Vla2luZzogdHJhY2sgd2hvc2Ugc291cmNlIGlzIGNoYW5nZWQgZHVyaW5nIHNlbGVjdGlvbgotICAgICAgICAgICAgLy8gZm9ybWF0Q2hhbmdlICYmICFzZWVraW5nOiB0cmFjayB3aG9zZSBzb3VyY2UgaXMgbm90IGNoYW5nZWQgZHVyaW5nIHNlbGVjdGlvbgotICAgICAgICAgICAgLy8gIWZvcm1hdENoYW5nZTogbm9ybWFsIHNlZWsKLSAgICAgICAgICAgIGlmICgoc2Vla2luZyB8fCBmb3JtYXRDaGFuZ2UpCi0gICAgICAgICAgICAgICAgICAgICYmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTwotICAgICAgICAgICAgICAgICAgICB8fCB0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTykpIHsKLSAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRpc2NvbnRpbnVpdHlUeXBlIHR5cGUgPSAoZm9ybWF0Q2hhbmdlICYmIHNlZWtpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9GT1JNQVRDSEFOR0UKLSAgICAgICAgICAgICAgICAgICAgICAgIDogQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX05PTkU7Ci0gICAgICAgICAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5xdWV1ZURpc2NvbnRpbnVpdHkoIHR5cGUsIE5VTEwsIHRydWUgLyogZGlzY2FyZCAqLyk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBxdWV1ZURpc2NvbnRpbnVpdHlJZk5lZWRlZChzZWVraW5nLCBmb3JtYXRDaGFuZ2UsIHRyYWNrVHlwZSwgdHJhY2spOwogCiAgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBtZWRpYUJ1ZmZlclRvQUJ1ZmZlcigKICAgICAgICAgICAgICAgICAgICAgbWJ1ZiwgdHJhY2tUeXBlLCBzZWVrVGltZVVzLCBhY3R1YWxUaW1lVXMpOwpAQCAtMTYyMiwxMCArMTU1OSwyNiBAQAogICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBkaXNjYXJkICovKTsKICNlbmRpZgogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcXVldWVEaXNjb250aW51aXR5SWZOZWVkZWQoc2Vla2luZywgZm9ybWF0Q2hhbmdlLCB0cmFja1R5cGUsIHRyYWNrKTsKICAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+c2lnbmFsRU9TKGVycik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIH0KIAordm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6cXVldWVEaXNjb250aW51aXR5SWZOZWVkZWQoCisgICAgICAgIGJvb2wgc2Vla2luZywgYm9vbCBmb3JtYXRDaGFuZ2UsIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlLCBUcmFjayAqdHJhY2spIHsKKyAgICAvLyBmb3JtYXRDaGFuZ2UgJiYgc2Vla2luZzogdHJhY2sgd2hvc2Ugc291cmNlIGlzIGNoYW5nZWQgZHVyaW5nIHNlbGVjdGlvbgorICAgIC8vIGZvcm1hdENoYW5nZSAmJiAhc2Vla2luZzogdHJhY2sgd2hvc2Ugc291cmNlIGlzIG5vdCBjaGFuZ2VkIGR1cmluZyBzZWxlY3Rpb24KKyAgICAvLyAhZm9ybWF0Q2hhbmdlOiBub3JtYWwgc2VlaworICAgIGlmICgoc2Vla2luZyB8fCBmb3JtYXRDaGFuZ2UpCisgICAgICAgICAgICAmJiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfQVVESU8KKyAgICAgICAgICAgIHx8IHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1ZJREVPKSkgeworICAgICAgICBBVFNQYXJzZXI6OkRpc2NvbnRpbnVpdHlUeXBlIHR5cGUgPSAoZm9ybWF0Q2hhbmdlICYmIHNlZWtpbmcpCisgICAgICAgICAgICAgICAgPyBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFCisgICAgICAgICAgICAgICAgOiBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfTk9ORTsKKyAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5xdWV1ZURpc2NvbnRpbnVpdHkodHlwZSwgTlVMTCAvKiBleHRyYSAqLywgdHJ1ZSAvKiBkaXNjYXJkICovKTsKKyAgICB9Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaAppbmRleCA1NTI3NDQ4Li5hYzk4MGVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmgKQEAgLTMxLDEyICszMSwxMyBAQAogY2xhc3MgRHJtTWFuYWdlckNsaWVudDsKIHN0cnVjdCBBbm90aGVyUGFja2V0U291cmNlOwogc3RydWN0IEFSVFNQQ29udHJvbGxlcjsKLXN0cnVjdCBEYXRhU291cmNlOworY2xhc3MgRGF0YVNvdXJjZTsKK2NsYXNzIElEYXRhU291cmNlOwogc3RydWN0IElNZWRpYUhUVFBTZXJ2aWNlOwogc3RydWN0IE1lZGlhU291cmNlOwogY2xhc3MgTWVkaWFCdWZmZXI7CiBzdHJ1Y3QgTnVDYWNoZWRTb3VyY2UyOwotc3RydWN0IFdWTUV4dHJhY3RvcjsKK2NsYXNzIFdWTUV4dHJhY3RvcjsKIAogc3RydWN0IE51UGxheWVyOjpHZW5lcmljU291cmNlIDogcHVibGljIE51UGxheWVyOjpTb3VyY2UgewogICAgIEdlbmVyaWNTb3VyY2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGJvb2wgdWlkVmFsaWQsIHVpZF90IHVpZCk7CkBAIC00OCw2ICs0OSw4IEBACiAKICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIAorICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIGRhdGFTb3VyY2UpOworCiAgICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYygpOwogCiAgICAgdmlydHVhbCB2b2lkIHN0YXJ0KCk7CkBAIC03Miw2ICs3NSw4IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcnMoYm9vbCBhdWRpbywgVmVjdG9yPE1lZGlhQnVmZmVyICo+ICZidWZmZXJzKTsKIAorICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbWluZygpIGNvbnN0OworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+R2VuZXJpY1NvdXJjZSgpOwogCkBAIC0xNDAsMTQgKzE0NSwxMyBAQAogICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOwogICAgIGJvb2wgbVN0YXJ0ZWQ7CiAgICAgYm9vbCBtU3RvcFJlYWQ7Ci0gICAgU3RyaW5nOCBtQ29udGVudFR5cGU7Ci0gICAgQVN0cmluZyBtU25pZmZlZE1JTUU7Ci0gICAgb2ZmNjRfdCBtTWV0YURhdGFTaXplOwogICAgIGludDY0X3QgbUJpdHJhdGU7CiAgICAgaW50MzJfdCBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb247CiAgICAgdWludDMyX3QgbVBlbmRpbmdSZWFkQnVmZmVyVHlwZXM7CiAgICAgYm9vbCBtQnVmZmVyaW5nOwogICAgIGJvb2wgbVByZXBhcmVCdWZmZXJpbmc7CisgICAgaW50MzJfdCBtUHJldkJ1ZmZlclBlcmNlbnRhZ2U7CisKICAgICBtdXRhYmxlIE11dGV4IG1SZWFkQnVmZmVyTG9jazsKICAgICBtdXRhYmxlIE11dGV4IG1EaXNjb25uZWN0TG9jazsKIApAQCAtMTYwLDggKzE2NCw2IEBACiAgICAgaW50NjRfdCBnZXRMYXN0UmVhZFBvc2l0aW9uKCk7CiAgICAgdm9pZCBzZXREcm1QbGF5YmFja1N0YXR1c0lmTmVlZGVkKGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CiAKLSAgICBzdGF0dXNfdCBwcmVmaWxsQ2FjaGVJZk5lY2Vzc2FyeSgpOwotCiAgICAgdm9pZCBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoc3RhdHVzX3QgZXJyKTsKICAgICB2b2lkIG9uU2VjdXJlRGVjb2RlcnNJbnN0YW50aWF0ZWQoc3RhdHVzX3QgZXJyKTsKICAgICB2b2lkIGZpbmlzaFByZXBhcmVBc3luYygpOwpAQCAtMjAxLDExICsyMDMsMTQgQEAKICAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlLAogICAgICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzID0gLTFsbCwgaW50NjRfdCAqYWN0dWFsVGltZVVzID0gTlVMTCwgYm9vbCBmb3JtYXRDaGFuZ2UgPSBmYWxzZSk7CiAKKyAgICB2b2lkIHF1ZXVlRGlzY29udGludWl0eUlmTmVlZGVkKAorICAgICAgICAgICAgYm9vbCBzZWVraW5nLCBib29sIGZvcm1hdENoYW5nZSwgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUsIFRyYWNrICp0cmFjayk7CisKICAgICB2b2lkIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOwogICAgIHZvaWQgY2FuY2VsUG9sbEJ1ZmZlcmluZygpOwogICAgIHZvaWQgcmVzdGFydFBvbGxCdWZmZXJpbmcoKTsKICAgICB2b2lkIG9uUG9sbEJ1ZmZlcmluZygpOwotICAgIHZvaWQgbm90aWZ5QnVmZmVyaW5nVXBkYXRlKGludCBwZXJjZW50YWdlKTsKKyAgICB2b2lkIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShpbnQzMl90IHBlcmNlbnRhZ2UpOwogICAgIHZvaWQgc3RhcnRCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpOwogICAgIHZvaWQgc3RvcEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCk7CiAgICAgdm9pZCBzZW5kQ2FjaGVTdGF0cygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAKaW5kZXggYTI2ZWY5ZS4uMTI2NjI1YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuY3BwCkBAIC0yMiw3ICsyMiw2IEBACiAKICNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCiAjaW5jbHVkZSAiTGl2ZURhdGFTb3VyY2UuaCIKLSNpbmNsdWRlICJMaXZlU2Vzc2lvbi5oIgogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KQEAgLTMwLDYgKzI5LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ0LDcgKzQ0LDEwIEBACiAgICAgICBtRmxhZ3MoMCksCiAgICAgICBtRmluYWxSZXN1bHQoT0spLAogICAgICAgbU9mZnNldCgwKSwKLSAgICAgIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24oMCkgeworICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbigwKSwKKyAgICAgIG1GZXRjaE1ldGFEYXRhR2VuZXJhdGlvbigwKSwKKyAgICAgIG1IYXNNZXRhZGF0YShmYWxzZSksCisgICAgICBtTWV0YWRhdGFTZWxlY3RlZChmYWxzZSkgewogICAgIGlmIChoZWFkZXJzKSB7CiAgICAgICAgIG1FeHRyYUhlYWRlcnMgPSAqaGVhZGVyczsKIApAQCAtODEsNyArODQsNyBAQAogICAgICAgICBtTGl2ZUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKHRoaXMpOwogICAgIH0KIAotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uTm90aWZ5LCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvbk5vdGlmeSwgdGhpcyk7CiAKICAgICBtTGl2ZVNlc3Npb24gPSBuZXcgTGl2ZVNlc3Npb24oCiAgICAgICAgICAgICBub3RpZnksCkBAIC0xNDIsMTkgKzE0NSw0NyBAQAogc3NpemVfdCBOdVBsYXllcjo6SFRUUExpdmVTb3VyY2U6OmdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdCB7CiAgICAgaWYgKG1MaXZlU2Vzc2lvbiA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtMTsKKyAgICB9IGVsc2UgaWYgKHR5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9NRVRBREFUQSkgeworICAgICAgICAvLyBNRURJQV9UUkFDS19UWVBFX01FVEFEQVRBIGlzIGFsd2F5cyBsYXN0IHRyYWNrCisgICAgICAgIC8vIG1NZXRhZGF0YVNlbGVjdGVkIGNhbiBvbmx5IGJlIHRydWUgd2hlbiBtSGFzTWV0YWRhdGEgaXMgdHJ1ZQorICAgICAgICByZXR1cm4gbU1ldGFkYXRhU2VsZWN0ZWQgPyAobUxpdmVTZXNzaW9uLT5nZXRUcmFja0NvdW50KCkgLSAxKSA6IC0xOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBtTGl2ZVNlc3Npb24tPmdldFNlbGVjdGVkVHJhY2sodHlwZSk7CiAgICAgfQogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6SFRUUExpdmVTb3VyY2U6OnNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCwgaW50NjRfdCAvKnRpbWVVcyovKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUxpdmVTZXNzaW9uLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCBzZWxlY3QpOworICAgIGlmIChtTGl2ZVNlc3Npb24gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgYm9vbCBwb3N0RmV0Y2hNc2cgPSBmYWxzZSwgaXNTdWIgPSBmYWxzZTsKKyAgICBpZiAoIW1IYXNNZXRhZGF0YSB8fCB0cmFja0luZGV4ICE9IG1MaXZlU2Vzc2lvbi0+Z2V0VHJhY2tDb3VudCgpIC0gMSkgeworICAgICAgICBlcnIgPSBtTGl2ZVNlc3Npb24tPnNlbGVjdFRyYWNrKHRyYWNrSW5kZXgsIHNlbGVjdCk7CisgICAgICAgIHBvc3RGZXRjaE1zZyA9IHNlbGVjdDsKKyAgICAgICAgaXNTdWIgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIG1ldGFkYXRhIHRyYWNrOyBpLmUuIChtSGFzTWV0YWRhdGEgJiYgdHJhY2tJbmRleCA9PSBtTGl2ZVNlc3Npb24tPmdldFRyYWNrQ291bnQoKSAtIDEpCisgICAgICAgIGlmIChtTWV0YWRhdGFTZWxlY3RlZCAmJiAhc2VsZWN0KSB7CisgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgfSBlbHNlIGlmICghbU1ldGFkYXRhU2VsZWN0ZWQgJiYgc2VsZWN0KSB7CisgICAgICAgICAgICBwb3N0RmV0Y2hNc2cgPSB0cnVlOworICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlcnIgPSBCQURfVkFMVUU7IC8vIGJlaGF2ZSBhcyBMaXZlU2Vzc2lvbjo6c2VsZWN0VHJhY2sKKyAgICAgICAgfQorCisgICAgICAgIG1NZXRhZGF0YVNlbGVjdGVkID0gc2VsZWN0OworICAgIH0KIAogICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbisrOwotICAgICAgICBpZiAoc2VsZWN0KSB7Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGEsIGlkKCkpOwotICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24pOworICAgICAgICBpbnQzMl90ICZnZW5lcmF0aW9uID0gaXNTdWIgPyBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uIDogbUZldGNoTWV0YURhdGFHZW5lcmF0aW9uOworICAgICAgICBnZW5lcmF0aW9uKys7CisgICAgICAgIGlmIChwb3N0RmV0Y2hNc2cpIHsKKyAgICAgICAgICAgIGludDMyX3Qgd2hhdCA9IGlzU3ViID8ga1doYXRGZXRjaFN1YnRpdGxlRGF0YSA6IGtXaGF0RmV0Y2hNZXRhRGF0YTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uod2hhdCwgdGhpcyk7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgZ2VuZXJhdGlvbik7CiAgICAgICAgICAgICBtc2ctPnBvc3QoKTsKICAgICAgICAgfQogICAgIH0KQEAgLTE2OSw2ICsyMDAsNDkgQEAKICAgICByZXR1cm4gbUxpdmVTZXNzaW9uLT5zZWVrVG8oc2Vla1RpbWVVcyk7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpwb2xsRm9yUmF3RGF0YSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDMyX3QgY3VycmVudEdlbmVyYXRpb24sCisgICAgICAgIExpdmVTZXNzaW9uOjpTdHJlYW1UeXBlIGZldGNoVHlwZSwgaW50MzJfdCBwdXNoV2hhdCkgeworCisgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKworICAgIGlmIChnZW5lcmF0aW9uICE9IGN1cnJlbnRHZW5lcmF0aW9uKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgd2hpbGUgKG1MaXZlU2Vzc2lvbi0+ZGVxdWV1ZUFjY2Vzc1VuaXQoZmV0Y2hUeXBlLCAmYnVmZmVyKSA9PSBPSykgeworCisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIHB1c2hXaGF0KTsKKyAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGJ1ZmZlcik7CisKKyAgICAgICAgaW50NjRfdCB0aW1lVXMsIGJhc2VVcywgZGVsYXlVczsKKyAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgiYmFzZVVzIiwgJmJhc2VVcykpOworICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisgICAgICAgIGRlbGF5VXMgPSBiYXNlVXMgKyB0aW1lVXMgLSBBTG9vcGVyOjpHZXROb3dVcygpOworCisgICAgICAgIGlmIChmZXRjaFR5cGUgPT0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfU1VCVElUTEVTKSB7CisgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgIG1zZy0+cG9zdChkZWxheVVzID4gMGxsID8gZGVsYXlVcyA6IDBsbCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoZmV0Y2hUeXBlID09IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX01FVEFEQVRBKSB7CisgICAgICAgICAgICBpZiAoZGVsYXlVcyA8IC0xMDAwMDAwbGwpIHsgLy8gMSBzZWNvbmQKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgLy8gcHVzaCBhbGwgY3VycmVudGx5IGF2YWlsYWJsZSBtZXRhZGF0YSBidWZmZXJzIGluIGVhY2ggaW52b2NhdGlvbiBvZiBwb2xsRm9yUmF3RGF0YQorICAgICAgICAgICAgLy8gY29udGludWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gdHJ5IGFnYWluIGluIDEgc2Vjb25kCisgICAgbXNnLT5wb3N0KDEwMDAwMDBsbCk7Cit9CisKIHZvaWQgTnVQbGF5ZXI6OkhUVFBMaXZlU291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgICAgY2FzZSBrV2hhdFNlc3Npb25Ob3RpZnk6CkBAIC0xNzksMzMgKzI1MywyNCBAQAogCiAgICAgICAgIGNhc2Uga1doYXRGZXRjaFN1YnRpdGxlRGF0YToKICAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgcG9sbEZvclJhd0RhdGEoCisgICAgICAgICAgICAgICAgICAgIG1zZywgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgLyogZmV0Y2ggKi8gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfU1VCVElUTEVTLAorICAgICAgICAgICAgICAgICAgICAvKiBwdXNoICovIGtXaGF0U3VidGl0bGVEYXRhKTsKIAotICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbikgewotICAgICAgICAgICAgICAgIC8vIHN0YWxlCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRGZXRjaE1ldGFEYXRhOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YVNlbGVjdGVkKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKLSAgICAgICAgICAgIGlmIChtTGl2ZVNlc3Npb24tPmRlcXVldWVBY2Nlc3NVbml0KAotICAgICAgICAgICAgICAgICAgICBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9TVUJUSVRMRVMsICZidWZmZXIpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFN1YnRpdGxlRGF0YSk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0KLSAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgYmFzZVVzLCBkdXJhdGlvblVzLCBkZWxheVVzOwotICAgICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoImJhc2VVcyIsICZiYXNlVXMpKTsKLSAgICAgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZkdXJhdGlvblVzKSk7Ci0gICAgICAgICAgICAgICAgZGVsYXlVcyA9IGJhc2VVcyArIHRpbWVVcyAtIEFMb29wZXI6OkdldE5vd1VzKCk7Ci0KLSAgICAgICAgICAgICAgICBtc2ctPnBvc3QoZGVsYXlVcyA+IDBsbCA/IGRlbGF5VXMgOiAwbGwpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyB0cnkgYWdhaW4gaW4gMSBzZWNvbmQKLSAgICAgICAgICAgICAgICBtc2ctPnBvc3QoMTAwMDAwMGxsKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvbGxGb3JSYXdEYXRhKAorICAgICAgICAgICAgICAgICAgICBtc2csIG1GZXRjaE1ldGFEYXRhR2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgLyogZmV0Y2ggKi8gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfTUVUQURBVEEsCisgICAgICAgICAgICAgICAgICAgIC8qIHB1c2ggKi8ga1doYXRUaW1lZE1ldGFEYXRhKTsKIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTI4MSw2ICszNDYsNDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBMaXZlU2Vzc2lvbjo6a1doYXRCdWZmZXJpbmdTdGFydDoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UGF1c2VPbkJ1ZmZlcmluZ1N0YXJ0KTsKKyAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIExpdmVTZXNzaW9uOjprV2hhdEJ1ZmZlcmluZ0VuZDoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UmVzdW1lT25CdWZmZXJpbmdFbmQpOworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisKKyAgICAgICAgY2FzZSBMaXZlU2Vzc2lvbjo6a1doYXRCdWZmZXJpbmdVcGRhdGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKKyAgICAgICAgICAgIGludDMyX3QgcGVyY2VudGFnZTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJwZXJjZW50YWdlIiwgJnBlcmNlbnRhZ2UpKTsKKyAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEJ1ZmZlcmluZ1VwZGF0ZSk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJwZXJjZW50YWdlIiwgcGVyY2VudGFnZSk7CisgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBMaXZlU2Vzc2lvbjo6a1doYXRNZXRhZGF0YURldGVjdGVkOgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIW1IYXNNZXRhZGF0YSkgeworICAgICAgICAgICAgICAgIG1IYXNNZXRhZGF0YSA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7CisgICAgICAgICAgICAgICAgLy8gbm90aWZpY2F0aW9uIHdpdGhvdXQgYnVmZmVyIHRyaWdnZXJzIE1FRElBX0lORk9fTUVUQURBVEFfVVBEQVRFCisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0VGltZWRNZXRhRGF0YSk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgTGl2ZVNlc3Npb246OmtXaGF0RXJyb3I6CiAgICAgICAgIHsKICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuaAppbmRleCBiYmI4OTgxLi45ZTBlYzJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuaApAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgIk51UGxheWVyLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXJTb3VyY2UuaCIKIAorI2luY2x1ZGUgIkxpdmVTZXNzaW9uLmgiCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IExpdmVTZXNzaW9uOwpAQCAtNjAsNiArNjIsNyBAQAogICAgIGVudW0gewogICAgICAgICBrV2hhdFNlc3Npb25Ob3RpZnksCiAgICAgICAgIGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGEsCisgICAgICAgIGtXaGF0RmV0Y2hNZXRhRGF0YSwKICAgICB9OwogCiAgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKQEAgLTcxLDggKzc0LDE0IEBACiAgICAgc3A8QUxvb3Blcj4gbUxpdmVMb29wZXI7CiAgICAgc3A8TGl2ZVNlc3Npb24+IG1MaXZlU2Vzc2lvbjsKICAgICBpbnQzMl90IG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb247CisgICAgaW50MzJfdCBtRmV0Y2hNZXRhRGF0YUdlbmVyYXRpb247CisgICAgYm9vbCBtSGFzTWV0YWRhdGE7CisgICAgYm9vbCBtTWV0YWRhdGFTZWxlY3RlZDsKIAogICAgIHZvaWQgb25TZXNzaW9uTm90aWZ5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIHBvbGxGb3JSYXdEYXRhKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDMyX3QgY3VycmVudEdlbmVyYXRpb24sCisgICAgICAgICAgICBMaXZlU2Vzc2lvbjo6U3RyZWFtVHlwZSBmZXRjaFR5cGUsIGludDMyX3QgcHVzaFdoYXQpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSFRUUExpdmVTb3VyY2UpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCmluZGV4IGFlZWEyMDQuLmMwMTQ2ZDUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcApAQCAtMzcsNiArMzcsOSBAQAogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSA8bWVkaWEvQVZTeW5jU2V0dGluZ3MuaD4KKwogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC00NSw3ICs0OCw5IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorCiAjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogCiAjaW5jbHVkZSAiYXZjX3V0aWxzLmgiCiAKQEAgLTY0LDE4ICs2OSwxNiBAQAogfTsKIAogc3RydWN0IE51UGxheWVyOjpTZWVrQWN0aW9uIDogcHVibGljIEFjdGlvbiB7Ci0gICAgU2Vla0FjdGlvbihpbnQ2NF90IHNlZWtUaW1lVXMsIGJvb2wgbmVlZE5vdGlmeSkKLSAgICAgICAgOiBtU2Vla1RpbWVVcyhzZWVrVGltZVVzKSwKLSAgICAgICAgICBtTmVlZE5vdGlmeShuZWVkTm90aWZ5KSB7CisgICAgU2Vla0FjdGlvbihpbnQ2NF90IHNlZWtUaW1lVXMpCisgICAgICAgIDogbVNlZWtUaW1lVXMoc2Vla1RpbWVVcykgewogICAgIH0KIAogICAgIHZpcnR1YWwgdm9pZCBleGVjdXRlKE51UGxheWVyICpwbGF5ZXIpIHsKLSAgICAgICAgcGxheWVyLT5wZXJmb3JtU2VlayhtU2Vla1RpbWVVcywgbU5lZWROb3RpZnkpOworICAgICAgICBwbGF5ZXItPnBlcmZvcm1TZWVrKG1TZWVrVGltZVVzKTsKICAgICB9CiAKIHByaXZhdGU6CiAgICAgaW50NjRfdCBtU2Vla1RpbWVVczsKLSAgICBib29sIG1OZWVkTm90aWZ5OwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2Vla0FjdGlvbik7CiB9OwpAQCAtOTYsMTYgKzk5LDE2IEBACiB9OwogCiBzdHJ1Y3QgTnVQbGF5ZXI6OlNldFN1cmZhY2VBY3Rpb24gOiBwdWJsaWMgQWN0aW9uIHsKLSAgICBTZXRTdXJmYWNlQWN0aW9uKGNvbnN0IHNwPE5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZ3cmFwcGVyKQotICAgICAgICA6IG1XcmFwcGVyKHdyYXBwZXIpIHsKKyAgICBTZXRTdXJmYWNlQWN0aW9uKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKQorICAgICAgICA6IG1TdXJmYWNlKHN1cmZhY2UpIHsKICAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQgZXhlY3V0ZShOdVBsYXllciAqcGxheWVyKSB7Ci0gICAgICAgIHBsYXllci0+cGVyZm9ybVNldFN1cmZhY2UobVdyYXBwZXIpOworICAgICAgICBwbGF5ZXItPnBlcmZvcm1TZXRTdXJmYWNlKG1TdXJmYWNlKTsKICAgICB9CiAKIHByaXZhdGU6Ci0gICAgc3A8TmF0aXZlV2luZG93V3JhcHBlcj4gbVdyYXBwZXI7CisgICAgc3A8U3VyZmFjZT4gbVN1cmZhY2U7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZXRTdXJmYWNlQWN0aW9uKTsKIH07CkBAIC0xNjMsMTMgKzE2NiwxNSBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1OdVBsYXllcjo6TnVQbGF5ZXIoKQorTnVQbGF5ZXI6Ok51UGxheWVyKHBpZF90IHBpZCkKICAgICA6IG1VSURWYWxpZChmYWxzZSksCisgICAgICBtUElEKHBpZCksCiAgICAgICBtU291cmNlRmxhZ3MoMCksCiAgICAgICBtT2ZmbG9hZEF1ZGlvKGZhbHNlKSwKICAgICAgIG1BdWRpb0RlY29kZXJHZW5lcmF0aW9uKDApLAogICAgICAgbVZpZGVvRGVjb2RlckdlbmVyYXRpb24oMCksCiAgICAgICBtUmVuZGVyZXJHZW5lcmF0aW9uKDApLAorICAgICAgbVByZXZpb3VzU2Vla1RpbWVVcygwKSwKICAgICAgIG1BdWRpb0VPUyhmYWxzZSksCiAgICAgICBtVmlkZW9FT1MoZmFsc2UpLAogICAgICAgbVNjYW5Tb3VyY2VzUGVuZGluZyhmYWxzZSksCkBAIC0xODAsOSArMTg1LDEzIEBACiAgICAgICBtRmx1c2hpbmdWaWRlbyhOT05FKSwKICAgICAgIG1SZXN1bWVQZW5kaW5nKGZhbHNlKSwKICAgICAgIG1WaWRlb1NjYWxpbmdNb2RlKE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVyksCisgICAgICBtUGxheWJhY2tTZXR0aW5ncyhBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQpLAorICAgICAgbVZpZGVvRnBzSGludCgtMS5mKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1Tb3VyY2VTdGFydGVkKGZhbHNlKSwKICAgICAgIG1QYXVzZWQoZmFsc2UpLAotICAgICAgbVBhdXNlZEJ5Q2xpZW50KGZhbHNlKSB7CisgICAgICBtUGF1c2VkQnlDbGllbnQoZmFsc2UpLAorICAgICAgbVBhdXNlZEZvckJ1ZmZlcmluZyhmYWxzZSkgewogICAgIGNsZWFyRmx1c2hDb21wbGV0ZSgpOwogfQogCkBAIC0xOTksOSArMjA4LDkgQEAKIH0KIAogdm9pZCBOdVBsYXllcjo6c2V0RGF0YVNvdXJjZUFzeW5jKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0RGF0YVNvdXJjZSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldERhdGFTb3VyY2UsIHRoaXMpOwogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNvdXJjZU5vdGlmeSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNvdXJjZU5vdGlmeSwgdGhpcyk7CiAKICAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgbmV3IFN0cmVhbWluZ1NvdXJjZShub3RpZnksIHNvdXJjZSkpOwogICAgIG1zZy0+cG9zdCgpOwpAQCAtMjI5LDEwICsyMzgsMTAgQEAKICAgICAgICAgY29uc3QgY2hhciAqdXJsLAogICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewogCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldERhdGFTb3VyY2UsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXREYXRhU291cmNlLCB0aGlzKTsKICAgICBzaXplX3QgbGVuID0gc3RybGVuKHVybCk7CiAKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0U291cmNlTm90aWZ5LCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0U291cmNlTm90aWZ5LCB0aGlzKTsKIAogICAgIHNwPFNvdXJjZT4gc291cmNlOwogICAgIGlmIChJc0hUVFBMaXZlVVJMKHVybCkpIHsKQEAgLTI2Niw5ICsyNzUsOSBAQAogfQogCiB2b2lkIE51UGxheWVyOjpzZXREYXRhU291cmNlQXN5bmMoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0RGF0YVNvdXJjZSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldERhdGFTb3VyY2UsIHRoaXMpOwogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNvdXJjZU5vdGlmeSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNvdXJjZU5vdGlmeSwgdGhpcyk7CiAKICAgICBzcDxHZW5lcmljU291cmNlPiBzb3VyY2UgPQogICAgICAgICAgICAgbmV3IEdlbmVyaWNTb3VyY2Uobm90aWZ5LCBtVUlEVmFsaWQsIG1VSUQpOwpAQCAtMjg0LDM4ICsyOTMsMTA4IEBACiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OnNldERhdGFTb3VyY2VBc3luYyhjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXREYXRhU291cmNlLCB0aGlzKTsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0U291cmNlTm90aWZ5LCB0aGlzKTsKKworICAgIHNwPEdlbmVyaWNTb3VyY2U+IHNvdXJjZSA9IG5ldyBHZW5lcmljU291cmNlKG5vdGlmeSwgbVVJRFZhbGlkLCBtVUlEKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBzb3VyY2UtPnNldERhdGFTb3VyY2UoZGF0YVNvdXJjZSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IGRhdGEgc291cmNlISIpOworICAgICAgICBzb3VyY2UgPSBOVUxMOworICAgIH0KKworICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBzb3VyY2UpOworICAgIG1zZy0+cG9zdCgpOworfQorCiB2b2lkIE51UGxheWVyOjpwcmVwYXJlQXN5bmMoKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFByZXBhcmUsIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQcmVwYXJlLCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6c2V0VmlkZW9TdXJmYWNlVGV4dHVyZUFzeW5jKAogICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmYnVmZmVyUHJvZHVjZXIpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0VmlkZW9OYXRpdmVXaW5kb3csIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRWaWRlb1N1cmZhY2UsIHRoaXMpOwogCiAgICAgaWYgKGJ1ZmZlclByb2R1Y2VyID09IE5VTEwpIHsKLSAgICAgICAgbXNnLT5zZXRPYmplY3QoIm5hdGl2ZS13aW5kb3ciLCBOVUxMKTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3QoInN1cmZhY2UiLCBOVUxMKTsKICAgICB9IGVsc2UgewotICAgICAgICBtc2ctPnNldE9iamVjdCgKLSAgICAgICAgICAgICAgICAibmF0aXZlLXdpbmRvdyIsCi0gICAgICAgICAgICAgICAgbmV3IE5hdGl2ZVdpbmRvd1dyYXBwZXIoCi0gICAgICAgICAgICAgICAgICAgIG5ldyBTdXJmYWNlKGJ1ZmZlclByb2R1Y2VyLCB0cnVlIC8qIGNvbnRyb2xsZWRCeUFwcCAqLykpKTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3QoInN1cmZhY2UiLCBuZXcgU3VyZmFjZShidWZmZXJQcm9kdWNlciwgdHJ1ZSAvKiBjb250cm9sbGVkQnlBcHAgKi8pKTsKICAgICB9CiAKICAgICBtc2ctPnBvc3QoKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6c2V0QXVkaW9TaW5rKGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmc2luaykgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRBdWRpb1NpbmssIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRBdWRpb1NpbmssIHRoaXMpOwogICAgIG1zZy0+c2V0T2JqZWN0KCJzaW5rIiwgc2luayk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OnN0YXJ0KCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKSktPnBvc3QoKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OnNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpIHsKKyAgICAvLyBkbyBzb21lIGN1cnNvcnkgdmFsaWRhdGlvbiBvZiB0aGUgc2V0dGluZ3MgaGVyZS4gYXVkaW8gbW9kZXMgYXJlCisgICAgLy8gb25seSB2YWxpZGF0ZWQgd2hlbiBzZXQgb24gdGhlIGF1ZGlvc2luay4KKyAgICAgaWYgKChyYXRlLm1TcGVlZCAhPSAwLmYgJiYgcmF0ZS5tU3BlZWQgPCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NSU4pCisgICAgICAgICAgICB8fCByYXRlLm1TcGVlZCA+IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01BWAorICAgICAgICAgICAgfHwgcmF0ZS5tUGl0Y2ggPCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NSU4KKyAgICAgICAgICAgIHx8IHJhdGUubVBpdGNoID4gQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUFYKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25maWdQbGF5YmFjaywgdGhpcyk7CisgICAgd3JpdGVUb0FNZXNzYWdlKG1zZywgcmF0ZSk7CisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6Z2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSAvKiBub25udWxsICovKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldFBsYXliYWNrU2V0dGluZ3MsIHRoaXMpOworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgcmVhZEZyb21BTWVzc2FnZShyZXNwb25zZSwgcmF0ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OnNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyAmc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbmZpZ1N5bmMsIHRoaXMpOworICAgIHdyaXRlVG9BTWVzc2FnZShtc2csIHN5bmMsIHZpZGVvRnBzSGludCk7CisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6Z2V0U3luY1NldHRpbmdzKAorICAgICAgICBBVlN5bmNTZXR0aW5ncyAqc3luYyAvKiBub25udWxsICovLCBmbG9hdCAqdmlkZW9GcHMgLyogbm9ubnVsbCAqLykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRTeW5jU2V0dGluZ3MsIHRoaXMpOworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgcmVhZEZyb21BTWVzc2FnZShyZXNwb25zZSwgc3luYywgdmlkZW9GcHMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OnBhdXNlKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6cmVzZXRBc3luYygpIHsKQEAgLTMyOSwxMSArNDA4LDExIEBACiAgICAgICAgIG1Tb3VyY2UtPmRpc2Nvbm5lY3QoKTsKICAgICB9CiAKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzZXQsIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXNldCwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OnNlZWtUb0FzeW5jKGludDY0X3Qgc2Vla1RpbWVVcywgYm9vbCBuZWVkTm90aWZ5KSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlZWssIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrLCB0aGlzKTsKICAgICBtc2ctPnNldEludDY0KCJzZWVrVGltZVVzIiwgc2Vla1RpbWVVcyk7CiAgICAgbXNnLT5zZXRJbnQzMigibmVlZE5vdGlmeSIsIG5lZWROb3RpZnkpOwogICAgIG1zZy0+cG9zdCgpOwpAQCAtMzQ1LDIzICs0MjQsMzUgQEAKICAgICBpbnQzMl90IHRyYWNrVHlwZTsKICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigidHlwZSIsICZ0cmFja1R5cGUpKTsKIAorICAgIEFTdHJpbmcgbWltZTsKKyAgICBpZiAoIWZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSkgeworICAgICAgICAvLyBKYXZhIE1lZGlhUGxheWVyIG9ubHkgdXNlcyBtaW1ldHlwZSBmb3Igc3VidGl0bGUgYW5kIHRpbWVkdGV4dCB0cmFja3MuCisgICAgICAgIC8vIElmIHdlIGNhbid0IGZpbmQgdGhlIG1pbWV0eXBlIGhlcmUgaXQgbWVhbnMgdGhhdCB3ZSB3b3VsZG4ndCBiZSBuZWVkaW5nCisgICAgICAgIC8vIHRoZSBtaW1ldHlwZSBvbiB0aGUgSmF2YSBlbmQuIFdlIHN0aWxsIHdyaXRlIGEgcGxhY2Vob2xkZXIgbWltZSB0byBrZWVwIHRoZQorICAgICAgICAvLyAoZGUpc2VyaWFsaXphdGlvbiBsb2dpYyBzaW1wbGUuCisgICAgICAgIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTykgeworICAgICAgICAgICAgbWltZSA9ICJhdWRpby8iOworICAgICAgICB9IGVsc2UgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICBtaW1lID0gInZpZGVvLyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICB9CisgICAgfQorCiAgICAgQVN0cmluZyBsYW5nOwogICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibGFuZ3VhZ2UiLCAmbGFuZykpOwogCiAgICAgcmVwbHktPndyaXRlSW50MzIoMik7IC8vIHdyaXRlIHNvbWV0aGluZyBub24temVybwogICAgIHJlcGx5LT53cml0ZUludDMyKHRyYWNrVHlwZSk7CisgICAgcmVwbHktPndyaXRlU3RyaW5nMTYoU3RyaW5nMTYobWltZS5jX3N0cigpKSk7CiAgICAgcmVwbHktPndyaXRlU3RyaW5nMTYoU3RyaW5nMTYobGFuZy5jX3N0cigpKSk7CiAKICAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUpIHsKLSAgICAgICAgQVN0cmluZyBtaW1lOwotICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwotCiAgICAgICAgIGludDMyX3QgaXNBdXRvLCBpc0RlZmF1bHQsIGlzRm9yY2VkOwogICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiYXV0byIsICZpc0F1dG8pKTsKICAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoImRlZmF1bHQiLCAmaXNEZWZhdWx0KSk7CiAgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJmb3JjZWQiLCAmaXNGb3JjZWQpKTsKIAotICAgICAgICByZXBseS0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNihtaW1lLmNfc3RyKCkpKTsKICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNBdXRvKTsKICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNEZWZhdWx0KTsKICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNGb3JjZWQpOwpAQCAtNDAxLDcgKzQ5Miw3IEBACiAKICAgICAgICAgY2FzZSBrV2hhdEdldFRyYWNrSW5mbzoKICAgICAgICAgewotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5OwpAQCAtNDU0LDcgKzU0NSw3IEBACiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CiAKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcGx5SUQ7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTQ2Miw3ICs1NTMsNyBAQAogCiAgICAgICAgIGNhc2Uga1doYXRTZWxlY3RUcmFjazoKICAgICAgICAgewotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleDsKQEAgLTUzMiwxNSArNjIzLDI1IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2Uga1doYXRTZXRWaWRlb05hdGl2ZVdpbmRvdzoKKyAgICAgICAgY2FzZSBrV2hhdFNldFZpZGVvU3VyZmFjZToKICAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoImtXaGF0U2V0VmlkZW9OYXRpdmVXaW5kb3ciKTsKIAogICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJuYXRpdmUtd2luZG93IiwgJm9iaikpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzdXJmYWNlIiwgJm9iaikpOworICAgICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IHN0YXRpY19jYXN0PFN1cmZhY2UgKj4ob2JqLmdldCgpKTsKIAotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCB8fCBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwZXJmb3JtU2V0U3VyZmFjZShzdGF0aWNfY2FzdDxOYXRpdmVXaW5kb3dXcmFwcGVyICo+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgQUxPR0QoIm9uU2V0VmlkZW9TdXJmYWNlKCVwLCAlcyB2aWRlbyBkZWNvZGVyKSIsCisgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgIChtU291cmNlICE9IE5VTEwgJiYgbVN0YXJ0ZWQgJiYgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSAhPSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVZpZGVvRGVjb2RlciAhPSBOVUxMKSA/ICJoYXZlIiA6ICJubyIpOworCisgICAgICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIG1TdGFydGVkIGJlZm9yZSBjYWxsaW5nIG1Tb3VyY2UtPmdldEZvcm1hdCBiZWNhdXNlIE51UGxheWVyIG1pZ2h0CisgICAgICAgICAgICAvLyBiZSBpbiBwcmVwYXJpbmcgc3RhdGUgYW5kIGl0IGNvdWxkIHRha2UgbG9uZyB0aW1lLgorICAgICAgICAgICAgLy8gV2hlbiBtU3RhcnRlZCBpcyB0cnVlLCBtU291cmNlIG11c3QgaGF2ZSBiZWVuIHNldC4KKyAgICAgICAgICAgIGlmIChtU291cmNlID09IE5VTEwgfHwgIW1TdGFydGVkIHx8IG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgPT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBtVmlkZW9EZWNvZGVyJ3MgbVN1cmZhY2UgaXMgYWx3YXlzIG5vbi1udWxsCisgICAgICAgICAgICAgICAgICAgIHx8IChtVmlkZW9EZWNvZGVyICE9IE5VTEwgJiYgbVZpZGVvRGVjb2Rlci0+c2V0VmlkZW9TdXJmYWNlKHN1cmZhY2UpID09IE9LKSkgeworICAgICAgICAgICAgICAgIHBlcmZvcm1TZXRTdXJmYWNlKHN1cmZhY2UpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC01NDgsMTEgKzY0OSw5IEBACiAgICAgICAgICAgICAgICAgICAgIG5ldyBGbHVzaERlY29kZXJBY3Rpb24oRkxVU0hfQ01EX0ZMVVNIIC8qIGF1ZGlvICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9TSFVURE9XTiAvKiB2aWRlbyAqLykpOwogCi0gICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICAgICAgbmV3IFNldFN1cmZhY2VBY3Rpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxOYXRpdmVXaW5kb3dXcmFwcGVyICo+KG9iai5nZXQoKSkpKTsKKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKG5ldyBTZXRTdXJmYWNlQWN0aW9uKHN1cmZhY2UpKTsKIAotICAgICAgICAgICAgaWYgKG9iaiAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAob2JqICE9IE5VTEwgfHwgbUF1ZGlvRGVjb2RlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1TdGFydGVkKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIElzc3VlIGEgc2VlayB0byByZWZyZXNoIHRoZSB2aWRlbyBzY3JlZW4gb25seSBpZiBzdGFydGVkIG90aGVyd2lzZQogICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZXh0cmFjdG9yIG1heSBub3QgeWV0IGJlIHN0YXJ0ZWQgYW5kIHdpbGwgYXNzZXJ0LgpAQCAtNTYxLDcgKzY2MCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY3VycmVudFBvc2l0aW9uVXMgPSAwOwogICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0Q3VycmVudFBvc2l0aW9uKCZjdXJyZW50UG9zaXRpb25VcykgPT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2Vla0FjdGlvbihjdXJyZW50UG9zaXRpb25VcywgZmFsc2UgLyogbmVlZE5vdGlmeSAqLykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2Vla0FjdGlvbihjdXJyZW50UG9zaXRpb25VcykpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCkBAIC01OTYsNyArNjk1LDEwIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIEFMT0dWKCJrV2hhdFN0YXJ0Iik7CiAgICAgICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICBvblJlc3VtZSgpOworICAgICAgICAgICAgICAgIC8vIGRvIG5vdCByZXN1bWUgeWV0IGlmIHRoZSBzb3VyY2UgaXMgc3RpbGwgYnVmZmVyaW5nCisgICAgICAgICAgICAgICAgaWYgKCFtUGF1c2VkRm9yQnVmZmVyaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG9uUmVzdW1lKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBvblN0YXJ0KCk7CiAgICAgICAgICAgICB9CkBAIC02MDQsNiArNzA2LDExNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0Q29uZmlnUGxheWJhY2s6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgICAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgcmF0ZSAvKiBzYW5pdGl6ZWQgKi87CisgICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKG1zZywgJnJhdGUpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtUmVuZGVyZXItPnNldFBsYXliYWNrU2V0dGluZ3MocmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgaWYgKHJhdGUubVNwZWVkID09IDAuZikgeworICAgICAgICAgICAgICAgICAgICBvblBhdXNlKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgYWxsIG90aGVyIHNldHRpbmdzICh1c2luZyBub24tcGF1c2VkIHNwZWVkKQorICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBjYW4gcmVzdG9yZSB0aGVtIG9uIHN0YXJ0CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIG5ld1JhdGUgPSByYXRlOworICAgICAgICAgICAgICAgICAgICBuZXdSYXRlLm1TcGVlZCA9IG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZDsKKyAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSBuZXdSYXRlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8qIHJhdGUubVNwZWVkICE9IDAuZiAqLworICAgICAgICAgICAgICAgICAgICBvblJlc3VtZSgpOworICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IHJhdGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgcmF0ZSA9IGdldEZyYW1lUmF0ZSgpOworICAgICAgICAgICAgICAgIGlmIChyYXRlID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoIm9wZXJhdGluZy1yYXRlIiwgcmF0ZSAqIG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCk7CisgICAgICAgICAgICAgICAgICAgIG1WaWRlb0RlY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRHZXRQbGF5YmFja1NldHRpbmdzOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIHJhdGUgPSBtUGxheWJhY2tTZXR0aW5nczsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICAgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbVJlbmRlcmVyLT5nZXRQbGF5YmFja1NldHRpbmdzKCZyYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyBnZXQgcGxheWJhY2sgc2V0dGluZ3MgdXNlZCBieSByZW5kZXJlciwgYXMgaXQgbWF5IGJlCisgICAgICAgICAgICAgICAgLy8gc2xpZ2h0bHkgb2ZmIGR1ZSB0byBhdWRpb3Npbmsgbm90IHRha2luZyBzbWFsbCBjaGFuZ2VzLgorICAgICAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gcmF0ZTsKKyAgICAgICAgICAgICAgICBpZiAobVBhdXNlZCkgeworICAgICAgICAgICAgICAgICAgICByYXRlLm1TcGVlZCA9IDAuZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgd3JpdGVUb0FNZXNzYWdlKHJlc3BvbnNlLCByYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRDb25maWdTeW5jOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICAgICAgQUxPR1YoImtXaGF0Q29uZmlnU3luYyIpOworICAgICAgICAgICAgQVZTeW5jU2V0dGluZ3Mgc3luYzsKKyAgICAgICAgICAgIGZsb2F0IHZpZGVvRnBzSGludDsKKyAgICAgICAgICAgIHJlYWRGcm9tQU1lc3NhZ2UobXNnLCAmc3luYywgJnZpZGVvRnBzSGludCk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICAgICAgICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IG1SZW5kZXJlci0+c2V0U3luY1NldHRpbmdzKHN5bmMsIHZpZGVvRnBzSGludCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgbVN5bmNTZXR0aW5ncyA9IHN5bmM7CisgICAgICAgICAgICAgICAgbVZpZGVvRnBzSGludCA9IHZpZGVvRnBzSGludDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRHZXRTeW5jU2V0dGluZ3M6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgICAgICAgICAgQVZTeW5jU2V0dGluZ3Mgc3luYyA9IG1TeW5jU2V0dGluZ3M7CisgICAgICAgICAgICBmbG9hdCB2aWRlb0ZwcyA9IG1WaWRlb0Zwc0hpbnQ7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICAgICAgICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IG1SZW5kZXJlci0+Z2V0U3luY1NldHRpbmdzKCZzeW5jLCAmdmlkZW9GcHMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgbVN5bmNTZXR0aW5ncyA9IHN5bmM7CisgICAgICAgICAgICAgICAgICAgIG1WaWRlb0Zwc0hpbnQgPSB2aWRlb0ZwczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgd3JpdGVUb0FNZXNzYWdlKHJlc3BvbnNlLCBzeW5jLCB2aWRlb0Zwcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0U2NhblNvdXJjZXM6CiAgICAgICAgIHsKICAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKQEAgLTYyMywyNiArODM2LDEyIEBACiAKICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgdmlkZW8gYmVmb3JlIGF1ZGlvIGJlY2F1c2Ugc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbiBvZgogICAgICAgICAgICAgLy8gdmlkZW8gbWF5IGNoYW5nZSBkZWVwIGJ1ZmZlciBtb2RlIG9mIGF1ZGlvLgotICAgICAgICAgICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKG1TdXJmYWNlICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZURlY29kZXIoZmFsc2UsICZtVmlkZW9EZWNvZGVyKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gRG9uJ3QgdHJ5IHRvIHJlLW9wZW4gYXVkaW8gc2luayBpZiB0aGVyZSdzIGFuIGV4aXN0aW5nIGRlY29kZXIuCiAgICAgICAgICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMICYmIG1BdWRpb0RlY29kZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBhdWRpb01ldGEgPSBtU291cmNlLT5nZXRGb3JtYXRNZXRhKHRydWUgLyogYXVkaW8gKi8pOwotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiB2aWRlb0Zvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLyk7Ci0gICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gbUF1ZGlvU2luay0+Z2V0QXVkaW9TdHJlYW1UeXBlKCk7Ci0gICAgICAgICAgICAgICAgY29uc3QgYm9vbCBoYXNWaWRlbyA9ICh2aWRlb0Zvcm1hdCAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICBjb25zdCBib29sIGNhbk9mZmxvYWQgPSBjYW5PZmZsb2FkU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9NZXRhLCBoYXNWaWRlbywgdHJ1ZSAvKiBpc19zdHJlYW1pbmcgKi8sIHN0cmVhbVR5cGUpOwotICAgICAgICAgICAgICAgIGlmIChjYW5PZmZsb2FkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbU9mZmxvYWRBdWRpbykgewotICAgICAgICAgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5zaWduYWxFbmFibGVPZmZsb2FkQXVkaW8oKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBvcGVuIGF1ZGlvIHNpbmsgZWFybHkgdW5kZXIgb2ZmbG9hZCBtb2RlLgotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KHRydWUgLyphdWRpbyovKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5T3BlbkF1ZGlvU2lua0Zvck9mZmxvYWQoZm9ybWF0LCBoYXNWaWRlbyk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlRGVjb2Rlcih0cnVlLCAmbUF1ZGlvRGVjb2Rlcik7CiAgICAgICAgICAgICB9CiAKQEAgLTY3MSw3ICs4NzAsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoKG1BdWRpb0RlY29kZXIgPT0gTlVMTCAmJiBtQXVkaW9TaW5rICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIHx8IChtVmlkZW9EZWNvZGVyID09IE5VTEwgJiYgbU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSkgeworICAgICAgICAgICAgICAgICAgICB8fCAobVZpZGVvRGVjb2RlciA9PSBOVUxMICYmIG1TdXJmYWNlICE9IE5VTEwpKSB7CiAgICAgICAgICAgICAgICAgbXNnLT5wb3N0KDEwMDAwMGxsKTsKICAgICAgICAgICAgICAgICBtU2NhblNvdXJjZXNQZW5kaW5nID0gdHJ1ZTsKICAgICAgICAgICAgIH0KQEAgLTgxMCw2ICsxMDA5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpZGV2aW5lIHNvdXJjZSByZWFkcyBtdXN0IHN0b3AgYmVmb3JlIHJlbGVhc2luZyB0aGUgdmlkZW8gZGVjb2Rlci4KICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXVkaW8gJiYgbVNvdXJjZSAhPSBOVUxMICYmIG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGdldERlY29kZXIoYXVkaW8pLT5pbml0aWF0ZVNodXRkb3duKCk7IC8vIEluIHRoZSBtaWRkbGUgb2YgYSBzZWVrLgogICAgICAgICAgICAgICAgICAgICAgICAgKmZsdXNoaW5nID0gU0hVVFRJTkdfRE9XTl9ERUNPREVSOyAgICAgLy8gU2h1dCBkb3duLgpAQCAtODc2LDYgKzEwNzYsMTEgQEAKICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmYXVkaW8pKTsKIAogICAgICAgICAgICAgICAgIEFMT0dWKCJyZW5kZXJlciAlcyBmbHVzaCBjb21wbGV0ZWQuIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7CisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvICYmIChtRmx1c2hpbmdBdWRpbyA9PSBOT05FIHx8IG1GbHVzaGluZ0F1ZGlvID09IEZMVVNIRUQKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1GbHVzaGluZ0F1ZGlvID09IFNIVVRfRE9XTikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmx1c2ggaGFzIGJlZW4gaGFuZGxlZCBieSB0ZWFyIGRvd24uCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBoYW5kbGVGbHVzaENvbXBsZXRlKGF1ZGlvLCBmYWxzZSAvKiBpc0RlY29kZXIgKi8pOwogICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOwogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdFZpZGVvUmVuZGVyaW5nU3RhcnQpIHsKQEAgLTg4MywxNSArMTA4OCwyOCBAQAogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdE1lZGlhUmVuZGVyaW5nU3RhcnQpIHsKICAgICAgICAgICAgICAgICBBTE9HVigibWVkaWEgcmVuZGVyaW5nIHN0YXJ0ZWQiKTsKICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihNRURJQV9TVEFSVEVELCAwLCAwKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRBdWRpb09mZmxvYWRUZWFyRG93bikgewotICAgICAgICAgICAgICAgIEFMT0dWKCJUZWFyIGRvd24gYXVkaW8gb2ZmbG9hZCwgZmFsbCBiYWNrIHRvIHMvdyBwYXRoIGlmIGR1ZSB0byBlcnJvci4iKTsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uVXM7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInBvc2l0aW9uVXMiLCAmcG9zaXRpb25VcykpOworICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdEF1ZGlvVGVhckRvd24pIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IHJlYXNvbjsKICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVhc29uIiwgJnJlYXNvbikpOwotICAgICAgICAgICAgICAgIGNsb3NlQXVkaW9TaW5rKCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIlRlYXIgZG93biBhdWRpbyB3aXRoIHJlYXNvbiAlZC4iLCByZWFzb24pOwogICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXIuY2xlYXIoKTsKICAgICAgICAgICAgICAgICArK21BdWRpb0RlY29kZXJHZW5lcmF0aW9uOworICAgICAgICAgICAgICAgIGJvb2wgbmVlZHNUb0NyZWF0ZUF1ZGlvRGVjb2RlciA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKG1GbHVzaGluZ0F1ZGlvID09IEZMVVNISU5HX0RFQ09ERVIpIHsKKyAgICAgICAgICAgICAgICAgICAgbUZsdXNoQ29tcGxldGVbMSAvKiBhdWRpbyAqL11bMSAvKiBpc0RlY29kZXIgKi9dID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBGTFVTSEVEOworICAgICAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1GbHVzaGluZ0F1ZGlvID09IEZMVVNISU5HX0RFQ09ERVJfU0hVVERPV04KKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1GbHVzaGluZ0F1ZGlvID09IFNIVVRUSU5HX0RPV05fREVDT0RFUikgeworICAgICAgICAgICAgICAgICAgICBtRmx1c2hDb21wbGV0ZVsxIC8qIGF1ZGlvICovXVsxIC8qIGlzRGVjb2RlciAqL10gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IFNIVVRfRE9XTjsKKyAgICAgICAgICAgICAgICAgICAgZmluaXNoRmx1c2hJZlBvc3NpYmxlKCk7CisgICAgICAgICAgICAgICAgICAgIG5lZWRzVG9DcmVhdGVBdWRpb0RlY29kZXIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1SZW5kZXJlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbG9zZUF1ZGlvU2luaygpOwogICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+Zmx1c2goCiAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGF1ZGlvICovLCBmYWxzZSAvKiBub3RpZnlDb21wbGV0ZSAqLyk7CiAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgewpAQCAtODk5LDEwICsxMTE3LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogYXVkaW8gKi8sIGZhbHNlIC8qIG5vdGlmeUNvbXBsZXRlICovKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBwZXJmb3JtU2Vlayhwb3NpdGlvblVzLCBmYWxzZSAvKiBuZWVkTm90aWZ5ICovKTsKLSAgICAgICAgICAgICAgICBpZiAocmVhc29uID09IFJlbmRlcmVyOjprRHVlVG9FcnJvcikgewotICAgICAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnNpZ25hbERpc2FibGVPZmZsb2FkQXVkaW8oKTsKLSAgICAgICAgICAgICAgICAgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb25VczsKKyAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDY0KCJwb3NpdGlvblVzIiwgJnBvc2l0aW9uVXMpKSB7CisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uVXMgPSBtUHJldmlvdXNTZWVrVGltZVVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZXJmb3JtU2Vlayhwb3NpdGlvblVzKTsKKworICAgICAgICAgICAgICAgIGlmIChyZWFzb24gPT0gUmVuZGVyZXI6OmtEdWVUb0Vycm9yICYmIG5lZWRzVG9DcmVhdGVBdWRpb0RlY29kZXIpIHsKICAgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGVEZWNvZGVyKHRydWUgLyogYXVkaW8gKi8sICZtQXVkaW9EZWNvZGVyKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC05MzgsMTQgKzExNTksMzEgQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJuZWVkTm90aWZ5IiwgJm5lZWROb3RpZnkpKTsKIAogICAgICAgICAgICAgQUxPR1YoImtXaGF0U2VlayBzZWVrVGltZVVzPSVsbGQgdXMsIG5lZWROb3RpZnk9JWQiLAotICAgICAgICAgICAgICAgICAgICBzZWVrVGltZVVzLCBuZWVkTm90aWZ5KTsKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzZWVrVGltZVVzLCBuZWVkTm90aWZ5KTsKKworICAgICAgICAgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIC8vIFNlZWsgYmVmb3JlIHRoZSBwbGF5ZXIgaXMgc3RhcnRlZC4gSW4gb3JkZXIgdG8gcHJldmlldyB2aWRlbywKKyAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHN0YXJ0IHRoZSBwbGF5ZXIgYW5kIHBhdXNlIGl0LiBUaGlzIGJyYW5jaCBpcyBjYWxsZWQKKyAgICAgICAgICAgICAgICAvLyBvbmx5IG9uY2UgaWYgbmVlZGVkLiBBZnRlciB0aGUgcGxheWVyIGlzIHN0YXJ0ZWQsIGFueSBzZWVrCisgICAgICAgICAgICAgICAgLy8gb3BlcmF0aW9uIHdpbGwgZ28gdGhyb3VnaCBub3JtYWwgcGF0aC4KKyAgICAgICAgICAgICAgICAvLyBBdWRpby1vbmx5IGNhc2VzIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkuCisgICAgICAgICAgICAgICAgb25TdGFydChzZWVrVGltZVVzKTsKKyAgICAgICAgICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgb25QYXVzZSgpOworICAgICAgICAgICAgICAgICAgICBtUGF1c2VkQnlDbGllbnQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobmVlZE5vdGlmeSkgeworICAgICAgICAgICAgICAgICAgICBub3RpZnlEcml2ZXJTZWVrQ29tcGxldGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAogICAgICAgICAgICAgICAgICAgICBuZXcgRmx1c2hEZWNvZGVyQWN0aW9uKEZMVVNIX0NNRF9GTFVTSCAvKiBhdWRpbyAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTFVTSF9DTURfRkxVU0ggLyogdmlkZW8gKi8pKTsKIAogICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgICAgIG5ldyBTZWVrQWN0aW9uKHNlZWtUaW1lVXMsIG5lZWROb3RpZnkpKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IFNlZWtBY3Rpb24oc2Vla1RpbWVVcykpOwogCiAgICAgICAgICAgICAvLyBBZnRlciBhIGZsdXNoIHdpdGhvdXQgc2h1dGRvd24sIGRlY29kZXIgaXMgcGF1c2VkLgogICAgICAgICAgICAgLy8gRG9uJ3QgcmVzdW1lIGl0IHVudGlsIHNvdXJjZSBzZWVrIGlzIGRvbmUsIG90aGVyd2lzZSBpdCBjb3VsZApAQCAtMTAxNyw3ICsxMjU1LDcgQEAKIAogICAgIC8vIFRSSUNLWTogV2UgcmVseSBvbiBtUmVuZGVyZXIgYmVpbmcgbnVsbCwgc28gdGhhdCBkZWNvZGVyIGRvZXMgbm90IHN0YXJ0IHJlcXVlc3RpbmcKICAgICAvLyBkYXRhIG9uIGluc3RhbnRpYXRpb24uCi0gICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgeworICAgIGlmIChtU3VyZmFjZSAhPSBOVUxMKSB7CiAgICAgICAgIGVyciA9IGluc3RhbnRpYXRlRGVjb2RlcihmYWxzZSwgJm1WaWRlb0RlY29kZXIpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtMTAzMywxNCArMTI3MSwyMyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBOdVBsYXllcjo6b25TdGFydCgpIHsKK3ZvaWQgTnVQbGF5ZXI6Om9uU3RhcnQoaW50NjRfdCBzdGFydFBvc2l0aW9uVXMpIHsKKyAgICBpZiAoIW1Tb3VyY2VTdGFydGVkKSB7CisgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgbVNvdXJjZS0+c3RhcnQoKTsKKyAgICB9CisgICAgaWYgKHN0YXJ0UG9zaXRpb25VcyA+IDApIHsKKyAgICAgICAgcGVyZm9ybVNlZWsoc3RhcnRQb3NpdGlvblVzKTsKKyAgICAgICAgaWYgKG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCiAgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOwogICAgIG1BdWRpb0VPUyA9IGZhbHNlOwogICAgIG1WaWRlb0VPUyA9IGZhbHNlOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIG1Tb3VyY2UtPnN0YXJ0KCk7Ci0KICAgICB1aW50MzJfdCBmbGFncyA9IDA7CiAKICAgICBpZiAobVNvdXJjZS0+aXNSZWFsVGltZSgpKSB7CkBAIC0xMDU2LDI2ICsxMzAzLDMwIEBACiAgICAgc3A8QU1lc3NhZ2U+IHZpZGVvRm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKTsKIAogICAgIG1PZmZsb2FkQXVkaW8gPQotICAgICAgICBjYW5PZmZsb2FkU3RyZWFtKGF1ZGlvTWV0YSwgKHZpZGVvRm9ybWF0ICE9IE5VTEwpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogaXNfc3RyZWFtaW5nICovLCBzdHJlYW1UeXBlKTsKKyAgICAgICAgY2FuT2ZmbG9hZFN0cmVhbShhdWRpb01ldGEsICh2aWRlb0Zvcm1hdCAhPSBOVUxMKSwgbVNvdXJjZS0+aXNTdHJlYW1pbmcoKSwgc3RyZWFtVHlwZSk7CiAgICAgaWYgKG1PZmZsb2FkQXVkaW8pIHsKICAgICAgICAgZmxhZ3MgfD0gUmVuZGVyZXI6OkZMQUdfT0ZGTE9BRF9BVURJTzsKICAgICB9CiAKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVuZGVyZXJOb3RpZnksIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZW5kZXJlck5vdGlmeSwgdGhpcyk7CiAgICAgKyttUmVuZGVyZXJHZW5lcmF0aW9uOwogICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUmVuZGVyZXJHZW5lcmF0aW9uKTsKICAgICBtUmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIobUF1ZGlvU2luaywgbm90aWZ5LCBmbGFncyk7Ci0KICAgICBtUmVuZGVyZXJMb29wZXIgPSBuZXcgQUxvb3BlcjsKICAgICBtUmVuZGVyZXJMb29wZXItPnNldE5hbWUoIk51UGxheWVyUmVuZGVyZXIiKTsKICAgICBtUmVuZGVyZXJMb29wZXItPnN0YXJ0KGZhbHNlLCBmYWxzZSwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CiAgICAgbVJlbmRlcmVyTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobVJlbmRlcmVyKTsKIAotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZ2V0RmlsZU1ldGEoKTsKLSAgICBpbnQzMl90IHJhdGU7Ci0gICAgaWYgKG1ldGEgIT0gTlVMTAotICAgICAgICAgICAgJiYgbWV0YS0+ZmluZEludDMyKGtLZXlGcmFtZVJhdGUsICZyYXRlKSAmJiByYXRlID4gMCkgeworICAgIHN0YXR1c190IGVyciA9IG1SZW5kZXJlci0+c2V0UGxheWJhY2tTZXR0aW5ncyhtUGxheWJhY2tTZXR0aW5ncyk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gZmFsc2U7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZmxvYXQgcmF0ZSA9IGdldEZyYW1lUmF0ZSgpOworICAgIGlmIChyYXRlID4gMCkgewogICAgICAgICBtUmVuZGVyZXItPnNldFZpZGVvRnJhbWVSYXRlKHJhdGUpOwogICAgIH0KIApAQCAtMTEzNyw2ICsxMzg4LDcgQEAKICAgICAgICAgICAgICAgICAvLyBXaWRldmluZSBzb3VyY2UgcmVhZHMgbXVzdCBzdG9wIGJlZm9yZSByZWxlYXNpbmcgdGhlIHZpZGVvIGRlY29kZXIuCiAgICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCAmJiBtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBnZXREZWNvZGVyKGF1ZGlvKS0+aW5pdGlhdGVTaHV0ZG93bigpOwpAQCAtMTE3Niw3ICsxNDI4LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTY2FuU291cmNlcywgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNjYW5Tb3VyY2VzLCB0aGlzKTsKICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVNjYW5Tb3VyY2VzR2VuZXJhdGlvbik7CiAgICAgbXNnLT5wb3N0KCk7CiAKQEAgLTEyMDMsOCArMTQ1NSw0MiBAQAogICAgIG1SZW5kZXJlci0+Y2xvc2VBdWRpb1NpbmsoKTsKIH0KIAordm9pZCBOdVBsYXllcjo6ZGV0ZXJtaW5lQXVkaW9Nb2RlQ2hhbmdlKCkgeworICAgIGlmIChtU291cmNlID09IE5VTEwgfHwgbUF1ZGlvU2luayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobVJlbmRlcmVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coIk5vIHJlbmRlcmVyIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBhdWRpbyBtb2RlLiBVc2Ugbm9uLW9mZmxvYWQgZm9yIHNhZmV0eS4iKTsKKyAgICAgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8TWV0YURhdGE+IGF1ZGlvTWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdE1ldGEodHJ1ZSAvKiBhdWRpbyAqLyk7CisgICAgc3A8QU1lc3NhZ2U+IHZpZGVvRm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBtQXVkaW9TaW5rLT5nZXRBdWRpb1N0cmVhbVR5cGUoKTsKKyAgICBjb25zdCBib29sIGhhc1ZpZGVvID0gKHZpZGVvRm9ybWF0ICE9IE5VTEwpOworICAgIGNvbnN0IGJvb2wgY2FuT2ZmbG9hZCA9IGNhbk9mZmxvYWRTdHJlYW0oCisgICAgICAgICAgICBhdWRpb01ldGEsIGhhc1ZpZGVvLCBtU291cmNlLT5pc1N0cmVhbWluZygpLCBzdHJlYW1UeXBlKTsKKyAgICBpZiAoY2FuT2ZmbG9hZCkgeworICAgICAgICBpZiAoIW1PZmZsb2FkQXVkaW8pIHsKKyAgICAgICAgICAgIG1SZW5kZXJlci0+c2lnbmFsRW5hYmxlT2ZmbG9hZEF1ZGlvKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gb3BlbiBhdWRpbyBzaW5rIGVhcmx5IHVuZGVyIG9mZmxvYWQgbW9kZS4KKyAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCh0cnVlIC8qYXVkaW8qLyk7CisgICAgICAgIHRyeU9wZW5BdWRpb1NpbmtGb3JPZmZsb2FkKGZvcm1hdCwgaGFzVmlkZW8pOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtT2ZmbG9hZEF1ZGlvKSB7CisgICAgICAgICAgICBtUmVuZGVyZXItPnNpZ25hbERpc2FibGVPZmZsb2FkQXVkaW8oKTsKKyAgICAgICAgICAgIG1PZmZsb2FkQXVkaW8gPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KKwogc3RhdHVzX3QgTnVQbGF5ZXI6Omluc3RhbnRpYXRlRGVjb2Rlcihib29sIGF1ZGlvLCBzcDxEZWNvZGVyQmFzZT4gKmRlY29kZXIpIHsKLSAgICBpZiAoKmRlY29kZXIgIT0gTlVMTCkgeworICAgIC8vIFRoZSBhdWRpbyBkZWNvZGVyIGNvdWxkIGJlIGNsZWFyZWQgYnkgdGVhciBkb3duLiBJZiBzdGlsbCBpbiBzaHV0IGRvd24KKyAgICAvLyBwcm9jZXNzLCBubyBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBhdWRpbyBkZWNvZGVyLgorICAgIGlmICgqZGVjb2RlciAhPSBOVUxMIHx8IChhdWRpbyAmJiBtRmx1c2hpbmdBdWRpbyA9PSBTSFVUX0RPV04pKSB7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKQEAgLTEyMTQsMTEgKzE1MDAsMTMgQEAKICAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKICAgICB9CiAKKyAgICBmb3JtYXQtPnNldEludDMyKCJwcmlvcml0eSIsIDAgLyogcmVhbHRpbWUgKi8pOworCiAgICAgaWYgKCFhdWRpbykgewogICAgICAgICBBU3RyaW5nIG1pbWU7CiAgICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CiAKLSAgICAgICAgc3A8QU1lc3NhZ2U+IGNjTm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2xvc2VkQ2FwdGlvbk5vdGlmeSwgaWQoKSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBjY05vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdENsb3NlZENhcHRpb25Ob3RpZnksIHRoaXMpOwogICAgICAgICBpZiAobUNDRGVjb2RlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICBtQ0NEZWNvZGVyID0gbmV3IENDRGVjb2RlcihjY05vdGlmeSk7CiAgICAgICAgIH0KQEAgLTEyMzAsMjggKzE1MTgsMzYgQEAKICAgICAgICAgaWYgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19QUk9URUNURUQpIHsKICAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInByb3RlY3RlZCIsIHRydWUpOwogICAgICAgICB9CisKKyAgICAgICAgZmxvYXQgcmF0ZSA9IGdldEZyYW1lUmF0ZSgpOworICAgICAgICBpZiAocmF0ZSA+IDApIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0RmxvYXQoIm9wZXJhdGluZy1yYXRlIiwgcmF0ZSAqIG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEF1ZGlvTm90aWZ5LCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEF1ZGlvTm90aWZ5LCB0aGlzKTsKICAgICAgICAgKyttQXVkaW9EZWNvZGVyR2VuZXJhdGlvbjsKICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1BdWRpb0RlY29kZXJHZW5lcmF0aW9uKTsKIAorICAgICAgICBkZXRlcm1pbmVBdWRpb01vZGVDaGFuZ2UoKTsKICAgICAgICAgaWYgKG1PZmZsb2FkQXVkaW8pIHsKKyAgICAgICAgICAgIGNvbnN0IGJvb2wgaGFzVmlkZW8gPSAobVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qYXVkaW8gKi8pICE9IE5VTEwpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiaGFzLXZpZGVvIiwgaGFzVmlkZW8pOwogICAgICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2RlclBhc3NUaHJvdWdoKG5vdGlmeSwgbVNvdXJjZSwgbVJlbmRlcmVyKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXIobm90aWZ5LCBtU291cmNlLCBtUmVuZGVyZXIpOworICAgICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2Rlcihub3RpZnksIG1Tb3VyY2UsIG1QSUQsIG1SZW5kZXJlcik7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0VmlkZW9Ob3RpZnksIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0VmlkZW9Ob3RpZnksIHRoaXMpOwogICAgICAgICArK21WaWRlb0RlY29kZXJHZW5lcmF0aW9uOwogICAgICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVZpZGVvRGVjb2RlckdlbmVyYXRpb24pOwogCiAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXIoCi0gICAgICAgICAgICAgICAgbm90aWZ5LCBtU291cmNlLCBtUmVuZGVyZXIsIG1OYXRpdmVXaW5kb3csIG1DQ0RlY29kZXIpOworICAgICAgICAgICAgICAgIG5vdGlmeSwgbVNvdXJjZSwgbVBJRCwgbVJlbmRlcmVyLCBtU3VyZmFjZSwgbUNDRGVjb2Rlcik7CiAKICAgICAgICAgLy8gZW5hYmxlIEZSQyBpZiBoaWdoLXF1YWxpdHkgQVYgc3luYyBpcyByZXF1ZXN0ZWQsIGV2ZW4gaWYgbm90Ci0gICAgICAgIC8vIHF1ZXVpbmcgdG8gbmF0aXZlIHdpbmRvdywgYXMgdGhpcyB3aWxsIGV2ZW4gaW1wcm92ZSB0ZXh0dXJldmlldworICAgICAgICAvLyBkaXJlY3RseSBxdWV1aW5nIHRvIGRpc3BsYXksIGFzIHRoaXMgd2lsbCBldmVuIGltcHJvdmUgdGV4dHVyZXZpZXcKICAgICAgICAgLy8gcGxheWJhY2suCiAgICAgICAgIHsKICAgICAgICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKQEAgLTEyOTksOCArMTU5NSw2IEBACiAgICAgfQogCiAgICAgaW50MzJfdCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQ7Ci0gICAgaW50MzJfdCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tOwotCiAgICAgaWYgKG91dHB1dEZvcm1hdCAhPSBOVUxMKSB7CiAgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKICAgICAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSk7CkBAIC0xMzgyLDcgKzE2NzYsMTEgQEAKIAogICAgIC8vIE1ha2Ugc3VyZSB3ZSBkb24ndCBjb250aW51ZSB0byBzY2FuIHNvdXJjZXMgdW50aWwgd2UgZmluaXNoIGZsdXNoaW5nLgogICAgICsrbVNjYW5Tb3VyY2VzR2VuZXJhdGlvbjsKLSAgICBtU2NhblNvdXJjZXNQZW5kaW5nID0gZmFsc2U7CisgICAgaWYgKG1TY2FuU291cmNlc1BlbmRpbmcpIHsKKyAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFjdGlvbigmTnVQbGF5ZXI6OnBlcmZvcm1TY2FuU291cmNlcykpOworICAgICAgICBtU2NhblNvdXJjZXNQZW5kaW5nID0gZmFsc2U7CisgICAgfQogCiAgICAgZGVjb2Rlci0+c2lnbmFsRmx1c2goKTsKIApAQCAtMTQyMSw5ICsxNzE5LDggQEAKIAogc3RhdHVzX3QgTnVQbGF5ZXI6OnNldFZpZGVvU2NhbGluZ01vZGUoaW50MzJfdCBtb2RlKSB7CiAgICAgbVZpZGVvU2NhbGluZ01vZGUgPSBtb2RlOwotICAgIGlmIChtTmF0aXZlV2luZG93ICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzX3QgcmV0ID0gbmF0aXZlX3dpbmRvd19zZXRfc2NhbGluZ19tb2RlKAotICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3ctPmdldE5hdGl2ZVdpbmRvdygpLmdldCgpLCBtVmlkZW9TY2FsaW5nTW9kZSk7CisgICAgaWYgKG1TdXJmYWNlICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgcmV0ID0gbmF0aXZlX3dpbmRvd19zZXRfc2NhbGluZ19tb2RlKG1TdXJmYWNlLmdldCgpLCBtVmlkZW9TY2FsaW5nTW9kZSk7CiAgICAgICAgIGlmIChyZXQgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHNjYWxpbmcgbW9kZSAoJWQpOiAlcyIsCiAgICAgICAgICAgICAgICAgLXJldCwgc3RyZXJyb3IoLXJldCkpOwpAQCAtMTQzNCw3ICsxNzMxLDcgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OmdldFRyYWNrSW5mbyhQYXJjZWwqIHJlcGx5KSBjb25zdCB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldFRyYWNrSW5mbywgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldFRyYWNrSW5mbywgdGhpcyk7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJyZXBseSIsIHJlcGx5KTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKQEAgLTE0NDMsNyArMTc0MCw3IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpnZXRTZWxlY3RlZFRyYWNrKGludDMyX3QgdHlwZSwgUGFyY2VsKiByZXBseSkgY29uc3QgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRTZWxlY3RlZFRyYWNrLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0U2VsZWN0ZWRUcmFjaywgdGhpcyk7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJyZXBseSIsIHJlcGx5KTsKICAgICBtc2ctPnNldEludDMyKCJ0eXBlIiwgdHlwZSk7CiAKQEAgLTE0NTYsNyArMTc1Myw3IEBACiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgdGltZVVzKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbGVjdFRyYWNrLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VsZWN0VHJhY2ssIHRoaXMpOwogICAgIG1zZy0+c2V0U2l6ZSgidHJhY2tJbmRleCIsIHRyYWNrSW5kZXgpOwogICAgIG1zZy0+c2V0SW50MzIoInNlbGVjdCIsIHNlbGVjdCk7CiAgICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKQEAgLTE0ODQsMTMgKzE3ODEsMTUgQEAKICAgICByZXR1cm4gcmVuZGVyZXItPmdldEN1cnJlbnRQb3NpdGlvbihtZWRpYVVzKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6Z2V0U3RhdHMoaW50NjRfdCAqbnVtRnJhbWVzVG90YWwsIGludDY0X3QgKm51bUZyYW1lc0Ryb3BwZWQpIHsKLSAgICBzcDxEZWNvZGVyQmFzZT4gZGVjb2RlciA9IGdldERlY29kZXIoZmFsc2UgLyogYXVkaW8gKi8pOwotICAgIGlmIChkZWNvZGVyICE9IE5VTEwpIHsKLSAgICAgICAgZGVjb2Rlci0+Z2V0U3RhdHMobnVtRnJhbWVzVG90YWwsIG51bUZyYW1lc0Ryb3BwZWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpudW1GcmFtZXNUb3RhbCA9IDA7Ci0gICAgICAgICpudW1GcmFtZXNEcm9wcGVkID0gMDsKK3ZvaWQgTnVQbGF5ZXI6OmdldFN0YXRzKFZlY3RvcjxzcDxBTWVzc2FnZT4gPiAqbVRyYWNrU3RhdHMpIHsKKyAgICBDSEVDSyhtVHJhY2tTdGF0cyAhPSBOVUxMKTsKKworICAgIG1UcmFja1N0YXRzLT5jbGVhcigpOworICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKKyAgICAgICAgbVRyYWNrU3RhdHMtPnB1c2hfYmFjayhtVmlkZW9EZWNvZGVyLT5nZXRTdGF0cygpKTsKKyAgICB9CisgICAgaWYgKG1BdWRpb0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICBtVHJhY2tTdGF0cy0+cHVzaF9iYWNrKG1BdWRpb0RlY29kZXItPmdldFN0YXRzKCkpOwogICAgIH0KIH0KIApAQCAtMTQ5OCw4ICsxNzk3LDMwIEBACiAgICAgcmV0dXJuIG1Tb3VyY2UtPmdldEZpbGVGb3JtYXRNZXRhKCk7CiB9CiAKK2Zsb2F0IE51UGxheWVyOjpnZXRGcmFtZVJhdGUoKSB7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtU291cmNlLT5nZXRGb3JtYXRNZXRhKGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICBpZiAobWV0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQzMl90IHJhdGU7CisgICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleUZyYW1lUmF0ZSwgJnJhdGUpKSB7CisgICAgICAgIC8vIGZhbGwgYmFjayB0byB0cnkgZmlsZSBtZXRhCisgICAgICAgIHNwPE1ldGFEYXRhPiBmaWxlTWV0YSA9IGdldEZpbGVNZXRhKCk7CisgICAgICAgIGlmIChmaWxlTWV0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HVygic291cmNlIGhhcyB2aWRlbyBtZXRhIGJ1dCBub3QgZmlsZSBtZXRhIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBmaWxlTWV0YVJhdGU7CisgICAgICAgIGlmICghZmlsZU1ldGEtPmZpbmRJbnQzMihrS2V5RnJhbWVSYXRlLCAmZmlsZU1ldGFSYXRlKSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWxlTWV0YVJhdGU7CisgICAgfQorICAgIHJldHVybiByYXRlOworfQorCiB2b2lkIE51UGxheWVyOjpzY2hlZHVsZVBvbGxEdXJhdGlvbigpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbER1cmF0aW9uLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbER1cmF0aW9uLCB0aGlzKTsKICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVBvbGxEdXJhdGlvbkdlbmVyYXRpb24pOwogICAgIG1zZy0+cG9zdCgpOwogfQpAQCAtMTUzMSwxMSArMTg1MiwxMCBAQAogICAgIH0KIH0KIAotdm9pZCBOdVBsYXllcjo6cGVyZm9ybVNlZWsoaW50NjRfdCBzZWVrVGltZVVzLCBib29sIG5lZWROb3RpZnkpIHsKLSAgICBBTE9HVigicGVyZm9ybVNlZWsgc2Vla1RpbWVVcz0lbGxkIHVzICglLjJmIHNlY3MpLCBuZWVkTm90aWZ5KCVkKSIsCi0gICAgICAgICAgc2Vla1RpbWVVcywKLSAgICAgICAgICBzZWVrVGltZVVzIC8gMUU2LAotICAgICAgICAgIG5lZWROb3RpZnkpOwordm9pZCBOdVBsYXllcjo6cGVyZm9ybVNlZWsoaW50NjRfdCBzZWVrVGltZVVzKSB7CisgICAgQUxPR1YoInBlcmZvcm1TZWVrIHNlZWtUaW1lVXM9JWxsZCB1cyAoJS4yZiBzZWNzKSIsCisgICAgICAgICAgKGxvbmcgbG9uZylzZWVrVGltZVVzLAorICAgICAgICAgIHNlZWtUaW1lVXMgLyAxRTYpOwogCiAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewogICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiByZXNldCBvY2N1cnMgcmlnaHQgYmVmb3JlIHRoZSBsb29wIG1vZGUKQEAgLTE1NDUsNiArMTg2NSw3IEBACiAgICAgICAgICAgICAgICAgbUF1ZGlvRGVjb2Rlci5nZXQoKSwgbVZpZGVvRGVjb2Rlci5nZXQoKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgbVByZXZpb3VzU2Vla1RpbWVVcyA9IHNlZWtUaW1lVXM7CiAgICAgbVNvdXJjZS0+c2Vla1RvKHNlZWtUaW1lVXMpOwogICAgICsrbVRpbWVkVGV4dEdlbmVyYXRpb247CiAKQEAgLTE2MDMsNiArMTkyNCw3IEBACiAgICAgfQogCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOwogfQogCiB2b2lkIE51UGxheWVyOjpwZXJmb3JtU2NhblNvdXJjZXMoKSB7CkBAIC0xNjE3LDEwICsxOTM5LDEwIEBACiAgICAgfQogfQogCi12b2lkIE51UGxheWVyOjpwZXJmb3JtU2V0U3VyZmFjZShjb25zdCBzcDxOYXRpdmVXaW5kb3dXcmFwcGVyPiAmd3JhcHBlcikgewordm9pZCBOdVBsYXllcjo6cGVyZm9ybVNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKICAgICBBTE9HVigicGVyZm9ybVNldFN1cmZhY2UiKTsKIAotICAgIG1OYXRpdmVXaW5kb3cgPSB3cmFwcGVyOworICAgIG1TdXJmYWNlID0gc3VyZmFjZTsKIAogICAgIC8vIFhYWCAtIGlnbm9yZSBlcnJvciBmcm9tIHNldFZpZGVvU2NhbGluZ01vZGUgZm9yIG5vdwogICAgIHNldFZpZGVvU2NhbGluZ01vZGUobVZpZGVvU2NhbGluZ01vZGUpOwpAQCAtMTY2MCwxMSArMTk4MiwxNSBAQAogdm9pZCBOdVBsYXllcjo6ZmluaXNoUmVzdW1lKCkgewogICAgIGlmIChtUmVzdW1lUGVuZGluZykgewogICAgICAgICBtUmVzdW1lUGVuZGluZyA9IGZhbHNlOwotICAgICAgICBpZiAobURyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzcDxOdVBsYXllckRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNlZWtDb21wbGV0ZSgpOwotICAgICAgICAgICAgfQorICAgICAgICBub3RpZnlEcml2ZXJTZWVrQ29tcGxldGUoKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVQbGF5ZXI6Om5vdGlmeURyaXZlclNlZWtDb21wbGV0ZSgpIHsKKyAgICBpZiAobURyaXZlciAhPSBOVUxMKSB7CisgICAgICAgIHNwPE51UGxheWVyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNlZWtDb21wbGV0ZSgpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTc3Myw5ICsyMDk5LDEwIEBACiAgICAgICAgIGNhc2UgU291cmNlOjprV2hhdFBhdXNlT25CdWZmZXJpbmdTdGFydDoKICAgICAgICAgewogICAgICAgICAgICAgLy8gaWdub3JlIGlmIG5vdCBwbGF5aW5nCi0gICAgICAgICAgICBpZiAobVN0YXJ0ZWQgJiYgIW1QYXVzZWRCeUNsaWVudCkgeworICAgICAgICAgICAgaWYgKG1TdGFydGVkKSB7CiAgICAgICAgICAgICAgICAgQUxPR0koImJ1ZmZlciBsb3csIHBhdXNpbmcuLi4iKTsKIAorICAgICAgICAgICAgICAgIG1QYXVzZWRGb3JCdWZmZXJpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgIG9uUGF1c2UoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGZhbGwtdGhydQpAQCAtMTc5MCwxMCArMjExNywxNSBAQAogICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRSZXN1bWVPbkJ1ZmZlcmluZ0VuZDoKICAgICAgICAgewogICAgICAgICAgICAgLy8gaWdub3JlIGlmIG5vdCBwbGF5aW5nCi0gICAgICAgICAgICBpZiAobVN0YXJ0ZWQgJiYgIW1QYXVzZWRCeUNsaWVudCkgeworICAgICAgICAgICAgaWYgKG1TdGFydGVkKSB7CiAgICAgICAgICAgICAgICAgQUxPR0koImJ1ZmZlciByZWFkeSwgcmVzdW1pbmcuLi4iKTsKIAotICAgICAgICAgICAgICAgIG9uUmVzdW1lKCk7CisgICAgICAgICAgICAgICAgbVBhdXNlZEZvckJ1ZmZlcmluZyA9IGZhbHNlOworCisgICAgICAgICAgICAgICAgLy8gZG8gbm90IHJlc3VtZSB5ZXQgaWYgY2xpZW50IGRpZG4ndCB1bnBhdXNlCisgICAgICAgICAgICAgICAgaWYgKCFtUGF1c2VkQnlDbGllbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgb25SZXN1bWUoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBmYWxsLXRocnUKICAgICAgICAgfQpAQCAtMTgyMiw2ICsyMTU0LDE3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgU291cmNlOjprV2hhdFRpbWVkTWV0YURhdGE6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX0lORk8sIE1FRElBX0lORk9fTUVUQURBVEFfVVBEQVRFLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VuZFRpbWVkTWV0YURhdGEoYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0VGltZWRUZXh0RGF0YToKICAgICAgICAgewogICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOwpAQCAtMTkzMCw2ICsyMjczLDE5IEBACiAgICAgbm90aWZ5TGlzdGVuZXIoTUVESUFfU1VCVElUTEVfREFUQSwgMCwgMCwgJmluKTsKIH0KIAordm9pZCBOdVBsYXllcjo6c2VuZFRpbWVkTWV0YURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKworICAgIFBhcmNlbCBpbjsKKyAgICBpbi53cml0ZUludDY0KHRpbWVVcyk7CisgICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7CisgICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7CisgICAgaW4ud3JpdGUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKworICAgIG5vdGlmeUxpc3RlbmVyKE1FRElBX01FVEFfREFUQSwgMCwgMCwgJmluKTsKK30KKwogdm9pZCBOdVBsYXllcjo6c2VuZFRpbWVkVGV4dERhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewogICAgIGNvbnN0IHZvaWQgKmRhdGE7CiAgICAgc2l6ZV90IHNpemUgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaAppbmRleCAzMGVkZTFhLi5jOWYwYmJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaApAQCAtMTgsMTkgKzE4LDIyIEBACiAKICNkZWZpbmUgTlVfUExBWUVSX0hfCiAKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L05hdGl2ZVdpbmRvd1dyYXBwZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKIHN0cnVjdCBBTWVzc2FnZTsKK3N0cnVjdCBBdWRpb1BsYXliYWNrUmF0ZTsKK3N0cnVjdCBBVlN5bmNTZXR0aW5nczsKK2NsYXNzIElEYXRhU291cmNlOwogY2xhc3MgTWV0YURhdGE7CiBzdHJ1Y3QgTnVQbGF5ZXJEcml2ZXI7CiAKIHN0cnVjdCBOdVBsYXllciA6IHB1YmxpYyBBSGFuZGxlciB7Ci0gICAgTnVQbGF5ZXIoKTsKKyAgICBOdVBsYXllcihwaWRfdCBwaWQpOwogCiAgICAgdm9pZCBzZXRVSUQodWlkX3QgdWlkKTsKIApAQCAtNDUsMTIgKzQ4LDE5IEBACiAKICAgICB2b2lkIHNldERhdGFTb3VyY2VBc3luYyhpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7CiAKKyAgICB2b2lkIHNldERhdGFTb3VyY2VBc3luYyhjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKKwogICAgIHZvaWQgcHJlcGFyZUFzeW5jKCk7CiAKICAgICB2b2lkIHNldFZpZGVvU3VyZmFjZVRleHR1cmVBc3luYygKICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZidWZmZXJQcm9kdWNlcik7CiAKICAgICB2b2lkIHNldEF1ZGlvU2luayhjb25zdCBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gJnNpbmspOworICAgIHN0YXR1c190IHNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpOworICAgIHN0YXR1c190IGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUgLyogbm9ubnVsbCAqLyk7CisgICAgc3RhdHVzX3Qgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpOworICAgIHN0YXR1c190IGdldFN5bmNTZXR0aW5ncyhBVlN5bmNTZXR0aW5ncyAqc3luYyAvKiBub25udWxsICovLCBmbG9hdCAqdmlkZW9GcHMgLyogbm9ubnVsbCAqLyk7CisKICAgICB2b2lkIHN0YXJ0KCk7CiAKICAgICB2b2lkIHBhdXNlKCk7CkBAIC02Nyw5ICs3NywxMCBAQAogICAgIHN0YXR1c190IGdldFNlbGVjdGVkVHJhY2soaW50MzJfdCB0eXBlLCBQYXJjZWwqIHJlcGx5KSBjb25zdDsKICAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgdGltZVVzKTsKICAgICBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbWVkaWFVcyk7Ci0gICAgdm9pZCBnZXRTdGF0cyhpbnQ2NF90ICptTnVtRnJhbWVzVG90YWwsIGludDY0X3QgKm1OdW1GcmFtZXNEcm9wcGVkKTsKKyAgICB2b2lkIGdldFN0YXRzKFZlY3RvcjxzcDxBTWVzc2FnZT4gPiAqbVRyYWNrU3RhdHMpOwogCiAgICAgc3A8TWV0YURhdGE+IGdldEZpbGVNZXRhKCk7CisgICAgZmxvYXQgZ2V0RnJhbWVSYXRlKCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5OdVBsYXllcigpOwpAQCAtMTAxLDkgKzExMiwxMyBAQAogICAgIGVudW0gewogICAgICAgICBrV2hhdFNldERhdGFTb3VyY2UgICAgICAgICAgICAgID0gJz1EYVMnLAogICAgICAgICBrV2hhdFByZXBhcmUgICAgICAgICAgICAgICAgICAgID0gJ3ByZXAnLAotICAgICAgICBrV2hhdFNldFZpZGVvTmF0aXZlV2luZG93ICAgICAgID0gJz1OYVcnLAorICAgICAgICBrV2hhdFNldFZpZGVvU3VyZmFjZSAgICAgICAgICAgID0gJz1WU3UnLAogICAgICAgICBrV2hhdFNldEF1ZGlvU2luayAgICAgICAgICAgICAgID0gJz1BdVMnLAogICAgICAgICBrV2hhdE1vcmVEYXRhUXVldWVkICAgICAgICAgICAgID0gJ21vcmUnLAorICAgICAgICBrV2hhdENvbmZpZ1BsYXliYWNrICAgICAgICAgICAgID0gJ2NmUEInLAorICAgICAgICBrV2hhdENvbmZpZ1N5bmMgICAgICAgICAgICAgICAgID0gJ2NmU3knLAorICAgICAgICBrV2hhdEdldFBsYXliYWNrU2V0dGluZ3MgICAgICAgID0gJ2dQYlMnLAorICAgICAgICBrV2hhdEdldFN5bmNTZXR0aW5ncyAgICAgICAgICAgID0gJ2dTeVMnLAogICAgICAgICBrV2hhdFN0YXJ0ICAgICAgICAgICAgICAgICAgICAgID0gJ3N0cnQnLAogICAgICAgICBrV2hhdFNjYW5Tb3VyY2VzICAgICAgICAgICAgICAgID0gJ3NjYW4nLAogICAgICAgICBrV2hhdFZpZGVvTm90aWZ5ICAgICAgICAgICAgICAgID0gJ3ZpZE4nLApAQCAtMTI0LDkgKzEzOSwxMCBAQAogICAgIHdwPE51UGxheWVyRHJpdmVyPiBtRHJpdmVyOwogICAgIGJvb2wgbVVJRFZhbGlkOwogICAgIHVpZF90IG1VSUQ7CisgICAgcGlkX3QgbVBJRDsKICAgICBzcDxTb3VyY2U+IG1Tb3VyY2U7CiAgICAgdWludDMyX3QgbVNvdXJjZUZsYWdzOwotICAgIHNwPE5hdGl2ZVdpbmRvd1dyYXBwZXI+IG1OYXRpdmVXaW5kb3c7CisgICAgc3A8U3VyZmFjZT4gbVN1cmZhY2U7CiAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+IG1BdWRpb1Npbms7CiAgICAgc3A8RGVjb2RlckJhc2U+IG1WaWRlb0RlY29kZXI7CiAgICAgYm9vbCBtT2ZmbG9hZEF1ZGlvOwpAQCAtMTM4LDYgKzE1NCw4IEBACiAgICAgaW50MzJfdCBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbjsKICAgICBpbnQzMl90IG1SZW5kZXJlckdlbmVyYXRpb247CiAKKyAgICBpbnQ2NF90IG1QcmV2aW91c1NlZWtUaW1lVXM7CisKICAgICBMaXN0PHNwPEFjdGlvbj4gPiBtRGVmZXJyZWRBY3Rpb25zOwogCiAgICAgYm9vbCBtQXVkaW9FT1M7CkBAIC0xNzUsNyArMTkzLDExIEBACiAKICAgICBpbnQzMl90IG1WaWRlb1NjYWxpbmdNb2RlOwogCisgICAgQXVkaW9QbGF5YmFja1JhdGUgbVBsYXliYWNrU2V0dGluZ3M7CisgICAgQVZTeW5jU2V0dGluZ3MgbVN5bmNTZXR0aW5nczsKKyAgICBmbG9hdCBtVmlkZW9GcHNIaW50OwogICAgIGJvb2wgbVN0YXJ0ZWQ7CisgICAgYm9vbCBtU291cmNlU3RhcnRlZDsKIAogICAgIC8vIEFjdHVhbCBwYXVzZSBzdGF0ZSwgZWl0aGVyIGFzIHJlcXVlc3RlZCBieSBjbGllbnQgb3IgZHVlIHRvIGJ1ZmZlcmluZy4KICAgICBib29sIG1QYXVzZWQ7CkBAIC0xODUsNiArMjA3LDkgQEAKICAgICAvLyBzdGlsbCBiZWNvbWUgdHJ1ZSwgd2hlbiB3ZSBwYXVzZSBpbnRlcm5hbGx5IGR1ZSB0byBidWZmZXJpbmcuCiAgICAgYm9vbCBtUGF1c2VkQnlDbGllbnQ7CiAKKyAgICAvLyBQYXVzZSBzdGF0ZSBhcyByZXF1ZXN0ZWQgYnkgc291cmNlIChpbnRlcm5hbGx5KSBkdWUgdG8gYnVmZmVyaW5nCisgICAgYm9vbCBtUGF1c2VkRm9yQnVmZmVyaW5nOworCiAgICAgaW5saW5lIGNvbnN0IHNwPERlY29kZXJCYXNlPiAmZ2V0RGVjb2Rlcihib29sIGF1ZGlvKSB7CiAgICAgICAgIHJldHVybiBhdWRpbyA/IG1BdWRpb0RlY29kZXIgOiBtVmlkZW9EZWNvZGVyOwogICAgIH0KQEAgLTE5OCw2ICsyMjMsNyBAQAogCiAgICAgdm9pZCB0cnlPcGVuQXVkaW9TaW5rRm9yT2ZmbG9hZChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgYm9vbCBoYXNWaWRlbyk7CiAgICAgdm9pZCBjbG9zZUF1ZGlvU2luaygpOworICAgIHZvaWQgZGV0ZXJtaW5lQXVkaW9Nb2RlQ2hhbmdlKCk7CiAKICAgICBzdGF0dXNfdCBpbnN0YW50aWF0ZURlY29kZXIoYm9vbCBhdWRpbywgc3A8RGVjb2RlckJhc2U+ICpkZWNvZGVyKTsKIApAQCAtMjEyLDcgKzIzOCw3IEBACiAgICAgdm9pZCBoYW5kbGVGbHVzaENvbXBsZXRlKGJvb2wgYXVkaW8sIGJvb2wgaXNEZWNvZGVyKTsKICAgICB2b2lkIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOwogCi0gICAgdm9pZCBvblN0YXJ0KCk7CisgICAgdm9pZCBvblN0YXJ0KGludDY0X3Qgc3RhcnRQb3NpdGlvblVzID0gLTEpOwogICAgIHZvaWQgb25SZXN1bWUoKTsKICAgICB2b2lkIG9uUGF1c2UoKTsKIApAQCAtMjIxLDYgKzI0Nyw3IEBACiAgICAgdm9pZCBmbHVzaERlY29kZXIoYm9vbCBhdWRpbywgYm9vbCBuZWVkU2h1dGRvd24pOwogCiAgICAgdm9pZCBmaW5pc2hSZXN1bWUoKTsKKyAgICB2b2lkIG5vdGlmeURyaXZlclNlZWtDb21wbGV0ZSgpOwogCiAgICAgdm9pZCBwb3N0U2NhblNvdXJjZXMoKTsKIApAQCAtMjI5LDExICsyNTYsMTEgQEAKIAogICAgIHZvaWQgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOwogCi0gICAgdm9pZCBwZXJmb3JtU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMsIGJvb2wgbmVlZE5vdGlmeSk7CisgICAgdm9pZCBwZXJmb3JtU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMpOwogICAgIHZvaWQgcGVyZm9ybURlY29kZXJGbHVzaChGbHVzaENvbW1hbmQgYXVkaW8sIEZsdXNoQ29tbWFuZCB2aWRlbyk7CiAgICAgdm9pZCBwZXJmb3JtUmVzZXQoKTsKICAgICB2b2lkIHBlcmZvcm1TY2FuU291cmNlcygpOwotICAgIHZvaWQgcGVyZm9ybVNldFN1cmZhY2UoY29uc3Qgc3A8TmF0aXZlV2luZG93V3JhcHBlcj4gJndyYXBwZXIpOworICAgIHZvaWQgcGVyZm9ybVNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJndyYXBwZXIpOwogICAgIHZvaWQgcGVyZm9ybVJlc3VtZURlY29kZXJzKGJvb2wgbmVlZE5vdGlmeSk7CiAKICAgICB2b2lkIG9uU291cmNlTm90aWZ5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKQEAgLTI0Myw2ICsyNzAsNyBAQAogICAgICAgICAgICAgYm9vbCBhdWRpbywgYm9vbCB2aWRlbywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSk7CiAKICAgICB2b2lkIHNlbmRTdWJ0aXRsZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgaW50MzJfdCBiYXNlSW5kZXgpOworICAgIHZvaWQgc2VuZFRpbWVkTWV0YURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAgICAgdm9pZCBzZW5kVGltZWRUZXh0RGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKIAogICAgIHZvaWQgd3JpdGVUcmFja0luZm8oUGFyY2VsKiByZXBseSwgY29uc3Qgc3A8QU1lc3NhZ2U+IGZvcm1hdCkgY29uc3Q7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmNwcAppbmRleCA5MjI5NzA0Li5hYzNjNmI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCisjaW5jbHVkZSAiYXZjX3V0aWxzLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXJDQ0RlY29kZXIuaCIKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgpAQCAtNTAsNiArNTEsNyBAQAogICAgIHJldHVybiBjYy0+bURhdGExIDwgMHgxMCAmJiBjYy0+bURhdGEyIDwgMHgxMDsKIH0KIAorc3RhdGljIHZvaWQgZHVtcEJ5dGVQYWlyKGNvbnN0IHNwPEFCdWZmZXI+ICZjY0J1ZikgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOwogc3RhdGljIHZvaWQgZHVtcEJ5dGVQYWlyKGNvbnN0IHNwPEFCdWZmZXI+ICZjY0J1ZikgewogICAgIHNpemVfdCBvZmZzZXQgPSAwOwogICAgIEFTdHJpbmcgb3V0OwpAQCAtMTg1LDE3ICsxODcsMzggQEAKIAogLy8gcmV0dXJucyB0cnVlIGlmIGEgbmV3IENDIHRyYWNrIGlzIGZvdW5kCiBib29sIE51UGxheWVyOjpDQ0RlY29kZXI6OmV4dHJhY3RGcm9tU0VJKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSB7Ci0gICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKLQogICAgIHNwPEFCdWZmZXI+IHNlaTsKICAgICBpZiAoIWFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEJ1ZmZlcigic2VpIiwgJnNlaSkgfHwgc2VpID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisKICAgICBib29sIHRyYWNrQWRkZWQgPSBmYWxzZTsKIAotICAgIE5BTEJpdFJlYWRlciBicihzZWktPmRhdGEoKSArIDEsIHNlaS0+c2l6ZSgpIC0gMSk7CisgICAgY29uc3QgTkFMUG9zaXRpb24gKm5hbCA9IChOQUxQb3NpdGlvbiAqKSBzZWktPmRhdGEoKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2VpLT5zaXplKCkgLyBzaXplb2YoTkFMUG9zaXRpb24pOyArK2ksICsrbmFsKSB7CisgICAgICAgIHRyYWNrQWRkZWQgfD0gcGFyc2VTRUlOYWxVbml0KAorICAgICAgICAgICAgICAgIHRpbWVVcywgYWNjZXNzVW5pdC0+ZGF0YSgpICsgbmFsLT5uYWxPZmZzZXQsIG5hbC0+bmFsU2l6ZSk7CisgICAgfQorCisgICAgcmV0dXJuIHRyYWNrQWRkZWQ7Cit9CisKKy8vIHJldHVybnMgdHJ1ZSBpZiBhIG5ldyBDQyB0cmFjayBpcyBmb3VuZAorYm9vbCBOdVBsYXllcjo6Q0NEZWNvZGVyOjpwYXJzZVNFSU5hbFVuaXQoCisgICAgICAgIGludDY0X3QgdGltZVVzLCBjb25zdCB1aW50OF90ICpuYWxTdGFydCwgc2l6ZV90IG5hbFNpemUpIHsKKyAgICB1bnNpZ25lZCBuYWxUeXBlID0gbmFsU3RhcnRbMF0gJiAweDFmOworCisgICAgLy8gdGhlIGJ1ZmZlciBzaG91bGQgb25seSBoYXZlIFNFSSBpbiBpdAorICAgIGlmIChuYWxUeXBlICE9IDYpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgdHJhY2tBZGRlZCA9IGZhbHNlOworICAgIE5BTEJpdFJlYWRlciBicihuYWxTdGFydCArIDEsIG5hbFNpemUgLSAxKTsKICAgICAvLyBzZWlfbWVzc2FnZSgpCiAgICAgd2hpbGUgKGJyLmF0TGVhc3ROdW1CaXRzTGVmdCgxNikpIHsgLy8gYXQgbGVhc3QgMTYtYml0IGZvciBzZWlfbWVzc2FnZSgpCiAgICAgICAgIHVpbnQzMl90IHBheWxvYWRfdHlwZSA9IDA7CkBAIC0yMTQsMjAgKzIzNywyNSBAQAogCiAgICAgICAgIC8vIHNlaV9wYXlsb2FkKCkKICAgICAgICAgaWYgKHBheWxvYWRfdHlwZSA9PSA0KSB7Ci0gICAgICAgICAgICAvLyB1c2VyX2RhdGFfcmVnaXN0ZXJlZF9pdHVfdF90MzUoKQorICAgICAgICAgICAgYm9vbCBpc0NDID0gZmFsc2U7CisgICAgICAgICAgICBpZiAocGF5bG9hZF9zaXplID4gMSArIDIgKyA0ICsgMSkgeworICAgICAgICAgICAgICAgIC8vIHVzZXJfZGF0YV9yZWdpc3RlcmVkX2l0dV90X3QzNSgpCiAKLSAgICAgICAgICAgIC8vIEFUU0MgQS83MjogNi40LjIKLSAgICAgICAgICAgIHVpbnQ4X3QgaXR1X3RfdDM1X2NvdW50cnlfY29kZSA9IGJyLmdldEJpdHMoOCk7Ci0gICAgICAgICAgICB1aW50MTZfdCBpdHVfdF90MzVfcHJvdmlkZXJfY29kZSA9IGJyLmdldEJpdHMoMTYpOwotICAgICAgICAgICAgdWludDMyX3QgdXNlcl9pZGVudGlmaWVyID0gYnIuZ2V0Qml0cygzMik7Ci0gICAgICAgICAgICB1aW50OF90IHVzZXJfZGF0YV90eXBlX2NvZGUgPSBici5nZXRCaXRzKDgpOworICAgICAgICAgICAgICAgIC8vIEFUU0MgQS83MjogNi40LjIKKyAgICAgICAgICAgICAgICB1aW50OF90IGl0dV90X3QzNV9jb3VudHJ5X2NvZGUgPSBici5nZXRCaXRzKDgpOworICAgICAgICAgICAgICAgIHVpbnQxNl90IGl0dV90X3QzNV9wcm92aWRlcl9jb2RlID0gYnIuZ2V0Qml0cygxNik7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdXNlcl9pZGVudGlmaWVyID0gYnIuZ2V0Qml0cygzMik7CisgICAgICAgICAgICAgICAgdWludDhfdCB1c2VyX2RhdGFfdHlwZV9jb2RlID0gYnIuZ2V0Qml0cyg4KTsKIAotICAgICAgICAgICAgcGF5bG9hZF9zaXplIC09IDEgKyAyICsgNCArIDE7CisgICAgICAgICAgICAgICAgcGF5bG9hZF9zaXplIC09IDEgKyAyICsgNCArIDE7CiAKLSAgICAgICAgICAgIGlmIChpdHVfdF90MzVfY291bnRyeV9jb2RlID09IDB4QjUKLSAgICAgICAgICAgICAgICAgICAgJiYgaXR1X3RfdDM1X3Byb3ZpZGVyX2NvZGUgPT0gMHgwMDMxCi0gICAgICAgICAgICAgICAgICAgICYmIHVzZXJfaWRlbnRpZmllciA9PSAnR0E5NCcKLSAgICAgICAgICAgICAgICAgICAgJiYgdXNlcl9kYXRhX3R5cGVfY29kZSA9PSAweDMpIHsKKyAgICAgICAgICAgICAgICBpc0NDID0gaXR1X3RfdDM1X2NvdW50cnlfY29kZSA9PSAweEI1CisgICAgICAgICAgICAgICAgICAgICAgICAmJiBpdHVfdF90MzVfcHJvdmlkZXJfY29kZSA9PSAweDAwMzEKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHVzZXJfaWRlbnRpZmllciA9PSAnR0E5NCcKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHVzZXJfZGF0YV90eXBlX2NvZGUgPT0gMHgzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaXNDQyAmJiBwYXlsb2FkX3NpemUgPiAyKSB7CiAgICAgICAgICAgICAgICAgLy8gTVBFR19jY19kYXRhKCkKICAgICAgICAgICAgICAgICAvLyBBVFNDIEEvNTMgUGFydCA0OiA2LjIuMy4xCiAgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoMSk7IC8vcHJvY2Vzc19lbV9kYXRhX2ZsYWcKQEAgLTI0Myw3ICsyNzEsNyBAQAogICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBjY0J1ZiA9IG5ldyBBQnVmZmVyKGNjX2NvdW50ICogc2l6ZW9mKENDRGF0YSkpOwogICAgICAgICAgICAgICAgICAgICBjY0J1Zi0+c2V0UmFuZ2UoMCwgMCk7CiAKLSAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjY19jb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2NfY291bnQgJiYgcGF5bG9hZF9zaXplID49IDM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtYXJrZXIgPSBici5nZXRCaXRzKDUpOwogICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobWFya2VyLCAweDFmKTsKIApAQCAtMjUzLDYgKzI4MSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNjX2RhdGFfMSA9IGJyLmdldEJpdHMoOCkgJiAweDdmOwogICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjY19kYXRhXzIgPSBici5nZXRCaXRzKDgpICYgMHg3ZjsKIAorICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF9zaXplIC09IDM7CisKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjY192YWxpZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoY2NfdHlwZSA9PSAwIHx8IGNjX3R5cGUgPT0gMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ0RhdGEgY2MoY2NfdHlwZSwgY2NfZGF0YV8xLCBjY19kYXRhXzIpOwpAQCAtMjY5LDcgKzI5OSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBheWxvYWRfc2l6ZSAtPSBjY19jb3VudCAqIDM7CiAKICAgICAgICAgICAgICAgICAgICAgbUNDTWFwLmFkZCh0aW1lVXMsIGNjQnVmKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5oCmluZGV4IDVlMDZmNGUuLjc3ZmIwZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5oCkBAIC00OSw2ICs0OSw3IEBACiAgICAgYm9vbCBpc1RyYWNrVmFsaWQoc2l6ZV90IGluZGV4KSBjb25zdDsKICAgICBpbnQzMl90IGdldFRyYWNrSW5kZXgoc2l6ZV90IGNoYW5uZWwpIGNvbnN0OwogICAgIGJvb2wgZXh0cmFjdEZyb21TRUkoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOworICAgIGJvb2wgcGFyc2VTRUlOYWxVbml0KGludDY0X3QgdGltZVVzLCBjb25zdCB1aW50OF90ICpuYWxTdGFydCwgc2l6ZV90IG5hbFNpemUpOwogICAgIHNwPEFCdWZmZXI+IGZpbHRlckNDQnVmKGNvbnN0IHNwPEFCdWZmZXI+ICZjY0J1Ziwgc2l6ZV90IGluZGV4KTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENDRGVjb2Rlcik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCmluZGV4IDVkOThkOTguLjM2NDY4MjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSAiTnVQbGF5ZXJSZW5kZXJlci5oIgogI2luY2x1ZGUgIk51UGxheWVyU291cmNlLmgiCiAKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtMzMsMjkgKzM0LDQxIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KIAorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisKICNpbmNsdWRlICJhdmNfdXRpbHMuaCIKICNpbmNsdWRlICJBVFNQYXJzZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdGF0aWMgaW5saW5lIGJvb2wgZ2V0QXVkaW9EZWVwQnVmZmVyU2V0dGluZygpIHsKKyAgICByZXR1cm4gcHJvcGVydHlfZ2V0X2Jvb2woIm1lZGlhLnN0YWdlZnJpZ2h0LmF1ZGlvLmRlZXAiLCBmYWxzZSAvKiBkZWZhdWx0X3ZhbHVlICovKTsKK30KKwogTnVQbGF5ZXI6OkRlY29kZXI6OkRlY29kZXIoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICBjb25zdCBzcDxTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgY29uc3Qgc3A8UmVuZGVyZXI+ICZyZW5kZXJlciwKLSAgICAgICAgY29uc3Qgc3A8TmF0aXZlV2luZG93V3JhcHBlcj4gJm5hdGl2ZVdpbmRvdywKKyAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UsCiAgICAgICAgIGNvbnN0IHNwPENDRGVjb2Rlcj4gJmNjRGVjb2RlcikKICAgICA6IERlY29kZXJCYXNlKG5vdGlmeSksCi0gICAgICBtTmF0aXZlV2luZG93KG5hdGl2ZVdpbmRvdyksCisgICAgICBtU3VyZmFjZShzdXJmYWNlKSwKICAgICAgIG1Tb3VyY2Uoc291cmNlKSwKICAgICAgIG1SZW5kZXJlcihyZW5kZXJlciksCiAgICAgICBtQ0NEZWNvZGVyKGNjRGVjb2RlciksCisgICAgICBtUGlkKHBpZCksCiAgICAgICBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMoLTFsbCksCiAgICAgICBtTnVtRnJhbWVzVG90YWwoMGxsKSwKLSAgICAgIG1OdW1GcmFtZXNEcm9wcGVkKDBsbCksCisgICAgICBtTnVtSW5wdXRGcmFtZXNEcm9wcGVkKDBsbCksCisgICAgICBtTnVtT3V0cHV0RnJhbWVzRHJvcHBlZCgwbGwpLAorICAgICAgbVZpZGVvV2lkdGgoMCksCisgICAgICBtVmlkZW9IZWlnaHQoMCksCiAgICAgICBtSXNBdWRpbyh0cnVlKSwKICAgICAgIG1Jc1ZpZGVvQVZDKGZhbHNlKSwKICAgICAgIG1Jc1NlY3VyZShmYWxzZSksCiAgICAgICBtRm9ybWF0Q2hhbmdlUGVuZGluZyhmYWxzZSksCisgICAgICBtVGltZUNoYW5nZVBlbmRpbmcoZmFsc2UpLAogICAgICAgbVBhdXNlZCh0cnVlKSwKICAgICAgIG1SZXN1bWVQZW5kaW5nKGZhbHNlKSwKICAgICAgIG1Db21wb25lbnROYW1lKCJkZWNvZGVyIikgewpAQCAtNjUsMTQgKzc4LDMxIEBACiB9CiAKIE51UGxheWVyOjpEZWNvZGVyOjp+RGVjb2RlcigpIHsKKyAgICBtQ29kZWMtPnJlbGVhc2UoKTsKICAgICByZWxlYXNlQW5kUmVzZXRNZWRpYUJ1ZmZlcnMoKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6Z2V0U3RhdHMoCi0gICAgICAgIGludDY0X3QgKm51bUZyYW1lc1RvdGFsLAotICAgICAgICBpbnQ2NF90ICpudW1GcmFtZXNEcm9wcGVkKSBjb25zdCB7Ci0gICAgKm51bUZyYW1lc1RvdGFsID0gbU51bUZyYW1lc1RvdGFsOwotICAgICpudW1GcmFtZXNEcm9wcGVkID0gbU51bUZyYW1lc0Ryb3BwZWQ7CitzcDxBTWVzc2FnZT4gTnVQbGF5ZXI6OkRlY29kZXI6OmdldFN0YXRzKCkgY29uc3QgeworICAgIG1TdGF0cy0+c2V0SW50NjQoImZyYW1lcy10b3RhbCIsIG1OdW1GcmFtZXNUb3RhbCk7CisgICAgbVN0YXRzLT5zZXRJbnQ2NCgiZnJhbWVzLWRyb3BwZWQtaW5wdXQiLCBtTnVtSW5wdXRGcmFtZXNEcm9wcGVkKTsKKyAgICBtU3RhdHMtPnNldEludDY0KCJmcmFtZXMtZHJvcHBlZC1vdXRwdXQiLCBtTnVtT3V0cHV0RnJhbWVzRHJvcHBlZCk7CisgICAgcmV0dXJuIG1TdGF0czsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OkRlY29kZXI6OnNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIGlmIChzdXJmYWNlID09IE5VTEwgfHwgQURlYnVnOjppc0V4cGVyaW1lbnRFbmFibGVkKCJsZWdhY3ktc2V0c3VyZmFjZSIpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldFZpZGVvU3VyZmFjZSwgdGhpcyk7CisKKyAgICBtc2ctPnNldE9iamVjdCgic3VyZmFjZSIsIHN1cmZhY2UpOworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKIH0KIAogdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKQEAgLTgxLDI1ICsxMTEsNzEgQEAKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CiAgICAgICAgIGNhc2Uga1doYXRDb2RlY05vdGlmeToKICAgICAgICAgewotICAgICAgICAgICAgaWYgKCFpc1N0YWxlUmVwbHkobXNnKSkgewotICAgICAgICAgICAgICAgIGludDMyX3QgbnVtSW5wdXQsIG51bU91dHB1dDsKKyAgICAgICAgICAgIGludDMyX3QgY2JJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJjYWxsYmFja0lEIiwgJmNiSUQpKTsKIAotICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImlucHV0LWJ1ZmZlcnMiLCAmbnVtSW5wdXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG51bUlucHV0ID0gSU5UMzJfTUFYOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIGtXaGF0Q29kZWNOb3RpZnk6IGNiSUQgPSAlZCwgcGF1c2VkID0gJWQiLAorICAgICAgICAgICAgICAgICAgICBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLCBjYklELCBtUGF1c2VkKTsKIAotICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoIm91dHB1dC1idWZmZXJzIiwgJm51bU91dHB1dCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbnVtT3V0cHV0ID0gSU5UMzJfTUFYOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghbVBhdXNlZCkgewotICAgICAgICAgICAgICAgICAgICB3aGlsZSAobnVtSW5wdXQtLSA+IDAgJiYgaGFuZGxlQW5JbnB1dEJ1ZmZlcigpKSB7fQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHdoaWxlIChudW1PdXRwdXQtLSA+IDAgJiYgaGFuZGxlQW5PdXRwdXRCdWZmZXIoKSkge30KKyAgICAgICAgICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHJlcXVlc3RDb2RlY05vdGlmaWNhdGlvbigpOworICAgICAgICAgICAgc3dpdGNoIChjYklEKSB7CisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpDQl9JTlBVVF9BVkFJTEFCTEU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4OworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiaW5kZXgiLCAmaW5kZXgpKTsKKworICAgICAgICAgICAgICAgICAgICBoYW5kbGVBbklucHV0QnVmZmVyKGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpDQl9PVVRQVVRfQVZBSUxBQkxFOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZsYWdzOworCisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJpbmRleCIsICZpbmRleCkpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJvZmZzZXQiLCAmb2Zmc2V0KSk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoInNpemUiLCAmc2l6ZSkpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZmxhZ3MiLCAmZmxhZ3MpKTsKKworICAgICAgICAgICAgICAgICAgICBoYW5kbGVBbk91dHB1dEJ1ZmZlcihpbmRleCwgb2Zmc2V0LCBzaXplLCB0aW1lVXMsIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpDQl9PVVRQVVRfRk9STUFUX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CisKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlT3V0cHV0Rm9ybWF0Q2hhbmdlKGZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb2RlYzo6Q0JfRVJST1I6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJEZWNvZGVyICglcykgcmVwb3J0ZWQgZXJyb3IgOiAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLCBlcnIpOworCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKGVycik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTExMSw2ICsxODcsNDYgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdFNldFZpZGVvU3VyZmFjZToKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic3VyZmFjZSIsICZvYmopKTsKKyAgICAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UgPSBzdGF0aWNfY2FzdDxTdXJmYWNlICo+KG9iai5nZXQoKSk7IC8vIG5vbi1udWxsCisgICAgICAgICAgICBpbnQzMl90IGVyciA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgLy8gTk9URTogaW4gcHJhY3RpY2UgbVN1cmZhY2UgaXMgYWx3YXlzIG5vbi1udWxsLCBidXQgY2hlY2tpbmcgaGVyZSBmb3IgY29tcGxldGVuZXNzCisgICAgICAgICAgICBpZiAobUNvZGVjICE9IE5VTEwgJiYgbVN1cmZhY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IG9uY2UgQXdlc29tZVBsYXllciBpcyByZW1vdmVkLCByZW1vdmUgdGhpcyBhdXRvbWF0aWMgY29ubmVjdGluZworICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBzdXJmYWNlIGJ5IE1lZGlhUGxheWVyU2VydmljZS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIGF0IHRoaXMgcG9pbnQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpjbGllbnQgaGFzIGFscmVhZHkgY29ubmVjdGVkIHRvIHRoZQorICAgICAgICAgICAgICAgIC8vIHN1cmZhY2UsIHdoaWNoIE1lZGlhQ29kZWMgZG9lcyBub3QgZXhwZWN0CisgICAgICAgICAgICAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdChzdXJmYWNlLmdldCgpLCBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtQ29kZWMtPnNldFN1cmZhY2Uoc3VyZmFjZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJX0lGKGVyciwgImNvZGVjIHNldFN1cmZhY2UgcmV0dXJuZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb25uZWN0IHRvIHRoZSBvbGQgc3VyZmFjZSBhcyBNUFM6OkNsaWVudCB3aWxsIGV4cGVjdCB0bworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmUgYWJsZSB0byBkaXNjb25uZWN0IGZyb20gaXQuCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCluYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KG1TdXJmYWNlLmdldCgpLCBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZSA9IHN1cmZhY2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAvLyByZWNvbm5lY3QgdG8gdGhlIG5ldyBzdXJmYWNlIG9uIGVycm9yIGFzIE1QUzo6Q2xpZW50IHdpbGwgZXhwZWN0IHRvCisgICAgICAgICAgICAgICAgICAgIC8vIGJlIGFibGUgdG8gZGlzY29ubmVjdCBmcm9tIGl0LgorICAgICAgICAgICAgICAgICAgICAodm9pZCluYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KHN1cmZhY2UuZ2V0KCksIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBEZWNvZGVyQmFzZTo6b25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTIxLDYgKzIzNyw3IEBACiAgICAgQ0hFQ0sobUNvZGVjID09IE5VTEwpOwogCiAgICAgbUZvcm1hdENoYW5nZVBlbmRpbmcgPSBmYWxzZTsKKyAgICBtVGltZUNoYW5nZVBlbmRpbmcgPSBmYWxzZTsKIAogICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CiAKQEAgLTEzMCwxNiArMjQ3LDEyIEBACiAgICAgbUlzQXVkaW8gPSAhc3RybmNhc2VjbXAoImF1ZGlvLyIsIG1pbWUuY19zdHIoKSwgNik7CiAgICAgbUlzVmlkZW9BVkMgPSAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIG1pbWUuY19zdHIoKSk7CiAKLSAgICBzcDxTdXJmYWNlPiBzdXJmYWNlID0gTlVMTDsKLSAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7Ci0gICAgICAgIHN1cmZhY2UgPSBtTmF0aXZlV2luZG93LT5nZXRTdXJmYWNlVGV4dHVyZUNsaWVudCgpOwotICAgIH0KLQogICAgIG1Db21wb25lbnROYW1lID0gbWltZTsKICAgICBtQ29tcG9uZW50TmFtZS5hcHBlbmQoIiBkZWNvZGVyIik7Ci0gICAgQUxPR1YoIlslc10gb25Db25maWd1cmUgKHN1cmZhY2U9JXApIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgc3VyZmFjZS5nZXQoKSk7CisgICAgQUxPR1YoIlslc10gb25Db25maWd1cmUgKHN1cmZhY2U9JXApIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgbVN1cmZhY2UuZ2V0KCkpOwogCi0gICAgbUNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlUeXBlKG1Db2RlY0xvb3BlciwgbWltZS5jX3N0cigpLCBmYWxzZSAvKiBlbmNvZGVyICovKTsKKyAgICBtQ29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeVR5cGUoCisgICAgICAgICAgICBtQ29kZWNMb29wZXIsIG1pbWUuY19zdHIoKSwgZmFsc2UgLyogZW5jb2RlciAqLywgTlVMTCAvKiBlcnIgKi8sIG1QaWQpOwogICAgIGludDMyX3Qgc2VjdXJlID0gMDsKICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoInNlY3VyZSIsICZzZWN1cmUpICYmIHNlY3VyZSAhPSAwKSB7CiAgICAgICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgewpAQCAtMTQ4LDcgKzI2MSw3IEBACiAgICAgICAgICAgICBtQ29kZWMtPnJlbGVhc2UoKTsKICAgICAgICAgICAgIEFMT0dJKCJbJXNdIGNyZWF0aW5nIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgICAgICAgICBtQ29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUoCi0gICAgICAgICAgICAgICAgICAgIG1Db2RlY0xvb3BlciwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIG1Db2RlY0xvb3BlciwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgTlVMTCAvKiBlcnIgKi8sIG1QaWQpOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChtQ29kZWMgPT0gTlVMTCkgewpAQCAtMTYyLDE3ICsyNzUsMTcgQEAKICAgICBtQ29kZWMtPmdldE5hbWUoJm1Db21wb25lbnROYW1lKTsKIAogICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7CisgICAgaWYgKG1TdXJmYWNlICE9IE5VTEwpIHsKICAgICAgICAgLy8gZGlzY29ubmVjdCBmcm9tIHN1cmZhY2UgYXMgTWVkaWFDb2RlYyB3aWxsIHJlY29ubmVjdAogICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KAotICAgICAgICAgICAgICAgIHN1cmZhY2UuZ2V0KCksIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKKyAgICAgICAgICAgICAgICBtU3VyZmFjZS5nZXQoKSwgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOwogICAgICAgICAvLyBXZSB0cmVhdCB0aGlzIGFzIGEgd2FybmluZywgYXMgdGhpcyBpcyBhIHByZXBhcmF0b3J5IHN0ZXAuCiAgICAgICAgIC8vIENvZGVjIHdpbGwgdHJ5IHRvIGNvbm5lY3QgdG8gdGhlIHN1cmZhY2UsIHdoaWNoIGlzIHdoZXJlCiAgICAgICAgIC8vIGFueSBlcnJvciBzaWduYWxpbmcgd2lsbCBvY2N1ci4KICAgICAgICAgQUxPR1dfSUYoZXJyICE9IE9LLCAiZmFpbGVkIHRvIGRpc2Nvbm5lY3QgZnJvbSBzdXJmYWNlOiAlZCIsIGVycik7CiAgICAgfQogICAgIGVyciA9IG1Db2RlYy0+Y29uZmlndXJlKAotICAgICAgICAgICAgZm9ybWF0LCBzdXJmYWNlLCBOVUxMIC8qIGNyeXB0byAqLywgMCAvKiBmbGFncyAqLyk7CisgICAgICAgICAgICBmb3JtYXQsIG1TdXJmYWNlLCBOVUxMIC8qIGNyeXB0byAqLywgMCAvKiBmbGFncyAqLyk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbmZpZ3VyZSAlcyBkZWNvZGVyIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKICAgICAgICAgbUNvZGVjLT5yZWxlYXNlKCk7CkBAIC0xODYsNiArMjk5LDIxIEBACiAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtQ29kZWMtPmdldE91dHB1dEZvcm1hdCgmbU91dHB1dEZvcm1hdCkpOwogICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbUNvZGVjLT5nZXRJbnB1dEZvcm1hdCgmbUlucHV0Rm9ybWF0KSk7CiAKKyAgICBtU3RhdHMtPnNldFN0cmluZygibWltZSIsIG1pbWUuY19zdHIoKSk7CisgICAgbVN0YXRzLT5zZXRTdHJpbmcoImNvbXBvbmVudC1uYW1lIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisKKyAgICBpZiAoIW1Jc0F1ZGlvKSB7CisgICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgaWYgKG1PdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpCisgICAgICAgICAgICAgICAgJiYgbU91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgbVN0YXRzLT5zZXRJbnQzMigid2lkdGgiLCB3aWR0aCk7CisgICAgICAgICAgICBtU3RhdHMtPnNldEludDMyKCJoZWlnaHQiLCBoZWlnaHQpOworICAgICAgICB9CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29kZWNOb3RpZnksIHRoaXMpOworICAgIG1Db2RlYy0+c2V0Q2FsbGJhY2socmVwbHkpOworCiAgICAgZXJyID0gbUNvZGVjLT5zdGFydCgpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdGFydCAlcyBkZWNvZGVyIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKQEAgLTE5NSwzNiArMzIzLDMyIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICAvLyB0aGUgZm9sbG93aW5nIHNob3VsZCB3b3JrIGFmdGVyIHN0YXJ0Ci0gICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtQ29kZWMtPmdldElucHV0QnVmZmVycygmbUlucHV0QnVmZmVycykpOwogICAgIHJlbGVhc2VBbmRSZXNldE1lZGlhQnVmZmVycygpOwotICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbUNvZGVjLT5nZXRPdXRwdXRCdWZmZXJzKCZtT3V0cHV0QnVmZmVycykpOwotICAgIEFMT0dWKCJbJXNdIGdvdCAlenUgaW5wdXQgYW5kICV6dSBvdXRwdXQgYnVmZmVycyIsCi0gICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLAotICAgICAgICAgICAgbUlucHV0QnVmZmVycy5zaXplKCksCi0gICAgICAgICAgICBtT3V0cHV0QnVmZmVycy5zaXplKCkpOwogCi0gICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7Ci0gICAgICAgIHJlcXVlc3RDb2RlY05vdGlmaWNhdGlvbigpOwotICAgIH0KICAgICBtUGF1c2VkID0gZmFsc2U7CiAgICAgbVJlc3VtZVBlbmRpbmcgPSBmYWxzZTsKIH0KIAordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6b25TZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKSB7CisgICAgaWYgKG1Db2RlYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJvblNldFBhcmFtZXRlcnMgY2FsbGVkIGJlZm9yZSBjb2RlYyBpcyBjcmVhdGVkLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1Db2RlYy0+c2V0UGFyYW1ldGVycyhwYXJhbXMpOworfQorCiB2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpvblNldFJlbmRlcmVyKGNvbnN0IHNwPFJlbmRlcmVyPiAmcmVuZGVyZXIpIHsKICAgICBib29sIGhhZE5vUmVuZGVyZXIgPSAobVJlbmRlcmVyID09IE5VTEwpOwogICAgIG1SZW5kZXJlciA9IHJlbmRlcmVyOwogICAgIGlmIChoYWROb1JlbmRlcmVyICYmIG1SZW5kZXJlciAhPSBOVUxMKSB7Ci0gICAgICAgIHJlcXVlc3RDb2RlY05vdGlmaWNhdGlvbigpOworICAgICAgICAvLyB0aGlzIG1lYW5zIHRoYXQgdGhlIHdpZGV2aW5lIGxlZ2FjeSBzb3VyY2UgaXMgcmVhZHkKKyAgICAgICAgb25SZXF1ZXN0SW5wdXRCdWZmZXJzKCk7CiAgICAgfQogfQogCiB2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpvbkdldElucHV0QnVmZmVycygKICAgICAgICAgVmVjdG9yPHNwPEFCdWZmZXI+ID4gKmRzdEJ1ZmZlcnMpIHsKLSAgICBkc3RCdWZmZXJzLT5jbGVhcigpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0QnVmZmVycy5zaXplKCk7IGkrKykgewotICAgICAgICBkc3RCdWZmZXJzLT5wdXNoKG1JbnB1dEJ1ZmZlcnNbaV0pOwotICAgIH0KKyAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1Db2RlYy0+Z2V0V2lkZXZpbmVMZWdhY3lCdWZmZXJzKGRzdEJ1ZmZlcnMpKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6b25SZXN1bWUoYm9vbCBub3RpZnlDb21wbGV0ZSkgewpAQCAtMjMzLDkgKzM1NywxMCBAQAogICAgIGlmIChub3RpZnlDb21wbGV0ZSkgewogICAgICAgICBtUmVzdW1lUGVuZGluZyA9IHRydWU7CiAgICAgfQorICAgIG1Db2RlYy0+c3RhcnQoKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6b25GbHVzaChib29sIG5vdGlmeUNvbXBsZXRlKSB7Cit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpkb0ZsdXNoKGJvb2wgbm90aWZ5Q29tcGxldGUpIHsKICAgICBpZiAobUNDRGVjb2RlciAhPSBOVUxMKSB7CiAgICAgICAgIG1DQ0RlY29kZXItPmZsdXNoKCk7CiAgICAgfQpAQCAtMjU5LDEzICszODQsMjMgQEAKICAgICAgICAgLy8gd2UgYXR0ZW1wdCB0byByZWxlYXNlIHRoZSBidWZmZXJzIGV2ZW4gaWYgZmx1c2ggZmFpbHMuCiAgICAgfQogICAgIHJlbGVhc2VBbmRSZXNldE1lZGlhQnVmZmVycygpOworICAgIG1QYXVzZWQgPSB0cnVlOworfQogCi0gICAgaWYgKG5vdGlmeUNvbXBsZXRlKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0Rmx1c2hDb21wbGV0ZWQpOwotICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICAgICAgbVBhdXNlZCA9IHRydWU7CisKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6Om9uRmx1c2goKSB7CisgICAgZG9GbHVzaCh0cnVlKTsKKworICAgIGlmIChpc0Rpc2NvbnRpbnVpdHlQZW5kaW5nKCkpIHsKKyAgICAgICAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gaWYgdGhlIGNsaWVudCBzdGFydHMgc2Vla2luZy9zaHV0ZG93bgorICAgICAgICAvLyBhZnRlciB3ZSBxdWV1ZWQgYW4gRU9TIGZvciBkaXNjb250aW51aXRpZXMuCisgICAgICAgIC8vIFdlIGNhbiBjb25zaWRlciBkaXNjb250aW51aXR5IGhhbmRsZWQuCisgICAgICAgIGZpbmlzaEhhbmRsZURpc2NvbnRpbnVpdHkoZmFsc2UgLyogZmx1c2hPblRpbWVDaGFuZ2UgKi8pOwogICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRGbHVzaENvbXBsZXRlZCk7CisgICAgbm90aWZ5LT5wb3N0KCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6Om9uU2h1dGRvd24oYm9vbCBub3RpZnlDb21wbGV0ZSkgewpAQCAtMjc5LDEyICs0MTQsMTAgQEAKICAgICAgICAgbUNvZGVjID0gTlVMTDsKICAgICAgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKIAotICAgICAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7CisgICAgICAgIGlmIChtU3VyZmFjZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAvLyByZWNvbm5lY3QgdG8gc3VyZmFjZSBhcyBNZWRpYUNvZGVjIGRpc2Nvbm5lY3RlZCBmcm9tIGl0CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnJvciA9Ci0gICAgICAgICAgICAgICAgICAgIG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy0+Z2V0TmF0aXZlV2luZG93KCkuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOworICAgICAgICAgICAgICAgICAgICBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KG1TdXJmYWNlLmdldCgpLCBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CiAgICAgICAgICAgICBBTE9HV19JRihlcnJvciAhPSBOT19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgIlslc10gZmFpbGVkIHRvIGNvbm5lY3QgdG8gbmF0aXZlIHdpbmRvdywgZXJyb3I9JWQiLAogICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnJvcik7CkBAIC0zMDgsMTcgKzQ0MSwyMyBAQAogICAgIH0KIH0KIAotdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6ZG9SZXF1ZXN0QnVmZmVycygpIHsKLSAgICBpZiAobUZvcm1hdENoYW5nZVBlbmRpbmcpIHsKLSAgICAgICAgcmV0dXJuOworLyoKKyAqIHJldHVybnMgdHJ1ZSBpZiB3ZSBzaG91bGQgcmVxdWVzdCBtb3JlIGRhdGEKKyAqLworYm9vbCBOdVBsYXllcjo6RGVjb2Rlcjo6ZG9SZXF1ZXN0QnVmZmVycygpIHsKKyAgICAvLyBtUmVuZGVyZXIgaXMgb25seSBOVUxMIGlmIHdlIGhhdmUgYSBsZWdhY3kgd2lkZXZpbmUgc291cmNlIHRoYXQKKyAgICAvLyBpcyBub3QgeWV0IHJlYWR5LiBJbiB0aGlzIGNhc2Ugd2UgbXVzdCBub3QgZmV0Y2ggaW5wdXQuCisgICAgaWYgKGlzRGlzY29udGludWl0eVBlbmRpbmcoKSB8fCBtUmVuZGVyZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIHdoaWxlICghbURlcXVldWVkSW5wdXRCdWZmZXJzLmVtcHR5KCkpIHsKKyAgICB3aGlsZSAoZXJyID09IE9LICYmICFtRGVxdWV1ZWRJbnB1dEJ1ZmZlcnMuZW1wdHkoKSkgewogICAgICAgICBzaXplX3QgYnVmZmVySXggPSAqbURlcXVldWVkSW5wdXRCdWZmZXJzLmJlZ2luKCk7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKICAgICAgICAgbXNnLT5zZXRTaXplKCJidWZmZXItaXgiLCBidWZmZXJJeCk7CiAgICAgICAgIGVyciA9IGZldGNoSW5wdXREYXRhKG1zZyk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgLy8gaWYgRU9TLCBuZWVkIHRvIHF1ZXVlIEVPUyBidWZmZXIKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIG1EZXF1ZXVlZElucHV0QnVmZmVycy5lcmFzZShtRGVxdWV1ZWRJbnB1dEJ1ZmZlcnMuYmVnaW4oKSk7CkBAIC0zMjksNDAgKzQ2OCw1OSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGVyciA9PSAtRVdPVUxEQkxPQ0sKLSAgICAgICAgICAgICYmIG1Tb3VyY2UtPmZlZWRNb3JlVFNEYXRhKCkgPT0gT0spIHsKLSAgICAgICAgc2NoZWR1bGVSZXF1ZXN0QnVmZmVycygpOwotICAgIH0KKyAgICByZXR1cm4gZXJyID09IC1FV09VTERCTE9DSworICAgICAgICAgICAgJiYgbVNvdXJjZS0+ZmVlZE1vcmVUU0RhdGEoKSA9PSBPSzsKIH0KIAotYm9vbCBOdVBsYXllcjo6RGVjb2Rlcjo6aGFuZGxlQW5JbnB1dEJ1ZmZlcigpIHsKLSAgICBpZiAobUZvcm1hdENoYW5nZVBlbmRpbmcpIHsKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXI6OmhhbmRsZUVycm9yKGludDMyX3QgZXJyKQoreworICAgIC8vIFdlIGNhbm5vdCBpbW1lZGlhdGVseSByZWxlYXNlIHRoZSBjb2RlYyBkdWUgdG8gYnVmZmVycyBzdGlsbCBvdXRzdGFuZGluZworICAgIC8vIGluIHRoZSByZW5kZXJlci4gIFdlIHNpZ25hbCB0byB0aGUgcGxheWVyIHRoZSBlcnJvciBzbyBpdCBjYW4gc2h1dGRvd24vcmVsZWFzZSB0aGUKKyAgICAvLyBkZWNvZGVyIGFmdGVyIGZsdXNoaW5nIGFuZCBpbmNyZW1lbnQgdGhlIGdlbmVyYXRpb24gdG8gZGlzY2FyZCB1bm5lY2Vzc2FyeSBtZXNzYWdlcy4KKworICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RXJyb3IpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKK2Jvb2wgTnVQbGF5ZXI6OkRlY29kZXI6OmhhbmRsZUFuSW5wdXRCdWZmZXIoc2l6ZV90IGluZGV4KSB7CisgICAgaWYgKGlzRGlzY29udGludWl0eVBlbmRpbmcoKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHNpemVfdCBidWZmZXJJeCA9IC0xOwotICAgIHN0YXR1c190IHJlcyA9IG1Db2RlYy0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZidWZmZXJJeCk7Ci0gICAgQUxPR1YoIlslc10gZGVxdWV1ZWQgaW5wdXQ6ICVkIiwKLSAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHJlcyA9PSBPSyA/IChpbnQpYnVmZmVySXggOiByZXMpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgaWYgKHJlcyAhPSAtRUFHQUlOKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRlcXVldWUgaW5wdXQgYnVmZmVyIGZvciAlcyAoZXJyPSVkKSIsCi0gICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHJlcyk7Ci0gICAgICAgICAgICBoYW5kbGVFcnJvcihyZXMpOworCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgIG1Db2RlYy0+Z2V0SW5wdXRCdWZmZXIoaW5kZXgsICZidWZmZXIpOworCisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIGhhbmRsZUVycm9yKFVOS05PV05fRVJST1IpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGluZGV4ID49IG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBtSW5wdXRCdWZmZXJzLnNpemUoKTsgaSA8PSBpbmRleDsgKytpKSB7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXJzLmFkZCgpOworICAgICAgICAgICAgbU1lZGlhQnVmZmVycy5hZGQoKTsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuYWRkKCk7CisgICAgICAgICAgICBtTWVkaWFCdWZmZXJzLmVkaXRJdGVtQXQoaSkgPSBOVUxMOworICAgICAgICAgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5lZGl0SXRlbUF0KGkpID0gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKyAgICBtSW5wdXRCdWZmZXJzLmVkaXRJdGVtQXQoaW5kZXgpID0gYnVmZmVyOwogCi0gICAgQ0hFQ0tfTFQoYnVmZmVySXgsIG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICAvL0NIRUNLX0xUKGJ1ZmZlckl4LCBtSW5wdXRCdWZmZXJzLnNpemUoKSk7CiAKLSAgICBpZiAobU1lZGlhQnVmZmVyc1tidWZmZXJJeF0gIT0gTlVMTCkgewotICAgICAgICBtTWVkaWFCdWZmZXJzW2J1ZmZlckl4XS0+cmVsZWFzZSgpOwotICAgICAgICBtTWVkaWFCdWZmZXJzLmVkaXRJdGVtQXQoYnVmZmVySXgpID0gTlVMTDsKKyAgICBpZiAobU1lZGlhQnVmZmVyc1tpbmRleF0gIT0gTlVMTCkgeworICAgICAgICBtTWVkaWFCdWZmZXJzW2luZGV4XS0+cmVsZWFzZSgpOworICAgICAgICBtTWVkaWFCdWZmZXJzLmVkaXRJdGVtQXQoaW5kZXgpID0gTlVMTDsKICAgICB9Ci0gICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5lZGl0SXRlbUF0KGJ1ZmZlckl4KSA9IHRydWU7CisgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5lZGl0SXRlbUF0KGluZGV4KSA9IHRydWU7CiAKICAgICBpZiAoIW1DU0RzVG9TdWJtaXQuaXNFbXB0eSgpKSB7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKLSAgICAgICAgbXNnLT5zZXRTaXplKCJidWZmZXItaXgiLCBidWZmZXJJeCk7CisgICAgICAgIG1zZy0+c2V0U2l6ZSgiYnVmZmVyLWl4IiwgaW5kZXgpOwogCiAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG1DU0RzVG9TdWJtaXQuaXRlbUF0KDApOwogICAgICAgICBBTE9HSSgiWyVzXSByZXN1Ym1pdHRpbmcgQ1NEIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CkBAIC0zODAsMTExICs1MzgsNTEgQEAKICAgICAgICAgbVBlbmRpbmdJbnB1dE1lc3NhZ2VzLmVyYXNlKG1QZW5kaW5nSW5wdXRNZXNzYWdlcy5iZWdpbigpKTsKICAgICB9CiAKLSAgICBpZiAoIW1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuZWRpdEl0ZW1BdChidWZmZXJJeCkpIHsKKyAgICBpZiAoIW1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuZWRpdEl0ZW1BdChpbmRleCkpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgbURlcXVldWVkSW5wdXRCdWZmZXJzLnB1c2hfYmFjayhidWZmZXJJeCk7CisgICAgbURlcXVldWVkSW5wdXRCdWZmZXJzLnB1c2hfYmFjayhpbmRleCk7CiAKICAgICBvblJlcXVlc3RJbnB1dEJ1ZmZlcnMoKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBOdVBsYXllcjo6RGVjb2Rlcjo6aGFuZGxlQW5PdXRwdXRCdWZmZXIoKSB7Ci0gICAgaWYgKG1Gb3JtYXRDaGFuZ2VQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgc2l6ZV90IGJ1ZmZlckl4ID0gLTE7Ci0gICAgc2l6ZV90IG9mZnNldDsKLSAgICBzaXplX3Qgc2l6ZTsKLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICB1aW50MzJfdCBmbGFnczsKLSAgICBzdGF0dXNfdCByZXMgPSBtQ29kZWMtPmRlcXVldWVPdXRwdXRCdWZmZXIoCi0gICAgICAgICAgICAmYnVmZmVySXgsICZvZmZzZXQsICZzaXplLCAmdGltZVVzLCAmZmxhZ3MpOworYm9vbCBOdVBsYXllcjo6RGVjb2Rlcjo6aGFuZGxlQW5PdXRwdXRCdWZmZXIoCisgICAgICAgIHNpemVfdCBpbmRleCwKKyAgICAgICAgc2l6ZV90IG9mZnNldCwKKyAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgIGludDY0X3QgdGltZVVzLAorICAgICAgICBpbnQzMl90IGZsYWdzKSB7CisvLyAgICBDSEVDS19MVChidWZmZXJJeCwgbU91dHB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgbUNvZGVjLT5nZXRPdXRwdXRCdWZmZXIoaW5kZXgsICZidWZmZXIpOwogCi0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HVigiWyVzXSBkZXF1ZXVlZCBvdXRwdXQ6ICVkIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgcmVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiWyVzXSBkZXF1ZXVlZCBvdXRwdXQ6ICVkICh0aW1lPSVsbGQgZmxhZ3M9JSIgUFJJdTMyICIpIiwKLSAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAoaW50KWJ1ZmZlckl4LCB0aW1lVXMsIGZsYWdzKTsKKyAgICBpZiAoaW5kZXggPj0gbU91dHB1dEJ1ZmZlcnMuc2l6ZSgpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBtT3V0cHV0QnVmZmVycy5zaXplKCk7IGkgPD0gaW5kZXg7ICsraSkgeworICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcnMuYWRkKCk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAocmVzID09IElORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRCkgewotICAgICAgICByZXMgPSBtQ29kZWMtPmdldE91dHB1dEJ1ZmZlcnMoJm1PdXRwdXRCdWZmZXJzKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgb3V0cHV0IGJ1ZmZlcnMgZm9yICVzIGFmdGVyIElORk8gZXZlbnQgKGVycj0lZCkiLAotICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCByZXMpOwotICAgICAgICAgICAgaGFuZGxlRXJyb3IocmVzKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAvLyBOdVBsYXllciBpZ25vcmVzIHRoaXMKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIGlmIChyZXMgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCkgewotICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7Ci0gICAgICAgIHJlcyA9IG1Db2RlYy0+Z2V0T3V0cHV0Rm9ybWF0KCZmb3JtYXQpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBvdXRwdXQgZm9ybWF0IGZvciAlcyBhZnRlciBJTkZPIGV2ZW50IChlcnI9JWQpIiwKLSAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgcmVzKTsKLSAgICAgICAgICAgIGhhbmRsZUVycm9yKHJlcyk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAgICBtT3V0cHV0QnVmZmVycy5lZGl0SXRlbUF0KGluZGV4KSA9IGJ1ZmZlcjsKIAotICAgICAgICBpZiAoIW1Jc0F1ZGlvKSB7Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRWaWRlb1NpemVDaGFuZ2VkKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKLSAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotICAgICAgICB9IGVsc2UgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBmbGFnczsKLSAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgICAgIGJvb2wgaGFzVmlkZW8gPSAobVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSAhPSBOVUxMKTsKLSAgICAgICAgICAgIGlmICghaGFzVmlkZW8gJiYKLSAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LICYmCi0gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMKLSAgICAgICAgICAgICAgICAgICAgICAgID4gQVVESU9fU0lOS19NSU5fREVFUF9CVUZGRVJfRFVSQVRJT05fVVMpIHsKLSAgICAgICAgICAgICAgICBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlcyA9IG1SZW5kZXJlci0+b3BlbkF1ZGlvU2luaygKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBmYWxzZSAvKiBvZmZsb2FkT25seSAqLywgaGFzVmlkZW8sIGZsYWdzLCBOVUxMIC8qIGlzT2ZmbG9hZGVkICovKTsKLSAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gQXVkaW9TaW5rIG9uIGZvcm1hdCBjaGFuZ2UgZm9yICVzIChlcnI9JWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHJlcyk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IocmVzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIGlmIChyZXMgPT0gSU5GT19ESVNDT05USU5VSVRZKSB7Ci0gICAgICAgIC8vIG5vdGhpbmcgdG8gZG8KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgaWYgKHJlcyAhPSAtRUFHQUlOKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRlcXVldWUgb3V0cHV0IGJ1ZmZlciBmb3IgJXMgKGVycj0lZCkiLAotICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCByZXMpOwotICAgICAgICAgICAgaGFuZGxlRXJyb3IocmVzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQ0hFQ0tfTFQoYnVmZmVySXgsIG1PdXRwdXRCdWZmZXJzLnNpemUoKSk7Ci0gICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbU91dHB1dEJ1ZmZlcnNbYnVmZmVySXhdOwogICAgIGJ1ZmZlci0+c2V0UmFuZ2Uob2Zmc2V0LCBzaXplKTsKICAgICBidWZmZXItPm1ldGEoKS0+Y2xlYXIoKTsKICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7Ci0gICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TKSB7Ci0gICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZW9zIiwgdHJ1ZSk7Ci0gICAgICAgIG5vdGlmeVJlc3VtZUNvbXBsZXRlSWZOZWNlc3NhcnkoKTsKLSAgICB9CisKKyAgICBib29sIGVvcyA9IGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TOwogICAgIC8vIHdlIGRvIG5vdCBleHBlY3QgQ09ERUNDT05GSUcgb3IgU1lOQ0ZSQU1FIGZvciBkZWNvZGVyCiAKLSAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZW5kZXJCdWZmZXIsIGlkKCkpOwotICAgIHJlcGx5LT5zZXRTaXplKCJidWZmZXItaXgiLCBidWZmZXJJeCk7CisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVuZGVyQnVmZmVyLCB0aGlzKTsKKyAgICByZXBseS0+c2V0U2l6ZSgiYnVmZmVyLWl4IiwgaW5kZXgpOwogICAgIHJlcGx5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1CdWZmZXJHZW5lcmF0aW9uKTsKIAotICAgIGlmIChtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMgPj0gMCkgeworICAgIGlmIChlb3MpIHsKKyAgICAgICAgQUxPR0koIlslc10gc2F3IG91dHB1dCBFT1MiLCBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKKworICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImVvcyIsIHRydWUpOworICAgICAgICByZXBseS0+c2V0SW50MzIoImVvcyIsIHRydWUpOworICAgIH0gZWxzZSBpZiAobVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID49IDApIHsKICAgICAgICAgaWYgKHRpbWVVcyA8IG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcykgewogICAgICAgICAgICAgQUxPR1YoIlslc10gZHJvcHBpbmcgYnVmZmVyIGF0IHRpbWUgJWxsZCBhcyByZXF1ZXN0ZWQuIiwKICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIChsb25nIGxvbmcpdGltZVVzKTsKQEAgLTQ5NiwxMyArNTk0LDE1IEBACiAgICAgICAgIG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcyA9IC0xOwogICAgIH0KIAorICAgIG1OdW1GcmFtZXNUb3RhbCArPSAhbUlzQXVkaW87CisKICAgICAvLyB3YWl0IHVudGlsIDFzdCBmcmFtZSBjb21lcyBvdXQgdG8gc2lnbmFsIHJlc3VtZSBjb21wbGV0ZQogICAgIG5vdGlmeVJlc3VtZUNvbXBsZXRlSWZOZWNlc3NhcnkoKTsKIAogICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgewogICAgICAgICAvLyBzZW5kIHRoZSBidWZmZXIgdG8gcmVuZGVyZXIuCiAgICAgICAgIG1SZW5kZXJlci0+cXVldWVCdWZmZXIobUlzQXVkaW8sIGJ1ZmZlciwgcmVwbHkpOwotICAgICAgICBpZiAoZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1MpIHsKKyAgICAgICAgaWYgKGVvcyAmJiAhaXNEaXNjb250aW51aXR5UGVuZGluZygpKSB7CiAgICAgICAgICAgICBtUmVuZGVyZXItPnF1ZXVlRU9TKG1Jc0F1ZGlvLCBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKICAgICAgICAgfQogICAgIH0KQEAgLTUxMCw2ICs2MTAsMzYgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAordm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6aGFuZGxlT3V0cHV0Rm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgaWYgKCFtSXNBdWRpbykgeworICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpCisgICAgICAgICAgICAgICAgJiYgZm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7CisgICAgICAgICAgICBtU3RhdHMtPnNldEludDMyKCJ3aWR0aCIsIHdpZHRoKTsKKyAgICAgICAgICAgIG1TdGF0cy0+c2V0SW50MzIoImhlaWdodCIsIGhlaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRWaWRlb1NpemVDaGFuZ2VkKTsKKyAgICAgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICB9IGVsc2UgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CisgICAgICAgIHVpbnQzMl90IGZsYWdzOworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgICAgIGJvb2wgaGFzVmlkZW8gPSAobVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSAhPSBOVUxMKTsKKyAgICAgICAgaWYgKGdldEF1ZGlvRGVlcEJ1ZmZlclNldHRpbmcoKSAvLyBvdmVycmlkZSByZWdhcmRsZXNzIG9mIHNvdXJjZSBkdXJhdGlvbgorICAgICAgICAgICAgICAgIHx8ICghaGFzVmlkZW8KKyAgICAgICAgICAgICAgICAgICAgICAgICYmIG1Tb3VyY2UtPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKSA9PSBPSworICAgICAgICAgICAgICAgICAgICAgICAgJiYgZHVyYXRpb25VcyA+IEFVRElPX1NJTktfTUlOX0RFRVBfQlVGRkVSX0RVUkFUSU9OX1VTKSkgeworICAgICAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKKyAgICAgICAgfQorCisgICAgICAgIG1SZW5kZXJlci0+b3BlbkF1ZGlvU2luaygKKyAgICAgICAgICAgICAgICBmb3JtYXQsIGZhbHNlIC8qIG9mZmxvYWRPbmx5ICovLCBoYXNWaWRlbywgZmxhZ3MsIE5VTEwgLyogaXNPZmZsb2FlZCAqLyk7CisgICAgfQorfQorCiB2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpyZWxlYXNlQW5kUmVzZXRNZWRpYUJ1ZmZlcnMoKSB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTWVkaWFCdWZmZXJzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGlmIChtTWVkaWFCdWZmZXJzW2ldICE9IE5VTEwpIHsKQEAgLTUzMywxMSArNjYzLDggQEAKIH0KIAogdm9pZCBOdVBsYXllcjo6RGVjb2Rlcjo6cmVxdWVzdENvZGVjTm90aWZpY2F0aW9uKCkgewotICAgIGlmIChtRm9ybWF0Q2hhbmdlUGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQogICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgewotICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb2RlY05vdGlmeSwgaWQoKSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdENvZGVjTm90aWZ5LCB0aGlzKTsKICAgICAgICAgcmVwbHktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUJ1ZmZlckdlbmVyYXRpb24pOwogICAgICAgICBtQ29kZWMtPnJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbihyZXBseSk7CiAgICAgfQpAQCAtNTgyLDQzICs3MDksMzEgQEAKICAgICAgICAgICAgICAgICAgICAgZm9ybWF0Q2hhbmdlID0gIXNlYW1sZXNzRm9ybWF0Q2hhbmdlOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChmb3JtYXRDaGFuZ2UgfHwgdGltZUNoYW5nZSkgewotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoIndoYXQiLCBrV2hhdElucHV0RGlzY29udGludWl0eSk7Ci0gICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImZvcm1hdENoYW5nZSIsIGZvcm1hdENoYW5nZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgpOwotICAgICAgICAgICAgICAgIH0KLQorICAgICAgICAgICAgICAgIC8vIEZvciBmb3JtYXQgb3IgdGltZSBjaGFuZ2UsIHJldHVybiBFT1MgdG8gcXVldWUgRU9TIGlucHV0LAorICAgICAgICAgICAgICAgIC8vIHRoZW4gd2FpdCBmb3IgRU9TIG9uIG91dHB1dC4KICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0Q2hhbmdlIC8qIG5vdCBzZWFtbGVzcyAqLykgewotICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGNoYW5nZSBkZWNvZGVyCi0gICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBFT1MgYW5kIHdhaXQgdG8gYmUga2lsbGVkCiAgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXRDaGFuZ2VQZW5kaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgICAgIGVyciA9IEVSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aW1lQ2hhbmdlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gZmx1c2gKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogSWRlYWxseSB3ZSBzaG91bGRuJ3QgbmVlZCBhIGZsdXNoIHVwb24gdGltZQotICAgICAgICAgICAgICAgICAgICAvLyBkaXNjb250aW51aXR5LCBmbHVzaGluZyB3aWxsIGNhdXNlIGxvc3Mgb2YgZnJhbWVzLgotICAgICAgICAgICAgICAgICAgICAvLyBXZSBwcm9iYWJseSBzaG91bGQgcXVldWUgYSB0aW1lIGNoYW5nZSBtYXJrZXIgdG8gdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIG91dHB1dCBxdWV1ZSwgYW5kIGhhbmRsZXMgaXQgaW4gcmVuZGVyZXIgaW5zdGVhZC4KICAgICAgICAgICAgICAgICAgICAgcmVtZW1iZXJDb2RlY1NwZWNpZmljRGF0YShuZXdGb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICBvbkZsdXNoKGZhbHNlIC8qIG5vdGlmeUNvbXBsZXRlICovKTsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lQ2hhbmdlUGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IEVSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWFtbGVzc0Zvcm1hdENoYW5nZSkgewogICAgICAgICAgICAgICAgICAgICAvLyByZXVzZSBleGlzdGluZyBkZWNvZGVyIGFuZCBkb24ndCBmbHVzaAogICAgICAgICAgICAgICAgICAgICByZW1lbWJlckNvZGVjU3BlY2lmaWNEYXRhKG5ld0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHN0cmVhbSBpcyB1bmFmZmVjdGVkIGJ5IHRoZSBkaXNjb250aW51aXR5CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRVdPVUxEQkxPQ0s7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICByZXBseS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIC8vIHJlcGx5IHNob3VsZCBvbmx5IGJlIHJldHVybmVkIHdpdGhvdXQgYSBidWZmZXIgc2V0CisgICAgICAgICAgICAvLyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIChpbmNsdWRpbmcgRU9TKQorICAgICAgICAgICAgQ0hFQ0soZXJyICE9IE9LKTsKIAotICAgICAgICBpZiAoIW1Jc0F1ZGlvKSB7Ci0gICAgICAgICAgICArK21OdW1GcmFtZXNUb3RhbDsKKyAgICAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICB9CiAKICAgICAgICAgZHJvcEFjY2Vzc1VuaXQgPSBmYWxzZTsKQEAgLTYyOCw3ICs3NDMsNyBAQAogICAgICAgICAgICAgICAgICYmIG1Jc1ZpZGVvQVZDCiAgICAgICAgICAgICAgICAgJiYgIUlzQVZDUmVmZXJlbmNlRnJhbWUoYWNjZXNzVW5pdCkpIHsKICAgICAgICAgICAgIGRyb3BBY2Nlc3NVbml0ID0gdHJ1ZTsKLSAgICAgICAgICAgICsrbU51bUZyYW1lc0Ryb3BwZWQ7CisgICAgICAgICAgICArK21OdW1JbnB1dEZyYW1lc0Ryb3BwZWQ7CiAgICAgICAgIH0KICAgICB9IHdoaWxlIChkcm9wQWNjZXNzVW5pdCk7CiAKQEAgLTYzNiw3ICs3NTEsNyBAQAogI2lmIDAKICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOwogICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKLSAgICBBTE9HVigiZmVlZGluZyAlcyBpbnB1dCBidWZmZXIgYXQgbWVkaWEgdGltZSAlLjJmIHNlY3MiLAorICAgIEFMT0dWKCJbJXNdIGZlZWRpbmcgaW5wdXQgYnVmZmVyIGF0IG1lZGlhIHRpbWUgJS4zZiIsCiAgICAgICAgICBtSXNBdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iLAogICAgICAgICAgbWVkaWFUaW1lVXMgLyAxRTYpOwogI2VuZGlmCkBAIC02OTYsMTAgKzgxMSw3IEBACiAgICAgICAgIGludDMyX3Qgc3RyZWFtRXJyID0gRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZzdHJlYW1FcnIpIHx8ICFoYXNCdWZmZXIpOwogCi0gICAgICAgIGlmIChzdHJlYW1FcnIgPT0gT0spIHsKLSAgICAgICAgICAgIC8qIGJ1ZmZlcnMgYXJlIHJldHVybmVkIHRvIGhvbGQgb24gdG8gKi8KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9CisgICAgICAgIENIRUNLKHN0cmVhbUVyciAhPSBPSyk7CiAKICAgICAgICAgLy8gYXR0ZW1wdCB0byBxdWV1ZSBFT1MKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvZGVjLT5xdWV1ZUlucHV0QnVmZmVyKApAQCAtNzgxLDYgKzg5Myw3IEBACiAgICAgc3RhdHVzX3QgZXJyOwogICAgIGludDMyX3QgcmVuZGVyOwogICAgIHNpemVfdCBidWZmZXJJeDsKKyAgICBpbnQzMl90IGVvczsKICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJidWZmZXItaXgiLCAmYnVmZmVySXgpKTsKIAogICAgIGlmICghbUlzQXVkaW8pIHsKQEAgLTc5OCw2ICs5MTEsNyBAQAogICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZXN0YW1wTnMiLCAmdGltZXN0YW1wTnMpKTsKICAgICAgICAgZXJyID0gbUNvZGVjLT5yZW5kZXJPdXRwdXRCdWZmZXJBbmRSZWxlYXNlKGJ1ZmZlckl4LCB0aW1lc3RhbXBOcyk7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgbU51bU91dHB1dEZyYW1lc0Ryb3BwZWQgKz0gIW1Jc0F1ZGlvOwogICAgICAgICBlcnIgPSBtQ29kZWMtPnJlbGVhc2VPdXRwdXRCdWZmZXIoYnVmZmVySXgpOwogICAgIH0KICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC04MDUsNiArOTE5LDQwIEBACiAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKICAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKICAgICB9CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJlb3MiLCAmZW9zKSAmJiBlb3MKKyAgICAgICAgICAgICYmIGlzRGlzY29udGludWl0eVBlbmRpbmcoKSkgeworICAgICAgICBmaW5pc2hIYW5kbGVEaXNjb250aW51aXR5KHRydWUgLyogZmx1c2hPblRpbWVDaGFuZ2UgKi8pOworICAgIH0KK30KKworYm9vbCBOdVBsYXllcjo6RGVjb2Rlcjo6aXNEaXNjb250aW51aXR5UGVuZGluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUZvcm1hdENoYW5nZVBlbmRpbmcgfHwgbVRpbWVDaGFuZ2VQZW5kaW5nOworfQorCit2b2lkIE51UGxheWVyOjpEZWNvZGVyOjpmaW5pc2hIYW5kbGVEaXNjb250aW51aXR5KGJvb2wgZmx1c2hPblRpbWVDaGFuZ2UpIHsKKyAgICBBTE9HVigiZmluaXNoSGFuZGxlRGlzY29udGludWl0eTogZm9ybWF0ICVkLCB0aW1lICVkLCBmbHVzaCAlZCIsCisgICAgICAgICAgICBtRm9ybWF0Q2hhbmdlUGVuZGluZywgbVRpbWVDaGFuZ2VQZW5kaW5nLCBmbHVzaE9uVGltZUNoYW5nZSk7CisKKyAgICAvLyBJZiB3ZSBoYXZlIGZvcm1hdCBjaGFuZ2UsIHBhdXNlIGFuZCB3YWl0IHRvIGJlIGtpbGxlZDsKKyAgICAvLyBJZiB3ZSBoYXZlIHRpbWUgY2hhbmdlIG9ubHksIGZsdXNoIGFuZCByZXN0YXJ0IGZldGNoaW5nLgorCisgICAgaWYgKG1Gb3JtYXRDaGFuZ2VQZW5kaW5nKSB7CisgICAgICAgIG1QYXVzZWQgPSB0cnVlOworICAgIH0gZWxzZSBpZiAobVRpbWVDaGFuZ2VQZW5kaW5nKSB7CisgICAgICAgIGlmIChmbHVzaE9uVGltZUNoYW5nZSkgeworICAgICAgICAgICAgZG9GbHVzaChmYWxzZSAvKiBub3RpZnlDb21wbGV0ZSAqLyk7CisgICAgICAgICAgICBzaWduYWxSZXN1bWUoZmFsc2UgLyogbm90aWZ5Q29tcGxldGUgKi8pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTm90aWZ5IE51UGxheWVyIHRvIGVpdGhlciBzaHV0ZG93biBkZWNvZGVyLCBvciByZXNjYW4gc291cmNlcworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXRJbnB1dERpc2NvbnRpbnVpdHkpOworICAgIG1zZy0+c2V0SW50MzIoImZvcm1hdENoYW5nZSIsIG1Gb3JtYXRDaGFuZ2VQZW5kaW5nKTsKKyAgICBtc2ctPnBvc3QoKTsKKworICAgIG1Gb3JtYXRDaGFuZ2VQZW5kaW5nID0gZmFsc2U7CisgICAgbVRpbWVDaGFuZ2VQZW5kaW5nID0gZmFsc2U7CiB9CiAKIGJvb2wgTnVQbGF5ZXI6OkRlY29kZXI6OnN1cHBvcnRzU2VhbWxlc3NBdWRpb0Zvcm1hdENoYW5nZSgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuaAppbmRleCAxYmZhOTRmLi5lZWI0YWY0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5oCkBAIC0yNiwxMyArMjYsMTUgQEAKIHN0cnVjdCBOdVBsYXllcjo6RGVjb2RlciA6IHB1YmxpYyBEZWNvZGVyQmFzZSB7CiAgICAgRGVjb2Rlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKICAgICAgICAgICAgIGNvbnN0IHNwPFNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgIGNvbnN0IHNwPFJlbmRlcmVyPiAmcmVuZGVyZXIgPSBOVUxMLAotICAgICAgICAgICAgY29uc3Qgc3A8TmF0aXZlV2luZG93V3JhcHBlcj4gJm5hdGl2ZVdpbmRvdyA9IE5VTEwsCisgICAgICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSA9IE5VTEwsCiAgICAgICAgICAgICBjb25zdCBzcDxDQ0RlY29kZXI+ICZjY0RlY29kZXIgPSBOVUxMKTsKIAotICAgIHZpcnR1YWwgdm9pZCBnZXRTdGF0cygKLSAgICAgICAgICAgIGludDY0X3QgKm1OdW1GcmFtZXNUb3RhbCwKLSAgICAgICAgICAgIGludDY0X3QgKm1OdW1GcmFtZXNEcm9wcGVkKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNwPEFNZXNzYWdlPiBnZXRTdGF0cygpIGNvbnN0OworCisgICAgLy8gc2V0cyB0aGUgb3V0cHV0IHN1cmZhY2Ugb2YgdmlkZW8gZGVjb2RlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+RGVjb2RlcigpOwpAQCAtNDAsMjAgKzQyLDIyIEBACiAgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKIAogICAgIHZpcnR1YWwgdm9pZCBvbkNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgdmlydHVhbCB2b2lkIG9uU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcyk7CiAgICAgdmlydHVhbCB2b2lkIG9uU2V0UmVuZGVyZXIoY29uc3Qgc3A8UmVuZGVyZXI+ICZyZW5kZXJlcik7CiAgICAgdmlydHVhbCB2b2lkIG9uR2V0SW5wdXRCdWZmZXJzKFZlY3RvcjxzcDxBQnVmZmVyPiA+ICpkc3RCdWZmZXJzKTsKICAgICB2aXJ0dWFsIHZvaWQgb25SZXN1bWUoYm9vbCBub3RpZnlDb21wbGV0ZSk7Ci0gICAgdmlydHVhbCB2b2lkIG9uRmx1c2goYm9vbCBub3RpZnlDb21wbGV0ZSk7CisgICAgdmlydHVhbCB2b2lkIG9uRmx1c2goKTsKICAgICB2aXJ0dWFsIHZvaWQgb25TaHV0ZG93bihib29sIG5vdGlmeUNvbXBsZXRlKTsKLSAgICB2aXJ0dWFsIHZvaWQgZG9SZXF1ZXN0QnVmZmVycygpOworICAgIHZpcnR1YWwgYm9vbCBkb1JlcXVlc3RCdWZmZXJzKCk7CiAKIHByaXZhdGU6CiAgICAgZW51bSB7CiAgICAgICAgIGtXaGF0Q29kZWNOb3RpZnkgICAgICAgICA9ICdjZGNOJywKICAgICAgICAga1doYXRSZW5kZXJCdWZmZXIgICAgICAgID0gJ3JuZHInLAorICAgICAgICBrV2hhdFNldFZpZGVvU3VyZmFjZSAgICAgPSAnc1N1cicKICAgICB9OwogCi0gICAgc3A8TmF0aXZlV2luZG93V3JhcHBlcj4gbU5hdGl2ZVdpbmRvdzsKKyAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZTsKIAogICAgIHNwPFNvdXJjZT4gbVNvdXJjZTsKICAgICBzcDxSZW5kZXJlcj4gbVJlbmRlcmVyOwpAQCAtNzQsMjUgKzc4LDM4IEBACiAgICAgVmVjdG9yPE1lZGlhQnVmZmVyICo+IG1NZWRpYUJ1ZmZlcnM7CiAgICAgVmVjdG9yPHNpemVfdD4gbURlcXVldWVkSW5wdXRCdWZmZXJzOwogCisgICAgY29uc3QgcGlkX3QgbVBpZDsKICAgICBpbnQ2NF90IG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVczsKICAgICBpbnQ2NF90IG1OdW1GcmFtZXNUb3RhbDsKLSAgICBpbnQ2NF90IG1OdW1GcmFtZXNEcm9wcGVkOworICAgIGludDY0X3QgbU51bUlucHV0RnJhbWVzRHJvcHBlZDsKKyAgICBpbnQ2NF90IG1OdW1PdXRwdXRGcmFtZXNEcm9wcGVkOworICAgIGludDMyX3QgbVZpZGVvV2lkdGg7CisgICAgaW50MzJfdCBtVmlkZW9IZWlnaHQ7CiAgICAgYm9vbCBtSXNBdWRpbzsKICAgICBib29sIG1Jc1ZpZGVvQVZDOwogICAgIGJvb2wgbUlzU2VjdXJlOwogICAgIGJvb2wgbUZvcm1hdENoYW5nZVBlbmRpbmc7CisgICAgYm9vbCBtVGltZUNoYW5nZVBlbmRpbmc7CiAKICAgICBib29sIG1QYXVzZWQ7CiAgICAgYm9vbCBtUmVzdW1lUGVuZGluZzsKICAgICBBU3RyaW5nIG1Db21wb25lbnROYW1lOwogCi0gICAgYm9vbCBoYW5kbGVBbklucHV0QnVmZmVyKCk7Ci0gICAgYm9vbCBoYW5kbGVBbk91dHB1dEJ1ZmZlcigpOworICAgIHZvaWQgaGFuZGxlRXJyb3IoaW50MzJfdCBlcnIpOworICAgIGJvb2wgaGFuZGxlQW5JbnB1dEJ1ZmZlcihzaXplX3QgaW5kZXgpOworICAgIGJvb2wgaGFuZGxlQW5PdXRwdXRCdWZmZXIoCisgICAgICAgICAgICBzaXplX3QgaW5kZXgsCisgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywKKyAgICAgICAgICAgIGludDMyX3QgZmxhZ3MpOworICAgIHZvaWQgaGFuZGxlT3V0cHV0Rm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKIAogICAgIHZvaWQgcmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCk7CiAgICAgdm9pZCByZXF1ZXN0Q29kZWNOb3RpZmljYXRpb24oKTsKICAgICBib29sIGlzU3RhbGVSZXBseShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKKyAgICB2b2lkIGRvRmx1c2goYm9vbCBub3RpZnlDb21wbGV0ZSk7CiAgICAgc3RhdHVzX3QgZmV0Y2hJbnB1dERhdGEoc3A8QU1lc3NhZ2U+ICZyZXBseSk7CiAgICAgYm9vbCBvbklucHV0QnVmZmVyRmV0Y2hlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgdm9pZCBvblJlbmRlckJ1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CkBAIC0xMDAsNiArMTE3LDggQEAKICAgICBib29sIHN1cHBvcnRzU2VhbWxlc3NGb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZ0bykgY29uc3Q7CiAgICAgYm9vbCBzdXBwb3J0c1NlYW1sZXNzQXVkaW9Gb3JtYXRDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZ0YXJnZXRGb3JtYXQpIGNvbnN0OwogICAgIHZvaWQgcmVtZW1iZXJDb2RlY1NwZWNpZmljRGF0YShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisgICAgYm9vbCBpc0Rpc2NvbnRpbnVpdHlQZW5kaW5nKCkgY29uc3Q7CisgICAgdm9pZCBmaW5pc2hIYW5kbGVEaXNjb250aW51aXR5KGJvb2wgZmx1c2hPblRpbWVDaGFuZ2UpOwogCiAgICAgdm9pZCBub3RpZnlSZXN1bWVDb21wbGV0ZUlmTmVjZXNzYXJ5KCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJCYXNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJCYXNlLmNwcAppbmRleCBkNTZmYzRkLi43ZTc2ODQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyQmFzZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlckJhc2UuY3BwCkBAIC0zMSw2ICszMSw3IEBACiBOdVBsYXllcjo6RGVjb2RlckJhc2U6OkRlY29kZXJCYXNlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KQogICAgIDogIG1Ob3RpZnkobm90aWZ5KSwKICAgICAgICBtQnVmZmVyR2VuZXJhdGlvbigwKSwKKyAgICAgICBtU3RhdHMobmV3IEFNZXNzYWdlKSwKICAgICAgICBtUmVxdWVzdElucHV0QnVmZmVyc1BlbmRpbmcoZmFsc2UpIHsKICAgICAvLyBFdmVyeSBkZWNvZGVyIGhhcyBpdHMgb3duIGxvb3BlciBiZWNhdXNlIE1lZGlhQ29kZWMgb3BlcmF0aW9ucwogICAgIC8vIGFyZSBibG9ja2luZywgYnV0IE51UGxheWVyIG5lZWRzIGFzeW5jaHJvbm91cyBvcGVyYXRpb25zLgpAQCAtNjEsNyArNjIsNyBAQAogfQogCiB2b2lkIE51UGxheWVyOjpEZWNvZGVyQmFzZTo6Y29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbmZpZ3VyZSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbmZpZ3VyZSwgdGhpcyk7CiAgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOwogICAgIG1zZy0+cG9zdCgpOwogfQpAQCAtNzAsMTQgKzcxLDIwIEBACiAgICAgbURlY29kZXJMb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKIH0KIAordm9pZCBOdVBsYXllcjo6RGVjb2RlckJhc2U6OnNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0UGFyYW1ldGVycywgdGhpcyk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJwYXJhbXMiLCBwYXJhbXMpOworICAgIG1zZy0+cG9zdCgpOworfQorCiB2b2lkIE51UGxheWVyOjpEZWNvZGVyQmFzZTo6c2V0UmVuZGVyZXIoY29uc3Qgc3A8UmVuZGVyZXI+ICZyZW5kZXJlcikgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRSZW5kZXJlciwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldFJlbmRlcmVyLCB0aGlzKTsKICAgICBtc2ctPnNldE9iamVjdCgicmVuZGVyZXIiLCByZW5kZXJlcik7CiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpEZWNvZGVyQmFzZTo6Z2V0SW5wdXRCdWZmZXJzKFZlY3RvcjxzcDxBQnVmZmVyPiA+ICpidWZmZXJzKSBjb25zdCB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldElucHV0QnVmZmVycywgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldElucHV0QnVmZmVycywgdGhpcyk7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJidWZmZXJzIiwgYnVmZmVycyk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CkBAIC04NSwxNyArOTIsMTcgQEAKIH0KIAogdm9pZCBOdVBsYXllcjo6RGVjb2RlckJhc2U6OnNpZ25hbEZsdXNoKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRGbHVzaCwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdEZsdXNoLCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6RGVjb2RlckJhc2U6OnNpZ25hbFJlc3VtZShib29sIG5vdGlmeUNvbXBsZXRlKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQzMigibm90aWZ5Q29tcGxldGUiLCBub3RpZnlDb21wbGV0ZSk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OkRlY29kZXJCYXNlOjppbml0aWF0ZVNodXRkb3duKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTaHV0ZG93biwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFNodXRkb3duLCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6RGVjb2RlckJhc2U6Om9uUmVxdWVzdElucHV0QnVmZmVycygpIHsKQEAgLTEwMywxNiArMTEwLDEzIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBkb1JlcXVlc3RCdWZmZXJzKCk7Ci19CisgICAgLy8gZG9SZXF1ZXN0QnVmZmVycygpIHJldHVybiB0cnVlIGlmIHdlIHNob3VsZCByZXF1ZXN0IG1vcmUgZGF0YQorICAgIGlmIChkb1JlcXVlc3RCdWZmZXJzKCkpIHsKKyAgICAgICAgbVJlcXVlc3RJbnB1dEJ1ZmZlcnNQZW5kaW5nID0gdHJ1ZTsKIAotdm9pZCBOdVBsYXllcjo6RGVjb2RlckJhc2U6OnNjaGVkdWxlUmVxdWVzdEJ1ZmZlcnMoKSB7Ci0gICAgaWYgKG1SZXF1ZXN0SW5wdXRCdWZmZXJzUGVuZGluZykgewotICAgICAgICByZXR1cm47CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXF1ZXN0SW5wdXRCdWZmZXJzLCB0aGlzKTsKKyAgICAgICAgbXNnLT5wb3N0KDEwICogMTAwMGxsKTsKICAgICB9Ci0gICAgbVJlcXVlc3RJbnB1dEJ1ZmZlcnNQZW5kaW5nID0gdHJ1ZTsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVxdWVzdElucHV0QnVmZmVycywgaWQoKSk7Ci0gICAgbXNnLT5wb3N0KDEwICogMTAwMGxsKTsKIH0KIAogdm9pZCBOdVBsYXllcjo6RGVjb2RlckJhc2U6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CkBAIC0xMjYsNiArMTMwLDE0IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRTZXRQYXJhbWV0ZXJzOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicGFyYW1zIiwgJnBhcmFtcykpOworICAgICAgICAgICAgb25TZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2Uga1doYXRTZXRSZW5kZXJlcjoKICAgICAgICAgewogICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwpAQCAtMTM2LDcgKzE0OCw3IEBACiAKICAgICAgICAgY2FzZSBrV2hhdEdldElucHV0QnVmZmVyczoKICAgICAgICAgewotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqZHN0QnVmZmVyczsKQEAgLTE1Nyw3ICsxNjksNyBAQAogCiAgICAgICAgIGNhc2Uga1doYXRGbHVzaDoKICAgICAgICAgewotICAgICAgICAgICAgb25GbHVzaCh0cnVlKTsKKyAgICAgICAgICAgIG9uRmx1c2goKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJCYXNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyQmFzZS5oCmluZGV4IDY3MzJmZjQuLmIwZGMwMWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJCYXNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlckJhc2UuaApAQCAtMjYsMjQgKzI2LDI3IEBACiAKIHN0cnVjdCBBQnVmZmVyOwogc3RydWN0IE1lZGlhQ29kZWM7Ci1zdHJ1Y3QgTWVkaWFCdWZmZXI7CitjbGFzcyBNZWRpYUJ1ZmZlcjsKK2NsYXNzIFN1cmZhY2U7CiAKIHN0cnVjdCBOdVBsYXllcjo6RGVjb2RlckJhc2UgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIERlY29kZXJCYXNlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKIAogICAgIHZvaWQgY29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKICAgICB2b2lkIGluaXQoKTsKKyAgICB2b2lkIHNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpOwogCiAgICAgdm9pZCBzZXRSZW5kZXJlcihjb25zdCBzcDxSZW5kZXJlcj4gJnJlbmRlcmVyKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmKSB7IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsgfQogCiAgICAgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJzKFZlY3RvcjxzcDxBQnVmZmVyPiA+ICpkc3RCdWZmZXJzKSBjb25zdDsKICAgICB2b2lkIHNpZ25hbEZsdXNoKCk7CiAgICAgdm9pZCBzaWduYWxSZXN1bWUoYm9vbCBub3RpZnlDb21wbGV0ZSk7CiAgICAgdm9pZCBpbml0aWF0ZVNodXRkb3duKCk7CiAKLSAgICB2aXJ0dWFsIHZvaWQgZ2V0U3RhdHMoCi0gICAgICAgICAgICBpbnQ2NF90ICptTnVtRnJhbWVzVG90YWwsCi0gICAgICAgICAgICBpbnQ2NF90ICptTnVtRnJhbWVzRHJvcHBlZCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3A8QU1lc3NhZ2U+IGdldFN0YXRzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVN0YXRzOworICAgIH0KIAogICAgIGVudW0gewogICAgICAgICBrV2hhdElucHV0RGlzY29udGludWl0eSAgPSAnaW5EaScsCkBAIC02MiwyMyArNjUsMjUgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCiAgICAgdmlydHVhbCB2b2lkIG9uQ29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSA9IDA7CisgICAgdmlydHVhbCB2b2lkIG9uU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcykgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBvblNldFJlbmRlcmVyKGNvbnN0IHNwPFJlbmRlcmVyPiAmcmVuZGVyZXIpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgb25HZXRJbnB1dEJ1ZmZlcnMoVmVjdG9yPHNwPEFCdWZmZXI+ID4gKmRzdEJ1ZmZlcnMpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgb25SZXN1bWUoYm9vbCBub3RpZnlDb21wbGV0ZSkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBvbkZsdXNoKGJvb2wgbm90aWZ5Q29tcGxldGUpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25GbHVzaCgpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgb25TaHV0ZG93bihib29sIG5vdGlmeUNvbXBsZXRlKSA9IDA7CiAKICAgICB2b2lkIG9uUmVxdWVzdElucHV0QnVmZmVycygpOwotICAgIHZvaWQgc2NoZWR1bGVSZXF1ZXN0QnVmZmVycygpOwotICAgIHZpcnR1YWwgdm9pZCBkb1JlcXVlc3RCdWZmZXJzKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBkb1JlcXVlc3RCdWZmZXJzKCkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVFcnJvcihpbnQzMl90IGVycik7CiAKICAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKICAgICBpbnQzMl90IG1CdWZmZXJHZW5lcmF0aW9uOworICAgIHNwPEFNZXNzYWdlPiBtU3RhdHM7CiAKIHByaXZhdGU6CiAgICAgZW51bSB7CiAgICAgICAgIGtXaGF0Q29uZmlndXJlICAgICAgICAgICA9ICdjb25mJywKKyAgICAgICAga1doYXRTZXRQYXJhbWV0ZXJzICAgICAgID0gJ3NldFAnLAogICAgICAgICBrV2hhdFNldFJlbmRlcmVyICAgICAgICAgPSAnc2V0UicsCiAgICAgICAgIGtXaGF0R2V0SW5wdXRCdWZmZXJzICAgICA9ICdnSW5CJywKICAgICAgICAga1doYXRSZXF1ZXN0SW5wdXRCdWZmZXJzID0gJ3JlcUInLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5jcHAKaW5kZXggOWY3ZjA5YS4uMzAxNDZjNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guY3BwCkBAIC01OSwxMiArNTksNiBAQAogTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6fkRlY29kZXJQYXNzVGhyb3VnaCgpIHsKIH0KIAotdm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpnZXRTdGF0cygKLSAgICAgICAgaW50NjRfdCAqbnVtRnJhbWVzVG90YWwsIGludDY0X3QgKm51bUZyYW1lc0Ryb3BwZWQpIGNvbnN0IHsKLSAgICAqbnVtRnJhbWVzVG90YWwgPSAwOwotICAgICpudW1GcmFtZXNEcm9wcGVkID0gMDsKLX0KLQogdm9pZCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvbkNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgewogICAgIEFMT0dWKCJbJXNdIG9uQ29uZmlndXJlIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgbUNhY2hlZEJ5dGVzID0gMDsKQEAgLTc0LDE3ICs2OCwyNCBAQAogCiAgICAgb25SZXF1ZXN0SW5wdXRCdWZmZXJzKCk7CiAKKyAgICBpbnQzMl90IGhhc1ZpZGVvID0gMDsKKyAgICBmb3JtYXQtPmZpbmRJbnQzMigiaGFzLXZpZGVvIiwgJmhhc1ZpZGVvKTsKKwogICAgIC8vIFRoZSBhdWRpbyBzaW5rIGlzIGFscmVhZHkgb3BlbmVkIGJlZm9yZSB0aGUgUGFzc1Rocm91Z2ggZGVjb2RlciBpcyBjcmVhdGVkLgogICAgIC8vIE9wZW5pbmcgYWdhaW4gbWlnaHQgYmUgcmVsZXZhbnQgaWYgZGVjb2RlciBpcyBpbnN0YW50aWF0ZWQgYWZ0ZXIgc2h1dGRvd24gYW5kCiAgICAgLy8gZm9ybWF0IGlzIGRpZmZlcmVudC4KICAgICBzdGF0dXNfdCBlcnIgPSBtUmVuZGVyZXItPm9wZW5BdWRpb1NpbmsoCi0gICAgICAgICAgICBmb3JtYXQsIHRydWUgLyogb2ZmbG9hZE9ubHkgKi8sIGZhbHNlIC8qIGhhc1ZpZGVvICovLAorICAgICAgICAgICAgZm9ybWF0LCB0cnVlIC8qIG9mZmxvYWRPbmx5ICovLCBoYXNWaWRlbywKICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUgLyogZmxhZ3MgKi8sIE5VTEwgLyogaXNPZmZsb2FkZWQgKi8pOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKICAgICB9CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25TZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmLypwYXJhbXMqLykgeworICAgIEFMT0dXKCJvblNldFBhcmFtZXRlcnMoKSBjYWxsZWQgdW5leHBlY3RlZGx5Iik7Cit9CisKIHZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25TZXRSZW5kZXJlcigKICAgICAgICAgY29uc3Qgc3A8UmVuZGVyZXI+ICZyZW5kZXJlcikgewogICAgIC8vIHJlbmRlcmVyIGNhbid0IGJlIGNoYW5nZWQgZHVyaW5nIG9mZmxvYWRpbmcKQEAgLTExMCw3ICsxMTEsMTAgQEAKICAgICByZXR1cm4gbUNhY2hlZEJ5dGVzID49IGtNYXhDYWNoZWRCeXRlcyB8fCBtUmVhY2hlZEVPUyB8fCBtUGF1c2VkOwogfQogCi12b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OmRvUmVxdWVzdEJ1ZmZlcnMoKSB7CisvKgorICogcmV0dXJucyB0cnVlIGlmIHdlIHNob3VsZCByZXF1ZXN0IG1vcmUgZGF0YQorICovCitib29sIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OmRvUmVxdWVzdEJ1ZmZlcnMoKSB7CiAgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAgICAgd2hpbGUgKCFpc0RvbmVGZXRjaGluZygpKSB7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKQEAgLTEyMywxMCArMTI3LDggQEAKICAgICAgICAgb25JbnB1dEJ1ZmZlckZldGNoZWQobXNnKTsKICAgICB9CiAKLSAgICBpZiAoZXJyID09IC1FV09VTERCTE9DSwotICAgICAgICAgICAgJiYgbVNvdXJjZS0+ZmVlZE1vcmVUU0RhdGEoKSA9PSBPSykgewotICAgICAgICBzY2hlZHVsZVJlcXVlc3RCdWZmZXJzKCk7Ci0gICAgfQorICAgIHJldHVybiBlcnIgPT0gLUVXT1VMREJMT0NLCisgICAgICAgICAgICAmJiBtU291cmNlLT5mZWVkTW9yZVRTRGF0YSgpID09IE9LOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6RGVjb2RlclBhc3NUaHJvdWdoOjpkZXF1ZXVlQWNjZXNzVW5pdChzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCkgewpAQCAtMjQ3LDcgKzI0OSw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHRpbWVDaGFuZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgb25GbHVzaChmYWxzZSAvKiBub3RpZnlDb21wbGV0ZSAqLyk7CisgICAgICAgICAgICAgICAgICAgIGRvRmx1c2goZmFsc2UgLyogbm90aWZ5Q29tcGxldGUgKi8pOwogICAgICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdENoYW5nZSkgewogICAgICAgICAgICAgICAgICAgICAvLyBkbyBzZWFtbGVzcyBmb3JtYXQgY2hhbmdlCkBAIC0zMzMsNyArMzM1LDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdEJ1ZmZlckNvbnN1bWVkLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRCdWZmZXJDb25zdW1lZCwgdGhpcyk7CiAgICAgcmVwbHktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUJ1ZmZlckdlbmVyYXRpb24pOwogICAgIHJlcGx5LT5zZXRJbnQzMigic2l6ZSIsIGJ1ZmZlclNpemUpOwogCkBAIC0zNjQsNyArMzY2LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25GbHVzaChib29sIG5vdGlmeUNvbXBsZXRlKSB7Cit2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OmRvRmx1c2goYm9vbCBub3RpZnlDb21wbGV0ZSkgewogICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CiAgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID0gLTE7CiAgICAgbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQuY2xlYXIoKTsKQEAgLTM3NiwxOCArMzc4LDIxIEBACiAgICAgICAgIG1SZW5kZXJlci0+c2lnbmFsVGltZURpc2NvbnRpbnVpdHkoKTsKICAgICB9CiAKLSAgICBpZiAobm90aWZ5Q29tcGxldGUpIHsKLSAgICAgICAgbVBhdXNlZCA9IHRydWU7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0Rmx1c2hDb21wbGV0ZWQpOwotICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICB9Ci0KICAgICBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluID0gMDsKICAgICBtQ2FjaGVkQnl0ZXMgPSAwOwogICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25GbHVzaCgpIHsKKyAgICBkb0ZsdXNoKHRydWUgLyogbm90aWZ5Q29tcGxldGUgKi8pOworCisgICAgbVBhdXNlZCA9IHRydWU7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEZsdXNoQ29tcGxldGVkKTsKKyAgICBub3RpZnktPnBvc3QoKTsKKworfQorCiB2b2lkIE51UGxheWVyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uU2h1dGRvd24oYm9vbCBub3RpZnlDb21wbGV0ZSkgewogICAgICsrbUJ1ZmZlckdlbmVyYXRpb247CiAgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID0gLTE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5oCmluZGV4IGE2ZTFmYWYuLmRiMzNlODcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5oCkBAIC0yOSwxMCArMjksNiBAQAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VyY2U+ICZzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFJlbmRlcmVyPiAmcmVuZGVyZXIpOwogCi0gICAgdmlydHVhbCB2b2lkIGdldFN0YXRzKAotICAgICAgICAgICAgaW50NjRfdCAqbU51bUZyYW1lc1RvdGFsLAotICAgICAgICAgICAgaW50NjRfdCAqbU51bUZyYW1lc0Ryb3BwZWQpIGNvbnN0OwotCiBwcm90ZWN0ZWQ6CiAKICAgICB2aXJ0dWFsIH5EZWNvZGVyUGFzc1Rocm91Z2goKTsKQEAgLTQwLDEyICszNiwxMyBAQAogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKICAgICB2aXJ0dWFsIHZvaWQgb25Db25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOworICAgIHZpcnR1YWwgdm9pZCBvblNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpOwogICAgIHZpcnR1YWwgdm9pZCBvblNldFJlbmRlcmVyKGNvbnN0IHNwPFJlbmRlcmVyPiAmcmVuZGVyZXIpOwogICAgIHZpcnR1YWwgdm9pZCBvbkdldElucHV0QnVmZmVycyhWZWN0b3I8c3A8QUJ1ZmZlcj4gPiAqZHN0QnVmZmVycyk7CiAgICAgdmlydHVhbCB2b2lkIG9uUmVzdW1lKGJvb2wgbm90aWZ5Q29tcGxldGUpOwotICAgIHZpcnR1YWwgdm9pZCBvbkZsdXNoKGJvb2wgbm90aWZ5Q29tcGxldGUpOworICAgIHZpcnR1YWwgdm9pZCBvbkZsdXNoKCk7CiAgICAgdmlydHVhbCB2b2lkIG9uU2h1dGRvd24oYm9vbCBub3RpZnlDb21wbGV0ZSk7Ci0gICAgdmlydHVhbCB2b2lkIGRvUmVxdWVzdEJ1ZmZlcnMoKTsKKyAgICB2aXJ0dWFsIGJvb2wgZG9SZXF1ZXN0QnVmZmVycygpOwogCiBwcml2YXRlOgogICAgIGVudW0gewpAQCAtNzcsNiArNzQsNyBAQAogICAgIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KTsKICAgICBzcDxBQnVmZmVyPiBhZ2dyZWdhdGVCdWZmZXIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOwogICAgIHN0YXR1c190IGZldGNoSW5wdXREYXRhKHNwPEFNZXNzYWdlPiAmcmVwbHkpOworICAgIHZvaWQgZG9GbHVzaChib29sIG5vdGlmeUNvbXBsZXRlKTsKIAogICAgIHZvaWQgb25JbnB1dEJ1ZmZlckZldGNoZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgb25CdWZmZXJDb25zdW1lZChpbnQzMl90IHNpemUpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKaW5kZXggYmM3OWZkYi4uNzM3MDIyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIExPR19UQUcgIk51UGxheWVyRHJpdmVyIgogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAogI2luY2x1ZGUgIk51UGxheWVyRHJpdmVyLmgiCiAKQEAgLTMyLDcgKzMzLDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1OdVBsYXllckRyaXZlcjo6TnVQbGF5ZXJEcml2ZXIoKQorTnVQbGF5ZXJEcml2ZXI6Ok51UGxheWVyRHJpdmVyKHBpZF90IHBpZCkKICAgICA6IG1TdGF0ZShTVEFURV9JRExFKSwKICAgICAgIG1Jc0FzeW5jUHJlcGFyZShmYWxzZSksCiAgICAgICBtQXN5bmNSZXN1bHQoVU5LTk9XTl9FUlJPUiksCkBAIC01NCw3ICs1NSw3IEBACiAgICAgICAgICAgICB0cnVlLCAgLyogY2FuQ2FsbEphdmEgKi8KICAgICAgICAgICAgIFBSSU9SSVRZX0FVRElPKTsKIAotICAgIG1QbGF5ZXIgPSBuZXcgTnVQbGF5ZXI7CisgICAgbVBsYXllciA9IG5ldyBOdVBsYXllcihwaWQpOwogICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUGxheWVyKTsKIAogICAgIG1QbGF5ZXItPnNldERyaXZlcih0aGlzKTsKQEAgLTEzNSw2ICsxMzYsMjUgQEAKICAgICByZXR1cm4gbUFzeW5jUmVzdWx0OwogfQogCitzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2V0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKSB7CisgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJXApIGNhbGxiYWNrIHNvdXJjZSIsIHRoaXMpOworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobVN0YXRlICE9IFNUQVRFX0lETEUpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG1TdGF0ZSA9IFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkc7CisKKyAgICBtUGxheWVyLT5zZXREYXRhU291cmNlQXN5bmMoc291cmNlKTsKKworICAgIHdoaWxlIChtU3RhdGUgPT0gU1RBVEVfU0VUX0RBVEFTT1VSQ0VfUEVORElORykgeworICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOworICAgIH0KKworICAgIHJldHVybiBtQXN5bmNSZXN1bHQ7Cit9CisKIHN0YXR1c190IE51UGxheWVyRHJpdmVyOjpzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKAogICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmYnVmZmVyUHJvZHVjZXIpIHsKICAgICBBTE9HVigic2V0VmlkZW9TdXJmYWNlVGV4dHVyZSglcCkiLCB0aGlzKTsKQEAgLTIyMiw3ICsyNDIsNyBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c3RhcnQoKSB7Ci0gICAgQUxPR0QoInN0YXJ0KCVwKSIsIHRoaXMpOworICAgIEFMT0dEKCJzdGFydCglcCksIHN0YXRlIGlzICVkLCBlb3MgaXMgJWQiLCB0aGlzLCBtU3RhdGUsIG1BdEVPUyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIHN3aXRjaCAobVN0YXRlKSB7CkBAIC0zNDEsNiArMzYxLDM0IEBACiAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9SVU5OSU5HICYmICFtQXRFT1M7CiB9CiAKK3N0YXR1c190IE51UGxheWVyRHJpdmVyOjpzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtUGxheWVyLT5zZXRQbGF5YmFja1NldHRpbmdzKHJhdGUpOworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgaWYgKHJhdGUubVNwZWVkID09IDAuZiAmJiBtU3RhdGUgPT0gU1RBVEVfUlVOTklORykgeworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUEFVU0VEOworICAgICAgICAgICAgLy8gdHJ5IHRvIHVwZGF0ZSBwb3NpdGlvbgorICAgICAgICAgICAgKHZvaWQpbVBsYXllci0+Z2V0Q3VycmVudFBvc2l0aW9uKCZtUG9zaXRpb25Vcyk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1BBVVNFRCk7CisgICAgICAgIH0gZWxzZSBpZiAocmF0ZS5tU3BlZWQgIT0gMC5mICYmIG1TdGF0ZSA9PSBTVEFURV9QQVVTRUQpIHsKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1JVTk5JTkc7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OmdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUpIHsKKyAgICByZXR1cm4gbVBsYXllci0+Z2V0UGxheWJhY2tTZXR0aW5ncyhyYXRlKTsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyAmc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KSB7CisgICAgcmV0dXJuIG1QbGF5ZXItPnNldFN5bmNTZXR0aW5ncyhzeW5jLCB2aWRlb0Zwc0hpbnQpOworfQorCitzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6Z2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jLCBmbG9hdCAqdmlkZW9GcHMpIHsKKyAgICByZXR1cm4gbVBsYXllci0+Z2V0U3luY1NldHRpbmdzKHN5bmMsIHZpZGVvRnBzKTsKK30KKwogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnNlZWtUbyhpbnQgbXNlYykgewogICAgIEFMT0dEKCJzZWVrVG8oJXApICVkIG1zIiwgdGhpcywgbXNlYyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKQEAgLTM1MCwxNyArMzk4LDEwIEBACiAgICAgc3dpdGNoIChtU3RhdGUpIHsKICAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKICAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDoKLSAgICAgICAgewotICAgICAgICAgICAgbVN0YXJ0dXBTZWVrVGltZVVzID0gc2Vla1RpbWVVczsKLSAgICAgICAgICAgIC8vIHByZXRlbmQgdGhhdCB0aGUgc2VlayBjb21wbGV0ZWQuIEl0IHdpbGwgYWN0dWFsbHkgaGFwcGVuIHdoZW4gc3RhcnRpbmcgcGxheWJhY2suCi0gICAgICAgICAgICAvLyBUT0RPOiBhY3R1YWxseSBwZXJmb3JtIHRoZSBzZWVrIGhlcmUsIHNvIHRoZSBwbGF5ZXIgaXMgcmVhZHkgdG8gZ28gYXQgdGhlIG5ldwotICAgICAgICAgICAgLy8gbG9jYXRpb24KLSAgICAgICAgICAgIG5vdGlmeVNlZWtDb21wbGV0ZV9sKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzoKICAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6CisgICAgICAgICAgICBtU3RhcnR1cFNlZWtUaW1lVXMgPSBzZWVrVGltZVVzOworICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoLgorICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6CiAgICAgICAgIHsKICAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOwogICAgICAgICAgICAgbVNlZWtJblByb2dyZXNzID0gdHJ1ZTsKQEAgLTQ0NCw2ICs0ODUsMTMgQEAKICAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChNRURJQV9TVE9QUEVEKTsKICAgICB9CiAKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldCgicGVyc2lzdC5kZWJ1Zy5zZi5zdGF0cyIsIHZhbHVlLCBOVUxMKSAmJgorICAgICAgICAgICAgKCFzdHJjbXAoIjEiLCB2YWx1ZSkgfHwgIXN0cmNhc2VjbXAoInRydWUiLCB2YWx1ZSkpKSB7CisgICAgICAgIFZlY3RvcjxTdHJpbmcxNj4gYXJnczsKKyAgICAgICAgZHVtcCgtMSwgYXJncyk7CisgICAgfQorCiAgICAgbVN0YXRlID0gU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1M7CiAgICAgbVBsYXllci0+cmVzZXRBc3luYygpOwogCkBAIC02MTIsMjIgKzY2MCw1OSBAQAogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6ZHVtcCgKICAgICAgICAgaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICYgLyogYXJncyAqLykgY29uc3QgewotICAgIGludDY0X3QgbnVtRnJhbWVzVG90YWw7Ci0gICAgaW50NjRfdCBudW1GcmFtZXNEcm9wcGVkOwotICAgIG1QbGF5ZXItPmdldFN0YXRzKCZudW1GcmFtZXNUb3RhbCwgJm51bUZyYW1lc0Ryb3BwZWQpOwogCi0gICAgRklMRSAqb3V0ID0gZmRvcGVuKGR1cChmZCksICJ3Iik7CisgICAgVmVjdG9yPHNwPEFNZXNzYWdlPiA+IHRyYWNrU3RhdHM7CisgICAgbVBsYXllci0+Z2V0U3RhdHMoJnRyYWNrU3RhdHMpOwogCi0gICAgZnByaW50ZihvdXQsICIgTnVQbGF5ZXJcbiIpOwotICAgIGZwcmludGYob3V0LCAiICBudW1GcmFtZXNUb3RhbCglIiBQUklkNjQgIiksIG51bUZyYW1lc0Ryb3BwZWQoJSIgUFJJZDY0ICIpLCAiCi0gICAgICAgICAgICAgICAgICJwZXJjZW50YWdlRHJvcHBlZCglLjJmKVxuIiwKLSAgICAgICAgICAgICAgICAgbnVtRnJhbWVzVG90YWwsCi0gICAgICAgICAgICAgICAgIG51bUZyYW1lc0Ryb3BwZWQsCi0gICAgICAgICAgICAgICAgIG51bUZyYW1lc1RvdGFsID09IDAKLSAgICAgICAgICAgICAgICAgICAgPyAwLjAgOiAoZG91YmxlKW51bUZyYW1lc0Ryb3BwZWQgLyBudW1GcmFtZXNUb3RhbCk7CisgICAgQVN0cmluZyBsb2dTdHJpbmcoIiBOdVBsYXllclxuIik7CisgICAgY2hhciBidWZbMjU2XSA9IHswfTsKIAotICAgIGZjbG9zZShvdXQpOwotICAgIG91dCA9IE5VTEw7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0cmFja1N0YXRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmc3RhdHMgPSB0cmFja1N0YXRzLml0ZW1BdChpKTsKKworICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgIGlmIChzdGF0cy0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSkgeworICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiAgbWltZSglcylcbiIsIG1pbWUuY19zdHIoKSk7CisgICAgICAgICAgICBsb2dTdHJpbmcuYXBwZW5kKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBBU3RyaW5nIG5hbWU7CisgICAgICAgIGlmIChzdGF0cy0+ZmluZFN0cmluZygiY29tcG9uZW50LW5hbWUiLCAmbmFtZSkpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIgICAgZGVjb2RlciglcylcbiIsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBsb2dTdHJpbmcuYXBwZW5kKGJ1Zik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgICAgICAgICAgaWYgKHN0YXRzLT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKQorICAgICAgICAgICAgICAgICAgICAmJiBzdGF0cy0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIgICAgcmVzb2x1dGlvbiglZCB4ICVkKVxuIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgbG9nU3RyaW5nLmFwcGVuZChidWYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQ2NF90IG51bUZyYW1lc1RvdGFsID0gMDsKKyAgICAgICAgICAgIGludDY0X3QgbnVtRnJhbWVzRHJvcHBlZCA9IDA7CisKKyAgICAgICAgICAgIHN0YXRzLT5maW5kSW50NjQoImZyYW1lcy10b3RhbCIsICZudW1GcmFtZXNUb3RhbCk7CisgICAgICAgICAgICBzdGF0cy0+ZmluZEludDY0KCJmcmFtZXMtZHJvcHBlZC1vdXRwdXQiLCAmbnVtRnJhbWVzRHJvcHBlZCk7CisgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiICAgIG51bUZyYW1lc1RvdGFsKCVsbGQpLCBudW1GcmFtZXNEcm9wcGVkKCVsbGQpLCAiCisgICAgICAgICAgICAgICAgICAgICAicGVyY2VudGFnZURyb3BwZWQoJS4yZiUlKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbnVtRnJhbWVzVG90YWwsCisgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW51bUZyYW1lc0Ryb3BwZWQsCisgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXNUb3RhbCA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAwLjAgOiAoZG91YmxlKShudW1GcmFtZXNEcm9wcGVkICogMTAwKSAvIG51bUZyYW1lc1RvdGFsKTsKKyAgICAgICAgICAgIGxvZ1N0cmluZy5hcHBlbmQoYnVmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dJKCIlcyIsIGxvZ1N0cmluZy5jX3N0cigpKTsKKworICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgIEZJTEUgKm91dCA9IGZkb3BlbihkdXAoZmQpLCAidyIpOworICAgICAgICBmcHJpbnRmKG91dCwgIiVzIiwgbG9nU3RyaW5nLmNfc3RyKCkpOworICAgICAgICBmY2xvc2Uob3V0KTsKKyAgICAgICAgb3V0ID0gTlVMTDsKKyAgICB9CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC02NDAsNiArNzI1LDcgQEAKIAogdm9pZCBOdVBsYXllckRyaXZlcjo6bm90aWZ5TGlzdGVuZXJfbCgKICAgICAgICAgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluKSB7CisgICAgQUxPR0QoIm5vdGlmeUxpc3RlbmVyX2woJXApLCAoJWQsICVkLCAlZCkiLCB0aGlzLCBtc2csIGV4dDEsIGV4dDIpOwogICAgIHN3aXRjaCAobXNnKSB7CiAgICAgICAgIGNhc2UgTUVESUFfUExBWUJBQ0tfQ09NUExFVEU6CiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKaW5kZXggNWNiYTdkOS4uZDAwOWZkNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmgKQEAgLTI0LDcgKzI0LDcgQEAKIHN0cnVjdCBOdVBsYXllcjsKIAogc3RydWN0IE51UGxheWVyRHJpdmVyIDogcHVibGljIE1lZGlhUGxheWVySW50ZXJmYWNlIHsKLSAgICBOdVBsYXllckRyaXZlcigpOworICAgIE51UGxheWVyRHJpdmVyKHBpZF90IHBpZCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwogCkBAIC0zOSw2ICszOSw4IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIGRhdGFTb3VyY2UpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKAogICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJmJ1ZmZlclByb2R1Y2VyKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmUoKTsKQEAgLTQ3LDYgKzQ5LDEwIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwogICAgIHZpcnR1YWwgYm9vbCBpc1BsYXlpbmcoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MgJnN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTeW5jU2V0dGluZ3MoQVZTeW5jU2V0dGluZ3MgKnN5bmMsIGZsb2F0ICp2aWRlb0Zwcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZWVrVG8oaW50IG1zZWMpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uKGludCAqbXNlYyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQgKm1zZWMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCmluZGV4IDI1MjI1YTguLjA0YTQ2ZjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKQEAgLTE5LDIyICsxOSw1MiBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiTnVQbGF5ZXJSZW5kZXJlci5oIgotCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVdha2VMb2NrLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotCi0jaW5jbHVkZSA8VmlkZW9GcmFtZVNjaGVkdWxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuaD4KIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLyoKKyAqIEV4YW1wbGUgb2YgY29tbW9uIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgaW4gc2hlbGwgc2NyaXB0IGZvcm0KKworICAgI1R1cm4gb2ZmbG9hZCBhdWRpbyBvZmYgKHVzZSBQQ00gZm9yIFBsYXkgTXVzaWMpIC0tIEF1ZGlvUG9saWN5TWFuYWdlcgorICAgYWRiIHNoZWxsIHNldHByb3AgYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIDEKKworICAgI0FsbG93IG9mZmxvYWQgYXVkaW8gd2l0aCB2aWRlbyAocmVxdWlyZXMgb2ZmbG9hZGluZyB0byBiZSBlbmFibGVkKSAtLSBBdWRpb1BvbGljeU1hbmFnZXIKKyAgIGFkYiBzaGVsbCBzZXRwcm9wIGF1ZGlvLm9mZmxvYWQudmlkZW8gMQorCisgICAjVXNlIGF1ZGlvIGNhbGxiYWNrcyBmb3IgUENNIGRhdGEKKyAgIGFkYiBzaGVsbCBzZXRwcm9wIG1lZGlhLnN0YWdlZnJpZ2h0LmF1ZGlvLmNiayAxCisKKyAgICNVc2UgZGVlcCBidWZmZXIgZm9yIFBDTSBkYXRhIHdpdGggdmlkZW8gKGl0IGlzIGdlbmVyYWxseSBlbmFibGVkIGZvciBhdWRpby1vbmx5KQorICAgYWRiIHNoZWxsIHNldHByb3AgbWVkaWEuc3RhZ2VmcmlnaHQuYXVkaW8uZGVlcCAxCisKKyAgICNTZXQgc2l6ZSBvZiBidWZmZXJzIGZvciBwY20gYXVkaW8gc2luayBpbiBtc2VjIChleGFtcGxlOiAxMDAwIG1zZWMpCisgICBhZGIgc2hlbGwgc2V0cHJvcCBtZWRpYS5zdGFnZWZyaWdodC5hdWRpby5zaW5rIDEwMDAKKworICogVGhlc2UgY29uZmlndXJhdGlvbnMgdGFrZSBlZmZlY3QgZm9yIHRoZSBuZXh0IHRyYWNrIHBsYXllZCAobm90IHRoZSBjdXJyZW50IHRyYWNrKS4KKyAqLworCitzdGF0aWMgaW5saW5lIGJvb2wgZ2V0VXNlQXVkaW9DYWxsYmFja1NldHRpbmcoKSB7CisgICAgcmV0dXJuIHByb3BlcnR5X2dldF9ib29sKCJtZWRpYS5zdGFnZWZyaWdodC5hdWRpby5jYmsiLCBmYWxzZSAvKiBkZWZhdWx0X3ZhbHVlICovKTsKK30KKworc3RhdGljIGlubGluZSBpbnQzMl90IGdldEF1ZGlvU2lua1BjbU1zU2V0dGluZygpIHsKKyAgICByZXR1cm4gcHJvcGVydHlfZ2V0X2ludDMyKAorICAgICAgICAgICAgIm1lZGlhLnN0YWdlZnJpZ2h0LmF1ZGlvLnNpbmsiLCA1MDAgLyogZGVmYXVsdF92YWx1ZSAqLyk7Cit9CisKIC8vIE1heGltdW0gdGltZSBpbiBwYXVzZWQgc3RhdGUgd2hlbiBvZmZsb2FkaW5nIGF1ZGlvIGRlY29tcHJlc3Npb24uIFdoZW4gZWxhcHNlZCwgdGhlIEF1ZGlvU2luawogLy8gaXMgY2xvc2VkIHRvIGFsbG93IHRoZSBhdWRpbyBEU1AgdG8gcG93ZXIgZG93bi4KIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtPZmZsb2FkUGF1c2VNYXhVcyA9IDEwMDAwMDAwbGw7CkBAIC02MywzNCArOTMsMzQgQEAKICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nKGZhbHNlKSwKICAgICAgIG1BdWRpb1F1ZXVlR2VuZXJhdGlvbigwKSwKICAgICAgIG1WaWRlb1F1ZXVlR2VuZXJhdGlvbigwKSwKKyAgICAgIG1BdWRpb0RyYWluR2VuZXJhdGlvbigwKSwKKyAgICAgIG1WaWRlb0RyYWluR2VuZXJhdGlvbigwKSwKKyAgICAgIG1QbGF5YmFja1NldHRpbmdzKEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVCksCiAgICAgICBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzKC0xKSwKICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcygtMSksCi0gICAgICBtQW5jaG9yVGltZVJlYWxVcygtMSksCiAgICAgICBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbigtMSksCi0gICAgICBtQW5jaG9yTWF4TWVkaWFVcygtMSksCiAgICAgICBtVmlkZW9MYXRlQnlVcygwbGwpLAogICAgICAgbUhhc0F1ZGlvKGZhbHNlKSwKICAgICAgIG1IYXNWaWRlbyhmYWxzZSksCi0gICAgICBtUGF1c2VTdGFydGVkVGltZVJlYWxVcygtMSksCi0gICAgICBtRmx1c2hpbmdBdWRpbyhmYWxzZSksCi0gICAgICBtRmx1c2hpbmdWaWRlbyhmYWxzZSksCiAgICAgICBtTm90aWZ5Q29tcGxldGVBdWRpbyhmYWxzZSksCiAgICAgICBtTm90aWZ5Q29tcGxldGVWaWRlbyhmYWxzZSksCiAgICAgICBtU3luY1F1ZXVlcyhmYWxzZSksCiAgICAgICBtUGF1c2VkKGZhbHNlKSwKLSAgICAgIG1QYXVzZVBvc2l0aW9uTWVkaWFUaW1lVXMoLTEpLAogICAgICAgbVZpZGVvU2FtcGxlUmVjZWl2ZWQoZmFsc2UpLAogICAgICAgbVZpZGVvUmVuZGVyaW5nU3RhcnRlZChmYWxzZSksCiAgICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24oMCksCiAgICAgICBtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24oMCksCiAgICAgICBtQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0R2VuZXJhdGlvbigwKSwKLSAgICAgIG1BdWRpb09mZmxvYWRUb3JuRG93bihmYWxzZSksCisgICAgICBtQXVkaW9Ub3JuRG93bihmYWxzZSksCiAgICAgICBtQ3VycmVudE9mZmxvYWRJbmZvKEFVRElPX0lORk9fSU5JVElBTElaRVIpLAogICAgICAgbUN1cnJlbnRQY21JbmZvKEFVRElPX1BDTUlORk9fSU5JVElBTElaRVIpLAogICAgICAgbVRvdGFsQnVmZmVyc1F1ZXVlZCgwKSwKICAgICAgIG1MYXN0QXVkaW9CdWZmZXJEcmFpbmVkKDApLAorICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2soZmFsc2UpLAogICAgICAgbVdha2VMb2NrKG5ldyBBV2FrZUxvY2soKSkgewotCisgICAgbU1lZGlhQ2xvY2sgPSBuZXcgTWVkaWFDbG9jazsKKyAgICBtUGxheWJhY2tSYXRlID0gbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkOworICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CiB9CiAKIE51UGxheWVyOjpSZW5kZXJlcjo6flJlbmRlcmVyKCkgewpAQCAtMTA1LDcgKzEzNSw4IEBACiAgICAgICAgIGJvb2wgYXVkaW8sCiAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIsCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5Q29uc3VtZWQpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UXVldWVCdWZmZXIsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRRdWV1ZUJ1ZmZlciwgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQzMigicXVldWVHZW5lcmF0aW9uIiwgZ2V0UXVldWVHZW5lcmF0aW9uKGF1ZGlvKSk7CiAgICAgbXNnLT5zZXRJbnQzMigiYXVkaW8iLCBzdGF0aWNfY2FzdDxpbnQzMl90PihhdWRpbykpOwogICAgIG1zZy0+c2V0QnVmZmVyKCJidWZmZXIiLCBidWZmZXIpOwogICAgIG1zZy0+c2V0TWVzc2FnZSgibm90aWZ5Q29uc3VtZWQiLCBub3RpZnlDb25zdW1lZCk7CkBAIC0xMTUsMTk5ICsxNDYsMjA5IEBACiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6cXVldWVFT1MoYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQpIHsKICAgICBDSEVDS19ORShmaW5hbFJlc3VsdCwgKHN0YXR1c190KU9LKTsKIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRRdWV1ZUVPUywgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFF1ZXVlRU9TLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJxdWV1ZUdlbmVyYXRpb24iLCBnZXRRdWV1ZUdlbmVyYXRpb24oYXVkaW8pKTsKICAgICBtc2ctPnNldEludDMyKCJhdWRpbyIsIHN0YXRpY19jYXN0PGludDMyX3Q+KGF1ZGlvKSk7CiAgICAgbXNnLT5zZXRJbnQzMigiZmluYWxSZXN1bHQiLCBmaW5hbFJlc3VsdCk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpmbHVzaChib29sIGF1ZGlvLCBib29sIG5vdGlmeUNvbXBsZXRlKSB7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUZsdXNoTG9jayk7Ci0gICAgICAgIGlmIChhdWRpbykgewotICAgICAgICAgICAgbU5vdGlmeUNvbXBsZXRlQXVkaW8gfD0gbm90aWZ5Q29tcGxldGU7Ci0gICAgICAgICAgICBpZiAobUZsdXNoaW5nQXVkaW8pIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTm90aWZ5Q29tcGxldGVWaWRlbyB8PSBub3RpZnlDb21wbGV0ZTsKLSAgICAgICAgICAgIGlmIChtRmx1c2hpbmdWaWRlbykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gdHJ1ZTsKLSAgICAgICAgfQorc3RhdHVzX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbmZpZ1BsYXliYWNrLCB0aGlzKTsKKyAgICB3cml0ZVRvQU1lc3NhZ2UobXNnLCByYXRlKTsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpSZW5kZXJlcjo6b25Db25maWdQbGF5YmFjayhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSAvKiBzYW5pdGl6ZWQgKi8pIHsKKyAgICBpZiAocmF0ZS5tU3BlZWQgPT0gMC5mKSB7CisgICAgICAgIG9uUGF1c2UoKTsKKyAgICAgICAgLy8gZG9uJ3QgY2FsbCBhdWRpb3NpbmsncyBzZXRQbGF5YmFja1JhdGUgaWYgcGF1c2luZywgYXMgcGl0Y2ggZG9lcyBub3QKKyAgICAgICAgLy8gaGF2ZSB0byBjb3JyZXNwb25kIHRvIHRoZSBhbnkgbm9uLTAgc3BlZWQgKGUuZyBvbGQgc3BlZWQpLiBLZWVwCisgICAgICAgIC8vIHNldHRpbmdzIG5vbmV0aGVsZXNzLCB1c2luZyB0aGUgb2xkIHNwZWVkLCBpbiBjYXNlIGF1ZGlvc2luayBjaGFuZ2VzLgorICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSBuZXdSYXRlID0gcmF0ZTsKKyAgICAgICAgbmV3UmF0ZS5tU3BlZWQgPSBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQ7CisgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gbmV3UmF0ZTsKKyAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGbHVzaCwgaWQoKSk7CisgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCAmJiBtQXVkaW9TaW5rLT5yZWFkeSgpKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NpbmstPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKyAgICBtUGxheWJhY2tTZXR0aW5ncyA9IHJhdGU7CisgICAgbVBsYXliYWNrUmF0ZSA9IHJhdGUubVNwZWVkOworICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUgLyogbm9ubnVsbCAqLykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRQbGF5YmFja1NldHRpbmdzLCB0aGlzKTsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgeworICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIHJlYWRGcm9tQU1lc3NhZ2UocmVzcG9uc2UsIHJhdGUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IE51UGxheWVyOjpSZW5kZXJlcjo6b25HZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlIC8qIG5vbm51bGwgKi8pIHsKKyAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMICYmIG1BdWRpb1NpbmstPnJlYWR5KCkpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvU2luay0+Z2V0UGxheWJhY2tSYXRlKHJhdGUpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBpZiAoIWlzQXVkaW9QbGF5YmFja1JhdGVFcXVhbCgqcmF0ZSwgbVBsYXliYWNrU2V0dGluZ3MpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNvcnJlY3RpbmcgbWlzbWF0Y2ggaW4gaW50ZXJuYWwvZXh0ZXJuYWwgcGxheWJhY2sgcmF0ZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZ2V0IHBsYXliYWNrIHNldHRpbmdzIHVzZWQgYnkgYXVkaW9zaW5rLCBhcyBpdCBtYXkgYmUKKyAgICAgICAgICAgIC8vIHNsaWdodGx5IG9mZiBkdWUgdG8gYXVkaW9zaW5rIG5vdCB0YWtpbmcgc21hbGwgY2hhbmdlcy4KKyAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gKnJhdGU7CisgICAgICAgICAgICBpZiAobVBhdXNlZCkgeworICAgICAgICAgICAgICAgIHJhdGUtPm1TcGVlZCA9IDAuZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICAqcmF0ZSA9IG1QbGF5YmFja1NldHRpbmdzOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MgJnN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25maWdTeW5jLCB0aGlzKTsKKyAgICB3cml0ZVRvQU1lc3NhZ2UobXNnLCBzeW5jLCB2aWRlb0Zwc0hpbnQpOworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvbkNvbmZpZ1N5bmMoY29uc3QgQVZTeW5jU2V0dGluZ3MgJnN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCBfX3VudXNlZCkgeworICAgIGlmIChzeW5jLm1Tb3VyY2UgIT0gQVZTWU5DX1NPVVJDRV9ERUZBVUxUKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIC8vIFRPRE86IHN1cHBvcnQgc3luYyBzb3VyY2VzCisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldFN5bmNTZXR0aW5ncyhBVlN5bmNTZXR0aW5ncyAqc3luYywgZmxvYXQgKnZpZGVvRnBzKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldFN5bmNTZXR0aW5ncywgdGhpcyk7CisgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOworICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKKyAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKHJlc3BvbnNlLCBzeW5jLCB2aWRlb0Zwcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvbkdldFN5bmNTZXR0aW5ncygKKyAgICAgICAgQVZTeW5jU2V0dGluZ3MgKnN5bmMgLyogbm9ubnVsbCAqLywgZmxvYXQgKnZpZGVvRnBzIC8qIG5vbm51bGwgKi8pIHsKKyAgICAqc3luYyA9IG1TeW5jU2V0dGluZ3M7CisgICAgKnZpZGVvRnBzID0gLTEuZjsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpmbHVzaChib29sIGF1ZGlvLCBib29sIG5vdGlmeUNvbXBsZXRlKSB7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgICAgIG1Ob3RpZnlDb21wbGV0ZUF1ZGlvIHw9IG5vdGlmeUNvbXBsZXRlOworICAgICAgICAgICAgY2xlYXJBdWRpb0ZpcnN0QW5jaG9yVGltZV9sKCk7CisgICAgICAgICAgICArK21BdWRpb1F1ZXVlR2VuZXJhdGlvbjsKKyAgICAgICAgICAgICsrbUF1ZGlvRHJhaW5HZW5lcmF0aW9uOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU5vdGlmeUNvbXBsZXRlVmlkZW8gfD0gbm90aWZ5Q29tcGxldGU7CisgICAgICAgICAgICArK21WaWRlb1F1ZXVlR2VuZXJhdGlvbjsKKyAgICAgICAgICAgICsrbVZpZGVvRHJhaW5HZW5lcmF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgY2xlYXJBbmNob3JUaW1lX2woKTsKKyAgICAgICAgbVZpZGVvTGF0ZUJ5VXMgPSAwOworICAgICAgICBtU3luY1F1ZXVlcyA9IGZhbHNlOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGbHVzaCwgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQzMigiYXVkaW8iLCBzdGF0aWNfY2FzdDxpbnQzMl90PihhdWRpbykpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2lnbmFsVGltZURpc2NvbnRpbnVpdHkoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAvLyBDSEVDSyhtQXVkaW9RdWV1ZS5lbXB0eSgpKTsKLSAgICAvLyBDSEVDSyhtVmlkZW9RdWV1ZS5lbXB0eSgpKTsKLSAgICBzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZSgtMSk7Ci0gICAgc2V0QW5jaG9yVGltZSgtMSwgLTEpOwotICAgIHNldFZpZGVvTGF0ZUJ5VXMoMCk7Ci0gICAgbVN5bmNRdWV1ZXMgPSBmYWxzZTsKLX0KLQotdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNpZ25hbEF1ZGlvU2lua0NoYW5nZWQoKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdEF1ZGlvU2lua0NoYW5nZWQsIGlkKCkpKS0+cG9zdCgpOwogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2lnbmFsRGlzYWJsZU9mZmxvYWRBdWRpbygpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0RGlzYWJsZU9mZmxvYWRBdWRpbywgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdERpc2FibGVPZmZsb2FkQXVkaW8sIHRoaXMpKS0+cG9zdCgpOwogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2lnbmFsRW5hYmxlT2ZmbG9hZEF1ZGlvKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRFbmFibGVPZmZsb2FkQXVkaW8sIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRFbmFibGVPZmZsb2FkQXVkaW8sIHRoaXMpKS0+cG9zdCgpOwogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6cGF1c2UoKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIHRoaXMpKS0+cG9zdCgpOwogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6cmVzdW1lKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bWUsIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bWUsIHRoaXMpKS0+cG9zdCgpOwogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2V0VmlkZW9GcmFtZVJhdGUoZmxvYXQgZnBzKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldFZpZGVvRnJhbWVSYXRlLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0VmlkZW9GcmFtZVJhdGUsIHRoaXMpOwogICAgIG1zZy0+c2V0RmxvYXQoImZyYW1lLXJhdGUiLCBmcHMpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCi0vLyBDYWxsZWQgb24gYW55IHRocmVhZHMsIGV4Y2VwdCByZW5kZXJlcidzIHRocmVhZC4KLXN0YXR1c190IE51UGxheWVyOjpSZW5kZXJlcjo6Z2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1lZGlhVXMpIHsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgIGludDY0X3QgY3VycmVudFBvc2l0aW9uVXM7Ci0gICAgICAgIGlmIChnZXRDdXJyZW50UG9zaXRpb25JZlBhdXNlZF9sKCZjdXJyZW50UG9zaXRpb25VcykpIHsKLSAgICAgICAgICAgICptZWRpYVVzID0gY3VycmVudFBvc2l0aW9uVXM7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGdldEN1cnJlbnRQb3NpdGlvbkZyb21BbmNob3IobWVkaWFVcywgQUxvb3Blcjo6R2V0Tm93VXMoKSk7Ci19Ci0KLS8vIENhbGxlZCBvbiBvbmx5IHJlbmRlcmVyJ3MgdGhyZWFkLgotc3RhdHVzX3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpnZXRDdXJyZW50UG9zaXRpb25Pbkxvb3BlcihpbnQ2NF90ICptZWRpYVVzKSB7Ci0gICAgcmV0dXJuIGdldEN1cnJlbnRQb3NpdGlvbk9uTG9vcGVyKG1lZGlhVXMsIEFMb29wZXI6OkdldE5vd1VzKCkpOwotfQotCi0vLyBDYWxsZWQgb24gb25seSByZW5kZXJlcidzIHRocmVhZC4KLS8vIFNpbmNlIG1QYXVzZWQgYW5kIG1QYXVzZVBvc2l0aW9uTWVkaWFUaW1lVXMgYXJlIGNoYW5nZWQgb25seSBvbiByZW5kZXJlcidzCi0vLyB0aHJlYWQsIG5vIG5lZWQgdG8gYWNxdWlyZSBtTG9jay4KLXN0YXR1c190IE51UGxheWVyOjpSZW5kZXJlcjo6Z2V0Q3VycmVudFBvc2l0aW9uT25Mb29wZXIoCi0gICAgICAgIGludDY0X3QgKm1lZGlhVXMsIGludDY0X3Qgbm93VXMsIGJvb2wgYWxsb3dQYXN0UXVldWVkVmlkZW8pIHsKLSAgICBpbnQ2NF90IGN1cnJlbnRQb3NpdGlvblVzOwotICAgIGlmIChnZXRDdXJyZW50UG9zaXRpb25JZlBhdXNlZF9sKCZjdXJyZW50UG9zaXRpb25VcykpIHsKLSAgICAgICAgKm1lZGlhVXMgPSBjdXJyZW50UG9zaXRpb25VczsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICByZXR1cm4gZ2V0Q3VycmVudFBvc2l0aW9uRnJvbUFuY2hvcihtZWRpYVVzLCBub3dVcywgYWxsb3dQYXN0UXVldWVkVmlkZW8pOwotfQotCi0vLyBDYWxsZWQgZWl0aGVyIHdpdGggbUxvY2sgYWNxdWlyZWQgb3Igb24gcmVuZGVyZXIncyB0aHJlYWQuCi1ib29sIE51UGxheWVyOjpSZW5kZXJlcjo6Z2V0Q3VycmVudFBvc2l0aW9uSWZQYXVzZWRfbChpbnQ2NF90ICptZWRpYVVzKSB7Ci0gICAgaWYgKCFtUGF1c2VkIHx8IG1QYXVzZVBvc2l0aW9uTWVkaWFUaW1lVXMgPCAwbGwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAqbWVkaWFVcyA9IG1QYXVzZVBvc2l0aW9uTWVkaWFUaW1lVXM7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KIC8vIENhbGxlZCBvbiBhbnkgdGhyZWFkcy4KLXN0YXR1c190IE51UGxheWVyOjpSZW5kZXJlcjo6Z2V0Q3VycmVudFBvc2l0aW9uRnJvbUFuY2hvcigKLSAgICAgICAgaW50NjRfdCAqbWVkaWFVcywgaW50NjRfdCBub3dVcywgYm9vbCBhbGxvd1Bhc3RRdWV1ZWRWaWRlbykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZUxvY2spOwotICAgIGlmICghbUhhc0F1ZGlvICYmICFtSGFzVmlkZW8pIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgaWYgKG1BbmNob3JUaW1lTWVkaWFVcyA8IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgaW50NjRfdCBwb3NpdGlvblVzID0gKG5vd1VzIC0gbUFuY2hvclRpbWVSZWFsVXMpICsgbUFuY2hvclRpbWVNZWRpYVVzOwotCi0gICAgaWYgKG1QYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzICE9IC0xKSB7Ci0gICAgICAgIHBvc2l0aW9uVXMgLT0gKG5vd1VzIC0gbVBhdXNlU3RhcnRlZFRpbWVSZWFsVXMpOwotICAgIH0KLQotICAgIC8vIGxpbWl0IHBvc2l0aW9uIHRvIHRoZSBsYXN0IHF1ZXVlZCBtZWRpYSB0aW1lIChmb3IgdmlkZW8gb25seSBzdHJlYW0KLSAgICAvLyBwb3NpdGlvbiB3aWxsIGJlIGRpc2NyZXRlIGFzIHdlIGRvbid0IGtub3cgaG93IGxvbmcgZWFjaCBmcmFtZSBsYXN0cykKLSAgICBpZiAobUFuY2hvck1heE1lZGlhVXMgPj0gMCAmJiAhYWxsb3dQYXN0UXVldWVkVmlkZW8pIHsKLSAgICAgICAgaWYgKHBvc2l0aW9uVXMgPiBtQW5jaG9yTWF4TWVkaWFVcykgewotICAgICAgICAgICAgcG9zaXRpb25VcyA9IG1BbmNob3JNYXhNZWRpYVVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHBvc2l0aW9uVXMgPCBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzKSB7Ci0gICAgICAgIHBvc2l0aW9uVXMgPSBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzOwotICAgIH0KLQotICAgICptZWRpYVVzID0gKHBvc2l0aW9uVXMgPD0gMCkgPyAwIDogcG9zaXRpb25VczsKLSAgICByZXR1cm4gT0s7CitzdGF0dXNfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptZWRpYVVzKSB7CisgICAgcmV0dXJuIG1NZWRpYUNsb2NrLT5nZXRNZWRpYVRpbWUoQUxvb3Blcjo6R2V0Tm93VXMoKSwgbWVkaWFVcyk7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzZXRIYXNNZWRpYShib29sIGF1ZGlvKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lTG9jayk7Ci0gICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgIG1IYXNBdWRpbyA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUhhc1ZpZGVvID0gdHJ1ZTsKLSAgICB9Cit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6Y2xlYXJBdWRpb0ZpcnN0QW5jaG9yVGltZV9sKCkgeworICAgIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMgPSAtMTsKKyAgICBtTWVkaWFDbG9jay0+c2V0U3RhcnRpbmdUaW1lTWVkaWEoLTEpOwogfQogCi12b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c2V0QXVkaW9GaXJzdEFuY2hvclRpbWUoaW50NjRfdCBtZWRpYVVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lTG9jayk7Ci0gICAgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA9IG1lZGlhVXM7Ci19Ci0KLXZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZUlmTmVlZGVkKGludDY0X3QgbWVkaWFVcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtVGltZUxvY2spOwordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWRfbChpbnQ2NF90IG1lZGlhVXMpIHsKICAgICBpZiAobUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA9PSAtMSkgewogICAgICAgICBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzID0gbWVkaWFVczsKKyAgICAgICAgbU1lZGlhQ2xvY2stPnNldFN0YXJ0aW5nVGltZU1lZGlhKG1lZGlhVXMpOwogICAgIH0KIH0KIAotdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OnNldEFuY2hvclRpbWUoCi0gICAgICAgIGludDY0X3QgbWVkaWFVcywgaW50NjRfdCByZWFsVXMsIGludDY0X3QgbnVtRnJhbWVzV3JpdHRlbiwgYm9vbCByZXN1bWUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVRpbWVMb2NrKTsKLSAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSBtZWRpYVVzOwotICAgIG1BbmNob3JUaW1lUmVhbFVzID0gcmVhbFVzOwotICAgIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuID0gbnVtRnJhbWVzV3JpdHRlbjsKLSAgICBpZiAocmVzdW1lKSB7Ci0gICAgICAgIG1QYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzID0gLTE7Ci0gICAgfQordm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OmNsZWFyQW5jaG9yVGltZV9sKCkgeworICAgIG1NZWRpYUNsb2NrLT5jbGVhckFuY2hvcigpOworICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IC0xOworICAgIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuID0gLTE7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzZXRWaWRlb0xhdGVCeVVzKGludDY0X3QgbGF0ZVVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lTG9jayk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBtVmlkZW9MYXRlQnlVcyA9IGxhdGVVczsKIH0KIAogaW50NjRfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldFZpZGVvTGF0ZUJ5VXMoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lTG9jayk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gbVZpZGVvTGF0ZUJ5VXM7CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpzZXRQYXVzZVN0YXJ0ZWRUaW1lUmVhbFVzKGludDY0X3QgcmVhbFVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1UaW1lTG9jayk7Ci0gICAgbVBhdXNlU3RhcnRlZFRpbWVSZWFsVXMgPSByZWFsVXM7Ci19Ci0KIHN0YXR1c190IE51UGxheWVyOjpSZW5kZXJlcjo6b3BlbkF1ZGlvU2luaygKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCiAgICAgICAgIGJvb2wgb2ZmbG9hZE9ubHksCiAgICAgICAgIGJvb2wgaGFzVmlkZW8sCiAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICBib29sICppc09mZmxvYWRlZCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPcGVuQXVkaW9TaW5rLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0T3BlbkF1ZGlvU2luaywgdGhpcyk7CiAgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOwogICAgIG1zZy0+c2V0SW50MzIoIm9mZmxvYWQtb25seSIsIG9mZmxvYWRPbmx5KTsKICAgICBtc2ctPnNldEludDMyKCJoYXMtdmlkZW8iLCBoYXNWaWRlbyk7CkBAIC0zMjgsNyArMzY5LDcgQEAKIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6OmNsb3NlQXVkaW9TaW5rKCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDbG9zZUF1ZGlvU2luaywgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENsb3NlQXVkaW9TaW5rLCB0aGlzKTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKICAgICBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CkBAIC0zNTYsNyArMzk3LDcgQEAKICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigib2ZmbG9hZCIsIG9mZmxvYWRpbmdBdWRpbygpKTsKIAotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKIApAQCAtMzY1LDcgKzQwNiw3IEBACiAKICAgICAgICAgY2FzZSBrV2hhdENsb3NlQXVkaW9TaW5rOgogICAgICAgICB7Ci0gICAgICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKICAgICAgICAgICAgIG9uQ2xvc2VBdWRpb1NpbmsoKTsKQEAgLTM4MywxNCArNDI0LDE0IEBACiAKICAgICAgICAgY2FzZSBrV2hhdERyYWluQXVkaW9RdWV1ZToKICAgICAgICAgeworICAgICAgICAgICAgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKKwogICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOwotICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gbUF1ZGlvUXVldWVHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZHJhaW5HZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IGdldERyYWluR2VuZXJhdGlvbih0cnVlIC8qIGF1ZGlvICovKSkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyA9IGZhbHNlOwotCiAgICAgICAgICAgICBpZiAob25EcmFpbkF1ZGlvUXVldWUoKSkgewogICAgICAgICAgICAgICAgIHVpbnQzMl90IG51bUZyYW1lc1BsYXllZDsKICAgICAgICAgICAgICAgICBDSEVDS19FUShtQXVkaW9TaW5rLT5nZXRQb3NpdGlvbigmbnVtRnJhbWVzUGxheWVkKSwKQEAgLTQwNCwxMiArNDQ1LDEzIEBACiAgICAgICAgICAgICAgICAgaW50NjRfdCBkZWxheVVzID0KICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+bXNlY3NQZXJGcmFtZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAqIG51bUZyYW1lc1BlbmRpbmdQbGF5b3V0ICogMTAwMGxsOworICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tSYXRlID4gMS4wZikgeworICAgICAgICAgICAgICAgICAgICBkZWxheVVzIC89IG1QbGF5YmFja1JhdGU7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLy8gTGV0J3MgZ2l2ZSBpdCBtb3JlIGRhdGEgYWZ0ZXIgYWJvdXQgaGFsZiB0aGF0IHRpbWUKICAgICAgICAgICAgICAgICAvLyBoYXMgZWxhcHNlZC4KLSAgICAgICAgICAgICAgICAvLyBrV2hhdERyYWluQXVkaW9RdWV1ZSBpcyB1c2VkIGZvciBub24tb2ZmbG9hZGluZyBtb2RlLAotICAgICAgICAgICAgICAgIC8vIGFuZCBtTG9jayBpcyB1c2VkIG9ubHkgZm9yIG9mZmxvYWRpbmcgbW9kZS4gVGhlcmVmb3JlLAotICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gYWNxdWlyZSBtTG9jayBoZXJlLgorICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgICAgICAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKGRlbGF5VXMgLyAyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtNDE4LDggKzQ2MCw4IEBACiAgICAgICAgIGNhc2Uga1doYXREcmFpblZpZGVvUXVldWU6CiAgICAgICAgIHsKICAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKLSAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1WaWRlb1F1ZXVlR2VuZXJhdGlvbikgeworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImRyYWluR2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBnZXREcmFpbkdlbmVyYXRpb24oZmFsc2UgLyogYXVkaW8gKi8pKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTQyNywyMiArNDY5LDIwIEBACiAKICAgICAgICAgICAgIG9uRHJhaW5WaWRlb1F1ZXVlKCk7CiAKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgICAgICBwb3N0RHJhaW5WaWRlb1F1ZXVlX2woKTsKKyAgICAgICAgICAgIHBvc3REcmFpblZpZGVvUXVldWUoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBrV2hhdFBvc3REcmFpblZpZGVvUXVldWU6CiAgICAgICAgIHsKICAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKLSAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1WaWRlb1F1ZXVlR2VuZXJhdGlvbikgeworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImRyYWluR2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBnZXREcmFpbkdlbmVyYXRpb24oZmFsc2UgLyogYXVkaW8gKi8pKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZV9sKCk7CisgICAgICAgICAgICBwb3N0RHJhaW5WaWRlb1F1ZXVlKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC00NTgsMTUgKzQ5OCw2OSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIGtXaGF0Rmx1c2g6CisgICAgICAgIGNhc2Uga1doYXRDb25maWdQbGF5YmFjazoKICAgICAgICAgewotICAgICAgICAgICAgb25GbHVzaChtc2cpOworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSByYXRlOworICAgICAgICAgICAgcmVhZEZyb21BTWVzc2FnZShtc2csICZyYXRlKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uQ29uZmlnUGxheWJhY2socmF0ZSk7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIGtXaGF0QXVkaW9TaW5rQ2hhbmdlZDoKKyAgICAgICAgY2FzZSBrV2hhdEdldFBsYXliYWNrU2V0dGluZ3M6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG9uQXVkaW9TaW5rQ2hhbmdlZCgpOworICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CisgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CisgICAgICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSByYXRlID0gQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gb25HZXRQbGF5YmFja1NldHRpbmdzKCZyYXRlKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3cml0ZVRvQU1lc3NhZ2UocmVzcG9uc2UsIHJhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBrV2hhdENvbmZpZ1N5bmM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworICAgICAgICAgICAgQVZTeW5jU2V0dGluZ3Mgc3luYzsKKyAgICAgICAgICAgIGZsb2F0IHZpZGVvRnBzSGludDsKKyAgICAgICAgICAgIHJlYWRGcm9tQU1lc3NhZ2UobXNnLCAmc3luYywgJnZpZGVvRnBzSGludCk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBvbkNvbmZpZ1N5bmMoc3luYywgdmlkZW9GcHNIaW50KTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRHZXRTeW5jU2V0dGluZ3M6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCisgICAgICAgICAgICBBTE9HVigia1doYXRHZXRTeW5jU2V0dGluZ3MiKTsKKyAgICAgICAgICAgIEFWU3luY1NldHRpbmdzIHN5bmM7CisgICAgICAgICAgICBmbG9hdCB2aWRlb0ZwcyA9IC0xLmY7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBvbkdldFN5bmNTZXR0aW5ncygmc3luYywgJnZpZGVvRnBzKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3cml0ZVRvQU1lc3NhZ2UocmVzcG9uc2UsIHN5bmMsIHZpZGVvRnBzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Uga1doYXRGbHVzaDoKKyAgICAgICAgeworICAgICAgICAgICAgb25GbHVzaChtc2cpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtNTAyLDIxICs1OTYsMjEgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBrV2hhdEF1ZGlvT2ZmbG9hZFRlYXJEb3duOgorICAgICAgICBjYXNlIGtXaGF0QXVkaW9UZWFyRG93bjoKICAgICAgICAgewotICAgICAgICAgICAgb25BdWRpb09mZmxvYWRUZWFyRG93bihrRHVlVG9FcnJvcik7CisgICAgICAgICAgICBvbkF1ZGlvVGVhckRvd24oa0R1ZVRvRXJyb3IpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIGtXaGF0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0OgogICAgICAgICB7CiAgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZHJhaW5HZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKICAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1BdWRpb09mZmxvYWRQYXVzZVRpbWVvdXRHZW5lcmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiQXVkaW8gT2ZmbG9hZCB0ZWFyIGRvd24gZHVlIHRvIHBhdXNlIHRpbWVvdXQuIik7Ci0gICAgICAgICAgICBvbkF1ZGlvT2ZmbG9hZFRlYXJEb3duKGtEdWVUb1RpbWVvdXQpOworICAgICAgICAgICAgb25BdWRpb1RlYXJEb3duKGtEdWVUb1RpbWVvdXQpOwogICAgICAgICAgICAgbVdha2VMb2NrLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNTI4LDggKzYyMiw3IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpwb3N0RHJhaW5BdWRpb1F1ZXVlX2woaW50NjRfdCBkZWxheVVzKSB7Ci0gICAgaWYgKG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nIHx8IG1TeW5jUXVldWVzIHx8IG1QYXVzZWQKLSAgICAgICAgICAgIHx8IG9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgaWYgKG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nIHx8IG1TeW5jUXVldWVzIHx8IG1Vc2VBdWRpb0NhbGxiYWNrKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTUzOCwxOSArNjMxLDE5IEBACiAgICAgfQogCiAgICAgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmcgPSB0cnVlOwotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREcmFpbkF1ZGlvUXVldWUsIGlkKCkpOwotICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQXVkaW9RdWV1ZUdlbmVyYXRpb24pOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREcmFpbkF1ZGlvUXVldWUsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoImRyYWluR2VuZXJhdGlvbiIsIG1BdWRpb0RyYWluR2VuZXJhdGlvbik7CiAgICAgbXNnLT5wb3N0KGRlbGF5VXMpOwogfQogCi12b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6cHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnQoKSB7Ci0gICAgbUF1ZGlvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uID0gbUF1ZGlvUXVldWVHZW5lcmF0aW9uOwotICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbiA9IG1WaWRlb1F1ZXVlR2VuZXJhdGlvbjsKK3ZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydF9sKCkgeworICAgIG1BdWRpb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbiA9IG1BdWRpb0RyYWluR2VuZXJhdGlvbjsKKyAgICBtVmlkZW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPSBtVmlkZW9EcmFpbkdlbmVyYXRpb247CiB9CiAKLXZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZCgpIHsKLSAgICBpZiAobVZpZGVvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uID09IG1WaWRlb1F1ZXVlR2VuZXJhdGlvbiAmJgotICAgICAgICBtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPT0gbUF1ZGlvUXVldWVHZW5lcmF0aW9uKSB7Cit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6bm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWRfbCgpIHsKKyAgICBpZiAobVZpZGVvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uID09IG1WaWRlb0RyYWluR2VuZXJhdGlvbiAmJgorICAgICAgICBtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPT0gbUF1ZGlvRHJhaW5HZW5lcmF0aW9uKSB7CiAgICAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbiA9IC0xOwogICAgICAgICBtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPSAtMTsKIApAQCAtNTc4LDEzICs2NzEsMTUgQEAKIAogICAgICAgICBjYXNlIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpDQl9FVkVOVF9TVFJFQU1fRU5EOgogICAgICAgICB7CisgICAgICAgICAgICBBTE9HVigiQXVkaW9TaW5rOjpDQl9FVkVOVF9TVFJFQU1fRU5EIik7CiAgICAgICAgICAgICBtZS0+bm90aWZ5RU9TKHRydWUgLyogYXVkaW8gKi8sIEVSUk9SX0VORF9PRl9TVFJFQU0pOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpDQl9FVkVOVF9URUFSX0RPV046CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1lLT5ub3RpZnlBdWRpb09mZmxvYWRUZWFyRG93bigpOworICAgICAgICAgICAgQUxPR1YoIkF1ZGlvU2luazo6Q0JfRVZFTlRfVEVBUl9ET1dOIik7CisgICAgICAgICAgICBtZS0+bm90aWZ5QXVkaW9UZWFyRG93bigpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC01OTUsNyArNjkwLDcgQEAKIHNpemVfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmZpbGxBdWRpb0J1ZmZlcih2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIGlmICghb2ZmbG9hZGluZ0F1ZGlvKCkgfHwgbVBhdXNlZCkgeworICAgIGlmICghbVVzZUF1ZGlvQ2FsbGJhY2spIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC02MDMsMTMgKzY5OCwxMyBAQAogCiAgICAgc2l6ZV90IHNpemVDb3BpZWQgPSAwOwogICAgIGJvb2wgZmlyc3RFbnRyeSA9IHRydWU7CisgICAgUXVldWVFbnRyeSAqZW50cnk7ICAvLyB3aWxsIGJlIHZhbGlkIGFmdGVyIHdoaWxlIGxvb3AgaWYgaGFzRU9TIGlzIHNldC4KICAgICB3aGlsZSAoc2l6ZUNvcGllZCA8IHNpemUgJiYgIW1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgUXVldWVFbnRyeSAqZW50cnkgPSAmKm1BdWRpb1F1ZXVlLmJlZ2luKCk7CisgICAgICAgIGVudHJ5ID0gJiptQXVkaW9RdWV1ZS5iZWdpbigpOwogCiAgICAgICAgIGlmIChlbnRyeS0+bUJ1ZmZlciA9PSBOVUxMKSB7IC8vIEVPUwogICAgICAgICAgICAgaGFzRU9TID0gdHJ1ZTsKICAgICAgICAgICAgIG1BdWRpb1F1ZXVlLmVyYXNlKG1BdWRpb1F1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgZW50cnkgPSBOVUxMOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtNjE3LDggKzcxMiw4IEBACiAgICAgICAgICAgICBmaXJzdEVudHJ5ID0gZmFsc2U7CiAgICAgICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOwogICAgICAgICAgICAgQ0hFQ0soZW50cnktPm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKLSAgICAgICAgICAgIEFMT0dWKCJyZW5kZXJpbmcgYXVkaW8gYXQgbWVkaWEgdGltZSAlLjJmIHNlY3MiLCBtZWRpYVRpbWVVcyAvIDFFNik7Ci0gICAgICAgICAgICBzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZUlmTmVlZGVkKG1lZGlhVGltZVVzKTsKKyAgICAgICAgICAgIEFMT0dWKCJmaWxsQXVkaW9CdWZmZXI6IHJlbmRlcmluZyBhdWRpbyBhdCBtZWRpYSB0aW1lICUuMmYgc2VjcyIsIG1lZGlhVGltZVVzIC8gMUU2KTsKKyAgICAgICAgICAgIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWRfbChtZWRpYVRpbWVVcyk7CiAgICAgICAgIH0KIAogICAgICAgICBzaXplX3QgY29weSA9IGVudHJ5LT5tQnVmZmVyLT5zaXplKCkgLSBlbnRyeS0+bU9mZnNldDsKQEAgLTYzOCwzNCArNzMzLDk3IEBACiAgICAgICAgICAgICBlbnRyeSA9IE5VTEw7CiAgICAgICAgIH0KICAgICAgICAgc2l6ZUNvcGllZCArPSBjb3B5OwotICAgICAgICBub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZCgpOworCisgICAgICAgIG5vdGlmeUlmTWVkaWFSZW5kZXJpbmdTdGFydGVkX2woKTsKICAgICB9CiAKICAgICBpZiAobUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA+PSAwKSB7CiAgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgICAgICBzZXRBbmNob3JUaW1lKG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMsIG5vd1VzIC0gZ2V0UGxheWVkT3V0QXVkaW9EdXJhdGlvblVzKG5vd1VzKSk7CisgICAgICAgIGludDY0X3Qgbm93TWVkaWFVcyA9CisgICAgICAgICAgICBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzICsgZ2V0UGxheWVkT3V0QXVkaW9EdXJhdGlvblVzKG5vd1VzKTsKKyAgICAgICAgLy8gd2UgZG9uJ3Qga25vdyBob3cgbXVjaCBkYXRhIHdlIGFyZSBxdWV1ZWluZyBmb3Igb2ZmbG9hZGVkIHRyYWNrcy4KKyAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZUFuY2hvcihub3dNZWRpYVVzLCBub3dVcywgSU5UNjRfTUFYKTsKICAgICB9CiAKLSAgICAvLyB3ZSBkb24ndCBrbm93IGhvdyBtdWNoIGRhdGEgd2UgYXJlIHF1ZXVlaW5nIGZvciBvZmZsb2FkZWQgdHJhY2tzCi0gICAgbUFuY2hvck1heE1lZGlhVXMgPSAtMTsKKyAgICAvLyBmb3Igbm9uLW9mZmxvYWRlZCBhdWRpbywgd2UgbmVlZCB0byBjb21wdXRlIHRoZSBmcmFtZXMgd3JpdHRlbiBiZWNhdXNlCisgICAgLy8gdGhlcmUgaXMgbm8gRVZFTlRfU1RSRUFNX0VORCBub3RpZmljYXRpb24uIFRoZSBmcmFtZXMgd3JpdHRlbiBnaXZlcworICAgIC8vIGFuIGVzdGltYXRlIG9uIHRoZSBwZW5kaW5nIHBsYXllZCBvdXQgZHVyYXRpb24uCisgICAgaWYgKCFvZmZsb2FkaW5nQXVkaW8oKSkgeworICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiArPSBzaXplQ29waWVkIC8gbUF1ZGlvU2luay0+ZnJhbWVTaXplKCk7CisgICAgfQogCiAgICAgaWYgKGhhc0VPUykgewotICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcEF1ZGlvU2luaywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wQXVkaW9TaW5rLCB0aGlzKSktPnBvc3QoKTsKKyAgICAgICAgLy8gQXMgdGhlcmUgaXMgY3VycmVudGx5IG5vIEVWRU5UX1NUUkVBTV9FTkQgY2FsbGJhY2sgbm90aWZpY2F0aW9uIGZvcgorICAgICAgICAvLyBub24tb2ZmbG9hZGVkIGF1ZGlvIHRyYWNrcywgd2UgbmVlZCB0byBwb3N0IHRoZSBFT1Mgb3Vyc2VsdmVzLgorICAgICAgICBpZiAoIW9mZmxvYWRpbmdBdWRpbygpKSB7CisgICAgICAgICAgICBpbnQ2NF90IHBvc3RFT1NEZWxheVVzID0gMDsKKyAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rLT5uZWVkc1RyYWlsaW5nUGFkZGluZygpKSB7CisgICAgICAgICAgICAgICAgcG9zdEVPU0RlbGF5VXMgPSBnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25VcyhBTG9vcGVyOjpHZXROb3dVcygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJmaWxsQXVkaW9CdWZmZXI6IG5vdGlmeUVPUyAiCisgICAgICAgICAgICAgICAgICAgICJtTnVtRnJhbWVzV3JpdHRlbjoldSAgZmluYWxSZXN1bHQ6JWQgIHBvc3RFT1NEZWxheTolbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4sIGVudHJ5LT5tRmluYWxSZXN1bHQsIChsb25nIGxvbmcpcG9zdEVPU0RlbGF5VXMpOworICAgICAgICAgICAgbm90aWZ5RU9TKHRydWUgLyogYXVkaW8gKi8sIGVudHJ5LT5tRmluYWxSZXN1bHQsIHBvc3RFT1NEZWxheVVzKTsKKyAgICAgICAgfQogICAgIH0KLQogICAgIHJldHVybiBzaXplQ29waWVkOwogfQogCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6ZHJhaW5BdWRpb1F1ZXVlVW50aWxMYXN0RU9TKCkgeworICAgIExpc3Q8UXVldWVFbnRyeT46Oml0ZXJhdG9yIGl0ID0gbUF1ZGlvUXVldWUuYmVnaW4oKSwgaXRFT1MgPSBpdDsKKyAgICBib29sIGZvdW5kRU9TID0gZmFsc2U7CisgICAgd2hpbGUgKGl0ICE9IG1BdWRpb1F1ZXVlLmVuZCgpKSB7CisgICAgICAgIGludDMyX3QgZW9zOworICAgICAgICBRdWV1ZUVudHJ5ICplbnRyeSA9ICYqaXQrKzsKKyAgICAgICAgaWYgKGVudHJ5LT5tQnVmZmVyID09IE5VTEwKKyAgICAgICAgICAgICAgICB8fCAoZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+ZmluZEludDMyKCJlb3MiLCAmZW9zKSAmJiBlb3MgIT0gMCkpIHsKKyAgICAgICAgICAgIGl0RU9TID0gaXQ7CisgICAgICAgICAgICBmb3VuZEVPUyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZm91bmRFT1MpIHsKKyAgICAgICAgLy8gcG9zdCBhbGwgcmVwbGllcyBiZWZvcmUgRU9TIGFuZCBkcm9wIHRoZSBzYW1wbGVzCisgICAgICAgIGZvciAoaXQgPSBtQXVkaW9RdWV1ZS5iZWdpbigpOyBpdCAhPSBpdEVPUzsgaXQrKykgeworICAgICAgICAgICAgaWYgKGl0LT5tQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvLyBkZWxheSBkb2Vzbid0IG1hdHRlciBhcyB3ZSBkb24ndCBldmVuIGhhdmUgYW4gQXVkaW9UcmFjaworICAgICAgICAgICAgICAgIG5vdGlmeUVPUyh0cnVlIC8qIGF1ZGlvICovLCBpdC0+bUZpbmFsUmVzdWx0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXQtPm1Ob3RpZnlDb25zdW1lZC0+cG9zdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1BdWRpb1F1ZXVlLmVyYXNlKG1BdWRpb1F1ZXVlLmJlZ2luKCksIGl0RU9TKTsKKyAgICB9Cit9CisKIGJvb2wgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvbkRyYWluQXVkaW9RdWV1ZSgpIHsKKyAgICAvLyBUT0RPOiBUaGlzIGNhbGwgdG8gZ2V0UG9zaXRpb24gY2hlY2tzIGlmIEF1ZGlvVHJhY2sgaGFzIGJlZW4gY3JlYXRlZAorICAgIC8vIGluIEF1ZGlvU2luayBiZWZvcmUgZHJhaW5pbmcgYXVkaW8uIElmIEF1ZGlvVHJhY2sgZG9lc24ndCBleGlzdCwgdGhlbgorICAgIC8vIENIRUNLcyBvbiBnZXRQb3NpdGlvbiB3aWxsIGZhaWwuCisgICAgLy8gV2Ugc3RpbGwgbmVlZCB0byBmaWd1cmUgb3V0IHdoeSBBdWRpb1RyYWNrIGlzIG5vdCBjcmVhdGVkIHdoZW4KKyAgICAvLyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gT25lIHBvc3NpYmxlIHJlYXNvbiBjb3VsZCBiZSBsZWZ0b3ZlcgorICAgIC8vIGF1ZGlvLiBBbm90aGVyIHBvc3NpYmxlIHBsYWNlIGlzIHRvIGNoZWNrIHdoZXRoZXIgZGVjb2RlcgorICAgIC8vIGhhcyByZWNlaXZlZCBJTkZPX0ZPUk1BVF9DSEFOR0VEIGFzIHRoZSBmaXJzdCBidWZmZXIgc2luY2UKKyAgICAvLyBBdWRpb1NpbmsgaXMgb3BlbmVkIHRoZXJlLCBhbmQgcG9zc2libGUgaW50ZXJhY3Rpb25zIHdpdGggZmx1c2gKKyAgICAvLyBpbW1lZGlhdGVseSBhZnRlciBzdGFydC4gSW52ZXN0aWdhdGUgZXJyb3IgbWVzc2FnZQorICAgIC8vICJ2b3JiaXNfZHNwX3N5bnRoZXNpcyByZXR1cm5lZCAtMTM1IiwgYWxvbmcgd2l0aCBSVFNQLgogICAgIHVpbnQzMl90IG51bUZyYW1lc1BsYXllZDsKICAgICBpZiAobUF1ZGlvU2luay0+Z2V0UG9zaXRpb24oJm51bUZyYW1lc1BsYXllZCkgIT0gT0spIHsKKyAgICAgICAgLy8gV2hlbiBnZXRQb3NpdGlvbiBmYWlscywgcmVuZGVyZXIgd2lsbCBub3QgcmVzY2hlZHVsZSB0aGUgZHJhaW5pbmcKKyAgICAgICAgLy8gdW5sZXNzIG5ldyBzYW1wbGVzIGFyZSBxdWV1ZWQuCisgICAgICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyBFT1MgKG9yICJlb3MiIG1hcmtlciBmb3IgZGlzY29udGludWl0aWVzKSwgd2UgbmVlZAorICAgICAgICAvLyB0byBwb3N0IHRoZXNlIG5vdyBhcyBOdVBsYXllckRlY29kZXIgbWlnaHQgYmUgd2FpdGluZyBmb3IgaXQuCisgICAgICAgIGRyYWluQXVkaW9RdWV1ZVVudGlsTGFzdEVPUygpOworCisgICAgICAgIEFMT0dXKCJvbkRyYWluQXVkaW9RdWV1ZSgpOiBhdWRpbyBzaW5rIGlzIG5vdCByZWFkeSIpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisjaWYgMAogICAgIHNzaXplX3QgbnVtRnJhbWVzQXZhaWxhYmxlVG9Xcml0ZSA9CiAgICAgICAgIG1BdWRpb1NpbmstPmZyYW1lQ291bnQoKSAtIChtTnVtRnJhbWVzV3JpdHRlbiAtIG51bUZyYW1lc1BsYXllZCk7CiAKLSNpZiAwCiAgICAgaWYgKG51bUZyYW1lc0F2YWlsYWJsZVRvV3JpdGUgPT0gbUF1ZGlvU2luay0+ZnJhbWVDb3VudCgpKSB7CiAgICAgICAgIEFMT0dJKCJhdWRpbyBzaW5rIHVuZGVycnVuIik7CiAgICAgfSBlbHNlIHsKQEAgLTY3NCwxMCArODMyLDggQEAKICAgICB9CiAjZW5kaWYKIAotICAgIHNpemVfdCBudW1CeXRlc0F2YWlsYWJsZVRvV3JpdGUgPQotICAgICAgICBudW1GcmFtZXNBdmFpbGFibGVUb1dyaXRlICogbUF1ZGlvU2luay0+ZnJhbWVTaXplKCk7Ci0KLSAgICB3aGlsZSAobnVtQnl0ZXNBdmFpbGFibGVUb1dyaXRlID4gMCAmJiAhbUF1ZGlvUXVldWUuZW1wdHkoKSkgeworICAgIHVpbnQzMl90IHByZXZGcmFtZXNXcml0dGVuID0gbU51bUZyYW1lc1dyaXR0ZW47CisgICAgd2hpbGUgKCFtQXVkaW9RdWV1ZS5lbXB0eSgpKSB7CiAgICAgICAgIFF1ZXVlRW50cnkgKmVudHJ5ID0gJiptQXVkaW9RdWV1ZS5iZWdpbigpOwogCiAgICAgICAgIG1MYXN0QXVkaW9CdWZmZXJEcmFpbmVkID0gZW50cnktPm1CdWZmZXJPcmRpbmFsOwpAQCAtNzAyLDIyICs4NTgsMjcgQEAKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChlbnRyeS0+bU9mZnNldCA9PSAwKSB7CisgICAgICAgIC8vIGlnbm9yZSAwLXNpemVkIGJ1ZmZlciB3aGljaCBjb3VsZCBiZSBFT1MgbWFya2VyIHdpdGggbm8gZGF0YQorICAgICAgICBpZiAoZW50cnktPm1PZmZzZXQgPT0gMCAmJiBlbnRyeS0+bUJ1ZmZlci0+c2l6ZSgpID4gMCkgewogICAgICAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKICAgICAgICAgICAgIENIRUNLKGVudHJ5LT5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7Ci0gICAgICAgICAgICBBTE9HVigicmVuZGVyaW5nIGF1ZGlvIGF0IG1lZGlhIHRpbWUgJS4yZiBzZWNzIiwgbWVkaWFUaW1lVXMgLyAxRTYpOworICAgICAgICAgICAgQUxPR1YoIm9uRHJhaW5BdWRpb1F1ZXVlOiByZW5kZXJpbmcgYXVkaW8gYXQgbWVkaWEgdGltZSAlLjJmIHNlY3MiLAorICAgICAgICAgICAgICAgICAgICBtZWRpYVRpbWVVcyAvIDFFNik7CiAgICAgICAgICAgICBvbk5ld0F1ZGlvTWVkaWFUaW1lKG1lZGlhVGltZVVzKTsKICAgICAgICAgfQogCiAgICAgICAgIHNpemVfdCBjb3B5ID0gZW50cnktPm1CdWZmZXItPnNpemUoKSAtIGVudHJ5LT5tT2Zmc2V0OwotICAgICAgICBpZiAoY29weSA+IG51bUJ5dGVzQXZhaWxhYmxlVG9Xcml0ZSkgewotICAgICAgICAgICAgY29weSA9IG51bUJ5dGVzQXZhaWxhYmxlVG9Xcml0ZTsKLSAgICAgICAgfQogCi0gICAgICAgIHNzaXplX3Qgd3JpdHRlbiA9IG1BdWRpb1NpbmstPndyaXRlKGVudHJ5LT5tQnVmZmVyLT5kYXRhKCkgKyBlbnRyeS0+bU9mZnNldCwgY29weSk7CisgICAgICAgIHNzaXplX3Qgd3JpdHRlbiA9IG1BdWRpb1NpbmstPndyaXRlKGVudHJ5LT5tQnVmZmVyLT5kYXRhKCkgKyBlbnRyeS0+bU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weSwgZmFsc2UgLyogYmxvY2tpbmcgKi8pOwogICAgICAgICBpZiAod3JpdHRlbiA8IDApIHsKICAgICAgICAgICAgIC8vIEFuIGVycm9yIGluIEF1ZGlvU2luayB3cml0ZS4gUGVyaGFwcyB0aGUgQXVkaW9TaW5rIHdhcyBub3QgcHJvcGVybHkgb3BlbmVkLgotICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU2luayB3cml0ZSBlcnJvciglemQpIHdoZW4gd3JpdGluZyAlenUgYnl0ZXMiLCB3cml0dGVuLCBjb3B5KTsKKyAgICAgICAgICAgIGlmICh3cml0dGVuID09IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvU2luayB3cml0ZSB3b3VsZCBibG9jayB3aGVuIHdyaXRpbmcgJXp1IGJ5dGVzIiwgY29weSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBdWRpb1Npbmsgd3JpdGUgZXJyb3IoJXpkKSB3aGVuIHdyaXRpbmcgJXp1IGJ5dGVzIiwgd3JpdHRlbiwgY29weSk7CisgICAgICAgICAgICAgICAgbm90aWZ5QXVkaW9UZWFyRG93bigpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtNzI5LDczICs4OTAsOTggQEAKICAgICAgICAgICAgIGVudHJ5ID0gTlVMTDsKICAgICAgICAgfQogCi0gICAgICAgIG51bUJ5dGVzQXZhaWxhYmxlVG9Xcml0ZSAtPSB3cml0dGVuOwogICAgICAgICBzaXplX3QgY29waWVkRnJhbWVzID0gd3JpdHRlbiAvIG1BdWRpb1NpbmstPmZyYW1lU2l6ZSgpOwogICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiArPSBjb3BpZWRGcmFtZXM7CiAKLSAgICAgICAgbm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWQoKTsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIG5vdGlmeUlmTWVkaWFSZW5kZXJpbmdTdGFydGVkX2woKTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmICh3cml0dGVuICE9IChzc2l6ZV90KWNvcHkpIHsKICAgICAgICAgICAgIC8vIEEgc2hvcnQgY291bnQgd2FzIHJlY2VpdmVkIGZyb20gQXVkaW9TaW5rOjp3cml0ZSgpCiAgICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gQXVkaW9TaW5rIHdyaXRlIHNob3VsZCBibG9jayB1bnRpbCBleGFjdGx5IHRoZSBudW1iZXIgb2YgYnl0ZXMgYXJlIGRlbGl2ZXJlZC4KLSAgICAgICAgICAgIC8vIEJ1dCBpdCBtYXkgcmV0dXJuIHdpdGggYSBzaG9ydCBjb3VudCAod2l0aG91dCBhbiBlcnJvcikgd2hlbjoKKyAgICAgICAgICAgIC8vIEF1ZGlvU2luayB3cml0ZSBpcyBjYWxsZWQgaW4gbm9uLWJsb2NraW5nIG1vZGUuCisgICAgICAgICAgICAvLyBJdCBtYXkgcmV0dXJuIHdpdGggYSBzaG9ydCBjb3VudCB3aGVuOgogICAgICAgICAgICAgLy8KICAgICAgICAgICAgIC8vIDEpIFNpemUgdG8gYmUgY29waWVkIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBmcmFtZSBzaXplLiBXZSBjb25zaWRlciB0aGlzIGZhdGFsLgotICAgICAgICAgICAgLy8gMikgQXVkaW9TaW5rIGlzIGFuIEF1ZGlvQ2FjaGUgZm9yIGRhdGEgcmV0cmlldmFsLCBhbmQgdGhlIEF1ZGlvQ2FjaGUgaXMgZXhjZWVkZWQuCisgICAgICAgICAgICAvLyAyKSBUaGUgZGF0YSB0byBiZSBjb3BpZWQgZXhjZWVkcyB0aGUgYXZhaWxhYmxlIGJ1ZmZlciBpbiBBdWRpb1NpbmsuCisgICAgICAgICAgICAvLyAzKSBBbiBlcnJvciBvY2N1cnMgYW5kIGRhdGEgaGFzIGJlZW4gcGFydGlhbGx5IGNvcGllZCB0byB0aGUgYnVmZmVyIGluIEF1ZGlvU2luay4KKyAgICAgICAgICAgIC8vIDQpIEF1ZGlvU2luayBpcyBhbiBBdWRpb0NhY2hlIGZvciBkYXRhIHJldHJpZXZhbCwgYW5kIHRoZSBBdWRpb0NhY2hlIGlzIGV4Y2VlZGVkLgogCiAgICAgICAgICAgICAvLyAoQ2FzZSAxKQogICAgICAgICAgICAgLy8gTXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBmcmFtZSBzaXplLiAgSWYgaXQgaXMgbm90IGEgbXVsdGlwbGUgb2YgYSBmcmFtZSBzaXplLCBpdAogICAgICAgICAgICAgLy8gbmVlZHMgdG8gZmFpbCwgYXMgd2Ugc2hvdWxkIG5vdCBjYXJyeSBvdmVyIGZyYWN0aW9uYWwgZnJhbWVzIGJldHdlZW4gY2FsbHMuCiAgICAgICAgICAgICBDSEVDS19FUShjb3B5ICUgbUF1ZGlvU2luay0+ZnJhbWVTaXplKCksIDApOwogCi0gICAgICAgICAgICAvLyAoQ2FzZSAyKQorICAgICAgICAgICAgLy8gKENhc2UgMiwgMywgNCkKICAgICAgICAgICAgIC8vIFJldHVybiBlYXJseSB0byB0aGUgY2FsbGVyLgogICAgICAgICAgICAgLy8gQmV3YXJlIG9mIGNhbGxpbmcgaW1tZWRpYXRlbHkgYWdhaW4gYXMgdGhpcyBtYXkgYnVzeS1sb29wIGlmIHlvdSBhcmUgbm90IGNhcmVmdWwuCi0gICAgICAgICAgICBBTE9HVygiQXVkaW9TaW5rIHdyaXRlIHNob3J0IGZyYW1lIGNvdW50ICV6ZCA8ICV6dSIsIHdyaXR0ZW4sIGNvcHkpOworICAgICAgICAgICAgQUxPR1YoIkF1ZGlvU2luayB3cml0ZSBzaG9ydCBmcmFtZSBjb3VudCAlemQgPCAlenUiLCB3cml0dGVuLCBjb3B5KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQotICAgIG1BbmNob3JNYXhNZWRpYVVzID0KLSAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzICsKLSAgICAgICAgICAgICAgICAoaW50NjRfdCkobWF4KChsb25nIGxvbmcpbU51bUZyYW1lc1dyaXR0ZW4gLSBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbiwgMExMKQotICAgICAgICAgICAgICAgICAgICAgICAgKiAxMDAwTEwgKiBtQXVkaW9TaW5rLT5tc2Vjc1BlckZyYW1lKCkpOworICAgIGludDY0X3QgbWF4VGltZU1lZGlhOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgbWF4VGltZU1lZGlhID0KKyAgICAgICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyArCisgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KShtYXgoKGxvbmcgbG9uZyltTnVtRnJhbWVzV3JpdHRlbiAtIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuLCAwTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAxMDAwTEwgKiBtQXVkaW9TaW5rLT5tc2Vjc1BlckZyYW1lKCkpOworICAgIH0KKyAgICBtTWVkaWFDbG9jay0+dXBkYXRlTWF4VGltZU1lZGlhKG1heFRpbWVNZWRpYSk7CiAKLSAgICByZXR1cm4gIW1BdWRpb1F1ZXVlLmVtcHR5KCk7CisgICAgLy8gY2FsY3VsYXRlIHdoZXRoZXIgd2UgbmVlZCB0byByZXNjaGVkdWxlIGFub3RoZXIgd3JpdGUuCisgICAgYm9vbCByZXNjaGVkdWxlID0gIW1BdWRpb1F1ZXVlLmVtcHR5KCkKKyAgICAgICAgICAgICYmICghbVBhdXNlZAorICAgICAgICAgICAgICAgIHx8IHByZXZGcmFtZXNXcml0dGVuICE9IG1OdW1GcmFtZXNXcml0dGVuKTsgLy8gcGVybWl0IHBhdXNlIHRvIGZpbGwgYnVmZmVycworICAgIC8vQUxPR0QoInJlc2NoZWR1bGU6JWQgIGVtcHR5OiVkICBtUGF1c2VkOiVkICBwcmV2RnJhbWVzV3JpdHRlbjoldSAgbU51bUZyYW1lc1dyaXR0ZW46JXUiLAorICAgIC8vICAgICAgICByZXNjaGVkdWxlLCBtQXVkaW9RdWV1ZS5lbXB0eSgpLCBtUGF1c2VkLCBwcmV2RnJhbWVzV3JpdHRlbiwgbU51bUZyYW1lc1dyaXR0ZW4pOworICAgIHJldHVybiByZXNjaGVkdWxlOwogfQogCitpbnQ2NF90IE51UGxheWVyOjpSZW5kZXJlcjo6Z2V0RHVyYXRpb25Vc0lmUGxheWVkQXRTYW1wbGVSYXRlKHVpbnQzMl90IG51bUZyYW1lcykgeworICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IG9mZmxvYWRpbmdBdWRpbygpID8KKyAgICAgICAgICAgIG1DdXJyZW50T2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUgOiBtQ3VycmVudFBjbUluZm8ubVNhbXBsZVJhdGU7CisgICAgLy8gVE9ETzogcmVtb3ZlIHRoZSAoaW50MzJfdCkgY2FzdGluZyBiZWxvdyBhcyBpdCBtYXkgb3ZlcmZsb3cgYXQgMTIuNCBob3Vycy4KKyAgICByZXR1cm4gKGludDY0X3QpKChpbnQzMl90KW51bUZyYW1lcyAqIDEwMDAwMDBMTCAvIHNhbXBsZVJhdGUpOworfQorCisvLyBDYWxjdWxhdGUgZHVyYXRpb24gb2YgcGVuZGluZyBzYW1wbGVzIGlmIHBsYXllZCBhdCBub3JtYWwgcmF0ZSAoaS5lLiwgMS4wKS4KIGludDY0X3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSB7Ci0gICAgaW50NjRfdCB3cml0dGVuQXVkaW9EdXJhdGlvblVzID0KLSAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gKiAxMDAwTEwgKiBtQXVkaW9TaW5rLT5tc2Vjc1BlckZyYW1lKCk7CisgICAgaW50NjRfdCB3cml0dGVuQXVkaW9EdXJhdGlvblVzID0gZ2V0RHVyYXRpb25Vc0lmUGxheWVkQXRTYW1wbGVSYXRlKG1OdW1GcmFtZXNXcml0dGVuKTsKICAgICByZXR1cm4gd3JpdHRlbkF1ZGlvRHVyYXRpb25VcyAtIGdldFBsYXllZE91dEF1ZGlvRHVyYXRpb25Vcyhub3dVcyk7CiB9CiAKIGludDY0X3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpnZXRSZWFsVGltZVVzKGludDY0X3QgbWVkaWFUaW1lVXMsIGludDY0X3Qgbm93VXMpIHsKLSAgICBpbnQ2NF90IGN1cnJlbnRQb3NpdGlvblVzOwotICAgIGlmIChtUGF1c2VkIHx8IGdldEN1cnJlbnRQb3NpdGlvbk9uTG9vcGVyKAotICAgICAgICAgICAgJmN1cnJlbnRQb3NpdGlvblVzLCBub3dVcywgdHJ1ZSAvKiBhbGxvd1Bhc3RRdWV1ZWRWaWRlbyAqLykgIT0gT0spIHsKLSAgICAgICAgLy8gSWYgZmFpbGVkIHRvIGdldCBjdXJyZW50IHBvc2l0aW9uLCBlLmcuIGR1ZSB0byBhdWRpbyBjbG9jayBpcyBub3QgcmVhZHksIHRoZW4ganVzdAotICAgICAgICAvLyBwbGF5IG91dCB2aWRlbyBpbW1lZGlhdGVseSB3aXRob3V0IGRlbGF5LgorICAgIGludDY0X3QgcmVhbFVzOworICAgIGlmIChtTWVkaWFDbG9jay0+Z2V0UmVhbFRpbWVGb3IobWVkaWFUaW1lVXMsICZyZWFsVXMpICE9IE9LKSB7CisgICAgICAgIC8vIElmIGZhaWxlZCB0byBnZXQgY3VycmVudCBwb3NpdGlvbiwgZS5nLiBkdWUgdG8gYXVkaW8gY2xvY2sgaXMKKyAgICAgICAgLy8gbm90IHJlYWR5LCB0aGVuIGp1c3QgcGxheSBvdXQgdmlkZW8gaW1tZWRpYXRlbHkgd2l0aG91dCBkZWxheS4KICAgICAgICAgcmV0dXJuIG5vd1VzOwogICAgIH0KLSAgICByZXR1cm4gKG1lZGlhVGltZVVzIC0gY3VycmVudFBvc2l0aW9uVXMpICsgbm93VXM7CisgICAgcmV0dXJuIHJlYWxVczsKIH0KIAogdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om9uTmV3QXVkaW9NZWRpYVRpbWUoaW50NjRfdCBtZWRpYVRpbWVVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgLy8gVFJJQ0tZOiB2b3JiaXMgZGVjb2RlciBnZW5lcmF0ZXMgbXVsdGlwbGUgZnJhbWVzIHdpdGggdGhlIHNhbWUKICAgICAvLyB0aW1lc3RhbXAsIHNvIG9ubHkgdXBkYXRlIG9uIHRoZSBmaXJzdCBmcmFtZSB3aXRoIGEgZ2l2ZW4gdGltZXN0YW1wCiAgICAgaWYgKG1lZGlhVGltZVVzID09IG1BbmNob3JUaW1lTWVkaWFVcykgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWQobWVkaWFUaW1lVXMpOworICAgIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWRfbChtZWRpYVRpbWVVcyk7CiAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgc2V0QW5jaG9yVGltZSgKLSAgICAgICAgICAgIG1lZGlhVGltZVVzLCBub3dVcyArIGdldFBlbmRpbmdBdWRpb1BsYXlvdXREdXJhdGlvblVzKG5vd1VzKSwgbU51bUZyYW1lc1dyaXR0ZW4pOworICAgIGludDY0X3Qgbm93TWVkaWFVcyA9IG1lZGlhVGltZVVzIC0gZ2V0UGVuZGluZ0F1ZGlvUGxheW91dER1cmF0aW9uVXMobm93VXMpOworICAgIG1NZWRpYUNsb2NrLT51cGRhdGVBbmNob3Iobm93TWVkaWFVcywgbm93VXMsIG1lZGlhVGltZVVzKTsKKyAgICBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbiA9IG1OdW1GcmFtZXNXcml0dGVuOworICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IG1lZGlhVGltZVVzOwogfQogCi12b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6cG9zdERyYWluVmlkZW9RdWV1ZV9sKCkgeworLy8gQ2FsbGVkIHdpdGhvdXQgbUxvY2sgYWNxdWlyZWQuCit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6cG9zdERyYWluVmlkZW9RdWV1ZSgpIHsKICAgICBpZiAobURyYWluVmlkZW9RdWV1ZVBlbmRpbmcKLSAgICAgICAgICAgIHx8IG1TeW5jUXVldWVzCisgICAgICAgICAgICB8fCBnZXRTeW5jUXVldWVzKCkKICAgICAgICAgICAgIHx8IChtUGF1c2VkICYmIG1WaWRlb1NhbXBsZVJlY2VpdmVkKSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtODA2LDggKzk5Miw4IEBACiAKICAgICBRdWV1ZUVudHJ5ICZlbnRyeSA9ICptVmlkZW9RdWV1ZS5iZWdpbigpOwogCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERyYWluVmlkZW9RdWV1ZSwgaWQoKSk7Ci0gICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1WaWRlb1F1ZXVlR2VuZXJhdGlvbik7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERyYWluVmlkZW9RdWV1ZSwgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQzMigiZHJhaW5HZW5lcmF0aW9uIiwgZ2V0RHJhaW5HZW5lcmF0aW9uKGZhbHNlIC8qIGF1ZGlvICovKSk7CiAKICAgICBpZiAoZW50cnkubUJ1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgIC8vIEVPUyBkb2Vzbid0IGNhcnJ5IGEgdGltZXN0YW1wLgpAQCAtODI3LDE2ICsxMDEzLDE5IEBACiAgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXM7CiAgICAgICAgIENIRUNLKGVudHJ5Lm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKIAotICAgICAgICBpZiAobUFuY2hvclRpbWVNZWRpYVVzIDwgMCkgewotICAgICAgICAgICAgc2V0QW5jaG9yVGltZShtZWRpYVRpbWVVcywgbm93VXMpOwotICAgICAgICAgICAgbVBhdXNlUG9zaXRpb25NZWRpYVRpbWVVcyA9IG1lZGlhVGltZVVzOwotICAgICAgICAgICAgbUFuY2hvck1heE1lZGlhVXMgPSBtZWRpYVRpbWVVczsKLSAgICAgICAgICAgIHJlYWxUaW1lVXMgPSBub3dVczsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlYWxUaW1lVXMgPSBnZXRSZWFsVGltZVVzKG1lZGlhVGltZVVzLCBub3dVcyk7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgICAgICBpZiAobUFuY2hvclRpbWVNZWRpYVVzIDwgMCkgeworICAgICAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVBbmNob3IobWVkaWFUaW1lVXMsIG5vd1VzLCBtZWRpYVRpbWVVcyk7CisgICAgICAgICAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzID0gbWVkaWFUaW1lVXM7CisgICAgICAgICAgICAgICAgcmVhbFRpbWVVcyA9IG5vd1VzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZWFsVGltZVVzID0gZ2V0UmVhbFRpbWVVcyhtZWRpYVRpbWVVcywgbm93VXMpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmICghbUhhc0F1ZGlvKSB7Ci0gICAgICAgICAgICBtQW5jaG9yTWF4TWVkaWFVcyA9IG1lZGlhVGltZVVzICsgMTAwMDAwOyAvLyBzbW9vdGggb3V0IHZpZGVvcyA+PSAxMGZwcworICAgICAgICAgICAgLy8gc21vb3RoIG91dCB2aWRlb3MgPj0gMTBmcHMKKyAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVNYXhUaW1lTWVkaWEobWVkaWFUaW1lVXMgKyAxMDAwMDApOwogICAgICAgICB9CiAKICAgICAgICAgLy8gSGV1cmlzdGljcyB0byBoYW5kbGUgc2l0dWF0aW9uIHdoZW4gbWVkaWEgdGltZSBjaGFuZ2VkIHdpdGhvdXQgYQpAQCAtOTEzLDE4ICsxMTAyLDIxIEBACiAKICAgICAgICAgaWYgKHRvb0xhdGUpIHsKICAgICAgICAgICAgIEFMT0dWKCJ2aWRlbyBsYXRlIGJ5ICVsbGQgdXMgKCUuMmYgc2VjcykiLAotICAgICAgICAgICAgICAgICBtVmlkZW9MYXRlQnlVcywgbVZpZGVvTGF0ZUJ5VXMgLyAxRTYpOworICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1WaWRlb0xhdGVCeVVzLCBtVmlkZW9MYXRlQnlVcyAvIDFFNik7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQ2NF90IG1lZGlhVXMgPSAwOworICAgICAgICAgICAgbU1lZGlhQ2xvY2stPmdldE1lZGlhVGltZShyZWFsVGltZVVzLCAmbWVkaWFVcyk7CiAgICAgICAgICAgICBBTE9HVigicmVuZGVyaW5nIHZpZGVvIGF0IG1lZGlhIHRpbWUgJS4yZiBzZWNzIiwKICAgICAgICAgICAgICAgICAgICAgKG1GbGFncyAmIEZMQUdfUkVBTF9USU1FID8gcmVhbFRpbWVVcyA6Ci0gICAgICAgICAgICAgICAgICAgIChyZWFsVGltZVVzICsgbUFuY2hvclRpbWVNZWRpYVVzIC0gbUFuY2hvclRpbWVSZWFsVXMpKSAvIDFFNik7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhVXMpIC8gMUU2KTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIHNldFZpZGVvTGF0ZUJ5VXMoMCk7CiAgICAgICAgIGlmICghbVZpZGVvU2FtcGxlUmVjZWl2ZWQgJiYgIW1IYXNBdWRpbykgewogICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBmaXJzdCBmcmFtZSBhZnRlciBhIGZsdXNoIHdvbid0IGJlIHVzZWQgYXMgYW5jaG9yCiAgICAgICAgICAgICAvLyB3aGVuIHJlbmRlcmVyIGlzIGluIHBhdXNlZCBzdGF0ZSwgYmVjYXVzZSByZXN1bWUgY2FuIGhhcHBlbiBhbnkgdGltZSBhZnRlciBzZWVrLgotICAgICAgICAgICAgc2V0QW5jaG9yVGltZSgtMSwgLTEpOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIGNsZWFyQW5jaG9yVGltZV9sKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTk0MSw3ICsxMTMzLDggQEAKICAgICAgICAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgbm90aWZ5VmlkZW9SZW5kZXJpbmdTdGFydCgpOwogICAgICAgICB9Ci0gICAgICAgIG5vdGlmeUlmTWVkaWFSZW5kZXJpbmdTdGFydGVkKCk7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIG5vdGlmeUlmTWVkaWFSZW5kZXJpbmdTdGFydGVkX2woKTsKICAgICB9CiB9CiAKQEAgLTk1OSwxNSArMTE1MiwyMyBAQAogICAgIG5vdGlmeS0+cG9zdChkZWxheVVzKTsKIH0KIAotdm9pZCBOdVBsYXllcjo6UmVuZGVyZXI6Om5vdGlmeUF1ZGlvT2ZmbG9hZFRlYXJEb3duKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb09mZmxvYWRUZWFyRG93biwgaWQoKSkpLT5wb3N0KCk7Cit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6bm90aWZ5QXVkaW9UZWFyRG93bigpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0QXVkaW9UZWFyRG93biwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvblF1ZXVlQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgaW50MzJfdCBhdWRpbzsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmYXVkaW8pKTsKIAotICAgIHNldEhhc01lZGlhKGF1ZGlvKTsKKyAgICBpZiAoZHJvcEJ1ZmZlcklmU3RhbGUoYXVkaW8sIG1zZykpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChhdWRpbykgeworICAgICAgICBtSGFzQXVkaW8gPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1IYXNWaWRlbyA9IHRydWU7CisgICAgfQogCiAgICAgaWYgKG1IYXNWaWRlbykgewogICAgICAgICBpZiAobVZpZGVvU2NoZWR1bGVyID09IE5VTEwpIHsKQEAgLTk3NiwxMCArMTE3Nyw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoZHJvcEJ1ZmZlcldoaWxlRmx1c2hpbmcoYXVkaW8sIG1zZykpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQogICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImJ1ZmZlciIsICZidWZmZXIpKTsKIApAQCAtOTkzLDE1ICsxMTkwLDE2IEBACiAgICAgZW50cnkubUZpbmFsUmVzdWx0ID0gT0s7CiAgICAgZW50cnkubUJ1ZmZlck9yZGluYWwgPSArK21Ub3RhbEJ1ZmZlcnNRdWV1ZWQ7CiAKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIGlmIChhdWRpbykgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgICAgICBtQXVkaW9RdWV1ZS5wdXNoX2JhY2soZW50cnkpOwogICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woKTsKICAgICB9IGVsc2UgewogICAgICAgICBtVmlkZW9RdWV1ZS5wdXNoX2JhY2soZW50cnkpOwotICAgICAgICBwb3N0RHJhaW5WaWRlb1F1ZXVlX2woKTsKKyAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZSgpOwogICAgIH0KIAorICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgaWYgKCFtU3luY1F1ZXVlcyB8fCBtQXVkaW9RdWV1ZS5lbXB0eSgpIHx8IG1WaWRlb1F1ZXVlLmVtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTEwNTAsNyArMTI0OCw5IEBACiAgICAgfQogCiAgICAgaWYgKCFtVmlkZW9RdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIHBvc3REcmFpblZpZGVvUXVldWVfbCgpOworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZSgpOworICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgfQogfQogCkBAIC0xMDU4LDcgKzEyNTgsNyBAQAogICAgIGludDMyX3QgYXVkaW87CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvIiwgJmF1ZGlvKSk7CiAKLSAgICBpZiAoZHJvcEJ1ZmZlcldoaWxlRmx1c2hpbmcoYXVkaW8sIG1zZykpIHsKKyAgICBpZiAoZHJvcEJ1ZmZlcklmU3RhbGUoYXVkaW8sIG1zZykpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMTA2OSwxOSArMTI2OSwyMCBAQAogICAgIGVudHJ5Lm1PZmZzZXQgPSAwOwogICAgIGVudHJ5Lm1GaW5hbFJlc3VsdCA9IGZpbmFsUmVzdWx0OwogCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBpZiAoYXVkaW8pIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICAgICAgaWYgKG1BdWRpb1F1ZXVlLmVtcHR5KCkgJiYgbVN5bmNRdWV1ZXMpIHsKICAgICAgICAgICAgIHN5bmNRdWV1ZXNEb25lX2woKTsKICAgICAgICAgfQogICAgICAgICBtQXVkaW9RdWV1ZS5wdXNoX2JhY2soZW50cnkpOwogICAgICAgICBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woKTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAobVZpZGVvUXVldWUuZW1wdHkoKSAmJiBtU3luY1F1ZXVlcykgeworICAgICAgICBpZiAobVZpZGVvUXVldWUuZW1wdHkoKSAmJiBnZXRTeW5jUXVldWVzKCkpIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgICAgICAgICBzeW5jUXVldWVzRG9uZV9sKCk7CiAgICAgICAgIH0KICAgICAgICAgbVZpZGVvUXVldWUucHVzaF9iYWNrKGVudHJ5KTsKLSAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZV9sKCk7CisgICAgICAgIHBvc3REcmFpblZpZGVvUXVldWUoKTsKICAgICB9CiB9CiAKQEAgLTEwOTAsMzEgKzEyOTEsMjUgQEAKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmYXVkaW8pKTsKIAogICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1GbHVzaExvY2spOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgICAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gZmFsc2U7CiAgICAgICAgICAgICBub3RpZnlDb21wbGV0ZSA9IG1Ob3RpZnlDb21wbGV0ZUF1ZGlvOwogICAgICAgICAgICAgbU5vdGlmeUNvbXBsZXRlQXVkaW8gPSBmYWxzZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gZmFsc2U7CiAgICAgICAgICAgICBub3RpZnlDb21wbGV0ZSA9IG1Ob3RpZnlDb21wbGV0ZVZpZGVvOwogICAgICAgICAgICAgbU5vdGlmeUNvbXBsZXRlVmlkZW8gPSBmYWxzZTsKICAgICAgICAgfQotICAgIH0KIAotICAgIC8vIElmIHdlJ3JlIGN1cnJlbnRseSBzeW5jaW5nIHRoZSBxdWV1ZXMsIGkuZS4gZHJvcHBpbmcgYXVkaW8gd2hpbGUKLSAgICAvLyBhbGlnbmluZyB0aGUgZmlyc3QgYXVkaW8vdmlkZW8gYnVmZmVyIHRpbWVzIGFuZCBvbmx5IG9uZSBvZiB0aGUKLSAgICAvLyB0d28gcXVldWVzIGhhcyBkYXRhLCB3ZSBtYXkgc3RhcnZlIHRoYXQgcXVldWUgYnkgbm90IHJlcXVlc3RpbmcKLSAgICAvLyBtb3JlIGJ1ZmZlcnMgZnJvbSB0aGUgZGVjb2Rlci4gSWYgdGhlIG90aGVyIHNvdXJjZSB0aGVuIGVuY291bnRlcnMKLSAgICAvLyBhIGRpc2NvbnRpbnVpdHkgdGhhdCBsZWFkcyB0byBmbHVzaGluZywgd2UnbGwgbmV2ZXIgZmluZCB0aGUKLSAgICAvLyBjb3JyZXNwb25kaW5nIGRpc2NvbnRpbnVpdHkgb24gdGhlIG90aGVyIHF1ZXVlLgotICAgIC8vIFRoZXJlZm9yZSB3ZSdsbCBzdG9wIHN5bmNpbmcgdGhlIHF1ZXVlcyBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlbQotICAgIC8vIGlzIGZsdXNoZWQuCi0gICAgewotICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgIHN5bmNRdWV1ZXNEb25lX2woKTsKLSAgICAgICAgIHNldFBhdXNlU3RhcnRlZFRpbWVSZWFsVXMoLTEpOwotICAgICAgICAgc2V0QW5jaG9yVGltZSgtMSwgLTEpOworICAgICAgICAvLyBJZiB3ZSdyZSBjdXJyZW50bHkgc3luY2luZyB0aGUgcXVldWVzLCBpLmUuIGRyb3BwaW5nIGF1ZGlvIHdoaWxlCisgICAgICAgIC8vIGFsaWduaW5nIHRoZSBmaXJzdCBhdWRpby92aWRlbyBidWZmZXIgdGltZXMgYW5kIG9ubHkgb25lIG9mIHRoZQorICAgICAgICAvLyB0d28gcXVldWVzIGhhcyBkYXRhLCB3ZSBtYXkgc3RhcnZlIHRoYXQgcXVldWUgYnkgbm90IHJlcXVlc3RpbmcKKyAgICAgICAgLy8gbW9yZSBidWZmZXJzIGZyb20gdGhlIGRlY29kZXIuIElmIHRoZSBvdGhlciBzb3VyY2UgdGhlbiBlbmNvdW50ZXJzCisgICAgICAgIC8vIGEgZGlzY29udGludWl0eSB0aGF0IGxlYWRzIHRvIGZsdXNoaW5nLCB3ZSdsbCBuZXZlciBmaW5kIHRoZQorICAgICAgICAvLyBjb3JyZXNwb25kaW5nIGRpc2NvbnRpbnVpdHkgb24gdGhlIG90aGVyIHF1ZXVlLgorICAgICAgICAvLyBUaGVyZWZvcmUgd2UnbGwgc3RvcCBzeW5jaW5nIHRoZSBxdWV1ZXMgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZW0KKyAgICAgICAgLy8gaXMgZmx1c2hlZC4KKyAgICAgICAgc3luY1F1ZXVlc0RvbmVfbCgpOworICAgICAgICBjbGVhckFuY2hvclRpbWVfbCgpOwogICAgIH0KIAogICAgIEFMT0dWKCJmbHVzaGluZyAlcyIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwpAQCAtMTEyMywxMiArMTMxOCwxMSBAQAogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICAgICAgICAgIGZsdXNoUXVldWUoJm1BdWRpb1F1ZXVlKTsKIAotICAgICAgICAgICAgKyttQXVkaW9RdWV1ZUdlbmVyYXRpb247Ci0gICAgICAgICAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydCgpOworICAgICAgICAgICAgKyttQXVkaW9EcmFpbkdlbmVyYXRpb247CisgICAgICAgICAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydF9sKCk7CiAKLSAgICAgICAgICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgewotICAgICAgICAgICAgICAgIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lKC0xKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHRoZSBmcmFtZSBjb3VudCB3aWxsIGJlIHJlc2V0IGFmdGVyIGZsdXNoLgorICAgICAgICAgICAgY2xlYXJBdWRpb0ZpcnN0QW5jaG9yVGltZV9sKCk7CiAgICAgICAgIH0KIAogICAgICAgICBtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyA9IGZhbHNlOwpAQCAtMTEzNiwxOSArMTMzMCwzMiBAQAogICAgICAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKICAgICAgICAgICAgIG1BdWRpb1NpbmstPnBhdXNlKCk7CiAgICAgICAgICAgICBtQXVkaW9TaW5rLT5mbHVzaCgpOwotICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKKyAgICAgICAgICAgIGlmICghbVBhdXNlZCkgeworICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5wYXVzZSgpOworICAgICAgICAgICAgbUF1ZGlvU2luay0+Zmx1c2goKTsKKyAgICAgICAgICAgIC8vIENhbGwgc3RvcCgpIHRvIHNpZ25hbCB0byB0aGUgQXVkaW9TaW5rIHRvIGNvbXBsZXRlbHkgZmlsbCB0aGUKKyAgICAgICAgICAgIC8vIGludGVybmFsIGJ1ZmZlciBiZWZvcmUgcmVzdW1pbmcgcGxheWJhY2suCisgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdG9wKCk7CisgICAgICAgICAgICBpZiAoIW1QYXVzZWQpIHsKKyAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gPSAwOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgZmx1c2hRdWV1ZSgmbVZpZGVvUXVldWUpOwogCiAgICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gZmFsc2U7Ci0gICAgICAgICsrbVZpZGVvUXVldWVHZW5lcmF0aW9uOwogCiAgICAgICAgIGlmIChtVmlkZW9TY2hlZHVsZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgbVZpZGVvU2NoZWR1bGVyLT5yZXN0YXJ0KCk7CiAgICAgICAgIH0KIAotICAgICAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydCgpOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICArK21WaWRlb0RyYWluR2VuZXJhdGlvbjsKKyAgICAgICAgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnRfbCgpOwogICAgIH0KIAogICAgIG1WaWRlb1NhbXBsZVJlY2VpdmVkID0gZmFsc2U7CkBAIC0xMTc4LDIwICsxMzg1LDEyIEBACiAgICAgbm90aWZ5LT5wb3N0KCk7CiB9CiAKLWJvb2wgTnVQbGF5ZXI6OlJlbmRlcmVyOjpkcm9wQnVmZmVyV2hpbGVGbHVzaGluZygKK2Jvb2wgTnVQbGF5ZXI6OlJlbmRlcmVyOjpkcm9wQnVmZmVySWZTdGFsZSgKICAgICAgICAgYm9vbCBhdWRpbywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBib29sIGZsdXNoaW5nID0gZmFsc2U7CisgICAgaW50MzJfdCBxdWV1ZUdlbmVyYXRpb247CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInF1ZXVlR2VuZXJhdGlvbiIsICZxdWV1ZUdlbmVyYXRpb24pKTsKIAotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1GbHVzaExvY2spOwotICAgICAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgICAgIGZsdXNoaW5nID0gbUZsdXNoaW5nQXVkaW87Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmbHVzaGluZyA9IG1GbHVzaGluZ1ZpZGVvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFmbHVzaGluZykgeworICAgIGlmIChxdWV1ZUdlbmVyYXRpb24gPT0gZ2V0UXVldWVHZW5lcmF0aW9uKGF1ZGlvKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC0xMjA5LDcgKzE0MDgsMTAgQEAKICAgICB9CiAgICAgQ0hFQ0soIW1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nKTsKICAgICBtTnVtRnJhbWVzV3JpdHRlbiA9IDA7Ci0gICAgbUFuY2hvck51bUZyYW1lc1dyaXR0ZW4gPSAtMTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuID0gLTE7CisgICAgfQogICAgIHVpbnQzMl90IHdyaXR0ZW47CiAgICAgaWYgKG1BdWRpb1NpbmstPmdldEZyYW1lc1dyaXR0ZW4oJndyaXR0ZW4pID09IE9LKSB7CiAgICAgICAgIG1OdW1GcmFtZXNXcml0dGVuID0gd3JpdHRlbjsKQEAgLTEyMTksNDAgKzE0MjEsMzMgQEAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvbkRpc2FibGVPZmZsb2FkQXVkaW8oKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBtRmxhZ3MgJj0gfkZMQUdfT0ZGTE9BRF9BVURJTzsKLSAgICArK21BdWRpb1F1ZXVlR2VuZXJhdGlvbjsKKyAgICArK21BdWRpb0RyYWluR2VuZXJhdGlvbjsKKyAgICBpZiAobUF1ZGlvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uICE9IC0xKSB7CisgICAgICAgIHByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0X2woKTsKKyAgICB9CiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJlbmRlcmVyOjpvbkVuYWJsZU9mZmxvYWRBdWRpbygpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIG1GbGFncyB8PSBGTEFHX09GRkxPQURfQVVESU87Ci0gICAgKyttQXVkaW9RdWV1ZUdlbmVyYXRpb247CisgICAgKyttQXVkaW9EcmFpbkdlbmVyYXRpb247CisgICAgaWYgKG1BdWRpb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbiAhPSAtMSkgeworICAgICAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydF9sKCk7CisgICAgfQogfQogCiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6b25QYXVzZSgpIHsKICAgICBpZiAobVBhdXNlZCkgewotICAgICAgICBBTE9HVygiUmVuZGVyZXI6Om9uUGF1c2UoKSBjYWxsZWQgd2hpbGUgYWxyZWFkeSBwYXVzZWQhIik7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgaW50NjRfdCBjdXJyZW50UG9zaXRpb25VczsKLSAgICBpbnQ2NF90IHBhdXNlUG9zaXRpb25NZWRpYVRpbWVVczsKLSAgICBpZiAoZ2V0Q3VycmVudFBvc2l0aW9uRnJvbUFuY2hvcigKLSAgICAgICAgICAgICZjdXJyZW50UG9zaXRpb25VcywgQUxvb3Blcjo6R2V0Tm93VXMoKSkgPT0gT0spIHsKLSAgICAgICAgcGF1c2VQb3NpdGlvbk1lZGlhVGltZVVzID0gY3VycmVudFBvc2l0aW9uVXM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gU2V0IHBhdXNlZCBwb3NpdGlvbiB0byAtMSAodW5hdmFpbGFiZSkgaWYgd2UgZG9uJ3QgaGF2ZSBhbmNob3IgdGltZQotICAgICAgICAvLyBUaGlzIGNvdWxkIGhhcHBlbiBpZiBjbGllbnQgZG9lcyBhIHNlZWtUbygpIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5Ci0gICAgICAgIC8vIHBhdXNlKCkuIFJlbmRlcmVyIHdpbGwgYmUgZmx1c2hlZCB3aXRoIGFuY2hvciB0aW1lIGNsZWFyZWQuIFdlIGRvbid0Ci0gICAgICAgIC8vIHdhbnQgdG8gbGVhdmUgc3RhbGUgdmFsdWUgaW4gbVBhdXNlUG9zaXRpb25NZWRpYVRpbWVVcy4KLSAgICAgICAgcGF1c2VQb3NpdGlvbk1lZGlhVGltZVVzID0gLTE7Ci0gICAgfQorCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICBtUGF1c2VQb3NpdGlvbk1lZGlhVGltZVVzID0gcGF1c2VQb3NpdGlvbk1lZGlhVGltZVVzOwotICAgICAgICArK21BdWRpb1F1ZXVlR2VuZXJhdGlvbjsKLSAgICAgICAgKyttVmlkZW9RdWV1ZUdlbmVyYXRpb247Ci0gICAgICAgIHByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0KCk7CisgICAgICAgIC8vIHdlIGRvIG5vdCBpbmNyZW1lbnQgYXVkaW8gZHJhaW4gZ2VuZXJhdGlvbiBzbyB0aGF0IHdlIGZpbGwgYXVkaW8gYnVmZmVyIGR1cmluZyBwYXVzZS4KKyAgICAgICAgKyttVmlkZW9EcmFpbkdlbmVyYXRpb247CisgICAgICAgIHByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0X2woKTsKICAgICAgICAgbVBhdXNlZCA9IHRydWU7Ci0gICAgICAgIHNldFBhdXNlU3RhcnRlZFRpbWVSZWFsVXMoQUxvb3Blcjo6R2V0Tm93VXMoKSk7CisgICAgICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUoMC4wKTsKICAgICB9CiAKICAgICBtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyA9IGZhbHNlOwpAQCAtMTI2Myw3ICsxNDU4LDcgQEAKICAgICAgICAgc3RhcnRBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQoKTsKICAgICB9CiAKLSAgICBBTE9HVigibm93IHBhdXNlZCBhdWRpbyBxdWV1ZSBoYXMgJWQgZW50cmllcywgdmlkZW8gaGFzICVkIGVudHJpZXMiLAorICAgIEFMT0dWKCJub3cgcGF1c2VkIGF1ZGlvIHF1ZXVlIGhhcyAlenUgZW50cmllcywgdmlkZW8gaGFzICV6dSBlbnRyaWVzIiwKICAgICAgICAgICBtQXVkaW9RdWV1ZS5zaXplKCksIG1WaWRlb1F1ZXVlLnNpemUoKSk7CiB9CiAKQEAgLTEyNzQsMjQgKzE0NjksMzAgQEAKIAogICAgIGlmIChtSGFzQXVkaW8pIHsKICAgICAgICAgY2FuY2VsQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCk7Ci0gICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIG5vdGlmeUF1ZGlvVGVhckRvd24oKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbVBhdXNlZCA9IGZhbHNlOwotICAgIGlmIChtUGF1c2VTdGFydGVkVGltZVJlYWxVcyAhPSAtMSkgewotICAgICAgICBpbnQ2NF90IG5ld0FuY2hvclJlYWxVcyA9Ci0gICAgICAgICAgICBtQW5jaG9yVGltZVJlYWxVcyArIEFMb29wZXI6OkdldE5vd1VzKCkgLSBtUGF1c2VTdGFydGVkVGltZVJlYWxVczsKLSAgICAgICAgc2V0QW5jaG9yVGltZSgKLSAgICAgICAgICAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMsIG5ld0FuY2hvclJlYWxVcywgbUFuY2hvck51bUZyYW1lc1dyaXR0ZW4sIHRydWUgLyogcmVzdW1lICovKTsKLSAgICB9CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICBtUGF1c2VkID0gZmFsc2U7CiAKLSAgICBpZiAoIW1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKCk7CisgICAgICAgIC8vIGNvbmZpZ3VyZSBhdWRpb3NpbmsgYXMgd2UgZGlkIG5vdCBkbyBpdCB3aGVuIHBhdXNpbmcKKyAgICAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCAmJiBtQXVkaW9TaW5rLT5yZWFkeSgpKSB7CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrU2V0dGluZ3MpOworICAgICAgICB9CisKKyAgICAgICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tSYXRlKTsKKworICAgICAgICBpZiAoIW1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWVfbCgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKCFtVmlkZW9RdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIHBvc3REcmFpblZpZGVvUXVldWVfbCgpOworICAgICAgICBwb3N0RHJhaW5WaWRlb1F1ZXVlKCk7CiAgICAgfQogfQogCkBAIC0xMzAyLDYgKzE1MDMsMjEgQEAKICAgICBtVmlkZW9TY2hlZHVsZXItPmluaXQoZnBzKTsKIH0KIAoraW50MzJfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldFF1ZXVlR2VuZXJhdGlvbihib29sIGF1ZGlvKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gKGF1ZGlvID8gbUF1ZGlvUXVldWVHZW5lcmF0aW9uIDogbVZpZGVvUXVldWVHZW5lcmF0aW9uKTsKK30KKworaW50MzJfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldERyYWluR2VuZXJhdGlvbihib29sIGF1ZGlvKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gKGF1ZGlvID8gbUF1ZGlvRHJhaW5HZW5lcmF0aW9uIDogbVZpZGVvRHJhaW5HZW5lcmF0aW9uKTsKK30KKworYm9vbCBOdVBsYXllcjo6UmVuZGVyZXI6OmdldFN5bmNRdWV1ZXMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbVN5bmNRdWV1ZXM7Cit9CisKIC8vIFRPRE86IFJlbW92ZSB1bm5lY2Vzc2FyeSBjYWxscyB0byBnZXRQbGF5ZWRPdXRBdWRpb0R1cmF0aW9uVXMoKQogLy8gYXMgaXQgYWNxdWlyZXMgbG9ja3MgYW5kIG1heSBxdWVyeSB0aGUgYXVkaW8gZHJpdmVyLgogLy8KQEAgLTEzMDksNiArMTUyNSw3IEBACiAvLyBhY2Nlc3NpbmcgZ2V0VGltZXN0YW1wKCkgb3IgZ2V0UG9zaXRpb24oKSBldmVyeSB0aW1lIGEgZGF0YSBidWZmZXIgd2l0aAogLy8gYSBtZWRpYSB0aW1lIGlzIHJlY2VpdmVkLgogLy8KKy8vIENhbGN1bGF0ZSBkdXJhdGlvbiBvZiBwbGF5ZWQgc2FtcGxlcyBpZiBwbGF5ZWQgYXQgbm9ybWFsIHJhdGUgKGkuZS4sIDEuMCkuCiBpbnQ2NF90IE51UGxheWVyOjpSZW5kZXJlcjo6Z2V0UGxheWVkT3V0QXVkaW9EdXJhdGlvblVzKGludDY0X3Qgbm93VXMpIHsKICAgICB1aW50MzJfdCBudW1GcmFtZXNQbGF5ZWQ7CiAgICAgaW50NjRfdCBudW1GcmFtZXNQbGF5ZWRBdDsKQEAgLTEzNDMsMTIgKzE1NjAsMTEgQEAKICAgICAgICAgQ0hFQ0tfRVEocmVzLCAoc3RhdHVzX3QpT0spOwogICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdCA9IG5vd1VzOwogICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdCArPSAxMDAwTEwgKiBtQXVkaW9TaW5rLT5sYXRlbmN5KCkgLyAyOyAvKiBYWFggKi8KLSAgICAgICAgLy9BTE9HRCgiZ2V0UG9zaXRpb246ICVkICVsbGQiLCBudW1GcmFtZXNQbGF5ZWQsIG51bUZyYW1lc1BsYXllZEF0KTsKKyAgICAgICAgLy9BTE9HRCgiZ2V0UG9zaXRpb246ICV1ICVsbGQiLCBudW1GcmFtZXNQbGF5ZWQsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXQpOwogICAgIH0KIAotICAgIC8vIFRPRE86IHJlbW92ZSB0aGUgKGludDMyX3QpIGNhc3RpbmcgYmVsb3cgYXMgaXQgbWF5IG92ZXJmbG93IGF0IDEyLjQgaG91cnMuCiAgICAgLy9DSEVDS19FUShudW1GcmFtZXNQbGF5ZWQgJiAoMSA8PCAzMSksIDApOyAgLy8gY2FuJ3QgYmUgbmVnYXRpdmUgdW50aWwgMTIuNCBocnMsIHRlc3QKLSAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSAoaW50NjRfdCkoKGludDMyX3QpbnVtRnJhbWVzUGxheWVkICogMTAwMExMICogbUF1ZGlvU2luay0+bXNlY3NQZXJGcmFtZSgpKQorICAgIGludDY0X3QgZHVyYXRpb25VcyA9IGdldER1cmF0aW9uVXNJZlBsYXllZEF0U2FtcGxlUmF0ZShudW1GcmFtZXNQbGF5ZWQpCiAgICAgICAgICAgICArIG5vd1VzIC0gbnVtRnJhbWVzUGxheWVkQXQ7CiAgICAgaWYgKGR1cmF0aW9uVXMgPCAwKSB7CiAgICAgICAgIC8vIE9jY3VycyB3aGVuIG51bUZyYW1lc1BsYXllZCBwb3NpdGlvbiBpcyB2ZXJ5IHNtYWxsIGFuZCB0aGUgZm9sbG93aW5nOgpAQCAtMTM2NiwyMyArMTU4MiwyMiBAQAogICAgIHJldHVybiBkdXJhdGlvblVzOwogfQogCi12b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6b25BdWRpb09mZmxvYWRUZWFyRG93bihBdWRpb09mZmxvYWRUZWFyRG93blJlYXNvbiByZWFzb24pIHsKLSAgICBpZiAobUF1ZGlvT2ZmbG9hZFRvcm5Eb3duKSB7Cit2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6b25BdWRpb1RlYXJEb3duKEF1ZGlvVGVhckRvd25SZWFzb24gcmVhc29uKSB7CisgICAgaWYgKG1BdWRpb1Rvcm5Eb3duKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgbUF1ZGlvT2ZmbG9hZFRvcm5Eb3duID0gdHJ1ZTsKKyAgICBtQXVkaW9Ub3JuRG93biA9IHRydWU7CiAKICAgICBpbnQ2NF90IGN1cnJlbnRQb3NpdGlvblVzOwotICAgIGlmIChnZXRDdXJyZW50UG9zaXRpb25Pbkxvb3BlcigmY3VycmVudFBvc2l0aW9uVXMpICE9IE9LKSB7Ci0gICAgICAgIGN1cnJlbnRQb3NpdGlvblVzID0gMDsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgaWYgKGdldEN1cnJlbnRQb3NpdGlvbigmY3VycmVudFBvc2l0aW9uVXMpID09IE9LKSB7CisgICAgICAgIG5vdGlmeS0+c2V0SW50NjQoInBvc2l0aW9uVXMiLCBjdXJyZW50UG9zaXRpb25Vcyk7CiAgICAgfQogCiAgICAgbUF1ZGlvU2luay0+c3RvcCgpOwogICAgIG1BdWRpb1NpbmstPmZsdXNoKCk7CiAKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0QXVkaW9PZmZsb2FkVGVhckRvd24pOwotICAgIG5vdGlmeS0+c2V0SW50NjQoInBvc2l0aW9uVXMiLCBjdXJyZW50UG9zaXRpb25Vcyk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0QXVkaW9UZWFyRG93bik7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigicmVhc29uIiwgcmVhc29uKTsKICAgICBub3RpZnktPnBvc3QoKTsKIH0KQEAgLTEzOTAsOCArMTYwNSw4IEBACiB2b2lkIE51UGxheWVyOjpSZW5kZXJlcjo6c3RhcnRBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQoKSB7CiAgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7CiAgICAgICAgIG1XYWtlTG9jay0+YWNxdWlyZSgpOwotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0LCBpZCgpKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1BdWRpb09mZmxvYWRQYXVzZVRpbWVvdXRHZW5lcmF0aW9uKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCwgdGhpcyk7CisgICAgICAgIG1zZy0+c2V0SW50MzIoImRyYWluR2VuZXJhdGlvbiIsIG1BdWRpb09mZmxvYWRQYXVzZVRpbWVvdXRHZW5lcmF0aW9uKTsKICAgICAgICAgbXNnLT5wb3N0KGtPZmZsb2FkUGF1c2VNYXhVcyk7CiAgICAgfQogfQpAQCAtMTQ3NSwxOCArMTY5MCwyMyBAQAogICAgICAgICAgICAgb2ZmbG9hZEZsYWdzICY9IH5BVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUjsKICAgICAgICAgICAgIGF1ZGlvU2lua0NoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKKwogICAgICAgICAgICAgZXJyID0gbUF1ZGlvU2luay0+b3BlbigKICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIDggLyogYnVmZmVyQ291bnQgKi8sCisgICAgICAgICAgICAgICAgICAgIDAgLyogYnVmZmVyQ291bnQgLSB1bnVzZWQgKi8sCiAgICAgICAgICAgICAgICAgICAgICZOdVBsYXllcjo6UmVuZGVyZXI6OkF1ZGlvU2lua0NhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICB0aGlzLAogICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3Qpb2ZmbG9hZEZsYWdzLAogICAgICAgICAgICAgICAgICAgICAmb2ZmbG9hZEluZm8pOwogCiAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbUF1ZGlvU2luay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1NldHRpbmdzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwbGF5YmFjayBpcyBvZmZsb2FkZWQgdG8gaC93LCB3ZSBwYXNzCiAgICAgICAgICAgICAgICAgLy8gdGhlIEhBTCBzb21lIG1ldGFkYXRhIGluZm9ybWF0aW9uLgogICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcyBmb3IgUENNIGJlY2F1c2UgaXQKQEAgLTE0OTQsNyArMTcxNCw5IEBACiAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHJlYWNoaW5nIHRoZSBoYXJkd2FyZS4KICAgICAgICAgICAgICAgICAvLyBUT0RPCiAgICAgICAgICAgICAgICAgbUN1cnJlbnRPZmZsb2FkSW5mbyA9IG9mZmxvYWRJbmZvOwotICAgICAgICAgICAgICAgIGVyciA9IG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgaWYgKCFtUGF1c2VkKSB7IC8vIGZvciBwcmV2aWV3IG1vZGUsIGRvbid0IHN0YXJ0IGlmIHBhdXNlZAorICAgICAgICAgICAgICAgICAgICBlcnIgPSBtQXVkaW9TaW5rLT5zdGFydCgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HVl9JRihlcnIgPT0gT0ssICJvcGVuQXVkaW9TaW5rOiBvZmZsb2FkIHN1Y2NlZWRlZCIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMTUwMyw2ICsxNzI1LDkgQEAKICAgICAgICAgICAgICAgICBvbkRpc2FibGVPZmZsb2FkQXVkaW8oKTsKICAgICAgICAgICAgICAgICBtQ3VycmVudE9mZmxvYWRJbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKICAgICAgICAgICAgICAgICBBTE9HVigib3BlbkF1ZGlvU2luazogb2ZmbG9hZCBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2sgPSB0cnVlOyAgLy8gb2ZmbG9hZCBtb2RlIHRyYW5zZmVycyBkYXRhIHRocm91Z2ggY2FsbGJhY2sKKyAgICAgICAgICAgICAgICArK21BdWRpb0RyYWluR2VuZXJhdGlvbjsgIC8vIGRpc2NhcmQgcGVuZGluZyBrV2hhdERyYWluQXVkaW9RdWV1ZSBtZXNzYWdlLgogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTUyNywyOSArMTc1Miw0NyBAQAogICAgICAgICBhdWRpb1NpbmtDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKICAgICAgICAgbUN1cnJlbnRPZmZsb2FkSW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgICAgIC8vIE5vdGU6IEl0IGlzIHBvc3NpYmxlIHRvIHNldCB1cCB0aGUgY2FsbGJhY2ssIGJ1dCBub3QgdXNlIGl0IHRvIHNlbmQgYXVkaW8gZGF0YS4KKyAgICAgICAgLy8gVGhpcyByZXF1aXJlcyBhIGZpeCBpbiBBdWRpb1NpbmsgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSB0cmFuc2ZlciBtb2RlLgorICAgICAgICBtVXNlQXVkaW9DYWxsYmFjayA9IGdldFVzZUF1ZGlvQ2FsbGJhY2tTZXR0aW5nKCk7CisgICAgICAgIGlmIChtVXNlQXVkaW9DYWxsYmFjaykgeworICAgICAgICAgICAgKyttQXVkaW9EcmFpbkdlbmVyYXRpb247ICAvLyBkaXNjYXJkIHBlbmRpbmcga1doYXREcmFpbkF1ZGlvUXVldWUgbWVzc2FnZS4KKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbXB1dGUgdGhlIGRlc2lyZWQgYnVmZmVyIHNpemUuCisgICAgICAgIC8vIEZvciBjYWxsYmFjayBtb2RlLCB0aGUgYW1vdW50IG9mIHRpbWUgYmVmb3JlIHdha2V1cCBpcyBhYm91dCBoYWxmIHRoZSBidWZmZXIgc2l6ZS4KKyAgICAgICAgY29uc3QgdWludDMyX3QgZnJhbWVDb3VudCA9CisgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYW1wbGVSYXRlICogZ2V0QXVkaW9TaW5rUGNtTXNTZXR0aW5nKCkgLyAxMDAwOworCiAgICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NpbmstPm9wZW4oCiAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAotICAgICAgICAgICAgICAgICAgICA4IC8qIGJ1ZmZlckNvdW50ICovLAorICAgICAgICAgICAgICAgICAgICAwIC8qIGJ1ZmZlckNvdW50IC0gdW51c2VkICovLAorICAgICAgICAgICAgICAgICAgICBtVXNlQXVkaW9DYWxsYmFjayA/ICZOdVBsYXllcjo6UmVuZGVyZXI6OkF1ZGlvU2lua0NhbGxiYWNrIDogTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2sgPyB0aGlzIDogTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KXBjbUZsYWdzLAogICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcGNtRmxhZ3MpOworICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGRvTm90UmVjb25uZWN0ICovLAorICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgZXJyID0gbUF1ZGlvU2luay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1NldHRpbmdzKTsKKyAgICAgICAgfQogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HVygib3BlbkF1ZGlvU2luazogbm9uIG9mZmxvYWRlZCBvcGVuIGZhaWxlZCBzdGF0dXM6ICVkIiwgZXJyKTsKICAgICAgICAgICAgIG1DdXJyZW50UGNtSW5mbyA9IEFVRElPX1BDTUlORk9fSU5JVElBTElaRVI7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgICAgIG1DdXJyZW50UGNtSW5mbyA9IGluZm87Ci0gICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgICAgIGlmICghbVBhdXNlZCkgeyAvLyBmb3IgcHJldmlldyBtb2RlLCBkb24ndCBzdGFydCBpZiBwYXVzZWQKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGF1ZGlvU2lua0NoYW5nZWQpIHsKICAgICAgICAgb25BdWRpb1NpbmtDaGFuZ2VkKCk7CiAgICAgfQotICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgewotICAgICAgICBtQXVkaW9PZmZsb2FkVG9ybkRvd24gPSBmYWxzZTsKLSAgICB9CisgICAgbUF1ZGlvVG9ybkRvd24gPSBmYWxzZTsKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCmluZGV4IDAwM2QxZDAuLjNlNjU2NDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaApAQCAtMTgsMTIgKzE4LDE2IEBACiAKICNkZWZpbmUgTlVQTEFZRVJfUkVOREVSRVJfSF8KIAorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CisjaW5jbHVkZSA8bWVkaWEvQVZTeW5jU2V0dGluZ3MuaD4KKwogI2luY2x1ZGUgIk51UGxheWVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFCdWZmZXI7CiBjbGFzcyAgQVdha2VMb2NrOworc3RydWN0IE1lZGlhQ2xvY2s7CiBzdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlcjsKIAogc3RydWN0IE51UGxheWVyOjpSZW5kZXJlciA6IHB1YmxpYyBBSGFuZGxlciB7CkBAIC00Nyw2ICs1MSwxMSBAQAogCiAgICAgdm9pZCBxdWV1ZUVPUyhib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCk7CiAKKyAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlIC8qIHNhbml0aXplZCAqLyk7CisgICAgc3RhdHVzX3QgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSAvKiBub25udWxsICovKTsKKyAgICBzdGF0dXNfdCBzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MgJnN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCk7CisgICAgc3RhdHVzX3QgZ2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jIC8qIG5vbm51bGwgKi8sIGZsb2F0ICp2aWRlb0ZwcyAvKiBub25udWxsICovKTsKKwogICAgIHZvaWQgZmx1c2goYm9vbCBhdWRpbywgYm9vbCBub3RpZnlDb21wbGV0ZSk7CiAKICAgICB2b2lkIHNpZ25hbFRpbWVEaXNjb250aW51aXR5KCk7CkBAIC02MSwxNiArNzAsOCBAQAogCiAgICAgdm9pZCBzZXRWaWRlb0ZyYW1lUmF0ZShmbG9hdCBmcHMpOwogCi0gICAgLy8gRm9sbG93aW5nIHNldHRlcnMgYW5kIGdldHRlcnMgYXJlIHByb3RlY3RlZCBieSBtVGltZUxvY2suCiAgICAgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1lZGlhVXMpOwotICAgIHZvaWQgc2V0SGFzTWVkaWEoYm9vbCBhdWRpbyk7Ci0gICAgdm9pZCBzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZShpbnQ2NF90IG1lZGlhVXMpOwotICAgIHZvaWQgc2V0QXVkaW9GaXJzdEFuY2hvclRpbWVJZk5lZWRlZChpbnQ2NF90IG1lZGlhVXMpOwotICAgIHZvaWQgc2V0QW5jaG9yVGltZSgKLSAgICAgICAgICAgIGludDY0X3QgbWVkaWFVcywgaW50NjRfdCByZWFsVXMsIGludDY0X3QgbnVtRnJhbWVzV3JpdHRlbiA9IC0xLCBib29sIHJlc3VtZSA9IGZhbHNlKTsKLSAgICB2b2lkIHNldFZpZGVvTGF0ZUJ5VXMoaW50NjRfdCBsYXRlVXMpOwogICAgIGludDY0X3QgZ2V0VmlkZW9MYXRlQnlVcygpOwotICAgIHZvaWQgc2V0UGF1c2VTdGFydGVkVGltZVJlYWxVcyhpbnQ2NF90IHJlYWxVcyk7CiAKICAgICBzdGF0dXNfdCBvcGVuQXVkaW9TaW5rKAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCkBAIC04MSwxNiArODIsMTYgQEAKICAgICB2b2lkIGNsb3NlQXVkaW9TaW5rKCk7CiAKICAgICBlbnVtIHsKLSAgICAgICAga1doYXRFT1MgICAgICAgICAgICAgICAgID0gJ2VvcyAnLAotICAgICAgICBrV2hhdEZsdXNoQ29tcGxldGUgICAgICAgPSAnZmx1QycsCi0gICAgICAgIGtXaGF0UG9zaXRpb24gICAgICAgICAgICA9ICdwb3NpJywKLSAgICAgICAga1doYXRWaWRlb1JlbmRlcmluZ1N0YXJ0ID0gJ3ZkcmQnLAotICAgICAgICBrV2hhdE1lZGlhUmVuZGVyaW5nU3RhcnQgPSAnbWRyZCcsCi0gICAgICAgIGtXaGF0QXVkaW9PZmZsb2FkVGVhckRvd24gPSAnYU9URCcsCisgICAgICAgIGtXaGF0RU9TICAgICAgICAgICAgICAgICAgICAgID0gJ2VvcyAnLAorICAgICAgICBrV2hhdEZsdXNoQ29tcGxldGUgICAgICAgICAgICA9ICdmbHVDJywKKyAgICAgICAga1doYXRQb3NpdGlvbiAgICAgICAgICAgICAgICAgPSAncG9zaScsCisgICAgICAgIGtXaGF0VmlkZW9SZW5kZXJpbmdTdGFydCAgICAgID0gJ3ZkcmQnLAorICAgICAgICBrV2hhdE1lZGlhUmVuZGVyaW5nU3RhcnQgICAgICA9ICdtZHJkJywKKyAgICAgICAga1doYXRBdWRpb1RlYXJEb3duICAgICAgICAgICAgPSAnYWRURCcsCiAgICAgICAgIGtXaGF0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0ID0gJ2FPUFQnLAogICAgIH07CiAKLSAgICBlbnVtIEF1ZGlvT2ZmbG9hZFRlYXJEb3duUmVhc29uIHsKKyAgICBlbnVtIEF1ZGlvVGVhckRvd25SZWFzb24gewogICAgICAgICBrRHVlVG9FcnJvciA9IDAsCiAgICAgICAgIGtEdWVUb1RpbWVvdXQsCiAgICAgfTsKQEAgLTEwNyw4ICsxMDgsMTEgQEAKICAgICAgICAga1doYXRQb3N0RHJhaW5WaWRlb1F1ZXVlID0gJ3BEVlEnLAogICAgICAgICBrV2hhdFF1ZXVlQnVmZmVyICAgICAgICAgPSAncXVlQicsCiAgICAgICAgIGtXaGF0UXVldWVFT1MgICAgICAgICAgICA9ICdxRU9TJywKKyAgICAgICAga1doYXRDb25maWdQbGF5YmFjayAgICAgID0gJ2NmUEInLAorICAgICAgICBrV2hhdENvbmZpZ1N5bmMgICAgICAgICAgPSAnY2ZTeScsCisgICAgICAgIGtXaGF0R2V0UGxheWJhY2tTZXR0aW5ncyA9ICdnUGJTJywKKyAgICAgICAga1doYXRHZXRTeW5jU2V0dGluZ3MgICAgID0gJ2dTeVMnLAogICAgICAgICBrV2hhdEZsdXNoICAgICAgICAgICAgICAgPSAnZmx1cycsCi0gICAgICAgIGtXaGF0QXVkaW9TaW5rQ2hhbmdlZCAgICA9ICdhdVNDJywKICAgICAgICAga1doYXRQYXVzZSAgICAgICAgICAgICAgID0gJ3BhdXMnLAogICAgICAgICBrV2hhdFJlc3VtZSAgICAgICAgICAgICAgPSAncmVzbScsCiAgICAgICAgIGtXaGF0T3BlbkF1ZGlvU2luayAgICAgICA9ICdvcG5BJywKQEAgLTE0MiwyNiArMTQ2LDIzIEBACiAgICAgYm9vbCBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZzsKICAgICBpbnQzMl90IG1BdWRpb1F1ZXVlR2VuZXJhdGlvbjsKICAgICBpbnQzMl90IG1WaWRlb1F1ZXVlR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1BdWRpb0RyYWluR2VuZXJhdGlvbjsKKyAgICBpbnQzMl90IG1WaWRlb0RyYWluR2VuZXJhdGlvbjsKIAotICAgIE11dGV4IG1UaW1lTG9jazsKLSAgICAvLyB8bVRpbWVMb2NrfCBwcm90ZWN0cyB0aGUgZm9sbG93aW5nIDcgbWVtYmVyIHZhcnMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aW1lLgotICAgIC8vIE5vdGU6IHRob3NlIG1lbWJlcnMgYXJlIG9ubHkgd3JpdHRlbiBvbiBSZW5kZXJlciB0aHJlYWQsIHNvIHJlYWRpbmcgb24gUmVuZGVyZXIgdGhyZWFkCi0gICAgLy8gZG9lc24ndCBuZWVkIHRvIGJlIHByb3RlY3RlZC4gT3RoZXJ3aXNlIGFjY2Vzc2luZyB0aG9zZSBtZW1iZXJzIG11c3QgYmUgcHJvdGVjdGVkIGJ5Ci0gICAgLy8gfG1UaW1lTG9ja3wuCi0gICAgLy8gVE9ETzogbW92ZSB0aG9zZSBtZW1iZXJzIHRvIGEgc2VwZXJhdGVkIG1lZGlhIGNsb2NrIGNsYXNzLgorICAgIHNwPE1lZGlhQ2xvY2s+IG1NZWRpYUNsb2NrOworICAgIGZsb2F0IG1QbGF5YmFja1JhdGU7IC8vIGF1ZGlvIHRyYWNrIHJhdGUKKworICAgIEF1ZGlvUGxheWJhY2tSYXRlIG1QbGF5YmFja1NldHRpbmdzOworICAgIEFWU3luY1NldHRpbmdzIG1TeW5jU2V0dGluZ3M7CisgICAgZmxvYXQgbVZpZGVvRnBzSGludDsKKwogICAgIGludDY0X3QgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVczsKICAgICBpbnQ2NF90IG1BbmNob3JUaW1lTWVkaWFVczsKLSAgICBpbnQ2NF90IG1BbmNob3JUaW1lUmVhbFVzOwogICAgIGludDY0X3QgbUFuY2hvck51bUZyYW1lc1dyaXR0ZW47Ci0gICAgaW50NjRfdCBtQW5jaG9yTWF4TWVkaWFVczsKICAgICBpbnQ2NF90IG1WaWRlb0xhdGVCeVVzOwogICAgIGJvb2wgbUhhc0F1ZGlvOwogICAgIGJvb2wgbUhhc1ZpZGVvOwotICAgIGludDY0X3QgbVBhdXNlU3RhcnRlZFRpbWVSZWFsVXM7CiAKLSAgICBNdXRleCBtRmx1c2hMb2NrOyAgLy8gcHJvdGVjdHMgdGhlIGZvbGxvd2luZyAyIG1lbWJlciB2YXJzLgotICAgIGJvb2wgbUZsdXNoaW5nQXVkaW87Ci0gICAgYm9vbCBtRmx1c2hpbmdWaWRlbzsKICAgICBib29sIG1Ob3RpZnlDb21wbGV0ZUF1ZGlvOwogICAgIGJvb2wgbU5vdGlmeUNvbXBsZXRlVmlkZW87CiAKQEAgLTE2OSw3ICsxNzAsNiBAQAogCiAgICAgLy8gbW9kaWZpZWQgb24gb25seSByZW5kZXJlcidzIHRocmVhZC4KICAgICBib29sIG1QYXVzZWQ7Ci0gICAgaW50NjRfdCBtUGF1c2VQb3NpdGlvbk1lZGlhVGltZVVzOwogCiAgICAgYm9vbCBtVmlkZW9TYW1wbGVSZWNlaXZlZDsKICAgICBib29sIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQ7CkBAIC0xNzksNyArMTc5LDcgQEAKICAgICBpbnQ2NF90IG1MYXN0UG9zaXRpb25VcGRhdGVVczsKIAogICAgIGludDMyX3QgbUF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dEdlbmVyYXRpb247Ci0gICAgYm9vbCBtQXVkaW9PZmZsb2FkVG9ybkRvd247CisgICAgYm9vbCBtQXVkaW9Ub3JuRG93bjsKICAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBtQ3VycmVudE9mZmxvYWRJbmZvOwogCiAgICAgc3RydWN0IFBjbUluZm8gewpAQCAtMTk0LDYgKzE5NCw3IEBACiAKICAgICBpbnQzMl90IG1Ub3RhbEJ1ZmZlcnNRdWV1ZWQ7CiAgICAgaW50MzJfdCBtTGFzdEF1ZGlvQnVmZmVyRHJhaW5lZDsKKyAgICBib29sIG1Vc2VBdWRpb0NhbGxiYWNrOwogCiAgICAgc3A8QVdha2VMb2NrPiBtV2FrZUxvY2s7CiAKQEAgLTIwNywxOCArMjA4LDI0IEBACiAgICAgc2l6ZV90IGZpbGxBdWRpb0J1ZmZlcih2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKTsKIAogICAgIGJvb2wgb25EcmFpbkF1ZGlvUXVldWUoKTsKKyAgICB2b2lkIGRyYWluQXVkaW9RdWV1ZVVudGlsTGFzdEVPUygpOwogICAgIGludDY0X3QgZ2V0UGVuZGluZ0F1ZGlvUGxheW91dER1cmF0aW9uVXMoaW50NjRfdCBub3dVcyk7CiAgICAgaW50NjRfdCBnZXRQbGF5ZWRPdXRBdWRpb0R1cmF0aW9uVXMoaW50NjRfdCBub3dVcyk7CiAgICAgdm9pZCBwb3N0RHJhaW5BdWRpb1F1ZXVlX2woaW50NjRfdCBkZWxheVVzID0gMCk7CiAKKyAgICB2b2lkIGNsZWFyQW5jaG9yVGltZV9sKCk7CisgICAgdm9pZCBjbGVhckF1ZGlvRmlyc3RBbmNob3JUaW1lX2woKTsKKyAgICB2b2lkIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWRfbChpbnQ2NF90IG1lZGlhVXMpOworICAgIHZvaWQgc2V0VmlkZW9MYXRlQnlVcyhpbnQ2NF90IGxhdGVVcyk7CisKICAgICB2b2lkIG9uTmV3QXVkaW9NZWRpYVRpbWUoaW50NjRfdCBtZWRpYVRpbWVVcyk7CiAgICAgaW50NjRfdCBnZXRSZWFsVGltZVVzKGludDY0X3QgbWVkaWFUaW1lVXMsIGludDY0X3Qgbm93VXMpOwogCiAgICAgdm9pZCBvbkRyYWluVmlkZW9RdWV1ZSgpOwotICAgIHZvaWQgcG9zdERyYWluVmlkZW9RdWV1ZV9sKCk7CisgICAgdm9pZCBwb3N0RHJhaW5WaWRlb1F1ZXVlKCk7CiAKLSAgICB2b2lkIHByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0KCk7Ci0gICAgdm9pZCBub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZCgpOworICAgIHZvaWQgcHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnRfbCgpOworICAgIHZvaWQgbm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWRfbCgpOwogCiAgICAgdm9pZCBvblF1ZXVlQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIG9uUXVldWVFT1MoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwpAQCAtMjI2LDEwICsyMzMsMTggQEAKICAgICB2b2lkIG9uQXVkaW9TaW5rQ2hhbmdlZCgpOwogICAgIHZvaWQgb25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CiAgICAgdm9pZCBvbkVuYWJsZU9mZmxvYWRBdWRpbygpOworICAgIHN0YXR1c190IG9uQ29uZmlnUGxheWJhY2soY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUgLyogc2FuaXRpemVkICovKTsKKyAgICBzdGF0dXNfdCBvbkdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUgLyogbm9ubnVsbCAqLyk7CisgICAgc3RhdHVzX3Qgb25Db25maWdTeW5jKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpOworICAgIHN0YXR1c190IG9uR2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jIC8qIG5vbm51bGwgKi8sIGZsb2F0ICp2aWRlb0ZwcyAvKiBub25udWxsICovKTsKKwogICAgIHZvaWQgb25QYXVzZSgpOwogICAgIHZvaWQgb25SZXN1bWUoKTsKICAgICB2b2lkIG9uU2V0VmlkZW9GcmFtZVJhdGUoZmxvYXQgZnBzKTsKLSAgICB2b2lkIG9uQXVkaW9PZmZsb2FkVGVhckRvd24oQXVkaW9PZmZsb2FkVGVhckRvd25SZWFzb24gcmVhc29uKTsKKyAgICBpbnQzMl90IGdldFF1ZXVlR2VuZXJhdGlvbihib29sIGF1ZGlvKTsKKyAgICBpbnQzMl90IGdldERyYWluR2VuZXJhdGlvbihib29sIGF1ZGlvKTsKKyAgICBib29sIGdldFN5bmNRdWV1ZXMoKTsKKyAgICB2b2lkIG9uQXVkaW9UZWFyRG93bihBdWRpb1RlYXJEb3duUmVhc29uIHJlYXNvbik7CiAgICAgc3RhdHVzX3Qgb25PcGVuQXVkaW9TaW5rKAogICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCiAgICAgICAgICAgICBib29sIG9mZmxvYWRPbmx5LApAQCAtMjQyLDEwICsyNTcsMTAgQEAKICAgICB2b2lkIG5vdGlmeVBvc2l0aW9uKCk7CiAgICAgdm9pZCBub3RpZnlWaWRlb0xhdGVCeShpbnQ2NF90IGxhdGVCeVVzKTsKICAgICB2b2lkIG5vdGlmeVZpZGVvUmVuZGVyaW5nU3RhcnQoKTsKLSAgICB2b2lkIG5vdGlmeUF1ZGlvT2ZmbG9hZFRlYXJEb3duKCk7CisgICAgdm9pZCBub3RpZnlBdWRpb1RlYXJEb3duKCk7CiAKICAgICB2b2lkIGZsdXNoUXVldWUoTGlzdDxRdWV1ZUVudHJ5PiAqcXVldWUpOwotICAgIGJvb2wgZHJvcEJ1ZmZlcldoaWxlRmx1c2hpbmcoYm9vbCBhdWRpbywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIGJvb2wgZHJvcEJ1ZmZlcklmU3RhbGUoYm9vbCBhdWRpbywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgc3luY1F1ZXVlc0RvbmVfbCgpOwogCiAgICAgYm9vbCBvZmZsb2FkaW5nQXVkaW8oKSBjb25zdCB7IHJldHVybiAobUZsYWdzICYgRkxBR19PRkZMT0FEX0FVRElPKSAhPSAwOyB9CkBAIC0yNTMsOSArMjY4LDExIEBACiAgICAgdm9pZCBzdGFydEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpOwogICAgIHZvaWQgY2FuY2VsQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCk7CiAKKyAgICBpbnQ2NF90IGdldER1cmF0aW9uVXNJZlBsYXllZEF0U2FtcGxlUmF0ZSh1aW50MzJfdCBudW1GcmFtZXMpOworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVuZGVyZXIpOwogfTsKIAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBOVVBMQVlFUl9SRU5ERVJFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaAppbmRleCBkOWYxNGEyLi4xMWE2YTlmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTb3VyY2UuaApAQCAtMjgsNyArMjgsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKLXN0cnVjdCBNZWRpYUJ1ZmZlcjsKK2NsYXNzIE1lZGlhQnVmZmVyOwogCiBzdHJ1Y3QgTnVQbGF5ZXI6OlNvdXJjZSA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgZW51bSBGbGFncyB7CkBAIC01Myw2ICs1Myw3IEBACiAgICAgICAgIGtXaGF0Q2FjaGVTdGF0cywKICAgICAgICAga1doYXRTdWJ0aXRsZURhdGEsCiAgICAgICAgIGtXaGF0VGltZWRUZXh0RGF0YSwKKyAgICAgICAga1doYXRUaW1lZE1ldGFEYXRhLAogICAgICAgICBrV2hhdFF1ZXVlRGVjb2RlclNodXRkb3duLAogICAgICAgICBrV2hhdERybU5vTGljZW5zZSwKICAgICAgICAga1doYXRJbnN0YW50aWF0ZVNlY3VyZURlY29kZXJzLApAQCAtMTE3LDYgKzExOCwxMCBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgdmlydHVhbCBib29sIGlzU3RyZWFtaW5nKCkgY29uc3QgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5Tb3VyY2UoKSB7fQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lci5jcHAKaW5kZXggN2Y3Njc5MS4uZWU3MDMwNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU3RyZWFtTGlzdGVuZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclN0cmVhbUxpc3RlbmVyLmNwcApAQCAtMjksOSArMjksOSBAQAogCiBOdVBsYXllcjo6TnVQbGF5ZXJTdHJlYW1MaXN0ZW5lcjo6TnVQbGF5ZXJTdHJlYW1MaXN0ZW5lcigKICAgICAgICAgY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSwKLSAgICAgICAgQUxvb3Blcjo6aGFuZGxlcl9pZCBpZCkKKyAgICAgICAgY29uc3Qgc3A8QUhhbmRsZXI+ICZ0YXJnZXRIYW5kbGVyKQogICAgIDogbVNvdXJjZShzb3VyY2UpLAotICAgICAgbVRhcmdldElEKGlkKSwKKyAgICAgIG1UYXJnZXRIYW5kbGVyKHRhcmdldEhhbmRsZXIpLAogICAgICAgbUVPUyhmYWxzZSksCiAgICAgICBtU2VuZERhdGFOb3RpZmljYXRpb24odHJ1ZSkgewogICAgIG1Tb3VyY2UtPnNldExpc3RlbmVyKHRoaXMpOwpAQCAtNjUsOCArNjUsOCBAQAogICAgIGlmIChtU2VuZERhdGFOb3RpZmljYXRpb24pIHsKICAgICAgICAgbVNlbmREYXRhTm90aWZpY2F0aW9uID0gZmFsc2U7CiAKLSAgICAgICAgaWYgKG1UYXJnZXRJRCAhPSAwKSB7Ci0gICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0TW9yZURhdGFRdWV1ZWQsIG1UYXJnZXRJRCkpLT5wb3N0KCk7CisgICAgICAgIGlmIChtVGFyZ2V0SGFuZGxlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0TW9yZURhdGFRdWV1ZWQsIG1UYXJnZXRIYW5kbGVyKSktPnBvc3QoKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTg2LDggKzg2LDggQEAKICAgICBpZiAobVNlbmREYXRhTm90aWZpY2F0aW9uKSB7CiAgICAgICAgIG1TZW5kRGF0YU5vdGlmaWNhdGlvbiA9IGZhbHNlOwogCi0gICAgICAgIGlmIChtVGFyZ2V0SUQgIT0gMCkgewotICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdE1vcmVEYXRhUXVldWVkLCBtVGFyZ2V0SUQpKS0+cG9zdCgpOworICAgICAgICBpZiAobVRhcmdldEhhbmRsZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdE1vcmVEYXRhUXVldWVkLCBtVGFyZ2V0SGFuZGxlcikpLT5wb3N0KCk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU3RyZWFtTGlzdGVuZXIuaAppbmRleCAxODc0ZDgwLi4yZGU4MjliIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJTdHJlYW1MaXN0ZW5lci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclN0cmVhbUxpc3RlbmVyLmgKQEAgLTI5LDcgKzI5LDcgQEAKIHN0cnVjdCBOdVBsYXllcjo6TnVQbGF5ZXJTdHJlYW1MaXN0ZW5lciA6IHB1YmxpYyBCblN0cmVhbUxpc3RlbmVyIHsKICAgICBOdVBsYXllclN0cmVhbUxpc3RlbmVyKAogICAgICAgICAgICAgY29uc3Qgc3A8SVN0cmVhbVNvdXJjZT4gJnNvdXJjZSwKLSAgICAgICAgICAgIEFMb29wZXI6OmhhbmRsZXJfaWQgdGFyZ2V0SUQpOworICAgICAgICAgICAgY29uc3Qgc3A8QUhhbmRsZXI+ICZ0YXJnZXRIYW5kbGVyKTsKIAogICAgIHZpcnR1YWwgdm9pZCBxdWV1ZUJ1ZmZlcihzaXplX3QgaW5kZXgsIHNpemVfdCBzaXplKTsKIApAQCAtNTksNyArNTksNyBAQAogICAgIE11dGV4IG1Mb2NrOwogCiAgICAgc3A8SVN0cmVhbVNvdXJjZT4gbVNvdXJjZTsKLSAgICBBTG9vcGVyOjpoYW5kbGVyX2lkIG1UYXJnZXRJRDsKKyAgICBzcDxBSGFuZGxlcj4gbVRhcmdldEhhbmRsZXI7CiAgICAgc3A8TWVtb3J5RGVhbGVyPiBtTWVtb3J5RGVhbGVyOwogICAgIFZlY3RvcjxzcDxJTWVtb3J5PiA+IG1CdWZmZXJzOwogICAgIExpc3Q8UXVldWVFbnRyeT4gbVF1ZXVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwCmluZGV4IDAyODJhOWYuLjU4ZmYxMTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5jcHAKQEAgLTg3LDcgKzg3LDcgQEAKICAgICBDSEVDSyhtSGFuZGxlciA9PSBOVUxMKTsKICAgICBDSEVDSyhtU0RQTG9hZGVyID09IE5VTEwpOwogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE5vdGlmeSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE5vdGlmeSwgdGhpcyk7CiAKICAgICBDSEVDS19FUShtU3RhdGUsIChpbnQpRElTQ09OTkVDVEVEKTsKICAgICBtU3RhdGUgPSBDT05ORUNUSU5HOwpAQCAtMTE2LDcgKzExNiw3IEBACiAgICAgaWYgKG1Mb29wZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREaXNjb25uZWN0LCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RGlzY29ubmVjdCwgdGhpcyk7CiAKICAgICBzcDxBTWVzc2FnZT4gZHVtbXk7CiAgICAgbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmZHVtbXkpOwpAQCAtMTM4LDcgKzEzOCw5IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJUU1BTb3VyY2U6OnJlc3VtZSgpIHsKLSAgICBtSGFuZGxlci0+cmVzdW1lKCk7CisgICAgaWYgKG1IYW5kbGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUhhbmRsZXItPnJlc3VtZSgpOworICAgIH0KIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OlJUU1BTb3VyY2U6OmZlZWRNb3JlVFNEYXRhKCkgewpAQCAtMjkyLDE2ICsyOTQsMjIgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OlJUU1BTb3VyY2U6OnNlZWtUbyhpbnQ2NF90IHNlZWtUaW1lVXMpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UGVyZm9ybVNlZWssIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQZXJmb3JtU2VlaywgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsICsrbVNlZWtHZW5lcmF0aW9uKTsKICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCBzZWVrVGltZVVzKTsKLSAgICBtc2ctPnBvc3QoMjAwMDAwbGwpOwogCi0gICAgcmV0dXJuIE9LOworICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CisgICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOwogfQogCiB2b2lkIE51UGxheWVyOjpSVFNQU291cmNlOjpwZXJmb3JtU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMpIHsKICAgICBpZiAobVN0YXRlICE9IENPTk5FQ1RFRCkgeworICAgICAgICBmaW5pc2hTZWVrKElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMzExLDcgKzMxOSw3IEBACiAKIHZvaWQgTnVQbGF5ZXI6OlJUU1BTb3VyY2U6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0RGlzY29ubmVjdCkgewotICAgICAgICB1aW50MzJfdCByZXBseUlEOworICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgIG1EaXNjb25uZWN0UmVwbHlJRCA9IHJlcGx5SUQ7CkBAIC0zMjAsOSArMzI4LDExIEBACiAgICAgfSBlbHNlIGlmIChtc2ctPndoYXQoKSA9PSBrV2hhdFBlcmZvcm1TZWVrKSB7CiAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZtU2Vla1JlcGx5SUQpKTsKIAogICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtU2Vla0dlbmVyYXRpb24pIHsKICAgICAgICAgICAgIC8vIG9ic29sZXRlLgorICAgICAgICAgICAgZmluaXNoU2VlayhPSyk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIApAQCAtMzY4LDYgKzM3OCwzNyBAQAogICAgICAgICBjYXNlIE15SGFuZGxlcjo6a1doYXRTZWVrRG9uZToKICAgICAgICAgewogICAgICAgICAgICAgbVN0YXRlID0gQ09OTkVDVEVEOworICAgICAgICAgICAgaWYgKG1TZWVrUmVwbHlJRCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gVW5ibG9jayBzZWVrVG8gaGVyZSBpbiBjYXNlIHdlIGF0dGVtcHRlZCB0byBzZWVrIGluIGEgbGl2ZSBzdHJlYW0KKyAgICAgICAgICAgICAgICBmaW5pc2hTZWVrKE9LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBNeUhhbmRsZXI6OmtXaGF0U2Vla1BhdXNlZDoKKyAgICAgICAgeworICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0gZ2V0U291cmNlKHRydWUgLyogYXVkaW8gKi8pOworICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc291cmNlLT5xdWV1ZURpc2NvbnRpbnVpdHkoQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRyYSAqLyBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY2FyZCAqLyB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNvdXJjZSA9IGdldFNvdXJjZShmYWxzZSAvKiB2aWRlbyAqLyk7CisgICAgICAgICAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzb3VyY2UtPnF1ZXVlRGlzY29udGludWl0eShBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dHJhICovIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXNjYXJkICovIHRydWUpOworICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycik7CisgICAgICAgICAgICBmaW5pc2hTZWVrKGVycik7CisKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZSIsICZ0aW1lVXMpKTsKKyAgICAgICAgICAgICAgICBtSGFuZGxlci0+Y29udGludWVTZWVrQWZ0ZXJQYXVzZSh0aW1lVXMpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtNjAwLDcgKzY0MSw3IEBACiAgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGZpbmQgdXJsIGluIFNEUCIpOwogICAgICAgICAgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXROb3RpZnksIGlkKCkpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE5vdGlmeSwgdGhpcyk7CiAKICAgICAgICAgICAgIG1IYW5kbGVyID0gbmV3IE15SGFuZGxlcihydHNwVXJpLmNfc3RyKCksIG5vdGlmeSwgbVVJRFZhbGlkLCBtVUlEKTsKICAgICAgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CkBAIC03MDAsNSArNzQxLDEyIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK3ZvaWQgTnVQbGF5ZXI6OlJUU1BTb3VyY2U6OmZpbmlzaFNlZWsoc3RhdHVzX3QgZXJyKSB7CisgICAgQ0hFQ0sobVNlZWtSZXBseUlEICE9IE5VTEwpOworICAgIHNwPEFNZXNzYWdlPiBzZWVrUmVwbHkgPSBuZXcgQU1lc3NhZ2U7CisgICAgc2Vla1JlcGx5LT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICBzZWVrUmVwbHktPnBvc3RSZXBseShtU2Vla1JlcGx5SUQpOworICAgIG1TZWVrUmVwbHlJRCA9IE5VTEw7Cit9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuaAppbmRleCBhYzMyOTlhLi42NDM4YTFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmgKQEAgLTI1LDYgKzI1LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFMb29wZXI7CitzdHJ1Y3QgQVJlcGx5VG9rZW47CiBzdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKIHN0cnVjdCBNeUhhbmRsZXI7CiBzdHJ1Y3QgU0RQTG9hZGVyOwpAQCAtOTYsNyArOTcsNyBAQAogICAgIGJvb2wgbUlzU0RQOwogICAgIFN0YXRlIG1TdGF0ZTsKICAgICBzdGF0dXNfdCBtRmluYWxSZXN1bHQ7Ci0gICAgdWludDMyX3QgbURpc2Nvbm5lY3RSZXBseUlEOworICAgIHNwPEFSZXBseVRva2VuPiBtRGlzY29ubmVjdFJlcGx5SUQ7CiAgICAgTXV0ZXggbUJ1ZmZlcmluZ0xvY2s7CiAgICAgYm9vbCBtQnVmZmVyaW5nOwogCkBAIC0xMTUsNiArMTE2LDggQEAKICAgICBpbnQ2NF90IG1FT1NUaW1lb3V0QXVkaW87CiAgICAgaW50NjRfdCBtRU9TVGltZW91dFZpZGVvOwogCisgICAgc3A8QVJlcGx5VG9rZW4+IG1TZWVrUmVwbHlJRDsKKwogICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGdldFNvdXJjZShib29sIGF1ZGlvKTsKIAogICAgIHZvaWQgb25Db25uZWN0ZWQoKTsKQEAgLTEzMCw2ICsxMzMsNyBAQAogICAgIHZvaWQgc2V0RXJyb3Ioc3RhdHVzX3QgZXJyKTsKICAgICB2b2lkIHN0YXJ0QnVmZmVyaW5nSWZOZWNlc3NhcnkoKTsKICAgICBib29sIHN0b3BCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpOworICAgIHZvaWQgZmluaXNoU2VlayhzdGF0dXNfdCBlcnIpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUlRTUFNvdXJjZSk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcAppbmRleCBiM2YyMjRkLi4wMjQ2YjU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcApAQCAtNjMsNyArNjMsNyBAQAogfQogCiB2b2lkIE51UGxheWVyOjpTdHJlYW1pbmdTb3VyY2U6OnN0YXJ0KCkgewotICAgIG1TdHJlYW1MaXN0ZW5lciA9IG5ldyBOdVBsYXllclN0cmVhbUxpc3RlbmVyKG1Tb3VyY2UsIDApOworICAgIG1TdHJlYW1MaXN0ZW5lciA9IG5ldyBOdVBsYXllclN0cmVhbUxpc3RlbmVyKG1Tb3VyY2UsIE5VTEwpOwogCiAgICAgdWludDMyX3Qgc291cmNlRmxhZ3MgPSBtU291cmNlLT5mbGFncygpOwogCkBAIC0xNjMsNyArMTYzLDcgQEAKICAgICAgICAgbUJ1ZmZlcmluZyA9IHRydWU7CiAgICAgfQogCi0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlYWRCdWZmZXIsIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkQnVmZmVyLCB0aGlzKSktPnBvc3QoKTsKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNiZjc4MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjcgQEAKKyMgQnVpbGQgdGhlIHVuaXQgdGVzdHMuCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgOj0gRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCURybVNlc3Npb25NYW5hZ2VyX3Rlc3QuY3BwIFwKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGlibG9nIFwKKwlsaWJtZWRpYXBsYXllcnNlcnZpY2UgXAorCWxpYnV0aWxzIFwKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIFwKKwlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZSBcCisKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCisKK0xPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKKworaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUzNTBhMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9Ecm1TZXNzaW9uTWFuYWdlcl90ZXN0LmNwcApAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJEcm0uaCIKKyNpbmNsdWRlICJEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiRHJtU2Vzc2lvbk1hbmFnZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEZha2VQcm9jZXNzSW5mbyA6IHB1YmxpYyBQcm9jZXNzSW5mb0ludGVyZmFjZSB7CisgICAgRmFrZVByb2Nlc3NJbmZvKCkge30KKyAgICB2aXJ0dWFsIH5GYWtlUHJvY2Vzc0luZm8oKSB7fQorCisgICAgdmlydHVhbCBib29sIGdldFByaW9yaXR5KGludCBwaWQsIGludCogcHJpb3JpdHkpIHsKKyAgICAgICAgLy8gRm9yIHRlc3RpbmcsIHVzZSBwaWQgYXMgcHJpb3JpdHkuCisgICAgICAgIC8vIExvd2VyIHRoZSB2YWx1ZSBoaWdoZXIgdGhlIHByaW9yaXR5LgorICAgICAgICAqcHJpb3JpdHkgPSBwaWQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGYWtlUHJvY2Vzc0luZm8pOworfTsKKworc3RydWN0IEZha2VEcm0gOiBwdWJsaWMgRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZSB7CisgICAgRmFrZURybSgpIHt9CisgICAgdmlydHVhbCB+RmFrZURybSgpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgcmVjbGFpbVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKKyAgICAgICAgbVJlY2xhaW1lZFNlc3Npb25zLnB1c2hfYmFjayhzZXNzaW9uSWQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBjb25zdCBWZWN0b3I8VmVjdG9yPHVpbnQ4X3Q+ID4mIHJlY2xhaW1lZFNlc3Npb25zKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVJlY2xhaW1lZFNlc3Npb25zOworICAgIH0KKworcHJpdmF0ZToKKyAgICBWZWN0b3I8VmVjdG9yPHVpbnQ4X3Q+ID4gbVJlY2xhaW1lZFNlc3Npb25zOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmFrZURybSk7Cit9OworCitzdGF0aWMgY29uc3QgaW50IGtUZXN0UGlkMSA9IDMwOworc3RhdGljIGNvbnN0IGludCBrVGVzdFBpZDIgPSAyMDsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtUZXN0U2Vzc2lvbklkMVtdID0gezEsIDIsIDN9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1Rlc3RTZXNzaW9uSWQyW10gPSB7NCwgNSwgNiwgNywgOH07CitzdGF0aWMgY29uc3QgdWludDhfdCBrVGVzdFNlc3Npb25JZDNbXSA9IHs5LCAwfTsKKworY2xhc3MgRHJtU2Vzc2lvbk1hbmFnZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgRHJtU2Vzc2lvbk1hbmFnZXJUZXN0KCkKKyAgICAgICAgOiBtRHJtU2Vzc2lvbk1hbmFnZXIobmV3IERybVNlc3Npb25NYW5hZ2VyKG5ldyBGYWtlUHJvY2Vzc0luZm8oKSkpLAorICAgICAgICAgIG1UZXN0RHJtMShuZXcgRmFrZURybSgpKSwKKyAgICAgICAgICBtVGVzdERybTIobmV3IEZha2VEcm0oKSkgeworICAgICAgICBHZXRTZXNzaW9uSWQoa1Rlc3RTZXNzaW9uSWQxLCBBUlJBWV9TSVpFKGtUZXN0U2Vzc2lvbklkMSksICZtU2Vzc2lvbklkMSk7CisgICAgICAgIEdldFNlc3Npb25JZChrVGVzdFNlc3Npb25JZDIsIEFSUkFZX1NJWkUoa1Rlc3RTZXNzaW9uSWQyKSwgJm1TZXNzaW9uSWQyKTsKKyAgICAgICAgR2V0U2Vzc2lvbklkKGtUZXN0U2Vzc2lvbklkMywgQVJSQVlfU0laRShrVGVzdFNlc3Npb25JZDMpLCAmbVNlc3Npb25JZDMpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIEdldFNlc3Npb25JZChjb25zdCB1aW50OF90KiBpZHMsIHNpemVfdCBudW0sIFZlY3Rvcjx1aW50OF90Piogc2Vzc2lvbklkKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKKyAgICAgICAgICAgIHNlc3Npb25JZC0+cHVzaF9iYWNrKGlkc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBFeHBlY3RFcVNlc3Npb25JbmZvKGNvbnN0IFNlc3Npb25JbmZvJiBpbmZvLCBzcDxEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlPiBkcm0sCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCwgaW50NjRfdCB0aW1lU3RhbXApIHsKKyAgICAgICAgRVhQRUNUX0VRKGRybSwgaW5mby5kcm0pOworICAgICAgICBFWFBFQ1RfVFJVRShpc0VxdWFsU2Vzc2lvbklkKHNlc3Npb25JZCwgaW5mby5zZXNzaW9uSWQpKTsKKyAgICAgICAgRVhQRUNUX0VRKHRpbWVTdGFtcCwgaW5mby50aW1lU3RhbXApOworICAgIH0KKworICAgIHZvaWQgYWRkU2Vzc2lvbigpIHsKKyAgICAgICAgbURybVNlc3Npb25NYW5hZ2VyLT5hZGRTZXNzaW9uKGtUZXN0UGlkMSwgbVRlc3REcm0xLCBtU2Vzc2lvbklkMSk7CisgICAgICAgIG1Ecm1TZXNzaW9uTWFuYWdlci0+YWRkU2Vzc2lvbihrVGVzdFBpZDIsIG1UZXN0RHJtMiwgbVNlc3Npb25JZDIpOworICAgICAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPmFkZFNlc3Npb24oa1Rlc3RQaWQyLCBtVGVzdERybTIsIG1TZXNzaW9uSWQzKTsKKyAgICAgICAgY29uc3QgUGlkU2Vzc2lvbkluZm9zTWFwJiBtYXAgPSBzZXNzaW9uTWFwKCk7CisgICAgICAgIEVYUEVDVF9FUSgydSwgbWFwLnNpemUoKSk7CisgICAgICAgIHNzaXplX3QgaW5kZXgxID0gbWFwLmluZGV4T2ZLZXkoa1Rlc3RQaWQxKTsKKyAgICAgICAgQVNTRVJUX0dFKGluZGV4MSwgMCk7CisgICAgICAgIGNvbnN0IFNlc3Npb25JbmZvcyYgaW5mb3MxID0gbWFwW2luZGV4MV07CisgICAgICAgIEVYUEVDVF9FUSgxdSwgaW5mb3MxLnNpemUoKSk7CisgICAgICAgIEV4cGVjdEVxU2Vzc2lvbkluZm8oaW5mb3MxWzBdLCBtVGVzdERybTEsIG1TZXNzaW9uSWQxLCAwKTsKKworICAgICAgICBzc2l6ZV90IGluZGV4MiA9IG1hcC5pbmRleE9mS2V5KGtUZXN0UGlkMik7CisgICAgICAgIEFTU0VSVF9HRShpbmRleDIsIDApOworICAgICAgICBjb25zdCBTZXNzaW9uSW5mb3MmIGluZm9zMiA9IG1hcFtpbmRleDJdOworICAgICAgICBFWFBFQ1RfRVEoMnUsIGluZm9zMi5zaXplKCkpOworICAgICAgICBFeHBlY3RFcVNlc3Npb25JbmZvKGluZm9zMlswXSwgbVRlc3REcm0yLCBtU2Vzc2lvbklkMiwgMSk7CisgICAgICAgIEV4cGVjdEVxU2Vzc2lvbkluZm8oaW5mb3MyWzFdLCBtVGVzdERybTIsIG1TZXNzaW9uSWQzLCAyKTsKKyAgICB9CisKKyAgICBjb25zdCBQaWRTZXNzaW9uSW5mb3NNYXAmIHNlc3Npb25NYXAoKSB7CisgICAgICAgIHJldHVybiBtRHJtU2Vzc2lvbk1hbmFnZXItPm1TZXNzaW9uTWFwOworICAgIH0KKworICAgIHZvaWQgdGVzdEdldExvd2VzdFByaW9yaXR5KCkgeworICAgICAgICBpbnQgcGlkOworICAgICAgICBpbnQgcHJpb3JpdHk7CisgICAgICAgIEVYUEVDVF9GQUxTRShtRHJtU2Vzc2lvbk1hbmFnZXItPmdldExvd2VzdFByaW9yaXR5X2woJnBpZCwgJnByaW9yaXR5KSk7CisKKyAgICAgICAgYWRkU2Vzc2lvbigpOworICAgICAgICBFWFBFQ1RfVFJVRShtRHJtU2Vzc2lvbk1hbmFnZXItPmdldExvd2VzdFByaW9yaXR5X2woJnBpZCwgJnByaW9yaXR5KSk7CisKKyAgICAgICAgRVhQRUNUX0VRKGtUZXN0UGlkMSwgcGlkKTsKKyAgICAgICAgRmFrZVByb2Nlc3NJbmZvIHByb2Nlc3NJbmZvOworICAgICAgICBpbnQgcHJpb3JpdHkxOworICAgICAgICBwcm9jZXNzSW5mby5nZXRQcmlvcml0eShrVGVzdFBpZDEsICZwcmlvcml0eTEpOworICAgICAgICBFWFBFQ1RfRVEocHJpb3JpdHkxLCBwcmlvcml0eSk7CisgICAgfQorCisgICAgdm9pZCB0ZXN0R2V0TGVhc3RVc2VkU2Vzc2lvbigpIHsKKyAgICAgICAgc3A8RHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZT4gZHJtOworICAgICAgICBWZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkOworICAgICAgICBFWFBFQ1RfRkFMU0UobURybVNlc3Npb25NYW5hZ2VyLT5nZXRMZWFzdFVzZWRTZXNzaW9uX2woa1Rlc3RQaWQxLCAmZHJtLCAmc2Vzc2lvbklkKSk7CisKKyAgICAgICAgYWRkU2Vzc2lvbigpOworCisgICAgICAgIEVYUEVDVF9UUlVFKG1Ecm1TZXNzaW9uTWFuYWdlci0+Z2V0TGVhc3RVc2VkU2Vzc2lvbl9sKGtUZXN0UGlkMSwgJmRybSwgJnNlc3Npb25JZCkpOworICAgICAgICBFWFBFQ1RfRVEobVRlc3REcm0xLCBkcm0pOworICAgICAgICBFWFBFQ1RfVFJVRShpc0VxdWFsU2Vzc2lvbklkKG1TZXNzaW9uSWQxLCBzZXNzaW9uSWQpKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShtRHJtU2Vzc2lvbk1hbmFnZXItPmdldExlYXN0VXNlZFNlc3Npb25fbChrVGVzdFBpZDIsICZkcm0sICZzZXNzaW9uSWQpKTsKKyAgICAgICAgRVhQRUNUX0VRKG1UZXN0RHJtMiwgZHJtKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaXNFcXVhbFNlc3Npb25JZChtU2Vzc2lvbklkMiwgc2Vzc2lvbklkKSk7CisKKyAgICAgICAgLy8gbVNlc3Npb25JZDIgaXMgbm8gbG9uZ2VyIHRoZSBsZWFzdCB1c2VkIHNlc3Npb24uCisgICAgICAgIG1Ecm1TZXNzaW9uTWFuYWdlci0+dXNlU2Vzc2lvbihtU2Vzc2lvbklkMik7CisgICAgICAgIEVYUEVDVF9UUlVFKG1Ecm1TZXNzaW9uTWFuYWdlci0+Z2V0TGVhc3RVc2VkU2Vzc2lvbl9sKGtUZXN0UGlkMiwgJmRybSwgJnNlc3Npb25JZCkpOworICAgICAgICBFWFBFQ1RfRVEobVRlc3REcm0yLCBkcm0pOworICAgICAgICBFWFBFQ1RfVFJVRShpc0VxdWFsU2Vzc2lvbklkKG1TZXNzaW9uSWQzLCBzZXNzaW9uSWQpKTsKKyAgICB9CisKKyAgICBzcDxEcm1TZXNzaW9uTWFuYWdlcj4gbURybVNlc3Npb25NYW5hZ2VyOworICAgIHNwPEZha2VEcm0+IG1UZXN0RHJtMTsKKyAgICBzcDxGYWtlRHJtPiBtVGVzdERybTI7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IG1TZXNzaW9uSWQxOworICAgIFZlY3Rvcjx1aW50OF90PiBtU2Vzc2lvbklkMjsKKyAgICBWZWN0b3I8dWludDhfdD4gbVNlc3Npb25JZDM7Cit9OworCitURVNUX0YoRHJtU2Vzc2lvbk1hbmFnZXJUZXN0LCBhZGRTZXNzaW9uKSB7CisgICAgYWRkU2Vzc2lvbigpOworfQorCitURVNUX0YoRHJtU2Vzc2lvbk1hbmFnZXJUZXN0LCB1c2VTZXNzaW9uKSB7CisgICAgYWRkU2Vzc2lvbigpOworCisgICAgbURybVNlc3Npb25NYW5hZ2VyLT51c2VTZXNzaW9uKG1TZXNzaW9uSWQxKTsKKyAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPnVzZVNlc3Npb24obVNlc3Npb25JZDMpOworCisgICAgY29uc3QgUGlkU2Vzc2lvbkluZm9zTWFwJiBtYXAgPSBzZXNzaW9uTWFwKCk7CisgICAgY29uc3QgU2Vzc2lvbkluZm9zJiBpbmZvczEgPSBtYXAudmFsdWVGb3Ioa1Rlc3RQaWQxKTsKKyAgICBjb25zdCBTZXNzaW9uSW5mb3MmIGluZm9zMiA9IG1hcC52YWx1ZUZvcihrVGVzdFBpZDIpOworICAgIEV4cGVjdEVxU2Vzc2lvbkluZm8oaW5mb3MxWzBdLCBtVGVzdERybTEsIG1TZXNzaW9uSWQxLCAzKTsKKyAgICBFeHBlY3RFcVNlc3Npb25JbmZvKGluZm9zMlsxXSwgbVRlc3REcm0yLCBtU2Vzc2lvbklkMywgNCk7Cit9CisKK1RFU1RfRihEcm1TZXNzaW9uTWFuYWdlclRlc3QsIHJlbW92ZVNlc3Npb24pIHsKKyAgICBhZGRTZXNzaW9uKCk7CisKKyAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPnJlbW92ZVNlc3Npb24obVNlc3Npb25JZDIpOworCisgICAgY29uc3QgUGlkU2Vzc2lvbkluZm9zTWFwJiBtYXAgPSBzZXNzaW9uTWFwKCk7CisgICAgRVhQRUNUX0VRKDJ1LCBtYXAuc2l6ZSgpKTsKKyAgICBjb25zdCBTZXNzaW9uSW5mb3MmIGluZm9zMSA9IG1hcC52YWx1ZUZvcihrVGVzdFBpZDEpOworICAgIGNvbnN0IFNlc3Npb25JbmZvcyYgaW5mb3MyID0gbWFwLnZhbHVlRm9yKGtUZXN0UGlkMik7CisgICAgRVhQRUNUX0VRKDF1LCBpbmZvczEuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoMXUsIGluZm9zMi5zaXplKCkpOworICAgIC8vIG1TZXNzaW9uSWQyIGhhcyBiZWVuIHJlbW92ZWQuCisgICAgRXhwZWN0RXFTZXNzaW9uSW5mbyhpbmZvczJbMF0sIG1UZXN0RHJtMiwgbVNlc3Npb25JZDMsIDIpOworfQorCitURVNUX0YoRHJtU2Vzc2lvbk1hbmFnZXJUZXN0LCByZW1vdmVEcm0pIHsKKyAgICBhZGRTZXNzaW9uKCk7CisKKyAgICBzcDxGYWtlRHJtPiBkcm0gPSBuZXcgRmFrZURybTsKKyAgICBjb25zdCB1aW50OF90IGlkc1tdID0gezEyM307CisgICAgVmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDsKKyAgICBHZXRTZXNzaW9uSWQoaWRzLCBBUlJBWV9TSVpFKGlkcyksICZzZXNzaW9uSWQpOworICAgIG1Ecm1TZXNzaW9uTWFuYWdlci0+YWRkU2Vzc2lvbihrVGVzdFBpZDIsIGRybSwgc2Vzc2lvbklkKTsKKworICAgIG1Ecm1TZXNzaW9uTWFuYWdlci0+cmVtb3ZlRHJtKG1UZXN0RHJtMik7CisKKyAgICBjb25zdCBQaWRTZXNzaW9uSW5mb3NNYXAmIG1hcCA9IHNlc3Npb25NYXAoKTsKKyAgICBjb25zdCBTZXNzaW9uSW5mb3MmIGluZm9zMiA9IG1hcC52YWx1ZUZvcihrVGVzdFBpZDIpOworICAgIEVYUEVDVF9FUSgxdSwgaW5mb3MyLnNpemUoKSk7CisgICAgLy8gbVRlc3REcm0yIGhhcyBiZWVuIHJlbW92ZWQuCisgICAgRXhwZWN0RXFTZXNzaW9uSW5mbyhpbmZvczJbMF0sIGRybSwgc2Vzc2lvbklkLCAzKTsKK30KKworVEVTVF9GKERybVNlc3Npb25NYW5hZ2VyVGVzdCwgcmVjbGFpbVNlc3Npb24pIHsKKyAgICBFWFBFQ1RfRkFMU0UobURybVNlc3Npb25NYW5hZ2VyLT5yZWNsYWltU2Vzc2lvbihrVGVzdFBpZDEpKTsKKyAgICBhZGRTZXNzaW9uKCk7CisKKyAgICAvLyBjYWxsaW5nIHBpZCBwcmlvcml0eSBpcyB0b28gbG93CisgICAgRVhQRUNUX0ZBTFNFKG1Ecm1TZXNzaW9uTWFuYWdlci0+cmVjbGFpbVNlc3Npb24oNTApKTsKKworICAgIEVYUEVDVF9UUlVFKG1Ecm1TZXNzaW9uTWFuYWdlci0+cmVjbGFpbVNlc3Npb24oMTApKTsKKyAgICBFWFBFQ1RfRVEoMXUsIG1UZXN0RHJtMS0+cmVjbGFpbWVkU2Vzc2lvbnMoKS5zaXplKCkpOworICAgIEVYUEVDVF9UUlVFKGlzRXF1YWxTZXNzaW9uSWQobVNlc3Npb25JZDEsIG1UZXN0RHJtMS0+cmVjbGFpbWVkU2Vzc2lvbnMoKVswXSkpOworCisgICAgbURybVNlc3Npb25NYW5hZ2VyLT5yZW1vdmVTZXNzaW9uKG1TZXNzaW9uSWQxKTsKKworICAgIC8vIGFkZCBhIHNlc3Npb24gZnJvbSBhIGhpZ2hlciBwcmlvcml0eSBwcm9jZXNzLgorICAgIHNwPEZha2VEcm0+IGRybSA9IG5ldyBGYWtlRHJtOworICAgIGNvbnN0IHVpbnQ4X3QgaWRzW10gPSB7MSwgMywgNX07CisgICAgVmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDsKKyAgICBHZXRTZXNzaW9uSWQoaWRzLCBBUlJBWV9TSVpFKGlkcyksICZzZXNzaW9uSWQpOworICAgIG1Ecm1TZXNzaW9uTWFuYWdlci0+YWRkU2Vzc2lvbigxNSwgZHJtLCBzZXNzaW9uSWQpOworCisgICAgRVhQRUNUX1RSVUUobURybVNlc3Npb25NYW5hZ2VyLT5yZWNsYWltU2Vzc2lvbigxOCkpOworICAgIEVYUEVDVF9FUSgxdSwgbVRlc3REcm0yLT5yZWNsYWltZWRTZXNzaW9ucygpLnNpemUoKSk7CisgICAgLy8gbVNlc3Npb25JZDIgaXMgcmVjbGFpbWVkLgorICAgIEVYUEVDVF9UUlVFKGlzRXF1YWxTZXNzaW9uSWQobVNlc3Npb25JZDIsIG1UZXN0RHJtMi0+cmVjbGFpbWVkU2Vzc2lvbnMoKVswXSkpOworfQorCitURVNUX0YoRHJtU2Vzc2lvbk1hbmFnZXJUZXN0LCBnZXRMb3dlc3RQcmlvcml0eSkgeworICAgIHRlc3RHZXRMb3dlc3RQcmlvcml0eSgpOworfQorCitURVNUX0YoRHJtU2Vzc2lvbk1hbmFnZXJUZXN0LCBnZXRMZWFzdFVzZWRTZXNzaW9uX2wpIHsKKyAgICB0ZXN0R2V0TGVhc3RVc2VkU2Vzc2lvbigpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5tawppbmRleCA5NzA3YzRhLi4xMzUzZjI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQubWsKQEAgLTExLDcgKzExLDYgQEAKICAgICBNb25vUGlwZVJlYWRlci5jcHAgICAgICAgICAgICAgIFwKICAgICBQaXBlLmNwcCAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBQaXBlUmVhZGVyLmNwcCAgICAgICAgICAgICAgICAgIFwKLSAgICByb3VuZHVwLmMgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBTb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmNwcAogCiBMT0NBTF9TUkNfRklMRVMgKz0gTkJMb2cuY3BwCkBAIC0yNywxMiArMjYsMTMgQEAKIExPQ0FMX01PRFVMRSA6PSBsaWJuYmFpbwogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3V0aWxzIFwKICAgICBsaWJiaW5kZXIgXAogICAgIGxpYmNvbW1vbl90aW1lX2NsaWVudCBcCiAgICAgbGliY3V0aWxzIFwKICAgICBsaWJ1dGlscyBcCiAgICAgbGlibG9nCiAKLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgKz0gbGliaW5zdGFudHNzcQorTE9DQUxfQ19JTkNMVURFUyA6PSAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL01vbm9QaXBlLmNwcCBiL21lZGlhL2xpYm5iYWlvL01vbm9QaXBlLmNwcAppbmRleCAwYjY1ODYxLi4xMjllOWVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9Nb25vUGlwZS5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vTW9ub1BpcGUuY3BwCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTW9ub1BpcGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmFpby9yb3VuZHVwLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcm91bmR1cC5oPgogCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL01vbm9QaXBlUmVhZGVyLmNwcCBiL21lZGlhL2xpYm5iYWlvL01vbm9QaXBlUmVhZGVyLmNwcAppbmRleCBkZTgyMjI5Li5lNGQzZWQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9Nb25vUGlwZVJlYWRlci5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vTW9ub1BpcGVSZWFkZXIuY3BwCkBAIC0zOSw3ICszOSw3IEBACiAgICAgICAgIHJldHVybiBORUdPVElBVEU7CiAgICAgfQogICAgIHNzaXplX3QgcmV0ID0gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZtUGlwZS0+bVJlYXIpIC0gbVBpcGUtPm1Gcm9udDsKLSAgICBBTE9HX0FTU0VSVCgoMCA8PSByZXQpICYmIChyZXQgPD0gbU1heEZyYW1lcykpOworICAgIEFMT0dfQVNTRVJUKCgwIDw9IHJldCkgJiYgKChzaXplX3QpIHJldCA8PSBtUGlwZS0+bU1heEZyYW1lcykpOwogICAgIHJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL1BpcGUuY3BwIGIvbWVkaWEvbGlibmJhaW8vUGlwZS5jcHAKaW5kZXggNmUwZWM4Yy4uMTNmMjExZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vUGlwZS5jcHAKKysrIGIvbWVkaWEvbGlibmJhaW8vUGlwZS5jcHAKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJhaW8vcm91bmR1cC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3JvdW5kdXAuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmFpby9yb3VuZHVwLmMgYi9tZWRpYS9saWJuYmFpby9yb3VuZHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNTUyZDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibmJhaW8vcm91bmR1cC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxtZWRpYS9uYmFpby9yb3VuZHVwLmg+Ci0KLXVuc2lnbmVkIHJvdW5kdXAodW5zaWduZWQgdikKLXsKLSAgICAvLyBfX2J1aWx0aW5fY2x6IGlzIHVuZGVmaW5lZCBmb3IgemVybyBpbnB1dAotICAgIGlmICh2ID09IDApIHsKLSAgICAgICAgdiA9IDE7Ci0gICAgfQotICAgIGludCBseiA9IF9fYnVpbHRpbl9jbHooKGludCkgdik7Ci0gICAgdW5zaWduZWQgcm91bmRlZCA9ICgodW5zaWduZWQpIDB4ODAwMDAwMDApID4+IGx6OwotICAgIC8vIDB4ODAwMDAwMDAxIGFuZCBoaWdoZXIgYXJlIGFjdHVhbGx5IHJvdW5kZWQgX2Rvd25fIHRvIHByZXZlbnQgb3ZlcmZsb3cKLSAgICBpZiAodiA+IHJvdW5kZWQgJiYgbHogPiAwKSB7Ci0gICAgICAgIHJvdW5kZWQgPDw9IDE7Ci0gICAgfQotICAgIHJldHVybiByb3VuZGVkOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ0V4dHJhY3Rvci5jcHAKaW5kZXggMTk2ZjZlZS4uNDVlOGEzMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNFeHRyYWN0b3IuY3BwCkBAIC0zNjAsNyArMzYwLDcgQEAKICAgICAgICAgcG9zICs9IGxlbjsKIAogICAgICAgICBBTE9HVigic2tpcHBlZCBJRDMgdGFnLCBuZXcgc3RhcnRpbmcgb2Zmc2V0IGlzICVsbGQgKDB4JTAxNmxseCkiLAotICAgICAgICAgICAgIHBvcywgcG9zKTsKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKXBvcywgKGxvbmcgbG9uZylwb3MpOwogICAgIH0KIAogICAgIHVpbnQ4X3QgaGVhZGVyWzJdOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ1dyaXRlci5jcHAKaW5kZXggMmU0MWQ4MC4uOWQ5MGRiZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwCkBAIC0zNiwzMyArMzYsMTkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1BQUNXcml0ZXI6OkFBQ1dyaXRlcihjb25zdCBjaGFyICpmaWxlbmFtZSkKLSAgICA6IG1GZCgtMSksCi0gICAgICBtSW5pdENoZWNrKE5PX0lOSVQpLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbVBhdXNlZChmYWxzZSksCi0gICAgICBtUmVzdW1lZChmYWxzZSksCi0gICAgICBtQ2hhbm5lbENvdW50KC0xKSwKLSAgICAgIG1TYW1wbGVSYXRlKC0xKSwKLSAgICAgIG1BQUNQcm9maWxlKE9NWF9BVURJT19BQUNPYmplY3RMQykgewotCi0gICAgQUxPR1YoIkFBQ1dyaXRlciBDb25zdHJ1Y3RvciIpOwotCi0gICAgbUZkID0gb3BlbihmaWxlbmFtZSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUiwgU19JUlVTUiB8IFNfSVdVU1IpOwotICAgIGlmIChtRmQgPj0gMCkgewotICAgICAgICBtSW5pdENoZWNrID0gT0s7Ci0gICAgfQotfQotCiBBQUNXcml0ZXI6OkFBQ1dyaXRlcihpbnQgZmQpCiAgICAgOiBtRmQoZHVwKGZkKSksCiAgICAgICBtSW5pdENoZWNrKG1GZCA8IDA/IE5PX0lOSVQ6IE9LKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKSwKICAgICAgIG1QYXVzZWQoZmFsc2UpLAogICAgICAgbVJlc3VtZWQoZmFsc2UpLAorICAgICAgbVRocmVhZCgwKSwKKyAgICAgIG1Fc3RpbWF0ZWRTaXplQnl0ZXMoMCksCisgICAgICBtRXN0aW1hdGVkRHVyYXRpb25VcygwKSwKICAgICAgIG1DaGFubmVsQ291bnQoLTEpLAogICAgICAgbVNhbXBsZVJhdGUoLTEpLAotICAgICAgbUFBQ1Byb2ZpbGUoT01YX0FVRElPX0FBQ09iamVjdExDKSB7CisgICAgICBtQUFDUHJvZmlsZShPTVhfQVVESU9fQUFDT2JqZWN0TEMpLAorICAgICAgbUZyYW1lRHVyYXRpb25VcygwKSB7CiB9CiAKIEFBQ1dyaXRlcjo6fkFBQ1dyaXRlcigpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCmluZGV4IDYyNTQ3MmYuLmQyNWU5OWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcApAQCAtMjQsNiArMjQsOCBAQAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KIAorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KQEAgLTM1LDE4ICszNywyMCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9CdWZmZXJQcm9kdWNlcldyYXBwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OYXRpdmVXaW5kb3dXcmFwcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT01YQ29kZWMuaD4KLQorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1BlcnNpc3RlbnRTdXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KIAogI2luY2x1ZGUgPE9NWF9BdWRpb0V4dC5oPgogI2luY2x1ZGUgPE9NWF9WaWRlb0V4dC5oPgogI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KICNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KKyNpbmNsdWRlIDxPTVhfQXNTdHJpbmcuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCiAKQEAgLTEwMyw2ICsxMDcsMTggQEAKICAgICBwYXJhbXMtPm5WZXJzaW9uLnMublN0ZXAgPSAwOwogfQogCitzdHJ1Y3QgTWVzc2FnZUxpc3QgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgTWVzc2FnZUxpc3QoKSB7CisgICAgfQorICAgIHZpcnR1YWwgfk1lc3NhZ2VMaXN0KCkgeworICAgIH0KKyAgICBzdGQ6Omxpc3Q8c3A8QU1lc3NhZ2U+ID4gJmdldExpc3QoKSB7IHJldHVybiBtTGlzdDsgfQorcHJpdmF0ZToKKyAgICBzdGQ6Omxpc3Q8c3A8QU1lc3NhZ2U+ID4gbUxpc3Q7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZXNzYWdlTGlzdCk7Cit9OworCiBzdHJ1Y3QgQ29kZWNPYnNlcnZlciA6IHB1YmxpYyBCbk9NWE9ic2VydmVyIHsKICAgICBDb2RlY09ic2VydmVyKCkge30KIApAQCAtMTExLDUyICsxMjcsNzggQEAKICAgICB9CiAKICAgICAvLyBmcm9tIElPTVhPYnNlcnZlcgotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UgJm9teF9tc2cpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOwotCi0gICAgICAgIG1zZy0+c2V0SW50MzIoInR5cGUiLCBvbXhfbXNnLnR5cGUpOwotICAgICAgICBtc2ctPnNldEludDMyKCJub2RlIiwgb214X21zZy5ub2RlKTsKLQotICAgICAgICBzd2l0Y2ggKG9teF9tc2cudHlwZSkgewotICAgICAgICAgICAgY2FzZSBvbXhfbWVzc2FnZTo6RVZFTlQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZXZlbnQiLCBvbXhfbXNnLnUuZXZlbnRfZGF0YS5ldmVudCk7Ci0gICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZGF0YTEiLCBvbXhfbXNnLnUuZXZlbnRfZGF0YS5kYXRhMSk7Ci0gICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZGF0YTIiLCBvbXhfbXNnLnUuZXZlbnRfZGF0YS5kYXRhMik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2Ugb214X21lc3NhZ2U6OkVNUFRZX0JVRkZFUl9ET05FOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImJ1ZmZlciIsIG9teF9tc2cudS5idWZmZXJfZGF0YS5idWZmZXIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIG9teF9tZXNzYWdlOjpGSUxMX0JVRkZFUl9ET05FOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoCi0gICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIiwgb214X21zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgICJyYW5nZV9vZmZzZXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgb214X21zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnJhbmdlX29mZnNldCk7Ci0gICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgICJyYW5nZV9sZW5ndGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgb214X21zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnJhbmdlX2xlbmd0aCk7Ci0gICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgICJmbGFncyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBvbXhfbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuZmxhZ3MpOwotICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICAidGltZXN0YW1wIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9teF9tc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS50aW1lc3RhbXApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZXMoY29uc3Qgc3RkOjpsaXN0PG9teF9tZXNzYWdlPiAmbWVzc2FnZXMpIHsKKyAgICAgICAgaWYgKG1lc3NhZ2VzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICBzcDxNZXNzYWdlTGlzdD4gbXNnTGlzdCA9IG5ldyBNZXNzYWdlTGlzdCgpOworICAgICAgICBmb3IgKHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbWVzc2FnZXMuY2JlZ2luKCk7CisgICAgICAgICAgICAgIGl0ICE9IG1lc3NhZ2VzLmNlbmQoKTsgKytpdCkgeworICAgICAgICAgICAgY29uc3Qgb214X21lc3NhZ2UgJm9teF9tc2cgPSAqaXQ7CisgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJub2RlIiwgb214X21zZy5ub2RlKTsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigidHlwZSIsIG9teF9tc2cudHlwZSk7CisgICAgICAgICAgICBzd2l0Y2ggKG9teF9tc2cudHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2Ugb214X21lc3NhZ2U6OkVWRU5UOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZXZlbnQiLCBvbXhfbXNnLnUuZXZlbnRfZGF0YS5ldmVudCk7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImRhdGExIiwgb214X21zZy51LmV2ZW50X2RhdGEuZGF0YTEpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJkYXRhMiIsIG9teF9tc2cudS5ldmVudF9kYXRhLmRhdGEyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBvbXhfbWVzc2FnZTo6RU1QVFlfQlVGRkVSX0RPTkU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJidWZmZXIiLCBvbXhfbXNnLnUuYnVmZmVyX2RhdGEuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZmVuY2VfZmQiLCBvbXhfbXNnLmZlbmNlRmQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIG9teF9tZXNzYWdlOjpGSUxMX0JVRkZFUl9ET05FOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIiwgb214X21zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJhbmdlX29mZnNldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb214X21zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnJhbmdlX29mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJhbmdlX2xlbmd0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb214X21zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnJhbmdlX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsYWdzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXhfbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDY0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lc3RhbXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9teF9tc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS50aW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZW5jZV9mZCIsIG9teF9tc2cuZmVuY2VGZCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2Ugb214X21lc3NhZ2U6OkZSQU1FX1JFTkRFUkVEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVkaWFfdGltZV91cyIsIG9teF9tc2cudS5yZW5kZXJfZGF0YS50aW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDY0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW1fbmFubyIsIG9teF9tc2cudS5yZW5kZXJfZGF0YS5uYW5vVGltZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJVbnJlY29nbml6ZWQgbWVzc2FnZSB0eXBlOiAlZCIsIG9teF9tc2cudHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXNnTGlzdC0+Z2V0TGlzdCgpLnB1c2hfYmFjayhtc2cpOworICAgICAgICB9CisgICAgICAgIG5vdGlmeS0+c2V0T2JqZWN0KCJtZXNzYWdlcyIsIG1zZ0xpc3QpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKICAgICB9CiAKIHByb3RlY3RlZDoKQEAgLTE5NCwxNSArMjM2LDI1IEBACiAgICAgdm9pZCBwb3N0RmlsbFRoaXNCdWZmZXIoQnVmZmVySW5mbyAqaW5mbyk7CiAKIHByaXZhdGU6CisgICAgLy8gSGFuZGxlcyBhbiBPTVggbWVzc2FnZS4gUmV0dXJucyB0cnVlIGlmZiBtZXNzYWdlIHdhcyBoYW5kbGVkLgogICAgIGJvb2wgb25PTVhNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKIAotICAgIGJvb2wgb25PTVhFbXB0eUJ1ZmZlckRvbmUoSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklEKTsKKyAgICAvLyBIYW5kbGVzIGEgbGlzdCBvZiBtZXNzYWdlcy4gUmV0dXJucyB0cnVlIGlmZiBtZXNzYWdlcyB3ZXJlIGhhbmRsZWQuCisgICAgYm9vbCBvbk9NWE1lc3NhZ2VMaXN0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIC8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBtZXNzYWdlIGlzIGZvciB0aGlzIGNvbXBvbmVudCBhbmQgdGhlIGNvbXBvbmVudCBpcyBhbGl2ZQorICAgIGJvb2wgY2hlY2tPTVhNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIGJvb2wgb25PTVhFbXB0eUJ1ZmZlckRvbmUoSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklELCBpbnQgZmVuY2VGZCk7CiAKICAgICBib29sIG9uT01YRmlsbEJ1ZmZlckRvbmUoCiAgICAgICAgICAgICBJT01YOjpidWZmZXJfaWQgYnVmZmVySUQsCiAgICAgICAgICAgICBzaXplX3QgcmFuZ2VPZmZzZXQsIHNpemVfdCByYW5nZUxlbmd0aCwKICAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3MsCi0gICAgICAgICAgICBpbnQ2NF90IHRpbWVVcyk7CisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywKKyAgICAgICAgICAgIGludCBmZW5jZUZkKTsKKworICAgIHZpcnR1YWwgYm9vbCBvbk9NWEZyYW1lUmVuZGVyZWQoaW50NjRfdCBtZWRpYVRpbWVVcywgbnNlY3NfdCBzeXN0ZW1OYW5vKTsKIAogICAgIHZvaWQgZ2V0TW9yZUlucHV0RGF0YUlmUG9zc2libGUoKTsKIApAQCAtMjU5LDkgKzMxMSwxMiBAQAogCiAgICAgYm9vbCBvbkNvbmZpZ3VyZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgdm9pZCBvbkNyZWF0ZUlucHV0U3VyZmFjZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBvblNldElucHV0U3VyZmFjZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgdm9pZCBvblN0YXJ0KCk7CiAgICAgdm9pZCBvblNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCk7CiAKKyAgICBzdGF0dXNfdCBzZXR1cElucHV0U3VyZmFjZSgpOworCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTG9hZGVkU3RhdGUpOwogfTsKIApAQCAtMzE3LDYgKzM3Miw3IEBACiAgICAgdmlydHVhbCB2b2lkIHN0YXRlRW50ZXJlZCgpOwogCiAgICAgdmlydHVhbCBib29sIG9uT01YRXZlbnQoT01YX0VWRU5UVFlQRSBldmVudCwgT01YX1UzMiBkYXRhMSwgT01YX1UzMiBkYXRhMik7CisgICAgdmlydHVhbCBib29sIG9uT01YRnJhbWVSZW5kZXJlZChpbnQ2NF90IG1lZGlhVGltZVVzLCBuc2Vjc190IHN5c3RlbU5hbm8pOwogCiBwcml2YXRlOgogICAgIGJvb2wgbUFjdGl2ZTsKQEAgLTMzNSw2ICszOTEsNyBAQAogICAgIHZpcnR1YWwgdm9pZCBzdGF0ZUVudGVyZWQoKTsKIAogICAgIHZpcnR1YWwgYm9vbCBvbk9NWEV2ZW50KE9NWF9FVkVOVFRZUEUgZXZlbnQsIE9NWF9VMzIgZGF0YTEsIE9NWF9VMzIgZGF0YTIpOworICAgIHZpcnR1YWwgYm9vbCBvbk9NWEZyYW1lUmVuZGVyZWQoaW50NjRfdCBtZWRpYVRpbWVVcywgbnNlY3NfdCBzeXN0ZW1OYW5vKTsKIAogcHJpdmF0ZToKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhPdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2VkU3RhdGUpOwpAQCAtNDAxLDI1ICs0NTgsNjMgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAordm9pZCBBQ29kZWM6OkJ1ZmZlckluZm86OnNldFdyaXRlRmVuY2UoaW50IGZlbmNlRmQsIGNvbnN0IGNoYXIgKmRiZykgeworICAgIGlmIChtRmVuY2VGZCA+PSAwKSB7CisgICAgICAgIEFMT0dXKCJPVkVSV1JJVEUgT0YgJXMgZmVuY2UgJWQgYnkgd3JpdGUgZmVuY2UgJWQgaW4gJXMiLAorICAgICAgICAgICAgICAgIG1Jc1JlYWRGZW5jZSA/ICJyZWFkIiA6ICJ3cml0ZSIsIG1GZW5jZUZkLCBmZW5jZUZkLCBkYmcpOworICAgIH0KKyAgICBtRmVuY2VGZCA9IGZlbmNlRmQ7CisgICAgbUlzUmVhZEZlbmNlID0gZmFsc2U7Cit9CisKK3ZvaWQgQUNvZGVjOjpCdWZmZXJJbmZvOjpzZXRSZWFkRmVuY2UoaW50IGZlbmNlRmQsIGNvbnN0IGNoYXIgKmRiZykgeworICAgIGlmIChtRmVuY2VGZCA+PSAwKSB7CisgICAgICAgIEFMT0dXKCJPVkVSV1JJVEUgT0YgJXMgZmVuY2UgJWQgYnkgcmVhZCBmZW5jZSAlZCBpbiAlcyIsCisgICAgICAgICAgICAgICAgbUlzUmVhZEZlbmNlID8gInJlYWQiIDogIndyaXRlIiwgbUZlbmNlRmQsIGZlbmNlRmQsIGRiZyk7CisgICAgfQorICAgIG1GZW5jZUZkID0gZmVuY2VGZDsKKyAgICBtSXNSZWFkRmVuY2UgPSB0cnVlOworfQorCit2b2lkIEFDb2RlYzo6QnVmZmVySW5mbzo6Y2hlY2tXcml0ZUZlbmNlKGNvbnN0IGNoYXIgKmRiZykgeworICAgIGlmIChtRmVuY2VGZCA+PSAwICYmIG1Jc1JlYWRGZW5jZSkgeworICAgICAgICBBTE9HRCgiUkVVU0lORyByZWFkIGZlbmNlICVkIGFzIHdyaXRlIGZlbmNlIGluICVzIiwgbUZlbmNlRmQsIGRiZyk7CisgICAgfQorfQorCit2b2lkIEFDb2RlYzo6QnVmZmVySW5mbzo6Y2hlY2tSZWFkRmVuY2UoY29uc3QgY2hhciAqZGJnKSB7CisgICAgaWYgKG1GZW5jZUZkID49IDAgJiYgIW1Jc1JlYWRGZW5jZSkgeworICAgICAgICBBTE9HRCgiUkVVU0lORyB3cml0ZSBmZW5jZSAlZCBhcyByZWFkIGZlbmNlIGluICVzIiwgbUZlbmNlRmQsIGRiZyk7CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCiBBQ29kZWM6OkFDb2RlYygpCiAgICAgOiBtUXVpcmtzKDApLAogICAgICAgbU5vZGUoMCksCisgICAgICBtTmF0aXZlV2luZG93VXNhZ2VCaXRzKDApLAogICAgICAgbVNlbnRGb3JtYXQoZmFsc2UpLAorICAgICAgbUlzVmlkZW8oZmFsc2UpLAogICAgICAgbUlzRW5jb2RlcihmYWxzZSksCi0gICAgICBtVXNlTWV0YWRhdGFPbkVuY29kZXJPdXRwdXQoZmFsc2UpLAogICAgICAgbUZhdGFsRXJyb3IoZmFsc2UpLAogICAgICAgbVNodXRkb3duSW5Qcm9ncmVzcyhmYWxzZSksCiAgICAgICBtRXhwbGljaXRTaHV0ZG93bihmYWxzZSksCisgICAgICBtSGFzTGFzdENyb3AoZmFsc2UpLAorICAgICAgbUxhc3RDcm9wezAsIDAsIDAsIDB9LAogICAgICAgbUVuY29kZXJEZWxheSgwKSwKICAgICAgIG1FbmNvZGVyUGFkZGluZygwKSwKICAgICAgIG1Sb3RhdGlvbkRlZ3JlZXMoMCksCiAgICAgICBtQ2hhbm5lbE1hc2tQcmVzZW50KGZhbHNlKSwKICAgICAgIG1DaGFubmVsTWFzaygwKSwKICAgICAgIG1EZXF1ZXVlQ291bnRlcigwKSwKLSAgICAgIG1TdG9yZU1ldGFEYXRhSW5PdXRwdXRCdWZmZXJzKGZhbHNlKSwKLSAgICAgIG1NZXRhRGF0YUJ1ZmZlcnNUb1N1Ym1pdCgwKSwKKyAgICAgIG1JbnB1dE1ldGFkYXRhVHlwZShrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZCksCisgICAgICBtT3V0cHV0TWV0YWRhdGFUeXBlKGtNZXRhZGF0YUJ1ZmZlclR5cGVJbnZhbGlkKSwKKyAgICAgIG1MZWdhY3lBZGFwdGl2ZUV4cGVyaW1lbnQoZmFsc2UpLAorICAgICAgbU1ldGFkYXRhQnVmZmVyc1RvU3VibWl0KDApLAogICAgICAgbVJlcGVhdEZyYW1lRGVsYXlVcygtMWxsKSwKICAgICAgIG1NYXhQdHNHYXBVcygtMWxsKSwKKyAgICAgIG1NYXhGcHMoLTEpLAogICAgICAgbVRpbWVQZXJGcmFtZVVzKC0xbGwpLAogICAgICAgbVRpbWVQZXJDYXB0dXJlVXMoLTFsbCksCiAgICAgICBtQ3JlYXRlSW5wdXRCdWZmZXJzU3VzcGVuZGVkKGZhbHNlKSwKQEAgLTQ1Miw2MSArNTQ3LDgxIEBACiAKIHZvaWQgQUNvZGVjOjppbml0aWF0ZVNldHVwKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgbXNnLT5zZXRXaGF0KGtXaGF0U2V0dXApOwotICAgIG1zZy0+c2V0VGFyZ2V0KGlkKCkpOworICAgIG1zZy0+c2V0VGFyZ2V0KHRoaXMpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCiB2b2lkIEFDb2RlYzo6c2lnbmFsU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcykgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRQYXJhbWV0ZXJzLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0UGFyYW1ldGVycywgdGhpcyk7CiAgICAgbXNnLT5zZXRNZXNzYWdlKCJwYXJhbXMiLCBwYXJhbXMpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCiB2b2lkIEFDb2RlYzo6aW5pdGlhdGVBbGxvY2F0ZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIG1zZy0+c2V0V2hhdChrV2hhdEFsbG9jYXRlQ29tcG9uZW50KTsKLSAgICBtc2ctPnNldFRhcmdldChpZCgpKTsKKyAgICBtc2ctPnNldFRhcmdldCh0aGlzKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KIAogdm9pZCBBQ29kZWM6OmluaXRpYXRlQ29uZmlndXJlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgbXNnLT5zZXRXaGF0KGtXaGF0Q29uZmlndXJlQ29tcG9uZW50KTsKLSAgICBtc2ctPnNldFRhcmdldChpZCgpKTsKKyAgICBtc2ctPnNldFRhcmdldCh0aGlzKTsKICAgICBtc2ctPnBvc3QoKTsKIH0KIAorc3RhdHVzX3QgQUNvZGVjOjpzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldFN1cmZhY2UsIHRoaXMpOworICAgIG1zZy0+c2V0T2JqZWN0KCJzdXJmYWNlIiwgc3VyZmFjZSk7CisKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CisgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOworCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAodm9pZClyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKwogdm9pZCBBQ29kZWM6OmluaXRpYXRlQ3JlYXRlSW5wdXRTdXJmYWNlKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRDcmVhdGVJbnB1dFN1cmZhY2UsIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRDcmVhdGVJbnB1dFN1cmZhY2UsIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIEFDb2RlYzo6aW5pdGlhdGVTZXRJbnB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRJbnB1dFN1cmZhY2UsIHRoaXMpOworICAgIG1zZy0+c2V0T2JqZWN0KCJpbnB1dC1zdXJmYWNlIiwgc3VyZmFjZSk7CisgICAgbXNnLT5wb3N0KCk7CiB9CiAKIHZvaWQgQUNvZGVjOjpzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTaWduYWxFbmRPZklucHV0U3RyZWFtLCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSwgdGhpcykpLT5wb3N0KCk7CiB9CiAKIHZvaWQgQUNvZGVjOjppbml0aWF0ZVN0YXJ0KCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBBQ29kZWM6OnNpZ25hbEZsdXNoKCkgewogICAgIEFMT0dWKCJbJXNdIHNpZ25hbEZsdXNoIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdEZsdXNoLCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0Rmx1c2gsIHRoaXMpKS0+cG9zdCgpOwogfQogCiB2b2lkIEFDb2RlYzo6c2lnbmFsUmVzdW1lKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bWUsIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bWUsIHRoaXMpKS0+cG9zdCgpOwogfQogCiB2b2lkIEFDb2RlYzo6aW5pdGlhdGVTaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2h1dGRvd24sIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTaHV0ZG93biwgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQzMigia2VlcENvbXBvbmVudEFsbG9jYXRlZCIsIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQpOwogICAgIG1zZy0+cG9zdCgpOwogICAgIGlmICgha2VlcENvbXBvbmVudEFsbG9jYXRlZCkgewogICAgICAgICAvLyBlbnN1cmUgc2h1dGRvd24gY29tcGxldGVzIGluIDMgc2Vjb25kcwotICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVsZWFzZUNvZGVjSW5zdGFuY2UsIGlkKCkpKS0+cG9zdCgzMDAwMDAwKTsKKyAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlbGVhc2VDb2RlY0luc3RhbmNlLCB0aGlzKSktPnBvc3QoMzAwMDAwMCk7CiAgICAgfQogfQogCiB2b2lkIEFDb2RlYzo6c2lnbmFsUmVxdWVzdElEUkZyYW1lKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXF1ZXN0SURSRnJhbWUsIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXF1ZXN0SURSRnJhbWUsIHRoaXMpKS0+cG9zdCgpOwogfQogCiAvLyAqKiogTk9URTogVEhFIEZPTExPV0lORyBXT1JLQVJPVU5EIFdJTEwgQkUgUkVNT1ZFRCAqKioKQEAgLTUxNCwxMyArNjI5LDE0OCBAQAogLy8gVGhpcyBjYXVzZXMgYSBoYWx0IGlmIHdlIGFscmVhZHkgc2lnbmFsZWQgYW4gRU9TIG9uIHRoZSBpbnB1dAogLy8gcG9ydC4gIEZvciBub3cga2VlcCBzdWJtaXR0aW5nIGFuIG91dHB1dCBidWZmZXIgaWYgdGhlcmUgd2FzIGFuCiAvLyBFT1Mgb24gdGhlIGlucHV0IHBvcnQsIGJ1dCBub3QgeWV0IG9uIHRoZSBvdXRwdXQgcG9ydC4KLXZvaWQgQUNvZGVjOjpzaWduYWxTdWJtaXRPdXRwdXRNZXRhRGF0YUJ1ZmZlcklmRU9TX3dvcmthcm91bmQoKSB7Cit2b2lkIEFDb2RlYzo6c2lnbmFsU3VibWl0T3V0cHV0TWV0YWRhdGFCdWZmZXJJZkVPU193b3JrYXJvdW5kKCkgewogICAgIGlmIChtUG9ydEVPU1trUG9ydEluZGV4SW5wdXRdICYmICFtUG9ydEVPU1trUG9ydEluZGV4T3V0cHV0XSAmJgotICAgICAgICAgICAgbU1ldGFEYXRhQnVmZmVyc1RvU3VibWl0ID4gMCkgewotICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3VibWl0T3V0cHV0TWV0YURhdGFCdWZmZXJJZkVPUywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICBtTWV0YWRhdGFCdWZmZXJzVG9TdWJtaXQgPiAwKSB7CisgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdWJtaXRPdXRwdXRNZXRhZGF0YUJ1ZmZlcklmRU9TLCB0aGlzKSktPnBvc3QoKTsKICAgICB9CiB9CiAKK3N0YXR1c190IEFDb2RlYzo6aGFuZGxlU2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIC8vIGFsbG93IGtlZXBpbmcgdW5zZXQgc3VyZmFjZQorICAgIGlmIChzdXJmYWNlID09IE5VTEwpIHsKKyAgICAgICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR1coImNhbm5vdCB1bnNldCBhIHN1cmZhY2UiKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gY2Fubm90IHN3aXRjaCBmcm9tIGJ5dGVidWZmZXJzIHRvIHN1cmZhY2UKKyAgICBpZiAobU5hdGl2ZVdpbmRvdyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJjb21wb25lbnQgd2FzIG5vdCBjb25maWd1cmVkIHdpdGggYSBzdXJmYWNlIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBBTmF0aXZlV2luZG93ICpuYXRpdmVXaW5kb3cgPSBzdXJmYWNlLmdldCgpOworICAgIC8vIGlmIHdlIGhhdmUgbm90IHlldCBzdGFydGVkIHRoZSBjb2RlYywgd2UgY2FuIHNpbXBseSBzZXQgdGhlIG5hdGl2ZSB3aW5kb3cKKyAgICBpZiAobUJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5zaXplKCkgPT0gMCkgeworICAgICAgICBtTmF0aXZlV2luZG93ID0gc3VyZmFjZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIHdlIGRvIG5vdCBzdXBwb3J0IGNoYW5naW5nIGEgdHVubmVsZWQgc3VyZmFjZSBhZnRlciBzdGFydAorICAgIGlmIChtVHVubmVsZWQpIHsKKyAgICAgICAgQUxPR1coImNhbm5vdCBjaGFuZ2UgdHVubmVsZWQgc3VyZmFjZSIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaW50IHVzYWdlQml0cyA9IDA7CisgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBOYXRpdmVXaW5kb3dTaXplRm9ybWF0QW5kVXNhZ2UobmF0aXZlV2luZG93LCAmdXNhZ2VCaXRzKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50IGlnbm9yZWRGbGFncyA9IGtWaWRlb0dyYWxsb2NVc2FnZTsKKyAgICAvLyBOZXcgb3V0cHV0IHN1cmZhY2UgaXMgbm90IGFsbG93ZWQgdG8gYWRkIG5ldyB1c2FnZSBmbGFnIGV4Y2VwdCBpZ25vcmVkIG9uZXMuCisgICAgaWYgKCh1c2FnZUJpdHMgJiB+KG1OYXRpdmVXaW5kb3dVc2FnZUJpdHMgfCBpZ25vcmVkRmxhZ3MpKSAhPSAwKSB7CisgICAgICAgIEFMT0dXKCJjYW5ub3QgY2hhbmdlIHVzYWdlIGZyb20gJSN4IHRvICUjeCIsIG1OYXRpdmVXaW5kb3dVc2FnZUJpdHMsIHVzYWdlQml0cyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gZ2V0IG1pbiB1bmRlcXVldWVkIGNvdW50LiBXZSBjYW5ub3Qgc3dpdGNoIHRvIGEgc3VyZmFjZSB0aGF0IGhhcyBhIGhpZ2hlcgorICAgIC8vIHVuZGVxdWV1ZWQgY291bnQgdGhhbiB3ZSBhbGxvY2F0ZWQuCisgICAgaW50IG1pblVuZGVxdWV1ZWRCdWZmZXJzID0gMDsKKyAgICBlcnIgPSBuYXRpdmVXaW5kb3ctPnF1ZXJ5KAorICAgICAgICAgICAgbmF0aXZlV2luZG93LCBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsCisgICAgICAgICAgICAmbWluVW5kZXF1ZXVlZEJ1ZmZlcnMpOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICBBTE9HRSgiTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTIHF1ZXJ5IGZhaWxlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBpZiAobWluVW5kZXF1ZXVlZEJ1ZmZlcnMgPiAoaW50KW1OdW1VbmRlcXVldWVkQnVmZmVycykgeworICAgICAgICBBTE9HRSgibmV3IHN1cmZhY2UgaG9sZHMgb250byBtb3JlIGJ1ZmZlcnMgKCVkKSB0aGFuIHBsYW5uZWQgZm9yICglenUpIiwKKyAgICAgICAgICAgICAgICBtaW5VbmRlcXVldWVkQnVmZmVycywgbU51bVVuZGVxdWV1ZWRCdWZmZXJzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyB3ZSBjYW5ub3QgY2hhbmdlIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGJ1ZmZlcnMgd2hpbGUgT01YIGlzIHJ1bm5pbmcKKyAgICAvLyBzZXQgdXAgc3VyZmFjZSB0byB0aGUgc2FtZSBjb3VudAorICAgIFZlY3RvcjxCdWZmZXJJbmZvPiAmYnVmZmVycyA9IG1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdOworICAgIEFMT0dWKCJzZXR0aW5nIHVwIHN1cmZhY2UgZm9yICV6dSBidWZmZXJzIiwgYnVmZmVycy5zaXplKCkpOworCisgICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KG5hdGl2ZVdpbmRvdywgYnVmZmVycy5zaXplKCkpOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICBBTE9HRSgibmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50IGZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLAorICAgICAgICAgICAgICAgIC1lcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIC8vIG5lZWQgdG8gZW5hYmxlIGFsbG9jYXRpb24gd2hlbiBhdHRhY2hpbmcKKyAgICBzdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCktPmFsbG93QWxsb2NhdGlvbih0cnVlKTsKKworICAgIC8vIGZvciBtZXRhIGRhdGEgbW9kZSwgd2UgbW92ZSBkZXF1ZXVkIGJ1ZmZlcnMgdG8gdGhlIG5ldyBzdXJmYWNlLgorICAgIC8vIGZvciBub24tbWV0YSBtb2RlLCB3ZSBtdXN0IG1vdmUgYWxsIHJlZ2lzdGVyZWQgYnVmZmVycworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBCdWZmZXJJbmZvICZpbmZvID0gYnVmZmVyc1tpXTsKKyAgICAgICAgLy8gc2tpcCB1bmRlcXVldWVkIGJ1ZmZlcnMgZm9yIG1ldGEgZGF0YSBtb2RlCisgICAgICAgIGlmIChzdG9yaW5nTWV0YWRhdGFJbkRlY29kZWRCdWZmZXJzKCkKKyAgICAgICAgICAgICAgICAmJiAhbUxlZ2FjeUFkYXB0aXZlRXhwZXJpbWVudAorICAgICAgICAgICAgICAgICYmIGluZm8ubVN0YXR1cyA9PSBCdWZmZXJJbmZvOjpPV05FRF9CWV9OQVRJVkVfV0lORE9XKSB7CisgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgYnVmZmVyICVwIiwgaW5mby5tR3JhcGhpY0J1ZmZlciA9PSBOVUxMID8KKyAgICAgICAgICAgICAgICAgICAgTlVMTCA6IGluZm8ubUdyYXBoaWNCdWZmZXItPmdldE5hdGl2ZUJ1ZmZlcigpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJhdHRhY2hpbmcgYnVmZmVyICVwIiwgaW5mby5tR3JhcGhpY0J1ZmZlci0+Z2V0TmF0aXZlQnVmZmVyKCkpOworCisgICAgICAgIGVyciA9IHN1cmZhY2UtPmF0dGFjaEJ1ZmZlcihpbmZvLm1HcmFwaGljQnVmZmVyLT5nZXROYXRpdmVCdWZmZXIoKSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gYXR0YWNoIGJ1ZmZlciAlcCB0byB0aGUgbmV3IHN1cmZhY2U6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBpbmZvLm1HcmFwaGljQnVmZmVyID09IE5VTEwgPworICAgICAgICAgICAgICAgICAgICBOVUxMIDogaW5mby5tR3JhcGhpY0J1ZmZlci0+Z2V0TmF0aXZlQnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjYW5jZWwgdW5kZXF1ZXVlZCBidWZmZXJzIHRvIG5ldyBzdXJmYWNlCisgICAgaWYgKCFzdG9yaW5nTWV0YWRhdGFJbkRlY29kZWRCdWZmZXJzKCkgfHwgbUxlZ2FjeUFkYXB0aXZlRXhwZXJpbWVudCkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIEJ1ZmZlckluZm8gJmluZm8gPSBidWZmZXJzLmVkaXRJdGVtQXQoaSk7CisgICAgICAgICAgICBpZiAoaW5mby5tU3RhdHVzID09IEJ1ZmZlckluZm86Ok9XTkVEX0JZX05BVElWRV9XSU5ET1cpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2FuY2VsaW5nIGJ1ZmZlciAlcCIsIGluZm8ubUdyYXBoaWNCdWZmZXItPmdldE5hdGl2ZUJ1ZmZlcigpKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBuYXRpdmVXaW5kb3ctPmNhbmNlbEJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVdpbmRvdywgaW5mby5tR3JhcGhpY0J1ZmZlci0+Z2V0TmF0aXZlQnVmZmVyKCksIGluZm8ubUZlbmNlRmQpOworICAgICAgICAgICAgICAgIGluZm8ubUZlbmNlRmQgPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gY2FuY2VsIGJ1ZmZlciAlcCB0byB0aGUgbmV3IHN1cmZhY2U6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubUdyYXBoaWNCdWZmZXItPmdldE5hdGl2ZUJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gZGlzYWxsb3cgZnVydGhlciBhbGxvY2F0aW9uCisgICAgICAgICh2b2lkKXN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKS0+YWxsb3dBbGxvY2F0aW9uKGZhbHNlKTsKKyAgICB9CisKKyAgICAvLyBwdXNoIGJsYW5rIGJ1ZmZlcnMgdG8gcHJldmlvdXMgd2luZG93IGlmIHJlcXVlc3RlZAorICAgIGlmIChtRmxhZ3MgJiBrRmxhZ1B1c2hCbGFua0J1ZmZlcnNUb05hdGl2ZVdpbmRvd09uU2h1dGRvd24pIHsKKyAgICAgICAgcHVzaEJsYW5rQnVmZmVyc1RvTmF0aXZlV2luZG93KG1OYXRpdmVXaW5kb3cuZ2V0KCkpOworICAgIH0KKworICAgIC8vIFJlc3RvcmUgdGhlIGNyb3AgcmVjdGFuZ2xlIHVzaW5nIHBhc3QgaW5mb3JtYXRpb24gaWYgYXZhaWxhYmxlCisgICAgaWYgKG1IYXNMYXN0Q3JvcCkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9jcm9wKG5hdGl2ZVdpbmRvdywgJm1MYXN0Q3JvcCk7CisgICAgICAgIEFMT0dXX0lGKGVyciAhPSBOT19FUlJPUiwgImZhaWxlZCB0byByZXN0b3JlIGNyb3A6ICVkIiwgZXJyKTsKKyAgICB9CisKKyAgICBtTmF0aXZlV2luZG93ID0gbmF0aXZlV2luZG93OworICAgIG1OYXRpdmVXaW5kb3dVc2FnZUJpdHMgPSB1c2FnZUJpdHM7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBBQ29kZWM6OmFsbG9jYXRlQnVmZmVyc09uUG9ydChPTVhfVTMyIHBvcnRJbmRleCkgewogICAgIENIRUNLKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgfHwgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQpOwogCkBAIC01MjksOCArNzc5LDggQEAKIAogICAgIHN0YXR1c190IGVycjsKICAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMICYmIHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0KSB7Ci0gICAgICAgIGlmIChtU3RvcmVNZXRhRGF0YUluT3V0cHV0QnVmZmVycykgewotICAgICAgICAgICAgZXJyID0gYWxsb2NhdGVPdXRwdXRNZXRhRGF0YUJ1ZmZlcnMoKTsKKyAgICAgICAgaWYgKHN0b3JpbmdNZXRhZGF0YUluRGVjb2RlZEJ1ZmZlcnMoKSkgeworICAgICAgICAgICAgZXJyID0gYWxsb2NhdGVPdXRwdXRNZXRhZGF0YUJ1ZmZlcnMoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGVyciA9IGFsbG9jYXRlT3V0cHV0QnVmZmVyc0Zyb21OYXRpdmVXaW5kb3coKTsKICAgICAgICAgfQpAQCAtNTQzLDIyICs3OTMsNDQgQEAKICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgJmRlZiwgc2l6ZW9mKGRlZikpOwogCiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dWKCJbJXNdIEFsbG9jYXRpbmcgJXUgYnVmZmVycyBvZiBzaXplICV1IG9uICVzIHBvcnQiLAorICAgICAgICAgICAgTWV0YWRhdGFCdWZmZXJUeXBlIHR5cGUgPQorICAgICAgICAgICAgICAgIHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0ID8gbU91dHB1dE1ldGFkYXRhVHlwZSA6IG1JbnB1dE1ldGFkYXRhVHlwZTsKKyAgICAgICAgICAgIGludDMyX3QgYnVmU2l6ZSA9IGRlZi5uQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgIGlmICh0eXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKSB7CisgICAgICAgICAgICAgICAgYnVmU2l6ZSA9IHNpemVvZihWaWRlb0dyYWxsb2NNZXRhZGF0YSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUFOV0J1ZmZlcikgeworICAgICAgICAgICAgICAgIGJ1ZlNpemUgPSBzaXplb2YoVmlkZW9OYXRpdmVNZXRhZGF0YSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIHVzaW5nIGdyYWxsb2Mgb3IgbmF0aXZlIHNvdXJjZSBpbnB1dCBtZXRhZGF0YSBidWZmZXJzLCBhbGxvY2F0ZSBsYXJnZXN0CisgICAgICAgICAgICAvLyBtZXRhZGF0YSBzaXplIGFzIHdlIHByZWZlciB0byBnZW5lcmF0ZSBuYXRpdmUgc291cmNlIG1ldGFkYXRhLCBidXQgY29tcG9uZW50CisgICAgICAgICAgICAvLyBtYXkgcmVxdWlyZSBncmFsbG9jIHNvdXJjZS4gRm9yIGNhbWVyYSBzb3VyY2UsIGFsbG9jYXRlIGF0IGxlYXN0IGVub3VnaAorICAgICAgICAgICAgLy8gc2l6ZSBmb3IgbmF0aXZlIG1ldGFkYXRhIGJ1ZmZlcnMuCisgICAgICAgICAgICBpbnQzMl90IGFsbG90dGVkU2l6ZSA9IGJ1ZlNpemU7CisgICAgICAgICAgICBpZiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCAmJiB0eXBlID49IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKSB7CisgICAgICAgICAgICAgICAgYnVmU2l6ZSA9IG1heChzaXplb2YoVmlkZW9HcmFsbG9jTWV0YWRhdGEpLCBzaXplb2YoVmlkZW9OYXRpdmVNZXRhZGF0YSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0ICYmIHR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUNhbWVyYVNvdXJjZSkgeworICAgICAgICAgICAgICAgIGJ1ZlNpemUgPSBtYXgoYnVmU2l6ZSwgKGludDMyX3Qpc2l6ZW9mKFZpZGVvTmF0aXZlTWV0YWRhdGEpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoIlslc10gQWxsb2NhdGluZyAldSBidWZmZXJzIG9mIHNpemUgJWQvJWQgKGZyb20gJXUgdXNpbmcgJXMpIG9uICVzIHBvcnQiLAogICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsLCBkZWYubkJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwsIGJ1ZlNpemUsIGFsbG90dGVkU2l6ZSwgZGVmLm5CdWZmZXJTaXplLCBhc1N0cmluZyh0eXBlKSwKICAgICAgICAgICAgICAgICAgICAgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCA/ICJpbnB1dCIgOiAib3V0cHV0Iik7CiAKLSAgICAgICAgICAgIHNpemVfdCB0b3RhbFNpemUgPSBkZWYubkJ1ZmZlckNvdW50QWN0dWFsICogZGVmLm5CdWZmZXJTaXplOworICAgICAgICAgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgKiBidWZTaXplOwogICAgICAgICAgICAgbURlYWxlcltwb3J0SW5kZXhdID0gbmV3IE1lbW9yeURlYWxlcih0b3RhbFNpemUsICJBQ29kZWMiKTsKIAotICAgICAgICAgICAgZm9yIChPTVhfVTMyIGkgPSAwOyBpIDwgZGVmLm5CdWZmZXJDb3VudEFjdHVhbDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgc3A8SU1lbW9yeT4gbWVtID0gbURlYWxlcltwb3J0SW5kZXhdLT5hbGxvY2F0ZShkZWYubkJ1ZmZlclNpemUpOworICAgICAgICAgICAgZm9yIChPTVhfVTMyIGkgPSAwOyBpIDwgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCAmJiBlcnIgPT0gT0s7ICsraSkgeworICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+IG1lbSA9IG1EZWFsZXJbcG9ydEluZGV4XS0+YWxsb2NhdGUoYnVmU2l6ZSk7CiAgICAgICAgICAgICAgICAgaWYgKG1lbSA9PSBOVUxMIHx8IG1lbS0+cG9pbnRlcigpID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBCdWZmZXJJbmZvIGluZm87CiAgICAgICAgICAgICAgICAgaW5mby5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfVVM7CisgICAgICAgICAgICAgICAgaW5mby5tRmVuY2VGZCA9IC0xOworICAgICAgICAgICAgICAgIGluZm8ubVJlbmRlckluZm8gPSBOVUxMOwogCiAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlckJpdCA9CiAgICAgICAgICAgICAgICAgICAgIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0KQpAQCAtNTY2LDI3ICs4MzgsMjcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIDogT01YQ29kZWM6OmtSZXF1aXJlc0FsbG9jYXRlQnVmZmVyT25PdXRwdXRQb3J0czsKIAogICAgICAgICAgICAgICAgIGlmICgocG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCAmJiAobUZsYWdzICYga0ZsYWdJc1NlY3VyZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtVXNlTWV0YWRhdGFPbkVuY29kZXJPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCAmJiB1c2luZ01ldGFkYXRhT25FbmNvZGVyT3V0cHV0KCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1lbS5jbGVhcigpOwogCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnB0cjsKICAgICAgICAgICAgICAgICAgICAgZXJyID0gbU9NWC0+YWxsb2NhdGVCdWZmZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIHBvcnRJbmRleCwgZGVmLm5CdWZmZXJTaXplLCAmaW5mby5tQnVmZmVySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIHBvcnRJbmRleCwgYnVmU2l6ZSwgJmluZm8ubUJ1ZmZlcklELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdHIpOwogCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgYnVmU2l6ZSA9IG1Vc2VNZXRhZGF0YU9uRW5jb2Rlck91dHB1dCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKDQgKyBzaXplb2YoYnVmZmVyX2hhbmRsZV90KSkgOiBkZWYubkJ1ZmZlclNpemU7Ci0KICAgICAgICAgICAgICAgICAgICAgaW5mby5tRGF0YSA9IG5ldyBBQnVmZmVyKHB0ciwgYnVmU2l6ZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUXVpcmtzICYgcmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlckJpdCkgewogICAgICAgICAgICAgICAgICAgICBlcnIgPSBtT01YLT5hbGxvY2F0ZUJ1ZmZlcldpdGhCYWNrdXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIHBvcnRJbmRleCwgbWVtLCAmaW5mby5tQnVmZmVySUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBwb3J0SW5kZXgsIG1lbSwgJmluZm8ubUJ1ZmZlcklELCBhbGxvdHRlZFNpemUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVgtPnVzZUJ1ZmZlcihtTm9kZSwgcG9ydEluZGV4LCBtZW0sICZpbmZvLm1CdWZmZXJJRCk7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVgtPnVzZUJ1ZmZlcihtTm9kZSwgcG9ydEluZGV4LCBtZW0sICZpbmZvLm1CdWZmZXJJRCwgYWxsb3R0ZWRTaXplKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAobWVtICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW5mby5tRGF0YSA9IG5ldyBBQnVmZmVyKG1lbS0+cG9pbnRlcigpLCBkZWYubkJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgICAgICBpbmZvLm1EYXRhID0gbmV3IEFCdWZmZXIobWVtLT5wb2ludGVyKCksIGJ1ZlNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKFZpZGVvTmF0aXZlTWV0YWRhdGEgKiltZW0tPnBvaW50ZXIoKSktPm5GZW5jZUZkID0gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBtQnVmZmVyc1twb3J0SW5kZXhdLnB1c2goaW5mbyk7CkBAIC02MTcsOSArODg5LDggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IEFDb2RlYzo6Y29uZmlndXJlT3V0cHV0QnVmZmVyc0Zyb21OYXRpdmVXaW5kb3coCi0gICAgICAgIE9NWF9VMzIgKmJ1ZmZlckNvdW50LCBPTVhfVTMyICpidWZmZXJTaXplLAotICAgICAgICBPTVhfVTMyICptaW5VbmRlcXVldWVkQnVmZmVycykgeworc3RhdHVzX3QgQUNvZGVjOjpzZXR1cE5hdGl2ZVdpbmRvd1NpemVGb3JtYXRBbmRVc2FnZSgKKyAgICAgICAgQU5hdGl2ZVdpbmRvdyAqbmF0aXZlV2luZG93IC8qIG5vbm51bGwgKi8sIGludCAqZmluYWxVc2FnZSAvKiBub25udWxsICovKSB7CiAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7CiAgICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKICAgICBkZWYublBvcnRJbmRleCA9IGtQb3J0SW5kZXhPdXRwdXQ7CkBAIC02MzEsNDAgKzkwMiw2IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeSgKLSAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoLAotICAgICAgICAgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQsCi0gICAgICAgICAgICBkZWYuZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCk7Ci0KLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgQUxPR0UoIm5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKG1Sb3RhdGlvbkRlZ3JlZXMgIT0gMCkgewotICAgICAgICB1aW50MzJfdCB0cmFuc2Zvcm0gPSAwOwotICAgICAgICBzd2l0Y2ggKG1Sb3RhdGlvbkRlZ3JlZXMpIHsKLSAgICAgICAgICAgIGNhc2UgMDogdHJhbnNmb3JtID0gMDsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDkwOiB0cmFuc2Zvcm0gPSBIQUxfVFJBTlNGT1JNX1JPVF85MDsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE4MDogdHJhbnNmb3JtID0gSEFMX1RSQU5TRk9STV9ST1RfMTgwOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjcwOiB0cmFuc2Zvcm0gPSBIQUxfVFJBTlNGT1JNX1JPVF8yNzA7IGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDogdHJhbnNmb3JtID0gMDsgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHJhbnNmb3JtID4gMCkgewotICAgICAgICAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190cmFuc2Zvcm0oCi0gICAgICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIHRyYW5zZm9ybSk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190cmFuc2Zvcm0gZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gU2V0IHVwIHRoZSBuYXRpdmUgd2luZG93LgogICAgIE9NWF9VMzIgdXNhZ2UgPSAwOwogICAgIGVyciA9IG1PTVgtPmdldEdyYXBoaWNCdWZmZXJVc2FnZShtTm9kZSwga1BvcnRJbmRleE91dHB1dCwgJnVzYWdlKTsKICAgICBpZiAoZXJyICE9IDApIHsKQEAgLTY3OCw0MyArOTE1LDM0IEBACiAgICAgICAgIHVzYWdlIHw9IEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEOwogICAgIH0KIAotICAgIC8vIE1ha2Ugc3VyZSB0byBjaGVjayB3aGV0aGVyIGVpdGhlciBTdGFnZWZyaWdodCBvciB0aGUgdmlkZW8gZGVjb2RlcgotICAgIC8vIHJlcXVlc3RlZCBwcm90ZWN0ZWQgYnVmZmVycy4KLSAgICBpZiAodXNhZ2UgJiBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCkgewotICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgQU5hdGl2ZVdpbmRvdyBzZW5kcyBpbWFnZXMgZGlyZWN0bHkgdG8KLSAgICAgICAgLy8gU3VyZmFjZUZsaW5nZXIuCi0gICAgICAgIGludCBxdWV1ZXNUb05hdGl2ZVdpbmRvdyA9IDA7Ci0gICAgICAgIGVyciA9IG1OYXRpdmVXaW5kb3ctPnF1ZXJ5KAotICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIE5BVElWRV9XSU5ET1dfUVVFVUVTX1RPX1dJTkRPV19DT01QT1NFUiwKLSAgICAgICAgICAgICAgICAmcXVldWVzVG9OYXRpdmVXaW5kb3cpOwotICAgICAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciBhdXRoZW50aWNhdGluZyBuYXRpdmUgd2luZG93OiAlZCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIGlmIChxdWV1ZXNUb05hdGl2ZVdpbmRvdyAhPSAxKSB7Ci0gICAgICAgICAgICBBTE9HRSgibmF0aXZlIHdpbmRvdyBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgICAgICB9CisgICAgdXNhZ2UgfD0ga1ZpZGVvR3JhbGxvY1VzYWdlOworICAgICpmaW5hbFVzYWdlID0gdXNhZ2U7CisKKyAgICBBTE9HVigiZ3JhbGxvYyB1c2FnZTogJSN4KE9NWCkgPT4gJSN4KEFDb2RlYykiLCBvbXhVc2FnZSwgdXNhZ2UpOworICAgIHJldHVybiBzZXROYXRpdmVXaW5kb3dTaXplRm9ybWF0QW5kVXNhZ2UoCisgICAgICAgICAgICBuYXRpdmVXaW5kb3csCisgICAgICAgICAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoLAorICAgICAgICAgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQsCisgICAgICAgICAgICBkZWYuZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCwKKyAgICAgICAgICAgIG1Sb3RhdGlvbkRlZ3JlZXMsCisgICAgICAgICAgICB1c2FnZSk7Cit9CisKK3N0YXR1c190IEFDb2RlYzo6Y29uZmlndXJlT3V0cHV0QnVmZmVyc0Zyb21OYXRpdmVXaW5kb3coCisgICAgICAgIE9NWF9VMzIgKmJ1ZmZlckNvdW50LCBPTVhfVTMyICpidWZmZXJTaXplLAorICAgICAgICBPTVhfVTMyICptaW5VbmRlcXVldWVkQnVmZmVycykgeworICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOworICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CisgICAgZGVmLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OworCisgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZkZWYsIHNpemVvZihkZWYpKTsKKworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgZXJyID0gc2V0dXBOYXRpdmVXaW5kb3dTaXplRm9ybWF0QW5kVXNhZ2UobU5hdGl2ZVdpbmRvdy5nZXQoKSwgJm1OYXRpdmVXaW5kb3dVc2FnZUJpdHMpOwogICAgIH0KLQotICAgIGludCBjb25zdW1lclVzYWdlID0gMDsKLSAgICBlcnIgPSBtTmF0aXZlV2luZG93LT5xdWVyeSgKLSAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIE5BVElWRV9XSU5ET1dfQ09OU1VNRVJfVVNBR0VfQklUUywKLSAgICAgICAgICAgICZjb25zdW1lclVzYWdlKTsKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgQUxPR1coImZhaWxlZCB0byBnZXQgY29uc3VtZXIgdXNhZ2UgYml0cy4gaWdub3JpbmciKTsKLSAgICAgICAgZXJyID0gMDsKLSAgICB9Ci0KLSAgICBBTE9HVigiZ3JhbGxvYyB1c2FnZTogJSN4KE9NWCkgPT4gJSN4KEFDb2RlYykgKyAlI3goQ29uc3VtZXIpID0gJSN4IiwKLSAgICAgICAgICAgIG9teFVzYWdlLCB1c2FnZSwgY29uc3VtZXJVc2FnZSwgdXNhZ2UgfCBjb25zdW1lclVzYWdlKTsKLSAgICB1c2FnZSB8PSBjb25zdW1lclVzYWdlOwotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlKAotICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgIHVzYWdlIHwgR1JBTExPQ19VU0FHRV9IV19URVhUVVJFIHwgR1JBTExPQ19VU0FHRV9FWFRFUk5BTF9ESVNQKTsKLQotICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICBBTE9HRSgibmF0aXZlX3dpbmRvd19zZXRfdXNhZ2UgZmFpbGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIC1lcnIpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgbU5hdGl2ZVdpbmRvd1VzYWdlQml0cyA9IDA7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCkBAIC03OTgsNiArMTAyNiwxMSBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIG1OdW1VbmRlcXVldWVkQnVmZmVycyA9IG1pblVuZGVxdWV1ZWRCdWZmZXJzOwogCisgICAgaWYgKCFzdG9yaW5nTWV0YWRhdGFJbkRlY29kZWRCdWZmZXJzKCkpIHsKKyAgICAgICAgc3RhdGljX2Nhc3Q8U3VyZmFjZSo+KG1OYXRpdmVXaW5kb3cuZ2V0KCkpCisgICAgICAgICAgICAgICAgLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCktPmFsbG93QWxsb2NhdGlvbih0cnVlKTsKKyAgICB9CisKICAgICBBTE9HVigiWyVzXSBBbGxvY2F0aW5nICV1IGJ1ZmZlcnMgZnJvbSBhIG5hdGl2ZSB3aW5kb3cgb2Ygc2l6ZSAldSBvbiAiCiAgICAgICAgICAib3V0cHV0IHBvcnQiLAogICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgYnVmZmVyQ291bnQsIGJ1ZmZlclNpemUpOwpAQCAtODA1LDcgKzEwMzgsOCBAQAogICAgIC8vIERlcXVldWUgYnVmZmVycyBhbmQgc2VuZCB0aGVtIHRvIE9NWAogICAgIGZvciAoT01YX1UzMiBpID0gMDsgaSA8IGJ1ZmZlckNvdW50OyBpKyspIHsKICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYnVmOwotICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KG1OYXRpdmVXaW5kb3cuZ2V0KCksICZidWYpOworICAgICAgICBpbnQgZmVuY2VGZDsKKyAgICAgICAgZXJyID0gbU5hdGl2ZVdpbmRvdy0+ZGVxdWV1ZUJ1ZmZlcihtTmF0aXZlV2luZG93LmdldCgpLCAmYnVmLCAmZmVuY2VGZCk7CiAgICAgICAgIGlmIChlcnIgIT0gMCkgewogICAgICAgICAgICAgQUxPR0UoImRlcXVldWVCdWZmZXIgZmFpbGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIC1lcnIpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC04MTQsNiArMTA0OCw5IEBACiAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdyYXBoaWNCdWZmZXIobmV3IEdyYXBoaWNCdWZmZXIoYnVmLCBmYWxzZSkpOwogICAgICAgICBCdWZmZXJJbmZvIGluZm87CiAgICAgICAgIGluZm8ubVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTOworICAgICAgICBpbmZvLm1GZW5jZUZkID0gZmVuY2VGZDsKKyAgICAgICAgaW5mby5tSXNSZWFkRmVuY2UgPSBmYWxzZTsKKyAgICAgICAgaW5mby5tUmVuZGVySW5mbyA9IE5VTEw7CiAgICAgICAgIGluZm8ubURhdGEgPSBuZXcgQUJ1ZmZlcihOVUxMIC8qIGRhdGEgKi8sIGJ1ZmZlclNpemUgLyogY2FwYWNpdHkgKi8pOwogICAgICAgICBpbmZvLm1HcmFwaGljQnVmZmVyID0gZ3JhcGhpY0J1ZmZlcjsKICAgICAgICAgbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0ucHVzaChpbmZvKTsKQEAgLTg1MCwxNiArMTA4NywyMyBAQAogCiAgICAgZm9yIChPTVhfVTMyIGkgPSBjYW5jZWxTdGFydDsgaSA8IGNhbmNlbEVuZDsgaSsrKSB7CiAgICAgICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uZWRpdEl0ZW1BdChpKTsKLSAgICAgICAgc3RhdHVzX3QgZXJyb3IgPSBjYW5jZWxCdWZmZXJUb05hdGl2ZVdpbmRvdyhpbmZvKTsKLSAgICAgICAgaWYgKGVyciA9PSAwKSB7Ci0gICAgICAgICAgICBlcnIgPSBlcnJvcjsKKyAgICAgICAgaWYgKGluZm8tPm1TdGF0dXMgPT0gQnVmZmVySW5mbzo6T1dORURfQllfVVMpIHsKKyAgICAgICAgICAgIHN0YXR1c190IGVycm9yID0gY2FuY2VsQnVmZmVyVG9OYXRpdmVXaW5kb3coaW5mbyk7CisgICAgICAgICAgICBpZiAoZXJyID09IDApIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBlcnJvcjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAorICAgIGlmICghc3RvcmluZ01ldGFkYXRhSW5EZWNvZGVkQnVmZmVycygpKSB7CisgICAgICAgIHN0YXRpY19jYXN0PFN1cmZhY2UqPihtTmF0aXZlV2luZG93LmdldCgpKQorICAgICAgICAgICAgICAgIC0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpLT5hbGxvd0FsbG9jYXRpb24oZmFsc2UpOworICAgIH0KKwogICAgIHJldHVybiBlcnI7CiB9CiAKLXN0YXR1c190IEFDb2RlYzo6YWxsb2NhdGVPdXRwdXRNZXRhRGF0YUJ1ZmZlcnMoKSB7CitzdGF0dXNfdCBBQ29kZWM6OmFsbG9jYXRlT3V0cHV0TWV0YWRhdGFCdWZmZXJzKCkgewogICAgIE9NWF9VMzIgYnVmZmVyQ291bnQsIGJ1ZmZlclNpemUsIG1pblVuZGVxdWV1ZWRCdWZmZXJzOwogICAgIHN0YXR1c190IGVyciA9IGNvbmZpZ3VyZU91dHB1dEJ1ZmZlcnNGcm9tTmF0aXZlV2luZG93KAogICAgICAgICAgICAgJmJ1ZmZlckNvdW50LCAmYnVmZmVyU2l6ZSwgJm1pblVuZGVxdWV1ZWRCdWZmZXJzKTsKQEAgLTg3MCwyNiArMTExNCwzMiBAQAogICAgIEFMT0dWKCJbJXNdIEFsbG9jYXRpbmcgJXUgbWV0YSBidWZmZXJzIG9uIG91dHB1dCBwb3J0IiwKICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGJ1ZmZlckNvdW50KTsKIAotICAgIHNpemVfdCB0b3RhbFNpemUgPSBidWZmZXJDb3VudCAqIDg7CisgICAgc2l6ZV90IGJ1ZlNpemUgPSBtT3V0cHV0TWV0YWRhdGFUeXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXIgPworICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBWaWRlb05hdGl2ZU1ldGFkYXRhKSA6IHNpemVvZihzdHJ1Y3QgVmlkZW9HcmFsbG9jTWV0YWRhdGEpOworICAgIHNpemVfdCB0b3RhbFNpemUgPSBidWZmZXJDb3VudCAqIGJ1ZlNpemU7CiAgICAgbURlYWxlcltrUG9ydEluZGV4T3V0cHV0XSA9IG5ldyBNZW1vcnlEZWFsZXIodG90YWxTaXplLCAiQUNvZGVjIik7CiAKICAgICAvLyBEZXF1ZXVlIGJ1ZmZlcnMgYW5kIHNlbmQgdGhlbSB0byBPTVgKICAgICBmb3IgKE9NWF9VMzIgaSA9IDA7IGkgPCBidWZmZXJDb3VudDsgaSsrKSB7CiAgICAgICAgIEJ1ZmZlckluZm8gaW5mbzsKICAgICAgICAgaW5mby5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfTkFUSVZFX1dJTkRPVzsKKyAgICAgICAgaW5mby5tRmVuY2VGZCA9IC0xOworICAgICAgICBpbmZvLm1SZW5kZXJJbmZvID0gTlVMTDsKICAgICAgICAgaW5mby5tR3JhcGhpY0J1ZmZlciA9IE5VTEw7CiAgICAgICAgIGluZm8ubURlcXVldWVkQXQgPSBtRGVxdWV1ZUNvdW50ZXI7CiAKLSAgICAgICAgc3A8SU1lbW9yeT4gbWVtID0gbURlYWxlcltrUG9ydEluZGV4T3V0cHV0XS0+YWxsb2NhdGUoCi0gICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBWaWRlb0RlY29kZXJPdXRwdXRNZXRhRGF0YSkpOworICAgICAgICBzcDxJTWVtb3J5PiBtZW0gPSBtRGVhbGVyW2tQb3J0SW5kZXhPdXRwdXRdLT5hbGxvY2F0ZShidWZTaXplKTsKICAgICAgICAgaWYgKG1lbSA9PSBOVUxMIHx8IG1lbS0+cG9pbnRlcigpID09IE5VTEwpIHsKICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKG1PdXRwdXRNZXRhZGF0YVR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUFOV0J1ZmZlcikgeworICAgICAgICAgICAgKChWaWRlb05hdGl2ZU1ldGFkYXRhICopbWVtLT5wb2ludGVyKCkpLT5uRmVuY2VGZCA9IC0xOworICAgICAgICB9CiAgICAgICAgIGluZm8ubURhdGEgPSBuZXcgQUJ1ZmZlcihtZW0tPnBvaW50ZXIoKSwgbWVtLT5zaXplKCkpOwogCiAgICAgICAgIC8vIHdlIHVzZSB1c2VCdWZmZXIgZm9yIG1ldGFkYXRhIHJlZ2FyZGxlc3Mgb2YgcXVpcmtzCiAgICAgICAgIGVyciA9IG1PTVgtPnVzZUJ1ZmZlcigKLSAgICAgICAgICAgICAgICBtTm9kZSwga1BvcnRJbmRleE91dHB1dCwgbWVtLCAmaW5mby5tQnVmZmVySUQpOworICAgICAgICAgICAgICAgIG1Ob2RlLCBrUG9ydEluZGV4T3V0cHV0LCBtZW0sICZpbmZvLm1CdWZmZXJJRCwgbWVtLT5zaXplKCkpOwogCiAgICAgICAgIG1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLnB1c2goaW5mbyk7CiAKQEAgLTg5NywyOCArMTE0NywxMTEgQEAKICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBpbmZvLm1CdWZmZXJJRCwgbWVtLT5wb2ludGVyKCkpOwogICAgIH0KIAotICAgIG1NZXRhRGF0YUJ1ZmZlcnNUb1N1Ym1pdCA9IGJ1ZmZlckNvdW50IC0gbWluVW5kZXF1ZXVlZEJ1ZmZlcnM7CisgICAgaWYgKG1MZWdhY3lBZGFwdGl2ZUV4cGVyaW1lbnQpIHsKKyAgICAgICAgLy8gcHJlYWxsb2NhdGUgYW5kIHByZXJlZ2lzdGVyIGJ1ZmZlcnMKKyAgICAgICAgc3RhdGljX2Nhc3Q8U3VyZmFjZSAqPihtTmF0aXZlV2luZG93LmdldCgpKQorICAgICAgICAgICAgICAgIC0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpLT5hbGxvd0FsbG9jYXRpb24odHJ1ZSk7CisKKyAgICAgICAgQUxPR1YoIlslc10gQWxsb2NhdGluZyAldSBidWZmZXJzIGZyb20gYSBuYXRpdmUgd2luZG93IG9mIHNpemUgJXUgb24gIgorICAgICAgICAgICAgICJvdXRwdXQgcG9ydCIsCisgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgYnVmZmVyQ291bnQsIGJ1ZmZlclNpemUpOworCisgICAgICAgIC8vIERlcXVldWUgYnVmZmVycyB0aGVuIGNhbmNlbCB0aGVtIGFsbAorICAgICAgICBmb3IgKE9NWF9VMzIgaSA9IDA7IGkgPCBidWZmZXJDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gJm1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLmVkaXRJdGVtQXQoaSk7CisKKyAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIgKmJ1ZjsKKyAgICAgICAgICAgIGludCBmZW5jZUZkOworICAgICAgICAgICAgZXJyID0gbU5hdGl2ZVdpbmRvdy0+ZGVxdWV1ZUJ1ZmZlcihtTmF0aXZlV2luZG93LmdldCgpLCAmYnVmLCAmZmVuY2VGZCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZGVxdWV1ZUJ1ZmZlciBmYWlsZWQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdyYXBoaWNCdWZmZXIobmV3IEdyYXBoaWNCdWZmZXIoYnVmLCBmYWxzZSkpOworICAgICAgICAgICAgbU9NWC0+dXBkYXRlR3JhcGhpY0J1ZmZlckluTWV0YSgKKyAgICAgICAgICAgICAgICAgICAgbU5vZGUsIGtQb3J0SW5kZXhPdXRwdXQsIGdyYXBoaWNCdWZmZXIsIGluZm8tPm1CdWZmZXJJRCk7CisgICAgICAgICAgICBpbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfVVM7CisgICAgICAgICAgICBpbmZvLT5zZXRXcml0ZUZlbmNlKGZlbmNlRmQsICJhbGxvY2F0ZU91dHB1dE1ldGFkYXRhQnVmZmVycyBmb3IgbGVnYWN5Iik7CisgICAgICAgICAgICBpbmZvLT5tR3JhcGhpY0J1ZmZlciA9IGdyYXBoaWNCdWZmZXI7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKE9NWF9VMzIgaSA9IDA7IGkgPCBtQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICZtQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5lZGl0SXRlbUF0KGkpOworICAgICAgICAgICAgaWYgKGluZm8tPm1TdGF0dXMgPT0gQnVmZmVySW5mbzo6T1dORURfQllfVVMpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnJvciA9IGNhbmNlbEJ1ZmZlclRvTmF0aXZlV2luZG93KGluZm8pOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdGljX2Nhc3Q8U3VyZmFjZSo+KG1OYXRpdmVXaW5kb3cuZ2V0KCkpCisgICAgICAgICAgICAgICAgLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCktPmFsbG93QWxsb2NhdGlvbihmYWxzZSk7CisgICAgfQorCisgICAgbU1ldGFkYXRhQnVmZmVyc1RvU3VibWl0ID0gYnVmZmVyQ291bnQgLSBtaW5VbmRlcXVldWVkQnVmZmVyczsKICAgICByZXR1cm4gZXJyOwogfQogCi1zdGF0dXNfdCBBQ29kZWM6OnN1Ym1pdE91dHB1dE1ldGFEYXRhQnVmZmVyKCkgewotICAgIENIRUNLKG1TdG9yZU1ldGFEYXRhSW5PdXRwdXRCdWZmZXJzKTsKLSAgICBpZiAobU1ldGFEYXRhQnVmZmVyc1RvU3VibWl0ID09IDApCitzdGF0dXNfdCBBQ29kZWM6OnN1Ym1pdE91dHB1dE1ldGFkYXRhQnVmZmVyKCkgeworICAgIENIRUNLKHN0b3JpbmdNZXRhZGF0YUluRGVjb2RlZEJ1ZmZlcnMoKSk7CisgICAgaWYgKG1NZXRhZGF0YUJ1ZmZlcnNUb1N1Ym1pdCA9PSAwKQogICAgICAgICByZXR1cm4gT0s7CiAKICAgICBCdWZmZXJJbmZvICppbmZvID0gZGVxdWV1ZUJ1ZmZlckZyb21OYXRpdmVXaW5kb3coKTsKLSAgICBpZiAoaW5mbyA9PSBOVUxMKQorICAgIGlmIChpbmZvID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KIAogICAgIEFMT0dWKCJbJXNdIHN1Ym1pdHRpbmcgb3V0cHV0IG1ldGEgYnVmZmVyIElEICV1IGZvciBncmFwaGljIGJ1ZmZlciAlcCIsCiAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgaW5mby0+bUJ1ZmZlcklELCBpbmZvLT5tR3JhcGhpY0J1ZmZlci5nZXQoKSk7CiAKLSAgICAtLW1NZXRhRGF0YUJ1ZmZlcnNUb1N1Ym1pdDsKLSAgICBDSEVDS19FUShtT01YLT5maWxsQnVmZmVyKG1Ob2RlLCBpbmZvLT5tQnVmZmVySUQpLAotICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7CisgICAgLS1tTWV0YWRhdGFCdWZmZXJzVG9TdWJtaXQ7CisgICAgaW5mby0+Y2hlY2tXcml0ZUZlbmNlKCJzdWJtaXRPdXRwdXRNZXRhZGF0YUJ1ZmZlciIpOworICAgIHN0YXR1c190IGVyciA9IG1PTVgtPmZpbGxCdWZmZXIobU5vZGUsIGluZm8tPm1CdWZmZXJJRCwgaW5mby0+bUZlbmNlRmQpOworICAgIGluZm8tPm1GZW5jZUZkID0gLTE7CisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBpbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfQ09NUE9ORU5UOworICAgIH0KIAotICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9DT01QT05FTlQ7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IEFDb2RlYzo6d2FpdEZvckZlbmNlKGludCBmZCwgY29uc3QgY2hhciAqZGJnICkgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgIHNwPEZlbmNlPiBmZW5jZSA9IG5ldyBGZW5jZShmZCk7CisgICAgICAgIHJlcyA9IGZlbmNlLT53YWl0KElPTVg6OmtGZW5jZVRpbWVvdXRNcyk7CisgICAgICAgIEFMT0dXX0lGKHJlcyAhPSBPSywgIkZFTkNFIFRJTUVPVVQgZm9yICVkIGluICVzIiwgZmQsIGRiZyk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKy8vIHN0YXRpYworY29uc3QgY2hhciAqQUNvZGVjOjpfYXNTdHJpbmcoQnVmZmVySW5mbzo6U3RhdHVzIHMpIHsKKyAgICBzd2l0Y2ggKHMpIHsKKyAgICAgICAgY2FzZSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzogICAgICAgICAgICByZXR1cm4gIk9VUiI7CisgICAgICAgIGNhc2UgQnVmZmVySW5mbzo6T1dORURfQllfQ09NUE9ORU5UOiAgICAgcmV0dXJuICJDT01QT05FTlQiOworICAgICAgICBjYXNlIEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VQU1RSRUFNOiAgICAgIHJldHVybiAiVVBTVFJFQU0iOworICAgICAgICBjYXNlIEJ1ZmZlckluZm86Ok9XTkVEX0JZX0RPV05TVFJFQU06ICAgIHJldHVybiAiRE9XTlNUUkVBTSI7CisgICAgICAgIGNhc2UgQnVmZmVySW5mbzo6T1dORURfQllfTkFUSVZFX1dJTkRPVzogcmV0dXJuICJTVVJGQUNFIjsKKyAgICAgICAgY2FzZSBCdWZmZXJJbmZvOjpVTlJFQ09HTklaRUQ6ICAgICAgICAgICByZXR1cm4gIlVOUkVDT0dOSVpFRCI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICI/IjsKKyAgICB9Cit9CisKK3ZvaWQgQUNvZGVjOjpkdW1wQnVmZmVycyhPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIENIRUNLKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgfHwgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQpOworICAgIEFMT0dJKCJbJXNdICVzIHBvcnQgaGFzICV6dSBidWZmZXJzOiIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksCisgICAgICAgICAgICBwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0ID8gImlucHV0IiA6ICJvdXRwdXQiLCBtQnVmZmVyc1twb3J0SW5kZXhdLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVyc1twb3J0SW5kZXhdLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IEJ1ZmZlckluZm8gJmluZm8gPSBtQnVmZmVyc1twb3J0SW5kZXhdW2ldOworICAgICAgICBBTE9HSSgiICBzbG90ICUyenU6ICMlOHUgJXAvJXAgJXMoJWQpIGRlcXVldWVkOiV1IiwKKyAgICAgICAgICAgICAgICBpLCBpbmZvLm1CdWZmZXJJRCwgaW5mby5tR3JhcGhpY0J1ZmZlci5nZXQoKSwKKyAgICAgICAgICAgICAgICBpbmZvLm1HcmFwaGljQnVmZmVyID09IE5VTEwgPyBOVUxMIDogaW5mby5tR3JhcGhpY0J1ZmZlci0+Z2V0TmF0aXZlQnVmZmVyKCksCisgICAgICAgICAgICAgICAgX2FzU3RyaW5nKGluZm8ubVN0YXR1cyksIGluZm8ubVN0YXR1cywgaW5mby5tRGVxdWV1ZWRBdCk7CisgICAgfQogfQogCiBzdGF0dXNfdCBBQ29kZWM6OmNhbmNlbEJ1ZmZlclRvTmF0aXZlV2luZG93KEJ1ZmZlckluZm8gKmluZm8pIHsKQEAgLTkyNywxNyArMTI2MCw1OSBAQAogICAgIEFMT0dWKCJbJXNdIENhbGxpbmcgY2FuY2VsQnVmZmVyIG9uIGJ1ZmZlciAldSIsCiAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBpbmZvLT5tQnVmZmVySUQpOwogCisgICAgaW5mby0+Y2hlY2tXcml0ZUZlbmNlKCJjYW5jZWxCdWZmZXJUb05hdGl2ZVdpbmRvdyIpOwogICAgIGludCBlcnIgPSBtTmF0aXZlV2luZG93LT5jYW5jZWxCdWZmZXIoCi0gICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIGluZm8tPm1HcmFwaGljQnVmZmVyLmdldCgpLCAtMSk7CisgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIGluZm8tPm1HcmFwaGljQnVmZmVyLmdldCgpLCBpbmZvLT5tRmVuY2VGZCk7CisgICAgaW5mby0+bUZlbmNlRmQgPSAtMTsKIAogICAgIEFMT0dXX0lGKGVyciAhPSAwLCAiWyVzXSBjYW4gbm90IHJldHVybiBidWZmZXIgJXUgdG8gbmF0aXZlIHdpbmRvdyIsCiAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBpbmZvLT5tQnVmZmVySUQpOwotCisgICAgLy8gY2hhbmdlIG93bmVyc2hpcCBldmVuIGlmIGNhbmNlbEJ1ZmZlciBmYWlscwogICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9OQVRJVkVfV0lORE9XOwogCiAgICAgcmV0dXJuIGVycjsKIH0KIAordm9pZCBBQ29kZWM6OnVwZGF0ZVJlbmRlckluZm9Gb3JEZXF1ZXVlZEJ1ZmZlcigKKyAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYnVmLCBpbnQgZmVuY2VGZCwgQnVmZmVySW5mbyAqaW5mbykgeworCisgICAgaW5mby0+bVJlbmRlckluZm8gPQorICAgICAgICBtUmVuZGVyVHJhY2tlci51cGRhdGVJbmZvRm9yRGVxdWV1ZWRCdWZmZXIoCisgICAgICAgICAgICAgICAgYnVmLCBmZW5jZUZkLCBpbmZvIC0gJm1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdWzBdKTsKKworICAgIC8vIGNoZWNrIGZvciBhbnkgZmVuY2VzIGFscmVhZHkgc2lnbmFsZWQKKyAgICBub3RpZnlPZlJlbmRlcmVkRnJhbWVzKGZhbHNlIC8qIGRyb3BJbmNvbXBsZXRlICovLCBpbmZvLT5tUmVuZGVySW5mbyk7Cit9CisKK3ZvaWQgQUNvZGVjOjpvbkZyYW1lUmVuZGVyZWQoaW50NjRfdCBtZWRpYVRpbWVVcywgbnNlY3NfdCBzeXN0ZW1OYW5vKSB7CisgICAgaWYgKG1SZW5kZXJUcmFja2VyLm9uRnJhbWVSZW5kZXJlZChtZWRpYVRpbWVVcywgc3lzdGVtTmFubykgIT0gT0spIHsKKyAgICAgICAgbVJlbmRlclRyYWNrZXIuZHVtcFJlbmRlclF1ZXVlKCk7CisgICAgfQorfQorCit2b2lkIEFDb2RlYzo6bm90aWZ5T2ZSZW5kZXJlZEZyYW1lcyhib29sIGRyb3BJbmNvbXBsZXRlLCBGcmFtZVJlbmRlclRyYWNrZXI6OkluZm8gKnVudGlsKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOworICAgIG1zZy0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0T3V0cHV0RnJhbWVzUmVuZGVyZWQpOworICAgIHN0ZDo6bGlzdDxGcmFtZVJlbmRlclRyYWNrZXI6OkluZm8+IGRvbmUgPQorICAgICAgICBtUmVuZGVyVHJhY2tlci5jaGVja0ZlbmNlc0FuZEdldFJlbmRlcmVkRnJhbWVzKHVudGlsLCBkcm9wSW5jb21wbGV0ZSk7CisKKyAgICAvLyB1bmxpbmsgdW50cmFja2VkIGZyYW1lcworICAgIGZvciAoc3RkOjpsaXN0PEZyYW1lUmVuZGVyVHJhY2tlcjo6SW5mbz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZG9uZS5jYmVnaW4oKTsKKyAgICAgICAgICAgIGl0ICE9IGRvbmUuY2VuZCgpOyArK2l0KSB7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBpdC0+Z2V0SW5kZXgoKTsKKyAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgKHNpemVfdClpbmRleCA8IG1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLnNpemUoKSkgeworICAgICAgICAgICAgbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uZWRpdEl0ZW1BdChpbmRleCkubVJlbmRlckluZm8gPSBOVUxMOworICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgIC8vIFRISVMgU0hPVUxEIE5FVkVSIEhBUFBFTgorICAgICAgICAgICAgQUxPR0UoImludmFsaWQgaW5kZXggJXpkIGluICV6dSIsIGluZGV4LCBtQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5zaXplKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKE1lZGlhQ29kZWM6OkNyZWF0ZUZyYW1lc1JlbmRlcmVkTWVzc2FnZShkb25lLCBtc2cpKSB7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KK30KKwogQUNvZGVjOjpCdWZmZXJJbmZvICpBQ29kZWM6OmRlcXVldWVCdWZmZXJGcm9tTmF0aXZlV2luZG93KCkgewogICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIgKmJ1ZjsKICAgICBDSEVDSyhtTmF0aXZlV2luZG93LmdldCgpICE9IE5VTEwpOwpAQCAtOTUzLDI2ICsxMzI4LDYxIEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGlmIChuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KG1OYXRpdmVXaW5kb3cuZ2V0KCksICZidWYpICE9IDApIHsKLSAgICAgICAgQUxPR0UoImRlcXVldWVCdWZmZXIgZmFpbGVkLiIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9CisgICAgaW50IGZlbmNlRmQgPSAtMTsKKyAgICBkbyB7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1OYXRpdmVXaW5kb3ctPmRlcXVldWVCdWZmZXIobU5hdGl2ZVdpbmRvdy5nZXQoKSwgJmJ1ZiwgJmZlbmNlRmQpOworICAgICAgICBpZiAoZXJyICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJkZXF1ZXVlQnVmZmVyIGZhaWxlZDogJXMoJWQpLiIsIGFzU3RyaW5nKGVyciksIGVycik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCisgICAgICAgIGJvb2wgc3RhbGUgPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IG1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLnNpemUoKTsgaS0tID4gMDspIHsKKyAgICAgICAgICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uZWRpdEl0ZW1BdChpKTsKKworICAgICAgICAgICAgaWYgKGluZm8tPm1HcmFwaGljQnVmZmVyICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+bUdyYXBoaWNCdWZmZXItPmhhbmRsZSA9PSBidWYtPmhhbmRsZSkgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIGNvbnN1bWVycyBjYW4gYXR0YWNoIGJ1ZmZlcnMgdG8gQnVmZmVyUXVldWVzLCBpdCBpcyBwb3NzaWJsZQorICAgICAgICAgICAgICAgIC8vIHRoYXQgYSBrbm93biB5ZXQgc3RhbGUgYnVmZmVyIGNhbiByZXR1cm4gZnJvbSBhIHN1cmZhY2UgdGhhdCB3ZQorICAgICAgICAgICAgICAgIC8vIG9uY2UgdXNlZC4gIFdlIGNhbiBzaW1wbHkgaWdub3JlIHRoaXMgYXMgd2UgaGF2ZSBhbHJlYWR5IGRlcXVldWVkCisgICAgICAgICAgICAgICAgLy8gdGhpcyBidWZmZXIgcHJvcGVybHkuICBOT1RFOiB0aGlzIGRvZXMgbm90IGVsaW1pbmF0ZSBhbGwgY2FzZXMsCisgICAgICAgICAgICAgICAgLy8gZS5nLiBpdCBpcyBwb3NzaWJsZSB0aGF0IHdlIGhhdmUgcXVldWVkIHRoZSB2YWxpZCBidWZmZXIgdG8gdGhlCisgICAgICAgICAgICAgICAgLy8gTlcsIGFuZCBhIHN0YWxlIGNvcHkgb2YgdGhlIHNhbWUgYnVmZmVyIGdldHMgZGVxdWV1ZWQgLSB3aGljaCB3aWxsCisgICAgICAgICAgICAgICAgLy8gYmUgdHJlYXRlZCBhcyB0aGUgdmFsaWQgYnVmZmVyIGJ5IEFDb2RlYy4KKyAgICAgICAgICAgICAgICBpZiAoaW5mby0+bVN0YXR1cyAhPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9OQVRJVkVfV0lORE9XKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJkZXF1ZXVlZCBzdGFsZSBidWZmZXIgJXAuIGRpc2NhcmRpbmciLCBidWYpOworICAgICAgICAgICAgICAgICAgICBzdGFsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEFMT0dWKCJkZXF1ZXVlZCBidWZmZXIgJXAiLCBpbmZvLT5tR3JhcGhpY0J1ZmZlci0+Z2V0TmF0aXZlQnVmZmVyKCkpOworICAgICAgICAgICAgICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKKyAgICAgICAgICAgICAgICBpbmZvLT5zZXRXcml0ZUZlbmNlKGZlbmNlRmQsICJkZXF1ZXVlQnVmZmVyRnJvbU5hdGl2ZVdpbmRvdyIpOworICAgICAgICAgICAgICAgIHVwZGF0ZVJlbmRlckluZm9Gb3JEZXF1ZXVlZEJ1ZmZlcihidWYsIGZlbmNlRmQsIGluZm8pOworICAgICAgICAgICAgICAgIHJldHVybiBpbmZvOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSXQgaXMgYWxzbyBwb3NzaWJsZSB0byByZWNlaXZlIGEgcHJldmlvdXNseSB1bnJlZ2lzdGVyZWQgYnVmZmVyCisgICAgICAgIC8vIGluIG5vbi1tZXRhIG1vZGUuIFRoZXNlIHNob3VsZCBiZSB0cmVhdGVkIGFzIHN0YWxlIGJ1ZmZlcnMuIFRoZQorICAgICAgICAvLyBzYW1lIGlzIHBvc3NpYmxlIGluIG1ldGEgbW9kZSwgaW4gd2hpY2ggY2FzZSwgaXQgd2lsbCBiZSB0cmVhdGVkCisgICAgICAgIC8vIGFzIGEgbm9ybWFsIGJ1ZmZlciwgd2hpY2ggaXMgbm90IGRlc2lyYWJsZS4KKyAgICAgICAgLy8gVE9ETzogZml4IHRoaXMuCisgICAgICAgIGlmICghc3RhbGUgJiYgKCFzdG9yaW5nTWV0YWRhdGFJbkRlY29kZWRCdWZmZXJzKCkgfHwgbUxlZ2FjeUFkYXB0aXZlRXhwZXJpbWVudCkpIHsKKyAgICAgICAgICAgIEFMT0dJKCJkZXF1ZXVlZCB1bnJlY29nbml6ZWQgKHN0YWxlKSBidWZmZXIgJXAuIGRpc2NhcmRpbmciLCBidWYpOworICAgICAgICAgICAgc3RhbGUgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChzdGFsZSkgeworICAgICAgICAgICAgLy8gVE9ETzogZGV0YWNoIHN0YWxlIGJ1ZmZlciwgYnV0IHRoZXJlIGlzIG5vIEFQSSB5ZXQgdG8gZG8gaXQuCisgICAgICAgICAgICBidWYgPSBOVUxMOworICAgICAgICB9CisgICAgfSB3aGlsZSAoYnVmID09IE5VTEwpOworCisgICAgLy8gZ2V0IG9sZGVzdCB1bmRlcXVldWVkIGJ1ZmZlcgogICAgIEJ1ZmZlckluZm8gKm9sZGVzdCA9IE5VTEw7CiAgICAgZm9yIChzaXplX3QgaSA9IG1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLnNpemUoKTsgaS0tID4gMDspIHsKICAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9CiAgICAgICAgICAgICAmbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uZWRpdEl0ZW1BdChpKTsKLQotICAgICAgICBpZiAoaW5mby0+bUdyYXBoaWNCdWZmZXIgIT0gTlVMTCAmJgotICAgICAgICAgICAgaW5mby0+bUdyYXBoaWNCdWZmZXItPmhhbmRsZSA9PSBidWYtPmhhbmRsZSkgewotICAgICAgICAgICAgQ0hFQ0tfRVEoKGludClpbmZvLT5tU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgKGludClCdWZmZXJJbmZvOjpPV05FRF9CWV9OQVRJVkVfV0lORE9XKTsKLQotICAgICAgICAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTOwotCi0gICAgICAgICAgICByZXR1cm4gaW5mbzsKLSAgICAgICAgfQotCiAgICAgICAgIGlmIChpbmZvLT5tU3RhdHVzID09IEJ1ZmZlckluZm86Ok9XTkVEX0JZX05BVElWRV9XSU5ET1cgJiYKICAgICAgICAgICAgIChvbGRlc3QgPT0gTlVMTCB8fAogICAgICAgICAgICAgIC8vIGF2b2lkIHBvdGVudGlhbCBpc3N1ZXMgZnJvbSBjb3VudGVyIHJvbGxpbmcgb3ZlcgpAQCAtOTgyLDQ5ICsxMzkyLDY0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAob2xkZXN0KSB7Ci0gICAgICAgIENIRUNLKG1TdG9yZU1ldGFEYXRhSW5PdXRwdXRCdWZmZXJzKTsKKyAgICAvLyBpdCBpcyBpbXBvc3NpYmxlIGRlcXVldWUgYSBidWZmZXIgd2hlbiB0aGVyZSBhcmUgbm8gYnVmZmVycyB3aXRoIEFOVworICAgIENIRUNLKG9sZGVzdCAhPSBOVUxMKTsKKyAgICAvLyBpdCBpcyBpbXBvc3NpYmxlIHRvIGRlcXVldWUgYW4gdW5rbm93biBidWZmZXIgaW4gbm9uLW1ldGEgbW9kZSwgYXMgdGhlCisgICAgLy8gd2hpbGUgbG9vcCBhYm92ZSBkb2VzIG5vdCBjb21wbGV0ZQorICAgIENIRUNLKHN0b3JpbmdNZXRhZGF0YUluRGVjb2RlZEJ1ZmZlcnMoKSk7CiAKLSAgICAgICAgLy8gZGlzY2FyZCBidWZmZXIgaW4gTFJVIGluZm8gYW5kIHJlcGxhY2Ugd2l0aCBuZXcgYnVmZmVyCi0gICAgICAgIG9sZGVzdC0+bUdyYXBoaWNCdWZmZXIgPSBuZXcgR3JhcGhpY0J1ZmZlcihidWYsIGZhbHNlKTsKLSAgICAgICAgb2xkZXN0LT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfVVM7CisgICAgLy8gZGlzY2FyZCBidWZmZXIgaW4gTFJVIGluZm8gYW5kIHJlcGxhY2Ugd2l0aCBuZXcgYnVmZmVyCisgICAgb2xkZXN0LT5tR3JhcGhpY0J1ZmZlciA9IG5ldyBHcmFwaGljQnVmZmVyKGJ1ZiwgZmFsc2UpOworICAgIG9sZGVzdC0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTOworICAgIG9sZGVzdC0+c2V0V3JpdGVGZW5jZShmZW5jZUZkLCAiZGVxdWV1ZUJ1ZmZlckZyb21OYXRpdmVXaW5kb3cgZm9yIG9sZGVzdCIpOworICAgIG1SZW5kZXJUcmFja2VyLnVudHJhY2tGcmFtZShvbGRlc3QtPm1SZW5kZXJJbmZvKTsKKyAgICBvbGRlc3QtPm1SZW5kZXJJbmZvID0gTlVMTDsKIAotICAgICAgICBtT01YLT51cGRhdGVHcmFwaGljQnVmZmVySW5NZXRhKAotICAgICAgICAgICAgICAgIG1Ob2RlLCBrUG9ydEluZGV4T3V0cHV0LCBvbGRlc3QtPm1HcmFwaGljQnVmZmVyLAotICAgICAgICAgICAgICAgIG9sZGVzdC0+bUJ1ZmZlcklEKTsKKyAgICBtT01YLT51cGRhdGVHcmFwaGljQnVmZmVySW5NZXRhKAorICAgICAgICAgICAgbU5vZGUsIGtQb3J0SW5kZXhPdXRwdXQsIG9sZGVzdC0+bUdyYXBoaWNCdWZmZXIsCisgICAgICAgICAgICBvbGRlc3QtPm1CdWZmZXJJRCk7CiAKLSAgICAgICAgVmlkZW9EZWNvZGVyT3V0cHV0TWV0YURhdGEgKm1ldGFEYXRhID0KLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VmlkZW9EZWNvZGVyT3V0cHV0TWV0YURhdGEgKj4oCi0gICAgICAgICAgICAgICAgICAgIG9sZGVzdC0+bURhdGEtPmJhc2UoKSk7Ci0gICAgICAgIC8vIG1ldGFEYXRhIGlzIG9ubHkgcmVhZGFibGUgaWYgY29kZWMgaXMgaW4gdGhlIHNhbWUgcHJvY2VzcwotICAgICAgICAvL0NIRUNLX0VRKG1ldGFEYXRhLT5lVHlwZSwga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpOwotCisgICAgaWYgKG1PdXRwdXRNZXRhZGF0YVR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpIHsKKyAgICAgICAgVmlkZW9HcmFsbG9jTWV0YWRhdGEgKmdyYWxsb2NNZXRhID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VmlkZW9HcmFsbG9jTWV0YWRhdGEgKj4ob2xkZXN0LT5tRGF0YS0+YmFzZSgpKTsKICAgICAgICAgQUxPR1YoInJlcGxhY2VkIG9sZGVzdCBidWZmZXIgIyV1IHdpdGggYWdlICV1ICglcC8lcCBzdG9yZWQgaW4gJXApIiwKLSAgICAgICAgICAgICAgICBvbGRlc3QgLSAmbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF1bMF0sCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKShvbGRlc3QgLSAmbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF1bMF0pLAogICAgICAgICAgICAgICAgIG1EZXF1ZXVlQ291bnRlciAtIG9sZGVzdC0+bURlcXVldWVkQXQsCi0gICAgICAgICAgICAgICAgbWV0YURhdGEtPnBIYW5kbGUsCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWdyYWxsb2NNZXRhLT5wSGFuZGxlLAogICAgICAgICAgICAgICAgIG9sZGVzdC0+bUdyYXBoaWNCdWZmZXItPmhhbmRsZSwgb2xkZXN0LT5tRGF0YS0+YmFzZSgpKTsKLQotICAgICAgICByZXR1cm4gb2xkZXN0OworICAgIH0gZWxzZSBpZiAobU91dHB1dE1ldGFkYXRhVHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyKSB7CisgICAgICAgIFZpZGVvTmF0aXZlTWV0YWRhdGEgKm5hdGl2ZU1ldGEgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxWaWRlb05hdGl2ZU1ldGFkYXRhICo+KG9sZGVzdC0+bURhdGEtPmJhc2UoKSk7CisgICAgICAgIEFMT0dWKCJyZXBsYWNlZCBvbGRlc3QgYnVmZmVyICMldSB3aXRoIGFnZSAldSAoJXAvJXAgc3RvcmVkIGluICVwKSIsCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKShvbGRlc3QgLSAmbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF1bMF0pLAorICAgICAgICAgICAgICAgIG1EZXF1ZXVlQ291bnRlciAtIG9sZGVzdC0+bURlcXVldWVkQXQsCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KW5hdGl2ZU1ldGEtPnBCdWZmZXIsCisgICAgICAgICAgICAgICAgb2xkZXN0LT5tR3JhcGhpY0J1ZmZlci0+Z2V0TmF0aXZlQnVmZmVyKCksIG9sZGVzdC0+bURhdGEtPmJhc2UoKSk7CiAgICAgfQogCi0gICAgVFJFU1BBU1MoKTsKLQotICAgIHJldHVybiBOVUxMOworICAgIHVwZGF0ZVJlbmRlckluZm9Gb3JEZXF1ZXVlZEJ1ZmZlcihidWYsIGZlbmNlRmQsIG9sZGVzdCk7CisgICAgcmV0dXJuIG9sZGVzdDsKIH0KIAogc3RhdHVzX3QgQUNvZGVjOjpmcmVlQnVmZmVyc09uUG9ydChPTVhfVTMyIHBvcnRJbmRleCkgewotICAgIGZvciAoc2l6ZV90IGkgPSBtQnVmZmVyc1twb3J0SW5kZXhdLnNpemUoKTsgaS0tID4gMDspIHsKLSAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBmcmVlQnVmZmVyKHBvcnRJbmRleCwgaSkpOworICAgIHN0YXR1c190IGVyciA9IE9LOworICAgIGZvciAoc2l6ZV90IGkgPSBtQnVmZmVyc1twb3J0SW5kZXhdLnNpemUoKTsgaSA+IDA7KSB7CisgICAgICAgIGktLTsKKyAgICAgICAgc3RhdHVzX3QgZXJyMiA9IGZyZWVCdWZmZXIocG9ydEluZGV4LCBpKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgZXJyID0gZXJyMjsKKyAgICAgICAgfQogICAgIH0KIAorICAgIC8vIGNsZWFyIG1EZWFsZXIgZXZlbiBvbiBhbiBlcnJvcgogICAgIG1EZWFsZXJbcG9ydEluZGV4XS5jbGVhcigpOwotCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXR1c190IEFDb2RlYzo6ZnJlZU91dHB1dEJ1ZmZlcnNOb3RPd25lZEJ5Q29tcG9uZW50KCkgewotICAgIGZvciAoc2l6ZV90IGkgPSBtQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5zaXplKCk7IGktLSA+IDA7KSB7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgZm9yIChzaXplX3QgaSA9IG1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLnNpemUoKTsgaSA+IDA7KSB7CisgICAgICAgIGktLTsKICAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9CiAgICAgICAgICAgICAmbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uZWRpdEl0ZW1BdChpKTsKIApAQCAtMTAzMiwzNiArMTQ1Nyw2NSBAQAogICAgICAgICAvLyBvciBiZWluZyBkcmFpbmVkLgogICAgICAgICBpZiAoaW5mby0+bVN0YXR1cyAhPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9DT01QT05FTlQgJiYKICAgICAgICAgICAgIGluZm8tPm1TdGF0dXMgIT0gQnVmZmVySW5mbzo6T1dORURfQllfRE9XTlNUUkVBTSkgewotICAgICAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBmcmVlQnVmZmVyKGtQb3J0SW5kZXhPdXRwdXQsIGkpKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVycjIgPSBmcmVlQnVmZmVyKGtQb3J0SW5kZXhPdXRwdXQsIGkpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIGVyciA9IGVycjI7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIGVycjsKIH0KIAogc3RhdHVzX3QgQUNvZGVjOjpmcmVlQnVmZmVyKE9NWF9VMzIgcG9ydEluZGV4LCBzaXplX3QgaSkgewogICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmbUJ1ZmZlcnNbcG9ydEluZGV4XS5lZGl0SXRlbUF0KGkpOworICAgIHN0YXR1c190IGVyciA9IE9LOwogCi0gICAgQ0hFQ0soaW5mby0+bVN0YXR1cyA9PSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUwotICAgICAgICAgICAgfHwgaW5mby0+bVN0YXR1cyA9PSBCdWZmZXJJbmZvOjpPV05FRF9CWV9OQVRJVkVfV0lORE9XKTsKLQotICAgIGlmIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCAmJiBtTmF0aXZlV2luZG93ICE9IE5VTEwKLSAgICAgICAgICAgICYmIGluZm8tPm1TdGF0dXMgPT0gQnVmZmVySW5mbzo6T1dORURfQllfVVMpIHsKLSAgICAgICAgY2FuY2VsQnVmZmVyVG9OYXRpdmVXaW5kb3coaW5mbyk7CisgICAgLy8gdGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkgZmVuY2VzIGluIHRoZSBtZXRhZGF0YQorICAgIE1ldGFkYXRhQnVmZmVyVHlwZSB0eXBlID0KKyAgICAgICAgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQgPyBtT3V0cHV0TWV0YWRhdGFUeXBlIDogbUlucHV0TWV0YWRhdGFUeXBlOworICAgIGlmICh0eXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXIgJiYgaW5mby0+bURhdGEgIT0gTlVMTAorICAgICAgICAgICAgJiYgaW5mby0+bURhdGEtPnNpemUoKSA+PSBzaXplb2YoVmlkZW9OYXRpdmVNZXRhZGF0YSkpIHsKKyAgICAgICAgaW50IGZlbmNlRmQgPSAoKFZpZGVvTmF0aXZlTWV0YWRhdGEgKilpbmZvLT5tRGF0YS0+ZGF0YSgpKS0+bkZlbmNlRmQ7CisgICAgICAgIGlmIChmZW5jZUZkID49IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJ1bnJlbGVhc2VkIGZlbmNlICglZCkgaW4gJXMgbWV0YWRhdGEgYnVmZmVyICV6dSIsCisgICAgICAgICAgICAgICAgICAgIGZlbmNlRmQsIHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgPyAiaW5wdXQiIDogIm91dHB1dCIsIGkpOworICAgICAgICB9CiAgICAgfQogCi0gICAgQ0hFQ0tfRVEobU9NWC0+ZnJlZUJ1ZmZlcigKLSAgICAgICAgICAgICAgICBtTm9kZSwgcG9ydEluZGV4LCBpbmZvLT5tQnVmZmVySUQpLAotICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7CisgICAgc3dpdGNoIChpbmZvLT5tU3RhdHVzKSB7CisgICAgICAgIGNhc2UgQnVmZmVySW5mbzo6T1dORURfQllfVVM6CisgICAgICAgICAgICBpZiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQgJiYgbU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpY2FuY2VsQnVmZmVyVG9OYXRpdmVXaW5kb3coaW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKIAorICAgICAgICBjYXNlIEJ1ZmZlckluZm86Ok9XTkVEX0JZX05BVElWRV9XSU5ET1c6CisgICAgICAgICAgICBlcnIgPSBtT01YLT5mcmVlQnVmZmVyKG1Ob2RlLCBwb3J0SW5kZXgsIGluZm8tPm1CdWZmZXJJRCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoInRyeWluZyB0byBmcmVlIGJ1ZmZlciBub3Qgb3duZWQgYnkgdXMgb3IgQU5XICglZCkiLCBpbmZvLT5tU3RhdHVzKTsKKyAgICAgICAgICAgIGVyciA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChpbmZvLT5tRmVuY2VGZCA+PSAwKSB7CisgICAgICAgIDo6Y2xvc2UoaW5mby0+bUZlbmNlRmQpOworICAgIH0KKworICAgIGlmIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCkgeworICAgICAgICBtUmVuZGVyVHJhY2tlci51bnRyYWNrRnJhbWUoaW5mby0+bVJlbmRlckluZm8sIGkpOworICAgICAgICBpbmZvLT5tUmVuZGVySW5mbyA9IE5VTEw7CisgICAgfQorCisgICAgLy8gcmVtb3ZlIGJ1ZmZlciBldmVuIGlmIG1PTVgtPmZyZWVCdWZmZXIgZmFpbHMKICAgICBtQnVmZmVyc1twb3J0SW5kZXhdLnJlbW92ZUF0KGkpOwotCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBlcnI7CiB9CiAKIEFDb2RlYzo6QnVmZmVySW5mbyAqQUNvZGVjOjpmaW5kQnVmZmVyQnlJRCgKLSAgICAgICAgdWludDMyX3QgcG9ydEluZGV4LCBJT01YOjpidWZmZXJfaWQgYnVmZmVySUQsCi0gICAgICAgIHNzaXplX3QgKmluZGV4KSB7CisgICAgICAgIHVpbnQzMl90IHBvcnRJbmRleCwgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklELCBzc2l6ZV90ICppbmRleCkgewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnNbcG9ydEluZGV4XS5zaXplKCk7ICsraSkgewogICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gJm1CdWZmZXJzW3BvcnRJbmRleF0uZWRpdEl0ZW1BdChpKTsKIApAQCAtMTA3Myw4ICsxNTI3LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIFRSRVNQQVNTKCk7Ci0KKyAgICBBTE9HRSgiQ291bGQgbm90IGZpbmQgYnVmZmVyIHdpdGggSUQgJXUiLCBidWZmZXJJRCk7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTExODcsNiArMTY0MCw5IEBACiAKICAgICBtSXNFbmNvZGVyID0gZW5jb2RlcjsKIAorICAgIG1JbnB1dE1ldGFkYXRhVHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVJbnZhbGlkOworICAgIG1PdXRwdXRNZXRhZGF0YVR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZDsKKwogICAgIHN0YXR1c190IGVyciA9IHNldENvbXBvbmVudFJvbGUoZW5jb2RlciAvKiBpc0VuY29kZXIgKi8sIG1pbWUpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMTIwNCwxNSArMTY2MCwyNyBAQAogICAgIGlmIChlbmNvZGVyCiAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigic3RvcmUtbWV0YWRhdGEtaW4tYnVmZmVycyIsICZzdG9yZU1ldGEpCiAgICAgICAgICAgICAmJiBzdG9yZU1ldGEgIT0gMCkgewotICAgICAgICBlcnIgPSBtT01YLT5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzKG1Ob2RlLCBrUG9ydEluZGV4SW5wdXQsIE9NWF9UUlVFKTsKLQorICAgICAgICBlcnIgPSBtT01YLT5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzKG1Ob2RlLCBrUG9ydEluZGV4SW5wdXQsIE9NWF9UUlVFLCAmbUlucHV0TWV0YWRhdGFUeXBlKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICBBTE9HRSgiWyVzXSBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzIChpbnB1dCkgZmFpbGVkIHcvIGVyciAlZCIsCisgICAgICAgICAgICBBTE9HRSgiWyVzXSBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzIChpbnB1dCkgZmFpbGVkIHcvIGVyciAlZCIsCiAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CiAKLSAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICB9Ci0gICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIC8vIEZvciB0aGlzIHNwZWNpZmljIGNhc2Ugd2UgY291bGQgYmUgdXNpbmcgY2FtZXJhIHNvdXJjZSBldmVuIGlmIHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMKKyAgICAgICAgLy8gcmV0dXJucyBHcmFsbG9jIHNvdXJjZS4gUHJldGVuZCB0aGF0IHdlIGFyZTsgdGhpcyB3aWxsIGZvcmNlIHVzIHRvIHVzZSBuQnVmZmVyU2l6ZS4KKyAgICAgICAgaWYgKG1JbnB1dE1ldGFkYXRhVHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgeworICAgICAgICAgICAgbUlucHV0TWV0YWRhdGFUeXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUNhbWVyYVNvdXJjZTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IHVzYWdlQml0czsKKyAgICAgICAgaWYgKG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBtTm9kZSwgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0cywKKyAgICAgICAgICAgICAgICAmdXNhZ2VCaXRzLCBzaXplb2YodXNhZ2VCaXRzKSkgPT0gT0spIHsKKyAgICAgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgInVzaW5nLXN3LXJlYWQtb2Z0ZW4iLCAhISh1c2FnZUJpdHMgJiBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4pKTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIGludDMyX3QgcHJlcGVuZFNQU1BQUyA9IDA7CiAgICAgaWYgKGVuY29kZXIKQEAgLTEyNDUsMTkgKzE3MTMsMTYgQEAKICAgICAvLyBzcHMvcHBzIHRvIGlkciBmcmFtZXMsIHNpbmNlIGluIG1ldGFkYXRhIG1vZGUgdGhlIGJpdHN0cmVhbSBpcyBpbiBhbgogICAgIC8vIG9wYXF1ZSBoYW5kbGUsIHRvIHdoaWNoIHdlIGRvbid0IGhhdmUgYWNjZXNzLgogICAgIGludDMyX3QgdmlkZW8gPSAhc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpOworICAgIG1Jc1ZpZGVvID0gdmlkZW87CiAgICAgaWYgKGVuY29kZXIgJiYgdmlkZW8pIHsKICAgICAgICAgT01YX0JPT0wgZW5hYmxlID0gKE9NWF9CT09MKSAocHJlcGVuZFNQU1BQUwogICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoInN0b3JlLW1ldGFkYXRhLWluLWJ1ZmZlcnMtb3V0cHV0IiwgJnN0b3JlTWV0YSkKICAgICAgICAgICAgICYmIHN0b3JlTWV0YSAhPSAwKTsKIAotICAgICAgICBlcnIgPSBtT01YLT5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzKG1Ob2RlLCBrUG9ydEluZGV4T3V0cHV0LCBlbmFibGUpOwotCisgICAgICAgIGVyciA9IG1PTVgtPnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMobU5vZGUsIGtQb3J0SW5kZXhPdXRwdXQsIGVuYWJsZSwgJm1PdXRwdXRNZXRhZGF0YVR5cGUpOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiWyVzXSBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzIChvdXRwdXQpIGZhaWxlZCB3LyBlcnIgJWQiLAogICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7Ci0gICAgICAgICAgICBtVXNlTWV0YWRhdGFPbkVuY29kZXJPdXRwdXQgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVVzZU1ldGFkYXRhT25FbmNvZGVyT3V0cHV0ID0gZW5hYmxlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQ2NCgKQEAgLTEyNzAsNiArMTczNSwxMCBAQAogICAgICAgICAgICAgbU1heFB0c0dhcFVzID0gLTFsbDsKICAgICAgICAgfQogCisgICAgICAgIGlmICghbXNnLT5maW5kRmxvYXQoIm1heC1mcHMtdG8tZW5jb2RlciIsICZtTWF4RnBzKSkgeworICAgICAgICAgICAgbU1heEZwcyA9IC0xOworICAgICAgICB9CisKICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQ2NCgidGltZS1sYXBzZSIsICZtVGltZVBlckNhcHR1cmVVcykpIHsKICAgICAgICAgICAgIG1UaW1lUGVyQ2FwdHVyZVVzID0gLTFsbDsKICAgICAgICAgfQpAQCAtMTI4NSw3ICsxNzU0LDcgQEAKICAgICBzcDxSZWZCYXNlPiBvYmo7CiAgICAgYm9vbCBoYXZlTmF0aXZlV2luZG93ID0gbXNnLT5maW5kT2JqZWN0KCJuYXRpdmUtd2luZG93IiwgJm9iaikKICAgICAgICAgICAgICYmIG9iaiAhPSBOVUxMICYmIHZpZGVvICYmICFlbmNvZGVyOwotICAgIG1TdG9yZU1ldGFEYXRhSW5PdXRwdXRCdWZmZXJzID0gZmFsc2U7CisgICAgbUxlZ2FjeUFkYXB0aXZlRXhwZXJpbWVudCA9IGZhbHNlOwogICAgIGlmICh2aWRlbyAmJiAhZW5jb2RlcikgewogICAgICAgICBpbnB1dEZvcm1hdC0+c2V0SW50MzIoImFkYXB0aXZlLXBsYXliYWNrIiwgZmFsc2UpOwogCkBAIC0xMzAwLDkgKzE3NjksOCBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChoYXZlTmF0aXZlV2luZG93KSB7Ci0gICAgICAgIHNwPE5hdGl2ZVdpbmRvd1dyYXBwZXI+IHdpbmRvd1dyYXBwZXIoCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TmF0aXZlV2luZG93V3JhcHBlciAqPihvYmouZ2V0KCkpKTsKLSAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gbmF0aXZlV2luZG93ID0gd2luZG93V3JhcHBlci0+Z2V0TmF0aXZlV2luZG93KCk7CisgICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+IG5hdGl2ZVdpbmRvdyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93ICo+KHN0YXRpY19jYXN0PFN1cmZhY2UgKj4ob2JqLmdldCgpKSk7CiAKICAgICAgICAgLy8gU1RBUlQgb2YgdGVtcG9yYXJ5IHN1cHBvcnQgZm9yIGF1dG9tYXRpYyBGUkMgLSBUSElTIFdJTEwgQkUgUkVNT1ZFRAogICAgICAgICBpbnQzMl90IGF1dG9GcmM7CkBAIC0xMzcxLDcgKzE4MzksNyBAQAogCiAgICAgICAgICAgICAvLyBBbHdheXMgdHJ5IHRvIGVuYWJsZSBkeW5hbWljIG91dHB1dCBidWZmZXJzIG9uIG5hdGl2ZSBzdXJmYWNlCiAgICAgICAgICAgICBlcnIgPSBtT01YLT5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzKAotICAgICAgICAgICAgICAgICAgICBtTm9kZSwga1BvcnRJbmRleE91dHB1dCwgT01YX1RSVUUpOworICAgICAgICAgICAgICAgICAgICBtTm9kZSwga1BvcnRJbmRleE91dHB1dCwgT01YX1RSVUUsICZtT3V0cHV0TWV0YWRhdGFUeXBlKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiWyVzXSBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzIGZhaWxlZCB3LyBlcnIgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKQEAgLTE0MjMsNyArMTg5MSwxMCBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzIHN1Y2NlZWRlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBtU3RvcmVNZXRhRGF0YUluT3V0cHV0QnVmZmVycyA9IHRydWU7CisgICAgICAgICAgICAgICAgQ0hFQ0soc3RvcmluZ01ldGFkYXRhSW5EZWNvZGVkQnVmZmVycygpKTsKKyAgICAgICAgICAgICAgICBtTGVnYWN5QWRhcHRpdmVFeHBlcmltZW50ID0gQURlYnVnOjppc0V4cGVyaW1lbnRFbmFibGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgImxlZ2FjeS1hZGFwdGl2ZSIsICFtc2ctPmNvbnRhaW5zKCJuby1leHBlcmltZW50cyIpKTsKKwogICAgICAgICAgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigiYWRhcHRpdmUtcGxheWJhY2siLCB0cnVlKTsKICAgICAgICAgICAgIH0KIApAQCAtMTQ2MSwyOCArMTkzMiwzMSBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGhhdmVOYXRpdmVXaW5kb3cpIHsKLSAgICAgICAgICAgIHNwPE5hdGl2ZVdpbmRvd1dyYXBwZXI+IG5hdGl2ZVdpbmRvdygKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TmF0aXZlV2luZG93V3JhcHBlciAqPihvYmouZ2V0KCkpKTsKLSAgICAgICAgICAgIENIRUNLKG5hdGl2ZVdpbmRvdyAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cgPSBuYXRpdmVXaW5kb3ctPmdldE5hdGl2ZVdpbmRvdygpOwotCi0gICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9zY2FsaW5nX21vZGUoCi0gICAgICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVyk7CisgICAgICAgICAgICBtTmF0aXZlV2luZG93ID0gc3RhdGljX2Nhc3Q8U3VyZmFjZSAqPihvYmouZ2V0KCkpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gaW5pdGlhbGl6ZSBuYXRpdmUgd2luZG93IG5vdyB0byBnZXQgYWN0dWFsIG91dHB1dCBmb3JtYXQKICAgICAgICAgLy8gVE9ETzogdGhpcyBpcyBuZWVkZWQgZm9yIHNvbWUgZW5jb2RlcnMgZXZlbiB0aG91Z2ggdGhleSBkb24ndCB1c2UgbmF0aXZlIHdpbmRvdwotICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIGluaXROYXRpdmVXaW5kb3coKSk7CisgICAgICAgIGVyciA9IGluaXROYXRpdmVXaW5kb3coKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIGZhbGxiYWNrIGZvciBkZXZpY2VzIHRoYXQgZG8gbm90IGhhbmRsZSBmbGV4LVlVViBmb3IgbmF0aXZlIGJ1ZmZlcnMKICAgICAgICAgaWYgKGhhdmVOYXRpdmVXaW5kb3cpIHsKICAgICAgICAgICAgIGludDMyX3QgcmVxdWVzdGVkQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0VW51c2VkOwogICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmcmVxdWVzdGVkQ29sb3JGb3JtYXQpICYmCiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZSkgewotICAgICAgICAgICAgICAgIENIRUNLX0VRKGdldFBvcnRGb3JtYXQoa1BvcnRJbmRleE91dHB1dCwgb3V0cHV0Rm9ybWF0KSwgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBnZXRQb3J0Rm9ybWF0KGtQb3J0SW5kZXhPdXRwdXQsIG91dHB1dEZvcm1hdCk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFVudXNlZDsKICAgICAgICAgICAgICAgICBPTVhfVTMyIGZsZXhpYmxlRXF1aXZhbGVudCA9IE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQ7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCkpOworICAgICAgICAgICAgICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm91cHR1dCBwb3J0IGRpZCBub3QgaGF2ZSBhIGNvbG9yIGZvcm1hdCAod3JvbmcgZG9tYWluPykiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gUmVxdWVzdGVkIG91dHB1dCBmb3JtYXQgJSN4IGFuZCBnb3QgJSN4LiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCByZXF1ZXN0ZWRDb2xvckZvcm1hdCwgY29sb3JGb3JtYXQpOwogICAgICAgICAgICAgICAgIGlmICghaXNGbGV4aWJsZUNvbG9yRm9ybWF0KApAQCAtMTQ5MiwxMSArMTk2NiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAvLyB0byBTVyByZW5kZXJlcgogICAgICAgICAgICAgICAgICAgICBBTE9HSSgiWyVzXSBGYWxsaW5nIGJhY2sgdG8gc29mdHdhcmUgcmVuZGVyZXIiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93VXNhZ2VCaXRzID0gMDsKICAgICAgICAgICAgICAgICAgICAgaGF2ZU5hdGl2ZVdpbmRvdyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB1c2luZ1N3UmVuZGVyZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAobVN0b3JlTWV0YURhdGFJbk91dHB1dEJ1ZmZlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVgtPnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMobU5vZGUsIGtQb3J0SW5kZXhPdXRwdXQsIE9NWF9GQUxTRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3RvcmVNZXRhRGF0YUluT3V0cHV0QnVmZmVycyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RvcmluZ01ldGFkYXRhSW5EZWNvZGVkQnVmZmVycygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBtT01YLT5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwga1BvcnRJbmRleE91dHB1dCwgT01YX0ZBTFNFLCAmbU91dHB1dE1ldGFkYXRhVHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0TWV0YWRhdGFUeXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUludmFsaWQ7IC8vIGp1c3QgaW4gY2FzZQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IGFkYXB0aXZlLXBsYXliYWNrIHN1cHBvcnQgZm9yIGJ5dGVidWZmZXIgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgZG9uZSBieSBTVyBjb2RlY3MsIGJ1dCBtb3N0IEhXIGNvZGVjcyBkb24ndCBzdXBwb3J0IGl0LgogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRGb3JtYXQtPnNldEludDMyKCJhZGFwdGl2ZS1wbGF5YmFjayIsIGZhbHNlKTsKQEAgLTE2MDQsNyArMjA4MCw3IEBACiAgICAgICAgICAgICBlcnIgPSBzZXR1cEc3MTFDb2RlYyhlbmNvZGVyLCBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpKSB7Ci0gICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGUsIGNvbXByZXNzaW9uTGV2ZWwgPSAtMTsKKyAgICAgICAgaW50MzJfdCBudW1DaGFubmVscyA9IDAsIHNhbXBsZVJhdGUgPSAwLCBjb21wcmVzc2lvbkxldmVsID0gLTE7CiAgICAgICAgIGlmIChlbmNvZGVyICYmCiAgICAgICAgICAgICAgICAgKCFtc2ctPmZpbmRJbnQzMigiY2hhbm5lbC1jb3VudCIsICZudW1DaGFubmVscykKICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFtc2ctPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpKSB7CkBAIC0xNjg2LDE2ICsyMTYyLDc4IEBACiAgICAgICAgIGVyciA9IHNldE1pbkJ1ZmZlclNpemUoa1BvcnRJbmRleElucHV0LCA4MTkyKTsgIC8vIFhYWAogICAgIH0KIAorICAgIGludDMyX3QgcHJpb3JpdHk7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJwcmlvcml0eSIsICZwcmlvcml0eSkpIHsKKyAgICAgICAgZXJyID0gc2V0UHJpb3JpdHkocHJpb3JpdHkpOworICAgIH0KKworICAgIGludDMyX3QgcmF0ZUludCA9IC0xOworICAgIGZsb2F0IHJhdGVGbG9hdCA9IC0xOworICAgIGlmICghbXNnLT5maW5kRmxvYXQoIm9wZXJhdGluZy1yYXRlIiwgJnJhdGVGbG9hdCkpIHsKKyAgICAgICAgbXNnLT5maW5kSW50MzIoIm9wZXJhdGluZy1yYXRlIiwgJnJhdGVJbnQpOworICAgICAgICByYXRlRmxvYXQgPSAoZmxvYXQpcmF0ZUludDsgIC8vIDE2TUh6IChGTElOVE1BWCkgaXMgT0sgZm9yIHVwcGVyIGJvdW5kLgorICAgIH0KKyAgICBpZiAocmF0ZUZsb2F0ID4gMCkgeworICAgICAgICBlcnIgPSBzZXRPcGVyYXRpbmdSYXRlKHJhdGVGbG9hdCwgdmlkZW8pOworICAgIH0KKwogICAgIG1CYXNlT3V0cHV0Rm9ybWF0ID0gb3V0cHV0Rm9ybWF0OwogCi0gICAgQ0hFQ0tfRVEoZ2V0UG9ydEZvcm1hdChrUG9ydEluZGV4SW5wdXQsIGlucHV0Rm9ybWF0KSwgKHN0YXR1c190KU9LKTsKLSAgICBDSEVDS19FUShnZXRQb3J0Rm9ybWF0KGtQb3J0SW5kZXhPdXRwdXQsIG91dHB1dEZvcm1hdCksIChzdGF0dXNfdClPSyk7Ci0gICAgbUlucHV0Rm9ybWF0ID0gaW5wdXRGb3JtYXQ7Ci0gICAgbU91dHB1dEZvcm1hdCA9IG91dHB1dEZvcm1hdDsKLQorICAgIGVyciA9IGdldFBvcnRGb3JtYXQoa1BvcnRJbmRleElucHV0LCBpbnB1dEZvcm1hdCk7CisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBlcnIgPSBnZXRQb3J0Rm9ybWF0KGtQb3J0SW5kZXhPdXRwdXQsIG91dHB1dEZvcm1hdCk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIG1JbnB1dEZvcm1hdCA9IGlucHV0Rm9ybWF0OworICAgICAgICAgICAgbU91dHB1dEZvcm1hdCA9IG91dHB1dEZvcm1hdDsKKyAgICAgICAgfQorICAgIH0KICAgICByZXR1cm4gZXJyOwogfQogCitzdGF0dXNfdCBBQ29kZWM6OnNldFByaW9yaXR5KGludDMyX3QgcHJpb3JpdHkpIHsKKyAgICBpZiAocHJpb3JpdHkgPCAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIE9NWF9QQVJBTV9VMzJUWVBFIGNvbmZpZzsKKyAgICBJbml0T01YUGFyYW1zKCZjb25maWcpOworICAgIGNvbmZpZy5uVTMyID0gKE9NWF9VMzIpcHJpb3JpdHk7CisgICAgc3RhdHVzX3QgdGVtcCA9IG1PTVgtPnNldENvbmZpZygKKyAgICAgICAgICAgIG1Ob2RlLCAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhDb25maWdQcmlvcml0eSwKKyAgICAgICAgICAgICZjb25maWcsIHNpemVvZihjb25maWcpKTsKKyAgICBpZiAodGVtcCAhPSBPSykgeworICAgICAgICBBTE9HSSgiY29kZWMgZG9lcyBub3Qgc3VwcG9ydCBjb25maWcgcHJpb3JpdHkgKGVyciAlZCkiLCB0ZW1wKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBQ29kZWM6OnNldE9wZXJhdGluZ1JhdGUoZmxvYXQgcmF0ZUZsb2F0LCBib29sIGlzVmlkZW8pIHsKKyAgICBpZiAocmF0ZUZsb2F0IDwgMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBPTVhfVTMyIHJhdGU7CisgICAgaWYgKGlzVmlkZW8pIHsKKyAgICAgICAgaWYgKHJhdGVGbG9hdCA+IDY1NTM1KSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHJhdGUgPSAoT01YX1UzMikocmF0ZUZsb2F0ICogNjU1MzYuMGYgKyAwLjVmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocmF0ZUZsb2F0ID4gVUlOVF9NQVgpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmF0ZSA9IChPTVhfVTMyKShyYXRlRmxvYXQpOworICAgIH0KKyAgICBPTVhfUEFSQU1fVTMyVFlQRSBjb25maWc7CisgICAgSW5pdE9NWFBhcmFtcygmY29uZmlnKTsKKyAgICBjb25maWcublUzMiA9IHJhdGU7CisgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+c2V0Q29uZmlnKAorICAgICAgICAgICAgbU5vZGUsIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleENvbmZpZ09wZXJhdGluZ1JhdGUsCisgICAgICAgICAgICAmY29uZmlnLCBzaXplb2YoY29uZmlnKSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HSSgiY29kZWMgZG9lcyBub3Qgc3VwcG9ydCBjb25maWcgb3BlcmF0aW5nIHJhdGUgKGVyciAlZCkiLCBlcnIpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IEFDb2RlYzo6c2V0TWluQnVmZmVyU2l6ZShPTVhfVTMyIHBvcnRJbmRleCwgc2l6ZV90IHNpemUpIHsKICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKICAgICBJbml0T01YUGFyYW1zKCZkZWYpOwpAQCAtMTcyOCw3ICsyMjY2LDEwIEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgQ0hFQ0soZGVmLm5CdWZmZXJTaXplID49IHNpemUpOworICAgIGlmIChkZWYubkJ1ZmZlclNpemUgPCBzaXplKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IG1pbiBidWZmZXIgc2l6ZSB0byAlenUgKGlzIHN0aWxsICV1KSIsIHNpemUsIGRlZi5uQnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMjA1Nyw3ICsyNTk4LDkgQEAKIH0KIAogc3RhdHVzX3QgQUNvZGVjOjpzZXR1cEc3MTFDb2RlYyhib29sIGVuY29kZXIsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBudW1DaGFubmVscykgewotICAgIENIRUNLKCFlbmNvZGVyKTsgIC8vIFhYWCBUT0RPCisgICAgaWYgKGVuY29kZXIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KIAogICAgIHJldHVybiBzZXR1cFJhd0F1ZGlvRm9ybWF0KAogICAgICAgICAgICAga1BvcnRJbmRleElucHV0LCBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7CkBAIC0yNTY4LDcgKzMxMTEsOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgQUxPR0koInNldHVwVmlkZW9FbmNvZGVyIHN1Y2NlZWRlZCIpOworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgQUxPR0koInNldHVwVmlkZW9FbmNvZGVyIHN1Y2NlZWRlZCIpOworICAgIH0KIAogICAgIHJldHVybiBlcnI7CiB9CkBAIC0zMTY2LDggKzM3MTEsOSBAQAogCiAgICAgc3RhdHVzX3QgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZkZWYsIHNpemVvZihkZWYpKTsKLQotICAgIENIRUNLX0VRKGVyciwgKHN0YXR1c190KU9LKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQogCiAgICAgaWYgKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQpIHsKICAgICAgICAgLy8gWFhYIE5lZWQgYSAobXVjaCkgYmV0dGVyIGhldXJpc3RpYyB0byBjb21wdXRlIGlucHV0IGJ1ZmZlciBzaXplcy4KQEAgLTMxNzcsNyArMzcyMywxMCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQ0hFQ0tfRVEoKGludClkZWYuZURvbWFpbiwgKGludClPTVhfUG9ydERvbWFpblZpZGVvKTsKKyAgICBpZiAoZGVmLmVEb21haW4gIT0gT01YX1BvcnREb21haW5WaWRlbykgeworICAgICAgICBBTE9HRSgiZXhwZWN0ZWQgdmlkZW8gcG9ydCwgZ290ICVzKCVkKSIsIGFzU3RyaW5nKGRlZi5lRG9tYWluKSwgZGVmLmVEb21haW4pOworICAgICAgICByZXR1cm4gRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIH0KIAogICAgIHZpZGVvX2RlZi0+bkZyYW1lV2lkdGggPSB3aWR0aDsKICAgICB2aWRlb19kZWYtPm5GcmFtZUhlaWdodCA9IGhlaWdodDsKQEAgLTMyNDEsOCArMzc5MCw4IEBACiAgICAgd2hpbGUgKGNvdW50QnVmZmVyc093bmVkQnlOYXRpdmVXaW5kb3coKSA+IG1OdW1VbmRlcXVldWVkQnVmZmVycwogICAgICAgICAgICAgJiYgZGVxdWV1ZUJ1ZmZlckZyb21OYXRpdmVXaW5kb3coKSAhPSBOVUxMKSB7CiAgICAgICAgIC8vIHRoZXNlIGJ1ZmZlcnMgd2lsbCBiZSBzdWJtaXR0ZWQgYXMgcmVndWxhciBidWZmZXJzOyBhY2NvdW50IGZvciB0aGlzCi0gICAgICAgIGlmIChtU3RvcmVNZXRhRGF0YUluT3V0cHV0QnVmZmVycyAmJiBtTWV0YURhdGFCdWZmZXJzVG9TdWJtaXQgPiAwKSB7Ci0gICAgICAgICAgICAtLW1NZXRhRGF0YUJ1ZmZlcnNUb1N1Ym1pdDsKKyAgICAgICAgaWYgKHN0b3JpbmdNZXRhZGF0YUluRGVjb2RlZEJ1ZmZlcnMoKSAmJiBtTWV0YWRhdGFCdWZmZXJzVG9TdWJtaXQgPiAwKSB7CisgICAgICAgICAgICAtLW1NZXRhZGF0YUJ1ZmZlcnNUb1N1Ym1pdDsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTM0NTQsMTcgKzQwMDMsMjAgQEAKIH0KIAogc3RhdHVzX3QgQUNvZGVjOjpnZXRQb3J0Rm9ybWF0KE9NWF9VMzIgcG9ydEluZGV4LCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkgewotICAgIC8vIFRPRE86IGNhdGNoIGVycm9ycyBhbiByZXR1cm4gdGhlbSBpbnN0ZWFkIG9mIHVzaW5nIENIRUNLCisgICAgY29uc3QgY2hhciAqbmljZUluZGV4ID0gcG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCA/ICJpbnB1dCIgOiAib3V0cHV0IjsKICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKICAgICBJbml0T01YUGFyYW1zKCZkZWYpOwogICAgIGRlZi5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCi0gICAgQ0hFQ0tfRVEobU9NWC0+Z2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAmZGVmLCBzaXplb2YoZGVmKSksCi0gICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtT01YLT5nZXRQYXJhbWV0ZXIobU5vZGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZkZWYsIHNpemVvZihkZWYpKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQogCi0gICAgQ0hFQ0tfRVEoKGludClkZWYuZURpciwKLSAgICAgICAgICAgIChpbnQpKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0ID8gT01YX0Rpck91dHB1dCA6IE9NWF9EaXJJbnB1dCkpOworICAgIGlmIChkZWYuZURpciAhPSAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQgPyBPTVhfRGlyT3V0cHV0IDogT01YX0RpcklucHV0KSkgeworICAgICAgICBBTE9HRSgidW5leHBlY3RlZCBkaXI6ICVzKCVkKSBvbiAlcyBwb3J0IiwgYXNTdHJpbmcoZGVmLmVEaXIpLCBkZWYuZURpciwgbmljZUluZGV4KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAKICAgICBzd2l0Y2ggKGRlZi5lRG9tYWluKSB7CiAgICAgICAgIGNhc2UgT01YX1BvcnREb21haW5WaWRlbzoKQEAgLTM0OTgsNyArNDA1MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkZXNjcmliZVBhcmFtcy5zTWVkaWFJbWFnZSkpKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhSW1hZ2UgKmltZyA9ICZkZXNjcmliZVBhcmFtcy5zTWVkaWFJbWFnZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBNZWRpYUltYWdlIHsgRiglenV4JXp1KSBAJXp1KyV6dSslenUgQCV6dSslenUrJXp1IEAlenUrJXp1KyV6dSB9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBNZWRpYUltYWdlIHsgRigldXgldSkgQCV1KyV1KyV1IEAldSsldSsldSBAJXUrJXUrJXUgfSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBpbWctPm1XaWR0aCwgaW1nLT5tSGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLT5tUGxhbmVbMF0ubU9mZnNldCwgaW1nLT5tUGxhbmVbMF0ubUNvbEluYywgaW1nLT5tUGxhbmVbMF0ubVJvd0luYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+bVBsYW5lWzFdLm1PZmZzZXQsIGltZy0+bVBsYW5lWzFdLm1Db2xJbmMsIGltZy0+bVBsYW5lWzFdLm1Sb3dJbmMsCkBAIC0zNTI3LDEyICs0MDc5LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5IZWlnaHQgPSB2aWRlb0RlZi0+bkZyYW1lSGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfR0UocmVjdC5uTGVmdCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLX0dFKHJlY3QublRvcCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLX0dFKHJlY3QubldpZHRoLCAwdSk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLX0dFKHJlY3QubkhlaWdodCwgMHUpOwotICAgICAgICAgICAgICAgICAgICBDSEVDS19MRShyZWN0Lm5MZWZ0ICsgcmVjdC5uV2lkdGggLSAxLCB2aWRlb0RlZi0+bkZyYW1lV2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBDSEVDS19MRShyZWN0Lm5Ub3AgKyByZWN0Lm5IZWlnaHQgLSAxLCB2aWRlb0RlZi0+bkZyYW1lSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3QubkxlZnQgPCAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5Ub3AgPCAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0ICsgcmVjdC5uV2lkdGggPiB2aWRlb0RlZi0+bkZyYW1lV2lkdGggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QublRvcCArIHJlY3QubkhlaWdodCA+IHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJXcm9uZyBjcm9wcGVkIHJlY3QgKCVkLCAlZCkgLSAoJXUsICV1KSB2cy4gZnJhbWUgKCV1LCAldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5MZWZ0LCByZWN0Lm5Ub3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubkxlZnQgKyByZWN0Lm5XaWR0aCwgcmVjdC5uVG9wICsgcmVjdC5uSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0RlZi0+bkZyYW1lV2lkdGgsIHZpZGVvRGVmLT5uRnJhbWVIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0UmVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3JvcCIsCkBAIC0zNTg5LDcgKzQxNDUsMTMgQEAKIAogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDSEVDSyhtSXNFbmNvZGVyIF4gKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0VuY29kZXIgXiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgQ29kaW5nVW51c2VkCisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiUmF3IHBvcnQgdmlkZW8gY29tcHJlc3Npb24gZm9ybWF0IGlzICVzKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKHZpZGVvRGVmLT5lQ29tcHJlc3Npb25Gb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0RlZi0+ZUNvbXByZXNzaW9uRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBtaW1lOwogICAgICAgICAgICAgICAgICAgICBpZiAoR2V0TWltZVR5cGVGb3JWaWRlb0NvZGluZygKICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRGVmLT5lQ29tcHJlc3Npb25Gb3JtYXQsICZtaW1lKSAhPSBPSykgewpAQCAtMzYyMCwyMCArNDE4MiwyNSBAQAogICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKIAotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtT01YLT5nZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb1BjbSwgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfR1QocGFyYW1zLm5DaGFubmVscywgMCk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKHBhcmFtcy5uQ2hhbm5lbHMgPT0gMSB8fCBwYXJhbXMuYkludGVybGVhdmVkKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEocGFyYW1zLm5CaXRQZXJTYW1wbGUsIDE2dSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKGludClwYXJhbXMuZU51bURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpT01YX051bWVyaWNhbERhdGFTaWduZWQpOwotCi0gICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKChpbnQpcGFyYW1zLmVQQ01Nb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KU9NWF9BVURJT19QQ01Nb2RlTGluZWFyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5uQ2hhbm5lbHMgPD0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChwYXJhbXMubkNoYW5uZWxzICE9IDEgJiYgIXBhcmFtcy5iSW50ZXJsZWF2ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW1zLm5CaXRQZXJTYW1wbGUgIT0gMTZ1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW1zLmVOdW1EYXRhICE9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW1zLmVQQ01Nb2RlICE9IE9NWF9BVURJT19QQ01Nb2RlTGluZWFyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgidW5zdXBwb3J0ZWQgUENNIHBvcnQ6ICV1IGNoYW5uZWxzJXMsICV1LWJpdCwgJXMoJWQpLCAlcyglZCkgbW9kZSAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMubkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuYkludGVybGVhdmVkID8gIiBpbnRlcmxlYXZlZCIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5CaXRQZXJTYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKHBhcmFtcy5lTnVtRGF0YSksIHBhcmFtcy5lTnVtRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcocGFyYW1zLmVQQ01Nb2RlKSwgcGFyYW1zLmVQQ01Nb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMubkNoYW5uZWxzKTsKQEAgLTM2NTEsMTAgKzQyMTgsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CiAKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobU9NWC0+Z2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb0FhYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtT01YLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9BYWMsICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5uQ2hhbm5lbHMpOwpAQCAtMzY2OCwyMSArNDIzNiwxOCBAQAogICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKIAotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtT01YLT5nZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvQW1yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb0FtciwgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIDEpOwogICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmVBTVJCYW5kTW9kZSA+PSBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQik7Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgMTYwMDApOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKTsKLQorICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpOwogICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCA4MDAwKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTM2OTQsMTAgKzQyNTksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CiAKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobU9NWC0+Z2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb0ZsYWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvRmxhYywgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5uQ2hhbm5lbHMpOwpAQCAtMzcxMSwxMCArNDI3NywxMSBAQAogICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKIAotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtT01YLT5nZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvTXAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb01wMywgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5uQ2hhbm5lbHMpOwpAQCAtMzcyOCwxMCArNDI5NSwxMSBAQAogICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKIAotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtT01YLT5nZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvVm9yYmlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgT01YX0luZGV4UGFyYW1BdWRpb1ZvcmJpcywgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpOwogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcGFyYW1zLm5DaGFubmVscyk7CkBAIC0zNzQ1LDExICs0MzEzLDEyIEBACiAgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCi0gICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbU9NWC0+Z2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWMzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBhcmFtcykpKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFjMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDMyk7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMubkNoYW5uZWxzKTsKQEAgLTM3NjMsMTEgKzQzMzIsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CiAKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKHN0YXR1c190KU9LLCBtT01YLT5nZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRFYWMzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBhcmFtcykpKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEVhYzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzKTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5uQ2hhbm5lbHMpOwpAQCAtMzc4MSwxMSArNDM1MSwxMiBAQAogICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKIAotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIG1PTVgtPmdldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZE9wdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocGFyYW1zKSkpOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtT01YLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkT3B1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpOwogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcGFyYW1zLm5DaGFubmVscyk7CkBAIC0zNzk5LDExICs0MzcwLDExIEBACiAgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OwogCi0gICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgbU9NWC0+Z2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9QY20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YocGFyYW1zKSkpOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtT01YLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9QY20sICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWUgPSBOVUxMOwogICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmVQQ01Nb2RlID09IE9NWF9BVURJT19QQ01Nb2RlTVVMYXcpIHsKQEAgLTM4MjEsMzAgKzQzOTIsMzMgQEAKIAogICAgICAgICAgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ0dTTUZSOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX01QM1RZUEUgcGFyYW1zOworICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgcGFyYW1zOwogICAgICAgICAgICAgICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOwogICAgICAgICAgICAgICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKIAotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtT01YLT5nZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVgtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleFBhcmFtQXVkaW9QY20sICZwYXJhbXMsIHNpemVvZihwYXJhbXMpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU00pOwogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcGFyYW1zLm5DaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgcGFyYW1zLm5TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBwYXJhbXMublNhbXBsaW5nUmF0ZSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJVTktOT1dOIEFVRElPIENPRElORzogJWRcbiIsIGF1ZGlvRGVmLT5lRW5jb2RpbmcpOwotICAgICAgICAgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgYXVkaW8gY29kaW5nOiAlcyglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoYXVkaW9EZWYtPmVFbmNvZGluZyksIGF1ZGlvRGVmLT5lRW5jb2RpbmcpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1RZUEU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIGRvbWFpbjogJXMoJWQpIiwgYXNTdHJpbmcoZGVmLmVEb21haW4pLCBkZWYuZURvbWFpbik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1RZUEU7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpAQCAtMzg1NCw3ICs0NDI4LDEwIEBACiAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1CYXNlT3V0cHV0Rm9ybWF0LT5kdXAoKTsKICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRPdXRwdXRGb3JtYXRDaGFuZ2VkKTsKIAotICAgIENIRUNLX0VRKGdldFBvcnRGb3JtYXQoa1BvcnRJbmRleE91dHB1dCwgbm90aWZ5KSwgKHN0YXR1c190KU9LKTsKKyAgICBpZiAoZ2V0UG9ydEZvcm1hdChrUG9ydEluZGV4T3V0cHV0LCBub3RpZnkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJbJXNdIEZhaWxlZCB0byBnZXQgcG9ydCBmb3JtYXQgdG8gc2VuZCBmb3JtYXQgY2hhbmdlIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBBU3RyaW5nIG1pbWU7CiAgICAgQ0hFQ0sobm90aWZ5LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKQEAgLTM4NzQsOSArNDQ1MSw3IEBACiAgICAgICAgIGlmIChtU2tpcEN1dEJ1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBzaXplX3QgcHJldmJ1ZnNpemUgPSBtU2tpcEN1dEJ1ZmZlci0+c2l6ZSgpOwogICAgICAgICAgICAgaWYgKHByZXZidWZzaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiUmVwbGFjaW5nIFNraXBDdXRCdWZmZXIgaG9sZGluZyAlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgImJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICBwcmV2YnVmc2l6ZSk7CisgICAgICAgICAgICAgICAgQUxPR1coIlJlcGxhY2luZyBTa2lwQ3V0QnVmZmVyIGhvbGRpbmcgJXp1IGJ5dGVzIiwgcHJldmJ1ZnNpemUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1Ta2lwQ3V0QnVmZmVyID0gbmV3IFNraXBDdXRCdWZmZXIoCkBAIC0zOTEwLDE1MCArNDQ4NSw2IEBACiAgICAgbm90aWZ5LT5wb3N0KCk7CiB9CiAKLXN0YXR1c190IEFDb2RlYzo6cHVzaEJsYW5rQnVmZmVyc1RvTmF0aXZlV2luZG93KCkgewotICAgIHN0YXR1c190IGVyciA9IE5PX0VSUk9SOwotICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYiA9IE5VTEw7Ci0gICAgaW50IG51bUJ1ZnMgPSAwOwotICAgIGludCBtaW5VbmRlcXVldWVkQnVmcyA9IDA7Ci0KLSAgICAvLyBXZSBuZWVkIHRvIHJlY29ubmVjdCB0byB0aGUgQU5hdGl2ZVdpbmRvdyBhcyBhIENQVSBjbGllbnQgdG8gZW5zdXJlIHRoYXQKLSAgICAvLyBubyBmcmFtZXMgZ2V0IGRyb3BwZWQgYnkgU3VyZmFjZUZsaW5nZXIgYXNzdW1pbmcgdGhhdCB0aGVzZSBhcmUgdmlkZW8KLSAgICAvLyBmcmFtZXMuCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdChtTmF0aXZlV2luZG93LmdldCgpLAotICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiBhcGlfZGlzY29ubmVjdCBmYWlsZWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9DUFUpOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiBhcGlfY29ubmVjdCBmYWlsZWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2dlb21ldHJ5KG1OYXRpdmVXaW5kb3cuZ2V0KCksIDEsIDEsCi0gICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1JHQlhfODg4OCk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IHNldF9idWZmZXJzX2dlb21ldHJ5IGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X3NjYWxpbmdfbW9kZShtTmF0aXZlV2luZG93LmdldCgpLAotICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVyk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFua19mcmFtZXM6IHNldF9zY2FsaW5nX21vZGUgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlKG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOKTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogc2V0X3VzYWdlIGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGVyciA9IG1OYXRpdmVXaW5kb3ctPnF1ZXJ5KG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsICZtaW5VbmRlcXVldWVkQnVmcyk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IE1JTl9VTkRFUVVFVUVEX0JVRkZFUlMgcXVlcnkgIgotICAgICAgICAgICAgICAgICJmYWlsZWQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgbnVtQnVmcyA9IG1pblVuZGVxdWV1ZWRCdWZzICsgMTsKLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQobU5hdGl2ZVdpbmRvdy5nZXQoKSwgbnVtQnVmcyk7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IHNldF9idWZmZXJfY291bnQgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgLy8gV2UgIHB1c2ggbnVtQnVmcyArIDEgYnVmZmVycyB0byBlbnN1cmUgdGhhdCB3ZSd2ZSBkcmF3biBpbnRvIHRoZSBzYW1lCi0gICAgLy8gYnVmZmVyIHR3aWNlLiAgVGhpcyBzaG91bGQgZ3VhcmFudGVlIHRoYXQgdGhlIGJ1ZmZlciBoYXMgYmVlbiBkaXNwbGF5ZWQKLSAgICAvLyBvbiB0aGUgc2NyZWVuIGFuZCB0aGVuIGJlZW4gcmVwbGFjZWQsIHNvIGFuIHByZXZpb3VzIHZpZGVvIGZyYW1lcyBhcmUKLSAgICAvLyBndWFyYW50ZWVkIE5PVCB0byBiZSBjdXJyZW50bHkgZGlzcGxheWVkLgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQnVmcyArIDE7IGkrKykgewotICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X2RlcXVldWVfYnVmZmVyX2FuZF93YWl0KG1OYXRpdmVXaW5kb3cuZ2V0KCksICZhbmIpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGRlcXVldWVCdWZmZXIgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZihuZXcgR3JhcGhpY0J1ZmZlcihhbmIsIGZhbHNlKSk7Ci0KLSAgICAgICAgLy8gRmlsbCB0aGUgYnVmZmVyIHdpdGggdGhlIGEgMXgxIGNoZWNrZXJib2FyZCBwYXR0ZXJuIDspCi0gICAgICAgIHVpbnQzMl90KiBpbWcgPSBOVUxMOwotICAgICAgICBlcnIgPSBidWYtPmxvY2soR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgKHZvaWQqKikoJmltZykpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGxvY2sgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotCi0gICAgICAgICppbWcgPSAwOwotCi0gICAgICAgIGVyciA9IGJ1Zi0+dW5sb2NrKCk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogdW5sb2NrIGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBtTmF0aXZlV2luZG93LT5xdWV1ZUJ1ZmZlcihtTmF0aXZlV2luZG93LmdldCgpLAotICAgICAgICAgICAgICAgIGJ1Zi0+Z2V0TmF0aXZlQnVmZmVyKCksIC0xKTsKLSAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiBxdWV1ZUJ1ZmZlciBmYWlsZWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgYW5iID0gTlVMTDsKLSAgICB9Ci0KLWVycm9yOgotCi0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAvLyBDbGVhbiB1cCBhZnRlciBhbiBlcnJvci4KLSAgICAgICAgaWYgKGFuYiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtTmF0aXZlV2luZG93LT5jYW5jZWxCdWZmZXIobU5hdGl2ZVdpbmRvdy5nZXQoKSwgYW5iLCAtMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfQ1BVKTsKLSAgICAgICAgbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdChtTmF0aXZlV2luZG93LmdldCgpLAotICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIENsZWFuIHVwIGFmdGVyIHN1Y2Nlc3MuCi0gICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QobU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9DUFUpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGFwaV9kaXNjb25uZWN0IGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGFwaV9jb25uZWN0IGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotfQotCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBBQ29kZWM6OlBvcnREZXNjcmlwdGlvbjo6UG9ydERlc2NyaXB0aW9uKCkgewpAQCAtNDEyMSwxMiArNDU1Miw0MCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRPTVhNZXNzYWdlOgorICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRPTVhNZXNzYWdlTGlzdDoKICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNoZWNrT01YTWVzc2FnZShtc2cpID8gb25PTVhNZXNzYWdlTGlzdChtc2cpIDogdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdE9NWE1lc3NhZ2VJdGVtOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBubyBuZWVkIHRvIGNoZWNrIGFzIHdlIGFscmVhZHkgZGlkIGl0IGZvciBrV2hhdE9NWE1lc3NhZ2VMaXN0CiAgICAgICAgICAgICByZXR1cm4gb25PTVhNZXNzYWdlKG1zZyk7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRPTVhNZXNzYWdlOgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY2hlY2tPTVhNZXNzYWdlKG1zZykgPyBvbk9NWE1lc3NhZ2UobXNnKSA6IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRTZXRTdXJmYWNlOgorICAgICAgICB7CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKworICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzdXJmYWNlIiwgJm9iaikpOworCisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29kZWMtPmhhbmRsZVNldFN1cmZhY2Uoc3RhdGljX2Nhc3Q8U3VyZmFjZSAqPihvYmouZ2V0KCkpKTsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOworICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlOgorICAgICAgICBjYXNlIEFDb2RlYzo6a1doYXRTZXRJbnB1dFN1cmZhY2U6CiAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdFNpZ25hbEVuZE9mSW5wdXRTdHJlYW06CiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIFRoaXMgbWF5IHJlc3VsdCBpbiBhbiBhcHAgaWxsZWdhbCBzdGF0ZSBleGNlcHRpb24uCkBAIC00MTYzLDIxICs0NjIyLDUxIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQUNvZGVjOjpCYXNlU3RhdGU6Om9uT01YTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIGludDMyX3QgdHlwZTsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHlwZSIsICZ0eXBlKSk7Ci0KK2Jvb2wgQUNvZGVjOjpCYXNlU3RhdGU6OmNoZWNrT01YTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIC8vIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCB0aGlzIGlzIGFuIG91dHN0YW5kaW5nIG1lc3NhZ2UgZm9yIGEKICAgICAvLyBjb2RlYyB0aGF0IHdlIGhhdmUgYWxyZWFkeSBkZXN0cm95ZWQKLSAgICBpZiAobUNvZGVjLT5tTm9kZSA9PSBOVUxMKSB7CisgICAgaWYgKG1Db2RlYy0+bU5vZGUgPT0gMCkgewogICAgICAgICBBTE9HSSgiaWdub3JpbmcgbWVzc2FnZSBhcyBhbHJlYWR5IGZyZWVkIGNvbXBvbmVudDogJXMiLAogICAgICAgICAgICAgICAgIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBJT01YOjpub2RlX2lkIG5vZGVJRDsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibm9kZSIsIChpbnQzMl90Kikmbm9kZUlEKSk7Ci0gICAgQ0hFQ0tfRVEobm9kZUlELCBtQ29kZWMtPm1Ob2RlKTsKKyAgICBpZiAobm9kZUlEICE9IG1Db2RlYy0+bU5vZGUpIHsKKyAgICAgICAgQUxPR0UoIlVuZXhwZWN0ZWQgbWVzc2FnZSBmb3Igbm9kZUlEOiAldSwgc2hvdWxkIGhhdmUgYmVlbiAldSIsIG5vZGVJRCwgbUNvZGVjLT5tTm9kZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQUNvZGVjOjpCYXNlU3RhdGU6Om9uT01YTWVzc2FnZUxpc3QoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJtZXNzYWdlcyIsICZvYmopKTsKKyAgICBzcDxNZXNzYWdlTGlzdD4gbXNnTGlzdCA9IHN0YXRpY19jYXN0PE1lc3NhZ2VMaXN0ICo+KG9iai5nZXQoKSk7CisKKyAgICBib29sIHJlY2VpdmVkUmVuZGVyZWRFdmVudHMgPSBmYWxzZTsKKyAgICBmb3IgKHN0ZDo6bGlzdDxzcDxBTWVzc2FnZT4+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1zZ0xpc3QtPmdldExpc3QoKS5jYmVnaW4oKTsKKyAgICAgICAgICBpdCAhPSBtc2dMaXN0LT5nZXRMaXN0KCkuY2VuZCgpOyArK2l0KSB7CisgICAgICAgICgqaXQpLT5zZXRXaGF0KEFDb2RlYzo6a1doYXRPTVhNZXNzYWdlSXRlbSk7CisgICAgICAgIG1Db2RlYy0+aGFuZGxlTWVzc2FnZSgqaXQpOworICAgICAgICBpbnQzMl90IHR5cGU7CisgICAgICAgIENIRUNLKCgqaXQpLT5maW5kSW50MzIoInR5cGUiLCAmdHlwZSkpOworICAgICAgICBpZiAodHlwZSA9PSBvbXhfbWVzc2FnZTo6RlJBTUVfUkVOREVSRUQpIHsKKyAgICAgICAgICAgIHJlY2VpdmVkUmVuZGVyZWRFdmVudHMgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHJlY2VpdmVkUmVuZGVyZWRFdmVudHMpIHsKKyAgICAgICAgLy8gTk9URTogYWxsIGJ1ZmZlcnMgYXJlIHJlbmRlcmVkIGluIHRoaXMgY2FzZQorICAgICAgICBtQ29kZWMtPm5vdGlmeU9mUmVuZGVyZWRGcmFtZXMoKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQUNvZGVjOjpCYXNlU3RhdGU6Om9uT01YTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGludDMyX3QgdHlwZTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHlwZSIsICZ0eXBlKSk7CiAKICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgY2FzZSBvbXhfbWVzc2FnZTo6RVZFTlQ6CkBAIC00MjA3LDkgKzQ2OTYsMTIgQEAKICAgICAgICAgY2FzZSBvbXhfbWVzc2FnZTo6RU1QVFlfQlVGRkVSX0RPTkU6CiAgICAgICAgIHsKICAgICAgICAgICAgIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXJJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJidWZmZXIiLCAoaW50MzJfdCopJmJ1ZmZlcklEKSk7CisgICAgICAgICAgICBpbnQzMl90IGZlbmNlRmQ7CiAKLSAgICAgICAgICAgIHJldHVybiBvbk9NWEVtcHR5QnVmZmVyRG9uZShidWZmZXJJRCk7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYnVmZmVyIiwgKGludDMyX3QqKSZidWZmZXJJRCkpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImZlbmNlX2ZkIiwgJmZlbmNlRmQpKTsKKworICAgICAgICAgICAgcmV0dXJuIG9uT01YRW1wdHlCdWZmZXJEb25lKGJ1ZmZlcklELCBmZW5jZUZkKTsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2Ugb214X21lc3NhZ2U6OkZJTExfQlVGRkVSX0RPTkU6CkBAIC00MjE3LDM3ICs0NzA5LDU2IEBACiAgICAgICAgICAgICBJT01YOjpidWZmZXJfaWQgYnVmZmVySUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYnVmZmVyIiwgKGludDMyX3QqKSZidWZmZXJJRCkpOwogCi0gICAgICAgICAgICBpbnQzMl90IHJhbmdlT2Zmc2V0LCByYW5nZUxlbmd0aCwgZmxhZ3M7CisgICAgICAgICAgICBpbnQzMl90IHJhbmdlT2Zmc2V0LCByYW5nZUxlbmd0aCwgZmxhZ3MsIGZlbmNlRmQ7CiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKIAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJhbmdlX29mZnNldCIsICZyYW5nZU9mZnNldCkpOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJhbmdlX2xlbmd0aCIsICZyYW5nZUxlbmd0aCkpOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImZsYWdzIiwgJmZsYWdzKSk7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZXN0YW1wIiwgJnRpbWVVcykpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImZlbmNlX2ZkIiwgJmZlbmNlRmQpKTsKIAogICAgICAgICAgICAgcmV0dXJuIG9uT01YRmlsbEJ1ZmZlckRvbmUoCiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklELAogICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KXJhbmdlT2Zmc2V0LCAoc2l6ZV90KXJhbmdlTGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAoT01YX1UzMilmbGFncywKLSAgICAgICAgICAgICAgICAgICAgdGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgdGltZVVzLAorICAgICAgICAgICAgICAgICAgICBmZW5jZUZkKTsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2Ugb214X21lc3NhZ2U6OkZSQU1FX1JFTkRFUkVEOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzLCBzeXN0ZW1OYW5vOworCisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgibWVkaWFfdGltZV91cyIsICZtZWRpYVRpbWVVcykpOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInN5c3RlbV9uYW5vIiwgJnN5c3RlbU5hbm8pKTsKKworICAgICAgICAgICAgcmV0dXJuIG9uT01YRnJhbWVSZW5kZXJlZCgKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFUaW1lVXMsIHN5c3RlbU5hbm8pOwogICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIEFMT0dFKCJVbmV4cGVjdGVkIG1lc3NhZ2UgdHlwZTogJWQiLCB0eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiB9CiAKK2Jvb2wgQUNvZGVjOjpCYXNlU3RhdGU6Om9uT01YRnJhbWVSZW5kZXJlZCgKKyAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVcyBfX3VudXNlZCwgbnNlY3NfdCBzeXN0ZW1OYW5vIF9fdW51c2VkKSB7CisgICAgLy8gaWdub3JlIG91dHNpZGUgb2YgRXhlY3V0aW5nIGFuZCBQb3J0U2V0dGluZ3NDaGFuZ2VkIHN0YXRlcworICAgIHJldHVybiB0cnVlOworfQorCiBib29sIEFDb2RlYzo6QmFzZVN0YXRlOjpvbk9NWEV2ZW50KAogICAgICAgICBPTVhfRVZFTlRUWVBFIGV2ZW50LCBPTVhfVTMyIGRhdGExLCBPTVhfVTMyIGRhdGEyKSB7CiAgICAgaWYgKGV2ZW50ICE9IE9NWF9FdmVudEVycm9yKSB7Ci0gICAgICAgIEFMT0dWKCJbJXNdIEVWRU5UKCVkLCAweCUwOGx4LCAweCUwOGx4KSIsCisgICAgICAgIEFMT0dWKCJbJXNdIEVWRU5UKCVkLCAweCUwOHgsIDB4JTA4eCkiLAogICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXZlbnQsIGRhdGExLCBkYXRhMik7CiAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIEFMT0dFKCJbJXNdIEVSUk9SKDB4JTA4bHgpIiwgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBkYXRhMSk7CisgICAgQUxPR0UoIlslc10gRVJST1IoMHglMDh4KSIsIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZGF0YTEpOwogCiAgICAgLy8gdmVyaWZ5IE9NWCBjb21wb25lbnQgc2VuZHMgYmFjayBhbiBlcnJvciB3ZSBleHBlY3QuCiAgICAgT01YX0VSUk9SVFlQRSBvbXhFcnJvciA9IChPTVhfRVJST1JUWVBFKWRhdGExOwpAQCAtNDI2MCwxNiArNDc3MSwyOSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIEFDb2RlYzo6QmFzZVN0YXRlOjpvbk9NWEVtcHR5QnVmZmVyRG9uZShJT01YOjpidWZmZXJfaWQgYnVmZmVySUQpIHsKLSAgICBBTE9HVigiWyVzXSBvbk9NWEVtcHR5QnVmZmVyRG9uZSAlcCIsCitib29sIEFDb2RlYzo6QmFzZVN0YXRlOjpvbk9NWEVtcHR5QnVmZmVyRG9uZShJT01YOjpidWZmZXJfaWQgYnVmZmVySUQsIGludCBmZW5jZUZkKSB7CisgICAgQUxPR1YoIlslc10gb25PTVhFbXB0eUJ1ZmZlckRvbmUgJXUiLAogICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBidWZmZXJJRCk7CiAKLSAgICBCdWZmZXJJbmZvICppbmZvID0KLSAgICAgICAgbUNvZGVjLT5maW5kQnVmZmVyQnlJRChrUG9ydEluZGV4SW5wdXQsIGJ1ZmZlcklEKTsKLQotICAgIENIRUNLX0VRKChpbnQpaW5mby0+bVN0YXR1cywgKGludClCdWZmZXJJbmZvOjpPV05FRF9CWV9DT01QT05FTlQpOworICAgIEJ1ZmZlckluZm8gKmluZm8gPSBtQ29kZWMtPmZpbmRCdWZmZXJCeUlEKGtQb3J0SW5kZXhJbnB1dCwgYnVmZmVySUQpOworICAgIEJ1ZmZlckluZm86OlN0YXR1cyBzdGF0dXMgPSBCdWZmZXJJbmZvOjpnZXRTYWZlU3RhdHVzKGluZm8pOworICAgIGlmIChzdGF0dXMgIT0gQnVmZmVySW5mbzo6T1dORURfQllfQ09NUE9ORU5UKSB7CisgICAgICAgIEFMT0dFKCJXcm9uZyBvd25lcnNoaXAgaW4gRUJEOiAlcyglZCkgYnVmZmVyICMldSIsIF9hc1N0cmluZyhzdGF0dXMpLCBzdGF0dXMsIGJ1ZmZlcklEKTsKKyAgICAgICAgbUNvZGVjLT5kdW1wQnVmZmVycyhrUG9ydEluZGV4SW5wdXQpOworICAgICAgICBpZiAoZmVuY2VGZCA+PSAwKSB7CisgICAgICAgICAgICA6OmNsb3NlKGZlbmNlRmQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTOwogCisgICAgLy8gaW5wdXQgYnVmZmVycyBjYW5ub3QgdGFrZSBmZW5jZXMsIHNvIHdhaXQgZm9yIGFueSBmZW5jZSBub3cKKyAgICAodm9pZCltQ29kZWMtPndhaXRGb3JGZW5jZShmZW5jZUZkLCAib25PTVhFbXB0eUJ1ZmZlckRvbmUiKTsKKyAgICBmZW5jZUZkID0gLTE7CisKKyAgICAvLyBzdGlsbCBzYXZlIGZlbmNlIGZvciBjb21wbGV0ZW5lc3MKKyAgICBpbmZvLT5zZXRXcml0ZUZlbmNlKGZlbmNlRmQsICJvbk9NWEVtcHR5QnVmZmVyRG9uZSIpOworCiAgICAgLy8gV2UncmUgaW4gInN0b3JlLW1ldGFkYXRhLWluLWJ1ZmZlcnMiIG1vZGUsIHRoZSB1bmRlcmx5aW5nCiAgICAgLy8gT01YIGNvbXBvbmVudCBoYWQgYWNjZXNzIHRvIGRhdGEgdGhhdCdzIGltcGxpY2l0bHkgcmVmY291bnRlZAogICAgIC8vIGJ5IHRoaXMgIk1lZGlhQnVmZmVyIiBvYmplY3QuIE5vdyB0aGF0IHRoZSBPTVggY29tcG9uZW50IGhhcwpAQCAtNDI4NywxMiArNDgxMSwxMCBAQAogICAgICAgICAgICAgcG9zdEZpbGxUaGlzQnVmZmVyKGluZm8pOwogICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgY2FzZSBGUkVFX0JVRkZFUlM6CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbW9kZSwgKGludClGUkVFX0JVRkZFUlMpOwotICAgICAgICAgICAgVFJFU1BBU1MoKTsgIC8vIE5vdCBjdXJyZW50bHkgdXNlZAotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dFKCJTSE9VTEQgTk9UIFJFQUNIIEhFUkU6IGNhbm5vdCBmcmVlIGVtcHR5IG91dHB1dCBidWZmZXJzIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgcmV0dXJuIHRydWU7CkBAIC00MzEyLDcgKzQ4MzQsNyBAQAogICAgIGluZm8tPm1EYXRhLT5tZXRhKCktPmNsZWFyKCk7CiAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGluZm8tPm1EYXRhKTsKIAotICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdElucHV0QnVmZmVyRmlsbGVkLCBtQ29kZWMtPmlkKCkpOworICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdElucHV0QnVmZmVyRmlsbGVkLCBtQ29kZWMpOwogICAgIHJlcGx5LT5zZXRJbnQzMigiYnVmZmVyLWlkIiwgaW5mby0+bUJ1ZmZlcklEKTsKIAogICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CkBAIC00MzUzLDcgKzQ4NzUsMTMgQEAKICAgICB9CiAKICAgICBCdWZmZXJJbmZvICppbmZvID0gbUNvZGVjLT5maW5kQnVmZmVyQnlJRChrUG9ydEluZGV4SW5wdXQsIGJ1ZmZlcklEKTsKLSAgICBDSEVDS19FUSgoaW50KWluZm8tPm1TdGF0dXMsIChpbnQpQnVmZmVySW5mbzo6T1dORURfQllfVVBTVFJFQU0pOworICAgIEJ1ZmZlckluZm86OlN0YXR1cyBzdGF0dXMgPSBCdWZmZXJJbmZvOjpnZXRTYWZlU3RhdHVzKGluZm8pOworICAgIGlmIChzdGF0dXMgIT0gQnVmZmVySW5mbzo6T1dORURfQllfVVBTVFJFQU0pIHsKKyAgICAgICAgQUxPR0UoIldyb25nIG93bmVyc2hpcCBpbiBJQkY6ICVzKCVkKSBidWZmZXIgIyV1IiwgX2FzU3RyaW5nKHN0YXR1cyksIHN0YXR1cywgYnVmZmVySUQpOworICAgICAgICBtQ29kZWMtPmR1bXBCdWZmZXJzKGtQb3J0SW5kZXhJbnB1dCk7CisgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBGQUlMRURfVFJBTlNBQ1RJT04pOworICAgICAgICByZXR1cm47CisgICAgfQogCiAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTOwogCkBAIC00MzcyLDYgKzQ5MDAsMTIgQEAKICAgICAgICAgY2FzZSBSRVNVQk1JVF9CVUZGRVJTOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwgJiYgIW1Db2RlYy0+bVBvcnRFT1Nba1BvcnRJbmRleElucHV0XSkgeworICAgICAgICAgICAgICAgIC8vIERvIG5vdCBzZW5kIGVtcHR5IGlucHV0IGJ1ZmZlciB3L28gRU9TIHRvIHRoZSBjb21wb25lbnQuCisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID09IDAgJiYgIWVvcykgeworICAgICAgICAgICAgICAgICAgICBwb3N0RmlsbFRoaXNCdWZmZXIoaW5mbyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOwogICAgICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKIApAQCAtNDM4NywyOCArNDkyMSwzNCBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChidWZmZXIgIT0gaW5mby0+bURhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gTmVlZHMgdG8gY29weSBpbnB1dCBkYXRhIGZvciBidWZmZXIgJXAuICglcCAhPSAlcCkiLAorICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBOZWVkcyB0byBjb3B5IGlucHV0IGRhdGEgZm9yIGJ1ZmZlciAldS4gKCVwICE9ICVwKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklELAogICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5nZXQoKSwgaW5mby0+bURhdGEuZ2V0KCkpOwogCi0gICAgICAgICAgICAgICAgICAgIENIRUNLX0xFKGJ1ZmZlci0+c2l6ZSgpLCBpbmZvLT5tRGF0YS0+Y2FwYWNpdHkoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXItPnNpemUoKSA+IGluZm8tPm1EYXRhLT5jYXBhY2l0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZGF0YSBzaXplICglenUpIGlzIGdyZWF0ZWQgdGhhbiBidWZmZXIgY2FwYWNpdHkgKCV6dSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPnNpemUoKSwgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIGRhdGEgcmVjZWl2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+bURhdGEtPmNhcGFjaXR5KCkpOyAvLyB0aGlzIGlzIG91dCBidWZmZXIgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIEZBSUxFRF9UUkFOU0FDVElPTik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGluZm8tPm1EYXRhLT5kYXRhKCksIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gY2FsbGluZyBlbXB0eUJ1ZmZlciAlcCB3LyBjb2RlYyBzcGVjaWZpYyBkYXRhIiwKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gY2FsbGluZyBlbXB0eUJ1ZmZlciAldSB3LyBjb2RlYyBzcGVjaWZpYyBkYXRhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGJ1ZmZlcklEKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIGNhbGxpbmcgZW1wdHlCdWZmZXIgJXAgdy8gRU9TIiwKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gY2FsbGluZyBlbXB0eUJ1ZmZlciAldSB3LyBFT1MiLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgYnVmZmVySUQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAjaWYgVFJBQ0tfQlVGRkVSX1RJTUlORwotICAgICAgICAgICAgICAgICAgICBBTE9HSSgiWyVzXSBjYWxsaW5nIGVtcHR5QnVmZmVyICVwIHcvIHRpbWUgJWxsZCB1cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBidWZmZXJJRCwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIlslc10gY2FsbGluZyBlbXB0eUJ1ZmZlciAldSB3LyB0aW1lICVsbGQgdXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgYnVmZmVySUQsIChsb25nIGxvbmcpdGltZVVzKTsKICNlbHNlCi0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIGNhbGxpbmcgZW1wdHlCdWZmZXIgJXAgdy8gdGltZSAlbGxkIHVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGJ1ZmZlcklELCB0aW1lVXMpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBjYWxsaW5nIGVtcHR5QnVmZmVyICV1IHcvIHRpbWUgJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBidWZmZXJJRCwgKGxvbmcgbG9uZyl0aW1lVXMpOwogI2VuZGlmCiAgICAgICAgICAgICAgICAgfQogCkBAIC00NDE5LDYxICs0OTU5LDY5IEBACiAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQnVmZmVyU3RhdHMuYWRkKHRpbWVVcywgc3RhdHMpOwogI2VuZGlmCiAKLSAgICAgICAgICAgICAgICBpZiAobUNvZGVjLT5tU3RvcmVNZXRhRGF0YUluT3V0cHV0QnVmZmVycykgeworICAgICAgICAgICAgICAgIGlmIChtQ29kZWMtPnN0b3JpbmdNZXRhZGF0YUluRGVjb2RlZEJ1ZmZlcnMoKSkgewogICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gc3VibWl0IGFuIG91dHB1dCBidWZmZXIgZm9yIGVhY2ggaW5wdXQgYnVmZmVyCiAgICAgICAgICAgICAgICAgICAgIFBvcnRNb2RlIG91dHB1dE1vZGUgPSBnZXRQb3J0TW9kZShrUG9ydEluZGV4T3V0cHV0KTsKIAotICAgICAgICAgICAgICAgICAgICBBTE9HVigiTWV0YURhdGFCdWZmZXJzVG9TdWJtaXQ9JXUgcG9ydE1vZGU9JXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bU1ldGFEYXRhQnVmZmVyc1RvU3VibWl0LAorICAgICAgICAgICAgICAgICAgICBBTE9HVigiTWV0YWRhdGFCdWZmZXJzVG9TdWJtaXQ9JXUgcG9ydE1vZGU9JXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bU1ldGFkYXRhQnVmZmVyc1RvU3VibWl0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRwdXRNb2RlID09IEZSRUVfQlVGRkVSUyA/ICJGUkVFIiA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dE1vZGUgPT0gS0VFUF9CVUZGRVJTID8gIktFRVAiIDogIlJFU1VCTUlUIikpOwogICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0TW9kZSA9PSBSRVNVQk1JVF9CVUZGRVJTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnN1Ym1pdE91dHB1dE1ldGFEYXRhQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnN1Ym1pdE91dHB1dE1ldGFkYXRhQnVmZmVyKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBDSEVDS19FUShtQ29kZWMtPm1PTVgtPmVtcHR5QnVmZmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7Ci0KKyAgICAgICAgICAgICAgICBpbmZvLT5jaGVja1JlYWRGZW5jZSgib25JbnB1dEJ1ZmZlckZpbGxlZCIpOworICAgICAgICAgICAgICAgIHN0YXR1c190IGVycjIgPSBtQ29kZWMtPm1PTVgtPmVtcHR5QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Ob2RlLAorICAgICAgICAgICAgICAgICAgICBidWZmZXJJRCwKKyAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5zaXplKCksCisgICAgICAgICAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICB0aW1lVXMsCisgICAgICAgICAgICAgICAgICAgIGluZm8tPm1GZW5jZUZkKTsKKyAgICAgICAgICAgICAgICBpbmZvLT5tRmVuY2VGZCA9IC0xOworICAgICAgICAgICAgICAgIGlmIChlcnIyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBtYWtlTm9TaWRlRWZmZWN0U3RhdHVzKGVycjIpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfQ09NUE9ORU5UOwogCi0gICAgICAgICAgICAgICAgaWYgKCFlb3MpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWVvcyAmJiBlcnIgPT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgZ2V0TW9yZUlucHV0RGF0YUlmUG9zc2libGUoKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBTaWduYWxsZWQgRU9TIG9uIHRoZSBpbnB1dCBwb3J0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBTaWduYWxsZWQgRU9TICglZCkgb24gdGhlIGlucHV0IHBvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKIAogICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Qb3J0RU9TW2tQb3J0SW5kZXhJbnB1dF0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1JbnB1dEVPU1Jlc3VsdCA9IGVycjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtQ29kZWMtPm1Qb3J0RU9TW2tQb3J0SW5kZXhJbnB1dF0pIHsKLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gU2lnbmFsbGluZyBFT1Mgb24gdGhlIGlucHV0IHBvcnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJkdWUgdG8gZXJyb3IgJWQiLAorICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gU2lnbmFsbGluZyBFT1Mgb24gdGhlIGlucHV0IHBvcnQgZHVlIHRvIGVycm9yICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gU2lnbmFsbGluZyBFT1Mgb24gdGhlIGlucHV0IHBvcnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgQUxPR1YoIlslc10gY2FsbGluZyBlbXB0eUJ1ZmZlciAlcCBzaWduYWxsaW5nIEVPUyIsCisgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gY2FsbGluZyBlbXB0eUJ1ZmZlciAldSBzaWduYWxsaW5nIEVPUyIsCiAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGJ1ZmZlcklEKTsKIAotICAgICAgICAgICAgICAgIENIRUNLX0VRKG1Db2RlYy0+bU9NWC0+ZW1wdHlCdWZmZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0JVRkZFUkZMQUdfRU9TLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7Ci0KKyAgICAgICAgICAgICAgICBpbmZvLT5jaGVja1JlYWRGZW5jZSgib25JbnB1dEJ1ZmZlckZpbGxlZCIpOworICAgICAgICAgICAgICAgIHN0YXR1c190IGVycjIgPSBtQ29kZWMtPm1PTVgtPmVtcHR5QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklELAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQlVGRkVSRkxBR19FT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+bUZlbmNlRmQpOworICAgICAgICAgICAgICAgIGluZm8tPm1GZW5jZUZkID0gLTE7CisgICAgICAgICAgICAgICAgaWYgKGVycjIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIG1ha2VOb1NpZGVFZmZlY3RTdGF0dXMoZXJyMikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9DT01QT05FTlQ7CiAKICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Qb3J0RU9TW2tQb3J0SW5kZXhJbnB1dF0gPSB0cnVlOwpAQCAtNDQ4Miw4ICs1MDMwLDExIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgRlJFRV9CVUZGRVJTOgorICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbW9kZSwgKGludClGUkVFX0JVRkZFUlMpOworICAgICAgICAgICAgQUxPR0UoImludmFsaWQgcG9ydCBtb2RlOiAlZCIsIG1vZGUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogfQpAQCAtNDUyMSwxMSArNTA3MiwxMyBAQAogICAgICAgICBJT01YOjpidWZmZXJfaWQgYnVmZmVySUQsCiAgICAgICAgIHNpemVfdCByYW5nZU9mZnNldCwgc2l6ZV90IHJhbmdlTGVuZ3RoLAogICAgICAgICBPTVhfVTMyIGZsYWdzLAotICAgICAgICBpbnQ2NF90IHRpbWVVcykgeworICAgICAgICBpbnQ2NF90IHRpbWVVcywKKyAgICAgICAgaW50IGZlbmNlRmQpIHsKICAgICBBTE9HVigiWyVzXSBvbk9NWEZpbGxCdWZmZXJEb25lICV1IHRpbWUgJSIgUFJJZDY0ICIgdXMsIGZsYWdzID0gMHglMDh4IiwKICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgYnVmZmVySUQsIHRpbWVVcywgZmxhZ3MpOwogCiAgICAgc3NpemVfdCBpbmRleDsKKyAgICBzdGF0dXNfdCBlcnI9IE9LOwogCiAjaWYgVFJBQ0tfQlVGRkVSX1RJTUlORwogICAgIGluZGV4ID0gbUNvZGVjLT5tQnVmZmVyU3RhdHMuaW5kZXhPZktleSh0aW1lVXMpOwpAQCAtNDU0NCwxMiArNTA5NywzNiBAQAogCiAgICAgQnVmZmVySW5mbyAqaW5mbyA9CiAgICAgICAgIG1Db2RlYy0+ZmluZEJ1ZmZlckJ5SUQoa1BvcnRJbmRleE91dHB1dCwgYnVmZmVySUQsICZpbmRleCk7Ci0KLSAgICBDSEVDS19FUSgoaW50KWluZm8tPm1TdGF0dXMsIChpbnQpQnVmZmVySW5mbzo6T1dORURfQllfQ09NUE9ORU5UKTsKKyAgICBCdWZmZXJJbmZvOjpTdGF0dXMgc3RhdHVzID0gQnVmZmVySW5mbzo6Z2V0U2FmZVN0YXR1cyhpbmZvKTsKKyAgICBpZiAoc3RhdHVzICE9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX0NPTVBPTkVOVCkgeworICAgICAgICBBTE9HRSgiV3Jvbmcgb3duZXJzaGlwIGluIEZCRDogJXMoJWQpIGJ1ZmZlciAjJXUiLCBfYXNTdHJpbmcoc3RhdHVzKSwgc3RhdHVzLCBidWZmZXJJRCk7CisgICAgICAgIG1Db2RlYy0+ZHVtcEJ1ZmZlcnMoa1BvcnRJbmRleE91dHB1dCk7CisgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBGQUlMRURfVFJBTlNBQ1RJT04pOworICAgICAgICBpZiAoZmVuY2VGZCA+PSAwKSB7CisgICAgICAgICAgICA6OmNsb3NlKGZlbmNlRmQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KIAogICAgIGluZm8tPm1EZXF1ZXVlZEF0ID0gKyttQ29kZWMtPm1EZXF1ZXVlQ291bnRlcjsKICAgICBpbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfVVM7CiAKKyAgICBpZiAoaW5mby0+bVJlbmRlckluZm8gIT0gTlVMTCkgeworICAgICAgICAvLyBUaGUgZmVuY2UgZm9yIGFuIGVtcHRpZWQgYnVmZmVyIG11c3QgaGF2ZSBzaWduYWxlZCwgYnV0IHRoZXJlIHN0aWxsIGNvdWxkIGJlIHF1ZXVlZAorICAgICAgICAvLyBvciBvdXQtb2Ytb3JkZXIgZGVxdWV1ZWQgYnVmZmVycyBpbiB0aGUgcmVuZGVyIHF1ZXVlIHByaW9yIHRvIHRoaXMgYnVmZmVyLiBEcm9wIHRoZXNlLAorICAgICAgICAvLyBhcyB3ZSB3aWxsIHNvb24gcmVxdWV1ZSB0aGlzIGJ1ZmZlciB0byB0aGUgc3VyZmFjZS4gV2hpbGUgaW4gdGhlb3J5IHdlIGNvdWxkIHN0aWxsIGtlZXAKKyAgICAgICAgLy8gdHJhY2sgb2YgYnVmZmVycyB0aGF0IGFyZSByZXF1ZXVlZCB0byB0aGUgc3VyZmFjZSwgaXQgaXMgYmV0dGVyIHRvIGFkZCBzdXBwb3J0IHRvIHRoZQorICAgICAgICAvLyBidWZmZXItcXVldWUgdG8gbm90aWZ5IHVzIG9mIHJlbGVhc2VkIGJ1ZmZlcnMgYW5kIHRoZWlyIGZlbmNlcyAoaW4gdGhlIGZ1dHVyZSkuCisgICAgICAgIG1Db2RlYy0+bm90aWZ5T2ZSZW5kZXJlZEZyYW1lcyh0cnVlIC8qIGRyb3BJbmNvbXBsZXRlICovKTsKKyAgICB9CisKKyAgICAvLyBieXRlIGJ1ZmZlcnMgY2Fubm90IHRha2UgZmVuY2VzLCBzbyB3YWl0IGZvciBhbnkgZmVuY2Ugbm93CisgICAgaWYgKG1Db2RlYy0+bU5hdGl2ZVdpbmRvdyA9PSBOVUxMKSB7CisgICAgICAgICh2b2lkKW1Db2RlYy0+d2FpdEZvckZlbmNlKGZlbmNlRmQsICJvbk9NWEZpbGxCdWZmZXJEb25lIik7CisgICAgICAgIGZlbmNlRmQgPSAtMTsKKyAgICB9CisgICAgaW5mby0+c2V0UmVhZEZlbmNlKGZlbmNlRmQsICJvbk9NWEZpbGxCdWZmZXJEb25lIik7CisKICAgICBQb3J0TW9kZSBtb2RlID0gZ2V0UG9ydE1vZGUoa1BvcnRJbmRleE91dHB1dCk7CiAKICAgICBzd2l0Y2ggKG1vZGUpIHsKQEAgLTQ1NjMsMjQgKzUxNDAsMzkgQEAKICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBjYWxsaW5nIGZpbGxCdWZmZXIgJXUiLAogICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBpbmZvLT5tQnVmZmVySUQpOwogCi0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEobUNvZGVjLT5tT01YLT5maWxsQnVmZmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsIGluZm8tPm1CdWZmZXJJRCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBtQ29kZWMtPm1PTVgtPmZpbGxCdWZmZXIobUNvZGVjLT5tTm9kZSwgaW5mby0+bUJ1ZmZlcklELCBpbmZvLT5tRmVuY2VGZCk7CisgICAgICAgICAgICAgICAgaW5mby0+bUZlbmNlRmQgPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBtYWtlTm9TaWRlRWZmZWN0U3RhdHVzKGVycikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfQ09NUE9ORU5UOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPQotICAgICAgICAgICAgICAgIG5ldyBBTWVzc2FnZShrV2hhdE91dHB1dEJ1ZmZlckRyYWluZWQsIG1Db2RlYy0+aWQoKSk7CisgICAgICAgICAgICAgICAgbmV3IEFNZXNzYWdlKGtXaGF0T3V0cHV0QnVmZmVyRHJhaW5lZCwgbUNvZGVjKTsKIAogICAgICAgICAgICAgaWYgKCFtQ29kZWMtPm1TZW50Rm9ybWF0ICYmIHJhbmdlTGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgIG1Db2RlYy0+c2VuZEZvcm1hdENoYW5nZShyZXBseSk7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtQ29kZWMtPm1Vc2VNZXRhZGF0YU9uRW5jb2Rlck91dHB1dCkgewotICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICoobmF0aXZlX2hhbmRsZV90KiopKGluZm8tPm1EYXRhLT5kYXRhKCkgKyA0KTsKKyAgICAgICAgICAgIGlmIChtQ29kZWMtPnVzaW5nTWV0YWRhdGFPbkVuY29kZXJPdXRwdXQoKSkgeworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKKyAgICAgICAgICAgICAgICBWaWRlb0dyYWxsb2NNZXRhZGF0YSAmZ3JhbGxvY01ldGEgPSAqKFZpZGVvR3JhbGxvY01ldGFkYXRhICopaW5mby0+bURhdGEtPmRhdGEoKTsKKyAgICAgICAgICAgICAgICBWaWRlb05hdGl2ZU1ldGFkYXRhICZuYXRpdmVNZXRhID0gKihWaWRlb05hdGl2ZU1ldGFkYXRhICopaW5mby0+bURhdGEtPmRhdGEoKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5mby0+bURhdGEtPnNpemUoKSA+PSBzaXplb2YoZ3JhbGxvY01ldGEpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBncmFsbG9jTWV0YS5lVHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGUgPSAobmF0aXZlX2hhbmRsZV90ICopKHVpbnRwdHJfdClncmFsbG9jTWV0YS5wSGFuZGxlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5mby0+bURhdGEtPnNpemUoKSA+PSBzaXplb2YobmF0aXZlTWV0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIG5hdGl2ZU1ldGEuZVR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUFOV0J1ZmZlcikgeworI2lmZGVmIE9NWF9BTkRST0lEX0NPTVBJTEVfQVNfMzJCSVRfT05fNjRCSVRfUExBVEZPUk1TCisgICAgICAgICAgICAgICAgICAgIC8vIEFOYXRpdmVXaW5kb3dCdWZmZXIgaXMgb25seSB2YWxpZCBvbiAzMi1iaXQvbWVkaWFzZXJ2ZXIgcHJvY2VzcworICAgICAgICAgICAgICAgICAgICBoYW5kbGUgPSBOVUxMOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlID0gKG5hdGl2ZV9oYW5kbGVfdCAqKW5hdGl2ZU1ldGEucEJ1ZmZlci0+aGFuZGxlOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGluZm8tPm1EYXRhLT5tZXRhKCktPnNldFBvaW50ZXIoImhhbmRsZSIsIGhhbmRsZSk7CiAgICAgICAgICAgICAgICAgaW5mby0+bURhdGEtPm1ldGEoKS0+c2V0SW50MzIoInJhbmdlT2Zmc2V0IiwgcmFuZ2VPZmZzZXQpOwogICAgICAgICAgICAgICAgIGluZm8tPm1EYXRhLT5tZXRhKCktPnNldEludDMyKCJyYW5nZUxlbmd0aCIsIHJhbmdlTGVuZ3RoKTsKQEAgLTQ2MjcsMTQgKzUyMTksMTcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0tfRVEoKGludCltb2RlLCAoaW50KUZSRUVfQlVGRkVSUyk7Ci0KLSAgICAgICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywKLSAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+ZnJlZUJ1ZmZlcihrUG9ydEluZGV4T3V0cHV0LCBpbmRleCkpOworICAgICAgICBjYXNlIEZSRUVfQlVGRkVSUzoKKyAgICAgICAgICAgIGVyciA9IG1Db2RlYy0+ZnJlZUJ1ZmZlcihrUG9ydEluZGV4T3V0cHV0LCBpbmRleCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIG1ha2VOb1NpZGVFZmZlY3RTdGF0dXMoZXJyKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBwb3J0IG1vZGU6ICVkIiwgbW9kZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgcmV0dXJuIHRydWU7CkBAIC00NjQ0LDE1ICs1MjM5LDIyIEBACiAgICAgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklEOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJidWZmZXItaWQiLCAoaW50MzJfdCopJmJ1ZmZlcklEKSk7CiAgICAgc3NpemVfdCBpbmRleDsKLSAgICBCdWZmZXJJbmZvICppbmZvID0KLSAgICAgICAgbUNvZGVjLT5maW5kQnVmZmVyQnlJRChrUG9ydEluZGV4T3V0cHV0LCBidWZmZXJJRCwgJmluZGV4KTsKLSAgICBDSEVDS19FUSgoaW50KWluZm8tPm1TdGF0dXMsIChpbnQpQnVmZmVySW5mbzo6T1dORURfQllfRE9XTlNUUkVBTSk7CisgICAgQnVmZmVySW5mbyAqaW5mbyA9IG1Db2RlYy0+ZmluZEJ1ZmZlckJ5SUQoa1BvcnRJbmRleE91dHB1dCwgYnVmZmVySUQsICZpbmRleCk7CisgICAgQnVmZmVySW5mbzo6U3RhdHVzIHN0YXR1cyA9IEJ1ZmZlckluZm86OmdldFNhZmVTdGF0dXMoaW5mbyk7CisgICAgaWYgKHN0YXR1cyAhPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9ET1dOU1RSRUFNKSB7CisgICAgICAgIEFMT0dFKCJXcm9uZyBvd25lcnNoaXAgaW4gT0JEOiAlcyglZCkgYnVmZmVyICMldSIsIF9hc1N0cmluZyhzdGF0dXMpLCBzdGF0dXMsIGJ1ZmZlcklEKTsKKyAgICAgICAgbUNvZGVjLT5kdW1wQnVmZmVycyhrUG9ydEluZGV4T3V0cHV0KTsKKyAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIEZBSUxFRF9UUkFOU0FDVElPTik7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKICAgICBhbmRyb2lkX25hdGl2ZV9yZWN0X3QgY3JvcDsKLSAgICBpZiAobXNnLT5maW5kUmVjdCgiY3JvcCIsCi0gICAgICAgICAgICAmY3JvcC5sZWZ0LCAmY3JvcC50b3AsICZjcm9wLnJpZ2h0LCAmY3JvcC5ib3R0b20pKSB7Ci0gICAgICAgIENIRUNLX0VRKDAsIG5hdGl2ZV93aW5kb3dfc2V0X2Nyb3AoCi0gICAgICAgICAgICAgICAgbUNvZGVjLT5tTmF0aXZlV2luZG93LmdldCgpLCAmY3JvcCkpOworICAgIGlmIChtc2ctPmZpbmRSZWN0KCJjcm9wIiwgJmNyb3AubGVmdCwgJmNyb3AudG9wLCAmY3JvcC5yaWdodCwgJmNyb3AuYm90dG9tKSkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9jcm9wKG1Db2RlYy0+bU5hdGl2ZVdpbmRvdy5nZXQoKSwgJmNyb3ApOworICAgICAgICBBTE9HV19JRihlcnIgIT0gTk9fRVJST1IsICJmYWlsZWQgdG8gc2V0IGNyb3A6ICVkIiwgZXJyKTsKKyAgICAgICAgLy8gU2F2ZSB0aGUgY3JvcCByZWN0YW5nbGUgdG8gYmUgdXNlZCB3aGVuIHRoZSBzdXJmYWNlIGNoYW5nZXMKKyAgICAgICAgbUNvZGVjLT5tSGFzTGFzdENyb3AgPSB0cnVlOworICAgICAgICBtQ29kZWMtPm1MYXN0Q3JvcCA9IGNyb3A7CiAgICAgfQogCiAgICAgaW50MzJfdCByZW5kZXI7CkBAIC00NjYyLDM3ICs1MjY0LDQ1IEBACiAgICAgICAgIEFUUkFDRV9OQU1FKCJyZW5kZXIiKTsKICAgICAgICAgLy8gVGhlIGNsaWVudCB3YW50cyB0aGlzIGJ1ZmZlciB0byBiZSByZW5kZXJlZC4KIAorICAgICAgICAvLyBzYXZlIGJ1ZmZlcnMgc2VudCB0byB0aGUgc3VyZmFjZSBzbyB3ZSBjYW4gZ2V0IHJlbmRlciB0aW1lIHdoZW4gdGhleSByZXR1cm4KKyAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVcyA9IC0xOworICAgICAgICBpbmZvLT5tRGF0YS0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcyk7CisgICAgICAgIGlmIChtZWRpYVRpbWVVcyA+PSAwKSB7CisgICAgICAgICAgICBtQ29kZWMtPm1SZW5kZXJUcmFja2VyLm9uRnJhbWVRdWV1ZWQoCisgICAgICAgICAgICAgICAgICAgIG1lZGlhVGltZVVzLCBpbmZvLT5tR3JhcGhpY0J1ZmZlciwgbmV3IEZlbmNlKDo6ZHVwKGluZm8tPm1GZW5jZUZkKSkpOworICAgICAgICB9CisKICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBOcyA9IDA7CiAgICAgICAgIGlmICghbXNnLT5maW5kSW50NjQoInRpbWVzdGFtcE5zIiwgJnRpbWVzdGFtcE5zKSkgewotICAgICAgICAgICAgLy8gVE9ETzogaXQgc2VlbXMgbGlrZSB3ZSBzaG91bGQgdXNlIHRoZSB0aW1lc3RhbXAKLSAgICAgICAgICAgIC8vIGluIHRoZSAobWVkaWEpYnVmZmVyIGFzIGl0IHBvdGVudGlhbGx5IGNhbWUgZnJvbQotICAgICAgICAgICAgLy8gYW4gaW5wdXQgc3VyZmFjZSwgYnV0IHdlIGRpZCBub3QgcHJvcGFnYXRlIGl0IHByaW9yIHRvCi0gICAgICAgICAgICAvLyBBUEkgMjAuICBQZXJoYXBzIGNoZWNrIGZvciB0YXJnZXQgU0RLIHZlcnNpb24uCi0jaWYgMAorICAgICAgICAgICAgLy8gdXNlIG1lZGlhIHRpbWVzdGFtcCBpZiBjbGllbnQgZGlkIG5vdCByZXF1ZXN0IGEgc3BlY2lmaWMgcmVuZGVyIHRpbWVzdGFtcAogICAgICAgICAgICAgaWYgKGluZm8tPm1EYXRhLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVzdGFtcE5zKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJ1c2luZyBidWZmZXIgUFRTIG9mICUiIFBSSWQ2NCwgdGltZXN0YW1wTnMpOworICAgICAgICAgICAgICAgIEFMT0dWKCJ1c2luZyBidWZmZXIgUFRTIG9mICVsbGQiLCAobG9uZyBsb25nKXRpbWVzdGFtcE5zKTsKICAgICAgICAgICAgICAgICB0aW1lc3RhbXBOcyAqPSAxMDAwOwogICAgICAgICAgICAgfQotI2VuZGlmCiAgICAgICAgIH0KIAogICAgICAgICBzdGF0dXNfdCBlcnI7CiAgICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdGltZXN0YW1wKG1Db2RlYy0+bU5hdGl2ZVdpbmRvdy5nZXQoKSwgdGltZXN0YW1wTnMpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHNldCBidWZmZXIgdGltZXN0YW1wOiAlZCIsIGVycik7Ci0gICAgICAgIH0KKyAgICAgICAgQUxPR1dfSUYoZXJyICE9IE5PX0VSUk9SLCAiZmFpbGVkIHRvIHNldCBidWZmZXIgdGltZXN0YW1wOiAlZCIsIGVycik7CiAKLSAgICAgICAgaWYgKChlcnIgPSBtQ29kZWMtPm1OYXRpdmVXaW5kb3ctPnF1ZXVlQnVmZmVyKAotICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgIGluZm8tPm1HcmFwaGljQnVmZmVyLmdldCgpLCAtMSkpID09IE9LKSB7CisgICAgICAgIGluZm8tPmNoZWNrUmVhZEZlbmNlKCJvbk91dHB1dEJ1ZmZlckRyYWluZWQgYmVmb3JlIHF1ZXVlQnVmZmVyIik7CisgICAgICAgIGVyciA9IG1Db2RlYy0+bU5hdGl2ZVdpbmRvdy0+cXVldWVCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5hdGl2ZVdpbmRvdy5nZXQoKSwgaW5mby0+bUdyYXBoaWNCdWZmZXIuZ2V0KCksIGluZm8tPm1GZW5jZUZkKTsKKyAgICAgICAgaW5mby0+bUZlbmNlRmQgPSAtMTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX05BVElWRV9XSU5ET1c7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgicXVldWVCdWZmZXIgZmFpbGVkIGluIG9uT3V0cHV0QnVmZmVyRHJhaW5lZDogJWQiLCBlcnIpOwogICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIG1ha2VOb1NpZGVFZmZlY3RTdGF0dXMoZXJyKSk7CiAgICAgICAgICAgICBpbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfVVM7CisgICAgICAgICAgICAvLyBrZWVwaW5nIHJlYWQgZmVuY2UgYXMgd3JpdGUgZmVuY2UgdG8gYXZvaWQgY2xvYmJlcmluZworICAgICAgICAgICAgaW5mby0+bUlzUmVhZEZlbmNlID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAobUNvZGVjLT5tTmF0aXZlV2luZG93ICE9IE5VTEwgJiYKICAgICAgICAgICAgIChpbmZvLT5tRGF0YSA9PSBOVUxMIHx8IGluZm8tPm1EYXRhLT5zaXplKCkgIT0gMCkpIHsKKyAgICAgICAgICAgIC8vIG1vdmUgcmVhZCBmZW5jZSBpbnRvIHdyaXRlIGZlbmNlIHRvIGF2b2lkIGNsb2JiZXJpbmcKKyAgICAgICAgICAgIGluZm8tPm1Jc1JlYWRGZW5jZSA9IGZhbHNlOwogICAgICAgICAgICAgQVRSQUNFX05BTUUoImZyYW1lLWRyb3AiKTsKICAgICAgICAgfQogICAgICAgICBpbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfVVM7CkBAIC00NzI3LDI0ICs1MzM3LDMyIEBACiAgICAgICAgICAgICAgICAgaWYgKGluZm8gIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBjYWxsaW5nIGZpbGxCdWZmZXIgJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgaW5mby0+bUJ1ZmZlcklEKTsKLQotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtQ29kZWMtPm1PTVgtPmZpbGxCdWZmZXIobUNvZGVjLT5tTm9kZSwgaW5mby0+bUJ1ZmZlcklEKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKLQotICAgICAgICAgICAgICAgICAgICBpbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfQ09NUE9ORU5UOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5jaGVja1dyaXRlRmVuY2UoIm9uT3V0cHV0QnVmZmVyRHJhaW5lZDo6UkVTVUJNSVRfQlVGRkVSUyIpOworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29kZWMtPm1PTVgtPmZpbGxCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tTm9kZSwgaW5mby0+bUJ1ZmZlcklELCBpbmZvLT5tRmVuY2VGZCk7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPm1GZW5jZUZkID0gLTE7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9DT01QT05FTlQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgbWFrZU5vU2lkZUVmZmVjdFN0YXR1cyhlcnIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2FzZSBGUkVFX0JVRkZFUlM6CiAgICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbW9kZSwgKGludClGUkVFX0JVRkZFUlMpOwotCi0gICAgICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssCi0gICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPmZyZWVCdWZmZXIoa1BvcnRJbmRleE91dHB1dCwgaW5kZXgpKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1Db2RlYy0+ZnJlZUJ1ZmZlcihrUG9ydEluZGV4T3V0cHV0LCBpbmRleCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIG1ha2VOb1NpZGVFZmZlY3RTdGF0dXMoZXJyKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBwb3J0IG1vZGU6ICVkIiwgbW9kZSk7CisgICAgICAgICAgICByZXR1cm47CiAgICAgfQogfQogCkBAIC00NzYzLDExICs1MzgxLDEzIEBACiAgICAgfQogCiAgICAgbUNvZGVjLT5tTmF0aXZlV2luZG93LmNsZWFyKCk7Ci0gICAgbUNvZGVjLT5tTm9kZSA9IE5VTEw7CisgICAgbUNvZGVjLT5tTmF0aXZlV2luZG93VXNhZ2VCaXRzID0gMDsKKyAgICBtQ29kZWMtPm1Ob2RlID0gMDsKICAgICBtQ29kZWMtPm1PTVguY2xlYXIoKTsKICAgICBtQ29kZWMtPm1RdWlya3MgPSAwOwogICAgIG1Db2RlYy0+bUZsYWdzID0gMDsKLSAgICBtQ29kZWMtPm1Vc2VNZXRhZGF0YU9uRW5jb2Rlck91dHB1dCA9IDA7CisgICAgbUNvZGVjLT5tSW5wdXRNZXRhZGF0YVR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZDsKKyAgICBtQ29kZWMtPm1PdXRwdXRNZXRhZGF0YVR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZDsKICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNsZWFyKCk7CiB9CiAKQEAgLTQ4NDEsMTQgKzU0NjEsMTcgQEAKIGJvb2wgQUNvZGVjOjpVbmluaXRpYWxpemVkU3RhdGU6Om9uQWxsb2NhdGVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBBTE9HVigib25BbGxvY2F0ZUNvbXBvbmVudCIpOwogCi0gICAgQ0hFQ0sobUNvZGVjLT5tTm9kZSA9PSBOVUxMKTsKKyAgICBDSEVDSyhtQ29kZWMtPm1Ob2RlID09IDApOwogCiAgICAgT01YQ2xpZW50IGNsaWVudDsKLSAgICBDSEVDS19FUShjbGllbnQuY29ubmVjdCgpLCAoc3RhdHVzX3QpT0spOworICAgIGlmIChjbGllbnQuY29ubmVjdCgpICE9IE9LKSB7CisgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBOT19JTklUKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAogICAgIHNwPElPTVg+IG9teCA9IGNsaWVudC5pbnRlcmZhY2UoKTsKIAotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPTVhEaWVkLCBtQ29kZWMtPmlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPTVhEaWVkLCBtQ29kZWMpOwogCiAgICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcihub3RpZnkpOwogICAgIGlmIChJSW50ZXJmYWNlOjphc0JpbmRlcihvbXgpLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcikgIT0gT0spIHsKQEAgLTQ4ODksOCArNTUxMiw5IEBACiAgICAgfQogCiAgICAgc3A8Q29kZWNPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBuZXcgQ29kZWNPYnNlcnZlcjsKLSAgICBJT01YOjpub2RlX2lkIG5vZGUgPSBOVUxMOworICAgIElPTVg6Om5vZGVfaWQgbm9kZSA9IDA7CiAKKyAgICBzdGF0dXNfdCBlcnIgPSBOQU1FX05PVF9GT1VORDsKICAgICBmb3IgKHNpemVfdCBtYXRjaEluZGV4ID0gMDsgbWF0Y2hJbmRleCA8IG1hdGNoaW5nQ29kZWNzLnNpemUoKTsKICAgICAgICAgICAgICsrbWF0Y2hJbmRleCkgewogICAgICAgICBjb21wb25lbnROYW1lID0gbWF0Y2hpbmdDb2RlY3MuaXRlbUF0KG1hdGNoSW5kZXgpLm1OYW1lLnN0cmluZygpOwpAQCAtNDg5OSw3ICs1NTIzLDcgQEAKICAgICAgICAgcGlkX3QgdGlkID0gZ2V0dGlkKCk7CiAgICAgICAgIGludCBwcmV2UHJpb3JpdHkgPSBhbmRyb2lkR2V0VGhyZWFkUHJpb3JpdHkodGlkKTsKICAgICAgICAgYW5kcm9pZFNldFRocmVhZFByaW9yaXR5KHRpZCwgQU5EUk9JRF9QUklPUklUWV9GT1JFR1JPVU5EKTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gb214LT5hbGxvY2F0ZU5vZGUoY29tcG9uZW50TmFtZS5jX3N0cigpLCBvYnNlcnZlciwgJm5vZGUpOworICAgICAgICBlcnIgPSBvbXgtPmFsbG9jYXRlTm9kZShjb21wb25lbnROYW1lLmNfc3RyKCksIG9ic2VydmVyLCAmbm9kZSk7CiAgICAgICAgIGFuZHJvaWRTZXRUaHJlYWRQcmlvcml0eSh0aWQsIHByZXZQcmlvcml0eSk7CiAKICAgICAgICAgaWYgKGVyciA9PSBPSykgewpAQCAtNDkwOCwyNSArNTUzMiwyNiBAQAogICAgICAgICAgICAgQUxPR1coIkFsbG9jYXRpbmcgY29tcG9uZW50ICclcycgZmFpbGVkLCB0cnkgbmV4dCBvbmUuIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKICAgICAgICAgfQogCi0gICAgICAgIG5vZGUgPSBOVUxMOworICAgICAgICBub2RlID0gMDsKICAgICB9CiAKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgaWYgKG5vZGUgPT0gMCkgewogICAgICAgICBpZiAoIW1pbWUuZW1wdHkoKSkgewotICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBhICVzY29kZXIgZm9yIHR5cGUgJyVzJy4iLAotICAgICAgICAgICAgICAgICAgICBlbmNvZGVyID8gImVuIiA6ICJkZSIsIG1pbWUuY19zdHIoKSk7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGEgJXNjb2RlciBmb3IgdHlwZSAnJXMnIHdpdGggZXJyICUjeC4iLAorICAgICAgICAgICAgICAgICAgICBlbmNvZGVyID8gImVuIiA6ICJkZSIsIG1pbWUuY19zdHIoKSwgZXJyKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5zdGFudGlhdGUgY29kZWMgJyVzJy4iLCBjb21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBjb2RlYyAnJXMnIHdpdGggZXJyICUjeC4iLCBjb21wb25lbnROYW1lLmNfc3RyKCksIGVycik7CiAgICAgICAgIH0KIAotICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvckNvbXBvbmVudE5vdEZvdW5kKTsKKyAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcigoT01YX0VSUk9SVFlQRSllcnIsIG1ha2VOb1NpZGVFZmZlY3RTdGF0dXMoZXJyKSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPTVhNZXNzYWdlLCBtQ29kZWMtPmlkKCkpOworICAgIG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE9NWE1lc3NhZ2VMaXN0LCBtQ29kZWMpOwogICAgIG9ic2VydmVyLT5zZXROb3RpZmljYXRpb25NZXNzYWdlKG5vdGlmeSk7CiAKICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKKyAgICBtQ29kZWMtPm1SZW5kZXJUcmFja2VyLnNldENvbXBvbmVudE5hbWUoY29tcG9uZW50TmFtZSk7CiAgICAgbUNvZGVjLT5tRmxhZ3MgPSAwOwogCiAgICAgaWYgKGNvbXBvbmVudE5hbWUuZW5kc1dpdGgoIi5zZWN1cmUiKSkgewpAQCAtNDk2Niw3ICs1NTkxLDcgQEAKICAgICBtQ29kZWMtPm1JbnB1dEVPU1Jlc3VsdCA9IE9LOwogCiAgICAgbUNvZGVjLT5tRGVxdWV1ZUNvdW50ZXIgPSAwOwotICAgIG1Db2RlYy0+bU1ldGFEYXRhQnVmZmVyc1RvU3VibWl0ID0gMDsKKyAgICBtQ29kZWMtPm1NZXRhZGF0YUJ1ZmZlcnNUb1N1Ym1pdCA9IDA7CiAgICAgbUNvZGVjLT5tUmVwZWF0RnJhbWVEZWxheVVzID0gLTFsbDsKICAgICBtQ29kZWMtPm1JbnB1dEZvcm1hdC5jbGVhcigpOwogICAgIG1Db2RlYy0+bU91dHB1dEZvcm1hdC5jbGVhcigpOwpAQCAtNDk4Nyw3ICs1NjEyLDcgQEAKIAogdm9pZCBBQ29kZWM6OkxvYWRlZFN0YXRlOjpvblNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCkgewogICAgIGlmICgha2VlcENvbXBvbmVudEFsbG9jYXRlZCkgewotICAgICAgICBDSEVDS19FUShtQ29kZWMtPm1PTVgtPmZyZWVOb2RlKG1Db2RlYy0+bU5vZGUpLCAoc3RhdHVzX3QpT0spOworICAgICAgICAodm9pZCltQ29kZWMtPm1PTVgtPmZyZWVOb2RlKG1Db2RlYy0+bU5vZGUpOwogCiAgICAgICAgIG1Db2RlYy0+Y2hhbmdlU3RhdGUobUNvZGVjLT5tVW5pbml0aWFsaXplZFN0YXRlKTsKICAgICB9CkBAIC01MDE4LDYgKzU2NDMsMTMgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBBQ29kZWM6OmtXaGF0U2V0SW5wdXRTdXJmYWNlOgorICAgICAgICB7CisgICAgICAgICAgICBvblNldElucHV0U3VyZmFjZShtc2cpOworICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgQUNvZGVjOjprV2hhdFN0YXJ0OgogICAgICAgICB7CiAgICAgICAgICAgICBvblN0YXJ0KCk7CkBAIC01MDU5LDEzICs1NjkxLDE1IEBACiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgQUxPR1YoIm9uQ29uZmlndXJlQ29tcG9uZW50Iik7CiAKLSAgICBDSEVDSyhtQ29kZWMtPm1Ob2RlICE9IE5VTEwpOworICAgIENIRUNLKG1Db2RlYy0+bU5vZGUgIT0gMCk7CiAKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICBBU3RyaW5nIG1pbWU7Ci0gICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKLQotICAgIHN0YXR1c190IGVyciA9IG1Db2RlYy0+Y29uZmlndXJlQ29kZWMobWltZS5jX3N0cigpLCBtc2cpOwotCisgICAgaWYgKCFtc2ctPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpIHsKKyAgICAgICAgZXJyID0gQkFEX1ZBTFVFOworICAgIH0gZWxzZSB7CisgICAgICAgIGVyciA9IG1Db2RlYy0+Y29uZmlndXJlQ29kZWMobWltZS5jX3N0cigpLCBtc2cpOworICAgIH0KICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJbJXNdIGNvbmZpZ3VyZUNvZGVjIHJldHVybmluZyBlcnJvciAlZCIsCiAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKQEAgLTUwODUsMjAgKzU3MTksMTAgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBBQ29kZWM6OkxvYWRlZFN0YXRlOjpvbkNyZWF0ZUlucHV0U3VyZmFjZSgKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICYgLyogbXNnICovKSB7Ci0gICAgQUxPR1YoIm9uQ3JlYXRlSW5wdXRTdXJmYWNlIik7CitzdGF0dXNfdCBBQ29kZWM6OkxvYWRlZFN0YXRlOjpzZXR1cElucHV0U3VyZmFjZSgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKIAotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtQ29kZWMtPm1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0SW5wdXRTdXJmYWNlQ3JlYXRlZCk7Ci0KLSAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBidWZmZXJQcm9kdWNlcjsKLSAgICBzdGF0dXNfdCBlcnI7Ci0KLSAgICBlcnIgPSBtQ29kZWMtPm1PTVgtPmNyZWF0ZUlucHV0U3VyZmFjZShtQ29kZWMtPm1Ob2RlLCBrUG9ydEluZGV4SW5wdXQsCi0gICAgICAgICAgICAmYnVmZmVyUHJvZHVjZXIpOwotCi0gICAgaWYgKGVyciA9PSBPSyAmJiBtQ29kZWMtPm1SZXBlYXRGcmFtZURlbGF5VXMgPiAwbGwpIHsKKyAgICBpZiAobUNvZGVjLT5tUmVwZWF0RnJhbWVEZWxheVVzID4gMGxsKSB7CiAgICAgICAgIGVyciA9IG1Db2RlYy0+bU9NWC0+c2V0SW50ZXJuYWxPcHRpb24oCiAgICAgICAgICAgICAgICAgbUNvZGVjLT5tTm9kZSwKICAgICAgICAgICAgICAgICBrUG9ydEluZGV4SW5wdXQsCkBAIC01MTExLDEwICs1NzM1LDExIEBACiAgICAgICAgICAgICAgICAgICAiZnJhbWVzIChlcnIgJWQpIiwKICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGVyciA9PSBPSyAmJiBtQ29kZWMtPm1NYXhQdHNHYXBVcyA+IDBsbCkgeworICAgIGlmIChtQ29kZWMtPm1NYXhQdHNHYXBVcyA+IDBsbCkgewogICAgICAgICBlcnIgPSBtQ29kZWMtPm1PTVgtPnNldEludGVybmFsT3B0aW9uKAogICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsCiAgICAgICAgICAgICAgICAga1BvcnRJbmRleElucHV0LApAQCAtNTEyNiwxMCArNTc1MSwyNyBAQAogICAgICAgICAgICAgQUxPR0UoIlslc10gVW5hYmxlIHRvIGNvbmZpZ3VyZSBtYXggdGltZXN0YW1wIGdhcCAoZXJyICVkKSIsCiAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoZXJyID09IE9LICYmIG1Db2RlYy0+bVRpbWVQZXJDYXB0dXJlVXMgPiAwbGwKKyAgICBpZiAobUNvZGVjLT5tTWF4RnBzID4gMCkgeworICAgICAgICBlcnIgPSBtQ29kZWMtPm1PTVgtPnNldEludGVybmFsT3B0aW9uKAorICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsCisgICAgICAgICAgICAgICAga1BvcnRJbmRleElucHV0LAorICAgICAgICAgICAgICAgIElPTVg6OklOVEVSTkFMX09QVElPTl9NQVhfRlBTLAorICAgICAgICAgICAgICAgICZtQ29kZWMtPm1NYXhGcHMsCisgICAgICAgICAgICAgICAgc2l6ZW9mKG1Db2RlYy0+bU1heEZwcykpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJbJXNdIFVuYWJsZSB0byBjb25maWd1cmUgbWF4IGZwcyAoZXJyICVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUNvZGVjLT5tVGltZVBlckNhcHR1cmVVcyA+IDBsbAogICAgICAgICAgICAgJiYgbUNvZGVjLT5tVGltZVBlckZyYW1lVXMgPiAwbGwpIHsKICAgICAgICAgaW50NjRfdCB0aW1lTGFwc2VbMl07CiAgICAgICAgIHRpbWVMYXBzZVswXSA9IG1Db2RlYy0+bVRpbWVQZXJGcmFtZVVzOwpAQCAtNTE0NSwxMCArNTc4NywxMSBAQAogICAgICAgICAgICAgQUxPR0UoIlslc10gVW5hYmxlIHRvIGNvbmZpZ3VyZSB0aW1lIGxhcHNlIChlcnIgJWQpIiwKICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChlcnIgPT0gT0sgJiYgbUNvZGVjLT5tQ3JlYXRlSW5wdXRCdWZmZXJzU3VzcGVuZGVkKSB7CisgICAgaWYgKG1Db2RlYy0+bUNyZWF0ZUlucHV0QnVmZmVyc1N1c3BlbmRlZCkgewogICAgICAgICBib29sIHN1c3BlbmQgPSB0cnVlOwogICAgICAgICBlcnIgPSBtQ29kZWMtPm1PTVgtPnNldEludGVybmFsT3B0aW9uKAogICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsCkBAIC01MTYxLDkgKzU4MDQsMzYgQEAKICAgICAgICAgICAgIEFMT0dFKCJbJXNdIFVuYWJsZSB0byBjb25maWd1cmUgb3B0aW9uIHRvIHN1c3BlbmQgKGVyciAlZCkiLAogICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICB1aW50MzJfdCB1c2FnZUJpdHM7CisgICAgaWYgKG1Db2RlYy0+bU9NWC0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgbUNvZGVjLT5tTm9kZSwgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0cywKKyAgICAgICAgICAgICZ1c2FnZUJpdHMsIHNpemVvZih1c2FnZUJpdHMpKSA9PSBPSykgeworICAgICAgICBtQ29kZWMtPm1JbnB1dEZvcm1hdC0+c2V0SW50MzIoCisgICAgICAgICAgICAgICAgInVzaW5nLXN3LXJlYWQtb2Z0ZW4iLCAhISh1c2FnZUJpdHMgJiBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4pKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQUNvZGVjOjpMb2FkZWRTdGF0ZTo6b25DcmVhdGVJbnB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmIC8qIG1zZyAqLykgeworICAgIEFMT0dWKCJvbkNyZWF0ZUlucHV0U3VyZmFjZSIpOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRJbnB1dFN1cmZhY2VDcmVhdGVkKTsKKworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGJ1ZmZlclByb2R1Y2VyOworICAgIHN0YXR1c190IGVyciA9IG1Db2RlYy0+bU9NWC0+Y3JlYXRlSW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgbUNvZGVjLT5tTm9kZSwga1BvcnRJbmRleElucHV0LCAmYnVmZmVyUHJvZHVjZXIsICZtQ29kZWMtPm1JbnB1dE1ldGFkYXRhVHlwZSk7CisKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIGVyciA9IHNldHVwSW5wdXRTdXJmYWNlKCk7CisgICAgfQorCiAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICBub3RpZnktPnNldE9iamVjdCgiaW5wdXQtc3VyZmFjZSIsCiAgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlclByb2R1Y2VyV3JhcHBlcihidWZmZXJQcm9kdWNlcikpOwpAQCAtNTE3OCwxNCArNTg0OCw0NSBAQAogICAgIG5vdGlmeS0+cG9zdCgpOwogfQogCit2b2lkIEFDb2RlYzo6TG9hZGVkU3RhdGU6Om9uU2V0SW5wdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIEFMT0dWKCJvblNldElucHV0U3VyZmFjZSIpOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Db2RlYy0+bU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRJbnB1dFN1cmZhY2VBY2NlcHRlZCk7CisKKyAgICBzcDxSZWZCYXNlPiBvYmo7CisgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJpbnB1dC1zdXJmYWNlIiwgJm9iaikpOworICAgIHNwPFBlcnNpc3RlbnRTdXJmYWNlPiBzdXJmYWNlID0gc3RhdGljX2Nhc3Q8UGVyc2lzdGVudFN1cmZhY2UgKj4ob2JqLmdldCgpKTsKKworICAgIHN0YXR1c190IGVyciA9IG1Db2RlYy0+bU9NWC0+c2V0SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgbUNvZGVjLT5tTm9kZSwga1BvcnRJbmRleElucHV0LCBzdXJmYWNlLT5nZXRCdWZmZXJDb25zdW1lcigpLAorICAgICAgICAgICAgJm1Db2RlYy0+bUlucHV0TWV0YWRhdGFUeXBlKTsKKworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgZXJyID0gc2V0dXBJbnB1dFN1cmZhY2UoKTsKKyAgICB9CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIC8vIENhbid0IHVzZSBtQ29kZWMtPnNpZ25hbEVycm9yKCkgaGVyZSAtLSBNZWRpYUNvZGVjIHdvbid0IGZvcndhcmQKKyAgICAgICAgLy8gdGhlIGVycm9yIHRocm91Z2ggYmVjYXVzZSBpdCdzIGluIHRoZSAiY29uZmlndXJlZCIgc3RhdGUuICBXZQorICAgICAgICAvLyBzZW5kIGEga1doYXRJbnB1dFN1cmZhY2VBY2NlcHRlZCB3aXRoIGFuIGVycm9yIHZhbHVlIGluc3RlYWQuCisgICAgICAgIEFMT0dFKCJbJXNdIG9uU2V0SW5wdXRTdXJmYWNlIHJldHVybmluZyBlcnJvciAlZCIsCisgICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOworICAgICAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBlcnIpOworICAgIH0KKyAgICBub3RpZnktPnBvc3QoKTsKK30KKwogdm9pZCBBQ29kZWM6OkxvYWRlZFN0YXRlOjpvblN0YXJ0KCkgewogICAgIEFMT0dWKCJvblN0YXJ0Iik7CiAKLSAgICBDSEVDS19FUShtQ29kZWMtPm1PTVgtPnNlbmRDb21tYW5kKAotICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsIE9NWF9Db21tYW5kU3RhdGVTZXQsIE9NWF9TdGF0ZUlkbGUpLAotICAgICAgICAgICAgIChzdGF0dXNfdClPSyk7Ci0KLSAgICBtQ29kZWMtPmNoYW5nZVN0YXRlKG1Db2RlYy0+bUxvYWRlZFRvSWRsZVN0YXRlKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ29kZWMtPm1PTVgtPnNlbmRDb21tYW5kKG1Db2RlYy0+bU5vZGUsIE9NWF9Db21tYW5kU3RhdGVTZXQsIE9NWF9TdGF0ZUlkbGUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIG1ha2VOb1NpZGVFZmZlY3RTdGF0dXMoZXJyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNvZGVjLT5jaGFuZ2VTdGF0ZShtQ29kZWMtPm1Mb2FkZWRUb0lkbGVTdGF0ZSk7CisgICAgfQogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNTI1OSwxNCArNTk2MCwyNSBAQAogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICAgICAgY2FzZSBPTVhfRXZlbnRDbWRDb21wbGV0ZToKICAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0tfRVEoZGF0YTEsIChPTVhfVTMyKU9NWF9Db21tYW5kU3RhdGVTZXQpOwotICAgICAgICAgICAgQ0hFQ0tfRVEoZGF0YTIsIChPTVhfVTMyKU9NWF9TdGF0ZUlkbGUpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgICAgICBpZiAoZGF0YTEgIT0gKE9NWF9VMzIpT01YX0NvbW1hbmRTdGF0ZVNldAorICAgICAgICAgICAgICAgICAgICB8fCBkYXRhMiAhPSAoT01YX1UzMilPTVhfU3RhdGVJZGxlKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlVuZXhwZWN0ZWQgY29tbWFuZCBjb21wbGV0aW9uIGluIExvYWRlZFRvSWRsZVN0YXRlOiAlcygldSkgJXMoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKChPTVhfQ09NTUFORFRZUEUpZGF0YTEpLCBkYXRhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKChPTVhfU1RBVEVUWVBFKWRhdGEyKSwgZGF0YTIpOworICAgICAgICAgICAgICAgIGVyciA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQ0hFQ0tfRVEobUNvZGVjLT5tT01YLT5zZW5kQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsIE9NWF9Db21tYW5kU3RhdGVTZXQsIE9NWF9TdGF0ZUV4ZWN1dGluZyksCi0gICAgICAgICAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIGVyciA9IG1Db2RlYy0+bU9NWC0+c2VuZENvbW1hbmQoCisgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsIE9NWF9Db21tYW5kU3RhdGVTZXQsIE9NWF9TdGF0ZUV4ZWN1dGluZyk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1Db2RlYy0+Y2hhbmdlU3RhdGUobUNvZGVjLT5tSWRsZVRvRXhlY3V0aW5nU3RhdGUpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsRXJyb3IoT01YX0Vycm9yVW5kZWZpbmVkLCBtYWtlTm9TaWRlRWZmZWN0U3RhdHVzKGVycikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQ29kZWMtPmNoYW5nZVN0YXRlKG1Db2RlYy0+bUlkbGVUb0V4ZWN1dGluZ1N0YXRlKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KQEAgLTUzMjcsOCArNjAzOSwxNCBAQAogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICAgICAgY2FzZSBPTVhfRXZlbnRDbWRDb21wbGV0ZToKICAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0tfRVEoZGF0YTEsIChPTVhfVTMyKU9NWF9Db21tYW5kU3RhdGVTZXQpOwotICAgICAgICAgICAgQ0hFQ0tfRVEoZGF0YTIsIChPTVhfVTMyKU9NWF9TdGF0ZUV4ZWN1dGluZyk7CisgICAgICAgICAgICBpZiAoZGF0YTEgIT0gKE9NWF9VMzIpT01YX0NvbW1hbmRTdGF0ZVNldAorICAgICAgICAgICAgICAgICAgICB8fCBkYXRhMiAhPSAoT01YX1UzMilPTVhfU3RhdGVFeGVjdXRpbmcpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiVW5leHBlY3RlZCBjb21tYW5kIGNvbXBsZXRpb24gaW4gSWRsZVRvRXhlY3V0aW5nU3RhdGU6ICVzKCV1KSAlcygldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoKE9NWF9DT01NQU5EVFlQRSlkYXRhMSksIGRhdGExLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoKE9NWF9TVEFURVRZUEUpZGF0YTIpLCBkYXRhMik7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIEZBSUxFRF9UUkFOU0FDVElPTik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1Db2RlYy0+bUV4ZWN1dGluZ1N0YXRlLT5yZXN1bWUoKTsKICAgICAgICAgICAgIG1Db2RlYy0+Y2hhbmdlU3RhdGUobUNvZGVjLT5tRXhlY3V0aW5nU3RhdGUpOwpAQCAtNTM2MCw1OSArNjA3OCw3NyBAQAogICAgICAgICBCdWZmZXJJbmZvICppbmZvID0gJm1Db2RlYy0+bUJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5lZGl0SXRlbUF0KGkpOwogCiAgICAgICAgIGlmIChpbmZvLT5tU3RhdHVzID09IEJ1ZmZlckluZm86Ok9XTkVEX0JZX0NPTVBPTkVOVCkgewotICAgICAgICAgICAgaWYgKG1Db2RlYy0+c3VibWl0T3V0cHV0TWV0YURhdGFCdWZmZXIoKSAhPSBPSykKKyAgICAgICAgICAgIGlmIChtQ29kZWMtPnN1Ym1pdE91dHB1dE1ldGFkYXRhQnVmZmVyKCkgIT0gT0spCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvLyAqKiogTk9URTogVEhFIEZPTExPV0lORyBXT1JLQVJPVU5EIFdJTEwgQkUgUkVNT1ZFRCAqKioKLSAgICBtQ29kZWMtPnNpZ25hbFN1Ym1pdE91dHB1dE1ldGFEYXRhQnVmZmVySWZFT1Nfd29ya2Fyb3VuZCgpOworICAgIG1Db2RlYy0+c2lnbmFsU3VibWl0T3V0cHV0TWV0YWRhdGFCdWZmZXJJZkVPU193b3JrYXJvdW5kKCk7CiB9CiAKIHZvaWQgQUNvZGVjOjpFeGVjdXRpbmdTdGF0ZTo6c3VibWl0UmVndWxhck91dHB1dEJ1ZmZlcnMoKSB7CisgICAgYm9vbCBmYWlsZWQgPSBmYWxzZTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2RlYy0+bUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uc2l6ZSgpOyArK2kpIHsKICAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICZtQ29kZWMtPm1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLmVkaXRJdGVtQXQoaSk7CiAKICAgICAgICAgaWYgKG1Db2RlYy0+bU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBDSEVDSyhpbmZvLT5tU3RhdHVzID09IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTCi0gICAgICAgICAgICAgICAgICAgIHx8IGluZm8tPm1TdGF0dXMgPT0gQnVmZmVySW5mbzo6T1dORURfQllfTkFUSVZFX1dJTkRPVyk7CisgICAgICAgICAgICBpZiAoaW5mby0+bVN0YXR1cyAhPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUworICAgICAgICAgICAgICAgICAgICAmJiBpbmZvLT5tU3RhdHVzICE9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX05BVElWRV9XSU5ET1cpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYnVmZmVycyBzaG91bGQgYmUgb3duZWQgYnkgdXMgb3IgdGhlIHN1cmZhY2UiKTsKKyAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoaW5mby0+bVN0YXR1cyA9PSBCdWZmZXJJbmZvOjpPV05FRF9CWV9OQVRJVkVfV0lORE9XKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDSEVDS19FUSgoaW50KWluZm8tPm1TdGF0dXMsIChpbnQpQnVmZmVySW5mbzo6T1dORURfQllfVVMpOworICAgICAgICAgICAgaWYgKGluZm8tPm1TdGF0dXMgIT0gQnVmZmVySW5mbzo6T1dORURfQllfVVMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYnVmZmVycyBzaG91bGQgYmUgb3duZWQgYnkgdXMiKTsKKyAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgQUxPR1YoIlslc10gY2FsbGluZyBmaWxsQnVmZmVyICVwIiwKLSAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCksIGluZm8tPm1CdWZmZXJJRCk7CisgICAgICAgIEFMT0dWKCJbJXNdIGNhbGxpbmcgZmlsbEJ1ZmZlciAldSIsIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSwgaW5mby0+bUJ1ZmZlcklEKTsKIAotICAgICAgICBDSEVDS19FUShtQ29kZWMtPm1PTVgtPmZpbGxCdWZmZXIobUNvZGVjLT5tTm9kZSwgaW5mby0+bUJ1ZmZlcklEKSwKLSAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKKyAgICAgICAgaW5mby0+Y2hlY2tXcml0ZUZlbmNlKCJzdWJtaXRSZWd1bGFyT3V0cHV0QnVmZmVycyIpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29kZWMtPm1PTVgtPmZpbGxCdWZmZXIobUNvZGVjLT5tTm9kZSwgaW5mby0+bUJ1ZmZlcklELCBpbmZvLT5tRmVuY2VGZCk7CisgICAgICAgIGluZm8tPm1GZW5jZUZkID0gLTE7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCiAgICAgICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9DT01QT05FTlQ7CiAgICAgfQorCisgICAgaWYgKGZhaWxlZCkgeworICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgRkFJTEVEX1RSQU5TQUNUSU9OKTsKKyAgICB9CiB9CiAKIHZvaWQgQUNvZGVjOjpFeGVjdXRpbmdTdGF0ZTo6c3VibWl0T3V0cHV0QnVmZmVycygpIHsKICAgICBzdWJtaXRSZWd1bGFyT3V0cHV0QnVmZmVycygpOwotICAgIGlmIChtQ29kZWMtPm1TdG9yZU1ldGFEYXRhSW5PdXRwdXRCdWZmZXJzKSB7CisgICAgaWYgKG1Db2RlYy0+c3RvcmluZ01ldGFkYXRhSW5EZWNvZGVkQnVmZmVycygpKSB7CiAgICAgICAgIHN1Ym1pdE91dHB1dE1ldGFCdWZmZXJzKCk7CiAgICAgfQogfQogCiB2b2lkIEFDb2RlYzo6RXhlY3V0aW5nU3RhdGU6OnJlc3VtZSgpIHsKICAgICBpZiAobUFjdGl2ZSkgewotICAgICAgICBBTE9HVigiWyVzXSBXZSdyZSBhbHJlYWR5IGFjdGl2ZSwgbm8gbmVlZCB0byByZXN1bWUuIiwKLSAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOwotCisgICAgICAgIEFMT0dWKCJbJXNdIFdlJ3JlIGFscmVhZHkgYWN0aXZlLCBubyBuZWVkIHRvIHJlc3VtZS4iLCBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgc3VibWl0T3V0cHV0QnVmZmVycygpOwogCiAgICAgLy8gUG9zdCBhbGwgYXZhaWxhYmxlIGlucHV0IGJ1ZmZlcnMKLSAgICBDSEVDS19HVChtQ29kZWMtPm1CdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uc2l6ZSgpLCAwdSk7CisgICAgaWYgKG1Db2RlYy0+bUJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5zaXplKCkgPT0gMHUpIHsKKyAgICAgICAgQUxPR1coIlslc10gd2UgZG9uJ3QgaGF2ZSBhbnkgaW5wdXQgYnVmZmVycyB0byByZXN1bWUiLCBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgIH0KKwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvZGVjLT5tQnVmZmVyc1trUG9ydEluZGV4SW5wdXRdLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmbUNvZGVjLT5tQnVmZmVyc1trUG9ydEluZGV4SW5wdXRdLmVkaXRJdGVtQXQoaSk7CiAgICAgICAgIGlmIChpbmZvLT5tU3RhdHVzID09IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTKSB7CkBAIC01NDI2LDYgKzYxNjIsNyBAQAogdm9pZCBBQ29kZWM6OkV4ZWN1dGluZ1N0YXRlOjpzdGF0ZUVudGVyZWQoKSB7CiAgICAgQUxPR1YoIlslc10gTm93IEV4ZWN1dGluZyIsIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAKKyAgICBtQ29kZWMtPm1SZW5kZXJUcmFja2VyLmNsZWFyKHN5c3RlbVRpbWUoQ0xPQ0tfTU9OT1RPTklDKSk7CiAgICAgbUNvZGVjLT5wcm9jZXNzRGVmZXJyZWRNZXNzYWdlcygpOwogfQogCkBAIC01NDQ1LDExICs2MTgyLDE2IEBACiAKICAgICAgICAgICAgIG1BY3RpdmUgPSBmYWxzZTsKIAotICAgICAgICAgICAgQ0hFQ0tfRVEobUNvZGVjLT5tT01YLT5zZW5kQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsIE9NWF9Db21tYW5kU3RhdGVTZXQsIE9NWF9TdGF0ZUlkbGUpLAotICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKLQotICAgICAgICAgICAgbUNvZGVjLT5jaGFuZ2VTdGF0ZShtQ29kZWMtPm1FeGVjdXRpbmdUb0lkbGVTdGF0ZSk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29kZWMtPm1PTVgtPnNlbmRDb21tYW5kKAorICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Ob2RlLCBPTVhfQ29tbWFuZFN0YXRlU2V0LCBPTVhfU3RhdGVJZGxlKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBpZiAoa2VlcENvbXBvbmVudEFsbG9jYXRlZCkgeworICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgRkFJTEVEX1RSQU5TQUNUSU9OKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gVE9ETzogZG8gc29tZSByZWNvdmVyeSBoZXJlLgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtQ29kZWMtPmNoYW5nZVN0YXRlKG1Db2RlYy0+bUV4ZWN1dGluZ1RvSWRsZVN0YXRlKTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKQEAgLTU0NTgsNyArNjIwMCw3IEBACiAgICAgICAgIGNhc2Uga1doYXRGbHVzaDoKICAgICAgICAgewogICAgICAgICAgICAgQUxPR1YoIlslc10gRXhlY3V0aW5nU3RhdGUgZmx1c2hpbmcgbm93ICIKLSAgICAgICAgICAgICAgICAgIihjb2RlYyBvd25zICVkLyVkIGlucHV0LCAlZC8lZCBvdXRwdXQpLiIsCisgICAgICAgICAgICAgICAgICIoY29kZWMgb3ducyAlenUvJXp1IGlucHV0LCAlenUvJXp1IG91dHB1dCkuIiwKICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPmNvdW50QnVmZmVyc093bmVkQnlDb21wb25lbnQoa1BvcnRJbmRleElucHV0KSwKICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQnVmZmVyc1trUG9ydEluZGV4SW5wdXRdLnNpemUoKSwKQEAgLTU0NjcsMTEgKzYyMDksMTMgQEAKIAogICAgICAgICAgICAgbUFjdGl2ZSA9IGZhbHNlOwogCi0gICAgICAgICAgICBDSEVDS19FUShtQ29kZWMtPm1PTVgtPnNlbmRDb21tYW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tTm9kZSwgT01YX0NvbW1hbmRGbHVzaCwgT01YX0FMTCksCi0gICAgICAgICAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvZGVjLT5tT01YLT5zZW5kQ29tbWFuZChtQ29kZWMtPm1Ob2RlLCBPTVhfQ29tbWFuZEZsdXNoLCBPTVhfQUxMKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgRkFJTEVEX1RSQU5TQUNUSU9OKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5jaGFuZ2VTdGF0ZShtQ29kZWMtPm1GbHVzaGluZ1N0YXRlKTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbUNvZGVjLT5jaGFuZ2VTdGF0ZShtQ29kZWMtPm1GbHVzaGluZ1N0YXRlKTsKICAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTU1MjAsMTMgKzYyNjQsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vICoqKiBOT1RFOiBUSEUgRk9MTE9XSU5HIFdPUktBUk9VTkQgV0lMTCBCRSBSRU1PVkVEICoqKgotICAgICAgICBjYXNlIGtXaGF0U3VibWl0T3V0cHV0TWV0YURhdGFCdWZmZXJJZkVPUzoKKyAgICAgICAgY2FzZSBrV2hhdFN1Ym1pdE91dHB1dE1ldGFkYXRhQnVmZmVySWZFT1M6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChtQ29kZWMtPm1Qb3J0RU9TW2tQb3J0SW5kZXhJbnB1dF0gJiYKICAgICAgICAgICAgICAgICAgICAgIW1Db2RlYy0+bVBvcnRFT1Nba1BvcnRJbmRleE91dHB1dF0pIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29kZWMtPnN1Ym1pdE91dHB1dE1ldGFEYXRhQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvZGVjLT5zdWJtaXRPdXRwdXRNZXRhZGF0YUJ1ZmZlcigpOwogICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxTdWJtaXRPdXRwdXRNZXRhRGF0YUJ1ZmZlcklmRU9TX3dvcmthcm91bmQoKTsKKyAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxTdWJtaXRPdXRwdXRNZXRhZGF0YUJ1ZmZlcklmRU9TX3dvcmthcm91bmQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTU2MDYsNiArNjM1MCwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgZmxvYXQgcmF0ZTsKKyAgICBpZiAocGFyYW1zLT5maW5kRmxvYXQoIm9wZXJhdGluZy1yYXRlIiwgJnJhdGUpICYmIHJhdGUgPiAwKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IHNldE9wZXJhdGluZ1JhdGUocmF0ZSwgbUlzVmlkZW8pOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBwYXJhbWV0ZXIgJ29wZXJhdGluZy1yYXRlJyAoZXJyICVkKSIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC01NjIwLDYgKzYzNzMsMTEgQEAKICAgICBub3RpZnktPnBvc3QoKTsKIH0KIAorYm9vbCBBQ29kZWM6OkV4ZWN1dGluZ1N0YXRlOjpvbk9NWEZyYW1lUmVuZGVyZWQoaW50NjRfdCBtZWRpYVRpbWVVcywgbnNlY3NfdCBzeXN0ZW1OYW5vKSB7CisgICAgbUNvZGVjLT5vbkZyYW1lUmVuZGVyZWQobWVkaWFUaW1lVXMsIHN5c3RlbU5hbm8pOworICAgIHJldHVybiB0cnVlOworfQorCiBib29sIEFDb2RlYzo6RXhlY3V0aW5nU3RhdGU6Om9uT01YRXZlbnQoCiAgICAgICAgIE9NWF9FVkVOVFRZUEUgZXZlbnQsIE9NWF9VMzIgZGF0YTEsIE9NWF9VMzIgZGF0YTIpIHsKICAgICBzd2l0Y2ggKGV2ZW50KSB7CkBAIC01NjI4LDcgKzYzODYsNyBAQAogICAgICAgICAgICAgQ0hFQ0tfRVEoZGF0YTEsIChPTVhfVTMyKWtQb3J0SW5kZXhPdXRwdXQpOwogCiAgICAgICAgICAgICBpZiAoZGF0YTIgPT0gMCB8fCBkYXRhMiA9PSBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uKSB7Ci0gICAgICAgICAgICAgICAgbUNvZGVjLT5tTWV0YURhdGFCdWZmZXJzVG9TdWJtaXQgPSAwOworICAgICAgICAgICAgICAgIG1Db2RlYy0+bU1ldGFkYXRhQnVmZmVyc1RvU3VibWl0ID0gMDsKICAgICAgICAgICAgICAgICBDSEVDS19FUShtQ29kZWMtPm1PTVgtPnNlbmRDb21tYW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bU5vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0NvbW1hbmRQb3J0RGlzYWJsZSwga1BvcnRJbmRleE91dHB1dCksCkBAIC01NjM5LDggKzYzOTcsMTMgQEAKICAgICAgICAgICAgICAgICBtQ29kZWMtPmNoYW5nZVN0YXRlKG1Db2RlYy0+bU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZWRTdGF0ZSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEyID09IE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3ApIHsKICAgICAgICAgICAgICAgICBtQ29kZWMtPm1TZW50Rm9ybWF0ID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBpZiAobUNvZGVjLT5tVHVubmVsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGR1bW15ID0gbmV3IEFNZXNzYWdlKGtXaGF0T3V0cHV0QnVmZmVyRHJhaW5lZCwgbUNvZGVjKTsKKyAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5zZW5kRm9ybWF0Q2hhbmdlKGR1bW15KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQgMHglMDhseCIsCisgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCAweCUwOHgiLAogICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBkYXRhMik7CiAgICAgICAgICAgICB9CiAKQEAgLTU3MDcsMzEgKzY0NzAsNDYgQEAKICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiB9CiAKK2Jvb2wgQUNvZGVjOjpPdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2VkU3RhdGU6Om9uT01YRnJhbWVSZW5kZXJlZCgKKyAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVcywgbnNlY3NfdCBzeXN0ZW1OYW5vKSB7CisgICAgbUNvZGVjLT5vbkZyYW1lUmVuZGVyZWQobWVkaWFUaW1lVXMsIHN5c3RlbU5hbm8pOworICAgIHJldHVybiB0cnVlOworfQorCiBib29sIEFDb2RlYzo6T3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlZFN0YXRlOjpvbk9NWEV2ZW50KAogICAgICAgICBPTVhfRVZFTlRUWVBFIGV2ZW50LCBPTVhfVTMyIGRhdGExLCBPTVhfVTMyIGRhdGEyKSB7CiAgICAgc3dpdGNoIChldmVudCkgewogICAgICAgICBjYXNlIE9NWF9FdmVudENtZENvbXBsZXRlOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoZGF0YTEgPT0gKE9NWF9VMzIpT01YX0NvbW1hbmRQb3J0RGlzYWJsZSkgewotICAgICAgICAgICAgICAgIENIRUNLX0VRKGRhdGEyLCAoT01YX1UzMilrUG9ydEluZGV4T3V0cHV0KTsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YTIgIT0gKE9NWF9VMzIpa1BvcnRJbmRleE91dHB1dCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgRXZlbnRDbWRDb21wbGV0ZSBDb21tYW5kUG9ydERpc2FibGUgZm9yIHBvcnQgJXUiLCBkYXRhMik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBPdXRwdXQgcG9ydCBub3cgZGlzYWJsZWQuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gT3V0cHV0IHBvcnQgbm93IGRpc2FibGVkLiIsIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CiAKLSAgICAgICAgICAgICAgICBDSEVDSyhtQ29kZWMtPm1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLmlzRW1wdHkoKSk7Ci0gICAgICAgICAgICAgICAgbUNvZGVjLT5tRGVhbGVyW2tQb3J0SW5kZXhPdXRwdXRdLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgICAgICAgICAgaWYgKCFtQ29kZWMtPm1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZGlzYWJsZWQgcG9ydCBzaG91bGQgYmUgZW1wdHksIGJ1dCBoYXMgJXp1IGJ1ZmZlcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gRkFJTEVEX1RSQU5TQUNUSU9OOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+bURlYWxlcltrUG9ydEluZGV4T3V0cHV0XS5jbGVhcigpOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIENIRUNLX0VRKG1Db2RlYy0+bU9NWC0+c2VuZENvbW1hbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tTm9kZSwgT01YX0NvbW1hbmRQb3J0RW5hYmxlLCBrUG9ydEluZGV4T3V0cHV0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbUNvZGVjLT5tT01YLT5zZW5kQ29tbWFuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Ob2RlLCBPTVhfQ29tbWFuZFBvcnRFbmFibGUsIGtQb3J0SW5kZXhPdXRwdXQpOworICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgICAgICAgICBpZiAoKGVyciA9IG1Db2RlYy0+YWxsb2NhdGVCdWZmZXJzT25Qb3J0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUG9ydEluZGV4T3V0cHV0KSkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSBvdXRwdXQgcG9ydCBidWZmZXJzIGFmdGVyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCByZWNvbmZpZ3VyYXRpb24gKGVycm9yIDB4JTA4eCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtQ29kZWMtPmFsbG9jYXRlQnVmZmVyc09uUG9ydChrUG9ydEluZGV4T3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0VfSUYoZXJyICE9IE9LLCAiRmFpbGVkIHRvIGFsbG9jYXRlIG91dHB1dCBwb3J0IGJ1ZmZlcnMgYWZ0ZXIgcG9ydCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlY29uZmlndXJhdGlvbjogKCVkKSIsIGVycik7CisgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgbWFrZU5vU2lkZUVmZmVjdFN0YXR1cyhlcnIpKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IG5vdCBjb3JyZWN0LCBidXQgYXBwZWFycyB0byBiZQpAQCAtNTc0NiwxMiArNjUyNCwxOSBAQAogCiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGExID09IChPTVhfVTMyKU9NWF9Db21tYW5kUG9ydEVuYWJsZSkgewotICAgICAgICAgICAgICAgIENIRUNLX0VRKGRhdGEyLCAoT01YX1UzMilrUG9ydEluZGV4T3V0cHV0KTsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YTIgIT0gKE9NWF9VMzIpa1BvcnRJbmRleE91dHB1dCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgRXZlbnRDbWRDb21wbGV0ZSBPTVhfQ29tbWFuZFBvcnRFbmFibGUgZm9yIHBvcnQgJXUiLCBkYXRhMik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBtQ29kZWMtPm1TZW50Rm9ybWF0ID0gZmFsc2U7CiAKLSAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBPdXRwdXQgcG9ydCBub3cgcmVlbmFibGVkLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGlmIChtQ29kZWMtPm1UdW5uZWxlZCkgeworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZHVtbXkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPdXRwdXRCdWZmZXJEcmFpbmVkLCBtQ29kZWMpOworICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnNlbmRGb3JtYXRDaGFuZ2UoZHVtbXkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIE91dHB1dCBwb3J0IG5vdyByZWVuYWJsZWQuIiwgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKIAogICAgICAgICAgICAgICAgIGlmIChtQ29kZWMtPm1FeGVjdXRpbmdTdGF0ZS0+YWN0aXZlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgbUNvZGVjLT5tRXhlY3V0aW5nU3RhdGUtPnN1Ym1pdE91dHB1dEJ1ZmZlcnMoKTsKQEAgLTU3ODUsNyArNjU3MCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIERvbid0IHNlbmQgbWUgYSBmbHVzaCByZXF1ZXN0IGlmIHlvdSBwcmV2aW91c2x5IHdhbnRlZCBtZQogICAgICAgICAgICAgLy8gdG8gc2h1dGRvd24uCi0gICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgQUxPR1coIklnbm9yaW5nIGZsdXNoIHJlcXVlc3QgaW4gRXhlY3V0aW5nVG9JZGxlU3RhdGUiKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTU4MTcsOCArNjYwMiwxNCBAQAogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICAgICAgY2FzZSBPTVhfRXZlbnRDbWRDb21wbGV0ZToKICAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0tfRVEoZGF0YTEsIChPTVhfVTMyKU9NWF9Db21tYW5kU3RhdGVTZXQpOwotICAgICAgICAgICAgQ0hFQ0tfRVEoZGF0YTIsIChPTVhfVTMyKU9NWF9TdGF0ZUlkbGUpOworICAgICAgICAgICAgaWYgKGRhdGExICE9IChPTVhfVTMyKU9NWF9Db21tYW5kU3RhdGVTZXQKKyAgICAgICAgICAgICAgICAgICAgfHwgZGF0YTIgIT0gKE9NWF9VMzIpT01YX1N0YXRlSWRsZSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJVbmV4cGVjdGVkIGNvbW1hbmQgY29tcGxldGlvbiBpbiBFeGVjdXRpbmdUb0lkbGVTdGF0ZTogJXMoJXUpICVzKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZygoT01YX0NPTU1BTkRUWVBFKWRhdGExKSwgZGF0YTEsCisgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZygoT01YX1NUQVRFVFlQRSlkYXRhMiksIGRhdGEyKTsKKyAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgRkFJTEVEX1RSQU5TQUNUSU9OKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbUNvbXBvbmVudE5vd0lkbGUgPSB0cnVlOwogCkBAIC01ODQxLDEyICs2NjMyLDE1IEBACiAKIHZvaWQgQUNvZGVjOjpFeGVjdXRpbmdUb0lkbGVTdGF0ZTo6Y2hhbmdlU3RhdGVJZldlT3duQWxsQnVmZmVycygpIHsKICAgICBpZiAobUNvbXBvbmVudE5vd0lkbGUgJiYgbUNvZGVjLT5hbGxZb3VyQnVmZmVyc0FyZUJlbG9uZ1RvVXMoKSkgewotICAgICAgICBDSEVDS19FUShtQ29kZWMtPm1PTVgtPnNlbmRDb21tYW5kKAotICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1Ob2RlLCBPTVhfQ29tbWFuZFN0YXRlU2V0LCBPTVhfU3RhdGVMb2FkZWQpLAotICAgICAgICAgICAgICAgICAoc3RhdHVzX3QpT0spOwotCi0gICAgICAgIENIRUNLX0VRKG1Db2RlYy0+ZnJlZUJ1ZmZlcnNPblBvcnQoa1BvcnRJbmRleElucHV0KSwgKHN0YXR1c190KU9LKTsKLSAgICAgICAgQ0hFQ0tfRVEobUNvZGVjLT5mcmVlQnVmZmVyc09uUG9ydChrUG9ydEluZGV4T3V0cHV0KSwgKHN0YXR1c190KU9LKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNvZGVjLT5tT01YLT5zZW5kQ29tbWFuZCgKKyAgICAgICAgICAgICAgICBtQ29kZWMtPm1Ob2RlLCBPTVhfQ29tbWFuZFN0YXRlU2V0LCBPTVhfU3RhdGVMb2FkZWQpOworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICBlcnIgPSBtQ29kZWMtPmZyZWVCdWZmZXJzT25Qb3J0KGtQb3J0SW5kZXhJbnB1dCk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIyID0gbUNvZGVjLT5mcmVlQnVmZmVyc09uUG9ydChrUG9ydEluZGV4T3V0cHV0KTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBlcnIyOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgaWYgKChtQ29kZWMtPm1GbGFncyAmIGtGbGFnUHVzaEJsYW5rQnVmZmVyc1RvTmF0aXZlV2luZG93T25TaHV0ZG93bikKICAgICAgICAgICAgICAgICAmJiBtQ29kZWMtPm1OYXRpdmVXaW5kb3cgIT0gTlVMTCkgewpAQCAtNTg1NCw3ICs2NjQ4LDEyIEBACiAgICAgICAgICAgICAvLyB0aGVtIGhhcyBtYWRlIGl0IHRvIHRoZSBkaXNwbGF5LiAgVGhpcyBhbGxvd3MgdGhlIE9NWAogICAgICAgICAgICAgLy8gY29tcG9uZW50IHRlYXJkb3duIHRvIHplcm8gb3V0IGFueSBwcm90ZWN0ZWQgYnVmZmVycwogICAgICAgICAgICAgLy8gd2l0aG91dCB0aGUgcmlzayBvZiBzY2FubmluZyBvdXQgb25lIG9mIHRob3NlIGJ1ZmZlcnMuCi0gICAgICAgICAgICBtQ29kZWMtPnB1c2hCbGFua0J1ZmZlcnNUb05hdGl2ZVdpbmRvdygpOworICAgICAgICAgICAgcHVzaEJsYW5rQnVmZmVyc1RvTmF0aXZlV2luZG93KG1Db2RlYy0+bU5hdGl2ZVdpbmRvdy5nZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgRkFJTEVEX1RSQU5TQUNUSU9OKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIG1Db2RlYy0+Y2hhbmdlU3RhdGUobUNvZGVjLT5tSWRsZVRvTG9hZGVkU3RhdGUpOwpAQCAtNTg5Nyw3ICs2Njk2LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgLy8gRG9uJ3Qgc2VuZCBtZSBhIGZsdXNoIHJlcXVlc3QgaWYgeW91IHByZXZpb3VzbHkgd2FudGVkIG1lCiAgICAgICAgICAgICAvLyB0byBzaHV0ZG93bi4KLSAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICBBTE9HRSgiR290IGZsdXNoIHJlcXVlc3QgaW4gSWRsZVRvTG9hZGVkU3RhdGUiKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTU5MTgsOCArNjcxNywxNCBAQAogICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICAgICAgY2FzZSBPTVhfRXZlbnRDbWRDb21wbGV0ZToKICAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0tfRVEoZGF0YTEsIChPTVhfVTMyKU9NWF9Db21tYW5kU3RhdGVTZXQpOwotICAgICAgICAgICAgQ0hFQ0tfRVEoZGF0YTIsIChPTVhfVTMyKU9NWF9TdGF0ZUxvYWRlZCk7CisgICAgICAgICAgICBpZiAoZGF0YTEgIT0gKE9NWF9VMzIpT01YX0NvbW1hbmRTdGF0ZVNldAorICAgICAgICAgICAgICAgICAgICB8fCBkYXRhMiAhPSAoT01YX1UzMilPTVhfU3RhdGVMb2FkZWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiVW5leHBlY3RlZCBjb21tYW5kIGNvbXBsZXRpb24gaW4gSWRsZVRvTG9hZGVkU3RhdGU6ICVzKCV1KSAlcygldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoKE9NWF9DT01NQU5EVFlQRSlkYXRhMSksIGRhdGExLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoKE9NWF9TVEFURVRZUEUpZGF0YTIpLCBkYXRhMik7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIEZBSUxFRF9UUkFOU0FDVElPTik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1Db2RlYy0+Y2hhbmdlU3RhdGUobUNvZGVjLT5tTG9hZGVkU3RhdGUpOwogCkBAIC01OTcwLDI4ICs2Nzc1LDQxIEBACiAKIGJvb2wgQUNvZGVjOjpGbHVzaGluZ1N0YXRlOjpvbk9NWEV2ZW50KAogICAgICAgICBPTVhfRVZFTlRUWVBFIGV2ZW50LCBPTVhfVTMyIGRhdGExLCBPTVhfVTMyIGRhdGEyKSB7Ci0gICAgQUxPR1YoIlslc10gRmx1c2hpbmdTdGF0ZSBvbk9NWEV2ZW50KCVkLCVsZCkiLAotICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBldmVudCwgZGF0YTEpOworICAgIEFMT0dWKCJbJXNdIEZsdXNoaW5nU3RhdGUgb25PTVhFdmVudCgldSwlZCkiLAorICAgICAgICAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZS5jX3N0cigpLCBldmVudCwgKE9NWF9TMzIpZGF0YTEpOwogCiAgICAgc3dpdGNoIChldmVudCkgewogICAgICAgICBjYXNlIE9NWF9FdmVudENtZENvbXBsZXRlOgogICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDS19FUShkYXRhMSwgKE9NWF9VMzIpT01YX0NvbW1hbmRGbHVzaCk7CisgICAgICAgICAgICBpZiAoZGF0YTEgIT0gKE9NWF9VMzIpT01YX0NvbW1hbmRGbHVzaCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJ1bmV4cGVjdGVkIEV2ZW50Q21kQ29tcGxldGUgJXMoJWQpIGRhdGEyOiVkIGluIEZsdXNoaW5nU3RhdGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoKE9NWF9DT01NQU5EVFlQRSlkYXRhMSksIGRhdGExLCBkYXRhMik7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIEZBSUxFRF9UUkFOU0FDVElPTik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChkYXRhMiA9PSBrUG9ydEluZGV4SW5wdXQgfHwgZGF0YTIgPT0ga1BvcnRJbmRleE91dHB1dCkgewotICAgICAgICAgICAgICAgIENIRUNLKCFtRmx1c2hDb21wbGV0ZVtkYXRhMl0pOworICAgICAgICAgICAgICAgIGlmIChtRmx1c2hDb21wbGV0ZVtkYXRhMl0pIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZsdXNoIGFscmVhZHkgY29tcGxldGVkIGZvciAlcyBwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhMiA9PSBrUG9ydEluZGV4SW5wdXQgPyAiaW5wdXQiIDogIm91dHB1dCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbUZsdXNoQ29tcGxldGVbZGF0YTJdID0gdHJ1ZTsKIAotICAgICAgICAgICAgICAgIGlmIChtRmx1c2hDb21wbGV0ZVtrUG9ydEluZGV4SW5wdXRdCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtRmx1c2hDb21wbGV0ZVtrUG9ydEluZGV4T3V0cHV0XSkgeworICAgICAgICAgICAgICAgIGlmIChtRmx1c2hDb21wbGV0ZVtrUG9ydEluZGV4SW5wdXRdICYmIG1GbHVzaENvbXBsZXRlW2tQb3J0SW5kZXhPdXRwdXRdKSB7CiAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVN0YXRlSWZXZU93bkFsbEJ1ZmZlcnMoKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENIRUNLX0VRKGRhdGEyLCBPTVhfQUxMKTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtRmx1c2hDb21wbGV0ZVtrUG9ydEluZGV4SW5wdXRdKTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtRmx1c2hDb21wbGV0ZVtrUG9ydEluZGV4T3V0cHV0XSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEyID09IE9NWF9BTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1GbHVzaENvbXBsZXRlW2tQb3J0SW5kZXhJbnB1dF0gfHwgIW1GbHVzaENvbXBsZXRlW2tQb3J0SW5kZXhPdXRwdXRdKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZWNlaXZlZCBmbHVzaCBjb21wbGV0ZSBldmVudCBmb3IgT01YX0FMTCBiZWZvcmUgcG9ydHMgaGF2ZSBiZWVuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbHVzaGVkICglZC8lZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaENvbXBsZXRlW2tQb3J0SW5kZXhJbnB1dF0sIG1GbHVzaENvbXBsZXRlW2tQb3J0SW5kZXhPdXRwdXRdKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGNoYW5nZVN0YXRlSWZXZU93bkFsbEJ1ZmZlcnMoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coImRhdGEyIG5vdCBPTVhfQUxMIGJ1dCAldSBpbiBFdmVudENtZENvbXBsZXRlIENvbW1hbmRGbHVzaCIsIGRhdGEyKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC01OTk5LDcgKzY4MTcsNyBAQAogCiAgICAgICAgIGNhc2UgT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZDoKICAgICAgICAgewotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE9NWE1lc3NhZ2UsIG1Db2RlYy0+aWQoKSk7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0T01YTWVzc2FnZSwgbUNvZGVjKTsKICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoInR5cGUiLCBvbXhfbWVzc2FnZTo6RVZFTlQpOwogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigibm9kZSIsIG1Db2RlYy0+bU5vZGUpOwogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZXZlbnQiLCBldmVudCk7CkBAIC02MDQxLDYgKzY4NTksOCBAQAogICAgICAgICAvLyB0aGUgbmF0aXZlIHdpbmRvdyBmb3IgcmVuZGVyaW5nLiBMZXQncyBnZXQgdGhvc2UgYmFjayBhcyB3ZWxsLgogICAgICAgICBtQ29kZWMtPndhaXRVbnRpbEFsbFBvc3NpYmxlTmF0aXZlV2luZG93QnVmZmVyc0FyZVJldHVybmVkVG9VcygpOwogCisgICAgICAgIG1Db2RlYy0+bVJlbmRlclRyYWNrZXIuY2xlYXIoc3lzdGVtVGltZShDTE9DS19NT05PVE9OSUMpKTsKKwogICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbUNvZGVjLT5tTm90aWZ5LT5kdXAoKTsKICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRGbHVzaENvbXBsZXRlZCk7CiAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAKaW5kZXggOWFhN2Q5NS4uZjUzZDdmMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwCkBAIC0zMSwxOSArMzEsNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLUFNUldyaXRlcjo6QU1SV3JpdGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotICAgIDogbUZkKC0xKSwKLSAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCi0gICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtUGF1c2VkKGZhbHNlKSwKLSAgICAgIG1SZXN1bWVkKGZhbHNlKSB7Ci0KLSAgICBtRmQgPSBvcGVuKGZpbGVuYW1lLCBPX0NSRUFUIHwgT19MQVJHRUZJTEUgfCBPX1RSVU5DIHwgT19SRFdSLCBTX0lSVVNSIHwgU19JV1VTUik7Ci0gICAgaWYgKG1GZCA+PSAwKSB7Ci0gICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKLSAgICB9Ci19Ci0KIEFNUldyaXRlcjo6QU1SV3JpdGVyKGludCBmZCkKICAgICA6IG1GZChkdXAoZmQpKSwKICAgICAgIG1Jbml0Q2hlY2sobUZkIDwgMD8gTk9fSU5JVDogT0spLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKaW5kZXggMjYyOWFmYy4uMjUyOWFhNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCkBAIC0xMiw2ICsxMiw3IEBACiAgICAgICAgIEF1ZGlvUGxheWVyLmNwcCAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEF1ZGlvU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEF3ZXNvbWVQbGF5ZXIuY3BwICAgICAgICAgICAgICAgICBcCisgICAgICAgIENhbGxiYWNrRGF0YVNvdXJjZS5jcHAgICAgICAgICAgICBcCiAgICAgICAgIENhbWVyYVNvdXJjZS5jcHAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIENhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAgICAgICAgICBcCiAgICAgICAgIENsb2NrRXN0aW1hdG9yLmNwcCAgICAgICAgICAgICAgICBcCkBAIC0yMiw2ICsyMyw3IEBACiAgICAgICAgIEVTRFMuY3BwICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEZpbGVTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEZMQUNFeHRyYWN0b3IuY3BwICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZyYW1lUmVuZGVyVHJhY2tlci5jcHAgICAgICAgICAgICBcCiAgICAgICAgIEhUVFBCYXNlLmNwcCAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIEpQRUdTb3VyY2UuY3BwICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIE1QM0V4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgICBcCkBAIC0zMSwxMSArMzMsMTQgQEAKICAgICAgICAgTWVkaWFBZGFwdGVyLmNwcCAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgTWVkaWFCdWZmZXIuY3BwICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgTWVkaWFCdWZmZXJHcm91cC5jcHAgICAgICAgICAgICAgIFwKKyAgICAgICAgTWVkaWFDbG9jay5jcHAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgTWVkaWFDb2RlYy5jcHAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgTWVkaWFDb2RlY0xpc3QuY3BwICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwICAgICAgIFwKICAgICAgICAgTWVkaWFDb2RlY1NvdXJjZS5jcHAgICAgICAgICAgICAgIFwKICAgICAgICAgTWVkaWFEZWZzLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgTWVkaWFFeHRyYWN0b3IuY3BwICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTWVkaWFTeW5jLmNwcCAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgTWlkaUV4dHJhY3Rvci5jcHAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgaHR0cC9NZWRpYUhUVFAuY3BwICAgICAgICAgICAgICAgIFwKICAgICAgICAgTWVkaWFNdXhlci5jcHAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTQ2LDE3ICs1MSwyMCBAQAogICAgICAgICBPTVhDbGllbnQuY3BwICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBPTVhDb2RlYy5jcHAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBPZ2dFeHRyYWN0b3IuY3BwICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQcm9jZXNzSW5mby5jcHAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBTYW1wbGVJdGVyYXRvci5jcHAgICAgICAgICAgICAgICAgXAogICAgICAgICBTYW1wbGVUYWJsZS5jcHAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBTa2lwQ3V0QnVmZmVyLmNwcCAgICAgICAgICAgICAgICAgXAogICAgICAgICBTdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAgICAgICAgXAogICAgICAgICBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcCAgXAogICAgICAgICBTdXJmYWNlTWVkaWFTb3VyY2UuY3BwICAgICAgICAgICAgXAorICAgICAgICBTdXJmYWNlVXRpbHMuY3BwICAgICAgICAgICAgICAgICAgXAogICAgICAgICBUaHJvdHRsZWRTb3VyY2UuY3BwICAgICAgICAgICAgICAgXAogICAgICAgICBUaW1lU291cmNlLmNwcCAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBUaW1lZEV2ZW50UXVldWUuY3BwICAgICAgICAgICAgICAgXAogICAgICAgICBVdGlscy5jcHAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBWQlJJU2Vla2VyLmNwcCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBWaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcCAgICAgICAgICAgXAogICAgICAgICBXQVZFeHRyYWN0b3IuY3BwICAgICAgICAgICAgICAgICAgXAogICAgICAgICBXVk1FeHRyYWN0b3IuY3BwICAgICAgICAgICAgICAgICAgXAogICAgICAgICBYSU5HU2Vla2VyLmNwcCAgICAgICAgICAgICAgICAgICAgXApAQCAtODQsNiArOTIsNyBAQAogICAgICAgICBsaWJpY3V1YyBcCiAgICAgICAgIGxpYmxvZyBcCiAgICAgICAgIGxpYm1lZGlhIFwKKyAgICAgICAgbGlibWVkaWF1dGlscyBcCiAgICAgICAgIGxpYm5ldGRfY2xpZW50IFwKICAgICAgICAgbGlib3B1cyBcCiAgICAgICAgIGxpYnNvbml2b3ggXApAQCAtMTAxLDYgKzExMCw3IEBACiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2NvbG9yX2NvbnZlcnNpb24gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hYWNlbmMgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9tYXRyb3NrYSBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X21lZGlhZmlsdGVyIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfd2VibSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dCBcCiAgICAgICAgIGxpYnZweCBcCkBAIC0xMDgsMTUgKzExOCwyMyBAQAogICAgICAgICBsaWJzdGFnZWZyaWdodF9tcGVnMnRzIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfaWQzIFwKICAgICAgICAgbGliRkxBQyBcCi0gICAgICAgIGxpYm1lZGlhX2hlbHBlcgorICAgICAgICBsaWJtZWRpYV9oZWxwZXIgXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2F2Y19jb21tb24gXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICAgICAgbGliZGwKKyAgICAgICAgbGliZGwgXAorICAgICAgICBsaWJSU2NwcCBcCiAKLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IgLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyAtV2FsbAorCisjIGVuYWJsZSBleHBlcmltZW50cyBvbmx5IGluIHVzZXJkZWJ1ZyBhbmQgZW5nIGJ1aWxkcworaWZuZXEgKCwkKGZpbHRlciB1c2VyZGVidWcgZW5nLCQoVEFSR0VUX0JVSUxEX1ZBUklBTlQpKSkKK0xPQ0FMX0NGTEFHUyArPSAtREVOQUJMRV9TVEFHRUZSSUdIVF9FWFBFUklNRU5UUworZW5kaWYKKworTE9DQUxfQ0xBTkcgOj0gdHJ1ZQogCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKaW5kZXggZTI0ODI0Yi4uZGQ5ZDM5MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcApAQCAtNDA4LDExICs0MDgsMjIgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IEF1ZGlvUGxheWVyOjpzZXRQbGF5YmFja1JhdGVQZXJtaWxsZShpbnQzMl90IHJhdGVQZXJtaWxsZSkgeworc3RhdHVzX3QgQXVkaW9QbGF5ZXI6OnNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSkgewogICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIG1BdWRpb1NpbmstPnNldFBsYXliYWNrUmF0ZVBlcm1pbGxlKHJhdGVQZXJtaWxsZSk7CisgICAgICAgIHJldHVybiBtQXVkaW9TaW5rLT5zZXRQbGF5YmFja1JhdGUocmF0ZSk7CiAgICAgfSBlbHNlIGlmIChtQXVkaW9UcmFjayAhPSAwKXsKLSAgICAgICAgcmV0dXJuIG1BdWRpb1RyYWNrLT5zZXRTYW1wbGVSYXRlKHJhdGVQZXJtaWxsZSAqIG1TYW1wbGVSYXRlIC8gMTAwMCk7CisgICAgICAgIHJldHVybiBtQXVkaW9UcmFjay0+c2V0UGxheWJhY2tSYXRlKHJhdGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9QbGF5ZXI6OmdldFBsYXliYWNrUmF0ZShBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSAvKiBub25udWxsICovKSB7CisgICAgaWYgKG1BdWRpb1NpbmsuZ2V0KCkgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbUF1ZGlvU2luay0+Z2V0UGxheWJhY2tSYXRlKHJhdGUpOworICAgIH0gZWxzZSBpZiAobUF1ZGlvVHJhY2sgIT0gMCkgeworICAgICAgICAqcmF0ZSA9IG1BdWRpb1RyYWNrLT5nZXRQbGF5YmFja1JhdGUoKTsKKyAgICAgICAgcmV0dXJuIE9LOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcAppbmRleCA4MDVmMTJlLi5kMjU0ODBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCkBAIC01MCwxOCArNTAsMjMgQEAKIH0KIAogQXVkaW9Tb3VyY2U6OkF1ZGlvU291cmNlKAotICAgICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwgdWludDMyX3Qgc2FtcGxlUmF0ZSwgdWludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwgY29uc3QgU3RyaW5nMTYgJm9wUGFja2FnZU5hbWUsCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwgdWludDMyX3Qgb3V0U2FtcGxlUmF0ZSkKICAgICA6IG1TdGFydGVkKGZhbHNlKSwKICAgICAgIG1TYW1wbGVSYXRlKHNhbXBsZVJhdGUpLAorICAgICAgbU91dFNhbXBsZVJhdGUob3V0U2FtcGxlUmF0ZSA+IDAgPyBvdXRTYW1wbGVSYXRlIDogc2FtcGxlUmF0ZSksCiAgICAgICBtVHJhY2tNYXhBbXBsaXR1ZGUoZmFsc2UpLAogICAgICAgbVN0YXJ0VGltZVVzKDApLAogICAgICAgbU1heEFtcGxpdHVkZSgwKSwKICAgICAgIG1QcmV2U2FtcGxlVGltZVVzKDApLAorICAgICAgbUZpcnN0U2FtcGxlVGltZVVzKC0xbGwpLAogICAgICAgbUluaXRpYWxSZWFkVGltZVVzKDApLAogICAgICAgbU51bUZyYW1lc1JlY2VpdmVkKDApLAogICAgICAgbU51bUNsaWVudE93bmVkQnVmZmVycygwKSB7Ci0gICAgQUxPR1YoInNhbXBsZVJhdGU6ICVkLCBjaGFubmVsQ291bnQ6ICVkIiwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50KTsKKyAgICBBTE9HVigic2FtcGxlUmF0ZTogJXUsIG91dFNhbXBsZVJhdGU6ICV1LCBjaGFubmVsQ291bnQ6ICV1IiwKKyAgICAgICAgICAgIHNhbXBsZVJhdGUsIG91dFNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCk7CiAgICAgQ0hFQ0soY2hhbm5lbENvdW50ID09IDEgfHwgY2hhbm5lbENvdW50ID09IDIpOworICAgIENIRUNLKHNhbXBsZVJhdGUgPiAwKTsKIAogICAgIHNpemVfdCBtaW5GcmFtZUNvdW50OwogICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvUmVjb3JkOjpnZXRNaW5GcmFtZUNvdW50KCZtaW5GcmFtZUNvdW50LApAQCAtODIsMTEgKzg3LDE1IEBACiAgICAgICAgIG1SZWNvcmQgPSBuZXcgQXVkaW9SZWNvcmQoCiAgICAgICAgICAgICAgICAgICAgIGlucHV0U291cmNlLCBzYW1wbGVSYXRlLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KSwKKyAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkgKGJ1ZkNvdW50ICogZnJhbWVDb3VudCksCiAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkQ2FsbGJhY2tGdW5jdGlvbiwKICAgICAgICAgICAgICAgICAgICAgdGhpcywKICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCAvKm5vdGlmaWNhdGlvbkZyYW1lcyovKTsKICAgICAgICAgbUluaXRDaGVjayA9IG1SZWNvcmQtPmluaXRDaGVjaygpOworICAgICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICAgICAgbVJlY29yZC5jbGVhcigpOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUluaXRDaGVjayA9IHN0YXR1czsKICAgICB9CkBAIC0yNjAsNiArMjY5LDE1IEBACiAgICAgICAgICAgICAoaW50MTZfdCAqKSBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+PiAxKTsKICAgICB9CiAKKyAgICBpZiAobVNhbXBsZVJhdGUgIT0gbU91dFNhbXBsZVJhdGUpIHsKKyAgICAgICAgaWYgKG1GaXJzdFNhbXBsZVRpbWVVcyA8IDApIHsKKyAgICAgICAgICAgIG1GaXJzdFNhbXBsZVRpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgfQorICAgICAgICB0aW1lVXMgPSBtRmlyc3RTYW1wbGVUaW1lVXMgKyAodGltZVVzIC0gbUZpcnN0U2FtcGxlVGltZVVzKQorICAgICAgICAgICAgICAgICogKGludDY0X3QpbVNhbXBsZVJhdGUgLyAoaW50NjRfdCltT3V0U2FtcGxlUmF0ZTsKKyAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgfQorCiAgICAgKm91dCA9IGJ1ZmZlcjsKICAgICByZXR1cm4gT0s7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9Bd2Vzb21lUGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCmluZGV4IDg4MjE5YWYuLjNjZDBiMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F3ZXNvbWVQbGF5ZXIuY3BwCkBAIC0xMTMsMTEgKzExMywxMSBAQAogICAgICAgICBDSEVDSyhidWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKIAogICAgICAgICByZW5kZXIoKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpLCB0aW1lVXMgKiAxMDAwKTsKKyAgICAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCksIHRpbWVVcywgdGltZVVzICogMTAwMCk7CiAgICAgfQogCi0gICAgdm9pZCByZW5kZXIoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGludDY0X3QgdGltZXN0YW1wTnMpIHsKLSAgICAgICAgbVRhcmdldC0+cmVuZGVyKGRhdGEsIHNpemUsIHRpbWVzdGFtcE5zLCBOVUxMLCBtRm9ybWF0KTsKKyAgICB2b2lkIHJlbmRlcihjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50NjRfdCBtZWRpYVRpbWVVcywgbnNlY3NfdCByZW5kZXJUaW1lTnMpIHsKKyAgICAgICAgKHZvaWQpbVRhcmdldC0+cmVuZGVyKGRhdGEsIHNpemUsIG1lZGlhVGltZVVzLCByZW5kZXJUaW1lTnMsIE5VTEwsIG1Gb3JtYXQpOwogICAgIH0KIAogcHJvdGVjdGVkOgpAQCAtMjQxLDYgKzI0MSw4IEBACiAKICAgICBtQ2xvY2tFc3RpbWF0b3IgPSBuZXcgV2luZG93ZWRMaW5lYXJGaXRFc3RpbWF0b3IoKTsKIAorICAgIG1QbGF5YmFja1NldHRpbmdzID0gQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUOworCiAgICAgcmVzZXQoKTsKIH0KIApAQCAtMzYwLDcgKzM2Miw3IEBACiAgICAgcmV0dXJuIHNldERhdGFTb3VyY2VfbChkYXRhU291cmNlKTsKIH0KIAotc3RhdHVzX3QgQXdlc29tZVBsYXllcjo6c2V0RGF0YVNvdXJjZShjb25zdCBzcDxJU3RyZWFtU291cmNlPiAmc291cmNlKSB7CitzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpzZXREYXRhU291cmNlKGNvbnN0IHNwPElTdHJlYW1Tb3VyY2U+ICZzb3VyY2UgX191bnVzZWQpIHsKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKQEAgLTQyMiw3ICs0MjQsNyBAQAogCiAgICAgbUJpdHJhdGUgPSB0b3RhbEJpdFJhdGU7CiAKLSAgICBBTE9HVigibUJpdHJhdGUgPSAlbGxkIGJpdHMvc2VjIiwgbUJpdHJhdGUpOworICAgIEFMT0dWKCJtQml0cmF0ZSA9ICVsbGQgYml0cy9zZWMiLCAobG9uZyBsb25nKW1CaXRyYXRlKTsKIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1TdGF0c0xvY2spOwpAQCAtMTAwOSw2ICsxMDExLDEwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbUF1ZGlvUGxheWVyLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrU2V0dGluZ3MpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKG1UaW1lU291cmNlID09IE5VTEwgJiYgbUF1ZGlvUGxheWVyID09IE5VTEwpIHsKQEAgLTExMzEsNiArMTEzNywxMCBAQAogICAgIH0KIAogICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgZXJyID0gbUF1ZGlvUGxheWVyLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrU2V0dGluZ3MpOworICAgIH0KKworICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgbW9kaWZ5RmxhZ3MoQVVESU9fUlVOTklORywgU0VUKTsKIAogICAgICAgICBtV2F0Y2hGb3JBdWRpb0VPUyA9IHRydWU7CkBAIC0xNzIyLDcgKzE3MzIsNyBAQAogICAgIC8vIHdlIGFyZSBub3cgcmVzdW1pbmcuICBTaWduYWwgbmV3IHBvc2l0aW9uIHRvIG1lZGlhIHRpbWUgcHJvdmlkZXIuCiAgICAgLy8gQ2Fubm90IHNpZ25hbCBhbm90aGVyIFNFRUtfQ09NUExFVEUsIGFzIGV4aXN0aW5nIGNsaWVudHMgbWF5IG5vdCBleHBlY3QKICAgICAvLyBtdWx0aXBsZSBTRUVLX0NPTVBMRVRFIHJlc3BvbnNlcyB0byBhIHNpbmdsZSBzZWVrKCkgcmVxdWVzdC4KLSAgICBpZiAobVNlZWtOb3RpZmljYXRpb25TZW50ICYmIGFicyhtU2Vla1RpbWVVcyAtIHZpZGVvVGltZVVzKSA+IDEwMDAwKSB7CisgICAgaWYgKG1TZWVrTm90aWZpY2F0aW9uU2VudCAmJiBsbGFicygobG9uZyBsb25nKShtU2Vla1RpbWVVcyAtIHZpZGVvVGltZVVzKSkgPiAxMDAwMCkgewogICAgICAgICAvLyBub3RpZnkgaWYgd2UgYXJlIHJlc3VtaW5nIG1vcmUgdGhhbiAxMG1zIGF3YXkgZnJvbSBkZXNpcmVkIHNlZWsgdGltZQogICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKE1FRElBX1NLSVBQRUQpOwogICAgIH0KQEAgLTIzNTgsNyArMjM2OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0dFKG1ldGFEYXRhU2l6ZSwgMGxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtZXRhRGF0YVNpemUgPSAlbGxkIGJ5dGVzIiwgbWV0YURhdGFTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtZXRhRGF0YVNpemUgPSAlbGxkIGJ5dGVzIiwgKGxvbmcgbG9uZyltZXRhRGF0YVNpemUpOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgdXNsZWVwKDIwMDAwMCk7CkBAIC0yNTUzLDE0ICsyNTYzLDYgQEAKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIHNldENhY2hlU3RhdENvbGxlY3RGcmVxKHJlcXVlc3QpOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgS0VZX1BBUkFNRVRFUl9QTEFZQkFDS19SQVRFX1BFUk1JTExFOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobUF1ZGlvUGxheWVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUF1ZGlvUGxheWVyLT5zZXRQbGF5YmFja1JhdGVQZXJtaWxsZShyZXF1ZXN0LnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwpAQCAtMjU5Nyw2ICsyNTk5LDU4IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAvLyBjdXJzb3J5IHNhbml0eSBjaGVjayBmb3Igbm9uLWF1ZGlvIGFuZCBwYXVzZWQgY2FzZXMKKyAgICBpZiAoKHJhdGUubVNwZWVkICE9IDAuZiAmJiByYXRlLm1TcGVlZCA8IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01JTikKKyAgICAgICAgfHwgcmF0ZS5tU3BlZWQgPiBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NQVgKKyAgICAgICAgfHwgcmF0ZS5tUGl0Y2ggPCBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NSU4KKyAgICAgICAgfHwgcmF0ZS5tUGl0Y2ggPiBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NQVgpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBpZiAocmF0ZS5tU3BlZWQgPT0gMC5mKSB7CisgICAgICAgIGlmIChtRmxhZ3MgJiBQTEFZSU5HKSB7CisgICAgICAgICAgICBtb2RpZnlGbGFncyhDQUNIRV9VTkRFUlJVTiwgQ0xFQVIpOyAvLyBzYW1lIGFzIHBhdXNlCisgICAgICAgICAgICBlcnIgPSBwYXVzZV9sKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgLy8gc2F2ZSBzZXR0aW5ncyAodXNpbmcgb2xkIHNwZWVkKSBpbiBjYXNlIHBsYXllciBpcyByZXN1bWVkCisgICAgICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSBuZXdSYXRlID0gcmF0ZTsKKyAgICAgICAgICAgIG5ld1JhdGUubVNwZWVkID0gbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkOworICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSBuZXdSYXRlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGlmIChtQXVkaW9QbGF5ZXIgIT0gTlVMTCkgeworICAgICAgICBlcnIgPSBtQXVkaW9QbGF5ZXItPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKKyAgICB9CisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IHJhdGU7CisgICAgICAgIGlmICghKG1GbGFncyAmIFBMQVlJTkcpKSB7CisgICAgICAgICAgICBwbGF5X2woKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0dXNfdCBBd2Vzb21lUGxheWVyOjpnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlIC8qIG5vbm51bGwgKi8pIHsKKyAgICBpZiAobUF1ZGlvUGxheWVyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvUGxheWVyLT5nZXRQbGF5YmFja1JhdGUocmF0ZSk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gKnJhdGU7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICAgICAgaWYgKCEobUZsYWdzICYgUExBWUlORykpIHsKKyAgICAgICAgICAgICAgICByYXRlLT5tU3BlZWQgPSAwLmY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgKnJhdGUgPSBtUGxheWJhY2tTZXR0aW5nczsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IEF3ZXNvbWVQbGF5ZXI6OmdldFRyYWNrSW5mbyhQYXJjZWwgKnJlcGx5KSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBzaXplX3QgdHJhY2tDb3VudCA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYWxsYmFja0RhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FsbGJhY2tEYXRhU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTdmZGY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FsbGJhY2tEYXRhU291cmNlLmNwcApAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDYWxsYmFja0RhdGFTb3VyY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJpbmNsdWRlL0NhbGxiYWNrRGF0YVNvdXJjZS5oIgorCisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9JRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQ2FsbGJhY2tEYXRhU291cmNlOjpDYWxsYmFja0RhdGFTb3VyY2UoCisgICAgY29uc3Qgc3A8SURhdGFTb3VyY2U+JiBiaW5kZXJEYXRhU291cmNlKQorICAgIDogbUlEYXRhU291cmNlKGJpbmRlckRhdGFTb3VyY2UpIHsKKyAgICAvLyBTZXQgdXAgdGhlIGJ1ZmZlciB0byByZWFkIGludG8uCisgICAgbU1lbW9yeSA9IG1JRGF0YVNvdXJjZS0+Z2V0SU1lbW9yeSgpOworfQorCitDYWxsYmFja0RhdGFTb3VyY2U6On5DYWxsYmFja0RhdGFTb3VyY2UoKSB7CisgICAgQUxPR1YoIn5DYWxsYmFja0RhdGFTb3VyY2UiKTsKKyAgICBtSURhdGFTb3VyY2UtPmNsb3NlKCk7Cit9CisKK3N0YXR1c190IENhbGxiYWNrRGF0YVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIGlmIChtTWVtb3J5ID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3NpemVfdCBDYWxsYmFja0RhdGFTb3VyY2U6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobU1lbW9yeSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLyBJRGF0YVNvdXJjZSBjYW4gb25seSByZWFkIHVwIHRvIG1NZW1vcnktPnNpemUoKSBieXRlcyBhdCBhIHRpbWUsIGJ1dCB0aGlzCisgICAgLy8gbWV0aG9kIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgYW55IG51bWJlciBvZiBieXRlcywgc28gcmVhZCBpbiBhIGxvb3AuCisgICAgc2l6ZV90IHRvdGFsTnVtUmVhZCA9IDA7CisgICAgc2l6ZV90IG51bUxlZnQgPSBzaXplOworICAgIGNvbnN0IHNpemVfdCBidWZmZXJTaXplID0gbU1lbW9yeS0+c2l6ZSgpOworCisgICAgd2hpbGUgKG51bUxlZnQgPiAwKSB7CisgICAgICAgIHNpemVfdCBudW1Ub1JlYWQgPSBzdGQ6Om1pbihudW1MZWZ0LCBidWZmZXJTaXplKTsKKyAgICAgICAgc3NpemVfdCBudW1SZWFkID0KKyAgICAgICAgICAgIG1JRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCArIHRvdGFsTnVtUmVhZCwgbnVtVG9SZWFkKTsKKyAgICAgICAgLy8gQSBuZWdhdGl2ZSByZXR1cm4gdmFsdWUgcmVwcmVzZW50cyBhbiBlcnJvci4gUGFzcyBpdCBvbi4KKyAgICAgICAgaWYgKG51bVJlYWQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVtUmVhZDsKKyAgICAgICAgfQorICAgICAgICAvLyBBIHplcm8gcmV0dXJuIHZhbHVlIHNpZ25hbHMgRU9TLiBSZXR1cm4gdGhlIGJ5dGVzIHJlYWQgc28gZmFyLgorICAgICAgICBpZiAobnVtUmVhZCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gdG90YWxOdW1SZWFkOworICAgICAgICB9CisgICAgICAgIGlmICgoc2l6ZV90KW51bVJlYWQgPiBudW1Ub1JlYWQpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgICAgIH0KKyAgICAgICAgQ0hFQ0sobnVtUmVhZCA+PSAwICYmIChzaXplX3QpbnVtUmVhZCA8PSBidWZmZXJTaXplKTsKKyAgICAgICAgbWVtY3B5KCgodWludDhfdCopZGF0YSkgKyB0b3RhbE51bVJlYWQsIG1NZW1vcnktPnBvaW50ZXIoKSwgbnVtUmVhZCk7CisgICAgICAgIG51bUxlZnQgLT0gbnVtUmVhZDsKKyAgICAgICAgdG90YWxOdW1SZWFkICs9IG51bVJlYWQ7CisgICAgfQorCisgICAgcmV0dXJuIHRvdGFsTnVtUmVhZDsKK30KKworc3RhdHVzX3QgQ2FsbGJhY2tEYXRhU291cmNlOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBtSURhdGFTb3VyY2UtPmdldFNpemUoc2l6ZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBpZiAoKnNpemUgPCAwKSB7CisgICAgICAgIC8vIElEYXRhU291cmNlIHdpbGwgc2V0IHNpemUgdG8gLTEgdG8gaW5kaWNhdGUgdW5rbm93biBzaXplLCBidXQKKyAgICAgICAgLy8gRGF0YVNvdXJjZSByZXR1cm5zIEVSUk9SX1VOU1VQUE9SVEVEIGZvciB0aGF0LgorICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworVGlueUNhY2hlU291cmNlOjpUaW55Q2FjaGVTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIHNvdXJjZSkKKyAgICA6IG1Tb3VyY2Uoc291cmNlKSwgbUNhY2hlZE9mZnNldCgwKSwgbUNhY2hlZFNpemUoMCkgeworfQorCitzdGF0dXNfdCBUaW55Q2FjaGVTb3VyY2U6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNvdXJjZS0+aW5pdENoZWNrKCk7Cit9CisKK3NzaXplX3QgVGlueUNhY2hlU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKHNpemUgPj0ga0NhY2hlU2l6ZSkgeworICAgICAgICByZXR1cm4gbVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgZGF0YSwgc2l6ZSk7CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgdGhlIGNhY2hlIHNhdGlzZmllcyB0aGUgcmVhZC4KKyAgICBpZiAobUNhY2hlZE9mZnNldCA8PSBvZmZzZXQKKyAgICAgICAgICAgICYmIG9mZnNldCA8IChvZmY2NF90KSAobUNhY2hlZE9mZnNldCArIG1DYWNoZWRTaXplKSkgeworICAgICAgICBpZiAob2Zmc2V0ICsgc2l6ZSA8PSBtQ2FjaGVkT2Zmc2V0ICsgbUNhY2hlZFNpemUpIHsKKyAgICAgICAgICAgIG1lbWNweShkYXRhLCAmbUNhY2hlW29mZnNldCAtIG1DYWNoZWRPZmZzZXRdLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gSWYgdGhlIGNhY2hlIGhpdHMgb25seSBwYXJ0aWFsbHksIGZsdXNoIHRoZSBjYWNoZSBhbmQgcmVhZCB0aGUKKyAgICAgICAgICAgIC8vIHJlbWFpbmRlci4KKworICAgICAgICAgICAgLy8gVGhpcyB2YWx1ZSBpcyBndWFyYW50ZWVkIHRvIGJlIGdyZWF0ZXIgdGhhbiAwIGJlY2F1c2Ugb2YgdGhlCisgICAgICAgICAgICAvLyBlbmNsb3NpbmcgaWYgc3RhdGVtZW50LgorICAgICAgICAgICAgY29uc3Qgc3NpemVfdCByZW1haW5pbmcgPSBtQ2FjaGVkT2Zmc2V0ICsgbUNhY2hlZFNpemUgLSBvZmZzZXQ7CisgICAgICAgICAgICBtZW1jcHkoZGF0YSwgJm1DYWNoZVtvZmZzZXQgLSBtQ2FjaGVkT2Zmc2V0XSwgcmVtYWluaW5nKTsKKyAgICAgICAgICAgIGNvbnN0IHNzaXplX3QgcmVhZE1vcmUgPSByZWFkQXQob2Zmc2V0ICsgcmVtYWluaW5nLAorICAgICAgICAgICAgICAgICAgICAodWludDhfdCopZGF0YSArIHJlbWFpbmluZywgc2l6ZSAtIHJlbWFpbmluZyk7CisgICAgICAgICAgICBpZiAocmVhZE1vcmUgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRNb3JlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlbWFpbmluZyArIHJlYWRNb3JlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRmlsbCB0aGUgY2FjaGUgYW5kIGNvcHkgdG8gdGhlIGNhbGxlci4KKyAgICBjb25zdCBzc2l6ZV90IG51bVJlYWQgPSBtU291cmNlLT5yZWFkQXQob2Zmc2V0LCBtQ2FjaGUsIGtDYWNoZVNpemUpOworICAgIGlmIChudW1SZWFkIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIG51bVJlYWQ7CisgICAgfQorICAgIGlmICgoc2l6ZV90KW51bVJlYWQgPiBrQ2FjaGVTaXplKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgfQorCisgICAgbUNhY2hlZFNpemUgPSBudW1SZWFkOworICAgIG1DYWNoZWRPZmZzZXQgPSBvZmZzZXQ7CisgICAgQ0hFQ0sobUNhY2hlZFNpemUgPD0ga0NhY2hlU2l6ZSAmJiBtQ2FjaGVkT2Zmc2V0ID49IDApOworICAgIGNvbnN0IHNpemVfdCBudW1Ub1JldHVybiA9IHN0ZDo6bWluKHNpemUsIChzaXplX3QpbnVtUmVhZCk7CisgICAgbWVtY3B5KGRhdGEsIG1DYWNoZSwgbnVtVG9SZXR1cm4pOworCisgICAgcmV0dXJuIG51bVRvUmV0dXJuOworfQorCitzdGF0dXNfdCBUaW55Q2FjaGVTb3VyY2U6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgIHJldHVybiBtU291cmNlLT5nZXRTaXplKHNpemUpOworfQorCit1aW50MzJfdCBUaW55Q2FjaGVTb3VyY2U6OmZsYWdzKCkgeworICAgIHJldHVybiBtU291cmNlLT5mbGFncygpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmNwcAppbmRleCBhZDEyYmRkLi5mYTMwNjQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZS5jcHAKQEAgLTI3LDggKzI3LDEwIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYS5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eS5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CkBAIC02MDgsNiArNjEwLDE2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBlcnIgPSBtQ2FtZXJhLT5zZW5kQ29tbWFuZCgKKyAgICAgICAgQ0FNRVJBX0NNRF9TRVRfVklERU9fRk9STUFULCBtRW5jb2RlckZvcm1hdCwgbUVuY29kZXJEYXRhU3BhY2UpOworCisgICAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gZm9yIENhbWVyYUhBTDEgY2xpZW50czsgdGh1cyB0aGUgZmFpbHVyZSBpcworICAgIC8vIG5vdCBhIGZhdGFsIGVycm9yCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHNldCB2aWRlbyBlbmNvZGVyIGZvcm1hdC9kYXRhc3BhY2UgdG8gJWQsICVkIGR1ZSB0byAlZCIsCisgICAgICAgICAgICAgICAgbUVuY29kZXJGb3JtYXQsIG1FbmNvZGVyRGF0YVNwYWNlLCBlcnIpOworICAgIH0KKwogICAgIGVyciA9IE9LOwogICAgIGlmIChtQ2FtZXJhRmxhZ3MgJiBGTEFHU19IT1RfQ0FNRVJBKSB7CiAgICAgICAgIG1DYW1lcmEtPnVubG9jaygpOwpAQCAtNjQ1LDYgKzY1Nyw5IEBACiAKICAgICBtU3RhcnRUaW1lVXMgPSAwOwogICAgIG1OdW1JbnB1dEJ1ZmZlcnMgPSAwOworICAgIG1FbmNvZGVyRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOworICAgIG1FbmNvZGVyRGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9CVDcwOTsKKwogICAgIGlmIChtZXRhKSB7CiAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXM7CiAgICAgICAgIGlmIChtZXRhLT5maW5kSW50NjQoa0tleVRpbWUsICZzdGFydFRpbWVVcykpIHsKQEAgLTY1Niw2ICs2NzEsMTQgQEAKICAgICAgICAgICAgIENIRUNLX0dUKG5CdWZmZXJzLCAwKTsKICAgICAgICAgICAgIG1OdW1JbnB1dEJ1ZmZlcnMgPSBuQnVmZmVyczsKICAgICAgICAgfQorCisgICAgICAgIC8vIGFwcGx5IGVuY29kZXIgY29sb3IgZm9ybWF0IGlmIHNwZWNpZmllZAorICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlQaXhlbEZvcm1hdCwgJm1FbmNvZGVyRm9ybWF0KSkgeworICAgICAgICAgICAgQUxPR1YoIlVzaW5nIGVuY29kZXIgZm9ybWF0OiAlI3giLCBtRW5jb2RlckZvcm1hdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JTcGFjZSwgJm1FbmNvZGVyRGF0YVNwYWNlKSkgeworICAgICAgICAgICAgQUxPR1YoIlVzaW5nIGVuY29kZXIgZGF0YSBzcGFjZTogJSN4IiwgbUVuY29kZXJEYXRhU3BhY2UpOworICAgICAgICB9CiAgICAgfQogCiAgICAgc3RhdHVzX3QgZXJyOwpAQCAtNzcxLDYgKzc5NCw4IEBACiAgICAgTGlzdDxzcDxJTWVtb3J5PiA+OjppdGVyYXRvciBpdDsKICAgICB3aGlsZSAoIW1GcmFtZXNSZWNlaXZlZC5lbXB0eSgpKSB7CiAgICAgICAgIGl0ID0gbUZyYW1lc1JlY2VpdmVkLmJlZ2luKCk7CisgICAgICAgIC8vIGIvMjg0NjY3MDEKKyAgICAgICAgYWRqdXN0T3V0Z29pbmdBTldCdWZmZXIoaXQtPmdldCgpKTsKICAgICAgICAgcmVsZWFzZVJlY29yZGluZ0ZyYW1lKCppdCk7CiAgICAgICAgIG1GcmFtZXNSZWNlaXZlZC5lcmFzZShpdCk7CiAgICAgICAgICsrbU51bUZyYW1lc0Ryb3BwZWQ7CkBAIC03OTEsNiArODE2LDkgQEAKICAgICBmb3IgKExpc3Q8c3A8SU1lbW9yeT4gPjo6aXRlcmF0b3IgaXQgPSBtRnJhbWVzQmVpbmdFbmNvZGVkLmJlZ2luKCk7CiAgICAgICAgICBpdCAhPSBtRnJhbWVzQmVpbmdFbmNvZGVkLmVuZCgpOyArK2l0KSB7CiAgICAgICAgIGlmICgoKml0KS0+cG9pbnRlcigpID09ICBidWZmZXItPmRhdGEoKSkgeworICAgICAgICAgICAgLy8gYi8yODQ2NjcwMQorICAgICAgICAgICAgYWRqdXN0T3V0Z29pbmdBTldCdWZmZXIoaXQtPmdldCgpKTsKKwogICAgICAgICAgICAgcmVsZWFzZU9uZVJlY29yZGluZ0ZyYW1lKCgqaXQpKTsKICAgICAgICAgICAgIG1GcmFtZXNCZWluZ0VuY29kZWQuZXJhc2UoaXQpOwogICAgICAgICAgICAgKyttTnVtRnJhbWVzRW5jb2RlZDsKQEAgLTg1MSwyMiArODc5LDE1IEBACiB9CiAKIHZvaWQgQ2FtZXJhU291cmNlOjpkYXRhQ2FsbGJhY2tUaW1lc3RhbXAoaW50NjRfdCB0aW1lc3RhbXBVcywKLSAgICAgICAgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSkgewotICAgIEFMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXA6IHRpbWVzdGFtcCAlIiBQUklkNjQgIiB1cyIsIHRpbWVzdGFtcFVzKTsKKyAgICAgICAgaW50MzJfdCBtc2dUeXBlIF9fdW51c2VkLCBjb25zdCBzcDxJTWVtb3J5PiAmZGF0YSkgeworICAgIEFMT0dWKCJkYXRhQ2FsbGJhY2tUaW1lc3RhbXA6IHRpbWVzdGFtcCAlbGxkIHVzIiwgKGxvbmcgbG9uZyl0aW1lc3RhbXBVcyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBpZiAoIW1TdGFydGVkIHx8IChtTnVtRnJhbWVzUmVjZWl2ZWQgPT0gMCAmJiB0aW1lc3RhbXBVcyA8IG1TdGFydFRpbWVVcykpIHsKLSAgICAgICAgQUxPR1YoIkRyb3AgZnJhbWUgYXQgJSIgUFJJZDY0ICIvJSIgUFJJZDY0ICIgdXMiLCB0aW1lc3RhbXBVcywgbVN0YXJ0VGltZVVzKTsKKyAgICAgICAgQUxPR1YoIkRyb3AgZnJhbWUgYXQgJWxsZC8lbGxkIHVzIiwgKGxvbmcgbG9uZyl0aW1lc3RhbXBVcywgKGxvbmcgbG9uZyltU3RhcnRUaW1lVXMpOwogICAgICAgICByZWxlYXNlT25lUmVjb3JkaW5nRnJhbWUoZGF0YSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAobU51bUZyYW1lc1JlY2VpdmVkID4gMCkgewotICAgICAgICBDSEVDSyh0aW1lc3RhbXBVcyA+IG1MYXN0RnJhbWVUaW1lc3RhbXBVcyk7Ci0gICAgICAgIGlmICh0aW1lc3RhbXBVcyAtIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyA+IG1HbGl0Y2hEdXJhdGlvblRocmVzaG9sZFVzKSB7Ci0gICAgICAgICAgICArK21OdW1HbGl0Y2hlczsKLSAgICAgICAgfQotICAgIH0KLQogICAgIC8vIE1heSBuZWVkIHRvIHNraXAgZnJhbWUgb3IgbW9kaWZ5IHRpbWVzdGFtcC4gQ3VycmVudGx5IGltcGxlbWVudGVkCiAgICAgLy8gYnkgdGhlIHN1YmNsYXNzIENhbWVyYVNvdXJjZVRpbWVMYXBzZS4KICAgICBpZiAoc2tpcEN1cnJlbnRGcmFtZSh0aW1lc3RhbXBVcykpIHsKQEAgLTg3NCw2ICs4OTUsMTggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGlmIChtTnVtRnJhbWVzUmVjZWl2ZWQgPiAwKSB7CisgICAgICAgIGlmICh0aW1lc3RhbXBVcyA8PSBtTGFzdEZyYW1lVGltZXN0YW1wVXMpIHsKKyAgICAgICAgICAgIEFMT0dXKCJEcm9wcGluZyBmcmFtZSB3aXRoIGJhY2t3YXJkIHRpbWVzdGFtcCAlbGxkIChsYXN0ICVsbGQpIiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXBVcywgKGxvbmcgbG9uZyltTGFzdEZyYW1lVGltZXN0YW1wVXMpOworICAgICAgICAgICAgcmVsZWFzZU9uZVJlY29yZGluZ0ZyYW1lKGRhdGEpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICh0aW1lc3RhbXBVcyAtIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyA+IG1HbGl0Y2hEdXJhdGlvblRocmVzaG9sZFVzKSB7CisgICAgICAgICAgICArK21OdW1HbGl0Y2hlczsKKyAgICAgICAgfQorICAgIH0KKwogICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOwogICAgIGlmIChtTnVtRnJhbWVzUmVjZWl2ZWQgPT0gMCkgewogICAgICAgICBtRmlyc3RGcmFtZVRpbWVVcyA9IHRpbWVzdGFtcFVzOwpAQCAtODkxLDYgKzkyNCwxMCBAQAogICAgICsrbU51bUZyYW1lc1JlY2VpdmVkOwogCiAgICAgQ0hFQ0soZGF0YSAhPSBOVUxMICYmIGRhdGEtPnNpemUoKSA+IDApOworCisgICAgLy8gYi8yODQ2NjcwMQorICAgIGFkanVzdEluY29taW5nQU5XQnVmZmVyKGRhdGEuZ2V0KCkpOworCiAgICAgbUZyYW1lc1JlY2VpdmVkLnB1c2hfYmFjayhkYXRhKTsKICAgICBpbnQ2NF90IHRpbWVVcyA9IG1TdGFydFRpbWVVcyArICh0aW1lc3RhbXBVcyAtIG1GaXJzdEZyYW1lVGltZVVzKTsKICAgICBtRnJhbWVUaW1lcy5wdXNoX2JhY2sodGltZVVzKTsKQEAgLTkwNCw2ICs5NDEsMjQgQEAKICAgICByZXR1cm4gbUlzTWV0YURhdGFTdG9yZWRJblZpZGVvQnVmZmVyczsKIH0KIAordm9pZCBDYW1lcmFTb3VyY2U6OmFkanVzdEluY29taW5nQU5XQnVmZmVyKElNZW1vcnkqIGRhdGEpIHsKKyAgICBWaWRlb05hdGl2ZU1ldGFkYXRhICpwYXlsb2FkID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VmlkZW9OYXRpdmVNZXRhZGF0YSo+KGRhdGEtPnBvaW50ZXIoKSk7CisgICAgaWYgKHBheWxvYWQtPmVUeXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXIpIHsKKyAgICAgICAgcGF5bG9hZC0+cEJ1ZmZlciA9IChBTmF0aXZlV2luZG93QnVmZmVyKikoKCh1aW50OF90KilwYXlsb2FkLT5wQnVmZmVyKSArCisgICAgICAgICAgICAgICAgSUNhbWVyYVJlY29yZGluZ1Byb3h5OjpnZXRDb21tb25CYXNlQWRkcmVzcygpKTsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhU291cmNlOjphZGp1c3RPdXRnb2luZ0FOV0J1ZmZlcihJTWVtb3J5KiBkYXRhKSB7CisgICAgVmlkZW9OYXRpdmVNZXRhZGF0YSAqcGF5bG9hZCA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFZpZGVvTmF0aXZlTWV0YWRhdGEqPihkYXRhLT5wb2ludGVyKCkpOworICAgIGlmIChwYXlsb2FkLT5lVHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyKSB7CisgICAgICAgIHBheWxvYWQtPnBCdWZmZXIgPSAoQU5hdGl2ZVdpbmRvd0J1ZmZlciopKCgodWludDhfdCopcGF5bG9hZC0+cEJ1ZmZlcikgLQorICAgICAgICAgICAgICAgIElDYW1lcmFSZWNvcmRpbmdQcm94eTo6Z2V0Q29tbW9uQmFzZUFkZHJlc3MoKSk7CisgICAgfQorfQorCiBDYW1lcmFTb3VyY2U6OlByb3h5TGlzdGVuZXI6OlByb3h5TGlzdGVuZXIoY29uc3Qgc3A8Q2FtZXJhU291cmNlPiYgc291cmNlKSB7CiAgICAgbVNvdXJjZSA9IHNvdXJjZTsKIH0KQEAgLTkxMyw3ICs5NjgsNyBAQAogICAgIG1Tb3VyY2UtPmRhdGFDYWxsYmFja1RpbWVzdGFtcCh0aW1lc3RhbXAgLyAxMDAwLCBtc2dUeXBlLCBkYXRhUHRyKTsKIH0KIAotdm9pZCBDYW1lcmFTb3VyY2U6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewordm9pZCBDYW1lcmFTb3VyY2U6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkgewogICAgIEFMT0dJKCJDYW1lcmEgcmVjb3JkaW5nIHByb3h5IGRpZWQiKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlLmNwcAppbmRleCBkYzNiMzkzLi41MDIwYzZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlLmNwcApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgImluY2x1ZGUvQU1SRXh0cmFjdG9yLmgiCiAKICNpbmNsdWRlICJpbmNsdWRlL0FBQ0V4dHJhY3Rvci5oIgorI2luY2x1ZGUgImluY2x1ZGUvQ2FsbGJhY2tEYXRhU291cmNlLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9EUk1FeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL0ZMQUNFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCkBAIC0yODEsNiArMjgyLDEwIEBACiAgICAgfQogfQogCitzcDxEYXRhU291cmNlPiBEYXRhU291cmNlOjpDcmVhdGVGcm9tSURhdGFTb3VyY2UoY29uc3Qgc3A8SURhdGFTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICByZXR1cm4gbmV3IFRpbnlDYWNoZVNvdXJjZShuZXcgQ2FsbGJhY2tEYXRhU291cmNlKHNvdXJjZSkpOworfQorCiBTdHJpbmc4IERhdGFTb3VyY2U6OmdldE1JTUVUeXBlKCkgY29uc3QgewogICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZMQUNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRkxBQ0V4dHJhY3Rvci5jcHAKaW5kZXggZmE3MjUxYy4uODlhOTFmNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRkxBQ0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRkxBQ0V4dHJhY3Rvci5jcHAKQEAgLTY1MSwxMCArNjUxLDEwIEBACiAgICAgaWYgKGRvU2VlaykgewogICAgICAgICAvLyBXZSBpbXBsZW1lbnQgdGhlIHNlZWsgY2FsbGJhY2ssIHNvIHRoaXMgd29ya3Mgd2l0aG91dCBleHBsaWNpdCBmbHVzaAogICAgICAgICBpZiAoIUZMQUNfX3N0cmVhbV9kZWNvZGVyX3NlZWtfYWJzb2x1dGUobURlY29kZXIsIHNhbXBsZSkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJGTEFDUGFyc2VyOjpyZWFkQnVmZmVyIHNlZWsgdG8gc2FtcGxlICVsbHUgZmFpbGVkIiwgc2FtcGxlKTsKKyAgICAgICAgICAgIEFMT0dFKCJGTEFDUGFyc2VyOjpyZWFkQnVmZmVyIHNlZWsgdG8gc2FtcGxlICVsbGQgZmFpbGVkIiwgKGxvbmcgbG9uZylzYW1wbGUpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoIkZMQUNQYXJzZXI6OnJlYWRCdWZmZXIgc2VlayB0byBzYW1wbGUgJWxsdSBzdWNjZWVkZWQiLCBzYW1wbGUpOworICAgICAgICBBTE9HVigiRkxBQ1BhcnNlcjo6cmVhZEJ1ZmZlciBzZWVrIHRvIHNhbXBsZSAlbGxkIHN1Y2NlZWRlZCIsIChsb25nIGxvbmcpc2FtcGxlKTsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoIUZMQUNfX3N0cmVhbV9kZWNvZGVyX3Byb2Nlc3Nfc2luZ2xlKG1EZWNvZGVyKSkgewogICAgICAgICAgICAgQUxPR0UoIkZMQUNQYXJzZXI6OnJlYWRCdWZmZXIgcHJvY2Vzc19zaW5nbGUgZmFpbGVkIik7CkBAIC02NzQsNyArNjc0LDEwIEBACiAgICAgaWYgKG1Xcml0ZUhlYWRlci5zYW1wbGVfcmF0ZSAhPSBnZXRTYW1wbGVSYXRlKCkgfHwKICAgICAgICAgbVdyaXRlSGVhZGVyLmNoYW5uZWxzICE9IGdldENoYW5uZWxzKCkgfHwKICAgICAgICAgbVdyaXRlSGVhZGVyLmJpdHNfcGVyX3NhbXBsZSAhPSBnZXRCaXRzUGVyU2FtcGxlKCkpIHsKLSAgICAgICAgQUxPR0UoIkZMQUNQYXJzZXI6OnJlYWRCdWZmZXIgd3JpdGUgY2hhbmdlZCBwYXJhbWV0ZXJzIG1pZC1zdHJlYW0iKTsKKyAgICAgICAgQUxPR0UoIkZMQUNQYXJzZXI6OnJlYWRCdWZmZXIgd3JpdGUgY2hhbmdlZCBwYXJhbWV0ZXJzIG1pZC1zdHJlYW06ICVkLyVkLyVkIC0+ICVkLyVkLyVkIiwKKyAgICAgICAgICAgICAgICBnZXRTYW1wbGVSYXRlKCksIGdldENoYW5uZWxzKCksIGdldEJpdHNQZXJTYW1wbGUoKSwKKyAgICAgICAgICAgICAgICBtV3JpdGVIZWFkZXIuc2FtcGxlX3JhdGUsIG1Xcml0ZUhlYWRlci5jaGFubmVscywgbVdyaXRlSGVhZGVyLmJpdHNfcGVyX3NhbXBsZSk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICAvLyBhY3F1aXJlIGEgbWVkaWEgYnVmZmVyCiAgICAgQ0hFQ0sobUdyb3VwICE9IE5VTEwpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcAppbmRleCBhN2NhM2RhLi41NjVmMTU2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcApAQCAtMTQsNiArMTQsMTAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRmlsZVNvdXJjZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgpAQCAtMTA3LDcgKzExMSw3IEBACiAgICB9IGVsc2UgewogICAgICAgICBvZmY2NF90IHJlc3VsdCA9IGxzZWVrNjQobUZkLCBvZmZzZXQgKyBtT2Zmc2V0LCBTRUVLX1NFVCk7CiAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzZWVrIHRvICVsbGQgZmFpbGVkIiwgb2Zmc2V0ICsgbU9mZnNldCk7CisgICAgICAgICAgICBBTE9HRSgic2VlayB0byAlbGxkIGZhaWxlZCIsIChsb25nIGxvbmcpKG9mZnNldCArIG1PZmZzZXQpKTsKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNzg3MGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuY3BwCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkZyYW1lUmVuZGVyVHJhY2tlciIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworRnJhbWVSZW5kZXJUcmFja2VyOjpGcmFtZVJlbmRlclRyYWNrZXIoKQorICAgIDogbUxhc3RSZW5kZXJUaW1lTnMoLTEpLAorICAgICAgbUNvbXBvbmVudE5hbWUoInVua25vd24gY29tcG9uZW50IikgeworfQorCitGcmFtZVJlbmRlclRyYWNrZXI6On5GcmFtZVJlbmRlclRyYWNrZXIoKSB7Cit9CisKK3ZvaWQgRnJhbWVSZW5kZXJUcmFja2VyOjpzZXRDb21wb25lbnROYW1lKGNvbnN0IEFTdHJpbmcgJmNvbXBvbmVudE5hbWUpIHsKKyAgICBtQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWU7Cit9CisKK3ZvaWQgRnJhbWVSZW5kZXJUcmFja2VyOjpjbGVhcihuc2Vjc190IGxhc3RSZW5kZXJUaW1lTnMpIHsKKyAgICBtUmVuZGVyUXVldWUuY2xlYXIoKTsKKyAgICBtTGFzdFJlbmRlclRpbWVOcyA9IGxhc3RSZW5kZXJUaW1lTnM7Cit9CisKK3ZvaWQgRnJhbWVSZW5kZXJUcmFja2VyOjpvbkZyYW1lUXVldWVkKAorICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzLCBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmZ3JhcGhpY0J1ZmZlciwgY29uc3Qgc3A8RmVuY2U+ICZmZW5jZSkgeworICAgIG1SZW5kZXJRdWV1ZS5lbXBsYWNlX2JhY2sobWVkaWFUaW1lVXMsIGdyYXBoaWNCdWZmZXIsIGZlbmNlKTsKK30KKworRnJhbWVSZW5kZXJUcmFja2VyOjpJbmZvICpGcmFtZVJlbmRlclRyYWNrZXI6OnVwZGF0ZUluZm9Gb3JEZXF1ZXVlZEJ1ZmZlcigKKyAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYnVmLCBpbnQgZmVuY2VGZCwgaW50IGluZGV4KSB7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBzZWUgaWYgdGhpcyBpcyBhIGJ1ZmZlciB0aGF0IHdhcyB0byBiZSByZW5kZXJlZAorICAgIHN0ZDo6bGlzdDxJbmZvPjo6aXRlcmF0b3IgcmVuZGVySW5mbyA9IG1SZW5kZXJRdWV1ZS5lbmQoKTsKKyAgICBmb3IgKHN0ZDo6bGlzdDxJbmZvPjo6aXRlcmF0b3IgaXQgPSBtUmVuZGVyUXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgIGl0ICE9IG1SZW5kZXJRdWV1ZS5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoaXQtPm1HcmFwaGljQnVmZmVyLT5oYW5kbGUgPT0gYnVmLT5oYW5kbGUpIHsKKyAgICAgICAgICAgIHJlbmRlckluZm8gPSBpdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChyZW5kZXJJbmZvID09IG1SZW5kZXJRdWV1ZS5lbmQoKSkgeworICAgICAgICAvLyBjb3VsZCBoYXZlIGJlZW4gY2FuY2VsZWQgYWZ0ZXIgZmVuY2UgaGFzIHNpZ25hbGVkCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChyZW5kZXJJbmZvLT5tSW5kZXggPj0gMCkgeworICAgICAgICAvLyBidWZmZXIgaGFzIGJlZW4gZGVxdWV1ZWQgYmVmb3JlLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGRvCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIHdhcyB0aGlzIGZyYW1lIGRyb3BwZWQgKHdlIGNvdWxkIGFsc28gaW5mZXIgdGhpcyBpZiB0aGUgZmVuY2UgaXMgaW52YWxpZCBvciBhIGR1cCBvZgorICAgIC8vIHRoZSBxdWV1ZWQgZmVuY2U7IGhvd2V2ZXIsIHRoZXJlIGlzIG5vIHdheSB0byBmaWd1cmUgdGhhdCBvdXQuKQorICAgIGlmIChmZW5jZUZkIDwgMCkgeworICAgICAgICAvLyBmcmFtZSBpcyBuZXcgb3Igd2FzIGRyb3BwZWQKKyAgICAgICAgbVJlbmRlclF1ZXVlLmVyYXNlKHJlbmRlckluZm8pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBzdG9yZSBkZXF1ZXVlIGZlbmNlIGFuZCBidWZmZXIgaW5kZXgKKyAgICByZW5kZXJJbmZvLT5tRmVuY2UgPSBuZXcgRmVuY2UoOjpkdXAoZmVuY2VGZCkpOworICAgIHJlbmRlckluZm8tPm1JbmRleCA9IGluZGV4OworICAgIHJldHVybiAmKnJlbmRlckluZm87Cit9CisKK3N0YXR1c190IEZyYW1lUmVuZGVyVHJhY2tlcjo6b25GcmFtZVJlbmRlcmVkKGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3Qgc3lzdGVtTmFubykgeworICAgIC8vIGVuc3VyZSBtb25vdG9uaWMgdGltZXN0YW1wcworICAgIGlmIChtTGFzdFJlbmRlclRpbWVOcyA+PSBzeXN0ZW1OYW5vKSB7CisgICAgICAgIEFMT0dXKCJbJXNdIElnbm9yaW5nIG91dCBvZiBvcmRlci9zdGFsZSBzeXN0ZW0gbmFubyAlbGxkIGZvciBtZWRpYSB0aW1lICVsbGQgZnJvbSBjb2RlYy4iLAorICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIChsb25nIGxvbmcpc3lzdGVtTmFubywgKGxvbmcgbG9uZyltZWRpYVRpbWVVcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CisgICAgaWYgKHN5c3RlbU5hbm8gPiBub3cpIHsKKyAgICAgICAgQUxPR1coIlslc10gSWdub3Jpbmcgc3lzdGVtIG5hbm8gJWxsZCBpbiB0aGUgZnV0dXJlIGZvciBtZWRpYSB0aW1lICVsbGQgZnJvbSBjb2RlYy4iLAorICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIChsb25nIGxvbmcpc3lzdGVtTmFubywgKGxvbmcgbG9uZyltZWRpYVRpbWVVcyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtUmVuZGVyUXVldWUuZW1wbGFjZV9iYWNrKG1lZGlhVGltZVVzLCBzeXN0ZW1OYW5vKTsKKyAgICBtTGFzdFJlbmRlclRpbWVOcyA9IHN5c3RlbU5hbm87CisgICAgcmV0dXJuIE9LOworfQorCitzdGQ6Omxpc3Q8RnJhbWVSZW5kZXJUcmFja2VyOjpJbmZvPiBGcmFtZVJlbmRlclRyYWNrZXI6OmNoZWNrRmVuY2VzQW5kR2V0UmVuZGVyZWRGcmFtZXMoCisgICAgICAgIGNvbnN0IEZyYW1lUmVuZGVyVHJhY2tlcjo6SW5mbyAqdW50aWwsIGJvb2wgZHJvcEluY29tcGxldGUpIHsKKyAgICBzdGQ6Omxpc3Q8SW5mbz4gZG9uZTsKKworICAgIC8vIGNvbXBsZXRlIGFueSBmcmFtZXMgcXVldWVkIHByaW9yIHRvIHRoaXMgYW5kIGRyb3AgYW55IGluY29tcGxldGUgb25lcyBpZiByZXF1ZXN0ZWQKKyAgICBmb3IgKHN0ZDo6bGlzdDxJbmZvPjo6aXRlcmF0b3IgaXQgPSBtUmVuZGVyUXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgIGl0ICE9IG1SZW5kZXJRdWV1ZS5lbmQoKTsgKSB7CisgICAgICAgIGJvb2wgZHJvcCA9IGZhbHNlOyAvLyB3aGV0aGVyIHRvIGRyb3AgZWFjaCBmcmFtZQorICAgICAgICBpZiAoaXQtPm1JbmRleCA8IDApIHsKKyAgICAgICAgICAgIC8vIGZyYW1lIG5vdCB5ZXQgZGVxdWV1ZWQgKG9yIGFscmVhZHkgcmVuZGVyZWQgb24gYSB0dW5uZWxlZCBzdXJmYWNlKQorICAgICAgICAgICAgZHJvcCA9IGRyb3BJbmNvbXBsZXRlOworICAgICAgICB9IGVsc2UgaWYgKGl0LT5tRmVuY2UgIT0gTlVMTCkgeworICAgICAgICAgICAgLy8gY2hlY2sgaWYgZmVuY2Ugc2lnbmFsZWQKKyAgICAgICAgICAgIG5zZWNzX3Qgc2lnbmFsVGltZSA9IGl0LT5tRmVuY2UtPmdldFNpZ25hbFRpbWUoKTsKKyAgICAgICAgICAgIGlmIChzaWduYWxUaW1lIDwgMCkgeyAvLyBpbnZhbGlkIGZlbmNlCisgICAgICAgICAgICAgICAgZHJvcCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNpZ25hbFRpbWUgPT0gSU5UNjRfTUFYKSB7IC8vIHVuc2lnbmFsZWQgZmVuY2UKKyAgICAgICAgICAgICAgICBkcm9wID0gZHJvcEluY29tcGxldGU7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBzaWduYWxlZAorICAgICAgICAgICAgICAgIC8vIHNhdmUgcmVuZGVyIHRpbWUKKyAgICAgICAgICAgICAgICBpdC0+bUZlbmNlLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgaXQtPm1SZW5kZXJUaW1lTnMgPSBzaWduYWxUaW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJvb2wgZm91bmRGcmFtZSA9IChJbmZvICopJippdCA9PSB1bnRpbDsKKworICAgICAgICAvLyBSZXR1cm4gZnJhbWVzIHdpdGggc2lnbmFsZWQgZmVuY2VzIGF0IHRoZSBzdGFydCBvZiB0aGUgcXVldWUsIGFzIHRoZXkgYXJlCisgICAgICAgIC8vIGluIHN1Ym1pdCBvcmRlciwgYW5kIHdlIGRvbid0IGhhdmUgdG8gd2FpdCBmb3IgYW55IGluLWJldHdlZW4gZnJhbWVzLgorICAgICAgICAvLyBBbHNvIHJldHVybiBhbnkgZHJvcHBlZCBmcmFtZXMuCisgICAgICAgIGlmIChkcm9wIHx8IChpdC0+bUZlbmNlID09IE5VTEwgJiYgaXQgPT0gbVJlbmRlclF1ZXVlLmJlZ2luKCkpKSB7CisgICAgICAgICAgICAvLyAodW5yZW5kZXJlZCkgZHJvcHBlZCBmcmFtZXMgaGF2ZSB0aGVpciBtUmVuZGVyVGltZU5zIHN0aWxsIHNldCB0byAtMQorICAgICAgICAgICAgZG9uZS5zcGxpY2UoZG9uZS5lbmQoKSwgbVJlbmRlclF1ZXVlLCBpdCsrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvdW5kRnJhbWUpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGRvbmU7Cit9CisKK3ZvaWQgRnJhbWVSZW5kZXJUcmFja2VyOjp1bnRyYWNrRnJhbWUoY29uc3QgRnJhbWVSZW5kZXJUcmFja2VyOjpJbmZvICppbmZvLCBzc2l6ZV90IGluZGV4KSB7CisgICAgaWYgKGluZm8gPT0gTlVMTCAmJiBpbmRleCA9PSBTU0laRV9NQVgpIHsKKyAgICAgICAgLy8gbm90aGluZyB0byBkbworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChzdGQ6Omxpc3Q8SW5mbz46Oml0ZXJhdG9yIGl0ID0gbVJlbmRlclF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICBpdCAhPSBtUmVuZGVyUXVldWUuZW5kKCk7ICkgeworICAgICAgICBpZiAoJippdCA9PSBpbmZvKSB7CisgICAgICAgICAgICBtUmVuZGVyUXVldWUuZXJhc2UoaXQrKyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaXQtPm1JbmRleCA+IGluZGV4KSB7CisgICAgICAgICAgICAgICAgLS0oaXQtPm1JbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEZyYW1lUmVuZGVyVHJhY2tlcjo6ZHVtcFJlbmRlclF1ZXVlKCkgY29uc3QgeworICAgIEFMT0dJKCJbJXNdIFJlbmRlciBRdWV1ZTogKGxhc3QgcmVuZGVyIHRpbWU6ICVsbGRucykiLAorICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgKGxvbmcgbG9uZyltTGFzdFJlbmRlclRpbWVOcyk7CisgICAgZm9yIChzdGQ6Omxpc3Q8SW5mbz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbVJlbmRlclF1ZXVlLmNiZWdpbigpOworICAgICAgICAgICAgaXQgIT0gbVJlbmRlclF1ZXVlLmNlbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoaXQtPm1GZW5jZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HSSgiICBSRU5ERVJFRDogaGFuZGxlOiAlcCwgbWVkaWEgdGltZTogJWxsZHVzLCBpbmRleDogJXpkLCByZW5kZXIgdGltZTogJWxsZG5zIiwKKyAgICAgICAgICAgICAgICAgICAgaXQtPm1HcmFwaGljQnVmZmVyID09IE5VTEwgPyBOVUxMIDogaXQtPm1HcmFwaGljQnVmZmVyLT5oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpaXQtPm1NZWRpYVRpbWVVcywgaXQtPm1JbmRleCwgKGxvbmcgbG9uZylpdC0+bVJlbmRlclRpbWVOcyk7CisgICAgICAgIH0gZWxzZSBpZiAoaXQtPm1JbmRleCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dJKCIgICAgUVVFVUVEOiBoYW5kbGU6ICVwLCBtZWRpYSB0aW1lOiAlbGxkdXMsIGZlbmNlOiAlcyIsCisgICAgICAgICAgICAgICAgICAgIGl0LT5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlLCAobG9uZyBsb25nKWl0LT5tTWVkaWFUaW1lVXMsCisgICAgICAgICAgICAgICAgICAgIGl0LT5tRmVuY2UtPmlzVmFsaWQoKSA/ICJZRVMiIDogIk5PIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HSSgiICBERVFVRVVFRDogaGFuZGxlOiAlcCwgbWVkaWEgdGltZTogJWxsZHVzLCBpbmRleDogJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgaXQtPm1HcmFwaGljQnVmZmVyLT5oYW5kbGUsIChsb25nIGxvbmcpaXQtPm1NZWRpYVRpbWVVcywgaXQtPm1JbmRleCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAKaW5kZXggMGMyZmYxNS4uMDY4YTc3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcApAQCAtMzQsMTAgKzM0LDEwIEBACiAgICAgOiBtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zKDApLAogICAgICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMoMCksCiAgICAgICBtVG90YWxUcmFuc2ZlckJ5dGVzKDApLAorICAgICAgbU1heEJhbmR3aWR0aEhpc3RvcnlJdGVtcygxMDApLAogICAgICAgbVByZXZCYW5kd2lkdGhNZWFzdXJlVGltZVVzKDApLAogICAgICAgbVByZXZFc3RpbWF0ZWRCYW5kV2lkdGhLYnBzKDApLAotICAgICAgbUJhbmRXaWR0aENvbGxlY3RGcmVxTXMoNTAwMCksCi0gICAgICBtTWF4QmFuZHdpZHRoSGlzdG9yeUl0ZW1zKDEwMCkgeworICAgICAgbUJhbmRXaWR0aENvbGxlY3RGcmVxTXMoNTAwMCkgewogfQogCiB2b2lkIEhUVFBCYXNlOjphZGRCYW5kd2lkdGhNZWFzdXJlbWVudCgKQEAgLTc1LDcgKzc1LDExIEBACiBib29sIEhUVFBCYXNlOjplc3RpbWF0ZUJhbmR3aWR0aChpbnQzMl90ICpiYW5kd2lkdGhfYnBzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIGlmIChtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zIDwgMikgeworICAgIC8vIERvIG5vdCBkbyBiYW5kd2lkdGggZXN0aW1hdGlvbiBpZiB3ZSBkb24ndCBoYXZlIGVub3VnaCBzYW1wbGVzLCBvcgorICAgIC8vIHRvdGFsIGJ5dGVzIGRvd25sb2FkIGFyZSB0b28gc21hbGwgKDw2NEspLgorICAgIC8vIEJhbmR3aWR0aCBlc3RpbWF0aW9uIGZyb20gdGhlc2Ugc2FtcGxlcyBjYW4gb2Z0ZW4gc2hvb3QgdXAgYW5kIGNhdXNlCisgICAgLy8gdW53YW50ZWQgYncgYWRhcHRpb24gYmVoYXZpb3JzLgorICAgIGlmIChtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zIDwgMiB8fCBtVG90YWxUcmFuc2ZlckJ5dGVzIDwgNjU1MzYpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVAzRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QM0V4dHJhY3Rvci5jcHAKaW5kZXggNGE2MzE1MjYuLjJlNTRlOGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QM0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVAzRXh0cmFjdG9yLmNwcApAQCAtODIsNyArODIsNyBAQAogICAgICAgICAgICAgKmlub3V0X3BvcyArPSBsZW47CiAKICAgICAgICAgICAgIEFMT0dWKCJza2lwcGVkIElEMyB0YWcsIG5ldyBzdGFydGluZyBvZmZzZXQgaXMgJWxsZCAoMHglMDE2bGx4KSIsCi0gICAgICAgICAgICAgICAgICppbm91dF9wb3MsICppbm91dF9wb3MpOworICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSppbm91dF9wb3MsIChsb25nIGxvbmcpKmlub3V0X3Bvcyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAocG9zdF9pZDNfcG9zICE9IE5VTEwpIHsKQEAgLTEwMyw5ICsxMDMsOSBAQAogICAgIHVpbnQ4X3QgKnRtcCA9IGJ1ZjsKIAogICAgIGRvIHsKLSAgICAgICAgaWYgKHBvcyA+PSAqaW5vdXRfcG9zICsga01heEJ5dGVzQ2hlY2tlZCkgeworICAgICAgICBpZiAocG9zID49IChvZmY2NF90KSgqaW5vdXRfcG9zICsga01heEJ5dGVzQ2hlY2tlZCkpIHsKICAgICAgICAgICAgIC8vIERvbid0IHNjYW4gZm9yZXZlci4KLSAgICAgICAgICAgIEFMT0dWKCJnaXZpbmcgdXAgYXQgb2Zmc2V0ICVsbGQiLCBwb3MpOworICAgICAgICAgICAgQUxPR1YoImdpdmluZyB1cCBhdCBvZmZzZXQgJWxsZCIsIChsb25nIGxvbmcpcG9zKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE1NSw3ICsxNTUsNyBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBBTE9HVigiZm91bmQgcG9zc2libGUgMXN0IGZyYW1lIGF0ICVsbGQgKGhlYWRlciA9IDB4JTA4eCkiLCBwb3MsIGhlYWRlcik7CisgICAgICAgIEFMT0dWKCJmb3VuZCBwb3NzaWJsZSAxc3QgZnJhbWUgYXQgJWxsZCAoaGVhZGVyID0gMHglMDh4KSIsIChsb25nIGxvbmcpcG9zLCBoZWFkZXIpOwogCiAgICAgICAgIC8vIFdlIGZvdW5kIHdoYXQgbG9va3MgbGlrZSBhIHZhbGlkIGZyYW1lLAogICAgICAgICAvLyBub3cgZmluZCBpdHMgc3VjY2Vzc29ycy4KQEAgLTE4Niw3ICsxODYsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBBTE9HVigiZm91bmQgc3Vic2VxdWVudCBmcmFtZSAjJWQgYXQgJWxsZCIsIGogKyAyLCB0ZXN0X3Bvcyk7CisgICAgICAgICAgICBBTE9HVigiZm91bmQgc3Vic2VxdWVudCBmcmFtZSAjJWQgYXQgJWxsZCIsIGogKyAyLCAobG9uZyBsb25nKXRlc3RfcG9zKTsKIAogICAgICAgICAgICAgdGVzdF9wb3MgKz0gdGVzdF9mcmFtZV9zaXplOwogICAgICAgICB9CkBAIC0yODIsNiArMjgyLDQxIEBACiAKICAgICBtRmlyc3RGcmFtZVBvcyA9IHBvczsKICAgICBtRml4ZWRIZWFkZXIgPSBoZWFkZXI7CisgICAgbU1ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgc3A8WElOR1NlZWtlcj4gc2Vla2VyID0gWElOR1NlZWtlcjo6Q3JlYXRlRnJvbVNvdXJjZShtRGF0YVNvdXJjZSwgbUZpcnN0RnJhbWVQb3MpOworCisgICAgaWYgKHNlZWtlciA9PSBOVUxMKSB7CisgICAgICAgIG1TZWVrZXIgPSBWQlJJU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKG1EYXRhU291cmNlLCBwb3N0X2lkM19wb3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TZWVrZXIgPSBzZWVrZXI7CisgICAgICAgIGludCBlbmNkID0gc2Vla2VyLT5nZXRFbmNvZGVyRGVsYXkoKTsKKyAgICAgICAgaW50IGVuY3AgPSBzZWVrZXItPmdldEVuY29kZXJQYWRkaW5nKCk7CisgICAgICAgIGlmIChlbmNkICE9IDAgfHwgZW5jcCAhPSAwKSB7CisgICAgICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleUVuY29kZXJEZWxheSwgZW5jZCk7CisgICAgICAgICAgICBtTWV0YS0+c2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBlbmNwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtU2Vla2VyICE9IE5VTEwpIHsKKyAgICAgICAgLy8gV2hpbGUgaXQgaXMgc2FmZSB0byBzZW5kIHRoZSBYSU5HL1ZCUkkgZnJhbWUgdG8gdGhlIGRlY29kZXIsIHRoaXMgd2lsbAorICAgICAgICAvLyByZXN1bHQgaW4gYW4gZXh0cmEgMTE1MiBzYW1wbGVzIGJlaW5nIG91dHB1dC4gSW4gYWRkaXRpb24sIHRoZSBiaXRyYXRlCisgICAgICAgIC8vIG9mIHRoZSBYaW5nIGhlYWRlciBtaWdodCBub3QgbWF0Y2ggdGhlIHJlc3Qgb2YgdGhlIGZpbGUsIHdoaWNoIGNvdWxkCisgICAgICAgIC8vIGxlYWQgdG8gcHJvYmxlbXMgd2hlbiBzZWVraW5nLiBUaGUgcmVhbCBmaXJzdCBmcmFtZSB0byBkZWNvZGUgaXMgYWZ0ZXIKKyAgICAgICAgLy8gdGhlIFhJTkcvVkJSSSBmcmFtZSwgc28gc2tpcCB0aGVyZS4KKyAgICAgICAgc2l6ZV90IGZyYW1lX3NpemU7CisgICAgICAgIGludCBzYW1wbGVfcmF0ZTsKKyAgICAgICAgaW50IG51bV9jaGFubmVsczsKKyAgICAgICAgaW50IGJpdHJhdGU7CisgICAgICAgIEdldE1QRUdBdWRpb0ZyYW1lU2l6ZSgKKyAgICAgICAgICAgICAgICBoZWFkZXIsICZmcmFtZV9zaXplLCAmc2FtcGxlX3JhdGUsICZudW1fY2hhbm5lbHMsICZiaXRyYXRlKTsKKyAgICAgICAgcG9zICs9IGZyYW1lX3NpemU7CisgICAgICAgIGlmICghUmVzeW5jKG1EYXRhU291cmNlLCAwLCAmcG9zLCAmcG9zdF9pZDNfcG9zLCAmaGVhZGVyKSkgeworICAgICAgICAgICAgLy8gbUluaXRDaGVjayB3aWxsIHJlbWFpbiBOT19JTklUCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUZpcnN0RnJhbWVQb3MgPSBwb3M7CisgICAgICAgIG1GaXhlZEhlYWRlciA9IGhlYWRlcjsKKyAgICB9CiAKICAgICBzaXplX3QgZnJhbWVfc2l6ZTsKICAgICBpbnQgc2FtcGxlX3JhdGU7CkBAIC0yOTIsOCArMzI3LDYgQEAKIAogICAgIHVuc2lnbmVkIGxheWVyID0gNCAtICgoaGVhZGVyID4+IDE3KSAmIDMpOwogCi0gICAgbU1ldGEgPSBuZXcgTWV0YURhdGE7Ci0KICAgICBzd2l0Y2ggKGxheWVyKSB7CiAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgIG1NZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JKTsKQEAgLTMxMiwyNyArMzQ1LDYgQEAKICAgICBtTWV0YS0+c2V0SW50MzIoa0tleUJpdFJhdGUsIGJpdHJhdGUgKiAxMDAwKTsKICAgICBtTWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtX2NoYW5uZWxzKTsKIAotICAgIHNwPFhJTkdTZWVrZXI+IHNlZWtlciA9IFhJTkdTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UobURhdGFTb3VyY2UsIG1GaXJzdEZyYW1lUG9zKTsKLQotICAgIGlmIChzZWVrZXIgPT0gTlVMTCkgewotICAgICAgICBtU2Vla2VyID0gVkJSSVNlZWtlcjo6Q3JlYXRlRnJvbVNvdXJjZShtRGF0YVNvdXJjZSwgcG9zdF9pZDNfcG9zKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtU2Vla2VyID0gc2Vla2VyOwotICAgICAgICBpbnQgZW5jZCA9IHNlZWtlci0+Z2V0RW5jb2RlckRlbGF5KCk7Ci0gICAgICAgIGludCBlbmNwID0gc2Vla2VyLT5nZXRFbmNvZGVyUGFkZGluZygpOwotICAgICAgICBpZiAoZW5jZCAhPSAwIHx8IGVuY3AgIT0gMCkgewotICAgICAgICAgICAgbU1ldGEtPnNldEludDMyKGtLZXlFbmNvZGVyRGVsYXksIGVuY2QpOwotICAgICAgICAgICAgbU1ldGEtPnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgZW5jcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobVNlZWtlciAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIFdoaWxlIGl0IGlzIHNhZmUgdG8gc2VuZCB0aGUgWElORy9WQlJJIGZyYW1lIHRvIHRoZSBkZWNvZGVyLCB0aGlzIHdpbGwKLSAgICAgICAgLy8gcmVzdWx0IGluIGFuIGV4dHJhIDExNTIgc2FtcGxlcyBiZWluZyBvdXRwdXQuIFRoZSByZWFsIGZpcnN0IGZyYW1lIHRvCi0gICAgICAgIC8vIGRlY29kZSBpcyBhZnRlciB0aGUgWElORy9WQlJJIGZyYW1lLCBzbyBza2lwIHRoZXJlLgotICAgICAgICBtRmlyc3RGcmFtZVBvcyArPSBmcmFtZV9zaXplOwotICAgIH0KLQogICAgIGludDY0X3QgZHVyYXRpb25VczsKIAogICAgIGlmIChtU2Vla2VyID09IE5VTEwgfHwgIW1TZWVrZXItPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcAppbmRleCA5ODU2ZjkyLi5lZjA3YWEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcApAQCAtMTM1LDcgKzEzNSw3IEBACiAKICAgICBtTm90aWZ5ID0gbm90aWZ5OwogCi0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIHRoaXMpKS0+cG9zdCgpOwogfQogCiB2b2lkIE1QRUcyVFNXcml0ZXI6OlNvdXJjZUluZm86OnN0b3AoKSB7CkBAIC0zNjEsNyArMzYxLDcgQEAKIH0KIAogdm9pZCBNUEVHMlRTV3JpdGVyOjpTb3VyY2VJbmZvOjpyZWFkTW9yZSgpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVhZCwgaWQoKSkpLT5wb3N0KCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlYWQsIHRoaXMpKS0+cG9zdCgpOwogfQogCiB2b2lkIE1QRUcyVFNXcml0ZXI6OlNvdXJjZUluZm86Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CkBAIC00ODAsMTkgKzQ4MCw2IEBACiAgICAgaW5pdCgpOwogfQogCi1NUEVHMlRTV3JpdGVyOjpNUEVHMlRTV3JpdGVyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotICAgIDogbUZpbGUoZm9wZW4oZmlsZW5hbWUsICJ3YiIpKSwKLSAgICAgIG1Xcml0ZUNvb2tpZShOVUxMKSwKLSAgICAgIG1Xcml0ZUZ1bmMoTlVMTCksCi0gICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtTnVtU291cmNlc0RvbmUoMCksCi0gICAgICBtTnVtVFNQYWNrZXRzV3JpdHRlbigwKSwKLSAgICAgIG1OdW1UU1BhY2tldHNCZWZvcmVNZXRhKDApLAotICAgICAgbVBBVENvbnRpbnVpdHlDb3VudGVyKDApLAotICAgICAgbVBNVENvbnRpbnVpdHlDb3VudGVyKDApIHsKLSAgICBpbml0KCk7Ci19Ci0KIE1QRUcyVFNXcml0ZXI6Ok1QRUcyVFNXcml0ZXIoCiAgICAgICAgIHZvaWQgKmNvb2tpZSwKICAgICAgICAgc3NpemVfdCAoKndyaXRlKSh2b2lkICpjb29raWUsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSkKQEAgLTU2NSw3ICs1NTIsNyBAQAogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU291cmNlcy5zaXplKCk7ICsraSkgewogICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0KLSAgICAgICAgICAgIG5ldyBBTWVzc2FnZShrV2hhdFNvdXJjZU5vdGlmeSwgbVJlZmxlY3Rvci0+aWQoKSk7CisgICAgICAgICAgICBuZXcgQU1lc3NhZ2Uoa1doYXRTb3VyY2VOb3RpZnksIG1SZWZsZWN0b3IpOwogCiAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNvdXJjZS1pbmRleCIsIGkpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCAzNGVmYjdlLi5kN2U3YzJmCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0RXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNEV4dHJhY3Rvci5jcHAKQEAgLTM2NCw2ICszNjQsOCBAQAogCiBNUEVHNEV4dHJhY3Rvcjo6TVBFRzRFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkKICAgICA6IG1Nb29mT2Zmc2V0KDApLAorICAgICAgbU1vb2ZGb3VuZChmYWxzZSksCisgICAgICBtTWRhdEZvdW5kKGZhbHNlKSwKICAgICAgIG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgbUhhc1ZpZGVvKGZhbHNlKSwKQEAgLTUwMCw3ICs1MDIsOSBAQAogCiAgICAgb2ZmNjRfdCBvZmZzZXQgPSAwOwogICAgIHN0YXR1c190IGVycjsKLSAgICB3aGlsZSAodHJ1ZSkgeworICAgIGJvb2wgc2F3TW9vdk9yU2lkeCA9IGZhbHNlOworCisgICAgd2hpbGUgKCEoc2F3TW9vdk9yU2lkeCAmJiAobU1kYXRGb3VuZCB8fCBtTW9vZkZvdW5kKSkpIHsKICAgICAgICAgb2ZmNjRfdCBvcmlnX29mZnNldCA9IG9mZnNldDsKICAgICAgICAgZXJyID0gcGFyc2VDaHVuaygmb2Zmc2V0LCAwKTsKIApAQCAtNTA5LDI2ICs1MTMsMTIgQEAKICAgICAgICAgfSBlbHNlIGlmIChvZmZzZXQgPD0gb3JpZ19vZmZzZXQpIHsKICAgICAgICAgICAgIC8vIG9ubHkgY29udGludWUgcGFyc2luZyBpZiB0aGUgb2Zmc2V0IHdhcyBhZHZhbmNlZCwKICAgICAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBtaWdodCBlbmQgdXAgaW4gYW4gaW5maW5pdGUgbG9vcAotICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgYWR2YW5jZTogMHglbGxkLT4weCVsbGQiLCBvcmlnX29mZnNldCwgb2Zmc2V0KTsKKyAgICAgICAgICAgIEFMT0dFKCJkaWQgbm90IGFkdmFuY2U6ICVsbGQtPiVsbGQiLCAobG9uZyBsb25nKW9yaWdfb2Zmc2V0LCAobG9uZyBsb25nKW9mZnNldCk7CiAgICAgICAgICAgICBlcnIgPSBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBVTktOT1dOX0VSUk9SKSB7CisgICAgICAgICAgICBzYXdNb292T3JTaWR4ID0gdHJ1ZTsKICAgICAgICAgfQotCi0gICAgICAgIHVpbnQzMl90IGhkclsyXTsKLSAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBoZHIsIDgpIDwgOCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDMyX3QgY2h1bmtfdHlwZSA9IG50b2hsKGhkclsxXSk7Ci0gICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAnZicpKSB7Ci0gICAgICAgICAgICAvLyBzdG9yZSB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBzZWdtZW50Ci0gICAgICAgICAgICBtTW9vZk9mZnNldCA9IG9mZnNldDsKLSAgICAgICAgfSBlbHNlIGlmIChjaHVua190eXBlICE9IEZPVVJDQygnbScsICdkJywgJ2EnLCAndCcpKSB7Ci0gICAgICAgICAgICAvLyBrZWVwIHBhcnNpbmcgdW50aWwgd2UgZ2V0IHRvIHRoZSBkYXRhCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKICAgICB9CiAKICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewpAQCAtNTQ1LDExICs1MzUsMTEgQEAKICAgICBDSEVDS19ORShlcnIsIChzdGF0dXNfdClOT19JTklUKTsKIAogICAgIC8vIGNvcHkgcHNzaCBkYXRhIGludG8gZmlsZSBtZXRhZGF0YQotICAgIGludCBwc3Noc2l6ZSA9IDA7CisgICAgdWludDY0X3QgcHNzaHNpemUgPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBzc2guc2l6ZSgpOyBpKyspIHsKICAgICAgICAgcHNzaHNpemUgKz0gMjAgKyBtUHNzaFtpXS5kYXRhbGVuOwogICAgIH0KLSAgICBpZiAocHNzaHNpemUpIHsKKyAgICBpZiAocHNzaHNpemUgPiAwICYmIHBzc2hzaXplIDw9IFVJTlQzMl9NQVgpIHsKICAgICAgICAgY2hhciAqYnVmID0gKGNoYXIqKW1hbGxvYyhwc3Noc2l6ZSk7CiAgICAgICAgIGlmICghYnVmKSB7CiAgICAgICAgICAgICBBTE9HRSgiYi8yODQ3MTIwNiIpOwpAQCAtNzYzLDYgKzc1MywxNyBAQAogICAgICAgICAmJiBwYXRoWzNdID09IEZPVVJDQygnaScsICdsJywgJ3MnLCAndCcpOwogfQogCitzdGF0aWMgYm9vbCB1bmRlclFUTWV0YVBhdGgoY29uc3QgVmVjdG9yPHVpbnQzMl90PiAmcGF0aCwgaW50MzJfdCBkZXB0aCkgeworICAgIHJldHVybiBwYXRoLnNpemUoKSA+PSAyCisgICAgICAgICAgICAmJiBwYXRoWzBdID09IEZPVVJDQygnbScsICdvJywgJ28nLCAndicpCisgICAgICAgICAgICAmJiBwYXRoWzFdID09IEZPVVJDQygnbScsICdlJywgJ3QnLCAnYScpCisgICAgICAgICAgICAmJiAoZGVwdGggPT0gMgorICAgICAgICAgICAgfHwgKGRlcHRoID09IDMKKyAgICAgICAgICAgICAgICAgICAgJiYgKHBhdGhbMl0gPT0gRk9VUkNDKCdoJywgJ2QnLCAnbCcsICdyJykKKyAgICAgICAgICAgICAgICAgICAgfHwgIHBhdGhbMl0gPT0gRk9VUkNDKCdpJywgJ2wnLCAncycsICd0JykKKyAgICAgICAgICAgICAgICAgICAgfHwgIHBhdGhbMl0gPT0gRk9VUkNDKCdrJywgJ2UnLCAneScsICdzJykpKSk7Cit9CisKIC8vIEdpdmVuIGEgdGltZSBpbiBzZWNvbmRzIHNpbmNlIEphbiAxIDE5MDQsIHByb2R1Y2UgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcuCiBzdGF0aWMgdm9pZCBjb252ZXJ0VGltZVRvRGF0ZShpbnQ2NF90IHRpbWVfMTkwNCwgU3RyaW5nOCAqcykgewogICAgIHRpbWVfdCB0aW1lXzE5NzAgPSB0aW1lXzE5MDQgLSAoKCg2NiAqIDM2NSArIDE3KSAqIDI0KSAqIDM2MDApOwpAQCAtNzc0LDcgKzc3NSw3IEBACiB9CiAKIHN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCwgaW50IGRlcHRoKSB7Ci0gICAgQUxPR1YoImVudGVyaW5nIHBhcnNlQ2h1bmsgJWxsZC8lZCIsICpvZmZzZXQsIGRlcHRoKTsKKyAgICBBTE9HVigiZW50ZXJpbmcgcGFyc2VDaHVuayAlbGxkLyVkIiwgKGxvbmcgbG9uZykqb2Zmc2V0LCBkZXB0aCk7CiAgICAgdWludDMyX3QgaGRyWzJdOwogICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQsIGhkciwgOCkgPCA4KSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKQEAgLTgxOCw3ICs4MTksNyBAQAogCiAgICAgY2hhciBjaHVua1s1XTsKICAgICBNYWtlRm91ckNDU3RyaW5nKGNodW5rX3R5cGUsIGNodW5rKTsKLSAgICBBTE9HVigiY2h1bms6ICVzIEAgJWxsZCwgJWQiLCBjaHVuaywgKm9mZnNldCwgZGVwdGgpOworICAgIEFMT0dWKCJjaHVuazogJXMgQCAlbGxkLCAlZCIsIGNodW5rLCAobG9uZyBsb25nKSpvZmZzZXQsIGRlcHRoKTsKIAogICAgIGlmIChrVXNlSGV4RHVtcCkgewogICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBrV2hpdGVzcGFjZVtdID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOwpAQCAtODg1LDYgKzg4NiwxMiBAQAogICAgICAgICBjYXNlIEZPVVJDQygncycsICdjJywgJ2gnLCAnaScpOgogICAgICAgICBjYXNlIEZPVVJDQygnZScsICdkJywgJ3QnLCAncycpOgogICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSAmJiAhbU1vb2ZGb3VuZCkgeworICAgICAgICAgICAgICAgIC8vIHN0b3JlIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IHNlZ21lbnQKKyAgICAgICAgICAgICAgICBtTW9vZkZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtTW9vZk9mZnNldCA9ICpvZmZzZXQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygncycsICd0JywgJ2InLCAnbCcpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNhbXBsZVRhYmxlIGNodW5rIGlzICUiIFBSSXU2NCAiIGJ5dGVzIGxvbmcuIiwgY2h1bmtfc2l6ZSk7CiAKQEAgLTg5OSw2ICs5MDYsOSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID0gbmV3IFNhbXBsZVRhYmxlKG1EYXRhU291cmNlKTsKICAgICAgICAgICAgIH0KIApAQCAtMTA1OCw2ICsxMDY4LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvcmlnaW5hbF9mb3VyY2MgPSBudG9obChvcmlnaW5hbF9mb3VyY2MpOwogICAgICAgICAgICAgQUxPR1YoInJlYWQgb3JpZ2luYWwgZm9ybWF0OiAlZCIsIG9yaWdpbmFsX2ZvdXJjYyk7CisKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIEZvdXJDQzJNSU1FKG9yaWdpbmFsX2ZvdXJjYykpOwogICAgICAgICAgICAgdWludDMyX3QgbnVtX2NoYW5uZWxzID0gMDsKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZV9yYXRlID0gMDsKQEAgLTExMTMsNiArMTEyNyw5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlDcnlwdG9Nb2RlLCBkZWZhdWx0QWxnb3JpdGhtSWQpOwogICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0SW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsIGRlZmF1bHRJVlNpemUpOwogICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAndGVuYycsIGRlZmF1bHRLZXlJZCwgMTYpOwpAQCAtMTE0Nyw3ICsxMTY0LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBzc2guZGF0YWxlbiA9IG50b2hsKHBzc2hkYXRhbGVuKTsKICAgICAgICAgICAgIEFMT0dWKCJwc3NoIGRhdGEgc2l6ZTogJWQiLCBwc3NoLmRhdGFsZW4pOwotICAgICAgICAgICAgaWYgKHBzc2guZGF0YWxlbiArIDIwID4gY2h1bmtfc2l6ZSkgeworICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgPCAyMCB8fCBwc3NoLmRhdGFsZW4gPiBjaHVua19zaXplIC0gMjApIHsKICAgICAgICAgICAgICAgICAvLyBwc3NoIGRhdGEgbGVuZ3RoIGV4Y2VlZHMgc2l6ZSBvZiBjb250YWluaW5nIGJveAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CkBAIC0xMjI4LDcgKzEyNDUsNyBAQAogICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IG50b2hsKGR1cmF0aW9uMzIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkdXJhdGlvbiAhPSAwKSB7CisgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtTGFzdFRyYWNrLT50aW1lc2NhbGUgIT0gMCkgewogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDY0KAogICAgICAgICAgICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1MYXN0VHJhY2stPnRpbWVzY2FsZSk7CiAgICAgICAgICAgICB9CkBAIC0xMjkyLDYgKzEzMDksMTAgQEAKICAgICAgICAgICAgICAgICAvLyBkaXNwbGF5IHRoZSB0aW1lZCB0ZXh0LgogICAgICAgICAgICAgICAgIC8vIEZvciBlbmNyeXB0ZWQgZmlsZXMsIHRoZXJlIG1heSBhbHNvIGJlIG1vcmUgdGhhbiBvbmUgZW50cnkuCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKworICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICAgICAgICAgICAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CiAgICAgICAgICAgICAgICAgaWYgKHN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgc3RyY2FzZWNtcChtaW1lLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIikpIHsKQEAgLTEzMzgsNiArMTM1OSw5IEBACiAgICAgICAgICAgICB1aW50MTZfdCBzYW1wbGVfc2l6ZSA9IFUxNl9BVCgmYnVmZmVyWzE4XSk7CiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVfcmF0ZSA9IFUzMl9BVCgmYnVmZmVyWzI0XSkgPj4gMTY7CiAKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgIT0gRk9VUkNDKCdlJywgJ24nLCAnYycsICdhJykpIHsKICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY2h1bmsgdHlwZSBpcyBlbmNhLCB3ZSdsbCBnZXQgdGhlIHR5cGUgZnJvbSB0aGUgc2luZi9mcm1hIGJveCBsYXRlcgogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBGb3VyQ0MyTUlNRShjaHVua190eXBlKSk7CkBAIC0xMzk5LDYgKzE0MjMsOSBAQAogICAgICAgICAgICAgLy8gcHJpbnRmKCIqKiogY29kaW5nPSclcycgd2lkdGg9JWQgaGVpZ2h0PSVkXG4iLAogICAgICAgICAgICAgLy8gICAgICAgIGNodW5rLCB3aWR0aCwgaGVpZ2h0KTsKIAorICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCiAgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSAhPSBGT1VSQ0MoJ2UnLCAnbicsICdjJywgJ3YnKSkgewogICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjaHVuayB0eXBlIGlzIGVuY3YsIHdlJ2xsIGdldCB0aGUgdHlwZSBmcm9tIHRoZSBzaW5mL2ZybWEgYm94IGxhdGVyCiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIEZvdXJDQzJNSU1FKGNodW5rX3R5cGUpKTsKQEAgLTE0MjQsNiArMTQ1MSw5IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAnYycsICdvJyk6CiAgICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ28nLCAnNicsICc0Jyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgobUxhc3RUcmFjayA9PSBOVUxMKSB8fCAobUxhc3RUcmFjay0+c2FtcGxlVGFibGUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0Q2h1bmtPZmZzZXRQYXJhbXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua190eXBlLCBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKQEAgLTE0MzksNiArMTQ2OSw5IEBACiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICdzJywgJ2MnKToKICAgICAgICAgeworICAgICAgICAgICAgaWYgKChtTGFzdFRyYWNrID09IE5VTEwpIHx8IChtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRTYW1wbGVUb0NodW5rUGFyYW1zKAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CkBAIC0xNDU1LDYgKzE0ODgsOSBAQAogICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3MnLCAneicpOgogICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3onLCAnMicpOgogICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9CiAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPnNldFNhbXBsZVNpemVQYXJhbXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua190eXBlLCBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKQEAgLTE1MzYsNiArMTU3Miw5IEBACiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICd0JywgJ3MnKToKICAgICAgICAgeworICAgICAgICAgICAgaWYgKChtTGFzdFRyYWNrID09IE5VTEwpIHx8IChtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9CkBAIC0xNTUxLDYgKzE1OTAsOSBAQAogCiAgICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ3QnLCAndCcsICdzJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgobUxhc3RUcmFjayA9PSBOVUxMKSB8fCAobUxhc3RUcmFjay0+c2FtcGxlVGFibGUgPT0gTlVMTCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQpAQCAtMTU2Niw2ICsxNjA4LDkgQEAKIAogICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3MnLCAncycpOgogICAgICAgICB7CisgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KQEAgLTE1NzksMTMgKzE2MjQsMTMgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gqXh5egorICAgICAgICAvLyBceEE5eHl6CiAgICAgICAgIGNhc2UgRk9VUkNDKDB4QTksICd4JywgJ3knLCAneicpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKLSAgICAgICAgICAgIC8vIEJlc3QgY2FzZSB0aGUgdG90YWwgZGF0YSBsZW5ndGggaW5zaWRlICKpeHl6IiBib3gKLSAgICAgICAgICAgIC8vIHdvdWxkIGJlIDgsIGZvciBpbnN0YW5jZSAiqXh5eiIgKyAiXHgwMFx4MDRceDE1XHhjNyIgKyAiMCswLyIsCisgICAgICAgICAgICAvLyBCZXN0IGNhc2UgdGhlIHRvdGFsIGRhdGEgbGVuZ3RoIGluc2lkZSAiXHhBOXh5eiIgYm94CisgICAgICAgICAgICAvLyB3b3VsZCBiZSA4LCBmb3IgaW5zdGFuY2UgIlx4QTl4eXoiICsgIlx4MDBceDA0XHgxNVx4YzciICsgIjArMC8iLAogICAgICAgICAgICAgLy8gd2hlcmUgIlx4MDBceDA0IiBpcyB0aGUgdGV4dCBzdHJpbmcgbGVuZ3RoIHdpdGggdmFsdWUgPSA0LAogICAgICAgICAgICAgLy8gIlwweDE1XHhjNyIgaXMgdGhlIGxhbmd1YWdlIGNvZGUgPSBlbiwgYW5kICIwKzAiIGlzIGEKICAgICAgICAgICAgIC8vIGxvY2F0aW9uIChzdHJpbmcpIHZhbHVlIHdpdGggbG9uZ2l0dWRlID0gMCBhbmQgbGF0aXR1ZGUgPSAwLgpAQCAtMTYzOCw2ICsxNjgzLDkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgIGtLZXlFU0RTLCBrVHlwZUVTRFMsICZidWZmZXJbNF0sIGNodW5rX2RhdGFfc2l6ZSAtIDQpOwogCkBAIC0xNjU1LDcgKzE3MDMsMTggQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVBhdGguc2l6ZSgpID49IDIKKyAgICAgICAgICAgICAgICAgICAgJiYgbVBhdGhbbVBhdGguc2l6ZSgpIC0gMl0gPT0gRk9VUkNDKCdtJywgJ3AnLCAnNCcsICd2JykpIHsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgdmlkZW8gaXMgTVBFRzIKKyAgICAgICAgICAgICAgICBFU0RTIGVzZHMoJmJ1ZmZlcls0XSwgY2h1bmtfZGF0YV9zaXplIC0gNCk7CiAKKyAgICAgICAgICAgICAgICB1aW50OF90IG9iamVjdFR5cGVJbmRpY2F0aW9uOworICAgICAgICAgICAgICAgIGlmIChlc2RzLmdldE9iamVjdFR5cGVJbmRpY2F0aW9uKCZvYmplY3RUeXBlSW5kaWNhdGlvbikgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdFR5cGVJbmRpY2F0aW9uID49IDB4NjAgJiYgb2JqZWN0VHlwZUluZGljYXRpb24gPD0gMHg2NSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE2NzUsNiArMTczNCw5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgIGtLZXlBVkNDLCBrVHlwZUFWQ0MsIGJ1ZmZlci0+ZGF0YSgpLCBjaHVua19kYXRhX3NpemUpOwogCkBAIC0xNjk0LDYgKzE3NTYsOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXREYXRhKAogICAgICAgICAgICAgICAgICAgICBrS2V5SFZDQywga1R5cGVIVkNDLCBidWZmZXItPmRhdGEoKSwgY2h1bmtfZGF0YV9zaXplKTsKIApAQCAtMTcxOCw3ICsxNzgzLDcgQEAKICAgICAgICAgICAgIGNoYXIgYnVmZmVyWzIzXTsKICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgIT0gNyAmJgogICAgICAgICAgICAgICAgIGNodW5rX2RhdGFfc2l6ZSAhPSAyMykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJJbmNvcnJlY3QgRDI2MyBib3ggc2l6ZSAlbGxkIiwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW5jb3JyZWN0IEQyNjMgYm94IHNpemUgJWxsZCIsIChsb25nIGxvbmcpY2h1bmtfZGF0YV9zaXplKTsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCkBAIC0xNzI3LDYgKzE3OTIsOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCiAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXREYXRhKGtLZXlEMjYzLCBrVHlwZUQyNjMsIGJ1ZmZlciwgY2h1bmtfZGF0YV9zaXplKTsKIAogICAgICAgICAgICAgYnJlYWs7CkBAIC0xNzM0LDMxICsxODAyLDM1IEBACiAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZScsICd0JywgJ2EnKToKICAgICAgICAgewotICAgICAgICAgICAgdWludDhfdCBidWZmZXJbNF07Ci0gICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgKG9mZjY0X3Qpc2l6ZW9mKGJ1ZmZlcikpIHsKLSAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYnVmZmVyLCA0KSA8IDQpIHsKLSAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoVTMyX0FUKGJ1ZmZlcikgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIFNob3VsZCBiZSB2ZXJzaW9uIDAsIGZsYWdzIDAuCi0KLSAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIG5vdCwgbGV0J3MgYXNzdW1lIHRoaXMgaXMgb25lIG9mIHRob3NlCi0gICAgICAgICAgICAgICAgLy8gYXBwYXJlbnRseSBtYWxmb3JtZWQgY2h1bmtzIHRoYXQgZG9uJ3QgaGF2ZSBmbGFncwotICAgICAgICAgICAgICAgIC8vIGFuZCBjb21wbGV0ZWx5IGRpZmZlcmVudCBzZW1hbnRpY3MgdGhhbiB3aGF0J3MKLSAgICAgICAgICAgICAgICAvLyBpbiB0aGUgTVBFRzQgc3BlY3MgYW5kIHNraXAgaXQuCi0gICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgb2ZmNjRfdCBzdG9wX29mZnNldCA9ICpvZmZzZXQgKyBjaHVua19zaXplOwotICAgICAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0ICsgc2l6ZW9mKGJ1ZmZlcik7CisgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CisgICAgICAgICAgICBib29sIGlzUGFyc2luZ01ldGFLZXlzID0gdW5kZXJRVE1ldGFQYXRoKG1QYXRoLCAyKTsKKyAgICAgICAgICAgIGlmICghaXNQYXJzaW5nTWV0YUtleXMpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGJ1ZmZlcls0XTsKKyAgICAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgKG9mZjY0X3Qpc2l6ZW9mKGJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIsIDQpIDwgNCkgeworICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoVTMyX0FUKGJ1ZmZlcikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgdmVyc2lvbiAwLCBmbGFncyAwLgorCisgICAgICAgICAgICAgICAgICAgIC8vIElmIGl0J3Mgbm90LCBsZXQncyBhc3N1bWUgdGhpcyBpcyBvbmUgb2YgdGhvc2UKKyAgICAgICAgICAgICAgICAgICAgLy8gYXBwYXJlbnRseSBtYWxmb3JtZWQgY2h1bmtzIHRoYXQgZG9uJ3QgaGF2ZSBmbGFncworICAgICAgICAgICAgICAgICAgICAvLyBhbmQgY29tcGxldGVseSBkaWZmZXJlbnQgc2VtYW50aWNzIHRoYW4gd2hhdCdzCisgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBNUEVHNCBzcGVjcyBhbmQgc2tpcCBpdC4KKyAgICAgICAgICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gIHNpemVvZihidWZmZXIpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB3aGlsZSAoKm9mZnNldCA8IHN0b3Bfb2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuayhvZmZzZXQsIGRlcHRoICsgMSk7CiAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMTgyNCw3ICsxODk2LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBkMzI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCkgeworICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IDAgJiYgbUhlYWRlclRpbWVzY2FsZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbiAqIDEwMDAwMDAgLyBtSGVhZGVyVGltZXNjYWxlKTsKICAgICAgICAgICAgIH0KIApAQCAtMTg3Myw3ICsxOTQ1LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCkgeworICAgICAgICAgICAgaWYgKGR1cmF0aW9uICE9IDAgJiYgbUhlYWRlclRpbWVzY2FsZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbiAqIDEwMDAwMDAgLyBtSGVhZGVyVGltZXNjYWxlKTsKICAgICAgICAgICAgIH0KIApAQCAtMTg4Myw2ICsxOTU1LDkgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZCcsICdhJywgJ3QnKToKICAgICAgICAgewogICAgICAgICAgICAgQUxPR1YoIm1kYXQgY2h1bmssIGRybTogJWQiLCBtSXNEcm0pOworCisgICAgICAgICAgICBtTWRhdEZvdW5kID0gdHJ1ZTsKKwogICAgICAgICAgICAgaWYgKCFtSXNEcm0pIHsKICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xODk5LDYgKzE5NzQsMTAgQEAKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCisgICAgICAgICAgICBpZiAodW5kZXJRVE1ldGFQYXRoKG1QYXRoLCAzKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB1aW50MzJfdCBidWZmZXI7CiAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICsgOCwgJmJ1ZmZlciwgNCkgPCA0KSB7CkBAIC0xOTE4LDYgKzE5OTcsMTYgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBGT1VSQ0MoJ2snLCAnZScsICd5JywgJ3MnKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworCisgICAgICAgICAgICBpZiAodW5kZXJRVE1ldGFQYXRoKG1QYXRoLCAzKSkgeworICAgICAgICAgICAgICAgIHBhcnNlUVRNZXRhS2V5KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIEZPVVJDQygndCcsICdyJywgJ2UnLCAneCcpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CkBAIC0xOTM5LDYgKzIwMjgsOSBAQAogCiAgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ3gnLCAnMycsICdnJyk6CiAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgICAgICAgICAgdWludDMyX3QgdHlwZTsKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CiAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7CkBAIC0xOTg0LDggKzIwNzYsOCBAQAogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCiAgICAgICAgICAgICBpZiAobUZpbGVNZXRhRGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNodW5rX2RhdGFfc2l6ZSA9ICVsbGQgYW5kIGRhdGFfb2Zmc2V0ID0gJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaHVua19kYXRhX3NpemUsIGRhdGFfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2h1bmtfZGF0YV9zaXplID0gJSIgUFJJZDY0ICIgYW5kIGRhdGFfb2Zmc2V0ID0gJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgICAgIGNodW5rX2RhdGFfc2l6ZSwgZGF0YV9vZmZzZXQpOwogCiAgICAgICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDAgfHwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGNodW5rX2RhdGFfc2l6ZSkgPj0gU0laRV9NQVggLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC0yMDYxLDYgKzIxNTMsMTIgQEAKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICB7CisgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSdyZSBwYXJzaW5nICdpbHN0JyBmb3IgbWV0YSBrZXlzCisgICAgICAgICAgICAvLyBpZiBzbywgdHJlYXQgdHlwZSBhcyBhIG51bWJlciAoa2V5LWlkKS4KKyAgICAgICAgICAgIGlmICh1bmRlclFUTWV0YVBhdGgobVBhdGgsIDMpKSB7CisgICAgICAgICAgICAgICAgcGFyc2VRVE1ldGFWYWwoY2h1bmtfdHlwZSwgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yMDk2LDYgKzIxOTQsOCBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KICAgICBBTE9HVigic2lkeCByZWZpZC90aW1lc2NhbGU6ICVkLyVkIiwgcmVmZXJlbmNlSWQsIHRpbWVTY2FsZSk7CisgICAgaWYgKHRpbWVTY2FsZSA9PSAwKQorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCiAgICAgdWludDY0X3QgZWFybGllc3RQcmVzZW50YXRpb25UaW1lOwogICAgIHVpbnQ2NF90IGZpcnN0T2Zmc2V0OwpAQCAtMjE3OSw2ICsyMjc5LDkgQEAKIAogICAgIHVpbnQ2NF90IHNpZHhEdXJhdGlvbiA9IHRvdGFsX2R1cmF0aW9uICogMTAwMDAwMCAvIHRpbWVTY2FsZTsKIAorICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICBpbnQ2NF90IG1ldGFEdXJhdGlvbjsKICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZtZXRhRHVyYXRpb24pIHx8IG1ldGFEdXJhdGlvbiA9PSAwKSB7CiAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgc2lkeER1cmF0aW9uKTsKQEAgLTIxODYsNyArMjI4OSwxMDggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZVFUTWV0YUtleShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoc2l6ZSA8IDgpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CiAKKyAgICB1aW50MzJfdCBjb3VudDsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0ICsgNCwgJmNvdW50KSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGlmIChtTWV0YUtleU1hcC5zaXplKCkgPiAwKSB7CisgICAgICAgIEFMT0dXKCIna2V5cycgYXRvbSBzZWVuIGFnYWluLCBkaXNjYXJkaW5nIGV4aXN0aW5nIGVudHJpZXMiKTsKKyAgICAgICAgbU1ldGFLZXlNYXAuY2xlYXIoKTsKKyAgICB9CisKKyAgICBvZmY2NF90IGtleU9mZnNldCA9IG9mZnNldCArIDg7CisgICAgb2ZmNjRfdCBzdG9wT2Zmc2V0ID0gb2Zmc2V0ICsgc2l6ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8PSBjb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChrZXlPZmZzZXQgKyA4ID4gc3RvcE9mZnNldCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IGtleVNpemU7CisgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihrZXlPZmZzZXQsICZrZXlTaXplKQorICAgICAgICAgICAgICAgIHx8IGtleVNpemUgPCA4CisgICAgICAgICAgICAgICAgfHwga2V5T2Zmc2V0ICsga2V5U2l6ZSA+IHN0b3BPZmZzZXQpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIoa2V5T2Zmc2V0ICsgNCwgJnR5cGUpCisgICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBGT1VSQ0MoJ20nLCAnZCcsICd0JywgJ2EnKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIGtleVNpemUgLT0gODsKKyAgICAgICAga2V5T2Zmc2V0ICs9IDg7CisKKyAgICAgICAgc3A8QUJ1ZmZlcj4ga2V5RGF0YSA9IG5ldyBBQnVmZmVyKGtleVNpemUpOworICAgICAgICBpZiAoa2V5RGF0YS0+ZGF0YSgpID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAga2V5T2Zmc2V0LCBrZXlEYXRhLT5kYXRhKCksIGtleVNpemUpIDwgKHNzaXplX3QpIGtleVNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICBBU3RyaW5nIGtleSgoY29uc3QgY2hhciAqKWtleURhdGEtPmRhdGEoKSwga2V5U2l6ZSk7CisgICAgICAgIG1NZXRhS2V5TWFwLmFkZChpLCBrZXkpOworCisgICAgICAgIGtleU9mZnNldCArPSBrZXlTaXplOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZVFUTWV0YVZhbCgKKyAgICAgICAgaW50MzJfdCBrZXlJZCwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1NZXRhS2V5TWFwLmluZGV4T2ZLZXkoa2V5SWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgLy8gY29ycmVzcG9uZGluZyBrZXkgaXMgbm90IHByZXNlbnQsIGlnbm9yZQorICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGlmIChzaXplIDw9IDE2KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIHVpbnQzMl90IGRhdGFTaXplOworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZkYXRhU2l6ZSkKKyAgICAgICAgICAgIHx8IGRhdGFTaXplID4gc2l6ZSB8fCBkYXRhU2l6ZSA8PSAxNikgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICB1aW50MzJfdCBhdG9tRm91ckNDOworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQgKyA0LCAmYXRvbUZvdXJDQykKKyAgICAgICAgICAgIHx8IGF0b21Gb3VyQ0MgIT0gRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJykpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgdWludDMyX3QgZGF0YVR5cGU7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCArIDgsICZkYXRhVHlwZSkKKyAgICAgICAgICAgIHx8ICgoZGF0YVR5cGUgJiAweGZmMDAwMDAwKSAhPSAwKSkgeworICAgICAgICAvLyBub3Qgd2VsbC1rbm93biB0eXBlCisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgZGF0YVNpemUgLT0gMTY7CisgICAgb2Zmc2V0ICs9IDE2OworCisgICAgaWYgKGRhdGFUeXBlID09IDIzICYmIGRhdGFTaXplID49IDQpIHsKKyAgICAgICAgLy8gQkUgRmxvYXQzMgorICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZ2YWwpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIGlmICghc3RyY2FzZWNtcChtTWV0YUtleU1hcFtpbmRleF0uY19zdHIoKSwgImNvbS5hbmRyb2lkLmNhcHR1cmUuZnBzIikpIHsKKyAgICAgICAgICAgIG1GaWxlTWV0YURhdGEtPnNldEZsb2F0KGtLZXlDYXB0dXJlRnJhbWVyYXRlLCAqKGZsb2F0ICopJnZhbCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBhZGQgbW9yZSBrZXlzIGlmIG5lZWRlZAorICAgICAgICBBTE9HVigiaWdub3Jpbmcga2V5OiB0eXBlICVkLCBzaXplICVkIiwgZGF0YVR5cGUsIGRhdGFTaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CiAKIHN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZVRyYWNrSGVhZGVyKAogICAgICAgICBvZmY2NF90IGRhdGFfb2Zmc2V0LCBvZmY2NF90IGRhdGFfc2l6ZSkgewpAQCAtMjIyOSw2ICsyNDMzLDkgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIAorICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5VHJhY2tJRCwgaWQpOwogCiAgICAgc2l6ZV90IG1hdHJpeE9mZnNldCA9IGR5blNpemUgKyAxNjsKQEAgLTIzMDAsNyArMjUwNyw3IEBACiAgICAgdWludDMyX3QgbWV0YWRhdGFLZXkgPSAwOwogICAgIGNoYXIgY2h1bmtbNV07CiAgICAgTWFrZUZvdXJDQ1N0cmluZyhtUGF0aFs0XSwgY2h1bmspOwotICAgIEFMT0dWKCJtZXRhOiAlcyBAICVsbGQiLCBjaHVuaywgb2Zmc2V0KTsKKyAgICBBTE9HVigibWV0YTogJXMgQCAlbGxkIiwgY2h1bmssIChsb25nIGxvbmcpb2Zmc2V0KTsKICAgICBzd2l0Y2ggKChpbnQzMl90KW1QYXRoWzRdKSB7CiAgICAgICAgIGNhc2UgRk9VUkNDKDB4YTksICdhJywgJ2wnLCAnYicpOgogICAgICAgICB7CkBAIC0yNDE3LDYgKzI2MjQsOSBAQAogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlbGF5LCBwYWRkaW5nOwogICAgICAgICAgICAgICAgICAgICBpZiAoc3NjYW5mKG1MYXN0Q29tbWVudERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAlKnggJXggJXggJSp4IiwgJmRlbGF5LCAmcGFkZGluZykgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworCiAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLT5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIHBhZGRpbmcpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0yNzA4LDYgKzI5MTgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpCisgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMikKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKICAgICAgICAgaWYgKCF0cmFjay0+bWV0YS0+ZmluZERhdGEoa0tleUVTRFMsICZ0eXBlLCAmZGF0YSwgJnNpemUpCiAgICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBrVHlwZUVTRFMpIHsKQEAgLTI3OTIsNiArMzAwMyw5IEBACiAKICAgICBpZiAob2JqZWN0VHlwZUluZGljYXRpb24gPT0gMHhlMSkgewogICAgICAgICAvLyBUaGlzIGlzbid0IE1QRUc0IGF1ZGlvIGF0IGFsbCwgaXQncyBRQ0VMUCAxNGsuLi4KKyAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisKICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1FDRUxQKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KQEAgLTI4MTIsNyArMzAyNiw3IEBACiAgICAgfQogCiAgICAgaWYgKGtVc2VIZXhEdW1wKSB7Ci0gICAgICAgIHByaW50ZigiRVNEIG9mIHNpemUgJWRcbiIsIGNzZF9zaXplKTsKKyAgICAgICAgcHJpbnRmKCJFU0Qgb2Ygc2l6ZSAlenVcbiIsIGNzZF9zaXplKTsKICAgICAgICAgaGV4ZHVtcChjc2QsIGNzZF9zaXplKTsKICAgICB9CiAKQEAgLTI4NDAsNiArMzA1NCw5IEBACiAgICAgICAgIG9iamVjdFR5cGUgPSAzMiArIGJyLmdldEJpdHMoNik7CiAgICAgfQogCisgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgIC8va2VlcCBBT1QgdHlwZQogICAgIG1MYXN0VHJhY2stPm1ldGEtPnNldEludDMyKGtLZXlBQUNBT1QsIG9iamVjdFR5cGUpOwogCkBAIC0yODQ4LDEyICszMDY1LDExIEBACiAgICAgaW50MzJfdCBzYW1wbGVSYXRlID0gMDsKICAgICBpbnQzMl90IG51bUNoYW5uZWxzID0gMDsKICAgICBpZiAoZnJlcUluZGV4ID09IDE1KSB7Ci0gICAgICAgIGlmIChjc2Rfc2l6ZSA8IDUpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAyOCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgc2FtcGxlUmF0ZSA9IGJyLmdldEJpdHMoMjQpOwogICAgICAgICBudW1DaGFubmVscyA9IGJyLmdldEJpdHMoNCk7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICBudW1DaGFubmVscyA9IGJyLmdldEJpdHMoNCk7CiAKICAgICAgICAgaWYgKGZyZXFJbmRleCA9PSAxMyB8fCBmcmVxSW5kZXggPT0gMTQpIHsKQEAgLTI4NjQsMTIgKzMwODAsMTQgQEAKICAgICB9CiAKICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfU0JSIHx8IG9iamVjdFR5cGUgPT0gQU9UX1BTKSB7Ly9TQlIgc3BlY2lmaWMgY29uZmlnIHBlciAxNDQ5Ni0zIHRhYmxlIDEuMTMKKyAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB1aW50MzJfdCBleHRGcmVxSW5kZXggPSBici5nZXRCaXRzKDQpOwogICAgICAgICBpbnQzMl90IGV4dFNhbXBsZVJhdGUgX191bnVzZWQ7CiAgICAgICAgIGlmIChleHRGcmVxSW5kZXggPT0gMTUpIHsKICAgICAgICAgICAgIGlmIChjc2Rfc2l6ZSA8IDgpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAyNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIGV4dFNhbXBsZVJhdGUgPSBici5nZXRCaXRzKDI0KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChleHRGcmVxSW5kZXggPT0gMTMgfHwgZXh0RnJlcUluZGV4ID09IDE0KSB7CkBAIC0yOTA2LDIwICszMTI0LDI0IEBACiAKICAgICB7CiAgICAgICAgIGlmIChvYmplY3RUeXBlID09IEFPVF9TQlIgfHwgb2JqZWN0VHlwZSA9PSBBT1RfUFMpIHsKKyAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIG9iamVjdFR5cGUgPSBici5nZXRCaXRzKDUpOwogCiAgICAgICAgICAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfRVNDQVBFKSB7CisgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA2KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgIG9iamVjdFR5cGUgPSAzMiArIGJyLmdldEJpdHMoNik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKG9iamVjdFR5cGUgPT0gQU9UX0FBQ19MQyB8fCBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfTEMgfHwKICAgICAgICAgICAgICAgICBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfTEQgfHwgb2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX1NDQUwgfHwKICAgICAgICAgICAgICAgICBvYmplY3RUeXBlID09IEFPVF9FUl9CU0FDKSB7CisgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDIpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGZyYW1lTGVuZ3RoRmxhZyBfX3VudXNlZCA9IGJyLmdldEJpdHMoMSk7CiAKICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZGVwZW5kc09uQ29yZUNvZGVyID0gYnIuZ2V0Qml0cygxKTsKIAogICAgICAgICAgICAgaWYgKGRlcGVuZHNPbkNvcmVDb2RlciApIHsKKyAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDE0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgY29yZUNvZGVyRGVsYXkgX191bnVzZWQgPSBici5nZXRCaXRzKDE0KTsKICAgICAgICAgICAgIH0KIApAQCAtMjkzOSw3ICszMTYxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uRmxhZyA9IDE7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HVygiY3NkIG1pc3NpbmcgZXh0ZW5zaW9uIGZsYWc7IGFzc3VtaW5nICVkIGZvciBvYmplY3QgdHlwZSAldS4iLApAQCAtMjk0OSw2ICszMTcxLDkgQEAKICAgICAgICAgICAgIGlmIChudW1DaGFubmVscyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsc0VmZmVjdGl2ZU51bSA9IDA7CiAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsc051bSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAzMikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEVsZW1lbnRJbnN0YW5jZVRhZyBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBQcm9maWxlIF9fdW51c2VkID0gYnIuZ2V0Qml0cygyKTsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNhbXBsaW5nRnJlcXVlbmN5SW5kZXggX191bnVzZWQgPSBici5nZXRCaXRzKDQpOwpAQCAtMjk2MCwzNSArMzE4NSw0NCBAQAogICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtVmFsaWRDY0VsZW1lbnRzIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKIAogICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTW9ub01peGRvd25QcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKKwogICAgICAgICAgICAgICAgIGlmIChNb25vTWl4ZG93blByZXNlbnQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTW9ub01peGRvd25FbGVtZW50TnVtYmVyIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDEpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTdGVyZW9NaXhkb3duUHJlc2VudCA9IGJyLmdldEJpdHMoMSk7CiAgICAgICAgICAgICAgICAgaWYgKFN0ZXJlb01peGRvd25QcmVzZW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFN0ZXJlb01peGRvd25FbGVtZW50TnVtYmVyIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDEpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNYXRyaXhNaXhkb3duSW5kZXhQcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKICAgICAgICAgICAgICAgICBpZiAoTWF0cml4TWl4ZG93bkluZGV4UHJlc2VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMykgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNYXRyaXhNaXhkb3duSW5kZXggX191bnVzZWQgPSBici5nZXRCaXRzKDIpOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFBzZXVkb1N1cnJvdW5kRW5hYmxlIF9fdW51c2VkID0gYnIuZ2V0Qml0cygxKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpbnQgaTsKICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUZyb250Q2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA1KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEZyb250RWxlbWVudElzQ3BlID0gYnIuZ2V0Qml0cygxKTsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBGcm9udEVsZW1lbnRUYWdTZWxlY3QgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOwogICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSBGcm9udEVsZW1lbnRJc0NwZSA/IDIgOiAxOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgTnVtU2lkZUNoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTaWRlRWxlbWVudElzQ3BlID0gYnIuZ2V0Qml0cygxKTsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTaWRlRWxlbWVudFRhZ1NlbGVjdCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IFNpZGVFbGVtZW50SXNDcGUgPyAyIDogMTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUJhY2tDaGFubmVsRWxlbWVudHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDUpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgQmFja0VsZW1lbnRJc0NwZSA9IGJyLmdldEJpdHMoMSk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgQmFja0VsZW1lbnRUYWdTZWxlY3QgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOwogICAgICAgICAgICAgICAgICAgICBjaGFubmVsc051bSArPSBCYWNrRWxlbWVudElzQ3BlID8gMiA6IDE7CkBAIC0yOTk2LDYgKzMyMzAsNyBAQAogICAgICAgICAgICAgICAgIGNoYW5uZWxzRWZmZWN0aXZlTnVtID0gY2hhbm5lbHNOdW07CiAKICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUxmZUNoYW5uZWxFbGVtZW50czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBMZmVFbGVtZW50VGFnU2VsZWN0IF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gMTsKICAgICAgICAgICAgICAgICB9CkBAIC0zMDEwLDYgKzMyNDUsOSBAQAogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCisgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKwogICAgIGludDMyX3QgcHJldlNhbXBsZVJhdGU7CiAgICAgQ0hFQ0sobUxhc3RUcmFjay0+bWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmcHJldlNhbXBsZVJhdGUpKTsKIApAQCAtMzIyMSw3ICszNDU5LDcgQEAKIAogICAgIGNoYXIgY2h1bmtbNV07CiAgICAgTWFrZUZvdXJDQ1N0cmluZyhjaHVua190eXBlLCBjaHVuayk7Ci0gICAgQUxPR1YoIk1QRUc0U291cmNlIGNodW5rICVzIEAgJWxseCIsIGNodW5rLCAqb2Zmc2V0KTsKKyAgICBBTE9HVigiTVBFRzRTb3VyY2UgY2h1bmsgJXMgQCAlI2xseCIsIGNodW5rLCAobG9uZyBsb25nKSpvZmZzZXQpOwogCiAgICAgb2ZmNjRfdCBjaHVua19kYXRhX3NpemUgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZSAtIGRhdGFfb2Zmc2V0OwogCkBAIC0zNzAxLDcgKzM5MzksNyBAQAogICAgICAgICBzYW1wbGVDdHNPZmZzZXQgPSAwOwogICAgIH0KIAotICAgIGlmIChzaXplIDwgKG9mZjY0X3Qpc2FtcGxlQ291bnQgKiBieXRlc1BlclNhbXBsZSkgeworICAgIGlmIChzaXplIDwgKG9mZjY0X3QpKHNhbXBsZUNvdW50ICogYnl0ZXNQZXJTYW1wbGUpKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApAQCAtNDUxNiw3ICs0NzU0LDcgQEAKIAogICAgICAgICBjaGFyIGNodW5rc3RyaW5nWzVdOwogICAgICAgICBNYWtlRm91ckNDU3RyaW5nKGNodW5rVHlwZSwgY2h1bmtzdHJpbmcpOwotICAgICAgICBBTE9HVigic2F3IGNodW5rIHR5cGUgJXMsIHNpemUgJSIgUFJJdTY0ICIgQCAlbGxkIiwgY2h1bmtzdHJpbmcsIGNodW5rU2l6ZSwgb2Zmc2V0KTsKKyAgICAgICAgQUxPR1YoInNhdyBjaHVuayB0eXBlICVzLCBzaXplICUiIFBSSXU2NCAiIEAgJWxsZCIsIGNodW5rc3RyaW5nLCBjaHVua1NpemUsIChsb25nIGxvbmcpb2Zmc2V0KTsKICAgICAgICAgc3dpdGNoIChjaHVua1R5cGUpIHsKICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdmJywgJ3QnLCAneScsICdwJyk6CiAgICAgICAgICAgICB7CkBAIC00NTc5LDcgKzQ4MTcsNyBAQAogICAgICAgICAqbWV0YSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgKCptZXRhKS0+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+ICZvdXRwdXQpCisgICAgICA6IG1TeW5jKHN5bmMpLAorICAgICAgICBtT3V0cHV0KG91dHB1dCkge30KKworTWVkaWFTeW5jOjpPdXRwdXRMaXN0ZW5lcjo6fk91dHB1dExpc3RlbmVyKCkge30KKwordm9pZCBNZWRpYVN5bmM6Ok91dHB1dExpc3RlbmVyOjpvbkJ1ZmZlclJlbGVhc2VkKCkgeworICAgIG1TeW5jLT5vbkJ1ZmZlclJlbGVhc2VkQnlPdXRwdXQobU91dHB1dCk7Cit9CisKK3ZvaWQgTWVkaWFTeW5jOjpPdXRwdXRMaXN0ZW5lcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmLyogd2hvICovKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN5bmMtPm1NdXRleCk7CisgICAgbVN5bmMtPm9uQWJhbmRvbmVkX2woZmFsc2UgLyogaXNJbnB1dCAqLyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01pZGlFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWlkaUV4dHJhY3Rvci5jcHAKaW5kZXggNjZmYWI3Ny4uZjZiOGM4NGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01pZGlFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01pZGlFeHRyYWN0b3IuY3BwCkBAIC0yMTcsNyArMjE3LDcgQEAKIH0KIAogc3RhdHVzX3QgTWlkaUVuZ2luZTo6c2Vla1RvKGludDY0X3QgcG9zaXRpb25VcykgewotICAgIEFMT0dWKCJzZWVrVG8gJWxsZCIsIHBvc2l0aW9uVXMpOworICAgIEFMT0dWKCJzZWVrVG8gJWxsZCIsIChsb25nIGxvbmcpcG9zaXRpb25Vcyk7CiAgICAgRUFTX1JFU1VMVCByZXN1bHQgPSBFQVNfTG9jYXRlKG1FYXNEYXRhLCBtRWFzSGFuZGxlLCBwb3NpdGlvblVzIC8gMTAwMCwgZmFsc2UpOwogICAgIHJldHVybiByZXN1bHQgPT0gRUFTX1NVQ0NFU1MgPyBPSyA6IFVOS05PV05fRVJST1I7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcAppbmRleCA2NGJjZDhjLi5kNjI1NWQ2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKQEAgLTI0Miw3ICsyNDIsNyBAQAogICAgIHNwPE51Q2FjaGVkU291cmNlMj4gaW5zdGFuY2UgPSBuZXcgTnVDYWNoZWRTb3VyY2UyKAogICAgICAgICAgICAgc291cmNlLCBjYWNoZUNvbmZpZywgZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGluc3RhbmNlLT5tTG9jayk7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdEZldGNoTW9yZSwgaW5zdGFuY2UtPm1SZWZsZWN0b3ItPmlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaE1vcmUsIGluc3RhbmNlLT5tUmVmbGVjdG9yKSktPnBvc3QoKTsKICAgICByZXR1cm4gaW5zdGFuY2U7CiB9CiAKQEAgLTQ0Miw3ICs0NDIsNyBAQAogICAgICAgICBkZWxheVVzID0gMTAwMDAwbGw7CiAgICAgfQogCi0gICAgKG5ldyBBTWVzc2FnZShrV2hhdEZldGNoTW9yZSwgbVJlZmxlY3Rvci0+aWQoKSkpLT5wb3N0KGRlbGF5VXMpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaE1vcmUsIG1SZWZsZWN0b3IpKS0+cG9zdChkZWxheVVzKTsKIH0KIAogdm9pZCBOdUNhY2hlZFNvdXJjZTI6Om9uUmVhZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewpAQCAtNTEyLDcgKzUxMiw3IEBACiBzc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvU2VyaWFsaXplcihtU2VyaWFsaXplcik7CiAKLSAgICBBTE9HVigicmVhZEF0IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIG9mZnNldCwgc2l6ZSk7CisgICAgQUxPR1YoInJlYWRBdCBvZmZzZXQgJWxsZCwgc2l6ZSAlenUiLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIGlmIChtRGlzY29ubmVjdGluZykgewpAQCAtNTMxLDcgKzUzMSw3IEBACiAgICAgICAgIHJldHVybiBzaXplOwogICAgIH0KIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkLCBtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVhZCwgbVJlZmxlY3Rvcik7CiAgICAgbXNnLT5zZXRJbnQ2NCgib2Zmc2V0Iiwgb2Zmc2V0KTsKICAgICBtc2ctPnNldFBvaW50ZXIoImRhdGEiLCBkYXRhKTsKICAgICBtc2ctPnNldFNpemUoInNpemUiLCBzaXplKTsKQEAgLTU4OCwxMCArNTg4LDE3IEBACiBzc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6cmVhZEludGVybmFsKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIENIRUNLX0xFKHNpemUsIChzaXplX3QpbUhpZ2h3YXRlclRocmVzaG9sZEJ5dGVzKTsKIAotICAgIEFMT0dWKCJyZWFkSW50ZXJuYWwgb2Zmc2V0ICVsbGQgc2l6ZSAlenUiLCBvZmZzZXQsIHNpemUpOworICAgIEFMT0dWKCJyZWFkSW50ZXJuYWwgb2Zmc2V0ICVsbGQgc2l6ZSAlenUiLCAobG9uZyBsb25nKW9mZnNldCwgc2l6ZSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCisgICAgLy8gSWYgd2UncmUgZGlzY29ubmVjdGluZywgcmV0dXJuIEVPUyBhbmQgZG9uJ3QgYWNjZXNzICpkYXRhIHBvaW50ZXIuCisgICAgLy8gZGF0YSBjb3VsZCBiZSBvbiB0aGUgc3RhY2sgb2YgdGhlIGNhbGxlciB0byBOdUNhY2hlZFNvdXJjZTI6OnJlYWRBdCgpLAorICAgIC8vIHdoaWNoIG1heSBoYXZlIGV4aXRlZCBhbHJlYWR5LgorICAgIGlmIChtRGlzY29ubmVjdGluZykgeworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CisKICAgICBpZiAoIW1GZXRjaGluZykgewogICAgICAgICBtTGFzdEFjY2Vzc1BvcyA9IG9mZnNldDsKICAgICAgICAgcmVzdGFydFByZWZldGNoZXJJZk5lY2Vzc2FyeV9sKApAQCAtNjQ5LDcgKzY1Niw3IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBBTE9HSSgibmV3IHJhbmdlOiBvZmZzZXQ9ICVsbGQiLCBvZmZzZXQpOworICAgIEFMT0dJKCJuZXcgcmFuZ2U6IG9mZnNldD0gJWxsZCIsIChsb25nIGxvbmcpb2Zmc2V0KTsKIAogICAgIG1DYWNoZU9mZnNldCA9IG9mZnNldDsKIApAQCAtNzI4LDEwICs3MzUsMTAgQEAKICAgICAgICAgbUtlZXBBbGl2ZUludGVydmFsVXMgPSBrRGVmYXVsdEtlZXBBbGl2ZUludGVydmFsVXM7CiAgICAgfQogCi0gICAgQUxPR1YoImxvd3dhdGVyID0gJXp1IGJ5dGVzLCBoaWdod2F0ZXIgPSAlenUgYnl0ZXMsIGtlZXBhbGl2ZSA9ICUiIFBSSWQ2NCAiIHVzIiwKKyAgICBBTE9HVigibG93d2F0ZXIgPSAlenUgYnl0ZXMsIGhpZ2h3YXRlciA9ICV6dSBieXRlcywga2VlcGFsaXZlID0gJWxsZCB1cyIsCiAgICAgICAgICBtTG93d2F0ZXJUaHJlc2hvbGRCeXRlcywKICAgICAgICAgIG1IaWdod2F0ZXJUaHJlc2hvbGRCeXRlcywKLSAgICAgICAgIG1LZWVwQWxpdmVJbnRlcnZhbFVzKTsKKyAgICAgICAgIChsb25nIGxvbmcpbUtlZXBBbGl2ZUludGVydmFsVXMpOwogfQogCiAvLyBzdGF0aWMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENsaWVudC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDbGllbnQuY3BwCmluZGV4IGZhNGE1MDkuLmQyNTJjYjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ2xpZW50LmNwcApAQCAtNzIsNyArNzIsNyBAQAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfU1RBVEVUWVBFKiBzdGF0ZSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoCi0gICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfQk9PTCBlbmFibGUsIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSwKQEAgLTkwLDcgKzkwLDcgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgdXNlQnVmZmVyKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCi0gICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgT01YX0JPT0wgY3Jvc3NQcm9jZXNzKTsKKyAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfVTMyIGFsbG90dGVkU2l6ZSwgT01YX0JPT0wgY3Jvc3NQcm9jZXNzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgdXNlR3JhcGhpY0J1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LApAQCAtMTAyLDcgKzEwMiwxNSBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVJbnB1dFN1cmZhY2UoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwKLSAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlcik7CisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIsIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVBlcnNpc3RlbnRJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIsCisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAqYnVmZmVyQ29uc3VtZXIpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICZidWZmZXJDb25zdW1lciwgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbShub2RlX2lkIG5vZGUpOwogCkBAIC0xMTIsMTggKzEyMCwxOCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcldpdGhCYWNrdXAoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKLSAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfQk9PTCBjcm9zc1Byb2Nlc3MpOworICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIE9NWF9VMzIgYWxsb3R0ZWRTaXplLCBPTVhfQk9PTCBjcm9zc1Byb2Nlc3MpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBmcmVlQnVmZmVyKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGJ1ZmZlcl9pZCBidWZmZXIpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmaWxsQnVmZmVyKG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlcik7CisgICAgdmlydHVhbCBzdGF0dXNfdCBmaWxsQnVmZmVyKG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgaW50IGZlbmNlRmQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBlbXB0eUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwKICAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIsCiAgICAgICAgICAgICBPTVhfVTMyIHJhbmdlX29mZnNldCwgT01YX1UzMiByYW5nZV9sZW5ndGgsCi0gICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXAsIGludCBmZW5jZUZkKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RXh0ZW5zaW9uSW5kZXgoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsCkBAIC0yODQsOCArMjkyLDggQEAKIH0KIAogc3RhdHVzX3QgTXV4T01YOjpzdG9yZU1ldGFEYXRhSW5CdWZmZXJzKAotICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlKSB7Ci0gICAgcmV0dXJuIGdldE9NWChub2RlKS0+c3RvcmVNZXRhRGF0YUluQnVmZmVycyhub2RlLCBwb3J0X2luZGV4LCBlbmFibGUpOworICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlLCBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUpIHsKKyAgICByZXR1cm4gZ2V0T01YKG5vZGUpLT5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzKG5vZGUsIHBvcnRfaW5kZXgsIGVuYWJsZSwgdHlwZSk7CiB9CiAKIHN0YXR1c190IE11eE9NWDo6cHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCkBAIC0zMTQsOSArMzIyLDkgQEAKIAogc3RhdHVzX3QgTXV4T01YOjp1c2VCdWZmZXIoCiAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAotICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgT01YX0JPT0wgLyogY3Jvc3NQcm9jZXNzICovKSB7CisgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfVTMyIGFsbG90dGVkU2l6ZSwgT01YX0JPT0wgLyogY3Jvc3NQcm9jZXNzICovKSB7CiAgICAgcmV0dXJuIGdldE9NWChub2RlKS0+dXNlQnVmZmVyKAotICAgICAgICAgICAgbm9kZSwgcG9ydF9pbmRleCwgcGFyYW1zLCBidWZmZXIsIE9NWF9GQUxTRSAvKiBjcm9zc1Byb2Nlc3MgKi8pOworICAgICAgICAgICAgbm9kZSwgcG9ydF9pbmRleCwgcGFyYW1zLCBidWZmZXIsIGFsbG90dGVkU2l6ZSwgT01YX0ZBTFNFIC8qIGNyb3NzUHJvY2VzcyAqLyk7CiB9CiAKIHN0YXR1c190IE11eE9NWDo6dXNlR3JhcGhpY0J1ZmZlcigKQEAgLTMzNSwxMiArMzQzLDI2IEBACiAKIHN0YXR1c190IE11eE9NWDo6Y3JlYXRlSW5wdXRTdXJmYWNlKAogICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwKLSAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyKSB7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlciwgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKSB7CiAgICAgc3RhdHVzX3QgZXJyID0gZ2V0T01YKG5vZGUpLT5jcmVhdGVJbnB1dFN1cmZhY2UoCi0gICAgICAgICAgICBub2RlLCBwb3J0X2luZGV4LCBidWZmZXJQcm9kdWNlcik7CisgICAgICAgICAgICBub2RlLCBwb3J0X2luZGV4LCBidWZmZXJQcm9kdWNlciwgdHlwZSk7CiAgICAgcmV0dXJuIGVycjsKIH0KIAorc3RhdHVzX3QgTXV4T01YOjpjcmVhdGVQZXJzaXN0ZW50SW5wdXRTdXJmYWNlKAorICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIsCisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICpidWZmZXJDb25zdW1lcikgeworICAgIC8vIFRPRE86IGxvY2FsIG9yIHJlbW90ZT8gQWx3YXlzIHVzZSByZW1vdGUgZm9yIG5vdworICAgIHJldHVybiBtUmVtb3RlT01YLT5jcmVhdGVQZXJzaXN0ZW50SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgYnVmZmVyUHJvZHVjZXIsIGJ1ZmZlckNvbnN1bWVyKTsKK30KKworc3RhdHVzX3QgTXV4T01YOjpzZXRJbnB1dFN1cmZhY2UoCisgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LAorICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAmYnVmZmVyQ29uc3VtZXIsIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSkgeworICAgIHJldHVybiBnZXRPTVgobm9kZSktPnNldElucHV0U3VyZmFjZShub2RlLCBwb3J0X2luZGV4LCBidWZmZXJDb25zdW1lciwgdHlwZSk7Cit9CisKIHN0YXR1c190IE11eE9NWDo6c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbShub2RlX2lkIG5vZGUpIHsKICAgICByZXR1cm4gZ2V0T01YKG5vZGUpLT5zaWduYWxFbmRPZklucHV0U3RyZWFtKG5vZGUpOwogfQpAQCAtMzU0LDkgKzM3Niw5IEBACiAKIHN0YXR1c190IE11eE9NWDo6YWxsb2NhdGVCdWZmZXJXaXRoQmFja3VwKAogICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKLSAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIE9NWF9CT09MIC8qIGNyb3NzUHJvY2VzcyAqLykgeworICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgT01YX1UzMiBhbGxvdHRlZFNpemUsIE9NWF9CT09MIC8qIGNyb3NzUHJvY2VzcyAqLykgewogICAgIHJldHVybiBnZXRPTVgobm9kZSktPmFsbG9jYXRlQnVmZmVyV2l0aEJhY2t1cCgKLSAgICAgICAgICAgIG5vZGUsIHBvcnRfaW5kZXgsIHBhcmFtcywgYnVmZmVyLCBPTVhfRkFMU0UgLyogY3Jvc3NQcm9jZXNzICovKTsKKyAgICAgICAgICAgIG5vZGUsIHBvcnRfaW5kZXgsIHBhcmFtcywgYnVmZmVyLCBhbGxvdHRlZFNpemUsIE9NWF9GQUxTRSAvKiBjcm9zc1Byb2Nlc3MgKi8pOwogfQogCiBzdGF0dXNfdCBNdXhPTVg6OmZyZWVCdWZmZXIoCkBAIC0zNjQsMTcgKzM4NiwxNyBAQAogICAgIHJldHVybiBnZXRPTVgobm9kZSktPmZyZWVCdWZmZXIobm9kZSwgcG9ydF9pbmRleCwgYnVmZmVyKTsKIH0KIAotc3RhdHVzX3QgTXV4T01YOjpmaWxsQnVmZmVyKG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlcikgewotICAgIHJldHVybiBnZXRPTVgobm9kZSktPmZpbGxCdWZmZXIobm9kZSwgYnVmZmVyKTsKK3N0YXR1c190IE11eE9NWDo6ZmlsbEJ1ZmZlcihub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIsIGludCBmZW5jZUZkKSB7CisgICAgcmV0dXJuIGdldE9NWChub2RlKS0+ZmlsbEJ1ZmZlcihub2RlLCBidWZmZXIsIGZlbmNlRmQpOwogfQogCiBzdGF0dXNfdCBNdXhPTVg6OmVtcHR5QnVmZmVyKAogICAgICAgICBub2RlX2lkIG5vZGUsCiAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIsCiAgICAgICAgIE9NWF9VMzIgcmFuZ2Vfb2Zmc2V0LCBPTVhfVTMyIHJhbmdlX2xlbmd0aCwKLSAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCkgeworICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCkgewogICAgIHJldHVybiBnZXRPTVgobm9kZSktPmVtcHR5QnVmZmVyKAotICAgICAgICAgICAgbm9kZSwgYnVmZmVyLCByYW5nZV9vZmZzZXQsIHJhbmdlX2xlbmd0aCwgZmxhZ3MsIHRpbWVzdGFtcCk7CisgICAgICAgICAgICBub2RlLCBidWZmZXIsIHJhbmdlX29mZnNldCwgcmFuZ2VfbGVuZ3RoLCBmbGFncywgdGltZXN0YW1wLCBmZW5jZUZkKTsKIH0KIAogc3RhdHVzX3QgTXV4T01YOjpnZXRFeHRlbnNpb25JbmRleCgKQEAgLTQwMSwxMCArNDIzLDE2IEBACiAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLnBsYXllciIpKTsKICAgICBzcDxJTWVkaWFQbGF5ZXJTZXJ2aWNlPiBzZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhUGxheWVyU2VydmljZT4oYmluZGVyKTsKIAotICAgIENIRUNLKHNlcnZpY2UuZ2V0KCkgIT0gTlVMTCk7CisgICAgaWYgKHNlcnZpY2UuZ2V0KCkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiQ2Fubm90IG9idGFpbiBJTWVkaWFQbGF5ZXJTZXJ2aWNlIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KIAogICAgIG1PTVggPSBzZXJ2aWNlLT5nZXRPTVgoKTsKLSAgICBDSEVDSyhtT01YLmdldCgpICE9IE5VTEwpOworICAgIGlmIChtT01YLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBvYnRhaW4gSU9NWCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CiAKICAgICBpZiAoIW1PTVgtPmxpdmVzTG9jYWxseSgwIC8qIG5vZGUgKi8sIGdldHBpZCgpKSkgewogICAgICAgICBBTE9HSSgiVXNpbmcgY2xpZW50LXNpZGUgT01YIG11eC4iKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcAppbmRleCAyYTAxMmYxLi43ZTE1ZTE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCkBAIC00Myw2ICs0Myw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CkBAIC0xMTUsMTIgKzExNiwxNSBAQAogICAgIH0KIAogICAgIC8vIGZyb20gSU9NWE9ic2VydmVyCi0gICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZShjb25zdCBvbXhfbWVzc2FnZSAmbXNnKSB7CisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZXMoY29uc3Qgc3RkOjpsaXN0PG9teF9tZXNzYWdlPiAmbWVzc2FnZXMpIHsKICAgICAgICAgc3A8T01YQ29kZWM+IGNvZGVjID0gbVRhcmdldC5wcm9tb3RlKCk7CiAKICAgICAgICAgaWYgKGNvZGVjLmdldCgpICE9IE5VTEwpIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhjb2RlYy0+bUxvY2spOwotICAgICAgICAgICAgY29kZWMtPm9uX21lc3NhZ2UobXNnKTsKKyAgICAgICAgICAgIGZvciAoc3RkOjpsaXN0PG9teF9tZXNzYWdlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtZXNzYWdlcy5jYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgIGl0ICE9IG1lc3NhZ2VzLmNlbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgIGNvZGVjLT5vbl9tZXNzYWdlKCppdCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb2RlYy5jbGVhcigpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzQ1LDIxICszNDksNiBAQAogCiAgICAgICAgIEFMT0dWKCJBdHRlbXB0aW5nIHRvIGFsbG9jYXRlIE9NWCBub2RlICclcyciLCBjb21wb25lbnROYW1lKTsKIAotICAgICAgICBpZiAoIWNyZWF0ZUVuY29kZXIKLSAgICAgICAgICAgICAgICAmJiAocXVpcmtzICYga091dHB1dEJ1ZmZlcnNBcmVVbnJlYWRhYmxlKQotICAgICAgICAgICAgICAgICYmIChmbGFncyAmIGtDbGllbnROZWVkc0ZyYW1lYnVmZmVyKSkgewotICAgICAgICAgICAgaWYgKHN0cm5jbXAoY29tcG9uZW50TmFtZSwgIk9NWC5TRUMuIiwgOCkpIHsKLSAgICAgICAgICAgICAgICAvLyBGb3IgT01YLlNFQy4qIGRlY29kZXJzIHdlIGNhbiBlbmFibGUgYSBzcGVjaWFsIG1vZGUgdGhhdAotICAgICAgICAgICAgICAgIC8vIGdpdmVzIHRoZSBjbGllbnQgYWNjZXNzIHRvIHRoZSBmcmFtZWJ1ZmZlciBjb250ZW50cy4KLQotICAgICAgICAgICAgICAgIEFMT0dXKCJDb21wb25lbnQgJyVzJyBkb2VzIG5vdCBnaXZlIHRoZSBjbGllbnQgYWNjZXNzIHRvICIKLSAgICAgICAgICAgICAgICAgICAgICJ0aGUgZnJhbWVidWZmZXIgY29udGVudHMuIFNraXBwaW5nLiIsCi0gICAgICAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lKTsKLQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KICAgICAgICAgc3RhdHVzX3QgZXJyID0gb214LT5hbGxvY2F0ZU5vZGUoY29tcG9uZW50TmFtZSwgb2JzZXJ2ZXIsICZub2RlKTsKICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgQUxPR1YoIlN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQgT01YIG5vZGUgJyVzJyIsIGNvbXBvbmVudE5hbWUpOwpAQCAtNjY4LDM1ICs2NTcsNiBAQAogCiAgICAgaW5pdE91dHB1dEZvcm1hdChtZXRhKTsKIAotICAgIGlmICgobUZsYWdzICYga0NsaWVudE5lZWRzRnJhbWVidWZmZXIpCi0gICAgICAgICAgICAmJiAhc3RybmNtcChtQ29tcG9uZW50TmFtZSwgIk9NWC5TRUMuIiwgOCkpIHsKLSAgICAgICAgLy8gVGhpcyBhcHBlYXJzIHRvIG5vIGxvbmdlciBiZSBuZWVkZWQ/Pz8KLQotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4OwotCi0gICAgICAgIHN0YXR1c190IGVyciA9Ci0gICAgICAgICAgICBtT01YLT5nZXRFeHRlbnNpb25JbmRleCgKLSAgICAgICAgICAgICAgICAgICAgbU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICJPTVguU0VDLmluZGV4LlRodW1ibmFpbE1vZGUiLAotICAgICAgICAgICAgICAgICAgICAmaW5kZXgpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBPTVhfQk9PTCBlbmFibGUgPSBPTVhfVFJVRTsKLSAgICAgICAgZXJyID0gbU9NWC0+c2V0Q29uZmlnKG1Ob2RlLCBpbmRleCwgJmVuYWJsZSwgc2l6ZW9mKGVuYWJsZSkpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIENPREVDX0xPR0UoInNldENvbmZpZygnT01YLlNFQy5pbmRleC5UaHVtYm5haWxNb2RlJykgIgotICAgICAgICAgICAgICAgICAgICAgICAicmV0dXJuZWQgZXJyb3IgMHglMDh4IiwgZXJyKTsKLQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIG1RdWlya3MgJj0gfmtPdXRwdXRCdWZmZXJzQXJlVW5yZWFkYWJsZTsKLSAgICB9Ci0KICAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMCiAgICAgICAgICYmICFtSXNFbmNvZGVyCiAgICAgICAgICYmICFzdHJuY2FzZWNtcChtTUlNRSwgInZpZGVvLyIsIDYpCkBAIC0xMDU3LDcgKzEwMTcsNyBAQAogICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsCiAgICAgICAgIGNvbnN0IENvZGVjUHJvZmlsZUxldmVsJiBkZWZhdWx0UHJvZmlsZUxldmVsLAogICAgICAgICBDb2RlY1Byb2ZpbGVMZXZlbCAmcHJvZmlsZUxldmVsKSB7Ci0gICAgQ09ERUNfTE9HVigiRGVmYXVsdCBwcm9maWxlOiAlbGQsIGxldmVsICVsZCIsCisgICAgQ09ERUNfTE9HVigiRGVmYXVsdCBwcm9maWxlOiAldSwgbGV2ZWwgI3gleCIsCiAgICAgICAgICAgICBkZWZhdWx0UHJvZmlsZUxldmVsLm1Qcm9maWxlLCBkZWZhdWx0UHJvZmlsZUxldmVsLm1MZXZlbCk7CiAKICAgICAvLyBBcmUgdGhlIGRlZmF1bHQgcHJvZmlsZSBhbmQgbGV2ZWwgb3ZlcndyaXRlbj8KQEAgLTEyODMsNyArMTI0Myw3IEBACiAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgJiYgbWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpOwogICAgIENIRUNLKHN1Y2Nlc3MpOwogCi0gICAgQ09ERUNfTE9HVigic2V0VmlkZW9PdXRwdXRGb3JtYXQgd2lkdGg9JWxkLCBoZWlnaHQ9JWxkIiwgd2lkdGgsIGhlaWdodCk7CisgICAgQ09ERUNfTE9HVigic2V0VmlkZW9PdXRwdXRGb3JtYXQgd2lkdGg9JWQsIGhlaWdodD0lZCIsIHdpZHRoLCBoZWlnaHQpOwogCiAgICAgT01YX1ZJREVPX0NPRElOR1RZUEUgY29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOwogICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsIG1pbWUpKSB7CkBAIC0xNjUwLDcgKzE2MTAsNyBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIENPREVDX0xPR1YoImFsbG9jYXRpbmcgJWx1IGJ1ZmZlcnMgb2Ygc2l6ZSAlbHUgb24gJXMgcG9ydCIsCisgICAgQ09ERUNfTE9HVigiYWxsb2NhdGluZyAldSBidWZmZXJzIG9mIHNpemUgJXUgb24gJXMgcG9ydCIsCiAgICAgICAgICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsLCBkZWYubkJ1ZmZlclNpemUsCiAgICAgICAgICAgICBwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0ID8gImlucHV0IiA6ICJvdXRwdXQiKTsKIApAQCAtMTY4Miw3ICsxNjQyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICZpbmZvLm1EYXRhKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZXJyID0gbU9NWC0+YWxsb2NhdGVCdWZmZXJXaXRoQmFja3VwKAotICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIHBvcnRJbmRleCwgbWVtLCAmYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBwb3J0SW5kZXgsIG1lbSwgJmJ1ZmZlciwgbWVtLT5zaXplKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKHBvcnRJbmRleCA9PSBrUG9ydEluZGV4T3V0cHV0CiAgICAgICAgICAgICAgICAgJiYgKG1RdWlya3MgJiBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uT3V0cHV0UG9ydHMpKSB7CkBAIC0xNjk0LDEwICsxNjU0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mby5tRGF0YSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGVyciA9IG1PTVgtPmFsbG9jYXRlQnVmZmVyV2l0aEJhY2t1cCgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Ob2RlLCBwb3J0SW5kZXgsIG1lbSwgJmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBtTm9kZSwgcG9ydEluZGV4LCBtZW0sICZidWZmZXIsIG1lbS0+c2l6ZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVyciA9IG1PTVgtPnVzZUJ1ZmZlcihtTm9kZSwgcG9ydEluZGV4LCBtZW0sICZidWZmZXIpOworICAgICAgICAgICAgZXJyID0gbU9NWC0+dXNlQnVmZmVyKG1Ob2RlLCBwb3J0SW5kZXgsIG1lbSwgJmJ1ZmZlciwgbWVtLT5zaXplKCkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMTcyOCw3ICsxNjg4LDcgQEAKIAogICAgICAgICBtUG9ydEJ1ZmZlcnNbcG9ydEluZGV4XS5wdXNoKGluZm8pOwogCi0gICAgICAgIENPREVDX0xPR1YoImFsbG9jYXRlZCBidWZmZXIgJXAgb24gJXMgcG9ydCIsIGJ1ZmZlciwKKyAgICAgICAgQ09ERUNfTE9HVigiYWxsb2NhdGVkIGJ1ZmZlciAldSBvbiAlcyBwb3J0IiwgYnVmZmVyLAogICAgICAgICAgICAgIHBvcnRJbmRleCA9PSBrUG9ydEluZGV4SW5wdXQgPyAiaW5wdXQiIDogIm91dHB1dCIpOwogICAgIH0KIApAQCAtMTc1MCw3ICsxNzEwLDcgQEAKICAgICAgICAgICAgICAgICBpZiAobVNraXBDdXRCdWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBzaXplX3QgcHJldmJ1ZmZlcnNpemUgPSBtU2tpcEN1dEJ1ZmZlci0+c2l6ZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAocHJldmJ1ZmZlcnNpemUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIlJlcGxhY2luZyBTa2lwQ3V0QnVmZmVyIGhvbGRpbmcgJWQgYnl0ZXMiLCBwcmV2YnVmZmVyc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiUmVwbGFjaW5nIFNraXBDdXRCdWZmZXIgaG9sZGluZyAlenUgYnl0ZXMiLCBwcmV2YnVmZmVyc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbVNraXBDdXRCdWZmZXIgPSBuZXcgU2tpcEN1dEJ1ZmZlcihkZWxheSAqIGZyYW1lU2l6ZSwgcGFkZGluZyAqIGZyYW1lU2l6ZSk7CkBAIC0xNzg4LDM1ICsxNzQ4LDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE9NWENvZGVjOjphcHBseVJvdGF0aW9uKCkgewotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0KLSAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKLSAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Um90YXRpb24sICZyb3RhdGlvbkRlZ3JlZXMpKSB7Ci0gICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDA7Ci0gICAgfQotCi0gICAgdWludDMyX3QgdHJhbnNmb3JtOwotICAgIHN3aXRjaCAocm90YXRpb25EZWdyZWVzKSB7Ci0gICAgICAgIGNhc2UgMDogdHJhbnNmb3JtID0gMDsgYnJlYWs7Ci0gICAgICAgIGNhc2UgOTA6IHRyYW5zZm9ybSA9IEhBTF9UUkFOU0ZPUk1fUk9UXzkwOyBicmVhazsKLSAgICAgICAgY2FzZSAxODA6IHRyYW5zZm9ybSA9IEhBTF9UUkFOU0ZPUk1fUk9UXzE4MDsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjcwOiB0cmFuc2Zvcm0gPSBIQUxfVFJBTlNGT1JNX1JPVF8yNzA7IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiB0cmFuc2Zvcm0gPSAwOyBicmVhazsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIGlmICh0cmFuc2Zvcm0pIHsKLSAgICAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190cmFuc2Zvcm0oCi0gICAgICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgdHJhbnNmb3JtKTsKLSAgICAgICAgQUxPR0UoIm5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdHJhbnNmb3JtIGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KIHN0YXR1c190IE9NWENvZGVjOjphbGxvY2F0ZU91dHB1dEJ1ZmZlcnNGcm9tTmF0aXZlV2luZG93KCkgewogICAgIC8vIEdldCB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgbmVlZGVkLgogICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgZGVmOwpAQCAtMTgzMCwyMSArMTc2MSwxMSBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkoCi0gICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLAotICAgICAgICAgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCwKLSAgICAgICAgICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0LAotICAgICAgICAgICAgZGVmLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQpOworICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7CiAKLSAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgQUxPR0UoIm5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZ2VvbWV0cnkgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gYXBwbHlSb3RhdGlvbigpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKKyAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKKyAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5Um90YXRpb24sICZyb3RhdGlvbkRlZ3JlZXMpKSB7CisgICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDA7CiAgICAgfQogCiAgICAgLy8gU2V0IHVwIHRoZSBuYXRpdmUgd2luZG93LgpAQCAtMTg1NSwzNCArMTc3NiwxOSBAQAogICAgICAgICAvLyBYWFg6IEN1cnJlbnRseSB0aGlzIGVycm9yIGlzIGxvZ2dlZCwgYnV0IG5vdCBmYXRhbC4KICAgICAgICAgdXNhZ2UgPSAwOwogICAgIH0KKwogICAgIGlmIChtRmxhZ3MgJiBrRW5hYmxlR3JhbGxvY1VzYWdlUHJvdGVjdGVkKSB7CiAgICAgICAgIHVzYWdlIHw9IEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEOwogICAgIH0KIAotICAgIC8vIE1ha2Ugc3VyZSB0byBjaGVjayB3aGV0aGVyIGVpdGhlciBTdGFnZWZyaWdodCBvciB0aGUgdmlkZW8gZGVjb2RlcgotICAgIC8vIHJlcXVlc3RlZCBwcm90ZWN0ZWQgYnVmZmVycy4KLSAgICBpZiAodXNhZ2UgJiBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCkgewotICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgQU5hdGl2ZVdpbmRvdyBzZW5kcyBpbWFnZXMgZGlyZWN0bHkgdG8KLSAgICAgICAgLy8gU3VyZmFjZUZsaW5nZXIuCi0gICAgICAgIGludCBxdWV1ZXNUb05hdGl2ZVdpbmRvdyA9IDA7Ci0gICAgICAgIGVyciA9IG1OYXRpdmVXaW5kb3ctPnF1ZXJ5KAotICAgICAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksIE5BVElWRV9XSU5ET1dfUVVFVUVTX1RPX1dJTkRPV19DT01QT1NFUiwKLSAgICAgICAgICAgICAgICAmcXVldWVzVG9OYXRpdmVXaW5kb3cpOwotICAgICAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciBhdXRoZW50aWNhdGluZyBuYXRpdmUgd2luZG93OiAlZCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIGlmIChxdWV1ZXNUb05hdGl2ZVdpbmRvdyAhPSAxKSB7Ci0gICAgICAgICAgICBBTE9HRSgibmF0aXZlIHdpbmRvdyBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCIpOwotICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQUxPR1YoIm5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlIHVzYWdlPTB4JWx4IiwgdXNhZ2UpOwotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlKAotICAgICAgICAgICAgbU5hdGl2ZVdpbmRvdy5nZXQoKSwgdXNhZ2UgfCBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUgfCBHUkFMTE9DX1VTQUdFX0VYVEVSTkFMX0RJU1ApOworICAgIGVyciA9IHNldE5hdGl2ZVdpbmRvd1NpemVGb3JtYXRBbmRVc2FnZSgKKyAgICAgICAgICAgIG1OYXRpdmVXaW5kb3cuZ2V0KCksCisgICAgICAgICAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoLAorICAgICAgICAgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQsCisgICAgICAgICAgICBkZWYuZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCwKKyAgICAgICAgICAgIHJvdGF0aW9uRGVncmVlcywKKyAgICAgICAgICAgIHVzYWdlIHwgR1JBTExPQ19VU0FHRV9IV19URVhUVVJFIHwgR1JBTExPQ19VU0FHRV9FWFRFUk5BTF9ESVNQKTsKICAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgQUxPR0UoIm5hdGl2ZV93aW5kb3dfc2V0X3VzYWdlIGZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKQEAgLTIwNDksMTUwICsxOTU1LDYgQEAKICAgICByZXR1cm4gYnVmSW5mbzsKIH0KIAotc3RhdHVzX3QgT01YQ29kZWM6OnB1c2hCbGFua0J1ZmZlcnNUb05hdGl2ZVdpbmRvdygpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSBOT19FUlJPUjsKLSAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBhbmIgPSBOVUxMOwotICAgIGludCBudW1CdWZzID0gMDsKLSAgICBpbnQgbWluVW5kZXF1ZXVlZEJ1ZnMgPSAwOwotCi0gICAgLy8gV2UgbmVlZCB0byByZWNvbm5lY3QgdG8gdGhlIEFOYXRpdmVXaW5kb3cgYXMgYSBDUFUgY2xpZW50IHRvIGVuc3VyZSB0aGF0Ci0gICAgLy8gbm8gZnJhbWVzIGdldCBkcm9wcGVkIGJ5IFN1cmZhY2VGbGluZ2VyIGFzc3VtaW5nIHRoYXQgdGhlc2UgYXJlIHZpZGVvCi0gICAgLy8gZnJhbWVzLgotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QobU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogYXBpX2Rpc2Nvbm5lY3QgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdChtTmF0aXZlV2luZG93LmdldCgpLAotICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfQ1BVKTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogYXBpX2Nvbm5lY3QgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19nZW9tZXRyeShtTmF0aXZlV2luZG93LmdldCgpLCAxLCAxLAotICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9SR0JYXzg4ODgpOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiBzZXRfYnVmZmVyc19nZW9tZXRyeSBmYWlsZWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF91c2FnZShtTmF0aXZlV2luZG93LmdldCgpLAotICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTik7Ci0gICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IHNldF91c2FnZSBmYWlsZWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBlcnIgPSBuYXRpdmVfd2luZG93X3NldF9zY2FsaW5nX21vZGUobU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVyk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IHNldF9zY2FsaW5nX21vZGUgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgZXJyID0gbU5hdGl2ZVdpbmRvdy0+cXVlcnkobU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywgJm1pblVuZGVxdWV1ZWRCdWZzKTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogTUlOX1VOREVRVUVVRURfQlVGRkVSUyBxdWVyeSAiCi0gICAgICAgICAgICAgICAgImZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBudW1CdWZzID0gbWluVW5kZXF1ZXVlZEJ1ZnMgKyAxOwotICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudChtTmF0aXZlV2luZG93LmdldCgpLCBudW1CdWZzKTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogc2V0X2J1ZmZlcl9jb3VudCBmYWlsZWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICAvLyBXZSAgcHVzaCBudW1CdWZzICsgMSBidWZmZXJzIHRvIGVuc3VyZSB0aGF0IHdlJ3ZlIGRyYXduIGludG8gdGhlIHNhbWUKLSAgICAvLyBidWZmZXIgdHdpY2UuICBUaGlzIHNob3VsZCBndWFyYW50ZWUgdGhhdCB0aGUgYnVmZmVyIGhhcyBiZWVuIGRpc3BsYXllZAotICAgIC8vIG9uIHRoZSBzY3JlZW4gYW5kIHRoZW4gYmVlbiByZXBsYWNlZCwgc28gYW4gcHJldmlvdXMgdmlkZW8gZnJhbWVzIGFyZQotICAgIC8vIGd1YXJhbnRlZWQgTk9UIHRvIGJlIGN1cnJlbnRseSBkaXNwbGF5ZWQuCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1CdWZzICsgMTsgaSsrKSB7Ci0gICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfZGVxdWV1ZV9idWZmZXJfYW5kX3dhaXQobU5hdGl2ZVdpbmRvdy5nZXQoKSwgJmFuYik7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogZGVxdWV1ZUJ1ZmZlciBmYWlsZWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmKG5ldyBHcmFwaGljQnVmZmVyKGFuYiwgZmFsc2UpKTsKLQotICAgICAgICAvLyBGaWxsIHRoZSBidWZmZXIgd2l0aCB0aGUgYSAxeDEgY2hlY2tlcmJvYXJkIHBhdHRlcm4gOykKLSAgICAgICAgdWludDMyX3QqIGltZyA9IE5VTEw7Ci0gICAgICAgIGVyciA9IGJ1Zi0+bG9jayhHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCAodm9pZCoqKSgmaW1nKSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogbG9jayBmYWlsZWQ6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgLWVycik7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgKmltZyA9IDA7Ci0KLSAgICAgICAgZXJyID0gYnVmLT51bmxvY2soKTsKLSAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiB1bmxvY2sgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IG1OYXRpdmVXaW5kb3ctPnF1ZXVlQnVmZmVyKG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICAgICAgYnVmLT5nZXROYXRpdmVCdWZmZXIoKSwgLTEpOwotICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IHF1ZXVlQnVmZmVyIGZhaWxlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCAtZXJyKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBhbmIgPSBOVUxMOwotICAgIH0KLQotZXJyb3I6Ci0KLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIC8vIENsZWFuIHVwIGFmdGVyIGFuIGVycm9yLgotICAgICAgICBpZiAoYW5iICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1OYXRpdmVXaW5kb3ctPmNhbmNlbEJ1ZmZlcihtTmF0aXZlV2luZG93LmdldCgpLCBhbmIsIC0xKTsKLSAgICAgICAgfQotCi0gICAgICAgIG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QobU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9DUFUpOwotICAgICAgICBuYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOwotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQ2xlYW4gdXAgYWZ0ZXIgc3VjY2Vzcy4KLSAgICAgICAgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdChtTmF0aXZlV2luZG93LmdldCgpLAotICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX0NQVSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogYXBpX2Rpc2Nvbm5lY3QgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QobU5hdGl2ZVdpbmRvdy5nZXQoKSwKLSAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogYXBpX2Nvbm5lY3QgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIC1lcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci19Ci0KIGludDY0X3QgT01YQ29kZWM6OmdldERlY29kaW5nVGltZVVzKCkgewogICAgIENIRUNLKG1Jc0VuY29kZXIgJiYgbUlzVmlkZW8pOwogCkBAIC0yNzEzLDcgKzI0NzUsNyBAQAogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIENPREVDX0xPR1YoIkNNRF9DT01QTEVURSglZCwgJWxkKSIsIGNtZCwgZGF0YSk7CisgICAgICAgICAgICBDT0RFQ19MT0dWKCJDTURfQ09NUExFVEUoJWQsICV1KSIsIGNtZCwgZGF0YSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTI3MzksNyArMjUwMSw3IEBACiAgICAgICAgICAgICAgICAgaWYgKGNvdW50QnVmZmVyc1dlT3duKG1Qb3J0QnVmZmVyc1trUG9ydEluZGV4SW5wdXRdKSAhPQogICAgICAgICAgICAgICAgICAgICBtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleElucHV0XS5zaXplKCkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvZGVjIGRpZCBub3QgcmV0dXJuIGFsbCBpbnB1dCBidWZmZXJzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIihyZWNlaXZlZCAlZCAvICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIocmVjZWl2ZWQgJXp1IC8gJXp1KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRCdWZmZXJzV2VPd24obVBvcnRCdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3J0QnVmZmVyc1trUG9ydEluZGV4SW5wdXRdLnNpemUoKSk7CiAgICAgICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7CkBAIC0yNzQ4LDcgKzI1MTAsNyBAQAogICAgICAgICAgICAgICAgIGlmIChjb3VudEJ1ZmZlcnNXZU93bihtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0pICE9CiAgICAgICAgICAgICAgICAgICAgIG1Qb3J0QnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XS5zaXplKCkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvZGVjIGRpZCBub3QgcmV0dXJuIGFsbCBvdXRwdXQgYnVmZmVycyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIocmVjZWl2ZWQgJWQgLyAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiKHJlY2VpdmVkICV6dSAvICV6dSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50QnVmZmVyc1dlT3duKG1Qb3J0QnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvcnRCdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLnNpemUoKSk7CiAgICAgICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7CkBAIC0yNzc0LDcgKzI1MzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAvLyB0aGVtIGhhcyBtYWRlIGl0IHRvIHRoZSBkaXNwbGF5LiAgVGhpcyBhbGxvd3MgdGhlIE9NWAogICAgICAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQgdGVhcmRvd24gdG8gemVybyBvdXQgYW55IHByb3RlY3RlZCBidWZmZXJzCiAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGhvdXQgdGhlIHJpc2sgb2Ygc2Nhbm5pbmcgb3V0IG9uZSBvZiB0aG9zZSBidWZmZXJzLgotICAgICAgICAgICAgICAgICAgICBwdXNoQmxhbmtCdWZmZXJzVG9OYXRpdmVXaW5kb3coKTsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEJsYW5rQnVmZmVyc1RvTmF0aXZlV2luZG93KG1OYXRpdmVXaW5kb3cuZ2V0KCkpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIHNldFN0YXRlKElETEVfVE9fTE9BREVEKTsKQEAgLTI4NTIsNyArMjYxNCw3IEBACiAgICAgICAgIENIRUNLKGluZm8tPm1TdGF0dXMgPT0gT1dORURfQllfVVMKICAgICAgICAgICAgICAgICB8fCBpbmZvLT5tU3RhdHVzID09IE9XTkVEX0JZX05BVElWRV9XSU5ET1cpOwogCi0gICAgICAgIENPREVDX0xPR1YoImZyZWVpbmcgYnVmZmVyICVwIG9uIHBvcnQgJWxkIiwgaW5mby0+bUJ1ZmZlciwgcG9ydEluZGV4KTsKKyAgICAgICAgQ09ERUNfTE9HVigiZnJlZWluZyBidWZmZXIgJXUgb24gcG9ydCAldSIsIGluZm8tPm1CdWZmZXIsIHBvcnRJbmRleCk7CiAKICAgICAgICAgc3RhdHVzX3QgZXJyID0gZnJlZUJ1ZmZlcihwb3J0SW5kZXgsIGkpOwogCkBAIC0yODk5LDcgKzI2NjEsNyBAQAogfQogCiB2b2lkIE9NWENvZGVjOjpvblBvcnRTZXR0aW5nc0NoYW5nZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKLSAgICBDT0RFQ19MT0dWKCJQT1JUX1NFVFRJTkdTX0NIQU5HRUQoJWxkKSIsIHBvcnRJbmRleCk7CisgICAgQ09ERUNfTE9HVigiUE9SVF9TRVRUSU5HU19DSEFOR0VEKCV1KSIsIHBvcnRJbmRleCk7CiAKICAgICBDSEVDSyhtU3RhdGUgPT0gRVhFQ1VUSU5HIHx8IG1TdGF0ZSA9PSBFWEVDVVRJTkdfVE9fSURMRSk7CiAgICAgQ0hFQ0tfRVEocG9ydEluZGV4LCAoT01YX1UzMilrUG9ydEluZGV4T3V0cHV0KTsKQEAgLTI5MjYsNyArMjY4OCw3IEBACiAgICAgQ0hFQ0sobVN0YXRlID09IEVYRUNVVElORyB8fCBtU3RhdGUgPT0gUkVDT05GSUdVUklORwogICAgICAgICAgICAgfHwgbVN0YXRlID09IEVYRUNVVElOR19UT19JRExFKTsKIAotICAgIENPREVDX0xPR1YoImZsdXNoUG9ydEFzeW5jKCVsZCk6IHdlIG93biAlZCBvdXQgb2YgJWQgYnVmZmVycyBhbHJlYWR5LiIsCisgICAgQ09ERUNfTE9HVigiZmx1c2hQb3J0QXN5bmMoJXUpOiB3ZSBvd24gJXp1IG91dCBvZiAlenUgYnVmZmVycyBhbHJlYWR5LiIsCiAgICAgICAgICBwb3J0SW5kZXgsIGNvdW50QnVmZmVyc1dlT3duKG1Qb3J0QnVmZmVyc1twb3J0SW5kZXhdKSwKICAgICAgICAgIG1Qb3J0QnVmZmVyc1twb3J0SW5kZXhdLnNpemUoKSk7CiAKQEAgLTI5NTUsNyArMjcxNyw3IEBACiAgICAgQ0hFQ0tfRVEoKGludCltUG9ydFN0YXR1c1twb3J0SW5kZXhdLCAoaW50KUVOQUJMRUQpOwogICAgIG1Qb3J0U3RhdHVzW3BvcnRJbmRleF0gPSBESVNBQkxJTkc7CiAKLSAgICBDT0RFQ19MT0dWKCJzZW5kaW5nIE9NWF9Db21tYW5kUG9ydERpc2FibGUoJWxkKSIsIHBvcnRJbmRleCk7CisgICAgQ09ERUNfTE9HVigic2VuZGluZyBPTVhfQ29tbWFuZFBvcnREaXNhYmxlKCV1KSIsIHBvcnRJbmRleCk7CiAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgbU9NWC0+c2VuZENvbW1hbmQobU5vZGUsIE9NWF9Db21tYW5kUG9ydERpc2FibGUsIHBvcnRJbmRleCk7CiAgICAgQ0hFQ0tfRVEoZXJyLCAoc3RhdHVzX3QpT0spOwpAQCAtMjk2OSw3ICsyNzMxLDcgQEAKICAgICBDSEVDS19FUSgoaW50KW1Qb3J0U3RhdHVzW3BvcnRJbmRleF0sIChpbnQpRElTQUJMRUQpOwogICAgIG1Qb3J0U3RhdHVzW3BvcnRJbmRleF0gPSBFTkFCTElORzsKIAotICAgIENPREVDX0xPR1YoInNlbmRpbmcgT01YX0NvbW1hbmRQb3J0RW5hYmxlKCVsZCkiLCBwb3J0SW5kZXgpOworICAgIENPREVDX0xPR1YoInNlbmRpbmcgT01YX0NvbW1hbmRQb3J0RW5hYmxlKCV1KSIsIHBvcnRJbmRleCk7CiAgICAgcmV0dXJuIG1PTVgtPnNlbmRDb21tYW5kKG1Ob2RlLCBPTVhfQ29tbWFuZFBvcnRFbmFibGUsIHBvcnRJbmRleCk7CiB9CiAKQEAgLTMwNDIsNyArMjgwNCw3IEBACiAKICAgICAgICAgaWYgKGluZm8tPm1EYXRhID09IHB0cikgewogICAgICAgICAgICAgQ09ERUNfTE9HVigKLSAgICAgICAgICAgICAgICAgICAgImlucHV0IGJ1ZmZlciBkYXRhIHB0ciA9ICVwLCBidWZmZXJfaWQgPSAlcCIsCisgICAgICAgICAgICAgICAgICAgICJpbnB1dCBidWZmZXIgZGF0YSBwdHIgPSAlcCwgYnVmZmVyX2lkID0gJXUiLAogICAgICAgICAgICAgICAgICAgICBwdHIsCiAgICAgICAgICAgICAgICAgICAgIGluZm8tPm1CdWZmZXIpOwogCkBAIC0zMTUyLDcgKzI5MTQsNyBAQAogICAgICAgICAgICAgICAgIGlmIChzcmNCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsICZ0YXJnZXRUaW1lVXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0YXJnZXRUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBDT0RFQ19MT0dWKCJ0YXJnZXRUaW1lVXMgPSAlbGxkIHVzIiwgdGFyZ2V0VGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgQ09ERUNfTE9HVigidGFyZ2V0VGltZVVzID0gJWxsZCB1cyIsIChsb25nIGxvbmcpdGFyZ2V0VGltZVVzKTsKICAgICAgICAgICAgICAgICAgICAgbVRhcmdldFRpbWVVcyA9IHRhcmdldFRpbWVVczsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBtVGFyZ2V0VGltZVVzID0gLTE7CkBAIC0zMTg2LDcgKzI5NDgsNyBAQAogICAgICAgICAgICAgaWYgKG9mZnNldCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgQ09ERUNfTE9HRSgKICAgICAgICAgICAgICAgICAgICAgICJDb2RlYydzIGlucHV0IGJ1ZmZlcnMgYXJlIHRvbyBzbWFsbCB0byBhY2NvbW9kYXRlICIKLSAgICAgICAgICAgICAgICAgICAgICJidWZmZXIgcmVhZCBmcm9tIHNvdXJjZSAoaW5mby0+bVNpemUgPSAlZCwgc3JjTGVuZ3RoID0gJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICJidWZmZXIgcmVhZCBmcm9tIHNvdXJjZSAoaW5mby0+bVNpemUgPSAlenUsIHNyY0xlbmd0aCA9ICV6dSkiLAogICAgICAgICAgICAgICAgICAgICAgaW5mby0+bVNpemUsIHNyY0J1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwogCiAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLT5yZWxlYXNlKCk7CkBAIC0zMjkyLDEwICszMDU0LDEwIEBACiAgICAgICAgIGluZm8gPSBmaW5kRW1wdHlJbnB1dEJ1ZmZlcigpOwogICAgIH0KIAotICAgIENPREVDX0xPR1YoIkNhbGxpbmcgZW1wdHlCdWZmZXIgb24gYnVmZmVyICVwIChsZW5ndGggJWQpLCAiCisgICAgQ09ERUNfTE9HVigiQ2FsbGluZyBlbXB0eUJ1ZmZlciBvbiBidWZmZXIgJXUgKGxlbmd0aCAlenUpLCAiCiAgICAgICAgICAgICAgICAidGltZXN0YW1wICVsbGQgdXMgKCUuMmYgc2VjcykiLAogICAgICAgICAgICAgICAgaW5mby0+bUJ1ZmZlciwgb2Zmc2V0LAotICAgICAgICAgICAgICAgdGltZXN0YW1wVXMsIHRpbWVzdGFtcFVzIC8gMUU2KTsKKyAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wVXMsIHRpbWVzdGFtcFVzIC8gMUU2KTsKIAogICAgIGVyciA9IG1PTVgtPmVtcHR5QnVmZmVyKAogICAgICAgICAgICAgbU5vZGUsIGluZm8tPm1CdWZmZXIsIDAsIG9mZnNldCwKQEAgLTMzMjAsNyArMzA4Miw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBDT0RFQ19MT0dWKCJDYWxsaW5nIGZpbGxCdWZmZXIgb24gYnVmZmVyICVwIiwgaW5mby0+bUJ1ZmZlcik7CisgICAgQ09ERUNfTE9HVigiQ2FsbGluZyBmaWxsQnVmZmVyIG9uIGJ1ZmZlciAldSIsIGluZm8tPm1CdWZmZXIpOwogICAgIHN0YXR1c190IGVyciA9IG1PTVgtPmZpbGxCdWZmZXIobU5vZGUsIGluZm8tPm1CdWZmZXIpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMzM3Nyw3ICszMTM5LDcgQEAKICAgICB9CiAgICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlckZpbGxlZC53YWl0UmVsYXRpdmUobUxvY2ssIGtCdWZmZXJGaWxsZWRFdmVudFRpbWVPdXROcyk7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBDT0RFQ19MT0dFKCJUaW1lZCBvdXQgd2FpdGluZyBmb3Igb3V0cHV0IGJ1ZmZlcnM6ICVkLyVkIiwKKyAgICAgICAgQ09ERUNfTE9HRSgiVGltZWQgb3V0IHdhaXRpbmcgZm9yIG91dHB1dCBidWZmZXJzOiAlenUvJXp1IiwKICAgICAgICAgICAgIGNvdW50QnVmZmVyc1dlT3duKG1Qb3J0QnVmZmVyc1trUG9ydEluZGV4SW5wdXRdKSwKICAgICAgICAgICAgIGNvdW50QnVmZmVyc1dlT3duKG1Qb3J0QnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XSkpOwogICAgIH0KQEAgLTM2MzIsNyArMzM5NCw3IEBACiAKIHZvaWQgT01YQ29kZWM6OnNldEltYWdlT3V0cHV0Rm9ybWF0KAogICAgICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBmb3JtYXQsIE9NWF9VMzIgd2lkdGgsIE9NWF9VMzIgaGVpZ2h0KSB7Ci0gICAgQ09ERUNfTE9HVigic2V0SW1hZ2VPdXRwdXRGb3JtYXQoJWxkLCAlbGQpIiwgd2lkdGgsIGhlaWdodCk7CisgICAgQ09ERUNfTE9HVigic2V0SW1hZ2VPdXRwdXRGb3JtYXQoJXUsICV1KSIsIHdpZHRoLCBoZWlnaHQpOwogCiAjaWYgMAogICAgIE9NWF9JTkRFWFRZUEUgaW5kZXg7CkBAIC00Mjg2LDE0ICs0MDQ4LDE0IEBACiAgICAgICAgICAgICAgICAgaWYgKChPTVhfVTMyKW51bUNoYW5uZWxzICE9IHBhcmFtcy5uQ2hhbm5lbHMpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkNvZGVjIG91dHB1dHMgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIGNoYW5uZWxzIHRoYW4gIgogICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgaW5wdXQgc3RyZWFtIGNvbnRhaW5zIChjb250YWlucyAlZCBjaGFubmVscywgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJjb2RlYyBvdXRwdXRzICVsZCBjaGFubmVscykuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY29kZWMgb3V0cHV0cyAldSBjaGFubmVscykuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywgcGFyYW1zLm5DaGFubmVscyk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gKGludDMyX3QpcGFyYW1zLm5TYW1wbGluZ1JhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkNvZGVjIG91dHB1dHMgYXQgZGlmZmVyZW50IHNhbXBsaW5nIHJhdGUgdGhhbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIndoYXQgdGhlIGlucHV0IHN0cmVhbSBjb250YWlucyAoY29udGFpbnMgZGF0YSBhdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiVkIEh6LCBjb2RlYyBvdXRwdXRzICVsdSBIeikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICIlZCBIeiwgY29kZWMgb3V0cHV0cyAldSBIeikiLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIHBhcmFtcy5uU2FtcGxpbmdSYXRlKTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTQzOTUsOCArNDE1Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vZGUsIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dENyb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3QsIHNpemVvZihyZWN0KSk7CiAKLSAgICAgICAgICAgICAgICBDT0RFQ19MT0dJKAotICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvIGRpbWVuc2lvbnMgYXJlICVsZCB4ICVsZCIsCisgICAgICAgICAgICAgICAgQ09ERUNfTE9HSSgidmlkZW8gZGltZW5zaW9ucyBhcmUgJXUgeCAldSIsCiAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19kZWYtPm5GcmFtZVdpZHRoLCB2aWRlb19kZWYtPm5GcmFtZUhlaWdodCk7CiAKICAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CkBAIC00NDE0LDggKzQxNzUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QubkxlZnQgKyByZWN0Lm5XaWR0aCAtIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5uVG9wICsgcmVjdC5uSGVpZ2h0IC0gMSk7CiAKLSAgICAgICAgICAgICAgICAgICAgQ09ERUNfTE9HSSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3JvcCByZWN0IGlzICVsZCB4ICVsZCBAICglbGQsICVsZCkiLAorICAgICAgICAgICAgICAgICAgICBDT0RFQ19MT0dJKCJDcm9wIHJlY3QgaXMgJXUgeCAldSBAICglZCwgJWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0Lm5XaWR0aCwgcmVjdC5uSGVpZ2h0LCByZWN0Lm5MZWZ0LCByZWN0Lm5Ub3ApOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRGb3JtYXQtPnNldFJlY3QoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnRXh0cmFjdG9yLmNwcAppbmRleCBiY2EyNmI5Li41NzgxNzFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ0V4dHJhY3Rvci5jcHAKQEAgLTY3LDI0ICs2NywyOCBAQAogICAgIE9nZ1NvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IE9nZ1NvdXJjZSAmKTsKIH07CiAKLXN0cnVjdCBNeVZvcmJpc0V4dHJhY3RvciB7Ci0gICAgTXlWb3JiaXNFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7Ci0gICAgdmlydHVhbCB+TXlWb3JiaXNFeHRyYWN0b3IoKTsKK3N0cnVjdCBNeU9nZ0V4dHJhY3RvciB7CisgICAgTXlPZ2dFeHRyYWN0b3IoCisgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZVR5cGUsCisgICAgICAgICAgICBzaXplX3QgbnVtSGVhZGVycywKKyAgICAgICAgICAgIGludDY0X3Qgc2Vla1ByZVJvbGxVcyk7CisgICAgdmlydHVhbCB+TXlPZ2dFeHRyYWN0b3IoKTsKIAogICAgIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKSBjb25zdDsKIAogICAgIC8vIFJldHVybnMgYW4gYXBwcm94aW1hdGUgYml0cmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQuCi0gICAgdWludDY0X3QgYXBwcm94Qml0cmF0ZSgpOworICAgIHZpcnR1YWwgdWludDY0X3QgYXBwcm94Qml0cmF0ZSgpIGNvbnN0ID0gMDsKIAogICAgIHN0YXR1c190IHNlZWtUb1RpbWUoaW50NjRfdCB0aW1lVXMpOwogICAgIHN0YXR1c190IHNlZWtUb09mZnNldChvZmY2NF90IG9mZnNldCk7Ci0gICAgc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXIgKipidWZmZXIsIGJvb2wgY29uZik7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlciAqKmJ1ZmZlcikgPSAwOwogCiAgICAgc3RhdHVzX3QgaW5pdCgpOwogCiAgICAgc3A8TWV0YURhdGE+IGdldEZpbGVNZXRhRGF0YSgpIHsgcmV0dXJuIG1GaWxlTWV0YTsgfQogCi1wcml2YXRlOgorcHJvdGVjdGVkOgogICAgIHN0cnVjdCBQYWdlIHsKICAgICAgICAgdWludDY0X3QgbUdyYW51bGVQb3NpdGlvbjsKICAgICAgICAgaW50MzJfdCBtUHJldlBhY2tldFNpemU7CkBAIC0xMDQsMTIgKzEwOCwxNyBAQAogICAgIHNwPERhdGFTb3VyY2U+IG1Tb3VyY2U7CiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwogICAgIFBhZ2UgbUN1cnJlbnRQYWdlOworICAgIHVpbnQ2NF90IG1DdXJHcmFudWxlUG9zaXRpb247CiAgICAgdWludDY0X3QgbVByZXZHcmFudWxlUG9zaXRpb247CiAgICAgc2l6ZV90IG1DdXJyZW50UGFnZVNpemU7CiAgICAgYm9vbCBtRmlyc3RQYWNrZXRJblBhZ2U7CiAgICAgdWludDY0X3QgbUN1cnJlbnRQYWdlU2FtcGxlczsKICAgICBzaXplX3QgbU5leHRMYWNlSW5kZXg7CiAKKyAgICBjb25zdCBjaGFyICptTWltZVR5cGU7CisgICAgc2l6ZV90IG1OdW1IZWFkZXJzOworICAgIGludDY0X3QgbVNlZWtQcmVSb2xsVXM7CisKICAgICBvZmY2NF90IG1GaXJzdERhdGFPZmZzZXQ7CiAKICAgICB2b3JiaXNfaW5mbyBtVmk7CkBAIC0xMjMsMTAgKzEzMiwyNiBAQAogICAgIHNzaXplX3QgcmVhZFBhZ2Uob2ZmNjRfdCBvZmZzZXQsIFBhZ2UgKnBhZ2UpOwogICAgIHN0YXR1c190IGZpbmROZXh0UGFnZShvZmY2NF90IHN0YXJ0T2Zmc2V0LCBvZmY2NF90ICpwYWdlT2Zmc2V0KTsKIAotICAgIHN0YXR1c190IHZlcmlmeUhlYWRlcigKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSk7CisgICAgdmlydHVhbCBpbnQ2NF90IGdldFRpbWVVc09mR3JhbnVsZSh1aW50NjRfdCBncmFudWxlUG9zKSBjb25zdCA9IDA7CiAKLSAgICBpbnQzMl90IHBhY2tldEJsb2NrU2l6ZShNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKKyAgICAvLyBFeHRyYWN0IGNvZGVjIGZvcm1hdCwgbWV0YWRhdGEgdGFncywgYW5kIHZhcmlvdXMgY29kZWMgc3BlY2lmaWMgZGF0YTsKKyAgICAvLyB0aGUgZm9ybWF0IGFuZCBDU0QncyBhcmUgcmVxdWlyZWQgdG8gc2V0dXAgdGhlIGRlY29kZXJzIGZvciB0aGUgZW5jbG9zZWQgbWVkaWEgY29udGVudC4KKyAgICAvLworICAgIC8vIFZhbGlkIHZhbHVlcyBmb3IgYHR5cGVgIGFyZToKKyAgICAvLyAxIC0gYml0c3RyZWFtIGlkZW50aWZpY2F0aW9uIGhlYWRlcgorICAgIC8vIDMgLSBjb21tZW50IGhlYWRlcgorICAgIC8vIDUgLSBjb2RlYyBzZXR1cCBoZWFkZXIgKFZvcmJpcyBvbmx5KQorICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgPSAwOworCisgICAgLy8gUmVhZCB0aGUgbmV4dCBvZ2cgcGFja2V0IGZyb20gdGhlIHVuZGVybHlpbmcgZGF0YSBzb3VyY2U7IG9wdGlvbmFsbHkKKyAgICAvLyBjYWxjdWxhdGUgdGhlIHRpbWVzdGFtcCBmb3IgdGhlIG91dHB1dCBwYWNrZXQgd2hpbHN0IHByZXRlbmRpbmcKKyAgICAvLyB0aGF0IHdlIGFyZSBwYXJzaW5nIGFuIE9nZyBWb3JiaXMgc3RyZWFtLgorICAgIC8vCisgICAgLy8gKmJ1ZmZlciBpcyBOVUxMJ2VkIG91dCBpbW1lZGlhdGVseSB1cG9uIGVudHJ5LCBhbmQgaWYgc3VjY2Vzc2Z1bCBhIG5ldyBidWZmZXIgaXMgYWxsb2NhdGVkOworICAgIC8vIGNsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciByZWxlYXNpbmcgdGhlIG9yaWdpbmFsIGJ1ZmZlci4KKyAgICBzdGF0dXNfdCBfcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXIgKipidWZmZXIsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCk7CisKKyAgICBpbnQzMl90IGdldFBhY2tldEJsb2NrU2l6ZShNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKIAogICAgIHZvaWQgcGFyc2VGaWxlTWV0YURhdGEoKTsKIApAQCAtMTM0LDggKzE1OSw2MSBAQAogCiAgICAgdm9pZCBidWlsZFRhYmxlT2ZDb250ZW50cygpOwogCi0gICAgTXlWb3JiaXNFeHRyYWN0b3IoY29uc3QgTXlWb3JiaXNFeHRyYWN0b3IgJik7Ci0gICAgTXlWb3JiaXNFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNeVZvcmJpc0V4dHJhY3RvciAmKTsKKyAgICBNeU9nZ0V4dHJhY3Rvcihjb25zdCBNeU9nZ0V4dHJhY3RvciAmKTsKKyAgICBNeU9nZ0V4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE15T2dnRXh0cmFjdG9yICYpOworfTsKKworc3RydWN0IE15Vm9yYmlzRXh0cmFjdG9yIDogcHVibGljIE15T2dnRXh0cmFjdG9yIHsKKyAgICBNeVZvcmJpc0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQorICAgICAgICA6IE15T2dnRXh0cmFjdG9yKHNvdXJjZSwKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsCisgICAgICAgICAgICAgICAgLyogbnVtSGVhZGVycyAqLyAzLAorICAgICAgICAgICAgICAgIC8qIHNlZWtQcmVSb2xsVXMgKi8gMCkgeworICAgIH0KKworICAgIHZpcnR1YWwgdWludDY0X3QgYXBwcm94Qml0cmF0ZSgpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlciAqKmJ1ZmZlcikgeworICAgICAgICByZXR1cm4gX3JlYWROZXh0UGFja2V0KGJ1ZmZlciwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovIHRydWUpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgaW50NjRfdCBnZXRUaW1lVXNPZkdyYW51bGUodWludDY0X3QgZ3JhbnVsZVBvcykgY29uc3QgeworICAgICAgICByZXR1cm4gZ3JhbnVsZVBvcyAqIDEwMDAwMDBsbCAvIG1WaS5yYXRlOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSk7Cit9OworCitzdHJ1Y3QgTXlPcHVzRXh0cmFjdG9yIDogcHVibGljIE15T2dnRXh0cmFjdG9yIHsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrT3B1c1NhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrT3B1c1NlZWtQcmVSb2xsVXMgPSA4MDAwMDsgLy8gODAgbXMKKworICAgIE15T3B1c0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQorICAgICAgICA6IE15T2dnRXh0cmFjdG9yKHNvdXJjZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUywgLypudW1IZWFkZXJzKi8gMiwga09wdXNTZWVrUHJlUm9sbFVzKSwKKyAgICAgICAgICBtQ2hhbm5lbENvdW50KDApLAorICAgICAgICAgIG1Db2RlY0RlbGF5KDApLAorICAgICAgICAgIG1TdGFydEdyYW51bGVQb3NpdGlvbigtMSkgeworICAgIH0KKworICAgIHZpcnR1YWwgdWludDY0X3QgYXBwcm94Qml0cmF0ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlciAqKmJ1ZmZlcik7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGludDY0X3QgZ2V0VGltZVVzT2ZHcmFudWxlKHVpbnQ2NF90IGdyYW51bGVQb3MpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSk7CisKK3ByaXZhdGU6CisgICAgc3RhdHVzX3QgdmVyaWZ5T3B1c0hlYWRlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKKyAgICBzdGF0dXNfdCB2ZXJpZnlPcHVzQ29tbWVudHMoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisgICAgdWludDMyX3QgZ2V0TnVtU2FtcGxlc0luUGFja2V0KE1lZGlhQnVmZmVyICpidWZmZXIpIGNvbnN0OworCisgICAgdWludDhfdCBtQ2hhbm5lbENvdW50OworICAgIHVpbnQxNl90IG1Db2RlY0RlbGF5OworICAgIGludDY0X3QgbVN0YXJ0R3JhbnVsZVBvc2l0aW9uOwogfTsKIAogc3RhdGljIHZvaWQgZXh0cmFjdEFsYnVtQXJ0KApAQCAtMTgxLDEzICsyNTksMTQgQEAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CiAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKLSAgICAgICAgaWYgKG1FeHRyYWN0b3ItPm1JbXBsLT5zZWVrVG9UaW1lKHNlZWtUaW1lVXMpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+bUltcGwtPnNlZWtUb1RpbWUoc2Vla1RpbWVVcyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBNZWRpYUJ1ZmZlciAqcGFja2V0OwotICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPm1JbXBsLT5yZWFkTmV4dFBhY2tldCgmcGFja2V0LCAvKiBjb25mID0gKi8gZmFsc2UpOworICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPm1JbXBsLT5yZWFkTmV4dFBhY2tldCgmcGFja2V0KTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTIxMSwxNCArMjkwLDIyIEBACiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLU15Vm9yYmlzRXh0cmFjdG9yOjpNeVZvcmJpc0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKQorTXlPZ2dFeHRyYWN0b3I6Ok15T2dnRXh0cmFjdG9yKAorICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLAorICAgICAgICBjb25zdCBjaGFyICptaW1lVHlwZSwKKyAgICAgICAgc2l6ZV90IG51bUhlYWRlcnMsCisgICAgICAgIGludDY0X3Qgc2Vla1ByZVJvbGxVcykKICAgICA6IG1Tb3VyY2Uoc291cmNlKSwKICAgICAgIG1PZmZzZXQoMCksCisgICAgICBtQ3VyR3JhbnVsZVBvc2l0aW9uKDApLAogICAgICAgbVByZXZHcmFudWxlUG9zaXRpb24oMCksCiAgICAgICBtQ3VycmVudFBhZ2VTaXplKDApLAogICAgICAgbUZpcnN0UGFja2V0SW5QYWdlKHRydWUpLAogICAgICAgbUN1cnJlbnRQYWdlU2FtcGxlcygwKSwKICAgICAgIG1OZXh0TGFjZUluZGV4KDApLAorICAgICAgbU1pbWVUeXBlKG1pbWVUeXBlKSwKKyAgICAgIG1OdW1IZWFkZXJzKG51bUhlYWRlcnMpLAorICAgICAgbVNlZWtQcmVSb2xsVXMoc2Vla1ByZVJvbGxVcyksCiAgICAgICBtRmlyc3REYXRhT2Zmc2V0KC0xKSB7CiAgICAgbUN1cnJlbnRQYWdlLm1OdW1TZWdtZW50cyA9IDA7CiAKQEAgLTIyNiwxNiArMzEzLDE2IEBACiAgICAgdm9yYmlzX2NvbW1lbnRfaW5pdCgmbVZjKTsKIH0KIAotTXlWb3JiaXNFeHRyYWN0b3I6On5NeVZvcmJpc0V4dHJhY3RvcigpIHsKK015T2dnRXh0cmFjdG9yOjp+TXlPZ2dFeHRyYWN0b3IoKSB7CiAgICAgdm9yYmlzX2NvbW1lbnRfY2xlYXIoJm1WYyk7CiAgICAgdm9yYmlzX2luZm9fY2xlYXIoJm1WaSk7CiB9CiAKLXNwPE1ldGFEYXRhPiBNeVZvcmJpc0V4dHJhY3Rvcjo6Z2V0Rm9ybWF0KCkgY29uc3Qgeworc3A8TWV0YURhdGE+IE15T2dnRXh0cmFjdG9yOjpnZXRGb3JtYXQoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1NZXRhOwogfQogCi1zdGF0dXNfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6ZmluZE5leHRQYWdlKAorc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OmZpbmROZXh0UGFnZSgKICAgICAgICAgb2ZmNjRfdCBzdGFydE9mZnNldCwgb2ZmNjRfdCAqcGFnZU9mZnNldCkgewogICAgICpwYWdlT2Zmc2V0ID0gc3RhcnRPZmZzZXQ7CiAKQEAgLTI1Miw3ICszMzksNyBAQAogICAgICAgICBpZiAoIW1lbWNtcChzaWduYXR1cmUsICJPZ2dTIiwgNCkpIHsKICAgICAgICAgICAgIGlmICgqcGFnZU9mZnNldCA+IHN0YXJ0T2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNraXBwZWQgJWxsZCBieXRlcyBvZiBqdW5rIHRvIHJlYWNoIG5leHQgZnJhbWUiLAotICAgICAgICAgICAgICAgICAgICAgKnBhZ2VPZmZzZXQgLSBzdGFydE9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSgqcGFnZU9mZnNldCAtIHN0YXJ0T2Zmc2V0KSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBPSzsKQEAgLTI2Niw3ICszNTMsNyBAQAogLy8gaXQgKGlmIGFueSkgYW5kIHJldHVybiBpdHMgZ3JhbnVsZSBwb3NpdGlvbi4KIC8vIFRvIGRvIHRoaXMgd2UgYmFjayB1cCBmcm9tIHRoZSAiY3VycmVudCIgcGFnZSdzIG9mZnNldCB1bnRpbCB3ZSBmaW5kIGFueQogLy8gcGFnZSBwcmVjZWRpbmcgaXQgYW5kIHRoZW4gc2NhbiBmb3J3YXJkIHRvIGp1c3QgYmVmb3JlIHRoZSBjdXJyZW50IHBhZ2UuCi1zdGF0dXNfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6ZmluZFByZXZHcmFudWxlUG9zaXRpb24oCitzdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6ZmluZFByZXZHcmFudWxlUG9zaXRpb24oCiAgICAgICAgIG9mZjY0X3QgcGFnZU9mZnNldCwgdWludDY0X3QgKmdyYW51bGVQb3MpIHsKICAgICAqZ3JhbnVsZVBvcyA9IDA7CiAKQEAgLTI3OSwxMCArMzY2LDE0IEBACiAgICAgICAgICAgICBwcmV2R3Vlc3MgPSAwOwogICAgICAgICB9CiAKLSAgICAgICAgQUxPR1YoImJhY2tpbmcgdXAgJWxsZCBieXRlcyIsIHBhZ2VPZmZzZXQgLSBwcmV2R3Vlc3MpOworICAgICAgICBBTE9HVigiYmFja2luZyB1cCAlbGxkIGJ5dGVzIiwgKGxvbmcgbG9uZykocGFnZU9mZnNldCAtIHByZXZHdWVzcykpOwogCiAgICAgICAgIHN0YXR1c190IGVyciA9IGZpbmROZXh0UGFnZShwcmV2R3Vlc3MsICZwcmV2UGFnZU9mZnNldCk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAvLyBXZSBhcmUgYXQgdGhlIGxhc3QgcGFnZSBhbmQgZGlkbid0IGJhY2sgb2ZmIGVub3VnaDsKKyAgICAgICAgICAgIC8vIGJhY2sgb2ZmIDUwMDAgYnl0ZXMgbW9yZSBhbmQgdHJ5IGFnYWluLgorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAKQEAgLTI5Nyw3ICszODgsNyBAQAogICAgIH0KIAogICAgIEFMT0dWKCJwcmV2UGFnZU9mZnNldCBhdCAlbGxkLCBwYWdlT2Zmc2V0IGF0ICVsbGQiLAotICAgICAgICAgcHJldlBhZ2VPZmZzZXQsIHBhZ2VPZmZzZXQpOworICAgICAgICAgICAgKGxvbmcgbG9uZylwcmV2UGFnZU9mZnNldCwgKGxvbmcgbG9uZylwYWdlT2Zmc2V0KTsKIAogICAgIGZvciAoOzspIHsKICAgICAgICAgUGFnZSBwcmV2UGFnZTsKQEAgLTMxNiwxMyArNDA3LDIyIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6c2Vla1RvVGltZShpbnQ2NF90IHRpbWVVcykgeworc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OnNlZWtUb1RpbWUoaW50NjRfdCB0aW1lVXMpIHsKKyAgICB0aW1lVXMgLT0gbVNlZWtQcmVSb2xsVXM7CisgICAgaWYgKHRpbWVVcyA8IDApIHsKKyAgICAgICAgdGltZVVzID0gMDsKKyAgICB9CisKICAgICBpZiAobVRhYmxlT2ZDb250ZW50cy5pc0VtcHR5KCkpIHsKICAgICAgICAgLy8gUGVyZm9ybSBhcHByb3hpbWF0ZSBzZWVraW5nIGJhc2VkIG9uIGF2Zy4gYml0cmF0ZS4KKyAgICAgICAgdWludDY0X3QgYnBzID0gYXBwcm94Qml0cmF0ZSgpOworICAgICAgICBpZiAoYnBzIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQogCi0gICAgICAgIG9mZjY0X3QgcG9zID0gdGltZVVzICogYXBwcm94Qml0cmF0ZSgpIC8gODAwMDAwMGxsOworICAgICAgICBvZmY2NF90IHBvcyA9IHRpbWVVcyAqIGJwcyAvIDgwMDAwMDBsbDsKIAotICAgICAgICBBTE9HVigic2Vla2luZyB0byBvZmZzZXQgJWxsZCIsIHBvcyk7CisgICAgICAgIEFMT0dWKCJzZWVraW5nIHRvIG9mZnNldCAlbGxkIiwgKGxvbmcgbG9uZylwb3MpOwogICAgICAgICByZXR1cm4gc2Vla1RvT2Zmc2V0KHBvcyk7CiAgICAgfQogCkBAIC0zNTAsMTIgKzQ1MCwxMiBAQAogICAgIGNvbnN0IFRPQ0VudHJ5ICZlbnRyeSA9IG1UYWJsZU9mQ29udGVudHMuaXRlbUF0KGxlZnQpOwogCiAgICAgQUxPR1YoInNlZWtpbmcgdG8gZW50cnkgJXp1IC8gJXp1IGF0IG9mZnNldCAlbGxkIiwKLSAgICAgICAgIGxlZnQsIG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpLCBlbnRyeS5tUGFnZU9mZnNldCk7CisgICAgICAgICBsZWZ0LCBtVGFibGVPZkNvbnRlbnRzLnNpemUoKSwgKGxvbmcgbG9uZyllbnRyeS5tUGFnZU9mZnNldCk7CiAKICAgICByZXR1cm4gc2Vla1RvT2Zmc2V0KGVudHJ5Lm1QYWdlT2Zmc2V0KTsKIH0KIAotc3RhdHVzX3QgTXlWb3JiaXNFeHRyYWN0b3I6OnNlZWtUb09mZnNldChvZmY2NF90IG9mZnNldCkgeworc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OnNlZWtUb09mZnNldChvZmY2NF90IG9mZnNldCkgewogICAgIGlmIChtRmlyc3REYXRhT2Zmc2V0ID49IDAgJiYgb2Zmc2V0IDwgbUZpcnN0RGF0YU9mZnNldCkgewogICAgICAgICAvLyBPbmNlIHdlIGtub3cgd2hlcmUgdGhlIGFjdHVhbCBhdWRpbyBkYXRhIHN0YXJ0cyAocGFzdCB0aGUgaGVhZGVycykKICAgICAgICAgLy8gZG9uJ3QgZXZlciBzZWVrIHRvIGFueXdoZXJlIGJlZm9yZSB0aGF0LgpAQCAtMzg4LDEzICs0ODgsMTMgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXNzaXplX3QgTXlWb3JiaXNFeHRyYWN0b3I6OnJlYWRQYWdlKG9mZjY0X3Qgb2Zmc2V0LCBQYWdlICpwYWdlKSB7Citzc2l6ZV90IE15T2dnRXh0cmFjdG9yOjpyZWFkUGFnZShvZmY2NF90IG9mZnNldCwgUGFnZSAqcGFnZSkgewogICAgIHVpbnQ4X3QgaGVhZGVyWzI3XTsKICAgICBzc2l6ZV90IG47CiAgICAgaWYgKChuID0gbVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkpCiAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7Ci0gICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gcmVhZCAlenUgYnl0ZXMgYXQgb2Zmc2V0IDB4JTAxNmxseCwgZ290ICV6ZCBieXRlcyIsCi0gICAgICAgICAgICAgc2l6ZW9mKGhlYWRlciksIG9mZnNldCwgbik7CisgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gcmVhZCAlenUgYnl0ZXMgYXQgb2Zmc2V0ICUjMDE2bGx4LCBnb3QgJXpkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICBzaXplb2YoaGVhZGVyKSwgKGxvbmcgbG9uZylvZmZzZXQsIG4pOwogCiAgICAgICAgIGlmIChuIDwgMCkgewogICAgICAgICAgICAgcmV0dXJuIG47CkBAIC00NTksNyArNTU5LDExMCBAQAogICAgIHJldHVybiBzaXplb2YoaGVhZGVyKSArIHBhZ2UtPm1OdW1TZWdtZW50cyArIHRvdGFsU2l6ZTsKIH0KIAotc3RhdHVzX3QgTXlWb3JiaXNFeHRyYWN0b3I6OnJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyICoqb3V0LCBib29sIGNvbmYpIHsKK3N0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6cmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXIgKipvdXQpIHsKKyAgICBpZiAobU9mZnNldCA8PSBtRmlyc3REYXRhT2Zmc2V0ICYmIG1TdGFydEdyYW51bGVQb3NpdGlvbiA8IDApIHsKKyAgICAgICAgLy8gVGhlIGZpcnN0IHNhbXBsZSBtaWdodCBub3Qgc3RhcnQgYXQgdGltZSAwOyBmaW5kIG91dCB3aGVyZSBieSBzdWJ0cmFjdGluZworICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb24gdGhlIGZpcnN0IHBhZ2UgZnJvbSB0aGUgZ3JhbnVsZSBwb3NpdGlvbgorICAgICAgICAvLyAocG9zaXRpb24gb2YgbGFzdCBjb21wbGV0ZSBzYW1wbGUpIG9mIHRoZSBmaXJzdCBwYWdlLiBUaGlzIGhhcHBlbnMKKyAgICAgICAgLy8gdGhlIGZpcnN0IHRpbWUgYmVmb3JlIHdlIGF0dGVtcHQgdG8gcmVhZCBhIHBhY2tldCBmcm9tIHRoZSBmaXJzdCBwYWdlLgorICAgICAgICBNZWRpYUJ1ZmZlciAqbUJ1ZjsKKyAgICAgICAgdWludDMyX3QgbnVtU2FtcGxlcyA9IDA7CisgICAgICAgIHVpbnQ2NF90IGN1ckdyYW51bGVQb3NpdGlvbiA9IDA7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBfcmVhZE5leHRQYWNrZXQoJm1CdWYsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqL2ZhbHNlKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRmlyc3QgdHdvIHBhZ2VzIGFyZSBoZWFkZXIgcGFnZXMuCisgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0gfHwgbUN1cnJlbnRQYWdlLm1QYWdlTm8gPiAyKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJHcmFudWxlUG9zaXRpb24gPSBtQ3VycmVudFBhZ2UubUdyYW51bGVQb3NpdGlvbjsKKyAgICAgICAgICAgIG51bVNhbXBsZXMgKz0gZ2V0TnVtU2FtcGxlc0luUGFja2V0KG1CdWYpOworICAgICAgICAgICAgbUJ1Zi0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUJ1ZiA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VyR3JhbnVsZVBvc2l0aW9uID4gbnVtU2FtcGxlcykgeworICAgICAgICAgICAgbVN0YXJ0R3JhbnVsZVBvc2l0aW9uID0gY3VyR3JhbnVsZVBvc2l0aW9uIC0gbnVtU2FtcGxlczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdGFydEdyYW51bGVQb3NpdGlvbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgc2Vla1RvT2Zmc2V0KDApOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IF9yZWFkTmV4dFBhY2tldChvdXQsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqL2ZhbHNlKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50MzJfdCBjdXJyZW50UGFnZVNhbXBsZXM7CisgICAgLy8gQ2FsY3VsYXRlIHRpbWVzdGFtcHMgYnkgYWNjdW11bGF0aW5nIGR1cmF0aW9ucyBzdGFydGluZyBmcm9tIHRoZSBmaXJzdCBzYW1wbGUgb2YgYSBwYWdlOworICAgIC8vIFdlIGFzc3VtZSB0aGF0IHdlIG9ubHkgc2VlayB0byBwYWdlIGJvdW5kYXJpZXMuCisgICAgaWYgKCgqb3V0KS0+bWV0YV9kYXRhKCktPmZpbmRJbnQzMihrS2V5VmFsaWRTYW1wbGVzLCAmY3VycmVudFBhZ2VTYW1wbGVzKSkgeworICAgICAgICAvLyBmaXJzdCBwYWNrZXQgaW4gcGFnZQorICAgICAgICBpZiAobU9mZnNldCA9PSBtRmlyc3REYXRhT2Zmc2V0KSB7CisgICAgICAgICAgICBjdXJyZW50UGFnZVNhbXBsZXMgLT0gbVN0YXJ0R3JhbnVsZVBvc2l0aW9uOworICAgICAgICAgICAgKCpvdXQpLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleVZhbGlkU2FtcGxlcywgY3VycmVudFBhZ2VTYW1wbGVzKTsKKyAgICAgICAgfQorICAgICAgICBtQ3VyR3JhbnVsZVBvc2l0aW9uID0gbUN1cnJlbnRQYWdlLm1HcmFudWxlUG9zaXRpb24gLSBjdXJyZW50UGFnZVNhbXBsZXM7CisgICAgfQorCisgICAgaW50NjRfdCB0aW1lVXMgPSBnZXRUaW1lVXNPZkdyYW51bGUobUN1ckdyYW51bGVQb3NpdGlvbik7CisgICAgKCpvdXQpLT5tZXRhX2RhdGEoKS0+c2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisKKyAgICB1aW50MzJfdCBmcmFtZXMgPSBnZXROdW1TYW1wbGVzSW5QYWNrZXQoKm91dCk7CisgICAgbUN1ckdyYW51bGVQb3NpdGlvbiArPSBmcmFtZXM7CisgICAgcmV0dXJuIE9LOworfQorCit1aW50MzJfdCBNeU9wdXNFeHRyYWN0b3I6OmdldE51bVNhbXBsZXNJblBhY2tldChNZWRpYUJ1ZmZlciAqYnVmZmVyKSBjb25zdCB7CisgICAgaWYgKGJ1ZmZlciA9PSBOVUxMIHx8IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPCAxKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHVpbnQ4X3QgKmRhdGEgPSAodWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKyAgICB1aW50OF90IHRvYyA9IGRhdGFbMF07CisgICAgdWludDhfdCBjb25maWcgPSAodG9jID4+IDMpICYgMHgxZjsKKyAgICB1aW50MzJfdCBmcmFtZVNpemVzVXNbXSA9IHsKKyAgICAgICAgMTAwMDAsIDIwMDAwLCA0MDAwMCwgNjAwMDAsIC8vIDAuLi4zCisgICAgICAgIDEwMDAwLCAyMDAwMCwgNDAwMDAsIDYwMDAwLCAvLyA0Li4uNworICAgICAgICAxMDAwMCwgMjAwMDAsIDQwMDAwLCA2MDAwMCwgLy8gOC4uLjExCisgICAgICAgIDEwMDAwLCAyMDAwMCwgICAgICAgICAgICAgICAvLyAxMi4uLjEzCisgICAgICAgIDEwMDAwLCAyMDAwMCwgICAgICAgICAgICAgICAvLyAxNC4uLjE1CisgICAgICAgIDI1MDAsIDUwMDAsIDEwMDAwLCAyMDAwMCwgICAvLyAxNi4uLjE5CisgICAgICAgIDI1MDAsIDUwMDAsIDEwMDAwLCAyMDAwMCwgICAvLyAyMC4uLjIzCisgICAgICAgIDI1MDAsIDUwMDAsIDEwMDAwLCAyMDAwMCwgICAvLyAyNC4uLjI3CisgICAgICAgIDI1MDAsIDUwMDAsIDEwMDAwLCAyMDAwMCAgICAvLyAyOC4uLjMxCisgICAgfTsKKyAgICB1aW50MzJfdCBmcmFtZVNpemVVcyA9IGZyYW1lU2l6ZXNVc1tjb25maWddOworCisgICAgdWludDMyX3QgbnVtRnJhbWVzOworICAgIHVpbnQ4X3QgYyA9IHRvYyAmIDM7CisgICAgc3dpdGNoIChjKSB7CisgICAgY2FzZSAwOgorICAgICAgICBudW1GcmFtZXMgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgY2FzZSAyOgorICAgICAgICBudW1GcmFtZXMgPSAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGlmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpIDwgMykgeworICAgICAgICAgICAgbnVtRnJhbWVzID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bUZyYW1lcyA9IGRhdGFbMl0gJiAweDNmOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorCisgICAgdWludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lU2l6ZVVzICogbnVtRnJhbWVzICoga09wdXNTYW1wbGVSYXRlIC8gMTAwMDAwMDsKKyAgICByZXR1cm4gbnVtU2FtcGxlczsKK30KKworc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6Ol9yZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlciAqKm91dCwgYm9vbCBjYWxjVm9yYmlzVGltZXN0YW1wKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gTlVMTDsKQEAgLTUwNyw4ICs3MTAsOCBAQAogICAgICAgICAgICAgICAgICAgICBwYWNrZXRTaXplKTsKIAogICAgICAgICAgICAgaWYgKG4gPCAoc3NpemVfdClwYWNrZXRTaXplKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImZhaWxlZCB0byByZWFkICV6dSBieXRlcyBhdCAweCUwMTZsbHgsIGdvdCAlemQgYnl0ZXMiLAotICAgICAgICAgICAgICAgICAgICAgcGFja2V0U2l6ZSwgZGF0YU9mZnNldCwgbik7CisgICAgICAgICAgICAgICAgQUxPR1YoImZhaWxlZCB0byByZWFkICV6dSBieXRlcyBhdCAlIzAxNmxseCwgZ290ICV6ZCBieXRlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXRTaXplLCAobG9uZyBsb25nKWRhdGFPZmZzZXQsIG4pOwogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgICAgIH0KIApAQCAtNTI1LDkgKzcyOCw4IEBACiAgICAgICAgICAgICAgICAgICAgIG1GaXJzdFBhY2tldEluUGFnZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aW1lc3RhbXAgZm9yIGNvbmZpZ3VyYXRpb24gcGFja2V0cwotICAgICAgICAgICAgICAgIGlmICghY29uZikgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGN1ckJsb2NrU2l6ZSA9IHBhY2tldEJsb2NrU2l6ZShidWZmZXIpOworICAgICAgICAgICAgICAgIGlmIChjYWxjVm9yYmlzVGltZXN0YW1wKSB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY3VyQmxvY2tTaXplID0gZ2V0UGFja2V0QmxvY2tTaXplKGJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFBhZ2UubVByZXZQYWNrZXRTaXplIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0U2l6ZSA9IGN1ckJsb2NrU2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UGFnZS5tUHJldlBhY2tldFBvcyA9CkBAIC01OTksNDMgKzgwMSwyNCBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgTXlWb3JiaXNFeHRyYWN0b3I6OmluaXQoKSB7CitzdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6aW5pdCgpIHsKICAgICBtTWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBtTWV0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUyk7CisgICAgbU1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtTWltZVR5cGUpOwogCi0gICAgTWVkaWFCdWZmZXIgKnBhY2tldDsKICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgaWYgKChlcnIgPSByZWFkTmV4dFBhY2tldCgmcGFja2V0LCAvKiBjb25mID0gKi8gdHJ1ZSkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIEFMT0dWKCJyZWFkIHBhY2tldCBvZiBzaXplICV6dVxuIiwgcGFja2V0LT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgZXJyID0gdmVyaWZ5SGVhZGVyKHBhY2tldCwgMSk7Ci0gICAgcGFja2V0LT5yZWxlYXNlKCk7Ci0gICAgcGFja2V0ID0gTlVMTDsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKChlcnIgPSByZWFkTmV4dFBhY2tldCgmcGFja2V0LCAvKiBjb25mID0gKi8gdHJ1ZSkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIEFMT0dWKCJyZWFkIHBhY2tldCBvZiBzaXplICV6dVxuIiwgcGFja2V0LT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgZXJyID0gdmVyaWZ5SGVhZGVyKHBhY2tldCwgMyk7Ci0gICAgcGFja2V0LT5yZWxlYXNlKCk7Ci0gICAgcGFja2V0ID0gTlVMTDsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKChlcnIgPSByZWFkTmV4dFBhY2tldCgmcGFja2V0LCAvKiBjb25mID0gKi8gdHJ1ZSkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIEFMT0dWKCJyZWFkIHBhY2tldCBvZiBzaXplICV6dVxuIiwgcGFja2V0LT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgZXJyID0gdmVyaWZ5SGVhZGVyKHBhY2tldCwgNSk7Ci0gICAgcGFja2V0LT5yZWxlYXNlKCk7Ci0gICAgcGFja2V0ID0gTlVMTDsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7CisgICAgTWVkaWFCdWZmZXIgKnBhY2tldDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1IZWFkZXJzOyArK2kpIHsKKyAgICAgICAgLy8gaWdub3JlIHRpbWVzdGFtcCBmb3IgY29uZmlndXJhdGlvbiBwYWNrZXRzCisgICAgICAgIGlmICgoZXJyID0gX3JlYWROZXh0UGFja2V0KCZwYWNrZXQsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqLyBmYWxzZSkpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJyZWFkIHBhY2tldCBvZiBzaXplICV6dVxuIiwgcGFja2V0LT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgIGVyciA9IHZlcmlmeUhlYWRlcihwYWNrZXQsIC8qIHR5cGUgPSAqLyBpICogMiArIDEpOworICAgICAgICBwYWNrZXQtPnJlbGVhc2UoKTsKKyAgICAgICAgcGFja2V0ID0gTlVMTDsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIG1GaXJzdERhdGFPZmZzZXQgPSBtT2Zmc2V0ICsgbUN1cnJlbnRQYWdlU2l6ZTsKQEAgLTY1MSw3ICs4MzQsNyBAQAogICAgICAgICAvLyB3ZSBjYW4gb25seSBhcHByb3hpbWF0ZSB1c2luZyBhdmcuIGJpdHJhdGUgaWYgc2Vla2luZyB0bwogICAgICAgICAvLyB0aGUgZW5kIGlzIHRvbyBleHBlbnNpdmUgb3IgaW1wb3NzaWJsZSAobGl2ZSBzdHJlYW1pbmcpLgogCi0gICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IGxhc3RHcmFudWxlUG9zaXRpb24gKiAxMDAwMDAwbGwgLyBtVmkucmF0ZTsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gZ2V0VGltZVVzT2ZHcmFudWxlKGxhc3RHcmFudWxlUG9zaXRpb24pOwogCiAgICAgICAgIG1NZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOwogCkBAIC02NjEsNyArODQ0LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgTXlWb3JiaXNFeHRyYWN0b3I6OmJ1aWxkVGFibGVPZkNvbnRlbnRzKCkgewordm9pZCBNeU9nZ0V4dHJhY3Rvcjo6YnVpbGRUYWJsZU9mQ29udGVudHMoKSB7CiAgICAgb2ZmNjRfdCBvZmZzZXQgPSBtRmlyc3REYXRhT2Zmc2V0OwogICAgIFBhZ2UgcGFnZTsKICAgICBzc2l6ZV90IHBhZ2VTaXplOwpAQCAtNjcyLDcgKzg1NSw3IEBACiAgICAgICAgICAgICBtVGFibGVPZkNvbnRlbnRzLmVkaXRJdGVtQXQobVRhYmxlT2ZDb250ZW50cy5zaXplKCkgLSAxKTsKIAogICAgICAgICBlbnRyeS5tUGFnZU9mZnNldCA9IG9mZnNldDsKLSAgICAgICAgZW50cnkubVRpbWVVcyA9IHBhZ2UubUdyYW51bGVQb3NpdGlvbiAqIDEwMDAwMDBsbCAvIG1WaS5yYXRlOworICAgICAgICBlbnRyeS5tVGltZVVzID0gZ2V0VGltZVVzT2ZHcmFudWxlKHBhZ2UubUdyYW51bGVQb3NpdGlvbik7CiAKICAgICAgICAgb2Zmc2V0ICs9IChzaXplX3QpcGFnZVNpemU7CiAgICAgfQpAQCAtNzAwLDcgKzg4Myw3IEBACiAgICAgfQogfQogCi1pbnQzMl90IE15Vm9yYmlzRXh0cmFjdG9yOjpwYWNrZXRCbG9ja1NpemUoTWVkaWFCdWZmZXIgKmJ1ZmZlcikgeworaW50MzJfdCBNeU9nZ0V4dHJhY3Rvcjo6Z2V0UGFja2V0QmxvY2tTaXplKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0KICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CiAKQEAgLTcyOSw2ICs5MTIsMTQ0IEBACiAgICAgcmV0dXJuIHZvcmJpc19wYWNrZXRfYmxvY2tzaXplKCZtVmksICZwYWNrKTsKIH0KIAoraW50NjRfdCBNeU9wdXNFeHRyYWN0b3I6OmdldFRpbWVVc09mR3JhbnVsZSh1aW50NjRfdCBncmFudWxlUG9zKSBjb25zdCB7CisgICAgdWludDY0X3QgcGNtU2FtcGxlUG9zaXRpb24gPSAwOworICAgIGlmIChncmFudWxlUG9zID4gbUNvZGVjRGVsYXkpIHsKKyAgICAgICAgcGNtU2FtcGxlUG9zaXRpb24gPSBncmFudWxlUG9zIC0gbUNvZGVjRGVsYXk7CisgICAgfQorICAgIHJldHVybiBwY21TYW1wbGVQb3NpdGlvbiAqIDEwMDAwMDBsbCAvIGtPcHVzU2FtcGxlUmF0ZTsKK30KKworc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXIgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIC8vIHRoZXJlIGFyZSBhY3R1YWxseSBubyBoZWFkZXIgdHlwZXMgZGVmaW5lZCBpbiB0aGUgT3B1cyBzcGVjOyB3ZSBjaG9vc2UgMSBhbmQgMyB0byBtZWFuCisgICAgICAgIC8vIGhlYWRlciBhbmQgY29tbWVudHMgc3VjaCB0aGF0IHdlIGNhbiBzaGFyZSBjb2RlIHdpdGggTXlWb3JiaXNFeHRyYWN0b3IuCisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHJldHVybiB2ZXJpZnlPcHVzSGVhZGVyKGJ1ZmZlcik7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHJldHVybiB2ZXJpZnlPcHVzQ29tbWVudHMoYnVmZmVyKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9Cit9CisKK3N0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5T3B1c0hlYWRlcihNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7CisgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyU2l6ZSA9IDE5OworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQorICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKworICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKworICAgIGlmIChzaXplIDwga09wdXNIZWFkZXJTaXplCisgICAgICAgICAgICB8fCBtZW1jbXAoZGF0YSwgIk9wdXNIZWFkIiwgOCkKKyAgICAgICAgICAgIHx8IC8qIHZlcnNpb24gPSAqLyBkYXRhWzhdICE9IDEpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBtQ2hhbm5lbENvdW50ID0gZGF0YVs5XTsKKyAgICBtQ29kZWNEZWxheSA9IFUxNkxFX0FUKCZkYXRhWzEwXSk7CisKKyAgICBtTWV0YS0+c2V0RGF0YShrS2V5T3B1c0hlYWRlciwgMCwgZGF0YSwgc2l6ZSk7CisgICAgbU1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBrT3B1c1NhbXBsZVJhdGUpOworICAgIG1NZXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtQ2hhbm5lbENvdW50KTsKKyAgICBtTWV0YS0+c2V0SW50NjQoa0tleU9wdXNTZWVrUHJlUm9sbCAvKiBucyAqLywga09wdXNTZWVrUHJlUm9sbFVzICogMTAwMCAvKiA9IDgwIG1zKi8pOworICAgIG1NZXRhLT5zZXRJbnQ2NChrS2V5T3B1c0NvZGVjRGVsYXkgLyogbnMgKi8sCisgICAgICAgICAgICBtQ29kZWNEZWxheSAvKiBzYW1wbGUvcyAqLyAqIDEwMDAwMDAwMDAgLyBrT3B1c1NhbXBsZVJhdGUpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeU9wdXNDb21tZW50cyhNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7CisgICAgLy8gYWRkIGFydGlmaWNpYWwgZnJhbWluZyBiaXQgc28gd2UgY2FuIHJldXNlIF92b3JiaXNfdW5wYWNrX2NvbW1lbnQKKyAgICBpbnQzMl90IGNvbW1lbnRTaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSArIDE7CisgICAgc3A8QUJ1ZmZlcj4gYUJ1ZiA9IG5ldyBBQnVmZmVyKGNvbW1lbnRTaXplKTsKKyAgICBpZiAoYUJ1Zi0+Y2FwYWNpdHkoKSA8PSBidWZmZXItPnJhbmdlX2xlbmd0aCgpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDhfdCogY29tbWVudERhdGEgPSBhQnVmLT5kYXRhKCk7CisgICAgbWVtY3B5KGNvbW1lbnREYXRhLAorICAgICAgICAgICAgKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKworICAgIG9nZ19idWZmZXIgYnVmOworICAgIGJ1Zi5kYXRhID0gY29tbWVudERhdGE7CisgICAgYnVmLnNpemUgPSBjb21tZW50U2l6ZTsKKyAgICBidWYucmVmY291bnQgPSAxOworICAgIGJ1Zi5wdHIub3duZXIgPSBOVUxMOworCisgICAgb2dnX3JlZmVyZW5jZSByZWY7CisgICAgcmVmLmJ1ZmZlciA9ICZidWY7CisgICAgcmVmLmJlZ2luID0gMDsKKyAgICByZWYubGVuZ3RoID0gY29tbWVudFNpemU7CisgICAgcmVmLm5leHQgPSBOVUxMOworCisgICAgb2dncGFja19idWZmZXIgYml0czsKKyAgICBvZ2dwYWNrX3JlYWRpbml0KCZiaXRzLCAmcmVmKTsKKworICAgIC8vIHNraXAgJ09wdXNUYWdzJworICAgIGNvbnN0IGNoYXIgKk9wdXNUYWdzID0gIk9wdXNUYWdzIjsKKyAgICBjb25zdCBpbnQzMl90IGhlYWRlckxlbiA9IHN0cmxlbihPcHVzVGFncyk7CisgICAgaW50MzJfdCBmcmFtaW5nQml0T2Zmc2V0ID0gaGVhZGVyTGVuOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyTGVuOyArK2kpIHsKKyAgICAgICAgY2hhciBjaHIgPSBvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpOworICAgICAgICBpZiAoY2hyICE9IE9wdXNUYWdzW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgfQorCisgICAgaW50MzJfdCB2ZW5kb3JMZW4gPSBvZ2dwYWNrX3JlYWQoJmJpdHMsIDMyKTsKKyAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IDQ7CisgICAgaWYgKHZlbmRvckxlbiA8IDAgfHwgdmVuZG9yTGVuID4gY29tbWVudFNpemUgLSA4KSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIC8vIHNraXAgdmVuZG9yIHN0cmluZworICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gdmVuZG9yTGVuOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmVuZG9yTGVuOyArK2kpIHsKKyAgICAgICAgb2dncGFja19yZWFkKCZiaXRzLCA4KTsKKyAgICB9CisKKyAgICBpbnQzMl90IG4gPSBvZ2dwYWNrX3JlYWQoJmJpdHMsIDMyKTsKKyAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IDQ7CisgICAgaWYgKG4gPCAwIHx8IG4gPiAoKGNvbW1lbnRTaXplIC0gb2dncGFja19ieXRlcygmYml0cykpID4+IDIpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgIGludDMyX3QgbGVuID0gb2dncGFja19yZWFkKCZiaXRzLCAzMik7CisgICAgICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gNDsKKyAgICAgICAgaWYgKGxlbiAgPCAwIHx8IGxlbiAgPiAoY29tbWVudFNpemUgLSBvZ2dwYWNrX2J5dGVzKCZiaXRzKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgZnJhbWluZ0JpdE9mZnNldCArPSBsZW47CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGVuOyArK2opIHsKKyAgICAgICAgICAgIG9nZ3BhY2tfcmVhZCgmYml0cywgOCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZyYW1pbmdCaXRPZmZzZXQgPCAwIHx8IGZyYW1pbmdCaXRPZmZzZXQgPj0gY29tbWVudFNpemUpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgY29tbWVudERhdGFbZnJhbWluZ0JpdE9mZnNldF0gPSAxOworCisgICAgYnVmLmRhdGEgPSBjb21tZW50RGF0YSArIGhlYWRlckxlbjsKKyAgICBidWYuc2l6ZSA9IGNvbW1lbnRTaXplIC0gaGVhZGVyTGVuOworICAgIGJ1Zi5yZWZjb3VudCA9IDE7CisgICAgYnVmLnB0ci5vd25lciA9IE5VTEw7CisKKyAgICByZWYuYnVmZmVyID0gJmJ1ZjsKKyAgICByZWYuYmVnaW4gPSAwOworICAgIHJlZi5sZW5ndGggPSBjb21tZW50U2l6ZSAtIGhlYWRlckxlbjsKKyAgICByZWYubmV4dCA9IE5VTEw7CisKKyAgICBvZ2dwYWNrX3JlYWRpbml0KCZiaXRzLCAmcmVmKTsKKyAgICBpbnQgZXJyID0gX3ZvcmJpc191bnBhY2tfY29tbWVudCgmbVZjLCAmYml0cyk7CisgICAgaWYgKDAgIT0gZXJyKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgcGFyc2VGaWxlTWV0YURhdGEoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE15Vm9yYmlzRXh0cmFjdG9yOjp2ZXJpZnlIZWFkZXIoCiAgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgewogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQpAQCAtNzU1LDcgKzEwNzYsOSBAQAogICAgIG9nZ3BhY2tfYnVmZmVyIGJpdHM7CiAgICAgb2dncGFja19yZWFkaW5pdCgmYml0cywgJnJlZik7CiAKLSAgICBDSEVDS19FUShvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpLCB0eXBlKTsKKyAgICBpZiAob2dncGFja19yZWFkKCZiaXRzLCA4KSAhPSB0eXBlKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNjsgKytpKSB7CiAgICAgICAgIG9nZ3BhY2tfcmVhZCgmYml0cywgOCk7ICAvLyBza2lwICd2b3JiaXMnCiAgICAgfQpAQCAtNzYzLDcgKzEwODYsOSBAQAogICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICBjYXNlIDE6CiAgICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX0VRKDAsIF92b3JiaXNfdW5wYWNrX2luZm8oJm1WaSwgJmJpdHMpKTsKKyAgICAgICAgICAgIGlmICgwICE9IF92b3JiaXNfdW5wYWNrX2luZm8oJm1WaSwgJmJpdHMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbU1ldGEtPnNldERhdGEoa0tleVZvcmJpc0luZm8sIDAsIGRhdGEsIHNpemUpOwogICAgICAgICAgICAgbU1ldGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtVmkucmF0ZSk7CkBAIC04MTIsNyArMTEzNyw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi11aW50NjRfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6YXBwcm94Qml0cmF0ZSgpIHsKK3VpbnQ2NF90IE15Vm9yYmlzRXh0cmFjdG9yOjphcHByb3hCaXRyYXRlKCkgY29uc3QgewogICAgIGlmIChtVmkuYml0cmF0ZV9ub21pbmFsICE9IDApIHsKICAgICAgICAgcmV0dXJuIG1WaS5iaXRyYXRlX25vbWluYWw7CiAgICAgfQpAQCAtODIwLDcgKzExNDUsNyBAQAogICAgIHJldHVybiAobVZpLmJpdHJhdGVfbG93ZXIgKyBtVmkuYml0cmF0ZV91cHBlcikgLyAyOwogfQogCi12b2lkIE15Vm9yYmlzRXh0cmFjdG9yOjpwYXJzZUZpbGVNZXRhRGF0YSgpIHsKK3ZvaWQgTXlPZ2dFeHRyYWN0b3I6OnBhcnNlRmlsZU1ldGFEYXRhKCkgewogICAgIG1GaWxlTWV0YSA9IG5ldyBNZXRhRGF0YTsKICAgICBtRmlsZU1ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHKTsKIApAQCAtOTYwLDExICsxMjg1LDIzIEBACiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1JbXBsKE5VTEwpIHsKLSAgICBtSW1wbCA9IG5ldyBNeVZvcmJpc0V4dHJhY3RvcihtRGF0YVNvdXJjZSk7Ci0gICAgbUluaXRDaGVjayA9IG1JbXBsLT5zZWVrVG9PZmZzZXQoMCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgICAgaWYgKG1JbXBsICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBtSW1wbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICBtSW1wbCA9IG5ldyBNeVZvcmJpc0V4dHJhY3RvcihtRGF0YVNvdXJjZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW1wbCA9IG5ldyBNeU9wdXNFeHRyYWN0b3IobURhdGFTb3VyY2UpOworICAgICAgICB9CisgICAgICAgIG1Jbml0Q2hlY2sgPSBtSW1wbC0+c2Vla1RvT2Zmc2V0KDApOwogCi0gICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKLSAgICAgICAgbUluaXRDaGVjayA9IG1JbXBsLT5pbml0KCk7CisgICAgICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7CisgICAgICAgICAgICBtSW5pdENoZWNrID0gbUltcGwtPmluaXQoKTsKKyAgICAgICAgICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDE3MmIzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm8uY3BwCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlByb2Nlc3NJbmZvIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm8uaD4KKworI2luY2x1ZGUgPGJpbmRlci9JUHJvY2Vzc0luZm9TZXJ2aWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1Byb2Nlc3NJbmZvOjpQcm9jZXNzSW5mbygpIHt9CisKK2Jvb2wgUHJvY2Vzc0luZm86OmdldFByaW9yaXR5KGludCBwaWQsIGludCogcHJpb3JpdHkpIHsKKyAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Z2V0U2VydmljZShTdHJpbmcxNigicHJvY2Vzc2luZm8iKSk7CisgICAgc3A8SVByb2Nlc3NJbmZvU2VydmljZT4gc2VydmljZSA9IGludGVyZmFjZV9jYXN0PElQcm9jZXNzSW5mb1NlcnZpY2U+KGJpbmRlcik7CisKKyAgICBzaXplX3QgbGVuZ3RoID0gMTsKKyAgICBpbnQzMl90IHN0YXRlczsKKyAgICBzdGF0dXNfdCBlcnIgPSBzZXJ2aWNlLT5nZXRQcm9jZXNzU3RhdGVzRnJvbVBpZHMobGVuZ3RoLCAmcGlkLCAmc3RhdGVzKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJnZXRQcm9jZXNzU3RhdGVzRnJvbVBpZHMgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQUxPR1YoInBpZCAlZCBzdGF0ZXMgJWQiLCBwaWQsIHN0YXRlcyk7CisgICAgaWYgKHN0YXRlcyA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFVzZSBwcm9jZXNzIHN0YXRlIGFzIHRoZSBwcmlvcml0eS4gTG93ZXIgdGhlIHZhbHVlLCBoaWdoZXIgdGhlIHByaW9yaXR5LgorICAgICpwcmlvcml0eSA9IHN0YXRlczsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworUHJvY2Vzc0luZm86On5Qcm9jZXNzSW5mbygpIHt9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVUYWJsZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TYW1wbGVUYWJsZS5jcHAKaW5kZXggMzQ3MWRlYS4uYWM4Njc3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2FtcGxlVGFibGUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NhbXBsZVRhYmxlLmNwcApAQCAtMTgsNiArMTgsOCBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8bGltaXRzPgorCiAjaW5jbHVkZSAiaW5jbHVkZS9TYW1wbGVUYWJsZS5oIgogI2luY2x1ZGUgImluY2x1ZGUvU2FtcGxlSXRlcmF0b3IuaCIKIApAQCAtNDAsNyArNDIsNyBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1jb25zdCBvZmY2NF90IGtNYXhPZmZzZXQgPSBJTlQ2NF9NQVg7Citjb25zdCBvZmY2NF90IGtNYXhPZmZzZXQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPG9mZjY0X3Q+OjptYXgoKTsKIAogc3RydWN0IFNhbXBsZVRhYmxlOjpDb21wb3NpdGlvbkRlbHRhTG9va3VwIHsKICAgICBDb21wb3NpdGlvbkRlbHRhTG9va3VwKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCmluZGV4IDEwMWZjOGEuLmUzN2U5MDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0yMCwyMiArMjAsMzUgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+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+cXVldWVCdWZmZXIobmF0aXZlV2luZG93LCBidWYtPmdldE5hdGl2ZUJ1ZmZlcigpLCAtMSk7CisgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJlcnJvciBwdXNoaW5nIGJsYW5rIGZyYW1lczogcXVldWVCdWZmZXIgZmFpbGVkOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksIC1lcnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBhbmIgPSBOVUxMOworICAgIH0KKworZXJyb3I6CisKKyAgICBpZiAoYW5iICE9IE5VTEwpIHsKKyAgICAgICAgbmF0aXZlV2luZG93LT5jYW5jZWxCdWZmZXIobmF0aXZlV2luZG93LCBhbmIsIC0xKTsKKyAgICAgICAgYW5iID0gTlVMTDsKKyAgICB9CisKKyAgICAvLyBDbGVhbiB1cCBhZnRlciBzdWNjZXNzIG9yIGVycm9yLgorICAgIHN0YXR1c190IGVycjIgPSBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KG5hdGl2ZVdpbmRvdywgTkFUSVZFX1dJTkRPV19BUElfQ1BVKTsKKyAgICBpZiAoZXJyMiAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiZXJyb3IgcHVzaGluZyBibGFuayBmcmFtZXM6IGFwaV9kaXNjb25uZWN0IGZhaWxlZDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIyKSwgLWVycjIpOworICAgICAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBlcnIgPSBlcnIyOworICAgICAgICB9CisgICAgfQorCisgICAgZXJyMiA9IG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QobmF0aXZlV2luZG93LCBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7CisgICAgaWYgKGVycjIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIHB1c2hpbmcgYmxhbmsgZnJhbWVzOiBhcGlfY29ubmVjdCBmYWlsZWQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgLWVycik7CisgICAgICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGVyciA9IGVycjI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKaW5kZXggOTg3ZjEyZC4uMjk2YzIxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcApAQCAtMTgzLDExICsxODMsMjYgQEAKICAgICAgICAgbXNnLT5zZXRJbnQzMigibWF4LWlucHV0LXNpemUiLCBtYXhJbnB1dFNpemUpOwogICAgIH0KIAorICAgIGludDMyX3QgbWF4V2lkdGg7CisgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5TWF4V2lkdGgsICZtYXhXaWR0aCkpIHsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigibWF4LXdpZHRoIiwgbWF4V2lkdGgpOworICAgIH0KKworICAgIGludDMyX3QgbWF4SGVpZ2h0OworICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleU1heEhlaWdodCwgJm1heEhlaWdodCkpIHsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigibWF4LWhlaWdodCIsIG1heEhlaWdodCk7CisgICAgfQorCiAgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7CiAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Um90YXRpb24sICZyb3RhdGlvbkRlZ3JlZXMpKSB7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCByb3RhdGlvbkRlZ3JlZXMpOwogICAgIH0KIAorICAgIGludDMyX3QgZnBzOworICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUZyYW1lUmF0ZSwgJmZwcykpIHsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiZnJhbWUtcmF0ZSIsIGZwcyk7CisgICAgfQorCiAgICAgdWludDMyX3QgdHlwZTsKICAgICBjb25zdCB2b2lkICpkYXRhOwogICAgIHNpemVfdCBzaXplOwpAQCAtNDA4LDYgKzQyMywzNCBAQAogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIHRydWUpOwogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOwogICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTAiLCBidWZmZXIpOworCisgICAgICAgIGlmICghbWV0YS0+ZmluZERhdGEoa0tleU9wdXNDb2RlY0RlbGF5LCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKKyAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMIHx8IGJ1ZmZlci0+YmFzZSgpID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKKworICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIHRydWUpOworICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOworICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTEiLCBidWZmZXIpOworCisgICAgICAgIGlmICghbWV0YS0+ZmluZERhdGEoa0tleU9wdXNTZWVrUHJlUm9sbCwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKKyAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0yIiwgYnVmZmVyKTsKICAgICB9CiAKICAgICAqZm9ybWF0ID0gbXNnOwpAQCAtNjEwLDIxICs2NTMsNDggQEAKICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4SW5wdXRTaXplKTsKICAgICB9CiAKKyAgICBpbnQzMl90IG1heFdpZHRoOworICAgIGlmIChtc2ctPmZpbmRJbnQzMigibWF4LXdpZHRoIiwgJm1heFdpZHRoKSkgeworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5TWF4V2lkdGgsIG1heFdpZHRoKTsKKyAgICB9CisKKyAgICBpbnQzMl90IG1heEhlaWdodDsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoIm1heC1oZWlnaHQiLCAmbWF4SGVpZ2h0KSkgeworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5TWF4SGVpZ2h0LCBtYXhIZWlnaHQpOworICAgIH0KKworICAgIGludDMyX3QgZnBzOworICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZnJhbWUtcmF0ZSIsICZmcHMpKSB7CisgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlGcmFtZVJhdGUsIGZwcyk7CisgICAgfQorCiAgICAgLy8gcmVhc3NlbWJsZSB0aGUgY3NkIGRhdGEgaW50byBpdHMgb3JpZ2luYWwgZm9ybQogICAgIHNwPEFCdWZmZXI+IGNzZDA7CiAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY3NkLTAiLCAmY3NkMCkpIHsKLSAgICAgICAgaWYgKG1pbWUuc3RhcnRzV2l0aCgidmlkZW8vIikpIHsgLy8gZG8gd2UgbmVlZCB0byBiZSBzdHJpY3RlciB0aGFuIHRoaXM/CisgICAgICAgIGludCBjc2Qwc2l6ZSA9IGNzZDAtPnNpemUoKTsKKyAgICAgICAgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSB7CiAgICAgICAgICAgICBzcDxBQnVmZmVyPiBjc2QxOwogICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY3NkLTEiLCAmY3NkMSkpIHsKLSAgICAgICAgICAgICAgICBjaGFyIGF2Y2NbMTAyNF07IC8vIHRoYXQgb3VnaHRhIGJlIGVub3VnaCwgcmlnaHQ/Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG91dHNpemUgPSByZWFzc2VtYmxlQVZDQyhjc2QwLCBjc2QxLCBhdmNjKTsKLSAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVkNDLCBrS2V5QVZDQywgYXZjYywgb3V0c2l6ZSk7CisgICAgICAgICAgICAgICAgVmVjdG9yPGNoYXI+IGF2Y2M7CisgICAgICAgICAgICAgICAgaW50IGF2Y2NTaXplID0gY3NkMHNpemUgKyBjc2QxLT5zaXplKCkgKyAxMDI0OworICAgICAgICAgICAgICAgIGlmIChhdmNjLnJlc2l6ZShhdmNjU2l6ZSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJlcnJvciBhbGxvY2F0aW5nIGF2Y2MgKHNpemUgJWQpOyBhYm9ydCBzZXR0aW5nIGF2Y2MuIiwgYXZjY1NpemUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvdXRzaXplID0gcmVhc3NlbWJsZUFWQ0MoY3NkMCwgY3NkMSwgYXZjYy5lZGl0QXJyYXkoKSk7CisgICAgICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUFWQ0MsIGtLZXlBVkNDLCBhdmNjLmFycmF5KCksIG91dHNpemUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtaW1lLnN0YXJ0c1dpdGgoImF1ZGlvLyIpKSB7Ci0gICAgICAgICAgICBpbnQgY3NkMHNpemUgPSBjc2QwLT5zaXplKCk7Ci0gICAgICAgICAgICBjaGFyIGVzZHNbY3NkMHNpemUgKyAzMV07Ci0gICAgICAgICAgICByZWFzc2VtYmxlRVNEUyhjc2QwLCBlc2RzKTsKLSAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUVTRFMsIGtLZXlFU0RTLCBlc2RzLCBzaXplb2YoZXNkcykpOworICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDIHx8IG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpIHsKKyAgICAgICAgICAgIFZlY3RvcjxjaGFyPiBlc2RzOworICAgICAgICAgICAgaW50IGVzZHNTaXplID0gY3NkMHNpemUgKyAzMTsKKyAgICAgICAgICAgIGlmIChlc2RzLnJlc2l6ZShlc2RzU2l6ZSkgPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImVycm9yIGFsbG9jYXRpbmcgZXNkcyAoc2l6ZSAlZCk7IGFib3J0IHNldHRpbmcgZXNkcy4iLCBlc2RzU2l6ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoZSB3cml0dGVuIEVTRFMgaXMgYWN0dWFsbHkgZm9yIGFuIGF1ZGlvIHN0cmVhbSwgYnV0IGl0J3MgZW5vdWdoCisgICAgICAgICAgICAgICAgLy8gZm9yIHRyYW5zcG9ydGluZyB0aGUgQ1NEIHRvIG11eGVycy4KKyAgICAgICAgICAgICAgICByZWFzc2VtYmxlRVNEUyhjc2QwLCBlc2RzLmVkaXRBcnJheSgpKTsKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrS2V5RVNEUywgZXNkcy5hcnJheSgpLCBlc2RzLnNpemUoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTg2NCw1ICs5MzQsODggQEAKICAgICByZXR1cm4gQVN0cmluZygiPG5vLXNjaGVtZSBVUkkgc3VwcHJlc3NlZD4iKTsKIH0KIAorSExTVGltZTo6SExTVGltZShjb25zdCBzcDxBTWVzc2FnZT4mIG1ldGEpIDoKKyAgICBtU2VxKC0xKSwKKyAgICBtVGltZVVzKC0xbGwpLAorICAgIG1NZXRhKG1ldGEpIHsKKyAgICBpZiAobWV0YSAhPSBOVUxMKSB7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZtU2VxKSk7CisgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1UaW1lVXMpKTsKKyAgICB9Cit9CisKK2ludDY0X3QgSExTVGltZTo6Z2V0U2VnbWVudFRpbWVVcygpIGNvbnN0IHsKKyAgICBpbnQ2NF90IHNlZ21lbnRTdGFydFRpbWVVcyA9IC0xbGw7CisgICAgaWYgKG1NZXRhICE9IE5VTEwpIHsKKyAgICAgICAgQ0hFQ0sobU1ldGEtPmZpbmRJbnQ2NCgic2VnbWVudFN0YXJ0VGltZVVzIiwgJnNlZ21lbnRTdGFydFRpbWVVcykpOworCisgICAgICAgIGludDY0X3Qgc2VnbWVudEZpcnN0VGltZVVzOworICAgICAgICBpZiAobU1ldGEtPmZpbmRJbnQ2NCgic2VnbWVudEZpcnN0VGltZVVzIiwgJnNlZ21lbnRGaXJzdFRpbWVVcykpIHsKKyAgICAgICAgICAgIHNlZ21lbnRTdGFydFRpbWVVcyArPSBtVGltZVVzIC0gc2VnbWVudEZpcnN0VGltZVVzOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWRqdXN0IHNlZ21lbnQgdGltZSBieSBwbGF5bGlzdCBhZ2UgKGZvciBsaXZlIHN0cmVhbWluZykKKyAgICAgICAgaW50NjRfdCBwbGF5bGlzdFRpbWVVczsKKyAgICAgICAgaWYgKG1NZXRhLT5maW5kSW50NjQoInBsYXlsaXN0VGltZVVzIiwgJnBsYXlsaXN0VGltZVVzKSkgeworICAgICAgICAgICAgaW50NjRfdCBwbGF5bGlzdEFnZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHBsYXlsaXN0VGltZVVzOworCisgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgICAgICAgICBDSEVDSyhtTWV0YS0+ZmluZEludDY0KCJzZWdtZW50RHVyYXRpb25VcyIsICZkdXJhdGlvblVzKSk7CisKKyAgICAgICAgICAgIC8vIHJvdW5kIHRvIG5lYXJlc3Qgd2hvbGUgc2VnbWVudAorICAgICAgICAgICAgcGxheWxpc3RBZ2VVcyA9IChwbGF5bGlzdEFnZVVzICsgZHVyYXRpb25VcyAvIDIpCisgICAgICAgICAgICAgICAgICAgIC8gZHVyYXRpb25VcyAqIGR1cmF0aW9uVXM7CisKKyAgICAgICAgICAgIHNlZ21lbnRTdGFydFRpbWVVcyAtPSBwbGF5bGlzdEFnZVVzOworICAgICAgICAgICAgaWYgKHNlZ21lbnRTdGFydFRpbWVVcyA8IDApIHsKKyAgICAgICAgICAgICAgICBzZWdtZW50U3RhcnRUaW1lVXMgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzZWdtZW50U3RhcnRUaW1lVXM7Cit9CisKK2Jvb2wgb3BlcmF0b3IgPChjb25zdCBITFNUaW1lICZ0MCwgY29uc3QgSExTVGltZSAmdDEpIHsKKyAgICAvLyB3ZSBjYW4gb25seSBjb21wYXJlIGRpc2NvbnRpbnVpdHkgc2VxdWVuY2UgYW5kIHRpbWVzdGFtcC4KKyAgICAvLyAobVNlZ21lbnRUaW1lVXMgaXMgbm90IHJlbGlhYmxlIGluIGxpdmUgc3RyZWFtaW5nIGNhc2UsIGl0J3MgdGhlCisgICAgLy8gdGltZSBzdGFydGluZyBmcm9tIGJlZ2lubmluZyBvZiBwbGF5bGlzdCBidXQgcGxheWxpc3QgY291bGQgY2hhbmdlLikKKyAgICByZXR1cm4gdDAubVNlcSA8IHQxLm1TZXEKKyAgICAgICAgICAgIHx8ICh0MC5tU2VxID09IHQxLm1TZXEgJiYgdDAubVRpbWVVcyA8IHQxLm1UaW1lVXMpOworfQorCit2b2lkIHdyaXRlVG9BTWVzc2FnZShzcDxBTWVzc2FnZT4gbXNnLCBjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSkgeworICAgIG1zZy0+c2V0RmxvYXQoInNwZWVkIiwgcmF0ZS5tU3BlZWQpOworICAgIG1zZy0+c2V0RmxvYXQoInBpdGNoIiwgcmF0ZS5tUGl0Y2gpOworICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvLWZhbGxiYWNrLW1vZGUiLCByYXRlLm1GYWxsYmFja01vZGUpOworICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvLXN0cmV0Y2gtbW9kZSIsIHJhdGUubVN0cmV0Y2hNb2RlKTsKK30KKwordm9pZCByZWFkRnJvbUFNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSAvKiBub25udWxsICovKSB7CisgICAgKnJhdGUgPSBBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQ7CisgICAgQ0hFQ0sobXNnLT5maW5kRmxvYXQoInNwZWVkIiwgJnJhdGUtPm1TcGVlZCkpOworICAgIENIRUNLKG1zZy0+ZmluZEZsb2F0KCJwaXRjaCIsICZyYXRlLT5tUGl0Y2gpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8tZmFsbGJhY2stbW9kZSIsIChpbnQzMl90ICopJnJhdGUtPm1GYWxsYmFja01vZGUpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8tc3RyZXRjaC1tb2RlIiwgKGludDMyX3QgKikmcmF0ZS0+bVN0cmV0Y2hNb2RlKSk7Cit9CisKK3ZvaWQgd3JpdGVUb0FNZXNzYWdlKHNwPEFNZXNzYWdlPiBtc2csIGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpIHsKKyAgICBtc2ctPnNldEludDMyKCJzeW5jLXNvdXJjZSIsIHN5bmMubVNvdXJjZSk7CisgICAgbXNnLT5zZXRJbnQzMigiYXVkaW8tYWRqdXN0LW1vZGUiLCBzeW5jLm1BdWRpb0FkanVzdE1vZGUpOworICAgIG1zZy0+c2V0RmxvYXQoInRvbGVyYW5jZSIsIHN5bmMubVRvbGVyYW5jZSk7CisgICAgbXNnLT5zZXRGbG9hdCgidmlkZW8tZnBzIiwgdmlkZW9GcHNIaW50KTsKK30KKwordm9pZCByZWFkRnJvbUFNZXNzYWdlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywKKyAgICAgICAgQVZTeW5jU2V0dGluZ3MgKnN5bmMgLyogbm9ubnVsbCAqLywKKyAgICAgICAgZmxvYXQgKnZpZGVvRnBzIC8qIG5vbm51bGwgKi8pIHsKKyAgICBBVlN5bmNTZXR0aW5ncyBzZXR0aW5nczsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic3luYy1zb3VyY2UiLCAoaW50MzJfdCAqKSZzZXR0aW5ncy5tU291cmNlKSk7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImF1ZGlvLWFkanVzdC1tb2RlIiwgKGludDMyX3QgKikmc2V0dGluZ3MubUF1ZGlvQWRqdXN0TW9kZSkpOworICAgIENIRUNLKG1zZy0+ZmluZEZsb2F0KCJ0b2xlcmFuY2UiLCAmc2V0dGluZ3MubVRvbGVyYW5jZSkpOworICAgIENIRUNLKG1zZy0+ZmluZEZsb2F0KCJ2aWRlby1mcHMiLCB2aWRlb0ZwcykpOworICAgICpzeW5jID0gc2V0dGluZ3M7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZCUklTZWVrZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVkJSSVNlZWtlci5jcHAKaW5kZXggZTk4OGY2ZC4uOGEwZmNhYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVkJSSVNlZWtlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVkJSSVNlZWtlci5jcHAKQEAgLTEyMiw3ICsxMjIsNyBAQAogCiAgICAgICAgIHNlZWtlci0+bVNlZ21lbnRzLnB1c2gobnVtQnl0ZXMpOwogCi0gICAgICAgIEFMT0dWKCJlbnRyeSAjJXp1OiAldSBvZmZzZXQgMHglMDE2bGx4IiwgaSwgbnVtQnl0ZXMsIG9mZnNldCk7CisgICAgICAgIEFMT0dWKCJlbnRyeSAjJXp1OiAldSBvZmZzZXQgJSMwMTZsbHgiLCBpLCBudW1CeXRlcywgKGxvbmcgbG9uZylvZmZzZXQpOwogICAgICAgICBvZmZzZXQgKz0gbnVtQnl0ZXM7CiAgICAgfQogCkBAIC0xNjMsNyArMTYzLDcgQEAKICAgICAgICAgKnBvcyArPSBtU2VnbWVudHMuaXRlbUF0KHNlZ21lbnRJbmRleCsrKTsKICAgICB9CiAKLSAgICBBTE9HVigiZ2V0T2Zmc2V0Rm9yVGltZSAlIiBQUklkNjQgIiB1cyA9PiAweCUwMTZsbHgiLCAqdGltZVVzLCAqcG9zKTsKKyAgICBBTE9HVigiZ2V0T2Zmc2V0Rm9yVGltZSAlbGxkIHVzID0+IDB4JTAxNmxseCIsIChsb25nIGxvbmcpKnRpbWVVcywgKGxvbmcgbG9uZykqcG9zKTsKIAogICAgICp0aW1lVXMgPSBub3dVczsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1ZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcAppbmRleCBjZTVmNWZlLi41ZmU5YmY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKQEAgLTI4LDggKzI4LDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KLQotI2luY2x1ZGUgIlZpZGVvRnJhbWVTY2hlZHVsZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTYsNyArNTUsNyBAQAogc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4U2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyOjprSGlzdG9yeVNpemU7CiAKIHN0YXRpYyBjb25zdCBzaXplX3Qga1ByZWNpc2lvbiA9IDEyOwotc3RhdGljIGNvbnN0IHNpemVfdCBrRXJyb3JUaHJlc2hvbGQgPSAoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSAvIDEwOworc3RhdGljIGNvbnN0IGludDY0X3Qga0Vycm9yVGhyZXNob2xkID0gKDEgPDwgKGtQcmVjaXNpb24gKiAyKSkgLyAxMDsKIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNdWx0aXBsZXNUaHJlc2hvbGREaXYgPSA0OyAgICAgICAgICAgIC8vIDI1JQogc3RhdGljIGNvbnN0IGludDY0X3Qga1JlRml0VGhyZXNob2xkRGl2ID0gMTAwOyAgICAgICAgICAgICAgLy8gMSUKIHN0YXRpYyBjb25zdCBuc2Vjc190IGtNYXhBbGxvd2VkRnJhbWVTa2lwID0ga05hbm9zSW4xczsgICAgIC8vIDEgc2VjCkBAIC0yNTgsNyArMjU3LDggQEAKICAgICAgICAgICAgIG1QaGFzZSA9IGZpcnN0VGltZTsKICAgICAgICAgfQogICAgIH0KLSAgICBBTE9HVigicHJpbWluZ1slenVdIHBoYXNlOiVsbGQgcGVyaW9kOiVsbGQiLCBudW1TYW1wbGVzVG9Vc2UsIG1QaGFzZSwgbVBlcmlvZCk7CisgICAgQUxPR1YoInByaW1pbmdbJXp1XSBwaGFzZTolbGxkIHBlcmlvZDolbGxkIiwKKyAgICAgICAgICAgIG51bVNhbXBsZXNUb1VzZSwgKGxvbmcgbG9uZyltUGhhc2UsIChsb25nIGxvbmcpbVBlcmlvZCk7CiB9CiAKIG5zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjphZGRTYW1wbGUobnNlY3NfdCB0aW1lKSB7CkBAIC0zMTYsNiArMzE2LDEwIEBACiAgICAgcmV0dXJuIG1QZXJpb2Q7CiB9CiAKK25zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpnZXRQZXJpb2QoKSBjb25zdCB7CisgICAgcmV0dXJuIG1QcmltZWQgPyBtUGVyaW9kIDogMDsKK30KKwogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZSBTY2hlZHVsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpAQCAtMzgyLDYgKzM4NiwxNCBAQAogICAgIHJldHVybiBrRGVmYXVsdFZzeW5jUGVyaW9kOwogfQogCitmbG9hdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpnZXRGcmFtZVJhdGUoKSB7CisgICAgbnNlY3NfdCB2aWRlb1BlcmlvZCA9IG1QbGwuZ2V0UGVyaW9kKCk7CisgICAgaWYgKHZpZGVvUGVyaW9kID4gMCkgeworICAgICAgICByZXR1cm4gMWU5IC8gdmlkZW9QZXJpb2Q7CisgICAgfQorICAgIHJldHVybiAwLmY7Cit9CisKIG5zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6c2NoZWR1bGUobnNlY3NfdCByZW5kZXJUaW1lKSB7CiAgICAgbnNlY3NfdCBvcmlnUmVuZGVyVGltZSA9IHJlbmRlclRpbWU7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9hdmNfdXRpbHMuY3BwCmluZGV4IDVlYzM0MzguLjhlZjJkY2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2F2Y191dGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYXZjX3V0aWxzLmNwcApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTg2LDE3ICsxODcsMzEgQEAKICAgICAgICAgICAgIGlmIChhc3BlY3RfcmF0aW9faWRjID09IDI1NSAvKiBleHRlbmRlZFNBUiAqLykgewogICAgICAgICAgICAgICAgIHNhcl93aWR0aCA9IGJyLmdldEJpdHMoMTYpOwogICAgICAgICAgICAgICAgIHNhcl9oZWlnaHQgPSBici5nZXRCaXRzKDE2KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXNwZWN0X3JhdGlvX2lkYyA+IDAgJiYgYXNwZWN0X3JhdGlvX2lkYyA8IDE0KSB7Ci0gICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0ZpeGVkU0FSV2lkdGhbXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgMSwgMTIsIDEwLCAxNiwgNDAsIDI0LCAyMCwgMzIsIDgwLCAxOCwgMTUsIDY0LCAxNjAKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7IHVuc2lnbmVkIHdpZHRoLCBoZWlnaHQ7IH0ga0ZpeGVkU0FSc1tdID0geworICAgICAgICAgICAgICAgICAgICAgICAgeyAgIDAsICAwIH0sIC8vIEludmFsaWQKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgMTIsIDExIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAxMCwgMTEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgIDE2LCAxMSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgNDAsIDMzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAyNCwgMTEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgIDIwLCAxMSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgMzIsIDExIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICA4MCwgMzMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgIDE4LCAxMSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgMTUsIDExIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICA2NCwgMzMgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgMTYwLCA5OSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgIDQsICAzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICB7ICAgMywgIDIgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgICAyLCAgMSB9LAogICAgICAgICAgICAgICAgIH07CiAKLSAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrRml4ZWRTQVJIZWlnaHRbXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgMSwgMTEsIDExLCAxMSwgMzMsIDExLCAxMSwgMTEsIDMzLCAxMSwgMTEsIDMzLCA5OQotICAgICAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgICAgICBzYXJfd2lkdGggPSBrRml4ZWRTQVJXaWR0aFthc3BlY3RfcmF0aW9faWRjIC0gMV07Ci0gICAgICAgICAgICAgICAgc2FyX2hlaWdodCA9IGtGaXhlZFNBUkhlaWdodFthc3BlY3RfcmF0aW9faWRjIC0gMV07CisgICAgICAgICAgICAgICAgaWYgKGFzcGVjdF9yYXRpb19pZGMgPiAwICYmIGFzcGVjdF9yYXRpb19pZGMgPCBORUxFTShrRml4ZWRTQVJzKSkgeworICAgICAgICAgICAgICAgICAgICBzYXJfd2lkdGggPSBrRml4ZWRTQVJzW2FzcGVjdF9yYXRpb19pZGNdLndpZHRoOworICAgICAgICAgICAgICAgICAgICBzYXJfaGVpZ2h0ID0ga0ZpeGVkU0FSc1thc3BlY3RfcmF0aW9faWRjXS5oZWlnaHQ7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKaW5kZXggOTRiMWM1Yi4uOGRkZmY5MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAKQEAgLTc1LDcgKzc1LDcgQEAKIAogU29mdEFBQzI6On5Tb2Z0QUFDMigpIHsKICAgICBhYWNEZWNvZGVyX0Nsb3NlKG1BQUNEZWNvZGVyKTsKLSAgICBkZWxldGUgbU91dHB1dERlbGF5UmluZ0J1ZmZlcjsKKyAgICBkZWxldGVbXSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyOwogfQogCiB2b2lkIFNvZnRBQUMyOjppbml0UG9ydHMoKSB7CkBAIC02NTEsNyArNjUxLDcgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGN1cnJlbnRUaW1lID0gbUJ1ZmZlclRpbWVzdGFtcHMudG9wKCk7CiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUaW1lICs9IG1TdHJlYW1JbmZvLT5hYWNTYW1wbGVzUGVyRnJhbWUgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBsbCAvIG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBsbCAvIG1TdHJlYW1JbmZvLT5hYWNTYW1wbGVSYXRlOwogICAgICAgICAgICAgICAgICAgICBtQnVmZmVyVGltZXN0YW1wcy5hZGQoY3VycmVudFRpbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC05MDIsNyArOTAyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkanVzdC9pbnRlcnBvbGF0ZSBuZXh0IHRpbWUgc3RhbXAKICAgICAgICAgICAgICAgICAgICAgICAgICpjdXJyZW50QnVmTGVmdCAtPSBkZWNvZGVkU2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICpuZXh0VGltZVN0YW1wICs9IG1TdHJlYW1JbmZvLT5hYWNTYW1wbGVzUGVyRnJhbWUgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwbGwgLyBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMGxsIC8gbVN0cmVhbUluZm8tPmFhY1NhbXBsZVJhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiYWRqdXN0ZWQgbmV4dFRpbWVTdGFtcC9zaXplIHRvICVsbGQvJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSAqbmV4dFRpbWVTdGFtcCwgKmN1cnJlbnRCdWZMZWZ0KTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTEwMDMsNiArMTAwMyw3IEBACiAgICAgICAgIG1CdWZmZXJTaXplcy5jbGVhcigpOwogICAgICAgICBtRGVjb2RlZFNpemVzLmNsZWFyKCk7CiAgICAgICAgIG1MYXN0SW5IZWFkZXIgPSBOVUxMOworICAgICAgICBtRW5kT2ZJbnB1dCA9IGZhbHNlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGludCBhdmFpbDsKICAgICAgICAgd2hpbGUgKChhdmFpbCA9IG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKSkgPiAwKSB7CkBAIC0xMDE3LDYgKzEwMTgsNyBAQAogICAgICAgICAgICAgbU91dHB1dEJ1ZmZlckNvdW50Kys7CiAgICAgICAgIH0KICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3M7CisgICAgICAgIG1FbmRPZk91dHB1dCA9IGZhbHNlOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAKaW5kZXggMGJhZjVmZC4uZWRmNjQ4ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwCkBAIC00ODksNyArNDg5LDE1IEBACiAgICAgfQogfQogCi12b2lkIFNvZnRBTVI6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgLyogcG9ydEluZGV4ICovKSB7Cit2b2lkIFNvZnRBTVI6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgQUxPR1YoIm9uUG9ydEZsdXNoQ29tcGxldGVkIHBvcnRpbmRleCAlZCwgcmVzZXR0aW5nIGZyYW1lICIsIHBvcnRJbmRleCk7CisgICAgaWYgKHBvcnRJbmRleCA9PSAwKSB7CisgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX05BUlJPVykgeworICAgICAgICAgICBTcGVlY2hfRGVjb2RlX0ZyYW1lX3Jlc2V0KG1TdGF0ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIHB2RGVjb2Rlcl9BbXJXYl9SZXNldChtU3RhdGUsIDAgLyogcmVzZXRfYWxsICovKTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogdm9pZCBTb2Z0QU1SOjpvblBvcnRFbmFibGVDb21wbGV0ZWQoT01YX1UzMiBwb3J0SW5kZXgsIGJvb2wgZW5hYmxlZCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAKaW5kZXggODM4ODQ3Mi4uM2MxZTFhNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuY3BwCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSAiaWgyNjRfdHlwZWRlZnMuaCIKICNpbmNsdWRlICJpdi5oIgogI2luY2x1ZGUgIml2ZC5oIgotI2luY2x1ZGUgIml0aHJlYWQuaCIKICNpbmNsdWRlICJpaDI2NGQuaCIKICNpbmNsdWRlICJTb2Z0QVZDRGVjLmgiCiAKQEAgLTExNSwxMyArMTE0LDE2IEBACiAgICAgICAgICAgICBrUHJvZmlsZUxldmVscywgQVJSQVlfU0laRShrUHJvZmlsZUxldmVscyksCiAgICAgICAgICAgICAzMjAgLyogd2lkdGggKi8sIDI0MCAvKiBoZWlnaHQgKi8sIGNhbGxiYWNrcywKICAgICAgICAgICAgIGFwcERhdGEsIGNvbXBvbmVudCksCisgICAgICBtQ29kZWNDdHgoTlVMTCksCiAgICAgICBtTWVtUmVjb3JkcyhOVUxMKSwKICAgICAgIG1GbHVzaE91dEJ1ZmZlcihOVUxMKSwKICAgICAgIG1PbXhDb2xvckZvcm1hdChPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSwKICAgICAgIG1JdkNvbG9yRm9ybWF0KElWX1lVVl80MjBQKSwKICAgICAgIG1OZXdXaWR0aChtV2lkdGgpLAogICAgICAgbU5ld0hlaWdodChtSGVpZ2h0KSwKLSAgICAgIG1DaGFuZ2luZ1Jlc29sdXRpb24oZmFsc2UpIHsKKyAgICAgIG1OZXdMZXZlbCgwKSwKKyAgICAgIG1DaGFuZ2luZ1Jlc29sdXRpb24oZmFsc2UpLAorICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSB7CiAgICAgaW5pdFBvcnRzKAogICAgICAgICAgICAga051bUJ1ZmZlcnMsIElOUFVUX0JVRl9TSVpFLCBrTnVtQnVmZmVycywgQ09ERUNfTUlNRV9UWVBFKTsKIApAQCAtMTMxLDcgKzEzMyw3IEBACiAgICAgR0VORVJBVEVfRklMRV9OQU1FUygpOwogICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7CiAKLSAgICBDSEVDS19FUShpbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworICAgIENIRUNLX0VRKGluaXREZWNvZGVyKG1XaWR0aCwgbUhlaWdodCksIChzdGF0dXNfdClPSyk7CiB9CiAKIFNvZnRBVkM6On5Tb2Z0QVZDKCkgewpAQCAtMTkxLDcgKzE5Myw3IEBACiAgICAgc19jdGxfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfaXBfdCk7CiAgICAgc19jdGxfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfb3BfdCk7CiAKLSAgICBBTE9HVigiU2V0IHRoZSBydW4tdGltZSAoZHluYW1pYykgcGFyYW1ldGVycyBzdHJpZGUgPSAldSIsIHN0cmlkZSk7CisgICAgQUxPR1YoIlNldCB0aGUgcnVuLXRpbWUgKGR5bmFtaWMpIHBhcmFtZXRlcnMgc3RyaWRlID0gJXp1Iiwgc3RyaWRlKTsKICAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2N0bF9pcCwgKHZvaWQgKikmc19jdGxfb3ApOwogCiAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CkBAIC0yMzEsNiArMjMzLDcgQEAKICAgICAgICAgQUxPR0UoIkVycm9yIGluIHJlc2V0OiAweCV4Iiwgc19jdGxfb3AudTRfZXJyb3JfY29kZSk7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKIAogICAgIC8qIFNldCB0aGUgcnVuLXRpbWUgKGR5bmFtaWMpIHBhcmFtZXRlcnMgKi8KICAgICBzZXRQYXJhbXMob3V0cHV0QnVmZmVyV2lkdGgoKSk7CkBAIC0yODQsNyArMjg3LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IFNvZnRBVkM6OmluaXREZWNvZGVyKCkgeworc3RhdHVzX3QgU29mdEFWQzo6aW5pdERlY29kZXIodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgewogICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1czsKIAogICAgIFVXT1JEMzIgdTRfbnVtX3Jlb3JkZXJfZnJhbWVzOwpAQCAtMjkzLDI4ICsyOTYsMzMgQEAKICAgICBXT1JEMzIgaTRfbGV2ZWw7CiAKICAgICBtTnVtQ29yZXMgPSBHZXRDUFVDb3JlQ291bnQoKTsKKyAgICBtQ29kZWNDdHggPSBOVUxMOwogCiAgICAgLyogSW5pdGlhbGl6ZSBudW1iZXIgb2YgcmVmIGFuZCByZW9yZGVyIG1vZGVzIChmb3IgSDI2NCkgKi8KICAgICB1NF9udW1fcmVvcmRlcl9mcmFtZXMgPSAxNjsKICAgICB1NF9udW1fcmVmX2ZyYW1lcyA9IDE2OwogICAgIHU0X3NoYXJlX2Rpc3BfYnVmID0gMDsKIAotICAgIHVpbnQzMl90IGRpc3BsYXlTdHJpZGUgPSBvdXRwdXRCdWZmZXJXaWR0aCgpOwotICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBvdXRwdXRCdWZmZXJIZWlnaHQoKTsKKyAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gbUlzQWRhcHRpdmUgPyBtQWRhcHRpdmVNYXhXaWR0aCA6IHdpZHRoOworICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBtSXNBZGFwdGl2ZSA/IG1BZGFwdGl2ZU1heEhlaWdodCA6IGhlaWdodDsKICAgICB1aW50MzJfdCBkaXNwbGF5U2l6ZVkgPSBkaXNwbGF5U3RyaWRlICogZGlzcGxheUhlaWdodDsKIAotICAgIGlmIChkaXNwbGF5U2l6ZVkgPiAoMTkyMCAqIDEwODgpKSB7Ci0gICAgICAgIGk0X2xldmVsID0gNTA7Ci0gICAgfSBlbHNlIGlmIChkaXNwbGF5U2l6ZVkgPiAoMTI4MCAqIDcyMCkpIHsKLSAgICAgICAgaTRfbGV2ZWwgPSA0MDsKLSAgICB9IGVsc2UgaWYgKGRpc3BsYXlTaXplWSA+ICg3MjAgKiA1NzYpKSB7Ci0gICAgICAgIGk0X2xldmVsID0gMzE7Ci0gICAgfSBlbHNlIGlmIChkaXNwbGF5U2l6ZVkgPiAoNjI0ICogMzIwKSkgewotICAgICAgICBpNF9sZXZlbCA9IDMwOwotICAgIH0gZWxzZSBpZiAoZGlzcGxheVNpemVZID4gKDM1MiAqIDI4OCkpIHsKLSAgICAgICAgaTRfbGV2ZWwgPSAyMTsKKyAgICBpZihtTmV3TGV2ZWwgPT0gMCl7CisgICAgICAgIGlmIChkaXNwbGF5U2l6ZVkgPiAoMTkyMCAqIDEwODgpKSB7CisgICAgICAgICAgICBpNF9sZXZlbCA9IDUwOworICAgICAgICB9IGVsc2UgaWYgKGRpc3BsYXlTaXplWSA+ICgxMjgwICogNzIwKSkgeworICAgICAgICAgICAgaTRfbGV2ZWwgPSA0MDsKKyAgICAgICAgfSBlbHNlIGlmIChkaXNwbGF5U2l6ZVkgPiAoNzIwICogNTc2KSkgeworICAgICAgICAgICAgaTRfbGV2ZWwgPSAzMTsKKyAgICAgICAgfSBlbHNlIGlmIChkaXNwbGF5U2l6ZVkgPiAoNjI0ICogMzIwKSkgeworICAgICAgICAgICAgaTRfbGV2ZWwgPSAzMDsKKyAgICAgICAgfSBlbHNlIGlmIChkaXNwbGF5U2l6ZVkgPiAoMzUyICogMjg4KSkgeworICAgICAgICAgICAgaTRfbGV2ZWwgPSAyMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGk0X2xldmVsID0gMjA7CisgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBpNF9sZXZlbCA9IDIwOworICAgICAgICBpNF9sZXZlbCA9IG1OZXdMZXZlbDsKICAgICB9CiAKICAgICB7CkBAIC00MzAsNiArNDM4LDcgQEAKIAogICAgICAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2luaXRfaXAsICh2b2lkICopJnNfaW5pdF9vcCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICAgICAgbUNvZGVjQ3R4ID0gTlVMTDsKICAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBpbml0OiAweCV4IiwKICAgICAgICAgICAgICAgICAgICAgc19pbml0X29wLnNfaXZkX2luaXRfb3BfdC51NF9lcnJvcl9jb2RlKTsKICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwpAQCAtNDUyLDcgKzQ2MSw3IEBACiAgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IGRpc3BsYXlTaXplWSAqIDMgLyAyOwogICAgIG1GbHVzaE91dEJ1ZmZlciA9ICh1aW50OF90ICopaXZkX2FsaWduZWRfbWFsbG9jKDEyOCwgYnVmZmVyU2l6ZSk7CiAgICAgaWYgKE5VTEwgPT0gbUZsdXNoT3V0QnVmZmVyKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgYWxsb2NhdGUgZmx1c2hPdXRwdXRCdWZmZXIgb2Ygc2l6ZSAlenUiLCBidWZmZXJTaXplKTsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBhbGxvY2F0ZSBmbHVzaE91dHB1dEJ1ZmZlciBvZiBzaXplICV1IiwgYnVmZmVyU2l6ZSk7CiAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgfQogCkBAIC00ODksMTIgKzQ5OCwxMiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgU29mdEFWQzo6cmVJbml0RGVjb2RlcigpIHsKK3N0YXR1c190IFNvZnRBVkM6OnJlSW5pdERlY29kZXIodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgewogICAgIHN0YXR1c190IHJldDsKIAogICAgIGRlSW5pdERlY29kZXIoKTsKIAotICAgIHJldCA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0ID0gaW5pdERlY29kZXIod2lkdGgsIGhlaWdodCk7CiAgICAgaWYgKE9LICE9IHJldCkgewogICAgICAgICBBTE9HRSgiQ3JlYXRlIGZhaWx1cmUiKTsKICAgICAgICAgZGVJbml0RGVjb2RlcigpOwpAQCAtNTA2LDYgKzUxNSw3IEBACiB2b2lkIFNvZnRBVkM6Om9uUmVzZXQoKSB7CiAgICAgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6b25SZXNldCgpOwogCisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CiAgICAgcmVzZXREZWNvZGVyKCk7CiAgICAgcmVzZXRQbHVnaW4oKTsKIH0KQEAgLTUxNSwxMiArNTI1LDE5IEBACiAgICAgY29uc3QgdWludDMyX3Qgb2xkSGVpZ2h0ID0gbUhlaWdodDsKICAgICBPTVhfRVJST1JUWVBFIHJldCA9IFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmludGVybmFsU2V0UGFyYW1ldGVyKGluZGV4LCBwYXJhbXMpOwogICAgIGlmIChtV2lkdGggIT0gb2xkV2lkdGggfHwgbUhlaWdodCAhPSBvbGRIZWlnaHQpIHsKLSAgICAgICAgcmVJbml0RGVjb2RlcigpOworICAgICAgICBtTmV3V2lkdGggPSBtV2lkdGg7CisgICAgICAgIG1OZXdIZWlnaHQgPSBtSGVpZ2h0OworICAgICAgICBzdGF0dXNfdCBlcnIgPSByZUluaXREZWNvZGVyKG1OZXdXaWR0aCwgbU5ld0hlaWdodCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nLCBlcnIsIE5VTEwpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc7CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KIAotdm9pZCBTb2Z0QVZDOjpzZXREZWNvZGVBcmdzKAorYm9vbCBTb2Z0QVZDOjpzZXREZWNvZGVBcmdzKAogICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY19pcCwKICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNfb3AsCiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciwKQEAgLTUyOCw3ICs1NDUsNiBAQAogICAgICAgICBzaXplX3QgdGltZVN0YW1wSXgpIHsKICAgICBzaXplX3Qgc2l6ZVkgPSBvdXRwdXRCdWZmZXJXaWR0aCgpICogb3V0cHV0QnVmZmVySGVpZ2h0KCk7CiAgICAgc2l6ZV90IHNpemVVVjsKLSAgICB1aW50OF90ICpwQnVmOwogCiAgICAgcHNfZGVjX2lwLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfaXBfdCk7CiAgICAgcHNfZGVjX29wLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfb3BfdCk7CkBAIC01NDgsMjIgKzU2NCwyOCBAQAogICAgICAgICBwc19kZWNfaXAtPnU0X251bV9CeXRlcyA9IDA7CiAgICAgfQogCi0gICAgaWYgKG91dEhlYWRlcikgewotICAgICAgICBwQnVmID0gb3V0SGVhZGVyLT5wQnVmZmVyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBCdWYgPSBtRmx1c2hPdXRCdWZmZXI7Ci0gICAgfQotCiAgICAgc2l6ZVVWID0gc2l6ZVkgLyA0OwogICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMF0gPSBzaXplWTsKICAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzFdID0gc2l6ZVVWOwogICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMl0gPSBzaXplVVY7CiAKKyAgICB1aW50OF90ICpwQnVmOworICAgIGlmIChvdXRIZWFkZXIpIHsKKyAgICAgICAgaWYgKG91dEhlYWRlci0+bkFsbG9jTGVuIDwgc2l6ZVkgKyAoc2l6ZVVWICogMikpIHsKKyAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjc4MzM2MTYiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwQnVmID0gb3V0SGVhZGVyLT5wQnVmZmVyOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIG1GbHVzaE91dEJ1ZmZlciBhbHdheXMgaGFzIHRoZSByaWdodCBzaXplLgorICAgICAgICBwQnVmID0gbUZsdXNoT3V0QnVmZmVyOworICAgIH0KKwogICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gcEJ1ZjsKICAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IHBCdWYgKyBzaXplWTsKICAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IHBCdWYgKyBzaXplWSArIHNpemVVVjsKICAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9udW1fYnVmcyA9IDM7Ci0gICAgcmV0dXJuOworICAgIHJldHVybiB0cnVlOwogfQogdm9pZCBTb2Z0QVZDOjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgewogICAgIC8qIE9uY2UgdGhlIG91dHB1dCBidWZmZXJzIGFyZSBmbHVzaGVkLCBpZ25vcmUgYW55IGJ1ZmZlcnMgdGhhdCBhcmUgaGVsZCBpbiBkZWNvZGVyICovCkBAIC01OTAsNiArNjEyLDkgQEAKIHZvaWQgU29mdEFWQzo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCkgewogICAgIFVOVVNFRChwb3J0SW5kZXgpOwogCisgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgeworICAgICAgICByZXR1cm47CisgICAgfQogICAgIGlmIChtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlICE9IE5PTkUpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTYyMiw2ICs2NDcsMTEgQEAKICAgICAgICAgICAgIGlmICghaW5RdWV1ZS5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgaW5JbmZvID0gKmluUXVldWUuYmVnaW4oKTsKICAgICAgICAgICAgICAgICBpbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKyAgICAgICAgICAgICAgICBpZiAoaW5IZWFkZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpblF1ZXVlLmVyYXNlKGluUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNjMzLDE0ICs2NjMsMjEgQEAKICAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gMDsKICAgICAgICAgb3V0SGVhZGVyLT5uT2Zmc2V0ID0gMDsKIAotICAgICAgICBpZiAoaW5IZWFkZXIgIT0gTlVMTCAmJiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKLSAgICAgICAgICAgIG1SZWNlaXZlZEVPUyA9IHRydWU7CisgICAgICAgIGlmIChpbkhlYWRlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgewogICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKICAgICAgICAgICAgICAgICBpbkluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworCisgICAgICAgICAgICAgICAgaWYgKCEoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbVJlY2VpdmVkRU9TID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBpbkhlYWRlciA9IE5VTEw7CiAgICAgICAgICAgICAgICAgc2V0Rmx1c2hNb2RlKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgICAgICBtUmVjZWl2ZWRFT1MgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTY0OCw5ICs2ODUsMTUgQEAKICAgICAgICAgLy8gdXBkYXRlIG91dHB1dCBwb3J0J3MgZGVmaW5pdGlvbiBhbmQgcmVpbml0aWFsaXplIGRlY29kZXIuCiAgICAgICAgIGlmIChtSW5pdE5lZWRlZCAmJiAhbUlzSW5GbHVzaCkgewogICAgICAgICAgICAgYm9vbCBwb3J0V2lsbFJlc2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICBoYW5kbGVQb3J0U2V0dGluZ3NDaGFuZ2UoJnBvcnRXaWxsUmVzZXQsIG1OZXdXaWR0aCwgbU5ld0hlaWdodCk7CiAKLSAgICAgICAgICAgIENIRUNLX0VRKHJlSW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHJlSW5pdERlY29kZXIobU5ld1dpZHRoLCBtTmV3SGVpZ2h0KTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZywgZXJyLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKCZwb3J0V2lsbFJlc2V0LCBtTmV3V2lkdGgsIG1OZXdIZWlnaHQpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTY3Niw3ICs3MTksMTIgQEAKICAgICAgICAgICAgIFdPUkQzMiB0aW1lRGVsYXksIHRpbWVUYWtlbjsKICAgICAgICAgICAgIHNpemVfdCBzaXplWSwgc2l6ZVVWOwogCi0gICAgICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBpbkhlYWRlciwgb3V0SGVhZGVyLCB0aW1lU3RhbXBJeCk7CisgICAgICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjX2lwLCAmc19kZWNfb3AsIGluSGVhZGVyLCBvdXRIZWFkZXIsIHRpbWVTdGFtcEl4KSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJEZWNvZGVyIGFyZyBzZXR1cCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBJZiBpbnB1dCBkdW1wIGlzIGVuYWJsZWQsIHRoZW4gd3JpdGUgdG8gZmlsZQogICAgICAgICAgICAgRFVNUF9UT19GSUxFKG1JbkZpbGUsIHNfZGVjX2lwLnB2X3N0cmVhbV9idWZmZXIsIHNfZGVjX2lwLnU0X251bV9CeXRlcyk7CiAKQEAgLTY5MSw2ICs3MzksNyBAQAogICAgICAgICAgICAgYm9vbCB1bnN1cHBvcnRlZERpbWVuc2lvbnMgPQogICAgICAgICAgICAgICAgIChJVkRfU1RSRUFNX1dJRFRIX0hFSUdIVF9OT1RfU1VQUE9SVEVEID09IChzX2RlY19vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpOwogICAgICAgICAgICAgYm9vbCByZXNDaGFuZ2VkID0gKElWRF9SRVNfQ0hBTkdFRCA9PSAoc19kZWNfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKTsKKyAgICAgICAgICAgIGJvb2wgdW5zdXBwb3J0ZWRMZXZlbCA9IChJSDI2NERfVU5TVVBQT1JURURfTEVWRUwgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSk7CiAKICAgICAgICAgICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBOVUxMKTsKICAgICAgICAgICAgIC8qIENvbXB1dGUgdGltZSB0YWtlbiBmb3IgZGVjb2RlKCkgKi8KQEAgLTcwOCwxMyArNzU3LDM5IEBACiAgICAgICAgICAgICAgICAgbVRpbWVTdGFtcHNWYWxpZFt0aW1lU3RhbXBJeF0gPSBmYWxzZTsKICAgICAgICAgICAgIH0KIAorCiAgICAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBoYW5kbGUgQ1RTIERlY29kZXJUZXN0IHRlc3RDb2RlY1Jlc2V0c0gyNjRXaXRob3V0U3VyZmFjZSwKICAgICAgICAgICAgIC8vIHdoaWNoIGlzIG5vdCBzZW5kaW5nIFNQUy9QUFMgYWZ0ZXIgcG9ydCByZWNvbmZpZ3VyYXRpb24gYW5kIGZsdXNoIHRvIHRoZSBjb2RlYy4KICAgICAgICAgICAgIGlmICh1bnN1cHBvcnRlZERpbWVuc2lvbnMgJiYgIW1GbHVzaE5lZWRlZCkgewogICAgICAgICAgICAgICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgmcG9ydFdpbGxSZXNldCwgc19kZWNfb3AudTRfcGljX3dkLCBzX2RlY19vcC51NF9waWNfaHQpOworICAgICAgICAgICAgICAgIG1OZXdXaWR0aCA9IHNfZGVjX29wLnU0X3BpY193ZDsKKyAgICAgICAgICAgICAgICBtTmV3SGVpZ2h0ID0gc19kZWNfb3AudTRfcGljX2h0OwogCi0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEocmVJbml0RGVjb2RlcigpLCAoc3RhdHVzX3QpT0spOworICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHJlSW5pdERlY29kZXIobU5ld1dpZHRoLCBtTmV3SGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nLCBlcnIsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaGFuZGxlUG9ydFNldHRpbmdzQ2hhbmdlKCZwb3J0V2lsbFJlc2V0LCBtTmV3V2lkdGgsIG1OZXdIZWlnaHQpOworCisgICAgICAgICAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgaW5IZWFkZXIsIG91dEhlYWRlciwgdGltZVN0YW1wSXgpOworCisgICAgICAgICAgICAgICAgaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19kZWNfaXAsICh2b2lkICopJnNfZGVjX29wKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh1bnN1cHBvcnRlZExldmVsICYmICFtRmx1c2hOZWVkZWQpIHsKKworICAgICAgICAgICAgICAgIG1OZXdMZXZlbCA9IDUxOworCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVJbml0RGVjb2RlcihtTmV3V2lkdGgsIG1OZXdIZWlnaHQpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmcsIGVyciwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBpbkhlYWRlciwgb3V0SGVhZGVyLCB0aW1lU3RhbXBJeCk7CiAKQEAgLTc0NSw2ICs4MjAsMTcgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKHVuc3VwcG9ydGVkTGV2ZWwpIHsKKworICAgICAgICAgICAgICAgIGlmIChtRmx1c2hOZWVkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0Rmx1c2hNb2RlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbU5ld0xldmVsID0gNTE7CisgICAgICAgICAgICAgICAgbUluaXROZWVkZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoKDAgPCBzX2RlY19vcC51NF9waWNfd2QpICYmICgwIDwgc19kZWNfb3AudTRfcGljX2h0KSkgewogICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoID0gc19kZWNfb3AudTRfcGljX3dkOwogICAgICAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCA9IHNfZGVjX29wLnU0X3BpY19odDsKQEAgLTc1OCw3ICs4NDQsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoc19kZWNfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKLSAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAobVdpZHRoICogbUhlaWdodCAqIDMpIC8gMjsKKyAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAob3V0cHV0QnVmZmVyV2lkdGgoKSAqIG91dHB1dEJ1ZmZlckhlaWdodCgpICogMykgLyAyOwogCiAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gbVRpbWVTdGFtcHNbc19kZWNfb3AudTRfdHNdOwogICAgICAgICAgICAgICAgIG1UaW1lU3RhbXBzVmFsaWRbc19kZWNfb3AudTRfdHNdID0gZmFsc2U7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5oCmluZGV4IDE5MWE3MWQuLmU4YzZhYjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5oCkBAIC0xMDAsMTIgKzEwMCwxNCBAQAogICAgIGJvb2wgbUluaXROZWVkZWQ7CiAgICAgdWludDMyX3QgbU5ld1dpZHRoOwogICAgIHVpbnQzMl90IG1OZXdIZWlnaHQ7CisgICAgdWludDMyX3QgbU5ld0xldmVsOwogICAgIC8vIFRoZSBpbnB1dCBzdHJlYW0gaGFzIGNoYW5nZWQgdG8gYSBkaWZmZXJlbnQgcmVzb2x1dGlvbiwgd2hpY2ggaXMgc3RpbGwgc3VwcG9ydGVkIGJ5IHRoZQogICAgIC8vIGNvZGVjLiBTbyB0aGUgY29kZWMgaXMgc3dpdGNoaW5nIHRvIGRlY29kZSB0aGUgbmV3IHJlc29sdXRpb24uCiAgICAgYm9vbCBtQ2hhbmdpbmdSZXNvbHV0aW9uOwogICAgIGJvb2wgbUZsdXNoTmVlZGVkOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOwogCi0gICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBpbml0RGVjb2Rlcih1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KTsKICAgICBzdGF0dXNfdCBkZUluaXREZWNvZGVyKCk7CiAgICAgc3RhdHVzX3Qgc2V0Rmx1c2hNb2RlKCk7CiAgICAgc3RhdHVzX3Qgc2V0UGFyYW1zKHNpemVfdCBzdHJpZGUpOwpAQCAtMTEzLDkgKzExNSw5IEBACiAgICAgc3RhdHVzX3Qgc2V0TnVtQ29yZXMoKTsKICAgICBzdGF0dXNfdCByZXNldERlY29kZXIoKTsKICAgICBzdGF0dXNfdCByZXNldFBsdWdpbigpOwotICAgIHN0YXR1c190IHJlSW5pdERlY29kZXIoKTsKKyAgICBzdGF0dXNfdCByZUluaXREZWNvZGVyKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOwogCi0gICAgdm9pZCBzZXREZWNvZGVBcmdzKAorICAgIGJvb2wgc2V0RGVjb2RlQXJncygKICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjX2lwLAogICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNfb3AsCiAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcAppbmRleCBiZjVlMzUzLi5iM2Y1MjAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAKQEAgLTQ5LDEwICs0OSwxMCBAQAogICAgIHBhcmFtcy0+blZlcnNpb24ucy5uU3RlcCA9IDA7CiB9CiAKLXR5cGVkZWYgc3RydWN0IExldmVsQ29udmVyc2lvbiB7CitzdHJ1Y3QgTGV2ZWxDb252ZXJzaW9uIHsKICAgICBPTVhfVklERU9fQVZDTEVWRUxUWVBFIG9teExldmVsOwogICAgIFdPUkQzMiBhdmNMZXZlbDsKLX0gTGV2ZWxDb25jZXJzaW9uOworfTsKIAogc3RhdGljIExldmVsQ29udmVyc2lvbiBDb252ZXJzaW9uVGFibGVbXSA9IHsKICAgICB7IE9NWF9WSURFT19BVkNMZXZlbDEsICAxMCB9LApAQCAtODcsOCArODcsMjEgQEAKICAgICB7IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDMyIH0sCiAgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWw0ICB9LAogICAgIHsgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNDEgfSwKLX07CisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDEgIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDFiIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDExIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDEyIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDEzIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDIgIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDIxIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDIyIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDMgIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDMxIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDMyIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDQgIH0sCisgICAgeyBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDQxIH0sCiAKK307CiAKIHN0YXRpYyBzaXplX3QgR2V0Q1BVQ29yZUNvdW50KCkgewogICAgIGxvbmcgY3B1Q29yZUNvdW50ID0gMTsKQEAgLTk5LDcgKzExMiw3IEBACiAgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CiAjZW5kaWYKICAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7Ci0gICAgQUxPR0QoIk51bWJlciBvZiBDUFUgY29yZXM6ICVsZCIsIGNwdUNvcmVDb3VudCk7CisgICAgQUxPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVsZCIsIGNwdUNvcmVDb3VudCk7CiAgICAgcmV0dXJuIChzaXplX3QpY3B1Q29yZUNvdW50OwogfQogCkBAIC0xNDQsMTUgKzE1NywxNSBAQAogICAgICAgICAgICAga1Byb2ZpbGVMZXZlbHMsIE5FTEVNKGtQcm9maWxlTGV2ZWxzKSwKICAgICAgICAgICAgIDE3NiAvKiB3aWR0aCAqLywgMTQ0IC8qIGhlaWdodCAqLywKICAgICAgICAgICAgIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KSwKKyAgICAgIG1CaXRyYXRlVXBkYXRlZChmYWxzZSksCisgICAgICBtS2V5RnJhbWVSZXF1ZXN0ZWQoZmFsc2UpLAogICAgICAgbUl2VmlkZW9Db2xvckZvcm1hdChJVl9ZVVZfNDIwUCksCi0gICAgICBtSURSRnJhbWVSZWZyZXNoSW50ZXJ2YWxJblNlYygxKSwKICAgICAgIG1BVkNFbmNQcm9maWxlKElWX1BST0ZJTEVfQkFTRSksCi0gICAgICBtQVZDRW5jTGV2ZWwoMzEpLAotICAgICAgbVByZXZUaW1lc3RhbXBVcygtMSksCisgICAgICBtQVZDRW5jTGV2ZWwoNDEpLAogICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAogICAgICAgbVNhd0lucHV0RU9TKGZhbHNlKSwKKyAgICAgIG1TYXdPdXRwdXRFT1MoZmFsc2UpLAogICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSwKLSAgICAgIG1Db252ZXJzaW9uQnVmZmVyKE5VTEwpLAogICAgICAgbUNvZGVjQ3R4KE5VTEwpIHsKIAogICAgIGluaXRQb3J0cyhrTnVtQnVmZmVycywga051bUJ1ZmZlcnMsICgobVdpZHRoICogbUhlaWdodCAqIDMpID4+IDEpLApAQCAtMTYyLDYgKzE3NSwxMCBAQAogICAgIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKTsKICAgICBDUkVBVEVfRFVNUF9GSUxFKG1JbkZpbGUpOwogICAgIENSRUFURV9EVU1QX0ZJTEUobU91dEZpbGUpOworICAgIG1lbXNldChtQ29udmVyc2lvbkJ1ZmZlcnMsIDAsIHNpemVvZihtQ29udmVyc2lvbkJ1ZmZlcnMpKTsKKyAgICBtZW1zZXQobUlucHV0QnVmZmVySW5mbywgMCwgc2l6ZW9mKG1JbnB1dEJ1ZmZlckluZm8pKTsKKworICAgIGluaXRFbmNQYXJhbXMoKTsKIAogfQogCkBAIC0xNzMsNyArMTkwLDcgQEAKICAgICBDSEVDSyhpblF1ZXVlLmVtcHR5KCkpOwogfQogCi1PTVhfRVJST1JUWVBFIFNvZnRBVkM6OmluaXRFbmNQYXJhbXMoKSB7Cit2b2lkICBTb2Z0QVZDOjppbml0RW5jUGFyYW1zKCkgewogICAgIG1Db2RlY0N0eCA9IE5VTEw7CiAgICAgbU1lbVJlY29yZHMgPSBOVUxMOwogICAgIG1OdW1NZW1SZWNvcmRzID0gREVGQVVMVF9NRU1fUkVDX0NOVDsKQEAgLTE4Niw3ICsyMDMsNiBAQAogICAgIG1JSW50ZXJ2YWwgPSBERUZBVUxUX0lfSU5URVJWQUw7CiAgICAgbUlEUkludGVydmFsID0gREVGQVVMVF9JRFJfSU5URVJWQUw7CiAgICAgbURpc2FibGVEZWJsa0xldmVsID0gREVGQVVMVF9ESVNBQkxFX0RFQkxLX0xFVkVMOwotICAgIG1GcmFtZVJhdGUgPSBERUZBVUxUX1NSQ19GUkFNRV9SQVRFOwogICAgIG1FbmFibGVGYXN0U2FkID0gREVGQVVMVF9FTkFCTEVfRkFTVF9TQUQ7CiAgICAgbUVuYWJsZUFsdFJlZiA9IERFRkFVTFRfRU5BQkxFX0FMVF9SRUY7CiAgICAgbUVuY1NwZWVkID0gREVGQVVMVF9FTkNfU1BFRUQ7CkBAIC0xOTUsMTEgKzIxMSwxMiBAQAogICAgIG1BSVJSZWZyZXNoUGVyaW9kID0gREVGQVVMVF9BSVJfUkVGUkVTSF9QRVJJT0Q7CiAgICAgbVBTTlJFbmFibGUgPSBERUZBVUxUX1BTTlJfRU5BQkxFOwogICAgIG1SZWNvbkVuYWJsZSA9IERFRkFVTFRfUkVDT05fRU5BQkxFOworICAgIG1FbnRyb3B5TW9kZSA9IERFRkFVTFRfRU5UUk9QWV9NT0RFOworICAgIG1CZnJhbWVzID0gREVGQVVMVF9CX0ZSQU1FUzsKIAogICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgTlVMTCk7CiAgICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgTlVMTCk7CiAKLSAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKIH0KIAogCkBAIC0yMTIsNyArMjI5LDYgQEAKICAgICBzX2RpbWVuc2lvbnNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0RJTUVOU0lPTlM7CiAgICAgc19kaW1lbnNpb25zX2lwLnU0X2h0ID0gbUhlaWdodDsKICAgICBzX2RpbWVuc2lvbnNfaXAudTRfd2QgPSBtV2lkdGg7Ci0gICAgc19kaW1lbnNpb25zX2lwLnU0X3N0cmQgPSBtU3RyaWRlOwogCiAgICAgc19kaW1lbnNpb25zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CiAgICAgc19kaW1lbnNpb25zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKQEAgLTI2MCw4ICsyNzYsOCBAQAogICAgIHNfZnJhbWVfcmF0ZV9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOwogICAgIHNfZnJhbWVfcmF0ZV9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfRlJBTUVSQVRFOwogCi0gICAgc19mcmFtZV9yYXRlX2lwLnU0X3NyY19mcmFtZV9yYXRlID0gbUZyYW1lUmF0ZTsKLSAgICBzX2ZyYW1lX3JhdGVfaXAudTRfdGd0X2ZyYW1lX3JhdGUgPSBtRnJhbWVSYXRlOworICAgIHNfZnJhbWVfcmF0ZV9pcC51NF9zcmNfZnJhbWVfcmF0ZSA9IG1GcmFtZXJhdGUgPj4gMTY7CisgICAgc19mcmFtZV9yYXRlX2lwLnU0X3RndF9mcmFtZV9yYXRlID0gbUZyYW1lcmF0ZSA+PiAxNjsKIAogICAgIHNfZnJhbWVfcmF0ZV9pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOwogICAgIHNfZnJhbWVfcmF0ZV9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CkBAIC0zMzIsNyArMzQ4LDYgQEAKICAgICBpdmVfY3RsX3NldF9mcmFtZV90eXBlX2lwX3Qgc19mcmFtZV90eXBlX2lwOwogICAgIGl2ZV9jdGxfc2V0X2ZyYW1lX3R5cGVfb3BfdCBzX2ZyYW1lX3R5cGVfb3A7CiAgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOwotCiAgICAgc19mcmFtZV90eXBlX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CiAgICAgc19mcmFtZV90eXBlX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9GUkFNRVRZUEU7CiAKQEAgLTUwMyw3ICs1MTgsNiBAQAogCiAgICAgc19nb3BfcGFyYW1zX2lwLnU0X2lfZnJtX2ludGVydmFsID0gbUlJbnRlcnZhbDsKICAgICBzX2dvcF9wYXJhbXNfaXAudTRfaWRyX2ZybV9pbnRlcnZhbCA9IG1JRFJJbnRlcnZhbDsKLSAgICBzX2dvcF9wYXJhbXNfaXAudTRfbnVtX2JfZnJhbWVzID0gREVGQVVMVF9CX0ZSQU1FUzsKIAogICAgIHNfZ29wX3BhcmFtc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOwogICAgIHNfZ29wX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CkBAIC01MjksNyArNTQzLDcgQEAKICAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9QUk9GSUxFX1BBUkFNUzsKIAogICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAuZV9wcm9maWxlID0gREVGQVVMVF9FUFJPRklMRTsKLQorICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAudTRfZW50cm9weV9jb2RpbmdfbW9kZSA9IG1FbnRyb3B5TW9kZTsKICAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CiAgICAgc19wcm9maWxlX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CiAKQEAgLTU5NSw3ICs2MDksNiBAQAogCiBPTVhfRVJST1JUWVBFIFNvZnRBVkM6OmluaXRFbmNvZGVyKCkgewogICAgIElWX1NUQVRVU19UIHN0YXR1czsKLSAgICBzaXplX3QgaTsKICAgICBXT1JEMzIgbGV2ZWw7CiAgICAgdWludDMyX3QgZGlzcGxheVNpemVZOwogICAgIENIRUNLKCFtU3RhcnRlZCk7CkBAIC02MTgsMjcgKzYzMSwyNiBAQAogICAgIH0KICAgICBtQVZDRW5jTGV2ZWwgPSBNQVgobGV2ZWwsIG1BVkNFbmNMZXZlbCk7CiAKLSAgICBpZiAoT01YX0Vycm9yTm9uZSAhPSAoZXJyVHlwZSA9IGluaXRFbmNQYXJhbXMoKSkpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIgcGFyYW1zIik7Ci0gICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7Ci0gICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCAwKTsKLSAgICAgICAgcmV0dXJuIGVyclR5cGU7Ci0gICAgfQotCi0gICAgbVN0cmlkZSA9IEFMSUdOMTYobVdpZHRoKTsKKyAgICBtU3RyaWRlID0gbVdpZHRoOwogCiAgICAgaWYgKG1JbnB1dERhdGFJc01ldGEpIHsKLSAgICAgICAgaWYgKG1Db252ZXJzaW9uQnVmZmVyKSB7Ci0gICAgICAgICAgICBmcmVlKG1Db252ZXJzaW9uQnVmZmVyKTsKLSAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyID0gTlVMTDsKLSAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9DT05WRVJTSU9OX0JVRkZFUlM7IGkrKykgeworICAgICAgICAgICAgaWYgKG1Db252ZXJzaW9uQnVmZmVyc1tpXSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZnJlZShtQ29udmVyc2lvbkJ1ZmZlcnNbaV0pOworICAgICAgICAgICAgfQogCi0gICAgICAgIGlmIChtQ29udmVyc2lvbkJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKG1TdHJpZGUgKiBtSGVpZ2h0ICogMyAvIDIpOwotICAgICAgICAgICAgaWYgKG1Db252ZXJzaW9uQnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICgoKHVpbnQ2NF90KW1TdHJpZGUgKiBtSGVpZ2h0KSA+ICgodWludDY0X3QpSU5UMzJfTUFYIC8gMykpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQnVmZmVyIHNpemUgaXMgdG9vIGJpZy4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzW2ldID0gKHVpbnQ4X3QgKiltYWxsb2MobVN0cmlkZSAqIG1IZWlnaHQgKiAzIC8gMik7CisKKyAgICAgICAgICAgIGlmIChtQ29udmVyc2lvbkJ1ZmZlcnNbaV0gPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW5nIGNvbnZlcnNpb24gYnVmZmVyIGZhaWxlZC4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNGcmVlW2ldID0gMTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjU0LDcgKzY2Niw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBBTE9HVigiUGFyYW1zIHdpZHRoICVkIGhlaWdodCAlZCBsZXZlbCAlZCBjb2xvckZvcm1hdCAlZCIsIG1XaWR0aCwKKyAgICBBTE9HRCgiUGFyYW1zIHdpZHRoICVkIGhlaWdodCAlZCBsZXZlbCAlZCBjb2xvckZvcm1hdCAlZCIsIG1XaWR0aCwKICAgICAgICAgICAgIG1IZWlnaHQsIG1BVkNFbmNMZXZlbCwgbUl2VmlkZW9Db2xvckZvcm1hdCk7CiAKICAgICAvKiBHZXR0aW5nIE51bWJlciBvZiBNZW1SZWNvcmRzICovCkBAIC02NzksOSArNjkxLDEzIEBACiAgICAgfQogCiAgICAgLyogQWxsb2NhdGUgYXJyYXkgdG8gaG9sZCBtZW1vcnkgcmVjb3JkcyAqLworICAgIGlmIChtTnVtTWVtUmVjb3JkcyA+IFNJWkVfTUFYIC8gc2l6ZW9mKGl2X21lbV9yZWNfdCkpIHsKKyAgICAgICAgQUxPR0UoInJlcXVlc3RlZCBtZW1vcnkgc2l6ZSBpcyB0b28gYmlnLiIpOworICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgIH0KICAgICBtTWVtUmVjb3JkcyA9IChpdl9tZW1fcmVjX3QgKiltYWxsb2MobU51bU1lbVJlY29yZHMgKiBzaXplb2YoaXZfbWVtX3JlY190KSk7CiAgICAgaWYgKE5VTEwgPT0gbU1lbVJlY29yZHMpIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGhvbGQgbWVtb3J5IHJlY29yZHM6IFNpemUgJWQiLAorICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgaG9sZCBtZW1vcnkgcmVjb3JkczogU2l6ZSAlenUiLAogICAgICAgICAgICAgICAgIG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOwogICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgMCk7CkBAIC02OTEsNyArNzA3LDcgQEAKICAgICB7CiAgICAgICAgIGl2X21lbV9yZWNfdCAqcHNfbWVtX3JlYzsKICAgICAgICAgcHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyspIHsKICAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X3NpemUgPSBzaXplb2YoaXZfbWVtX3JlY190KTsKICAgICAgICAgICAgIHBzX21lbV9yZWMtPnB2X2Jhc2UgPSBOVUxMOwogICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUgPSAwOwpAQCAtNzM4LDEzICs3NTQsMTMgQEAKICAgICAgICAgV09SRDMyIHRvdGFsX3NpemU7CiAgICAgICAgIGl2X21lbV9yZWNfdCAqcHNfbWVtX3JlYzsKICAgICAgICAgdG90YWxfc2l6ZSA9IDA7Ci0KICAgICAgICAgcHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgewogICAgICAgICAgICAgcHNfbWVtX3JlYy0+cHZfYmFzZSA9IGl2ZV9hbGlnbmVkX21hbGxvYygKICAgICAgICAgICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfbWVtX2FsaWdubWVudCwgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUpOwogICAgICAgICAgICAgaWYgKHBzX21lbV9yZWMtPnB2X2Jhc2UgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgZm9yIG1lbSByZWNvcmQgaWQgJWQgc2l6ZSAlZFxuIiwgaSwKKyAgICAgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIGZvciBtZW0gcmVjb3JkIGlkICV6dSBzaXplICV1XG4iLCBpLAogICAgICAgICAgICAgICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUpOwogICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOwpAQCAtNzU1LDcgKzc3MSw2IEBACiAKICAgICAgICAgICAgIHBzX21lbV9yZWMrKzsKICAgICAgICAgfQotICAgICAgICBwcmludGYoIlxuVG90YWwgbWVtb3J5IGZvciBjb2RlYyAlZFxuIiwgdG90YWxfc2l6ZSk7CiAgICAgfQogCiAgICAgLyogQ29kZWMgSW5zdGFuY2UgQ3JlYXRpb24gKi8KQEAgLTc4OSw3ICs4MDQsNyBAQAogICAgICAgICBzX2luaXRfaXAuZV9yY19tb2RlID0gREVGQVVMVF9SQ19NT0RFOwogICAgICAgICBzX2luaXRfaXAudTRfbWF4X2ZyYW1lcmF0ZSA9IERFRkFVTFRfTUFYX0ZSQU1FUkFURTsKICAgICAgICAgc19pbml0X2lwLnU0X21heF9iaXRyYXRlID0gREVGQVVMVF9NQVhfQklUUkFURTsKLSAgICAgICAgc19pbml0X2lwLnU0X21heF9udW1fYmZyYW1lcyA9IERFRkFVTFRfQl9GUkFNRVM7CisgICAgICAgIHNfaW5pdF9pcC51NF9udW1fYmZyYW1lcyA9IG1CZnJhbWVzOwogICAgICAgICBzX2luaXRfaXAuZV9jb250ZW50X3R5cGUgPSBJVl9QUk9HUkVTU0lWRTsKICAgICAgICAgc19pbml0X2lwLnU0X21heF9zcmNoX3JuZ194ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9YOwogICAgICAgICBzX2luaXRfaXAudTRfbWF4X3NyY2hfcm5nX3kgPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1k7CkBAIC04NjQsNyArODc5LDYgQEAKICAgICBpdl9yZXRyaWV2ZV9tZW1fcmVjX2lwX3Qgc19yZXRyaWV2ZV9tZW1faXA7CiAgICAgaXZfcmV0cmlldmVfbWVtX3JlY19vcF90IHNfcmV0cmlldmVfbWVtX29wOwogICAgIGl2X21lbV9yZWNfdCAqcHNfbWVtX3JlYzsKLSAgICBVV09SRDMyIGk7CiAKICAgICBpZiAoIW1TdGFydGVkKSB7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwpAQCAtODg1LDE2ICs4OTksMTggQEAKIAogICAgIC8qIEZyZWUgbWVtb3J5IHJlY29yZHMgKi8KICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNfcmV0cmlldmVfbWVtX29wLnU0X251bV9tZW1fcmVjX2ZpbGxlZDsgaSsrKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzX3JldHJpZXZlX21lbV9vcC51NF9udW1fbWVtX3JlY19maWxsZWQ7IGkrKykgewogICAgICAgICBpdmVfYWxpZ25lZF9mcmVlKHBzX21lbV9yZWMtPnB2X2Jhc2UpOwogICAgICAgICBwc19tZW1fcmVjKys7CiAgICAgfQogCiAgICAgZnJlZShtTWVtUmVjb3Jkcyk7CiAKLSAgICBpZiAobUNvbnZlcnNpb25CdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBmcmVlKG1Db252ZXJzaW9uQnVmZmVyKTsKLSAgICAgICAgbUNvbnZlcnNpb25CdWZmZXIgPSBOVUxMOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX0NPTlZFUlNJT05fQlVGRkVSUzsgaSsrKSB7CisgICAgICAgIGlmIChtQ29udmVyc2lvbkJ1ZmZlcnNbaV0pIHsKKyAgICAgICAgICAgIGZyZWUobUNvbnZlcnNpb25CdWZmZXJzW2ldKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc1tpXSA9IE5VTEw7CisgICAgICAgIH0KICAgICB9CiAKICAgICBtU3RhcnRlZCA9IGZhbHNlOwpAQCAtOTA5LDYgKzkyNSwxMCBAQAogICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFICpiaXRSYXRlID0KICAgICAgICAgICAgICAgICAoT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFICopcGFyYW1zOwogCisgICAgICAgICAgICBpZiAoIWlzVmFsaWRPTVhQYXJhbShiaXRSYXRlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChiaXRSYXRlLT5uUG9ydEluZGV4ICE9IDEpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQpAQCAtOTIyLDI3ICs5NDIsMjkgQEAKICAgICAgICAgewogICAgICAgICAgICAgT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUgKmF2Y1BhcmFtcyA9IChPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oYXZjUGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChhdmNQYXJhbXMtPm5Qb3J0SW5kZXggIT0gMSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGF2Y1BhcmFtcy0+ZVByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lOwotICAgICAgICAgICAgT01YX1ZJREVPX0FWQ0xFVkVMVFlQRSBvbXhMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDMxOworICAgICAgICAgICAgT01YX1ZJREVPX0FWQ0xFVkVMVFlQRSBvbXhMZXZlbCA9IE9NWF9WSURFT19BVkNMZXZlbDQxOwogICAgICAgICAgICAgaWYgKE9NWF9FcnJvck5vbmUKICAgICAgICAgICAgICAgICAgICAgIT0gQ29udmVydEF2Y1NwZWNMZXZlbFRvT214QXZjTGV2ZWwobUFWQ0VuY0xldmVsLCAmb214TGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgYXZjUGFyYW1zLT5lUHJvZmlsZSA9IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmU7CiAgICAgICAgICAgICBhdmNQYXJhbXMtPmVMZXZlbCA9IG9teExldmVsOwogICAgICAgICAgICAgYXZjUGFyYW1zLT5uUmVmRnJhbWVzID0gMTsKLSAgICAgICAgICAgIGF2Y1BhcmFtcy0+bkJGcmFtZXMgPSAwOwogICAgICAgICAgICAgYXZjUGFyYW1zLT5iVXNlSGFkYW1hcmQgPSBPTVhfVFJVRTsKICAgICAgICAgICAgIGF2Y1BhcmFtcy0+bkFsbG93ZWRQaWN0dXJlVHlwZXMgPSAoT01YX1ZJREVPX1BpY3R1cmVUeXBlSQotICAgICAgICAgICAgICAgICAgICB8IE9NWF9WSURFT19QaWN0dXJlVHlwZVApOworICAgICAgICAgICAgICAgICAgICB8IE9NWF9WSURFT19QaWN0dXJlVHlwZVAgfCBPTVhfVklERU9fUGljdHVyZVR5cGVCKTsKICAgICAgICAgICAgIGF2Y1BhcmFtcy0+blJlZklkeDEwQWN0aXZlTWludXMxID0gMDsKICAgICAgICAgICAgIGF2Y1BhcmFtcy0+blJlZklkeDExQWN0aXZlTWludXMxID0gMDsKICAgICAgICAgICAgIGF2Y1BhcmFtcy0+YldlaWdodGVkUFByZWRpY3Rpb24gPSBPTVhfRkFMU0U7Ci0gICAgICAgICAgICBhdmNQYXJhbXMtPmJFbnRyb3B5Q29kaW5nQ0FCQUMgPSBPTVhfRkFMU0U7CiAgICAgICAgICAgICBhdmNQYXJhbXMtPmJjb25zdElwcmVkID0gT01YX0ZBTFNFOwogICAgICAgICAgICAgYXZjUGFyYW1zLT5iRGlyZWN0OHg4SW5mZXJlbmNlID0gT01YX0ZBTFNFOwogICAgICAgICAgICAgYXZjUGFyYW1zLT5iRGlyZWN0U3BhdGlhbFRlbXBvcmFsID0gT01YX0ZBTFNFOwpAQCAtOTYxLDI2ICs5ODMsNDggQEAKICAgICBzd2l0Y2ggKGluZGV4RnVsbCkgewogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9CaXRyYXRlOgogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxTZXRCaXRyYXRlUGFyYW1zKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFICopcGFyYW1zKTsKKyAgICAgICAgICAgIE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAqYml0UmF0ZSA9CisgICAgICAgICAgICAgICAgKE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAqKXBhcmFtczsKKworICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oYml0UmF0ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxTZXRCaXRyYXRlUGFyYW1zKGJpdFJhdGUpOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvQXZjOgogICAgICAgICB7CiAgICAgICAgICAgICBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqYXZjVHlwZSA9IChPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqKXBhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0oYXZjVHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoYXZjVHlwZS0+blBvcnRJbmRleCAhPSAxKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGF2Y1R5cGUtPmVQcm9maWxlICE9IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUKLSAgICAgICAgICAgICAgICAgICAgfHwgYXZjVHlwZS0+blJlZkZyYW1lcyAhPSAxIHx8IGF2Y1R5cGUtPm5CRnJhbWVzICE9IDAKKyAgICAgICAgICAgIG1FbnRyb3B5TW9kZSA9IDA7CisKKyAgICAgICAgICAgIGlmIChPTVhfVFJVRSA9PSBhdmNUeXBlLT5iRW50cm9weUNvZGluZ0NBQkFDKQorICAgICAgICAgICAgICAgIG1FbnRyb3B5TW9kZSA9IDE7CisKKyAgICAgICAgICAgIGlmICgoYXZjVHlwZS0+bkFsbG93ZWRQaWN0dXJlVHlwZXMgJiBPTVhfVklERU9fUGljdHVyZVR5cGVCKSAmJgorICAgICAgICAgICAgICAgICAgICBhdmNUeXBlLT5uUEZyYW1lcykgeworICAgICAgICAgICAgICAgIG1CZnJhbWVzID0gYXZjVHlwZS0+bkJGcmFtZXMgLyBhdmNUeXBlLT5uUEZyYW1lczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUlJbnRlcnZhbCA9IGF2Y1R5cGUtPm5QRnJhbWVzICsgYXZjVHlwZS0+bkJGcmFtZXM7CisKKyAgICAgICAgICAgIGlmIChPTVhfVklERU9fQVZDTG9vcEZpbHRlckRpc2FibGUgPT0gYXZjVHlwZS0+ZUxvb3BGaWx0ZXJNb2RlKQorICAgICAgICAgICAgICAgIG1EaXNhYmxlRGVibGtMZXZlbCA9IDQ7CisKKyAgICAgICAgICAgIGlmIChhdmNUeXBlLT5uUmVmRnJhbWVzICE9IDEKICAgICAgICAgICAgICAgICAgICAgfHwgYXZjVHlwZS0+YlVzZUhhZGFtYXJkICE9IE9NWF9UUlVFCi0gICAgICAgICAgICAgICAgICAgIHx8IChhdmNUeXBlLT5uQWxsb3dlZFBpY3R1cmVUeXBlcyAmIE9NWF9WSURFT19QaWN0dXJlVHlwZUIpICE9IDAKICAgICAgICAgICAgICAgICAgICAgfHwgYXZjVHlwZS0+blJlZklkeDEwQWN0aXZlTWludXMxICE9IDAKICAgICAgICAgICAgICAgICAgICAgfHwgYXZjVHlwZS0+blJlZklkeDExQWN0aXZlTWludXMxICE9IDAKICAgICAgICAgICAgICAgICAgICAgfHwgYXZjVHlwZS0+YldlaWdodGVkUFByZWRpY3Rpb24gIT0gT01YX0ZBTFNFCi0gICAgICAgICAgICAgICAgICAgIHx8IGF2Y1R5cGUtPmJFbnRyb3B5Q29kaW5nQ0FCQUMgIT0gT01YX0ZBTFNFCiAgICAgICAgICAgICAgICAgICAgIHx8IGF2Y1R5cGUtPmJjb25zdElwcmVkICE9IE9NWF9GQUxTRQogICAgICAgICAgICAgICAgICAgICB8fCBhdmNUeXBlLT5iRGlyZWN0OHg4SW5mZXJlbmNlICE9IE9NWF9GQUxTRQogICAgICAgICAgICAgICAgICAgICB8fCBhdmNUeXBlLT5iRGlyZWN0U3BhdGlhbFRlbXBvcmFsICE9IE9NWF9GQUxTRQpAQCAtMTAwOCw2ICsxMDUyLDEwIEBACiAgICAgICAgICAgICBPTVhfQ09ORklHX0lOVFJBUkVGUkVTSFZPUFRZUEUgKnBhcmFtcyA9CiAgICAgICAgICAgICAgICAgKE9NWF9DT05GSUdfSU5UUkFSRUZSRVNIVk9QVFlQRSAqKV9wYXJhbXM7CiAKKyAgICAgICAgICAgIGlmICghaXNWYWxpZE9NWFBhcmFtKHBhcmFtcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAocGFyYW1zLT5uUG9ydEluZGV4ICE9IGtPdXRwdXRQb3J0SW5kZXgpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUG9ydEluZGV4OwogICAgICAgICAgICAgfQpAQCAtMTAyMSw2ICsxMDY5LDEwIEBACiAgICAgICAgICAgICBPTVhfVklERU9fQ09ORklHX0JJVFJBVEVUWVBFICpwYXJhbXMgPQogICAgICAgICAgICAgICAgIChPTVhfVklERU9fQ09ORklHX0JJVFJBVEVUWVBFICopX3BhcmFtczsKIAorICAgICAgICAgICAgaWYgKCFpc1ZhbGlkT01YUGFyYW0ocGFyYW1zKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChwYXJhbXMtPm5Qb3J0SW5kZXggIT0ga091dHB1dFBvcnRJbmRleCkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CiAgICAgICAgICAgICB9CkBAIC0xMDc1LDE0ICsxMTI3LDI3IEBACiAKICAgICAvKiBJbml0aWFsaXplIGNvbG9yIGZvcm1hdHMgKi8KICAgICBwc19pbnBfcmF3X2J1Zi0+ZV9jb2xvcl9mbXQgPSBtSXZWaWRlb0NvbG9yRm9ybWF0OwotCiAgICAgc291cmNlID0gTlVMTDsKLSAgICBpZiAoaW5wdXRCdWZmZXJIZWFkZXIpIHsKKyAgICBpZiAoKGlucHV0QnVmZmVySGVhZGVyICE9IE5VTEwpICYmIGlucHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuKSB7CiAgICAgICAgIHNvdXJjZSA9IGlucHV0QnVmZmVySGVhZGVyLT5wQnVmZmVyICsgaW5wdXRCdWZmZXJIZWFkZXItPm5PZmZzZXQ7CiAKICAgICAgICAgaWYgKG1JbnB1dERhdGFJc01ldGEpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmNvbnZlcnNpb25CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNQVhfQ09OVkVSU0lPTl9CVUZGRVJTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobUNvbnZlcnNpb25CdWZmZXJzRnJlZVtpXSkgeworICAgICAgICAgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNGcmVlW2ldID0gMDsKKyAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbkJ1ZmZlciA9IG1Db252ZXJzaW9uQnVmZmVyc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoTlVMTCA9PSBjb252ZXJzaW9uQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk5vIGZyZWUgYnVmZmVycyB0byBob2xkIGNvbnZlcnNpb24gZGF0YSIpOworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHNvdXJjZSA9IGV4dHJhY3RHcmFwaGljQnVmZmVyKAotICAgICAgICAgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlciwgKG1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMiksIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbkJ1ZmZlciwgKG1XaWR0aCAqIG1IZWlnaHQgKiAzIC8gMiksIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4sIG1XaWR0aCwgbUhlaWdodCk7CiAKICAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgewpAQCAtMTA5MSw2ICsxMTU2LDE4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBwc19lbmNvZGVfaXAtPnU0X2lzX2xhc3QgPSAwOworICAgICAgICBwc19lbmNvZGVfaXAtPnU0X3RpbWVzdGFtcF9oaWdoID0gKGlucHV0QnVmZmVySGVhZGVyLT5uVGltZVN0YW1wKSA+PiAzMjsKKyAgICAgICAgcHNfZW5jb2RlX2lwLT51NF90aW1lc3RhbXBfbG93ID0gKGlucHV0QnVmZmVySGVhZGVyLT5uVGltZVN0YW1wKSAmIDB4RkZGRkZGRkY7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAobVNhd0lucHV0RU9TKXsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+dTRfaXNfbGFzdCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KHBzX2lucF9yYXdfYnVmLCAwLCBzaXplb2YoaXZfcmF3X2J1Zl90KSk7CisgICAgICAgIHBzX2lucF9yYXdfYnVmLT5lX2NvbG9yX2ZtdCA9IG1JdlZpZGVvQ29sb3JGb3JtYXQ7CisgICAgICAgIHBzX2lucF9yYXdfYnVmLT51NF9zaXplID0gc2l6ZW9mKGl2X3Jhd19idWZfdCk7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgIH0KIAogICAgIHB1MV9idWYgPSAoVVdPUkQ4ICopc291cmNlOwpAQCAtMTE0NSwxNCArMTIyMiw2IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KLQotICAgIHBzX2VuY29kZV9pcC0+dTRfaXNfbGFzdCA9IDA7Ci0KLSAgICBpZiAoaW5wdXRCdWZmZXJIZWFkZXIpIHsKLSAgICAgICAgcHNfZW5jb2RlX2lwLT51NF90aW1lc3RhbXBfaGlnaCA9IChpbnB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcCkgPj4gMzI7Ci0gICAgICAgIHBzX2VuY29kZV9pcC0+dTRfdGltZXN0YW1wX2xvdyA9IChpbnB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcCkgJiAweEZGRkZGRkZGOwotICAgIH0KLQogICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogfQogCkBAIC0xMTcwLDM1ICsxMjM5LDMxIEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2F3SW5wdXRFT1MpIHsKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKIAotICAgIHdoaWxlICghbVNhd0lucHV0RU9TICYmICFpblF1ZXVlLmVtcHR5KCkgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICB3aGlsZSAoIW1TYXdPdXRwdXRFT1MgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKwogICAgICAgICBPTVhfRVJST1JUWVBFIGVycm9yOwogICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX2lwX3Qgc19lbmNvZGVfaXA7CiAgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfb3BfdCBzX2VuY29kZV9vcDsKLQotICAgICAgICBCdWZmZXJJbmZvICppbnB1dEJ1ZmZlckluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOwotICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5wdXRCdWZmZXJIZWFkZXIgPSBpbnB1dEJ1ZmZlckluZm8tPm1IZWFkZXI7Ci0KICAgICAgICAgQnVmZmVySW5mbyAqb3V0cHV0QnVmZmVySW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOwogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0cHV0QnVmZmVySGVhZGVyID0gb3V0cHV0QnVmZmVySW5mby0+bUhlYWRlcjsKIAotICAgICAgICBpZiAoaW5wdXRCdWZmZXJIZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgewotICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgaW5wdXRCdWZmZXJJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5wdXRCdWZmZXJIZWFkZXIpOworICAgICAgICBCdWZmZXJJbmZvICppbnB1dEJ1ZmZlckluZm87CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbnB1dEJ1ZmZlckhlYWRlcjsKIAotICAgICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKLSAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOwotCi0gICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgICAgIG91dHB1dEJ1ZmZlckluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dHB1dEJ1ZmZlckhlYWRlcik7CisgICAgICAgIGlmIChtU2F3SW5wdXRFT1MpIHsKKyAgICAgICAgICAgIGlucHV0QnVmZmVySGVhZGVyID0gTlVMTDsKKyAgICAgICAgICAgIGlucHV0QnVmZmVySW5mbyA9IE5VTEw7CisgICAgICAgIH0gZWxzZSBpZiAoIWluUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgaW5wdXRCdWZmZXJJbmZvID0gKmluUXVldWUuYmVnaW4oKTsKKyAgICAgICAgICAgIGlucHV0QnVmZmVySGVhZGVyID0gaW5wdXRCdWZmZXJJbmZvLT5tSGVhZGVyOworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTEyMDgsNiArMTI3MywxMCBAQAogICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4gPSAwOwogICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5PZmZzZXQgPSAwOwogCisgICAgICAgIGlmIChpbnB1dEJ1ZmZlckhlYWRlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GbGFncyA9IGlucHV0QnVmZmVySGVhZGVyLT5uRmxhZ3M7CisgICAgICAgIH0KKwogICAgICAgICB1aW50OF90ICpvdXRQdHIgPSAodWludDhfdCAqKW91dHB1dEJ1ZmZlckhlYWRlci0+cEJ1ZmZlcjsKIAogICAgICAgICBpZiAoIW1TcHNQcHNIZWFkZXJSZWNlaXZlZCkgewpAQCAtMTIzMSwxMCArMTMwMCwxMyBAQAogCiAgICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHOwogICAgICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuID0gc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzOwotICAgICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uVGltZVN0YW1wID0gaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgICAgICBpZiAoaW5wdXRCdWZmZXJIZWFkZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcCA9IGlucHV0QnVmZmVySGVhZGVyLT5uVGltZVN0YW1wOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKICAgICAgICAgICAgIG91dHB1dEJ1ZmZlckluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKwogICAgICAgICAgICAgRFVNUF9UT19GSUxFKAogICAgICAgICAgICAgICAgICAgICBtT3V0RmlsZSwgb3V0cHV0QnVmZmVySGVhZGVyLT5wQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4pOwpAQCAtMTI1MiwxNCArMTMyNCwyNCBAQAogICAgICAgICAgICAgc2V0RnJhbWVUeXBlKElWX0lEUl9GUkFNRSk7CiAgICAgICAgIH0KIAotICAgICAgICBtUHJldlRpbWVzdGFtcFVzID0gaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXA7Ci0KLSAgICAgICAgaWYgKGlucHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgaWYgKChpbnB1dEJ1ZmZlckhlYWRlciAhPSBOVUxMKQorICAgICAgICAgICAgICAgICYmIChpbnB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSkgewogICAgICAgICAgICAgbVNhd0lucHV0RU9TID0gdHJ1ZTsKICAgICAgICAgfQogCisgICAgICAgIC8qIEluIG5vcm1hbCBtb2RlLCBzdG9yZSBpbnB1dEJ1ZmZlckluZm8gYW5kIHRoaXMgd2lsbCBiZSByZXR1cm5lZAorICAgICAgICAgICB3aGVuIGVuY29kZXIgY29uc3VtZXMgdGhpcyBpbnB1dCAqLworICAgICAgICBpZiAoIW1JbnB1dERhdGFJc01ldGEgJiYgKGlucHV0QnVmZmVySW5mbyAhPSBOVUxMKSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSX0hFQURFUlM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChOVUxMID09IG1JbnB1dEJ1ZmZlckluZm9baV0pIHsKKyAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVySW5mb1tpXSA9IGlucHV0QnVmZmVySW5mbzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGVycm9yID0gc2V0RW5jb2RlQXJncygKICAgICAgICAgICAgICAgICAmc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCwgaW5wdXRCdWZmZXJIZWFkZXIsIG91dHB1dEJ1ZmZlckhlYWRlcik7CisKICAgICAgICAgaWYgKGVycm9yICE9IE9NWF9FcnJvck5vbmUpIHsKICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgMCk7CkBAIC0xMjY5LDE0ICsxMzUxLDExIEBACiAgICAgICAgIERVTVBfVE9fRklMRSgKICAgICAgICAgICAgICAgICBtSW5GaWxlLCBzX2VuY29kZV9pcC5zX2lucF9idWYuYXB2X2J1ZnNbMF0sCiAgICAgICAgICAgICAgICAgKG1IZWlnaHQgKiBtU3RyaWRlICogMyAvIDIpKTsKLSAgICAgICAgLy9EVU1QX1RPX0ZJTEUobUluRmlsZSwgaW5wdXRCdWZmZXJIZWFkZXItPnBCdWZmZXIgKyBpbnB1dEJ1ZmZlckhlYWRlci0+bk9mZnNldCwKLSAgICAgICAgLy8gICAgaW5wdXRCdWZmZXJIZWFkZXItPm5GaWxsZWRMZW4pOwogCiAgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOwogICAgICAgICAvKiBDb21wdXRlIHRpbWUgZWxhcHNlZCBiZXR3ZWVuIGVuZCBvZiBwcmV2aW91cyBkZWNvZGUoKQogICAgICAgICAgKiB0byBzdGFydCBvZiBjdXJyZW50IGRlY29kZSgpICovCiAgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgdGltZURlbGF5KTsKLQogICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3ApOwogCiAgICAgICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgewpAQCAtMTI5NCwzOCArMTM3Myw3NyBAQAogICAgICAgICBBTE9HVigidGltZVRha2VuPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgdGltZVRha2VuLCB0aW1lRGVsYXksCiAgICAgICAgICAgICAgICAgc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzKTsKIAorICAgICAgICAvKiBJbiBlbmNvZGVyIGZyZWVzIHVwIGFuIGlucHV0IGJ1ZmZlciwgbWFyayBpdCBhcyBmcmVlICovCisgICAgICAgIGlmIChzX2VuY29kZV9vcC5zX2lucF9idWYuYXB2X2J1ZnNbMF0gIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKG1JbnB1dERhdGFJc01ldGEpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9DT05WRVJTSU9OX0JVRkZFUlM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAobUNvbnZlcnNpb25CdWZmZXJzW2ldID09IHNfZW5jb2RlX29wLnNfaW5wX2J1Zi5hcHZfYnVmc1swXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzRnJlZVtpXSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogSW4gbm9ybWFsIG1vZGUsIGNhbGwgRUJEIG9uIGluQnVmZmVIZWFkZXIgdGhhdCBpcyBmcmVlZCBieSB0aGUgY29kZWMgKi8KKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9JTlBVVF9CVUZGRVJfSEVBREVSUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZIZHIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVySW5mb1tpXSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZIZHIgPSBtSW5wdXRCdWZmZXJJbmZvW2ldLT5tSGVhZGVyOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gYnVmSGRyLT5wQnVmZmVyICsgYnVmSGRyLT5uT2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzX2VuY29kZV9vcC5zX2lucF9idWYuYXB2X2J1ZnNbMF0gPT0gYnVmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJJbmZvW2ldLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoYnVmSGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlckluZm9baV0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GbGFncyA9IGlucHV0QnVmZmVySGVhZGVyLT5uRmxhZ3M7CiAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbiA9IHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlczsKLSAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uVGltZVN0YW1wID0gaW5wdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXA7CiAKLSAgICAgICAgaWYgKElWX0lEUl9GUkFNRQotICAgICAgICAgICAgICAgID09IHNfZW5jb2RlX29wLnU0X2VuY29kZWRfZnJhbWVfdHlwZSkgeworICAgICAgICBpZiAoSVZfSURSX0ZSQU1FID09IHNfZW5jb2RlX29wLnU0X2VuY29kZWRfZnJhbWVfdHlwZSkgewogICAgICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfU1lOQ0ZSQU1FOwogICAgICAgICB9CiAKLSAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICBpbnB1dEJ1ZmZlckluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgaWYgKGlucHV0QnVmZmVySGVhZGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKIAotICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5wdXRCdWZmZXJIZWFkZXIpOwotCi0gICAgICAgIGlmIChtU2F3SW5wdXRFT1MpIHsKLSAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgIC8qIElmIGluIG1ldGEgZGF0YSwgY2FsbCBFQkQgb24gaW5wdXQgKi8KKyAgICAgICAgICAgIC8qIEluIGNhc2Ugb2Ygbm9ybWFsIG1vZGUsIEVCRCB3aWxsIGJlIGRvbmUgb25jZSBlbmNvZGVyCisgICAgICAgICAgICByZWxlYXNlcyB0aGUgaW5wdXQgYnVmZmVyICovCisgICAgICAgICAgICBpZiAobUlucHV0RGF0YUlzTWV0YSkgeworICAgICAgICAgICAgICAgIGlucHV0QnVmZmVySW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbnB1dEJ1ZmZlckhlYWRlcik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBvdXRwdXRCdWZmZXJJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICBpZiAoc19lbmNvZGVfb3AudTRfaXNfbGFzdCkgeworICAgICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgbVNhd091dHB1dEVPUyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GbGFncyAmPSB+T01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICB9CiAKLSAgICAgICAgRFVNUF9UT19GSUxFKAotICAgICAgICAgICAgICAgIG1PdXRGaWxlLCBvdXRwdXRCdWZmZXJIZWFkZXItPnBCdWZmZXIsCi0gICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuKTsKLSAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0cHV0QnVmZmVySGVhZGVyKTsKKyAgICAgICAgaWYgKG91dHB1dEJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbiB8fCBzX2VuY29kZV9vcC51NF9pc19sYXN0KSB7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAgPSBzX2VuY29kZV9vcC51NF90aW1lc3RhbXBfaGlnaDsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcCA8PD0gMzI7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5UaW1lU3RhbXAgfD0gc19lbmNvZGVfb3AudTRfdGltZXN0YW1wX2xvdzsKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlckluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgRFVNUF9UT19GSUxFKG1PdXRGaWxlLCBvdXRwdXRCdWZmZXJIZWFkZXItPnBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbik7CisgICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRwdXRCdWZmZXJIZWFkZXIpOworICAgICAgICB9CiAKKyAgICAgICAgaWYgKHNfZW5jb2RlX29wLnU0X2lzX2xhc3QgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybjsKIH0KIAotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiBhbmRyb2lkOjpTb2Z0T01YQ29tcG9uZW50ICpjcmVhdGVTb2Z0T01YQ29tcG9uZW50KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaAppbmRleCBjNGUyNmE5Li40NDE4YTdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaApAQCAtMTcsNyArMTcsNyBAQAogI2lmbmRlZiBfX1NPRlRfQVZDX0VOQ19IX18KICNkZWZpbmUgX19TT0ZUX0FWQ19FTkNfSF9fCiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCkBAIC0yNSwxNCArMjUsMTQgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgTWVkaWFCdWZmZXI7Ci0KKyNkZWZpbmUgTUFYX0lOUFVUX0JVRkZFUl9IRUFERVJTIDQKKyNkZWZpbmUgTUFYX0NPTlZFUlNJT05fQlVGRkVSUyAgIDQKICNkZWZpbmUgQ09ERUNfTUFYX0NPUkVTICAgICAgICAgIDQKICNkZWZpbmUgTEVOX1NUQVRVU19CVUZGRVIgICAgICAgICgxMCAgKiAxMDI0KQogI2RlZmluZSBNQVhfVkJWX0JVRkZfU0laRSAgICAgICAgKDEyMCAqIDE2Mzg0KQogI2RlZmluZSBNQVhfTlVNX0lPX0JVRlMgICAgICAgICAgIDMKIAotI2RlZmluZSBERUZBVUxUX01BWF9SRUZfRlJNICAgICAgICAgMQorI2RlZmluZSBERUZBVUxUX01BWF9SRUZfRlJNICAgICAgICAgMgogI2RlZmluZSBERUZBVUxUX01BWF9SRU9SREVSX0ZSTSAgICAgMAogI2RlZmluZSBERUZBVUxUX1FQX01JTiAgICAgICAgICAgICAgMTAKICNkZWZpbmUgREVGQVVMVF9RUF9NQVggICAgICAgICAgICAgIDQwCkBAIC01Nyw3ICs1Nyw3IEBACiAjZGVmaW5lIERFRkFVTFRfVEdUX0ZSQU1FX1JBVEUgICAgICAzMAogI2RlZmluZSBERUZBVUxUX01BWF9XRCAgICAgICAgICAgICAgMTkyMAogI2RlZmluZSBERUZBVUxUX01BWF9IVCAgICAgICAgICAgICAgMTkyMAotI2RlZmluZSBERUZBVUxUX01BWF9MRVZFTCAgICAgICAgICAgNDAKKyNkZWZpbmUgREVGQVVMVF9NQVhfTEVWRUwgICAgICAgICAgIDQxCiAjZGVmaW5lIERFRkFVTFRfU1RSSURFICAgICAgICAgICAgICAwCiAjZGVmaW5lIERFRkFVTFRfV0QgICAgICAgICAgICAgICAgICAxMjgwCiAjZGVmaW5lIERFRkFVTFRfSFQgICAgICAgICAgICAgICAgICA3MjAKQEAgLTg4LDYgKzg4LDcgQEAKICNkZWZpbmUgREVGQVVMVF9RUEVMICAgICAgICAgICAgICAgIDEKICNkZWZpbmUgREVGQVVMVF9JNCAgICAgICAgICAgICAgICAgIDEKICNkZWZpbmUgREVGQVVMVF9FUFJPRklMRSAgICAgICAgICAgIElWX1BST0ZJTEVfQkFTRQorI2RlZmluZSBERUZBVUxUX0VOVFJPUFlfTU9ERSAgICAgICAgMAogI2RlZmluZSBERUZBVUxUX1NMSUNFX01PREUgICAgICAgICAgSVZFX1NMSUNFX01PREVfTk9ORQogI2RlZmluZSBERUZBVUxUX1NMSUNFX1BBUkFNICAgICAgICAgMjU2CiAjZGVmaW5lIERFRkFVTFRfQVJDSCAgICAgICAgICAgICAgICBBUkNIX0FSTV9BOVEKQEAgLTE0OSw4ICsxNTAsNiBAQAogCiAgICAgaW50MzJfdCAgbVN0cmlkZTsKIAotICAgIHVpbnQzMl90IG1GcmFtZVJhdGU7Ci0KICAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OyAgIC8vIFRpbWUgYXQgdGhlIHN0YXJ0IG9mIGRlY29kZSgpCiAgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7ICAgICAvLyBUaW1lIGF0IHRoZSBlbmQgb2YgZGVjb2RlKCkKIApAQCAtMTY3LDMyICsxNjYsMzIgQEAKIAogICAgIElWX0NPTE9SX0ZPUk1BVF9UIG1JdlZpZGVvQ29sb3JGb3JtYXQ7CiAKLSAgICBpbnQzMl90ICBtSURSRnJhbWVSZWZyZXNoSW50ZXJ2YWxJblNlYzsKICAgICBJVl9QUk9GSUxFX1QgbUFWQ0VuY1Byb2ZpbGU7CiAgICAgV09SRDMyICAgbUFWQ0VuY0xldmVsOwotICAgIGludDY0X3QgIG1OdW1JbnB1dEZyYW1lczsKLSAgICBpbnQ2NF90ICBtUHJldlRpbWVzdGFtcFVzOwogICAgIGJvb2wgICAgIG1TdGFydGVkOwogICAgIGJvb2wgICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZDsKIAogICAgIGJvb2wgICAgIG1TYXdJbnB1dEVPUzsKKyAgICBib29sICAgICBtU2F3T3V0cHV0RU9TOwogICAgIGJvb2wgICAgIG1TaWduYWxsZWRFcnJvcjsKICAgICBib29sICAgICBtSW50cmE0eDQ7CiAgICAgYm9vbCAgICAgbUVuYWJsZUZhc3RTYWQ7CiAgICAgYm9vbCAgICAgbUVuYWJsZUFsdFJlZjsKLSAgICBib29sICAgIG1SZWNvbkVuYWJsZTsKLSAgICBib29sICAgIG1QU05SRW5hYmxlOworICAgIGJvb2wgICAgIG1SZWNvbkVuYWJsZTsKKyAgICBib29sICAgICBtUFNOUkVuYWJsZTsKKyAgICBib29sICAgICBtRW50cm9weU1vZGU7CiAgICAgSVZFX1NQRUVEX0NPTkZJRyAgICAgbUVuY1NwZWVkOwogCi0gICAgdWludDhfdCAqbUNvbnZlcnNpb25CdWZmZXI7Ci0KKyAgICB1aW50OF90ICptQ29udmVyc2lvbkJ1ZmZlcnNbTUFYX0NPTlZFUlNJT05fQlVGRkVSU107CisgICAgYm9vbCAgICAgbUNvbnZlcnNpb25CdWZmZXJzRnJlZVtNQVhfQ09OVkVSU0lPTl9CVUZGRVJTXTsKKyAgICBCdWZmZXJJbmZvICptSW5wdXRCdWZmZXJJbmZvW01BWF9JTlBVVF9CVUZGRVJfSEVBREVSU107CiAgICAgaXZfb2JqX3QgKm1Db2RlY0N0eDsgICAgICAgICAvLyBDb2RlYyBjb250ZXh0CiAgICAgaXZfbWVtX3JlY190ICptTWVtUmVjb3JkczsgICAvLyBNZW1vcnkgcmVjb3JkcyByZXF1ZXN0ZWQgYnkgdGhlIGNvZGVjCiAgICAgc2l6ZV90IG1OdW1NZW1SZWNvcmRzOyAgICAgICAvLyBOdW1iZXIgb2YgbWVtb3J5IHJlY29yZHMgcmVxdWVzdGVkIGJ5IGNvZGVjCiAgICAgc2l6ZV90IG1OdW1Db3JlczsgICAgICAgICAgICAvLyBOdW1iZXIgb2YgY29yZXMgdXNlZCBieSB0aGUgY29kZWMKIAogICAgIFVXT1JEMzIgbUhlYWRlckdlbmVyYXRlZDsKLQorICAgIFVXT1JEMzIgbUJmcmFtZXM7CiAgICAgSVZfQVJDSF9UIG1BcmNoOwogICAgIElWRV9TTElDRV9NT0RFX1QgbVNsaWNlTW9kZTsKICAgICBVV09SRDMyIG1TbGljZVBhcmFtOwpAQCAtMjAzLDcgKzIwMiw3IEBACiAgICAgSVZFX0FJUl9NT0RFX1QgbUFJUk1vZGU7CiAgICAgVVdPUkQzMiBtQUlSUmVmcmVzaFBlcmlvZDsKIAotICAgIE9NWF9FUlJPUlRZUEUgaW5pdEVuY1BhcmFtcygpOworICAgIHZvaWQgaW5pdEVuY1BhcmFtcygpOwogICAgIE9NWF9FUlJPUlRZUEUgaW5pdEVuY29kZXIoKTsKICAgICBPTVhfRVJST1JUWVBFIHJlbGVhc2VFbmNvZGVyKCk7CiAKQEAgLTI5Miw2ICsyOTEsOCBAQAogICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICVzIiwgbV9maWxlbmFtZSk7XAorICAgICAgICBpZiAoZnAgIT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfQogI2Vsc2UgLyogRklMRV9EVU1QX0VOQUJMRSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKaW5kZXggM2RlOTVhNS4uYzgyNzdkZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCkBAIC0yNDAsNiArMjQwLDE1IEBACiAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGluSGVhZGVyLT5uRmlsbGVkTGVuICogc2l6ZW9mKGludDE2X3QpID4gb3V0SGVhZGVyLT5uQWxsb2NMZW4pIHsKKyAgICAgICAgICAgIEFMT0dFKCJvdXRwdXQgYnVmZmVyIHRvbyBzbWFsbCAoJWQpLiIsIG91dEhlYWRlci0+bkFsbG9jTGVuKTsKKyAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjc3OTMxNjMiKTsKKworICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0cHRyID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKIAogICAgICAgICBpZiAobUlzTUxhdykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcAppbmRleCA3OTE2YzQ1Li4wNGQ1YTMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmNwcApAQCAtMjI4LDYgKzIyOCwxNCBAQAogICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChvdXRIZWFkZXItPm5BbGxvY0xlbiA8IChpbkhlYWRlci0+bkZpbGxlZExlbiAvIGtNU0dTTUZyYW1lU2l6ZSkgKiAzMjApIHsKKyAgICAgICAgICAgIEFMT0dFKCJvdXRwdXQgYnVmZmVyIGlzIG5vdCBsYXJnZSBlbm91Z2ggKCVkKS4iLCBvdXRIZWFkZXItPm5BbGxvY0xlbik7CisgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3NzkzMzY3Iik7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKICAgICAgICAgdWludDhfdCAqaW5wdXRwdHIgPSBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0OwogCiAgICAgICAgIGludCBuID0gbVNpZ25hbGxlZEVycm9yID8gMCA6IERlY29kZUdTTShtR3NtLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuY3BwCmluZGV4IGNkZGQxNzYuLmU3ZjlkZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5jcHAKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlICJpaGV2Y190eXBlZGVmcy5oIgogI2luY2x1ZGUgIml2LmgiCiAjaW5jbHVkZSAiaXZkLmgiCi0jaW5jbHVkZSAiaXRocmVhZC5oIgogI2luY2x1ZGUgImloZXZjZF9jeGEuaCIKICNpbmNsdWRlICJTb2Z0SEVWQy5oIgogCkBAIC04Miw3ICs4MSwxMCBAQAogICAgIGluaXRQb3J0cygKICAgICAgICAgICAgIGtOdW1CdWZmZXJzLCBtYXgoa01heE91dHB1dEJ1ZmZlclNpemUgLyBrTWluQ29tcHJlc3Npb25SYXRpbywgKHNpemVfdClJTlBVVF9CVUZfU0laRSksCiAgICAgICAgICAgICBrTnVtQnVmZmVycywgQ09ERUNfTUlNRV9UWVBFLCBrTWluQ29tcHJlc3Npb25SYXRpbyk7Ci0gICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKK30KKworc3RhdHVzX3QgU29mdEhFVkM6OmluaXQoKSB7CisgICAgcmV0dXJuIGluaXREZWNvZGVyKCk7CiB9CiAKIFNvZnRIRVZDOjp+U29mdEhFVkMoKSB7CkBAIC0xNDMsNyArMTQ1LDcgQEAKICAgICBzX2N0bF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90KTsKICAgICBzX2N0bF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90KTsKIAotICAgIEFMT0dWKCJTZXQgdGhlIHJ1bi10aW1lIChkeW5hbWljKSBwYXJhbWV0ZXJzIHN0cmlkZSA9ICV1Iiwgc3RyaWRlKTsKKyAgICBBTE9HVigiU2V0IHRoZSBydW4tdGltZSAoZHluYW1pYykgcGFyYW1ldGVycyBzdHJpZGUgPSAlenUiLCBzdHJpZGUpOwogICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfY3RsX2lwLAogICAgICAgICAgICAgKHZvaWQgKikmc19jdGxfb3ApOwogCkBAIC00MDgsNyArNDEwLDcgQEAKICAgICB1aW50MzJfdCBidWZmZXJTaXplID0gZGlzcGxheVNpemVZICogMyAvIDI7CiAgICAgbUZsdXNoT3V0QnVmZmVyID0gKHVpbnQ4X3QgKilpdmRfYWxpZ25lZF9tYWxsb2MoMTI4LCBidWZmZXJTaXplKTsKICAgICBpZiAoTlVMTCA9PSBtRmx1c2hPdXRCdWZmZXIpIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBhbGxvY2F0ZSBmbHVzaE91dHB1dEJ1ZmZlciBvZiBzaXplICV6dSIsIGJ1ZmZlclNpemUpOworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGFsbG9jYXRlIGZsdXNoT3V0cHV0QnVmZmVyIG9mIHNpemUgJXUiLCBidWZmZXJTaXplKTsKICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICB9CiAKQEAgLTQ3OCwxNCArNDgwLDEzIEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotdm9pZCBTb2Z0SEVWQzo6c2V0RGVjb2RlQXJncyhpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY19pcCwKK2Jvb2wgU29mdEhFVkM6OnNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNfaXAsCiAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjX29wLAogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIsCiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIsCiAgICAgICAgIHNpemVfdCB0aW1lU3RhbXBJeCkgewogICAgIHNpemVfdCBzaXplWSA9IG91dHB1dEJ1ZmZlcldpZHRoKCkgKiBvdXRwdXRCdWZmZXJIZWlnaHQoKTsKICAgICBzaXplX3Qgc2l6ZVVWOwotICAgIHVpbnQ4X3QgKnBCdWY7CiAKICAgICBwc19kZWNfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9pcF90KTsKICAgICBwc19kZWNfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9vcF90KTsKQEAgLTUwNSwyMiArNTA2LDI4IEBACiAgICAgICAgIHBzX2RlY19pcC0+dTRfbnVtX0J5dGVzID0gMDsKICAgICB9CiAKLSAgICBpZiAob3V0SGVhZGVyKSB7Ci0gICAgICAgIHBCdWYgPSBvdXRIZWFkZXItPnBCdWZmZXI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcEJ1ZiA9IG1GbHVzaE91dEJ1ZmZlcjsKLSAgICB9Ci0KICAgICBzaXplVVYgPSBzaXplWSAvIDQ7CiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVswXSA9IHNpemVZOwogICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMV0gPSBzaXplVVY7CiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsyXSA9IHNpemVVVjsKIAorICAgIHVpbnQ4X3QgKnBCdWY7CisgICAgaWYgKG91dEhlYWRlcikgeworICAgICAgICBpZiAob3V0SGVhZGVyLT5uQWxsb2NMZW4gPCBzaXplWSArIChzaXplVVYgKiAyKSkgeworICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzgzMzYxNiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHBCdWYgPSBvdXRIZWFkZXItPnBCdWZmZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbUZsdXNoT3V0QnVmZmVyIGFsd2F5cyBoYXMgdGhlIHJpZ2h0IHNpemUuCisgICAgICAgIHBCdWYgPSBtRmx1c2hPdXRCdWZmZXI7CisgICAgfQorCiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBwQnVmOwogICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gcEJ1ZiArIHNpemVZOwogICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gcEJ1ZiArIHNpemVZICsgc2l6ZVVWOwogICAgIHBzX2RlY19pcC0+c19vdXRfYnVmZmVyLnU0X251bV9idWZzID0gMzsKLSAgICByZXR1cm47CisgICAgcmV0dXJuIHRydWU7CiB9CiB2b2lkIFNvZnRIRVZDOjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgewogICAgIC8qIE9uY2UgdGhlIG91dHB1dCBidWZmZXJzIGFyZSBmbHVzaGVkLCBpZ25vcmUgYW55IGJ1ZmZlcnMgdGhhdCBhcmUgaGVsZCBpbiBkZWNvZGVyICovCkBAIC02MzUsNyArNjQyLDExIEBACiAgICAgICAgICAgICBXT1JEMzIgdGltZURlbGF5LCB0aW1lVGFrZW47CiAgICAgICAgICAgICBzaXplX3Qgc2l6ZVksIHNpemVVVjsKIAotICAgICAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgaW5IZWFkZXIsIG91dEhlYWRlciwgdGltZVN0YW1wSXgpOworICAgICAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBpbkhlYWRlciwgb3V0SGVhZGVyLCB0aW1lU3RhbXBJeCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRGVjb2RlciBhcmcgc2V0dXAgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7CiAgICAgICAgICAgICAvKiBDb21wdXRlIHRpbWUgZWxhcHNlZCBiZXR3ZWVuIGVuZCBvZiBwcmV2aW91cyBkZWNvZGUoKQpAQCAtNzY2LDUgKzc3NywxMCBAQAogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudChjb25zdCBjaGFyICpuYW1lLAogICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsIE9NWF9QVFIgYXBwRGF0YSwKICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKLSAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OlNvZnRIRVZDKG5hbWUsIGNhbGxiYWNrcywgYXBwRGF0YSwgY29tcG9uZW50KTsKKyAgICBhbmRyb2lkOjpTb2Z0SEVWQyAqY29kZWMgPSBuZXcgYW5kcm9pZDo6U29mdEhFVkMobmFtZSwgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpOworICAgIGlmIChjb2RlYy0+aW5pdCgpICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OlNvZnRPTVhDb21wb25lbnQ+IHJlbGVhc2UgPSBjb2RlYzsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBjb2RlYzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5oCmluZGV4IGE5MWY1MjguLmRmY2NhOWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuaApAQCAtNTYsNiArNTYsOCBAQAogICAgIFNvZnRIRVZDKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpOwogCisgICAgc3RhdHVzX3QgaW5pdCgpOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+U29mdEhFVkMoKTsKIApAQCAtMTExLDcgKzExMyw3IEBACiAgICAgc3RhdHVzX3QgcmVzZXRQbHVnaW4oKTsKICAgICBzdGF0dXNfdCByZUluaXREZWNvZGVyKCk7CiAKLSAgICB2b2lkIHNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNfaXAsCisgICAgYm9vbCBzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjX2lwLAogICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY19vcCwKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmluSGVhZGVyLAogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwCmluZGV4IGRhZmE4YTUuLjFkZDYzMWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5jcHAKQEAgLTEwMywzNCArMTAzLDQxIEBACiAgICAgd2hpbGUgKCFpblF1ZXVlLmVtcHR5KCkgJiYgb3V0UXVldWUuc2l6ZSgpID09IGtOdW1PdXRwdXRCdWZmZXJzKSB7CiAgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKyAgICAgICAgaWYgKGluSGVhZGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAogICAgICAgICBQb3J0SW5mbyAqcG9ydCA9IGVkaXRQb3J0SW5mbygxKTsKIAogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0KICAgICAgICAgICAgIHBvcnQtPm1CdWZmZXJzLmVkaXRJdGVtQXQobU51bVNhbXBsZXNPdXRwdXQgJiAxKS5tSGVhZGVyOwogCi0gICAgICAgIGlmICgoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgJiYgaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgeworICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgewogICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwogICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOwogCiAgICAgICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OwogCi0gICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOwotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CiAKLSAgICAgICAgICAgIExpc3Q8QnVmZmVySW5mbyAqPjo6aXRlcmF0b3IgaXQgPSBvdXRRdWV1ZS5iZWdpbigpOwotICAgICAgICAgICAgd2hpbGUgKCgqaXQpLT5tSGVhZGVyICE9IG91dEhlYWRlcikgewotICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgTGlzdDxCdWZmZXJJbmZvICo+OjppdGVyYXRvciBpdCA9IG91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKCgqaXQpLT5tSGVhZGVyICE9IG91dEhlYWRlcikgeworICAgICAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqaXQ7CisgICAgICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBvdXRJbmZvID0gTlVMTDsKKworICAgICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7CisgICAgICAgICAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICppdDsKLSAgICAgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKLSAgICAgICAgICAgIG91dFF1ZXVlLmVyYXNlKGl0KTsKLSAgICAgICAgICAgIG91dEluZm8gPSBOVUxMOwotCi0gICAgICAgICAgICBub3RpZnlGaWxsQnVmZmVyRG9uZShvdXRIZWFkZXIpOwotICAgICAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcAppbmRleCA0NTE2MzZjLi45ZjdkZDU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKQEAgLTEyMCw2ICsxMjAsMTcgQEAKICAgICBtSXNGaXJzdCA9IHRydWU7CiB9CiAKK3ZvaWQgKlNvZnRNUDM6Om1lbXNldFNhZmUoT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciwgaW50IGMsIHNpemVfdCBsZW4pIHsKKyAgICBpZiAobGVuID4gb3V0SGVhZGVyLT5uQWxsb2NMZW4pIHsKKyAgICAgICAgQUxPR0UoIm1lbXNldCBidWZmZXIgdG9vIHNtYWxsOiBnb3QgJXUsIGV4cGVjdGVkICV6dSIsIG91dEhlYWRlci0+bkFsbG9jTGVuLCBsZW4pOworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI5NDIyMDIyIik7CisgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBPVVRQVVRfQlVGRkVSX1RPT19TTUFMTCwgTlVMTCk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbWVtc2V0KG91dEhlYWRlci0+cEJ1ZmZlciwgYywgbGVuKTsKK30KKwogT01YX0VSUk9SVFlQRSBTb2Z0TVAzOjppbnRlcm5hbEdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpIHsKICAgICBzd2l0Y2ggKGluZGV4KSB7CkBAIC0zMDAsMTYgKzMxMSwyNCBAQAogICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOwogICAgICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSBrUFZNUDNEZWNvZGVyRGVsYXkgKiBtTnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7CiAKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG91dEhlYWRlci0+cEJ1ZmZlciwgMCwgb3V0SGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtZW1zZXRTYWZlKG91dEhlYWRlciwgMCwgb3V0SGVhZGVyLT5uRmlsbGVkTGVuKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CiAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgcmVjb3ZlcmFibGUsIGp1c3QgaWdub3JlIHRoZSBjdXJyZW50IGZyYW1lIGFuZAogICAgICAgICAgICAgICAgIC8vIHBsYXkgc2lsZW5jZSBpbnN0ZWFkLgotICAgICAgICAgICAgICAgIG1lbXNldChvdXRIZWFkZXItPnBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2Ugc2tpcCBzaWxlbmNlIChhbmQgY29uc3VtZSBpbnB1dCBkYXRhKQorICAgICAgICAgICAgICAgIC8vIGlmIG1Jc0ZpcnN0IGlzIHRydWUgYXMgd2UgbWF5IG5vdCBoYXZlIGEgdmFsaWQKKyAgICAgICAgICAgICAgICAvLyBtQ29uZmlnLT5zYW1wbGluZ1JhdGUgYW5kIG1Db25maWctPm51bV9jaGFubmVscz8KKyAgICAgICAgICAgICAgICBBTE9HVl9JRihtSXNGaXJzdCwgImluc3VmZmljaWVudCBkYXRhIGZvciBmaXJzdCBmcmFtZSwgc2VuZGluZyBzaWxlbmNlIik7CisgICAgICAgICAgICAgICAgaWYgKCFtZW1zZXRTYWZlKG91dEhlYWRlciwgMCwgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aCA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOwpAQCAtMzQxLDggKzM2MCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPQotICAgICAgICAgICAgbUFuY2hvclRpbWVVcwotICAgICAgICAgICAgICAgICsgKG1OdW1GcmFtZXNPdXRwdXQgKiAxMDAwMDAwbGwpIC8gbUNvbmZpZy0+c2FtcGxpbmdSYXRlOworICAgICAgICAgICAgbUFuY2hvclRpbWVVcyArIChtTnVtRnJhbWVzT3V0cHV0ICogMTAwMDAwMGxsKSAvIG1TYW1wbGluZ1JhdGU7CiAKICAgICAgICAgaWYgKGluSGVhZGVyKSB7CiAgICAgICAgICAgICBDSEVDS19HRShpbkhlYWRlci0+bkZpbGxlZExlbiwgbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmgKaW5kZXggZjllN2I1My4uM2JmYTZjNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmgKQEAgLTcyLDYgKzcyLDcgQEAKIAogICAgIHZvaWQgaW5pdFBvcnRzKCk7CiAgICAgdm9pZCBpbml0RGVjb2RlcigpOworICAgIHZvaWQgKm1lbXNldFNhZmUoT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciwgaW50IGMsIHNpemVfdCBsZW4pOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdE1QMyk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmNwcAppbmRleCA3ZTk4OTI4Li4yOWI2MmZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmNwcApAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgIml2X2RhdGF0eXBlZGVmLmgiCiAjaW5jbHVkZSAiaXYuaCIKICNpbmNsdWRlICJpdmQuaCIKLSNpbmNsdWRlICJpdGhyZWFkLmgiCiAjaW5jbHVkZSAiaW1wZWcyZC5oIgogI2luY2x1ZGUgIlNvZnRNUEVHMi5oIgogCkBAIC0xNTYsNyArMTU1LDcgQEAKICAgICBzX2N0bF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90KTsKICAgICBzX2N0bF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90KTsKIAotICAgIEFMT0dWKCJTZXQgdGhlIHJ1bi10aW1lIChkeW5hbWljKSBwYXJhbWV0ZXJzIHN0cmlkZSA9ICV1Iiwgc3RyaWRlKTsKKyAgICBBTE9HVigiU2V0IHRoZSBydW4tdGltZSAoZHluYW1pYykgcGFyYW1ldGVycyBzdHJpZGUgPSAlenUiLCBzdHJpZGUpOwogICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfY3RsX2lwLCAodm9pZCAqKSZzX2N0bF9vcCk7CiAKICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKQEAgLTM5Niw3ICszOTUsNyBAQAogICAgIHVpbnQzMl90IGJ1ZmZlclNpemUgPSBkaXNwbGF5U2l6ZVkgKiAzIC8gMjsKICAgICBtRmx1c2hPdXRCdWZmZXIgPSAodWludDhfdCAqKWl2ZF9hbGlnbmVkX21hbGxvYygxMjgsIGJ1ZmZlclNpemUpOwogICAgIGlmIChOVUxMID09IG1GbHVzaE91dEJ1ZmZlcikgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGFsbG9jYXRlIGZsdXNoT3V0cHV0QnVmZmVyIG9mIHNpemUgJXp1IiwgYnVmZmVyU2l6ZSk7CisgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgYWxsb2NhdGUgZmx1c2hPdXRwdXRCdWZmZXIgb2Ygc2l6ZSAldSIsIGJ1ZmZlclNpemUpOwogICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgIH0KIApAQCAtNDY2LDcgKzQ2NSw3IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotdm9pZCBTb2Z0TVBFRzI6OnNldERlY29kZUFyZ3MoCitib29sIFNvZnRNUEVHMjo6c2V0RGVjb2RlQXJncygKICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNfaXAsCiAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjX29wLAogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIsCkBAIC00NzQsNyArNDczLDYgQEAKICAgICAgICAgc2l6ZV90IHRpbWVTdGFtcEl4KSB7CiAgICAgc2l6ZV90IHNpemVZID0gb3V0cHV0QnVmZmVyV2lkdGgoKSAqIG91dHB1dEJ1ZmZlckhlaWdodCgpOwogICAgIHNpemVfdCBzaXplVVY7Ci0gICAgdWludDhfdCAqcEJ1ZjsKIAogICAgIHBzX2RlY19pcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX2lwX3QpOwogICAgIHBzX2RlY19vcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX29wX3QpOwpAQCAtNDk0LDIyICs0OTIsMjggQEAKICAgICAgICAgcHNfZGVjX2lwLT51NF9udW1fQnl0ZXMgPSAwOwogICAgIH0KIAotICAgIGlmIChvdXRIZWFkZXIpIHsKLSAgICAgICAgcEJ1ZiA9IG91dEhlYWRlci0+cEJ1ZmZlcjsKLSAgICB9IGVsc2UgewotICAgICAgICBwQnVmID0gbUZsdXNoT3V0QnVmZmVyOwotICAgIH0KLQogICAgIHNpemVVViA9IHNpemVZIC8gNDsKICAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzBdID0gc2l6ZVk7CiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsxXSA9IHNpemVVVjsKICAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzJdID0gc2l6ZVVWOwogCisgICAgdWludDhfdCAqcEJ1ZjsKKyAgICBpZiAob3V0SGVhZGVyKSB7CisgICAgICAgIGlmIChvdXRIZWFkZXItPm5BbGxvY0xlbiA8IHNpemVZICsgKHNpemVVViAqIDIpKSB7CisgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3ODMzNjE2Iik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcEJ1ZiA9IG91dEhlYWRlci0+cEJ1ZmZlcjsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBtRmx1c2hPdXRCdWZmZXIgYWx3YXlzIGhhcyB0aGUgcmlnaHQgc2l6ZS4KKyAgICAgICAgcEJ1ZiA9IG1GbHVzaE91dEJ1ZmZlcjsKKyAgICB9CisKICAgICBwc19kZWNfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IHBCdWY7CiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBwQnVmICsgc2l6ZVk7CiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBwQnVmICsgc2l6ZVkgKyBzaXplVVY7CiAgICAgcHNfZGVjX2lwLT5zX291dF9idWZmZXIudTRfbnVtX2J1ZnMgPSAzOwotICAgIHJldHVybjsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIHZvaWQgU29mdE1QRUcyOjpvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCkgewogICAgIC8qIE9uY2UgdGhlIG91dHB1dCBidWZmZXJzIGFyZSBmbHVzaGVkLCBpZ25vcmUgYW55IGJ1ZmZlcnMgdGhhdCBhcmUgaGVsZCBpbiBkZWNvZGVyICovCkBAIC02MjIsNyArNjI2LDExIEBACiAgICAgICAgICAgICBXT1JEMzIgdGltZURlbGF5LCB0aW1lVGFrZW47CiAgICAgICAgICAgICBzaXplX3Qgc2l6ZVksIHNpemVVVjsKIAotICAgICAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNfaXAsICZzX2RlY19vcCwgaW5IZWFkZXIsIG91dEhlYWRlciwgdGltZVN0YW1wSXgpOworICAgICAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBpbkhlYWRlciwgb3V0SGVhZGVyLCB0aW1lU3RhbXBJeCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRGVjb2RlciBhcmcgc2V0dXAgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIElmIGlucHV0IGR1bXAgaXMgZW5hYmxlZCwgdGhlbiB3cml0ZSB0byBmaWxlCiAgICAgICAgICAgICBEVU1QX1RPX0ZJTEUobUluRmlsZSwgc19kZWNfaXAucHZfc3RyZWFtX2J1ZmZlciwgc19kZWNfaXAudTRfbnVtX0J5dGVzKTsKIApAQCAtNjY1LDkgKzY3Myw5IEBACiAKICAgICAgICAgICAgICAgICBDSEVDS19FUShyZUluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7CiAKLSAgICAgICAgICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBpbkhlYWRlciwgb3V0SGVhZGVyLCB0aW1lU3RhbXBJeCk7Ci0KLSAgICAgICAgICAgICAgICBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2RlY19pcCwgKHZvaWQgKikmc19kZWNfb3ApOworICAgICAgICAgICAgICAgIGlmIChzZXREZWNvZGVBcmdzKCZzX2RlY19pcCwgJnNfZGVjX29wLCBpbkhlYWRlciwgb3V0SGVhZGVyLCB0aW1lU3RhbXBJeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19kZWNfaXAsICh2b2lkICopJnNfZGVjX29wKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvU29mdE1QRUcyLmgKaW5kZXggYTYyNWUwOC4uZjQ4YjcwYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL1NvZnRNUEVHMi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9Tb2Z0TVBFRzIuaApAQCAtMTE3LDcgKzExNyw3IEBACiAgICAgc3RhdHVzX3QgcmVzZXRQbHVnaW4oKTsKICAgICBzdGF0dXNfdCByZUluaXREZWNvZGVyKCk7CiAKLSAgICB2b2lkIHNldERlY29kZUFyZ3MoCisgICAgYm9vbCBzZXREZWNvZGVBcmdzKAogICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNfaXAsCiAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY19vcCwKICAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAKaW5kZXggMjU4NjYwNi4uOTEyZmFjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5jcHAKQEAgLTM4LDcgKzM4LDEwIEBACiAgICAgICAgICAgICBOVUxMIC8qIHByb2ZpbGVMZXZlbHMgKi8sIDAgLyogbnVtUHJvZmlsZUxldmVscyAqLywKICAgICAgICAgICAgIDMyMCAvKiB3aWR0aCAqLywgMjQwIC8qIGhlaWdodCAqLywgY2FsbGJhY2tzLCBhcHBEYXRhLCBjb21wb25lbnQpLAogICAgICAgbU1vZGUoY29kaW5nVHlwZSA9PSBPTVhfVklERU9fQ29kaW5nVlA4ID8gTU9ERV9WUDggOiBNT0RFX1ZQOSksCisgICAgICBtRU9TU3RhdHVzKElOUFVUX0RBVEFfQVZBSUxBQkxFKSwKICAgICAgIG1DdHgoTlVMTCksCisgICAgICBtRnJhbWVQYXJhbGxlbE1vZGUoZmFsc2UpLAorICAgICAgbVRpbWVTdGFtcElkeCgwKSwKICAgICAgIG1JbWcoTlVMTCkgewogICAgIC8vIGFyYml0cmFyeSBmcm9tIGF2Yy9oZXZjIGFzIHZweCBkb2VzIG5vdCBzcGVjaWZ5IGEgbWluIGNvbXByZXNzaW9uIHJhdGlvCiAgICAgY29uc3Qgc2l6ZV90IGtNaW5Db21wcmVzc2lvblJhdGlvID0gbU1vZGUgPT0gTU9ERV9WUDggPyAyIDogNDsKQEAgLTUxLDkgKzU0LDcgQEAKIH0KIAogU29mdFZQWDo6flNvZnRWUFgoKSB7Ci0gICAgdnB4X2NvZGVjX2Rlc3Ryb3koKHZweF9jb2RlY19jdHhfdCAqKW1DdHgpOwotICAgIGRlbGV0ZSAodnB4X2NvZGVjX2N0eF90ICopbUN0eDsKLSAgICBtQ3R4ID0gTlVMTDsKKyAgICBkZXN0cm95RGVjb2RlcigpOwogfQogCiBzdGF0aWMgaW50IEdldENQVUNvcmVDb3VudCgpIHsKQEAgLTczLDEyICs3NCwxOSBAQAogICAgIG1DdHggPSBuZXcgdnB4X2NvZGVjX2N0eF90OwogICAgIHZweF9jb2RlY19lcnJfdCB2cHhfZXJyOwogICAgIHZweF9jb2RlY19kZWNfY2ZnX3QgY2ZnOworICAgIHZweF9jb2RlY19mbGFnc190IGZsYWdzOwogICAgIG1lbXNldCgmY2ZnLCAwLCBzaXplb2YodnB4X2NvZGVjX2RlY19jZmdfdCkpOworICAgIG1lbXNldCgmZmxhZ3MsIDAsIHNpemVvZih2cHhfY29kZWNfZmxhZ3NfdCkpOwogICAgIGNmZy50aHJlYWRzID0gR2V0Q1BVQ29yZUNvdW50KCk7CisKKyAgICBpZiAobUZyYW1lUGFyYWxsZWxNb2RlKSB7CisgICAgICAgIGZsYWdzIHw9IFZQWF9DT0RFQ19VU0VfRlJBTUVfVEhSRUFESU5HOworICAgIH0KKwogICAgIGlmICgodnB4X2VyciA9IHZweF9jb2RlY19kZWNfaW5pdCgKICAgICAgICAgICAgICAgICAodnB4X2NvZGVjX2N0eF90ICopbUN0eCwKICAgICAgICAgICAgICAgICAgbU1vZGUgPT0gTU9ERV9WUDggPyAmdnB4X2NvZGVjX3ZwOF9keF9hbGdvIDogJnZweF9jb2RlY192cDlfZHhfYWxnbywKLSAgICAgICAgICAgICAgICAgJmNmZywgMCkpKSB7CisgICAgICAgICAgICAgICAgICZjZmcsIGZsYWdzKSkpIHsKICAgICAgICAgQUxPR0UoIm9uMiBkZWNvZGVyIGZhaWxlZCB0byBpbml0aWFsaXplLiAoJWQpIiwgdnB4X2Vycik7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KQEAgLTg2LDkxICs5NCwxNzcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IFNvZnRWUFg6OmRlc3Ryb3lEZWNvZGVyKCkgeworICAgIHZweF9jb2RlY19kZXN0cm95KCh2cHhfY29kZWNfY3R4X3QgKiltQ3R4KTsKKyAgICBkZWxldGUgKHZweF9jb2RlY19jdHhfdCAqKW1DdHg7CisgICAgbUN0eCA9IE5VTEw7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIFNvZnRWUFg6Om91dHB1dEJ1ZmZlcnMoYm9vbCBmbHVzaERlY29kZXIsIGJvb2wgZGlzcGxheSwgYm9vbCBlb3MsIGJvb2wgKnBvcnRXaWxsUmVzZXQpIHsKKyAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CisgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKKyAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gTlVMTDsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gTlVMTDsKKyAgICB2cHhfY29kZWNfaXRlcl90IGl0ZXIgPSBOVUxMOworCisgICAgaWYgKGZsdXNoRGVjb2RlciAmJiBtRnJhbWVQYXJhbGxlbE1vZGUpIHsKKyAgICAgICAgLy8gRmx1c2ggZGVjb2RlciBieSBwYXNzaW5nIE5VTEwgZGF0YSBwdHIgYW5kIDAgc2l6ZS4KKyAgICAgICAgLy8gSWRlYWxseSwgdGhpcyBzaG91bGQgbmV2ZXIgZmFpbC4KKyAgICAgICAgaWYgKHZweF9jb2RlY19kZWNvZGUoKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsIE5VTEwsIDAsIE5VTEwsIDApKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZsdXNoIG9uMiBkZWNvZGVyLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFkaXNwbGF5KSB7CisgICAgICAgIGlmICghZmx1c2hEZWNvZGVyKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBvcGVyYXRpb24uIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgLy8gRHJvcCBhbGwgdGhlIGRlY29kZWQgZnJhbWVzIGluIGRlY29kZXIuCisgICAgICAgIHdoaWxlICgobUltZyA9IHZweF9jb2RlY19nZXRfZnJhbWUoKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsICZpdGVyKSkpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgaWYgKG1JbWcgPT0gTlVMTCkgeworICAgICAgICAgICAgbUltZyA9IHZweF9jb2RlY19nZXRfZnJhbWUoKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsICZpdGVyKTsKKyAgICAgICAgICAgIGlmIChtSW1nID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCB3aWR0aCA9IG1JbWctPmRfdzsKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0ID0gbUltZy0+ZF9oOworICAgICAgICBvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CisgICAgICAgIG91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisgICAgICAgIENIRUNLX0VRKG1JbWctPmZtdCwgVlBYX0lNR19GTVRfSTQyMCk7CisgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZShwb3J0V2lsbFJlc2V0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgaWYgKCpwb3J0V2lsbFJlc2V0KSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIG91dEhlYWRlci0+bk9mZnNldCA9IDA7CisgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gMDsKKyAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gKG91dHB1dEJ1ZmZlcldpZHRoKCkgKiBvdXRwdXRCdWZmZXJIZWlnaHQoKSAqIDMpIC8gMjsKKyAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gKihPTVhfVElDS1MgKiltSW1nLT51c2VyX3ByaXY7CisgICAgICAgIGlmIChvdXRwdXRCdWZmZXJTYWZlKG91dEhlYWRlcikpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IG91dEhlYWRlci0+cEJ1ZmZlcjsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKW1JbWctPnBsYW5lc1tWUFhfUExBTkVfWV07CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKiltSW1nLT5wbGFuZXNbVlBYX1BMQU5FX1VdOworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjViA9IChjb25zdCB1aW50OF90ICopbUltZy0+cGxhbmVzW1ZQWF9QTEFORV9WXTsKKyAgICAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlID0gbUltZy0+c3RyaWRlW1ZQWF9QTEFORV9ZXTsKKyAgICAgICAgICAgIHNpemVfdCBzcmNVU3RyaWRlID0gbUltZy0+c3RyaWRlW1ZQWF9QTEFORV9VXTsKKyAgICAgICAgICAgIHNpemVfdCBzcmNWU3RyaWRlID0gbUltZy0+c3RyaWRlW1ZQWF9QTEFORV9WXTsKKyAgICAgICAgICAgIGNvcHlZVjEyRnJhbWVUb091dHB1dEJ1ZmZlcihkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIG1JbWcgPSBOVUxMOworICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgIG91dFF1ZXVlLmVyYXNlKG91dFF1ZXVlLmJlZ2luKCkpOworICAgICAgICBvdXRJbmZvID0gTlVMTDsKKyAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgb3V0SGVhZGVyID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIWVvcykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOworICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKKyAgICAgICAgb3V0SGVhZGVyLT5uVGltZVN0YW1wID0gMDsKKyAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgIG91dEluZm8tPm1Pd25lZEJ5VXMgPSBmYWxzZTsKKyAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKKyAgICAgICAgbUVPU1N0YXR1cyA9IE9VVFBVVF9GUkFNRVNfRkxVU0hFRDsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU29mdFZQWDo6b3V0cHV0QnVmZmVyU2FmZShPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyKSB7CisgICAgdWludDMyX3Qgd2lkdGggPSBvdXRwdXRCdWZmZXJXaWR0aCgpOworICAgIHVpbnQzMl90IGhlaWdodCA9IG91dHB1dEJ1ZmZlckhlaWdodCgpOworICAgIHVpbnQ2NF90IG5GaWxsZWRMZW4gPSB3aWR0aDsKKyAgICBuRmlsbGVkTGVuICo9IGhlaWdodDsKKyAgICBpZiAobkZpbGxlZExlbiA+IFVJTlQzMl9NQVggLyAzKSB7CisgICAgICAgIEFMT0dFKCJiLzI5NDIxNjc1LCBuRmlsbGVkTGVuIG92ZXJmbG93ICVsbHUgdyAldSBoICV1IiwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW5GaWxsZWRMZW4sIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI5NDIxNjc1Iik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKG91dEhlYWRlci0+bkFsbG9jTGVuIDwgb3V0SGVhZGVyLT5uRmlsbGVkTGVuKSB7CisgICAgICAgIEFMT0dFKCJiLzI3NTk3MTAzLCBidWZmZXIgdG9vIHNtYWxsIik7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjc1OTcxMDMiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCiB2b2lkIFNvZnRWUFg6Om9uUXVldWVGaWxsZWQoT01YX1UzMiAvKiBwb3J0SW5kZXggKi8pIHsKLSAgICBpZiAobU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZSAhPSBOT05FKSB7CisgICAgaWYgKG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgIT0gTk9ORSB8fCBtRU9TU3RhdHVzID09IE9VVFBVVF9GUkFNRVNfRkxVU0hFRCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOwogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CiAgICAgYm9vbCBFT1NzZWVuID0gZmFsc2U7CisgICAgdnB4X2NvZGVjX2Vycl90IGVycjsKKyAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKIAotICAgIHdoaWxlICghaW5RdWV1ZS5lbXB0eSgpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKLQotICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7Ci0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOwotCi0gICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7Ci0gICAgICAgICAgICBFT1NzZWVuID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG5vdGlmeUVtcHR5QnVmZmVyRG9uZShpbkhlYWRlcik7Ci0KLSAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GaWxsZWRMZW4gPSAwOwotICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOwotCi0gICAgICAgICAgICAgICAgb3V0UXVldWUuZXJhc2Uob3V0UXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dEhlYWRlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1JbWcgPT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKHZweF9jb2RlY19kZWNvZGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAodnB4X2NvZGVjX2N0eF90ICopbUN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAwKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJvbjIgZGVjb2RlciBmYWlsZWQgdG8gZGVjb2RlIGZyYW1lLiIpOwotCisgICAgd2hpbGUgKChtRU9TU3RhdHVzID09IElOUFVUX0VPU19TRUVOIHx8ICFpblF1ZXVlLmVtcHR5KCkpCisgICAgICAgICAgICAmJiAhb3V0UXVldWUuZW1wdHkoKSkgeworICAgICAgICAvLyBPdXRwdXQgdGhlIHBlbmRpbmcgZnJhbWVzIHRoYXQgbGVmdCBmcm9tIGxhc3QgcG9ydCByZXNldCBvciBkZWNvZGVyIGZsdXNoLgorICAgICAgICBpZiAobUVPU1N0YXR1cyA9PSBJTlBVVF9FT1NfU0VFTiB8fCBtSW1nICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICghb3V0cHV0QnVmZmVycygKKyAgICAgICAgICAgICAgICAgICAgIG1FT1NTdGF0dXMgPT0gSU5QVVRfRU9TX1NFRU4sIHRydWUgLyogZGlzcGxheSAqLywKKyAgICAgICAgICAgICAgICAgICAgIG1FT1NTdGF0dXMgPT0gSU5QVVRfRU9TX1NFRU4sICZwb3J0V2lsbFJlc2V0KSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJvbjIgZGVjb2RlciBmYWlsZWQgdG8gb3V0cHV0IGZyYW1lLiIpOwogICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB2cHhfY29kZWNfaXRlcl90IGl0ZXIgPSBOVUxMOwotICAgICAgICAgICAgbUltZyA9IHZweF9jb2RlY19nZXRfZnJhbWUoKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsICZpdGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSW1nICE9IE5VTEwpIHsKLSAgICAgICAgICAgIENIRUNLX0VRKG1JbWctPmZtdCwgSU1HX0ZNVF9JNDIwKTsKLQotICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggPSBtSW1nLT5kX3c7Ci0gICAgICAgICAgICB1aW50MzJfdCBoZWlnaHQgPSBtSW1nLT5kX2g7Ci0gICAgICAgICAgICBib29sIHBvcnRXaWxsUmVzZXQgPSBmYWxzZTsKLSAgICAgICAgICAgIGhhbmRsZVBvcnRTZXR0aW5nc0NoYW5nZSgmcG9ydFdpbGxSZXNldCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICBpZiAocG9ydFdpbGxSZXNldCkgeworICAgICAgICAgICAgaWYgKHBvcnRXaWxsUmVzZXQgfHwgbUVPU1N0YXR1cyA9PSBPVVRQVVRfRlJBTUVTX0ZMVVNIRUQgfHwKKyAgICAgICAgICAgICAgICAgICAgbUVPU1N0YXR1cyA9PSBJTlBVVF9FT1NfU0VFTikgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0gICAgICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOwotICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmlsbGVkTGVuID0gKG91dHB1dEJ1ZmZlcldpZHRoKCkgKiBvdXRwdXRCdWZmZXJIZWlnaHQoKSAqIDMpIC8gMjsKLSAgICAgICAgICAgIG91dEhlYWRlci0+bkZsYWdzID0gRU9Tc2VlbiA/IE9NWF9CVUZGRVJGTEFHX0VPUyA6IDA7Ci0gICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKLSAgICAgICAgICAgIGlmIChvdXRIZWFkZXItPm5BbGxvY0xlbiA+PSBvdXRIZWFkZXItPm5GaWxsZWRMZW4pIHsKLSAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBvdXRIZWFkZXItPnBCdWZmZXI7Ci0gICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopbUltZy0+cGxhbmVzW1ZQWF9QTEFORV9ZXTsKLSAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKiltSW1nLT5wbGFuZXNbVlBYX1BMQU5FX1VdOwotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKW1JbWctPnBsYW5lc1tWUFhfUExBTkVfVl07Ci0gICAgICAgICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBtSW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ldOwotICAgICAgICAgICAgICAgIHNpemVfdCBzcmNVU3RyaWRlID0gbUltZy0+c3RyaWRlW1ZQWF9QTEFORV9VXTsKLSAgICAgICAgICAgICAgICBzaXplX3Qgc3JjVlN0cmlkZSA9IG1JbWctPnN0cmlkZVtWUFhfUExBTkVfVl07Ci0gICAgICAgICAgICAgICAgY29weVlWMTJGcmFtZVRvT3V0cHV0QnVmZmVyKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI3NTk3MTAzLCBidWZmZXIgdG9vIHNtYWxsIik7Ci0gICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzU5NzEwMyIpOwotICAgICAgICAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IDA7Ci0gICAgICAgICAgICB9CisgICAgICAgIEJ1ZmZlckluZm8gKmluSW5mbyA9ICppblF1ZXVlLmJlZ2luKCk7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICppbkhlYWRlciA9IGluSW5mby0+bUhlYWRlcjsKKyAgICAgICAgbVRpbWVTdGFtcHNbbVRpbWVTdGFtcElkeF0gPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKIAotICAgICAgICAgICAgbUltZyA9IE5VTEw7Ci0gICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7Ci0gICAgICAgICAgICBvdXRRdWV1ZS5lcmFzZShvdXRRdWV1ZS5iZWdpbigpKTsKLSAgICAgICAgICAgIG91dEluZm8gPSBOVUxMOwotICAgICAgICAgICAgbm90aWZ5RmlsbEJ1ZmZlckRvbmUob3V0SGVhZGVyKTsKLSAgICAgICAgICAgIG91dEhlYWRlciA9IE5VTEw7CisgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7CisgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICBtRU9TU3RhdHVzID0gSU5QVVRfRU9TX1NFRU47CisgICAgICAgICAgICBFT1NzZWVuID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA+IDAgJiYKKyAgICAgICAgICAgIHZweF9jb2RlY19kZWNvZGUoKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+cEJ1ZmZlciArIGluSGVhZGVyLT5uT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5IZWFkZXItPm5GaWxsZWRMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbVRpbWVTdGFtcHNbbVRpbWVTdGFtcElkeF0sIDApKSB7CisgICAgICAgICAgICBBTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGRlY29kZSBmcmFtZS4iKTsKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtVGltZVN0YW1wSWR4ID0gKG1UaW1lU3RhbXBJZHggKyAxKSAlIGtOdW1CdWZmZXJzOworCisgICAgICAgIGlmICghb3V0cHV0QnVmZmVycygKKyAgICAgICAgICAgICAgICAgRU9Tc2VlbiAvKiBmbHVzaERlY29kZXIgKi8sIHRydWUgLyogZGlzcGxheSAqLywgRU9Tc2VlbiwgJnBvcnRXaWxsUmVzZXQpKSB7CisgICAgICAgICAgICBBTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIG91dHB1dCBmcmFtZS4iKTsKKyAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCAwLCBOVUxMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAocG9ydFdpbGxSZXNldCkgeworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CkBAIC0xODEsNiArMjc1LDMwIEBACiAgICAgfQogfQogCit2b2lkIFNvZnRWUFg6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgaWYgKHBvcnRJbmRleCA9PSBrSW5wdXRQb3J0SW5kZXgpIHsKKyAgICAgICAgYm9vbCBwb3J0V2lsbFJlc2V0ID0gZmFsc2U7CisgICAgICAgIGlmICghb3V0cHV0QnVmZmVycygKKyAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBmbHVzaERlY29kZXIgKi8sIGZhbHNlIC8qIGRpc3BsYXkgKi8sIGZhbHNlIC8qIGVvcyAqLywgJnBvcnRXaWxsUmVzZXQpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZsdXNoIGRlY29kZXIuIik7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUVPU1N0YXR1cyA9IElOUFVUX0RBVEFfQVZBSUxBQkxFOworICAgIH0KK30KKwordm9pZCBTb2Z0VlBYOjpvblJlc2V0KCkgeworICAgIGJvb2wgcG9ydFdpbGxSZXNldCA9IGZhbHNlOworICAgIGlmICghb3V0cHV0QnVmZmVycygKKyAgICAgICAgICAgICB0cnVlIC8qIGZsdXNoRGVjb2RlciAqLywgZmFsc2UgLyogZGlzcGxheSAqLywgZmFsc2UgLyogZW9zICovLCAmcG9ydFdpbGxSZXNldCkpIHsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBmbHVzaCBkZWNvZGVyLiBUcnkgdG8gaGFyZCByZXNldCBkZWNvZGVyIik7CisgICAgICAgIGRlc3Ryb3lEZWNvZGVyKCk7CisgICAgICAgIGluaXREZWNvZGVyKCk7CisgICAgfQorICAgIG1FT1NTdGF0dXMgPSBJTlBVVF9EQVRBX0FWQUlMQUJMRTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogYW5kcm9pZDo6U29mdE9NWENvbXBvbmVudCAqY3JlYXRlU29mdE9NWENvbXBvbmVudCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaAppbmRleCA4ZjY4NjkzLi44NGNmNzljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCkBAIC0zOCw2ICszOCw4IEBACiAgICAgdmlydHVhbCB+U29mdFZQWCgpOwogCiAgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOworICAgIHZpcnR1YWwgdm9pZCBvblBvcnRGbHVzaENvbXBsZXRlZChPTVhfVTMyIHBvcnRJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIG9uUmVzZXQoKTsKIAogcHJpdmF0ZToKICAgICBlbnVtIHsKQEAgLTQ5LDExICs1MSwyMiBAQAogICAgICAgICBNT0RFX1ZQOQogICAgIH0gbU1vZGU7CiAKLSAgICB2b2lkICptQ3R4OworICAgIGVudW0geworICAgICAgICBJTlBVVF9EQVRBX0FWQUlMQUJMRSwgIC8vIFZQWCBjb21wb25lbnQgaXMgcmVhZHkgdG8gZGVjb2RlIGRhdGEuCisgICAgICAgIElOUFVUX0VPU19TRUVOLCAgICAgICAgLy8gVlBYIGNvbXBvbmVudCBzYXcgRU9TIGFuZCBpcyBmbHVzaGluZyBPbjIgZGVjb2Rlci4KKyAgICAgICAgT1VUUFVUX0ZSQU1FU19GTFVTSEVEICAvLyBWUFggY29tcG9uZW50IGZpbmlzaGVkIGZsdXNoaW5nIE9uMiBkZWNvZGVyLgorICAgIH0gbUVPU1N0YXR1czsKIAorICAgIHZvaWQgKm1DdHg7CisgICAgYm9vbCBtRnJhbWVQYXJhbGxlbE1vZGU7ICAvLyBGcmFtZSBwYXJhbGxlbCBpcyBvbmx5IHN1cHBvcnRlZCBieSBWUDkgZGVjb2Rlci4KKyAgICBPTVhfVElDS1MgbVRpbWVTdGFtcHNba051bUJ1ZmZlcnNdOworICAgIHVpbnQ4X3QgbVRpbWVTdGFtcElkeDsKICAgICB2cHhfaW1hZ2VfdCAqbUltZzsKIAogICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgc3RhdHVzX3QgZGVzdHJveURlY29kZXIoKTsKKyAgICBib29sIG91dHB1dEJ1ZmZlcnMoYm9vbCBmbHVzaERlY29kZXIsIGJvb2wgZGlzcGxheSwgYm9vbCBlb3MsIGJvb2wgKnBvcnRXaWxsUmVzZXQpOworICAgIGJvb2wgb3V0cHV0QnVmZmVyU2FmZShPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRWUFgpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcAppbmRleCAzZjIyMzViLi41Yzk1MGM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwCkBAIC03MTEsNyArNzExLDggQEAKICAgICAgICAgQnVmZmVySW5mbyAqb3V0cHV0QnVmZmVySW5mbyA9ICpvdXRwdXRCdWZmZXJJbmZvUXVldWUuYmVnaW4oKTsKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dHB1dEJ1ZmZlckhlYWRlciA9IG91dHB1dEJ1ZmZlckluZm8tPm1IZWFkZXI7CiAKLSAgICAgICAgaWYgKGlucHV0QnVmZmVySGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgaWYgKChpbnB1dEJ1ZmZlckhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSAmJgorICAgICAgICAgICAgICAgIGlucHV0QnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuID09IDApIHsKICAgICAgICAgICAgIGlucHV0QnVmZmVySW5mb1F1ZXVlLmVyYXNlKGlucHV0QnVmZmVySW5mb1F1ZXVlLmJlZ2luKCkpOwogICAgICAgICAgICAgaW5wdXRCdWZmZXJJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5wdXRCdWZmZXJIZWFkZXIpOwpAQCAtODI4LDYgKzgyOSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRfcGFja2V0LT5kYXRhLmZyYW1lLnN6KTsKICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVySW5mb1F1ZXVlLmVyYXNlKG91dHB1dEJ1ZmZlckluZm9RdWV1ZS5iZWdpbigpKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXRCdWZmZXJIZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJIZWFkZXItPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG5vdGlmeUZpbGxCdWZmZXJEb25lKG91dHB1dEJ1ZmZlckhlYWRlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCmluZGV4IGE3MDU2ZDEuLjJlNDRlZDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcApAQCAtMzYxLDkgKzM2MSwxNSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB1aW50OF90IGNoYW5uZWxfbWFwcGluZ1trTWF4Q2hhbm5lbHNdID0gezB9OwotICAgICAgICAgICAgbWVtY3B5KCZjaGFubmVsX21hcHBpbmcsCi0gICAgICAgICAgICAgICAgICAga0RlZmF1bHRPcHVzQ2hhbm5lbExheW91dCwKLSAgICAgICAgICAgICAgICAgICBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCk7CisgICAgICAgICAgICBpZiAobUhlYWRlci0+Y2hhbm5lbHMgPD0ga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmNoYW5uZWxfbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRPcHVzQ2hhbm5lbExheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmNoYW5uZWxfbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+c3RyZWFtX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+Y2hhbm5lbHMpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQgc3RhdHVzID0gT1BVU19JTlZBTElEX1NUQVRFOwogICAgICAgICAgICAgbURlY29kZXIgPSBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKGtSYXRlLApAQCAtNDEzLDYgKzQxOSwxNCBAQAogICAgICAgICBCdWZmZXJJbmZvICppbkluZm8gPSAqaW5RdWV1ZS5iZWdpbigpOwogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaW5IZWFkZXIgPSBpbkluZm8tPm1IZWFkZXI7CiAKKyAgICAgICAgLy8gSWdub3JlIENTRCByZS1zdWJtaXNzaW9ucy4KKyAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykgeworICAgICAgICAgICAgaW5RdWV1ZS5lcmFzZShpblF1ZXVlLmJlZ2luKCkpOworICAgICAgICAgICAgaW5JbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CisgICAgICAgICAgICBub3RpZnlFbXB0eUJ1ZmZlckRvbmUoaW5IZWFkZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKICAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICpvdXRRdWV1ZS5iZWdpbigpOwogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqb3V0SGVhZGVyID0gb3V0SW5mby0+bUhlYWRlcjsKIApAQCAtNDQ0LDEyICs0NTgsMTcgQEAKIAogICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKICAgICAgICAgY29uc3QgdWludDMyX3Qgc2l6ZSA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOworICAgICAgICBzaXplX3QgZnJhbWVTaXplID0ga01heE9wdXNPdXRwdXRQYWNrZXRTaXplU2FtcGxlczsKKyAgICAgICAgaWYgKGZyYW1lU2l6ZSA+IG91dEhlYWRlci0+bkFsbG9jTGVuIC8gc2l6ZW9mKGludDE2X3QpIC8gbUhlYWRlci0+Y2hhbm5lbHMpIHsKKyAgICAgICAgICAgIGZyYW1lU2l6ZSA9IG91dEhlYWRlci0+bkFsbG9jTGVuIC8gc2l6ZW9mKGludDE2X3QpIC8gbUhlYWRlci0+Y2hhbm5lbHM7CisgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3ODMzNjE2Iik7CisgICAgICAgIH0KIAogICAgICAgICBpbnQgbnVtRnJhbWVzID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGUobURlY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopb3V0SGVhZGVyLT5wQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga01heE9wdXNPdXRwdXRQYWNrZXRTaXplU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwogICAgICAgICBpZiAobnVtRnJhbWVzIDwgMCkgewogICAgICAgICAgICAgQUxPR0UoIm9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlIHJldHVybmVkICVkIiwgbnVtRnJhbWVzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKaW5kZXggNGUxZTZhNS4uNWY0ZTM0NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAKQEAgLTI3Myw2ICsyNzMsMTIgQEAKIAogICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gaGVhZGVyLT5wQnVmZmVyICsgaGVhZGVyLT5uT2Zmc2V0OwogICAgICAgICBzaXplX3Qgc2l6ZSA9IGhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgaWYgKHNpemUgPCA3KSB7CisgICAgICAgICAgICBBTE9HRSgiVG9vIHNtYWxsIGlucHV0IGJ1ZmZlcjogJXp1IGJ5dGVzIiwgc2l6ZSk7CisgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3ODMzNjE2Iik7CisgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgMCwgTlVMTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAogICAgICAgICBvZ2dfYnVmZmVyIGJ1ZjsKICAgICAgICAgb2dnX3JlZmVyZW5jZSByZWY7CkBAIC0zNzgsOSArMzg0LDE0IEBACiAgICAgICAgICAgICBBTE9HVygidm9yYmlzX2RzcF9zeW50aGVzaXMgcmV0dXJuZWQgJWQiLCBlcnIpOwogI2VuZGlmCiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplX3QgbnVtU2FtcGxlc1BlckJ1ZmZlciA9IGtNYXhOdW1TYW1wbGVzUGVyQnVmZmVyOworICAgICAgICAgICAgaWYgKG51bVNhbXBsZXNQZXJCdWZmZXIgPiBvdXRIZWFkZXItPm5BbGxvY0xlbiAvIHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgICAgIG51bVNhbXBsZXNQZXJCdWZmZXIgPSBvdXRIZWFkZXItPm5BbGxvY0xlbiAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3ODMzNjE2Iik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBudW1GcmFtZXMgPSB2b3JiaXNfZHNwX3BjbW91dCgKICAgICAgICAgICAgICAgICAgICAgbVN0YXRlLCAoaW50MTZfdCAqKW91dEhlYWRlci0+cEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgKGtNYXhOdW1TYW1wbGVzUGVyQnVmZmVyIC8gbVZpLT5jaGFubmVscykpOworICAgICAgICAgICAgICAgICAgICAobnVtU2FtcGxlc1BlckJ1ZmZlciAvIG1WaS0+Y2hhbm5lbHMpKTsKIAogICAgICAgICAgICAgaWYgKG51bUZyYW1lcyA8IDApIHsKICAgICAgICAgICAgICAgICBBTE9HRSgidm9yYmlzX2RzcF9wY21vdXQgcmV0dXJuZWQgJWQiLCBudW1GcmFtZXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5tawppbmRleCA1OWE2NGJhLi40ZjdjNDhmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5tawpAQCAtOSw2ICs5LDkgQEAKICAgICAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAgICAgICAgICQoVE9QKS9oYXJkd2FyZS9tc203awogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQorCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9jb2xvcl9jb252ZXJzaW9uCiAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAppbmRleCAwNDQ2N2I5Li5lOTJjMTkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCkBAIC0zOCw3ICszOCw4IEBACiAgICAgcmV0dXJuICh4ICsgeSAtIDEpICYgfih5IC0gMSk7CiB9CiAKLVNvZnR3YXJlUmVuZGVyZXI6OlNvZnR3YXJlUmVuZGVyZXIoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZVdpbmRvdykKK1NvZnR3YXJlUmVuZGVyZXI6OlNvZnR3YXJlUmVuZGVyZXIoCisgICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3csIGludDMyX3Qgcm90YXRpb24pCiAgICAgOiBtQ29sb3JGb3JtYXQoT01YX0NPTE9SX0Zvcm1hdFVudXNlZCksCiAgICAgICBtQ29udmVydGVyKE5VTEwpLAogICAgICAgbVlVVk1vZGUoTm9uZSksCkBAIC01MCw3ICs1MSw4IEBACiAgICAgICBtQ3JvcFJpZ2h0KDApLAogICAgICAgbUNyb3BCb3R0b20oMCksCiAgICAgICBtQ3JvcFdpZHRoKDApLAotICAgICAgbUNyb3BIZWlnaHQoMCkgeworICAgICAgbUNyb3BIZWlnaHQoMCksCisgICAgICBtUm90YXRpb25EZWdyZWVzKHJvdGF0aW9uKSB7CiB9CiAKIFNvZnR3YXJlUmVuZGVyZXI6On5Tb2Z0d2FyZVJlbmRlcmVyKCkgewpAQCAtOTgsMzMgKzEwMCw0OSBAQAogICAgIG1Dcm9wV2lkdGggPSBtQ3JvcFJpZ2h0IC0gbUNyb3BMZWZ0ICsgMTsKICAgICBtQ3JvcEhlaWdodCA9IG1Dcm9wQm90dG9tIC0gbUNyb3BUb3AgKyAxOwogCi0gICAgaW50IGhhbEZvcm1hdDsKLSAgICBzaXplX3QgYnVmV2lkdGgsIGJ1ZkhlaWdodDsKKyAgICAvLyBieSBkZWZhdWx0IGNvbnZlcnQgZXZlcnl0aGluZyB0byBSR0I1NjUKKyAgICBpbnQgaGFsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OworICAgIHNpemVfdCBidWZXaWR0aCA9IG1Dcm9wV2lkdGg7CisgICAgc2l6ZV90IGJ1ZkhlaWdodCA9IG1Dcm9wSGVpZ2h0OwogCi0gICAgc3dpdGNoIChtQ29sb3JGb3JtYXQpIHsKLSAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgotICAgICAgICBjYXNlIE9NWF9USV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgotICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXJ1bm5pbmdJbkVtdWxhdG9yKCkpIHsKKyAgICAvLyBoYXJkd2FyZSBoYXMgWVVWMTIgYW5kIFJHQkE4ODg4IHN1cHBvcnQsIHNvIGNvbnZlcnQga25vd24gZm9ybWF0cworICAgIGlmICghcnVubmluZ0luRW11bGF0b3IoKSkgeworICAgICAgICBzd2l0Y2ggKG1Db2xvckZvcm1hdCkgeworICAgICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgIGNhc2UgT01YX1RJX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CisgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaGFsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOwogICAgICAgICAgICAgICAgIGJ1ZldpZHRoID0gKG1Dcm9wV2lkdGggKyAxKSAmIH4xOwogICAgICAgICAgICAgICAgIGJ1ZkhlaWdodCA9IChtQ3JvcEhlaWdodCArIDEpICYgfjE7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaC4KKyAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDI0Yml0UkdCODg4OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhhbEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCXzg4ODsKKyAgICAgICAgICAgICAgICBidWZXaWR0aCA9IChtQ3JvcFdpZHRoICsgMSkgJiB+MTsKKyAgICAgICAgICAgICAgICBidWZIZWlnaHQgPSAobUNyb3BIZWlnaHQgKyAxKSAmIH4xOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRBUkdCODg4ODoKKyAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODg6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg7CisgICAgICAgICAgICAgICAgYnVmV2lkdGggPSAobUNyb3BXaWR0aCArIDEpICYgfjE7CisgICAgICAgICAgICAgICAgYnVmSGVpZ2h0ID0gKG1Dcm9wSGVpZ2h0ICsgMSkgJiB+MTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGhhbEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCXzU2NTsKLSAgICAgICAgICAgIGJ1ZldpZHRoID0gbUNyb3BXaWR0aDsKLSAgICAgICAgICAgIGJ1ZkhlaWdodCA9IG1Dcm9wSGVpZ2h0OwotCi0gICAgICAgICAgICBtQ29udmVydGVyID0gbmV3IENvbG9yQ29udmVydGVyKAotICAgICAgICAgICAgICAgICAgICBtQ29sb3JGb3JtYXQsIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NSk7Ci0gICAgICAgICAgICBDSEVDSyhtQ29udmVydGVyLT5pc1ZhbGlkKCkpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGhhbEZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjUpIHsKKyAgICAgICAgbUNvbnZlcnRlciA9IG5ldyBDb2xvckNvbnZlcnRlcigKKyAgICAgICAgICAgICAgICBtQ29sb3JGb3JtYXQsIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NSk7CisgICAgICAgIENIRUNLKG1Db252ZXJ0ZXItPmlzVmFsaWQoKSk7CiAgICAgfQogCiAgICAgQ0hFQ0sobU5hdGl2ZVdpbmRvdyAhPSBOVUxMKTsKQEAgLTE2NSw3ICsxODMsNyBAQAogCiAgICAgaW50MzJfdCByb3RhdGlvbkRlZ3JlZXM7CiAgICAgaWYgKCFmb3JtYXQtPmZpbmRJbnQzMigicm90YXRpb24tZGVncmVlcyIsICZyb3RhdGlvbkRlZ3JlZXMpKSB7Ci0gICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IDA7CisgICAgICAgIHJvdGF0aW9uRGVncmVlcyA9IG1Sb3RhdGlvbkRlZ3JlZXM7CiAgICAgfQogICAgIHVpbnQzMl90IHRyYW5zZm9ybTsKICAgICBzd2l0Y2ggKHJvdGF0aW9uRGVncmVlcykgewpAQCAtMTgwLDE3ICsxOTgsMjkgQEAKICAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93LmdldCgpLCB0cmFuc2Zvcm0pKTsKIH0KIAotdm9pZCBTb2Z0d2FyZVJlbmRlcmVyOjpyZW5kZXIoCi0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBpbnQ2NF90IHRpbWVzdGFtcE5zLAordm9pZCBTb2Z0d2FyZVJlbmRlcmVyOjpjbGVhclRyYWNrZXIoKSB7CisgICAgbVJlbmRlclRyYWNrZXIuY2xlYXIoLTEgLyogbGFzdFJlbmRlclRpbWVOcyAqLyk7Cit9CisKK3N0ZDo6bGlzdDxGcmFtZVJlbmRlclRyYWNrZXI6OkluZm8+IFNvZnR3YXJlUmVuZGVyZXI6OnJlbmRlcigKKyAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3QgcmVuZGVyVGltZU5zLAogICAgICAgICB2b2lkKiAvKnBsYXRmb3JtUHJpdmF0ZSovLCBjb25zdCBzcDxBTWVzc2FnZT4mIGZvcm1hdCkgewogICAgIHJlc2V0Rm9ybWF0SWZDaGFuZ2VkKGZvcm1hdCk7CisgICAgRnJhbWVSZW5kZXJUcmFja2VyOjpJbmZvICppbmZvID0gTlVMTDsKIAogICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIgKmJ1ZjsKLSAgICBpbnQgZXJyOwotICAgIGlmICgoZXJyID0gbmF0aXZlX3dpbmRvd19kZXF1ZXVlX2J1ZmZlcl9hbmRfd2FpdChtTmF0aXZlV2luZG93LmdldCgpLAotICAgICAgICAgICAgJmJ1ZikpICE9IDApIHsKKyAgICBpbnQgZmVuY2VGZCA9IC0xOworICAgIGludCBlcnIgPSBtTmF0aXZlV2luZG93LT5kZXF1ZXVlQnVmZmVyKG1OYXRpdmVXaW5kb3cuZ2V0KCksICZidWYsICZmZW5jZUZkKTsKKyAgICBpZiAoZXJyID09IDAgJiYgZmVuY2VGZCA+PSAwKSB7CisgICAgICAgIGluZm8gPSBtUmVuZGVyVHJhY2tlci51cGRhdGVJbmZvRm9yRGVxdWV1ZWRCdWZmZXIoYnVmLCBmZW5jZUZkLCAwKTsKKyAgICAgICAgc3A8RmVuY2U+IGZlbmNlID0gbmV3IEZlbmNlKGZlbmNlRmQpOworICAgICAgICBlcnIgPSBmZW5jZS0+d2FpdEZvcmV2ZXIoIlNvZnR3YXJlUmVuZGVyZXI6OnJlbmRlciIpOworICAgIH0KKyAgICBpZiAoZXJyICE9IDApIHsKICAgICAgICAgQUxPR1coIlN1cmZhY2U6OmRlcXVldWVCdWZmZXIgcmV0dXJuZWQgZXJyb3IgJWQiLCBlcnIpOwotICAgICAgICByZXR1cm47CisgICAgICAgIC8vIGNvbXBsZXRlIChkcm9wKSBkZXF1ZXVlZCBmcmFtZSBpZiBmZW5jZSB3YWl0IGZhaWxlZDsgb3RoZXJ3aXNlLAorICAgICAgICAvLyB0aGlzIHJldHVybnMgYW4gZW1wdHkgbGlzdCBhcyBubyBmcmFtZXMgc2hvdWxkIGhhdmUgcmVuZGVyZWQgYW5kIG5vdCB5ZXQgcmV0dXJuZWQuCisgICAgICAgIHJldHVybiBtUmVuZGVyVHJhY2tlci5jaGVja0ZlbmNlc0FuZEdldFJlbmRlcmVkRnJhbWVzKGluZm8sIGZhbHNlIC8qIGRyb3BJbmNvbXBsZXRlICovKTsKICAgICB9CiAKICAgICBHcmFwaGljQnVmZmVyTWFwcGVyICZtYXBwZXIgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKTsKQEAgLTIwMSw2ICsyMzEsOCBAQAogICAgIENIRUNLX0VRKDAsIG1hcHBlci5sb2NrKAogICAgICAgICAgICAgICAgIGJ1Zi0+aGFuZGxlLCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCBib3VuZHMsICZkc3QpKTsKIAorICAgIC8vIFRPRE8gbW92ZSB0aGUgb3RoZXIgY29udmVyc2lvbnMgYWxzbyBpbnRvIENvbG9yQ29udmVydGVyLCBhbmQKKyAgICAvLyBmaXggY3JvcHBpbmcgaXNzdWVzICh3aGVuIG1Dcm9wTGVmdC9Ub3AgIT0gMCBvciBtV2lkdGggIT0gbUNyb3BXaWR0aCkKICAgICBpZiAobUNvbnZlcnRlcikgewogICAgICAgICBtQ29udmVydGVyLT5jb252ZXJ0KAogICAgICAgICAgICAgICAgIGRhdGEsCkBAIC0yMTQsNyArMjQ2LDggQEAKICAgICAgICAgICAgIGdvdG8gc2tpcF9jb3B5aW5nOwogICAgICAgICB9CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwotICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9IChjb25zdCB1aW50OF90ICopZGF0YSArIG1XaWR0aCAqIG1IZWlnaHQ7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0KKyAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWRhdGEgKyBtV2lkdGggKiBtSGVpZ2h0OwogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdiA9IHNyY191ICsgKG1XaWR0aCAvIDIgKiBtSGVpZ2h0IC8gMik7CiAKICAgICAgICAgdWludDhfdCAqZHN0X3kgPSAodWludDhfdCAqKWRzdDsKQEAgLTI0NSwxMiArMjc4LDkgQEAKICAgICAgICAgaWYgKChzaXplX3QpbVdpZHRoICogbUhlaWdodCAqIDMgLyAyID4gc2l6ZSkgewogICAgICAgICAgICAgZ290byBza2lwX2NvcHlpbmc7CiAgICAgICAgIH0KLQotICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9Ci0gICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWRhdGE7Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3V2ID0KLSAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopZGF0YSArIG1XaWR0aCAqIChtSGVpZ2h0IC0gbUNyb3BUb3AgLyAyKTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3kgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191diA9IChjb25zdCB1aW50OF90ICopZGF0YQorICAgICAgICAgICAgICAgICsgbVdpZHRoICogKG1IZWlnaHQgLSBtQ3JvcFRvcCAvIDIpOwogCiAgICAgICAgIHVpbnQ4X3QgKmRzdF95ID0gKHVpbnQ4X3QgKilkc3Q7CiAKQEAgLTI3OCw2ICszMDgsNDcgQEAKICAgICAgICAgICAgIGRzdF91ICs9IGRzdF9jX3N0cmlkZTsKICAgICAgICAgICAgIGRzdF92ICs9IGRzdF9jX3N0cmlkZTsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQyNGJpdFJHQjg4OCkgeworICAgICAgICBpZiAoKHNpemVfdCltV2lkdGggKiBtSGVpZ2h0ICogMyA+IHNpemUpIHsKKyAgICAgICAgICAgIGdvdG8gc2tpcF9jb3B5aW5nOworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QqIHNyY1B0ciA9ICh1aW50OF90KilkYXRhOworICAgICAgICB1aW50OF90KiBkc3RQdHIgPSAodWludDhfdCopZHN0OworCisgICAgICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgKHNpemVfdCltQ3JvcEhlaWdodDsgKyt5KSB7CisgICAgICAgICAgICBtZW1jcHkoZHN0UHRyLCBzcmNQdHIsIG1Dcm9wV2lkdGggKiAzKTsKKyAgICAgICAgICAgIHNyY1B0ciArPSBtV2lkdGggKiAzOworICAgICAgICAgICAgZHN0UHRyICs9IGJ1Zi0+c3RyaWRlICogMzsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEFSR0I4ODg4KSB7CisgICAgICAgIGlmICgoc2l6ZV90KW1XaWR0aCAqIG1IZWlnaHQgKiA0ID4gc2l6ZSkgeworICAgICAgICAgICAgZ290byBza2lwX2NvcHlpbmc7CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCAqc3JjUHRyLCAqZHN0UHRyOworCisgICAgICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgKHNpemVfdCltQ3JvcEhlaWdodDsgKyt5KSB7CisgICAgICAgICAgICBzcmNQdHIgPSAodWludDhfdCopZGF0YSArIG1XaWR0aCAqIDQgKiB5OworICAgICAgICAgICAgZHN0UHRyID0gKHVpbnQ4X3QqKWRzdCArIGJ1Zi0+c3RyaWRlICogNCAqIHk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IChzaXplX3QpbUNyb3BXaWR0aDsgKyt4KSB7CisgICAgICAgICAgICAgICAgdWludDhfdCBhID0gKnNyY1B0cisrOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMzsgKytpKSB7ICAgLy8gY29weSBSR0IKKyAgICAgICAgICAgICAgICAgICAgKmRzdFB0cisrID0gKnNyY1B0cisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqZHN0UHRyKysgPSBhOyAgLy8gYWxwaGEgbGFzdCAoQVJHQiB0byBSR0JBKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODgpIHsKKyAgICAgICAgaWYgKChzaXplX3QpbVdpZHRoICogbUhlaWdodCAqIDQgPiBzaXplKSB7CisgICAgICAgICAgICBnb3RvIHNraXBfY29weWluZzsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90KiBzcmNQdHIgPSAodWludDhfdCopZGF0YTsKKyAgICAgICAgdWludDhfdCogZHN0UHRyID0gKHVpbnQ4X3QqKWRzdDsKKworICAgICAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IChzaXplX3QpbUNyb3BIZWlnaHQ7ICsreSkgeworICAgICAgICAgICAgbWVtY3B5KGRzdFB0ciwgc3JjUHRyLCBtQ3JvcFdpZHRoICogNCk7CisgICAgICAgICAgICBzcmNQdHIgKz0gbVdpZHRoICogNDsKKyAgICAgICAgICAgIGRzdFB0ciArPSBidWYtPnN0cmlkZSAqIDQ7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgY29sb3IgZm9ybWF0ICUjeCIsIG1Db2xvckZvcm1hdCk7CiAgICAgfQpAQCAtMjg1LDE2ICszNTYsMjEgQEAKIHNraXBfY29weWluZzoKICAgICBDSEVDS19FUSgwLCBtYXBwZXIudW5sb2NrKGJ1Zi0+aGFuZGxlKSk7CiAKLSAgICBpZiAoKGVyciA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdGltZXN0YW1wKG1OYXRpdmVXaW5kb3cuZ2V0KCksCi0gICAgICAgICAgICB0aW1lc3RhbXBOcykpICE9IDApIHsKLSAgICAgICAgQUxPR1coIlN1cmZhY2U6OnNldF9idWZmZXJzX3RpbWVzdGFtcCByZXR1cm5lZCBlcnJvciAlZCIsIGVycik7CisgICAgaWYgKHJlbmRlclRpbWVOcyA+PSAwKSB7CisgICAgICAgIGlmICgoZXJyID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190aW1lc3RhbXAobU5hdGl2ZVdpbmRvdy5nZXQoKSwKKyAgICAgICAgICAgICAgICByZW5kZXJUaW1lTnMpKSAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVygiU3VyZmFjZTo6c2V0X2J1ZmZlcnNfdGltZXN0YW1wIHJldHVybmVkIGVycm9yICVkIiwgZXJyKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIGlmICgoZXJyID0gbU5hdGl2ZVdpbmRvdy0+cXVldWVCdWZmZXIobU5hdGl2ZVdpbmRvdy5nZXQoKSwgYnVmLAotICAgICAgICAgICAgLTEpKSAhPSAwKSB7CisgICAgaWYgKChlcnIgPSBtTmF0aXZlV2luZG93LT5xdWV1ZUJ1ZmZlcihtTmF0aXZlV2luZG93LmdldCgpLCBidWYsIC0xKSkgIT0gMCkgewogICAgICAgICBBTE9HVygiU3VyZmFjZTo6cXVldWVCdWZmZXIgcmV0dXJuZWQgZXJyb3IgJWQiLCBlcnIpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1SZW5kZXJUcmFja2VyLm9uRnJhbWVRdWV1ZWQobWVkaWFUaW1lVXMsIChHcmFwaGljQnVmZmVyICopYnVmLCBGZW5jZTo6Tk9fRkVOQ0UpOwogICAgIH0KKwogICAgIGJ1ZiA9IE5VTEw7CisgICAgcmV0dXJuIG1SZW5kZXJUcmFja2VyLmNoZWNrRmVuY2VzQW5kR2V0UmVuZGVyZWRGcmFtZXMoaW5mbywgaW5mbyAhPSBOVUxMIC8qIGRyb3BJbmNvbXBsZXRlICovKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzlmMDU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjggQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgICAgIENvbG9yQ29udmVydC5jcHAgICAgICAgICAgXAorICAgICAgICBHcmFwaGljQnVmZmVyTGlzdGVuZXIuY3BwIFwKKyAgICAgICAgSW50cmluc2ljQmx1ckZpbHRlci5jcHAgICBcCisgICAgICAgIE1lZGlhRmlsdGVyLmNwcCAgICAgICAgICAgXAorICAgICAgICBSU0ZpbHRlci5jcHAgICAgICAgICAgICAgIFwKKyAgICAgICAgU2F0dXJhdGlvbkZpbHRlci5jcHAgICAgICBcCisgICAgICAgIHNhdHVyYXRpb25BUkdCLnJzICAgICAgICAgXAorICAgICAgICBTaW1wbGVGaWx0ZXIuY3BwICAgICAgICAgIFwKKyAgICAgICAgWmVyb0ZpbHRlci5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAorICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9ycy9jcHAgXAorICAgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9ycyBcCisKK2ludGVybWVkaWF0ZXMgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixTVEFUSUNfTElCUkFSSUVTLGxpYlJTLFRBUkdFVCwpCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoaW50ZXJtZWRpYXRlcykKKworTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKKworTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfbWVkaWFmaWx0ZXIKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9Db2xvckNvbnZlcnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9Db2xvckNvbnZlcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZDVkZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0NvbG9yQ29udmVydC5jcHAKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQ29sb3JDb252ZXJ0LmgiCisKKyNpZm5kZWYgbWF4CisjZGVmaW5lIG1heChhLGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCisjZW5kaWYKKyNpZm5kZWYgbWluCisjZGVmaW5lIG1pbihhLGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIFlVVlRvUkdCKAorICAgICAgICBpbnQzMl90IHksIGludDMyX3QgdSwgaW50MzJfdCB2LAorICAgICAgICBpbnQzMl90KiByLCBpbnQzMl90KiBnLCBpbnQzMl90KiBiKSB7CisgICAgeSAtPSAxNjsKKyAgICB1IC09IDEyODsKKyAgICB2IC09IDEyODsKKworICAgICpiID0gMTE5MiAqIHkgKyAyMDY2ICogdTsKKyAgICAqZyA9IDExOTIgKiB5IC0gODMzICogdiAtIDQwMCAqIHU7CisgICAgKnIgPSAxMTkyICogeSArIDE2MzQgKiB2OworCisgICAgKnIgPSBtaW4oMjYyMTQzLCBtYXgoMCwgKnIpKTsKKyAgICAqZyA9IG1pbigyNjIxNDMsIG1heCgwLCAqZykpOworICAgICpiID0gbWluKDI2MjE0MywgbWF4KDAsICpiKSk7CisKKyAgICAqciA+Pj0gMTA7CisgICAgKmcgPj49IDEwOworICAgICpiID4+PSAxMDsKK30KKwordm9pZCBjb252ZXJ0WVVWNDIwc3BUb0FSR0IoCisgICAgICAgIHVpbnQ4X3QgKnBZLCB1aW50OF90ICpwVVYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICB1aW50OF90ICpkZXN0KSB7CisgICAgY29uc3QgaW50MzJfdCBieXRlc19wZXJfcGl4ZWwgPSAyOworCisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICAgICAgaW50MzJfdCB5ID0gKihwWSArIGkgKiB3aWR0aCArIGopOworICAgICAgICAgICAgaW50MzJfdCB1ID0gKihwVVYgKyAoaS8yKSAqIHdpZHRoICsgYnl0ZXNfcGVyX3BpeGVsICogKGovMikpOworICAgICAgICAgICAgaW50MzJfdCB2ID0gKihwVVYgKyAoaS8yKSAqIHdpZHRoICsgYnl0ZXNfcGVyX3BpeGVsICogKGovMikgKyAxKTsKKworICAgICAgICAgICAgaW50MzJfdCByLCBnLCBiOworICAgICAgICAgICAgWVVWVG9SR0IoeSwgdSwgdiwgJnIsICZnLCAmYik7CisKKyAgICAgICAgICAgICpkZXN0KysgPSAweEZGOworICAgICAgICAgICAgKmRlc3QrKyA9IHI7CisgICAgICAgICAgICAqZGVzdCsrID0gZzsKKyAgICAgICAgICAgICpkZXN0KysgPSBiOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGNvbnZlcnRZVVY0MjBzcFRvUkdCODg4KAorICAgICAgICB1aW50OF90ICpwWSwgdWludDhfdCAqcFVWLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgdWludDhfdCAqZGVzdCkgeworICAgIGNvbnN0IGludDMyX3QgYnl0ZXNfcGVyX3BpeGVsID0gMjsKKworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IHdpZHRoOyBqKyspIHsKKyAgICAgICAgICAgIGludDMyX3QgeSA9ICoocFkgKyBpICogd2lkdGggKyBqKTsKKyAgICAgICAgICAgIGludDMyX3QgdSA9ICoocFVWICsgKGkvMikgKiB3aWR0aCArIGJ5dGVzX3Blcl9waXhlbCAqIChqLzIpKTsKKyAgICAgICAgICAgIGludDMyX3QgdiA9ICoocFVWICsgKGkvMikgKiB3aWR0aCArIGJ5dGVzX3Blcl9waXhlbCAqIChqLzIpICsgMSk7CisKKyAgICAgICAgICAgIGludDMyX3QgciwgZywgYjsKKyAgICAgICAgICAgIFlVVlRvUkdCKHksIHUsIHYsICZyLCAmZywgJmIpOworCisgICAgICAgICAgICAqZGVzdCsrID0gcjsKKyAgICAgICAgICAgICpkZXN0KysgPSBnOworICAgICAgICAgICAgKmRlc3QrKyA9IGI7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIEhBQ0sgLSBub3QgZXZlbiBzbGlnaHRseSBvcHRpbWl6ZWQKKy8vIFRPRE86IHJlbW92ZSB3aGVuIFJHQkEgc3VwcG9ydCBpcyBhZGRlZCB0byBTb2Z0d2FyZVJlbmRlcmVyCit2b2lkIGNvbnZlcnRSR0JBVG9BUkdCKAorICAgICAgICB1aW50OF90ICpzcmMsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBzdHJpZGUsCisgICAgICAgIHVpbnQ4X3QgKmRlc3QpIHsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgeworICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCB3aWR0aDsgKytqKSB7CisgICAgICAgICAgICB1aW50OF90IHIgPSAqc3JjKys7CisgICAgICAgICAgICB1aW50OF90IGcgPSAqc3JjKys7CisgICAgICAgICAgICB1aW50OF90IGIgPSAqc3JjKys7CisgICAgICAgICAgICB1aW50OF90IGEgPSAqc3JjKys7CisgICAgICAgICAgICAqZGVzdCsrID0gYTsKKyAgICAgICAgICAgICpkZXN0KysgPSByOworICAgICAgICAgICAgKmRlc3QrKyA9IGc7CisgICAgICAgICAgICAqZGVzdCsrID0gYjsKKyAgICAgICAgfQorICAgICAgICBzcmMgKz0gKHN0cmlkZSAtIHdpZHRoKSAqIDQ7CisgICAgfQorfQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvQ29sb3JDb252ZXJ0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0NvbG9yQ29udmVydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZmFhMDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0NvbG9yQ29udmVydC5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPTE9SX0NPTlZFUlRfSF8KKyNkZWZpbmUgQ09MT1JfQ09OVkVSVF9IXworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIFlVVlRvUkdCKAorICAgICAgICBpbnQzMl90IHksIGludDMyX3QgdSwgaW50MzJfdCB2LAorICAgICAgICBpbnQzMl90KiByLCBpbnQzMl90KiBnLCBpbnQzMl90KiBiKTsKKwordm9pZCBjb252ZXJ0WVVWNDIwc3BUb0FSR0IoCisgICAgICAgIHVpbnQ4X3QgKnBZLCB1aW50OF90ICpwVVYsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAorICAgICAgICB1aW50OF90ICpkZXN0KTsKKwordm9pZCBjb252ZXJ0WVVWNDIwc3BUb1JHQjg4OCgKKyAgICAgICAgdWludDhfdCAqcFksIHVpbnQ4X3QgKnBVViwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgIHVpbnQ4X3QgKmRlc3QpOworCisvLyBUT0RPOiByZW1vdmUgd2hlbiBSR0JBIHN1cHBvcnQgaXMgYWRkZWQgdG8gU29mdHdhcmVSZW5kZXJlcgordm9pZCBjb252ZXJ0UkdCQVRvQVJHQigKKyAgICAgICAgdWludDhfdCAqc3JjLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgdWludDMyX3Qgc3RyaWRlLAorICAgICAgICB1aW50OF90ICpkZXN0KTsKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09MT1JfQ09OVkVSVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9HcmFwaGljQnVmZmVyTGlzdGVuZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9HcmFwaGljQnVmZmVyTGlzdGVuZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MDYzMTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0dyYXBoaWNCdWZmZXJMaXN0ZW5lci5jcHAKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkdyYXBoaWNCdWZmZXJMaXN0ZW5lciIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisKKyNpbmNsdWRlIDxndWkvQnVmZmVySXRlbS5oPgorCisjaW5jbHVkZSAiR3JhcGhpY0J1ZmZlckxpc3RlbmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdHVzX3QgR3JhcGhpY0J1ZmZlckxpc3RlbmVyOjppbml0KAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgc2l6ZV90IGJ1ZmZlcldpZHRoLCBzaXplX3QgYnVmZmVySGVpZ2h0LCBzaXplX3QgYnVmZmVyQ291bnQpIHsKKyAgICBtTm90aWZ5ID0gbm90aWZ5OworCisgICAgU3RyaW5nOCBuYW1lKCJHcmFwaGljQnVmZmVyTGlzdGVuZXIiKTsKKyAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJm1Qcm9kdWNlciwgJm1Db25zdW1lcik7CisgICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lck5hbWUobmFtZSk7CisgICAgbUNvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyU2l6ZShidWZmZXJXaWR0aCwgYnVmZmVySGVpZ2h0KTsKKyAgICBtQ29uc3VtZXItPnNldENvbnN1bWVyVXNhZ2VCaXRzKEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTik7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ29uc3VtZXItPnNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQoYnVmZmVyQ291bnQpOworICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgQlEgbWF4IGFjcXVpcmVkIGJ1ZmZlciBjb3VudCB0byAlenU6ICVkIiwKKyAgICAgICAgICAgICAgICBidWZmZXJDb3VudCwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICB3cDxCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lcj4gbGlzdGVuZXIgPQorICAgICAgICBzdGF0aWNfY2FzdDxCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lcio+KHRoaXMpOworICAgIHNwPEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXI+IHByb3h5ID0KKyAgICAgICAgbmV3IEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgZXJyID0gbUNvbnN1bWVyLT5jb25zdW1lckNvbm5lY3QocHJveHksIGZhbHNlKTsKKyAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBjb25uZWN0aW5nIHRvIEJ1ZmZlclF1ZXVlOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBBTE9HVigiaW5pdCgpIHN1Y2Nlc3NmdWwuIik7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgR3JhcGhpY0J1ZmZlckxpc3RlbmVyOjpvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIC8qIGl0ZW0gKi8pIHsKKyAgICBBTE9HVigib25GcmFtZUF2YWlsYWJsZSgpIGNhbGxlZCIpOworCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKKyAgICAgICAgbU51bUZyYW1lc0F2YWlsYWJsZSsrOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBtTm90aWZ5LT5zZXRXaGF0KGtXaGF0RnJhbWVBdmFpbGFibGUpOworICAgIG1Ob3RpZnktPnBvc3QoKTsKK30KKwordm9pZCBHcmFwaGljQnVmZmVyTGlzdGVuZXI6Om9uQnVmZmVyc1JlbGVhc2VkKCkgeworICAgIEFMT0dWKCJvbkJ1ZmZlcnNSZWxlYXNlZCgpIGNhbGxlZCIpOworICAgIC8vIG5vdGhpbmcgdG8gZG8KK30KKwordm9pZCBHcmFwaGljQnVmZmVyTGlzdGVuZXI6Om9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCkgeworICAgIEFMT0dXKCJHcmFwaGljQnVmZmVyTGlzdGVuZXIgY2Fubm90IGNvbnN1bWUgc2lkZWJhbmQgc3RyZWFtcy4iKTsKKyAgICAvLyBub3RoaW5nIHRvIGRvCit9CisKK0J1ZmZlckl0ZW0gR3JhcGhpY0J1ZmZlckxpc3RlbmVyOjpnZXRCdWZmZXJJdGVtKCkgeworICAgIEJ1ZmZlckl0ZW0gaXRlbTsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CisgICAgICAgIGlmIChtTnVtRnJhbWVzQXZhaWxhYmxlIDw9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJnZXRCdWZmZXIoKSBjYWxsZWQgd2l0aCBubyBmcmFtZXMgYXZhaWxhYmxlIik7CisgICAgICAgICAgICByZXR1cm4gaXRlbTsKKyAgICAgICAgfQorICAgICAgICBtTnVtRnJhbWVzQXZhaWxhYmxlLS07CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gbUNvbnN1bWVyLT5hY3F1aXJlQnVmZmVyKCZpdGVtLCAwKTsKKyAgICBpZiAoZXJyID09IEJ1ZmZlclF1ZXVlOjpOT19CVUZGRVJfQVZBSUxBQkxFKSB7CisgICAgICAgIC8vIHNob3VsZG4ndCBoYXBwZW4sIHNpbmNlIHdlIHRyYWNrIG51bSBmcmFtZXMgYXZhaWxhYmxlCisgICAgICAgIEFMT0dFKCJmcmFtZSB3YXMgbm90IGF2YWlsYWJsZSIpOworICAgICAgICBpdGVtLm1CdWYgPSAtMTsKKyAgICAgICAgcmV0dXJuIGl0ZW07CisgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImFjcXVpcmVCdWZmZXIgcmV0dXJuZWQgZXJyPSVkIiwgZXJyKTsKKyAgICAgICAgaXRlbS5tQnVmID0gLTE7CisgICAgICAgIHJldHVybiBpdGVtOworICAgIH0KKworICAgIC8vIFdhaXQgZm9yIGl0IHRvIGJlY29tZSBhdmFpbGFibGUuCisgICAgZXJyID0gaXRlbS5tRmVuY2UtPndhaXRGb3JldmVyKCJHcmFwaGljQnVmZmVyTGlzdGVuZXI6OmdldEJ1ZmZlckl0ZW0iKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gd2FpdCBmb3IgYnVmZmVyIGZlbmNlOiAlZCIsIGVycik7CisgICAgICAgIC8vIGtlZXAgZ29pbmcKKyAgICB9CisKKyAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3JlIHNlZWluZyB0aGlzIGJ1ZmZlciwgYWRkIGl0IHRvIG91cgorICAgIC8vIHNsb3QgdGFibGUuCisgICAgaWYgKGl0ZW0ubUdyYXBoaWNCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICBBTE9HVigic2V0dGluZyBtQnVmZmVyU2xvdCAlZCIsIGl0ZW0ubUJ1Zik7CisgICAgICAgIG1CdWZmZXJTbG90W2l0ZW0ubUJ1Zl0gPSBpdGVtLm1HcmFwaGljQnVmZmVyOworICAgIH0KKworICAgIHJldHVybiBpdGVtOworfQorCitzcDxHcmFwaGljQnVmZmVyPiBHcmFwaGljQnVmZmVyTGlzdGVuZXI6OmdldEJ1ZmZlcihCdWZmZXJJdGVtIGl0ZW0pIHsKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBidWY7CisgICAgaWYgKGl0ZW0ubUJ1ZiA8IDAgfHwgaXRlbS5tQnVmID49IEJ1ZmZlclF1ZXVlOjpOVU1fQlVGRkVSX1NMT1RTKSB7CisgICAgICAgIEFMT0dFKCJnZXRCdWZmZXIoKSByZWNlaXZlZCBpbnZhbGlkIEJ1ZmZlckl0ZW06IG1CdWY9PSVkIiwgaXRlbS5tQnVmKTsKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKKyAgICBidWYgPSBtQnVmZmVyU2xvdFtpdGVtLm1CdWZdOworICAgIENIRUNLKGJ1Zi5nZXQoKSAhPSBOVUxMKTsKKworICAgIHJldHVybiBidWY7Cit9CisKK3N0YXR1c190IEdyYXBoaWNCdWZmZXJMaXN0ZW5lcjo6cmVsZWFzZUJ1ZmZlcihCdWZmZXJJdGVtIGl0ZW0pIHsKKyAgICBpZiAoaXRlbS5tQnVmIDwgMCB8fCBpdGVtLm1CdWYgPj0gQnVmZmVyUXVldWU6Ok5VTV9CVUZGRVJfU0xPVFMpIHsKKyAgICAgICAgQUxPR0UoImdldEJ1ZmZlcigpIHJlY2VpdmVkIGludmFsaWQgQnVmZmVySXRlbTogbUJ1Zj09JWQiLCBpdGVtLm1CdWYpOworICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOworICAgIH0KKworICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcihpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLAorICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksIEVHTF9OT19TWU5DX0tIUiwgRmVuY2U6Ok5PX0ZFTkNFKTsKKworICAgIHJldHVybiBPSzsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0dyYXBoaWNCdWZmZXJMaXN0ZW5lci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9HcmFwaGljQnVmZmVyTGlzdGVuZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODZiZjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9HcmFwaGljQnVmZmVyTGlzdGVuZXIuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBHUkFQSElDX0JVRkZFUl9MSVNURU5FUl9IXworI2RlZmluZSBHUkFQSElDX0JVRkZFUl9MSVNURU5FUl9IXworCisjaW5jbHVkZSA8Z3VpL0J1ZmZlclF1ZXVlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFNZXNzYWdlOworCitzdHJ1Y3QgR3JhcGhpY0J1ZmZlckxpc3RlbmVyIDogcHVibGljIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIHsKK3B1YmxpYzoKKyAgICBHcmFwaGljQnVmZmVyTGlzdGVuZXIoKSB7fTsKKworICAgIHN0YXR1c190IGluaXQoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgICAgIHNpemVfdCBidWZmZXJXaWR0aCwgc2l6ZV90IGJ1ZmZlckhlaWdodCwgc2l6ZV90IGJ1ZmZlckNvdW50KTsKKworICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pOworICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlcnNSZWxlYXNlZCgpOworICAgIHZpcnR1YWwgdm9pZCBvblNpZGViYW5kU3RyZWFtQ2hhbmdlZCgpOworCisgICAgLy8gUmV0dXJucyB0aGUgaGFuZGxlIHRvIHRoZSBwcm9kdWNlciBzaWRlIG9mIHRoZSBCdWZmZXJRdWV1ZS4gIEJ1ZmZlcnMKKyAgICAvLyBxdWV1ZWQgb24gdGhpcyB3aWxsIGJlIHJlY2VpdmVkIGJ5IEdyYXBoaWNCdWZmZXJMaXN0ZW5lci4KKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVByb2R1Y2VyOworICAgIH0KKworICAgIEJ1ZmZlckl0ZW0gZ2V0QnVmZmVySXRlbSgpOworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdldEJ1ZmZlcihCdWZmZXJJdGVtIGl0ZW0pOworICAgIHN0YXR1c190IHJlbGVhc2VCdWZmZXIoQnVmZmVySXRlbSBpdGVtKTsKKworICAgIGVudW0geworICAgICAgICBrV2hhdEZyYW1lQXZhaWxhYmxlID0gJ2ZyYXYnLAorICAgIH07CisKK3ByaXZhdGU6CisgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7CisgICAgc2l6ZV90IG1OdW1GcmFtZXNBdmFpbGFibGU7CisKKyAgICBtdXRhYmxlIE11dGV4IG1NdXRleDsKKworICAgIC8vIE91ciBCdWZmZXJRdWV1ZSBpbnRlcmZhY2VzLiBtUHJvZHVjZXIgaXMgcGFzc2VkIHRvIHRoZSBwcm9kdWNlciB0aHJvdWdoCisgICAgLy8gZ2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlciwgYW5kIG1Db25zdW1lciBpcyB1c2VkIGludGVybmFsbHkgdG8gcmV0cmlldmUKKyAgICAvLyB0aGUgYnVmZmVycyBxdWV1ZWQgYnkgdGhlIHByb2R1Y2VyLgorICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1Qcm9kdWNlcjsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBtQ29uc3VtZXI7CisKKyAgICAvLyBDYWNoZSBvZiBHcmFwaGljQnVmZmVycyBmcm9tIHRoZSBidWZmZXIgcXVldWUuCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbUJ1ZmZlclNsb3RbQnVmZmVyUXVldWU6Ok5VTV9CVUZGRVJfU0xPVFNdOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gR1JBUEhJQ19CVUZGRVJfTElTVEVORVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9JbnRyaW5zaWNCbHVyRmlsdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvSW50cmluc2ljQmx1ckZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JjZjY5OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvSW50cmluc2ljQmx1ckZpbHRlci5jcHAKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSW50cmluc2ljQmx1ckZpbHRlciIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlICJJbnRyaW5zaWNCbHVyRmlsdGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdHVzX3QgSW50cmluc2ljQmx1ckZpbHRlcjo6Y29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3RhdHVzX3QgZXJyID0gU2ltcGxlRmlsdGVyOjpjb25maWd1cmUobXNnKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKCFtc2ctPmZpbmRTdHJpbmcoImNhY2hlRGlyIiwgJm1DYWNoZURpcikpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmaW5kIGNhY2hlIGRpcmVjdG9yeSBpbiBjb25maWcgbWVzc2FnZS4iKTsKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSW50cmluc2ljQmx1ckZpbHRlcjo6c3RhcnQoKSB7CisgICAgLy8gVE9ETzogdXNlIGEgc2luZ2xlIFJTIGNvbnRleHQgb2JqZWN0IGZvciBlbnRpcmUgYXBwbGljYXRpb24KKyAgICBtUlMgPSBuZXcgUlNDOjpSUygpOworCisgICAgaWYgKCFtUlMtPmluaXQobUNhY2hlRGlyLmNfc3RyKCkpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBSZW5kZXJTY3JpcHQgY29udGV4dC4iKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgLy8gMzItYml0IGVsZW1lbnRzIGZvciBBUkdCODg4OAorICAgIFJTQzo6c3A8Y29uc3QgUlNDOjpFbGVtZW50PiBlID0gUlNDOjpFbGVtZW50OjpVOF80KG1SUyk7CisKKyAgICBSU0M6OlR5cGU6OkJ1aWxkZXIgdGIobVJTLCBlKTsKKyAgICB0Yi5zZXRYKG1XaWR0aCk7CisgICAgdGIuc2V0WShtSGVpZ2h0KTsKKyAgICBSU0M6OnNwPGNvbnN0IFJTQzo6VHlwZT4gdCA9IHRiLmNyZWF0ZSgpOworCisgICAgbUFsbG9jSW4gPSBSU0M6OkFsbG9jYXRpb246OmNyZWF0ZVR5cGVkKG1SUywgdCk7CisgICAgbUFsbG9jT3V0ID0gUlNDOjpBbGxvY2F0aW9uOjpjcmVhdGVUeXBlZChtUlMsIHQpOworCisgICAgbUJsdXIgPSBSU0M6OlNjcmlwdEludHJpbnNpY0JsdXI6OmNyZWF0ZShtUlMsIGUpOworICAgIG1CbHVyLT5zZXRSYWRpdXMobUJsdXJSYWRpdXMpOworICAgIG1CbHVyLT5zZXRJbnB1dChtQWxsb2NJbik7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgSW50cmluc2ljQmx1ckZpbHRlcjo6cmVzZXQoKSB7CisgICAgbUJsdXIuY2xlYXIoKTsKKyAgICBtQWxsb2NPdXQuY2xlYXIoKTsKKyAgICBtQWxsb2NJbi5jbGVhcigpOworICAgIG1SUy5jbGVhcigpOworfQorCitzdGF0dXNfdCBJbnRyaW5zaWNCbHVyRmlsdGVyOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3A8QU1lc3NhZ2U+IHBhcmFtczsKKyAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJwYXJhbXMiLCAmcGFyYW1zKSk7CisKKyAgICBmbG9hdCBibHVyUmFkaXVzOworICAgIGlmIChwYXJhbXMtPmZpbmRGbG9hdCgiYmx1ci1yYWRpdXMiLCAmYmx1clJhZGl1cykpIHsKKyAgICAgICAgbUJsdXJSYWRpdXMgPSBibHVyUmFkaXVzOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSW50cmluc2ljQmx1ckZpbHRlcjo6cHJvY2Vzc0J1ZmZlcnMoCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZzcmNCdWZmZXIsIGNvbnN0IHNwPEFCdWZmZXI+ICZvdXRCdWZmZXIpIHsKKyAgICBtQWxsb2NJbi0+Y29weTFEUmFuZ2VGcm9tKDAsIG1XaWR0aCAqIG1IZWlnaHQsIHNyY0J1ZmZlci0+ZGF0YSgpKTsKKyAgICBtQmx1ci0+Zm9yRWFjaChtQWxsb2NPdXQpOworICAgIG1BbGxvY091dC0+Y29weTFEUmFuZ2VUbygwLCBtV2lkdGggKiBtSGVpZ2h0LCBvdXRCdWZmZXItPmRhdGEoKSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9JbnRyaW5zaWNCbHVyRmlsdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0ludHJpbnNpY0JsdXJGaWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzA3YWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9JbnRyaW5zaWNCbHVyRmlsdGVyLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSU5UUklOU0lDX0JMVVJfRklMVEVSX0hfCisjZGVmaW5lIElOVFJJTlNJQ19CTFVSX0ZJTFRFUl9IXworCisjaW5jbHVkZSAiUmVuZGVyU2NyaXB0LmgiCisjaW5jbHVkZSAiU2ltcGxlRmlsdGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEludHJpbnNpY0JsdXJGaWx0ZXIgOiBwdWJsaWMgU2ltcGxlRmlsdGVyIHsKK3B1YmxpYzoKKyAgICBJbnRyaW5zaWNCbHVyRmlsdGVyKCkgOiBtQmx1clJhZGl1cygxLmYpIHt9OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc0J1ZmZlcnMoCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmc3JjQnVmZmVyLCBjb25zdCBzcDxBQnVmZmVyPiAmb3V0QnVmZmVyKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkludHJpbnNpY0JsdXJGaWx0ZXIoKSB7fTsKKworcHJpdmF0ZToKKyAgICBBU3RyaW5nIG1DYWNoZURpcjsKKyAgICBSU0M6OnNwPFJTQzo6UlM+IG1SUzsKKyAgICBSU0M6OnNwPFJTQzo6QWxsb2NhdGlvbj4gbUFsbG9jSW47CisgICAgUlNDOjpzcDxSU0M6OkFsbG9jYXRpb24+IG1BbGxvY091dDsKKyAgICBSU0M6OnNwPFJTQzo6U2NyaXB0SW50cmluc2ljQmx1cj4gbUJsdXI7CisgICAgZmxvYXQgbUJsdXJSYWRpdXM7Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBJTlRSSU5TSUNfQkxVUl9GSUxURVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvTWVkaWFGaWx0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9NZWRpYUZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNmNmIwNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvTWVkaWFGaWx0ZXIuY3BwCkBAIC0wLDAgKzEsODIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYUZpbHRlciIKKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0J1ZmZlclByb2R1Y2VyV3JhcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUZpbHRlci5oPgorCisjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW0uaD4KKworI2luY2x1ZGUgIkNvbG9yQ29udmVydC5oIgorI2luY2x1ZGUgIkdyYXBoaWNCdWZmZXJMaXN0ZW5lci5oIgorI2luY2x1ZGUgIkludHJpbnNpY0JsdXJGaWx0ZXIuaCIKKyNpbmNsdWRlICJSU0ZpbHRlci5oIgorI2luY2x1ZGUgIlNhdHVyYXRpb25GaWx0ZXIuaCIKKyNpbmNsdWRlICJaZXJvRmlsdGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gcGFyYW1ldGVyOiBudW1iZXIgb2YgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtCdWZmZXJDb3VudEFjdHVhbCA9IDQ7CisKK01lZGlhRmlsdGVyOjpNZWRpYUZpbHRlcigpCisgICAgOiBtU3RhdGUoVU5JTklUSUFMSVpFRCksCisgICAgICBtR2VuZXJhdGlvbigwKSwKKyAgICAgIG1HcmFwaGljQnVmZmVyTGlzdGVuZXIoTlVMTCkgeworfQorCitNZWRpYUZpbHRlcjo6fk1lZGlhRmlsdGVyKCkgeworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLyBQVUJMSUMgRlVOQ1RJT05TIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE1lZGlhRmlsdGVyOjpzZXROb3RpZmljYXRpb25NZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgbU5vdGlmeSA9IG1zZzsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6aW5pdGlhdGVBbGxvY2F0ZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIG1zZy0+c2V0V2hhdChrV2hhdEFsbG9jYXRlQ29tcG9uZW50KTsKKyAgICBtc2ctPnNldFRhcmdldCh0aGlzKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6aW5pdGlhdGVDb25maWd1cmVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBtc2ctPnNldFdoYXQoa1doYXRDb25maWd1cmVDb21wb25lbnQpOworICAgIG1zZy0+c2V0VGFyZ2V0KHRoaXMpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjppbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6aW5pdGlhdGVTZXRJbnB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiAmIC8qIHN1cmZhY2UgKi8pIHsKKyAgICBBTE9HVygiaW5pdGlhdGVTZXRJbnB1dFN1cmZhY2UoKSB1bnN1cHBvcnRlZCIpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjppbml0aWF0ZVN0YXJ0KCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6OmluaXRpYXRlU2h1dGRvd24oYm9vbCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNodXRkb3duLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDMyKCJrZWVwQ29tcG9uZW50QWxsb2NhdGVkIiwga2VlcENvbXBvbmVudEFsbG9jYXRlZCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6OnNpZ25hbEZsdXNoKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRGbHVzaCwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6OnNpZ25hbFJlc3VtZSgpIHsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVzdW1lLCB0aGlzKSktPnBvc3QoKTsKK30KKworLy8gbm90aGluZyB0byBkbwordm9pZCBNZWRpYUZpbHRlcjo6c2lnbmFsUmVxdWVzdElEUkZyYW1lKCkgeworICAgIHJldHVybjsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6c2lnbmFsU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcykgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRQYXJhbWV0ZXJzLCB0aGlzKTsKKyAgICBtc2ctPnNldE1lc3NhZ2UoInBhcmFtcyIsIHBhcmFtcyk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6OnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFNpZ25hbEVuZE9mSW5wdXRTdHJlYW0sIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdEFsbG9jYXRlQ29tcG9uZW50OgorICAgICAgICB7CisgICAgICAgICAgICBvbkFsbG9jYXRlQ29tcG9uZW50KG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0Q29uZmlndXJlQ29tcG9uZW50OgorICAgICAgICB7CisgICAgICAgICAgICBvbkNvbmZpZ3VyZUNvbXBvbmVudChtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFN0YXJ0OgorICAgICAgICB7CisgICAgICAgICAgICBvblN0YXJ0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0UHJvY2Vzc0J1ZmZlcnM6CisgICAgICAgIHsKKyAgICAgICAgICAgIHByb2Nlc3NCdWZmZXJzKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0SW5wdXRCdWZmZXJGaWxsZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uSW5wdXRCdWZmZXJGaWxsZWQobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRPdXRwdXRCdWZmZXJEcmFpbmVkOgorICAgICAgICB7CisgICAgICAgICAgICBvbk91dHB1dEJ1ZmZlckRyYWluZWQobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTaHV0ZG93bjoKKyAgICAgICAgeworICAgICAgICAgICAgb25TaHV0ZG93bihtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdEZsdXNoOgorICAgICAgICB7CisgICAgICAgICAgICBvbkZsdXNoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0UmVzdW1lOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0U2V0UGFyYW1ldGVyczoKKyAgICAgICAgeworICAgICAgICAgICAgb25TZXRQYXJhbWV0ZXJzKG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlOgorICAgICAgICB7CisgICAgICAgICAgICBvbkNyZWF0ZUlucHV0U3VyZmFjZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBHcmFwaGljQnVmZmVyTGlzdGVuZXI6OmtXaGF0RnJhbWVBdmFpbGFibGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uSW5wdXRGcmFtZUF2YWlsYWJsZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFNpZ25hbEVuZE9mSW5wdXRTdHJlYW06CisgICAgICAgIHsKKyAgICAgICAgICAgIG9uU2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgQUxPR0UoIk1lc3NhZ2Ugbm90IGhhbmRsZWQ6XG4lcyIsIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLyBQT1JUIERFU0NSSVBUSU9OIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitNZWRpYUZpbHRlcjo6UG9ydERlc2NyaXB0aW9uOjpQb3J0RGVzY3JpcHRpb24oKSB7Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6OlBvcnREZXNjcmlwdGlvbjo6YWRkQnVmZmVyKAorICAgICAgICBJT01YOjpidWZmZXJfaWQgaWQsIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBtQnVmZmVySURzLnB1c2hfYmFjayhpZCk7CisgICAgbUJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7Cit9CisKK3NpemVfdCBNZWRpYUZpbHRlcjo6UG9ydERlc2NyaXB0aW9uOjpjb3VudEJ1ZmZlcnMoKSB7CisgICAgcmV0dXJuIG1CdWZmZXJJRHMuc2l6ZSgpOworfQorCitJT01YOjpidWZmZXJfaWQgTWVkaWFGaWx0ZXI6OlBvcnREZXNjcmlwdGlvbjo6YnVmZmVySURBdChzaXplX3QgaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUJ1ZmZlcklEcy5pdGVtQXQoaW5kZXgpOworfQorCitzcDxBQnVmZmVyPiBNZWRpYUZpbHRlcjo6UG9ydERlc2NyaXB0aW9uOjpidWZmZXJBdChzaXplX3QgaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUJ1ZmZlcnMuaXRlbUF0KGluZGV4KTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8gSEVMUEVSIEZVTkNUSU9OUyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordm9pZCBNZWRpYUZpbHRlcjo6c2lnbmFsUHJvY2Vzc0J1ZmZlcnMoKSB7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFByb2Nlc3NCdWZmZXJzLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6c2lnbmFsRXJyb3Ioc3RhdHVzX3QgZXJyb3IpIHsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRFcnJvcik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiZXJyIiwgZXJyb3IpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCitzdGF0dXNfdCBNZWRpYUZpbHRlcjo6YWxsb2NhdGVCdWZmZXJzT25Qb3J0KE9NWF9VMzIgcG9ydEluZGV4KSB7CisgICAgQ0hFQ0socG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCB8fCBwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCk7CisgICAgY29uc3QgYm9vbCBpc0lucHV0ID0gcG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dDsKKyAgICBjb25zdCBzaXplX3QgYnVmZmVyU2l6ZSA9IGlzSW5wdXQgPyBtTWF4SW5wdXRTaXplIDogbU1heE91dHB1dFNpemU7CisKKyAgICBDSEVDSyhtRGVhbGVyW3BvcnRJbmRleF0gPT0gTlVMTCk7CisgICAgQ0hFQ0sobUJ1ZmZlcnNbcG9ydEluZGV4XS5pc0VtcHR5KCkpOworCisgICAgQUxPR1YoIkFsbG9jYXRpbmcgJXp1IGJ1ZmZlcnMgb2Ygc2l6ZSAlenUgb24gJXMgcG9ydCIsCisgICAgICAgICAgICBrQnVmZmVyQ291bnRBY3R1YWwsIGJ1ZmZlclNpemUsCisgICAgICAgICAgICBpc0lucHV0ID8gImlucHV0IiA6ICJvdXRwdXQiKTsKKworICAgIHNpemVfdCB0b3RhbFNpemUgPSBrQnVmZmVyQ291bnRBY3R1YWwgKiBidWZmZXJTaXplOworCisgICAgbURlYWxlcltwb3J0SW5kZXhdID0gbmV3IE1lbW9yeURlYWxlcih0b3RhbFNpemUsICJNZWRpYUZpbHRlciIpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrQnVmZmVyQ291bnRBY3R1YWw7ICsraSkgeworICAgICAgICBzcDxJTWVtb3J5PiBtZW0gPSBtRGVhbGVyW3BvcnRJbmRleF0tPmFsbG9jYXRlKGJ1ZmZlclNpemUpOworICAgICAgICBDSEVDSyhtZW0uZ2V0KCkgIT0gTlVMTCk7CisKKyAgICAgICAgQnVmZmVySW5mbyBpbmZvOworICAgICAgICBpbmZvLm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKKyAgICAgICAgaW5mby5tQnVmZmVySUQgPSBpOworICAgICAgICBpbmZvLm1HZW5lcmF0aW9uID0gbUdlbmVyYXRpb247CisgICAgICAgIGluZm8ubU91dHB1dEZsYWdzID0gMDsKKyAgICAgICAgaW5mby5tRGF0YSA9IG5ldyBBQnVmZmVyKG1lbS0+cG9pbnRlcigpLCBidWZmZXJTaXplKTsKKyAgICAgICAgaW5mby5tRGF0YS0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisKKyAgICAgICAgbUJ1ZmZlcnNbcG9ydEluZGV4XS5wdXNoX2JhY2soaW5mbyk7CisKKyAgICAgICAgaWYgKCFpc0lucHV0KSB7CisgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0QnVmZmVycy5wdXNoKAorICAgICAgICAgICAgICAgICAgICAmbUJ1ZmZlcnNbcG9ydEluZGV4XS5lZGl0SXRlbUF0KGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdEJ1ZmZlcnNBbGxvY2F0ZWQpOworCisgICAgbm90aWZ5LT5zZXRJbnQzMigicG9ydEluZGV4IiwgcG9ydEluZGV4KTsKKworICAgIHNwPFBvcnREZXNjcmlwdGlvbj4gZGVzYyA9IG5ldyBQb3J0RGVzY3JpcHRpb247CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzW3BvcnRJbmRleF0uc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgQnVmZmVySW5mbyAmaW5mbyA9IG1CdWZmZXJzW3BvcnRJbmRleF1baV07CisKKyAgICAgICAgZGVzYy0+YWRkQnVmZmVyKGluZm8ubUJ1ZmZlcklELCBpbmZvLm1EYXRhKTsKKyAgICB9CisKKyAgICBub3RpZnktPnNldE9iamVjdCgicG9ydERlc2MiLCBkZXNjKTsKKyAgICBub3RpZnktPnBvc3QoKTsKKworICAgIHJldHVybiBPSzsKK30KKworTWVkaWFGaWx0ZXI6OkJ1ZmZlckluZm8qIE1lZGlhRmlsdGVyOjpmaW5kQnVmZmVyQnlJRCgKKyAgICAgICAgdWludDMyX3QgcG9ydEluZGV4LCBJT01YOjpidWZmZXJfaWQgYnVmZmVySUQsCisgICAgICAgIHNzaXplX3QgKmluZGV4KSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVyc1twb3J0SW5kZXhdLnNpemUoKTsgKytpKSB7CisgICAgICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmbUJ1ZmZlcnNbcG9ydEluZGV4XS5lZGl0SXRlbUF0KGkpOworCisgICAgICAgIGlmIChpbmZvLT5tQnVmZmVySUQgPT0gYnVmZmVySUQpIHsKKyAgICAgICAgICAgIGlmIChpbmRleCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKmluZGV4ID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpbmZvOworICAgICAgICB9CisgICAgfQorCisgICAgVFJFU1BBU1MoKTsKKworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpwb3N0RmlsbFRoaXNCdWZmZXIoQnVmZmVySW5mbyAqaW5mbykgeworICAgIEFMT0dWKCJwb3N0RmlsbFRoaXNCdWZmZXIgb24gYnVmZmVyICVkIiwgaW5mby0+bUJ1ZmZlcklEKTsKKyAgICBpZiAobVBvcnRFT1Nba1BvcnRJbmRleElucHV0XSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ0hFQ0tfRVEoKGludClpbmZvLT5tU3RhdHVzLCAoaW50KUJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTKTsKKworICAgIGluZm8tPm1HZW5lcmF0aW9uID0gbUdlbmVyYXRpb247CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRGaWxsVGhpc0J1ZmZlcik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiYnVmZmVyLWlkIiwgaW5mby0+bUJ1ZmZlcklEKTsKKworICAgIGluZm8tPm1EYXRhLT5tZXRhKCktPmNsZWFyKCk7CisgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGluZm8tPm1EYXRhKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdElucHV0QnVmZmVyRmlsbGVkLCB0aGlzKTsKKyAgICByZXBseS0+c2V0SW50MzIoImJ1ZmZlci1pZCIsIGluZm8tPm1CdWZmZXJJRCk7CisKKyAgICBub3RpZnktPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOworCisgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VQU1RSRUFNOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpwb3N0RHJhaW5UaGlzQnVmZmVyKEJ1ZmZlckluZm8gKmluZm8pIHsKKyAgICBDSEVDS19FUSgoaW50KWluZm8tPm1TdGF0dXMsIChpbnQpQnVmZmVySW5mbzo6T1dORURfQllfVVMpOworCisgICAgaW5mby0+bUdlbmVyYXRpb24gPSBtR2VuZXJhdGlvbjsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdERyYWluVGhpc0J1ZmZlcik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiYnVmZmVyLWlkIiwgaW5mby0+bUJ1ZmZlcklEKTsKKyAgICBub3RpZnktPnNldEludDMyKCJmbGFncyIsIGluZm8tPm1PdXRwdXRGbGFncyk7CisgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGluZm8tPm1EYXRhKTsKKworICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZShrV2hhdE91dHB1dEJ1ZmZlckRyYWluZWQsIHRoaXMpOworICAgIHJlcGx5LT5zZXRJbnQzMigiYnVmZmVyLWlkIiwgaW5mby0+bUJ1ZmZlcklEKTsKKworICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CisKKyAgICBub3RpZnktPnBvc3QoKTsKKworICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUFNUUkVBTTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6cG9zdEVPUygpIHsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRFT1MpOworICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIEVSUk9SX0VORF9PRl9TVFJFQU0pOworICAgIG5vdGlmeS0+cG9zdCgpOworCisgICAgQUxPR1YoIlNlbnQga1doYXRFT1MuIik7Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6OnNlbmRGb3JtYXRDaGFuZ2UoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworCisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0T3V0cHV0Rm9ybWF0Q2hhbmdlZCk7CisKKyAgICBBU3RyaW5nIG1pbWU7CisgICAgQ0hFQ0sobU91dHB1dEZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7CisgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBtaW1lLmNfc3RyKCkpOworCisgICAgbm90aWZ5LT5zZXRJbnQzMigic3RyaWRlIiwgbVN0cmlkZSk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigic2xpY2UtaGVpZ2h0IiwgbVNsaWNlSGVpZ2h0KTsKKyAgICBub3RpZnktPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBtQ29sb3JGb3JtYXRPdXQpOworICAgIG5vdGlmeS0+c2V0UmVjdCgiY3JvcCIsIDAsIDAsIG1TdHJpZGUgLSAxLCBtU2xpY2VIZWlnaHQgLSAxKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aWR0aCIsIG1XaWR0aCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiaGVpZ2h0IiwgbUhlaWdodCk7CisKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6cmVxdWVzdEZpbGxFbXB0eUlucHV0KCkgeworICAgIGlmIChtUG9ydEVPU1trUG9ydEluZGV4SW5wdXRdKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICZtQnVmZmVyc1trUG9ydEluZGV4SW5wdXRdLmVkaXRJdGVtQXQoaSk7CisKKyAgICAgICAgaWYgKGluZm8tPm1TdGF0dXMgPT0gQnVmZmVySW5mbzo6T1dORURfQllfVVMpIHsKKyAgICAgICAgICAgIHBvc3RGaWxsVGhpc0J1ZmZlcihpbmZvKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNZWRpYUZpbHRlcjo6cHJvY2Vzc0J1ZmZlcnMoKSB7CisgICAgaWYgKG1BdmFpbGFibGVJbnB1dEJ1ZmZlcnMuZW1wdHkoKSB8fCBtQXZhaWxhYmxlT3V0cHV0QnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dWKCJTa2lwcGluZyBwcm9jZXNzIChidWZmZXJzIHVuYXZhaWxhYmxlKSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1Qb3J0RU9TW2tQb3J0SW5kZXhPdXRwdXRdKSB7CisgICAgICAgIC8vIFRPRE8gbm90aWZ5IGNhbGxlciBvZiBxdWV1ZUlucHV0IGVycm9yIHdoZW4gaXQgaXMgc3VwcG9ydGVkCisgICAgICAgIC8vIGluIE1lZGlhQ29kZWMKKyAgICAgICAgQUxPR1coIlRyaWVkIHRvIHByb2Nlc3MgYSBidWZmZXIgYWZ0ZXIgRU9TLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQnVmZmVySW5mbyAqaW5wdXRJbmZvID0gbUF2YWlsYWJsZUlucHV0QnVmZmVyc1swXTsKKyAgICBtQXZhaWxhYmxlSW5wdXRCdWZmZXJzLnJlbW92ZUF0KDApOworICAgIEJ1ZmZlckluZm8gKm91dHB1dEluZm8gPSBtQXZhaWxhYmxlT3V0cHV0QnVmZmVyc1swXTsKKyAgICBtQXZhaWxhYmxlT3V0cHV0QnVmZmVycy5yZW1vdmVBdCgwKTsKKworICAgIHN0YXR1c190IGVycjsKKyAgICBlcnIgPSBtRmlsdGVyLT5wcm9jZXNzQnVmZmVycyhpbnB1dEluZm8tPm1EYXRhLCBvdXRwdXRJbmZvLT5tRGF0YSk7CisgICAgaWYgKGVyciAhPSAoc3RhdHVzX3QpT0spIHsKKyAgICAgICAgb3V0cHV0SW5mby0+bURhdGEtPm1ldGEoKS0+c2V0SW50MzIoImVyciIsIGVycik7CisgICAgfQorCisgICAgaW50NjRfdCB0aW1lVXM7CisgICAgQ0hFQ0soaW5wdXRJbmZvLT5tRGF0YS0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICBvdXRwdXRJbmZvLT5tRGF0YS0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICBvdXRwdXRJbmZvLT5tT3V0cHV0RmxhZ3MgPSAwOworICAgIGludDMyX3QgZW9zID0gMDsKKyAgICBpZiAoaW5wdXRJbmZvLT5tRGF0YS0+bWV0YSgpLT5maW5kSW50MzIoImVvcyIsICZlb3MpICYmIGVvcyAhPSAwKSB7CisgICAgICAgIG91dHB1dEluZm8tPm1PdXRwdXRGbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgIG1Qb3J0RU9TW2tQb3J0SW5kZXhPdXRwdXRdID0gdHJ1ZTsKKyAgICAgICAgb3V0cHV0SW5mby0+bURhdGEtPm1ldGEoKS0+c2V0SW50MzIoImVvcyIsIGVvcyk7CisgICAgICAgIHBvc3RFT1MoKTsKKyAgICAgICAgQUxPR1YoIk91dHB1dCBzdHJlYW0gc2F3IEVPUy4iKTsKKyAgICB9CisKKyAgICBBTE9HVigiUHJvY2Vzc2VkIGlucHV0IGJ1ZmZlciAldSBbJXp1XSwgb3V0cHV0IGJ1ZmZlciAldSBbJXp1XSIsCisgICAgICAgICAgICAgICAgaW5wdXRJbmZvLT5tQnVmZmVySUQsIGlucHV0SW5mby0+bURhdGEtPnNpemUoKSwKKyAgICAgICAgICAgICAgICBvdXRwdXRJbmZvLT5tQnVmZmVySUQsIG91dHB1dEluZm8tPm1EYXRhLT5zaXplKCkpOworCisgICAgaWYgKG1HcmFwaGljQnVmZmVyTGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgaW5wdXRJbmZvOworICAgIH0gZWxzZSB7CisgICAgICAgIHBvc3RGaWxsVGhpc0J1ZmZlcihpbnB1dEluZm8pOworICAgIH0KKyAgICBwb3N0RHJhaW5UaGlzQnVmZmVyKG91dHB1dEluZm8pOworCisgICAgLy8gcHJldmVudCBhbnkgY29ybmVyIGNhc2Ugd2hlcmUgYnVmZmVycyBjb3VsZCBnZXQgc3R1Y2sgaW4gcXVldWUKKyAgICBzaWduYWxQcm9jZXNzQnVmZmVycygpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpvbkFsbG9jYXRlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgQ0hFQ0tfRVEobVN0YXRlLCBVTklOSVRJQUxJWkVEKTsKKworICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygiY29tcG9uZW50TmFtZSIsICZtQ29tcG9uZW50TmFtZSkpOworICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBtQ29tcG9uZW50TmFtZS5jX3N0cigpOworICAgIGlmICghc3RyY2FzZWNtcChuYW1lLCAiYW5kcm9pZC5maWx0ZXIuemVyb2ZpbHRlciIpKSB7CisgICAgICAgIG1GaWx0ZXIgPSBuZXcgWmVyb0ZpbHRlcjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG5hbWUsICJhbmRyb2lkLmZpbHRlci5zYXR1cmF0aW9uIikpIHsKKyAgICAgICAgbUZpbHRlciA9IG5ldyBTYXR1cmF0aW9uRmlsdGVyOworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobmFtZSwgImFuZHJvaWQuZmlsdGVyLmludHJpbnNpY2JsdXIiKSkgeworICAgICAgICBtRmlsdGVyID0gbmV3IEludHJpbnNpY0JsdXJGaWx0ZXI7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChuYW1lLCAiYW5kcm9pZC5maWx0ZXIuUmVuZGVyU2NyaXB0IikpIHsKKyAgICAgICAgbUZpbHRlciA9IG5ldyBSU0ZpbHRlcjsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiVW5yZWNvZ25pemVkIGZpbHRlciBuYW1lOiAlcyIsIG5hbWUpOworICAgICAgICBzaWduYWxFcnJvcihOQU1FX05PVF9GT1VORCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0Q29tcG9uZW50QWxsb2NhdGVkKTsKKyAgICAvLyBIQUNLIC0gbmVlZCAiT01YLmdvb2dsZSIgdG8gdXNlIE1lZGlhQ29kZWMncyBzb2Z0d2FyZSByZW5kZXJlcgorICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJjb21wb25lbnROYW1lIiwgIk9NWC5nb29nbGUuTWVkaWFGaWx0ZXIiKTsKKyAgICBub3RpZnktPnBvc3QoKTsKKyAgICBtU3RhdGUgPSBJTklUSUFMSVpFRDsKKyAgICBBTE9HVigiSGFuZGxlZCBrV2hhdEFsbG9jYXRlQ29tcG9uZW50LiIpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpvbkNvbmZpZ3VyZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIC8vIFRPRE86IGdlbmVyYWxpemUgdG8gYWxsb3cgYXVkaW8gZmlsdGVycyBhcyB3ZWxsIGFzIHZpZGVvCisKKyAgICBDSEVDS19FUShtU3RhdGUsIElOSVRJQUxJWkVEKTsKKworICAgIC8vIGdldCBwYXJhbXMgLSBhdCBsZWFzdCBtaW1lLCB3aWR0aCAmIGhlaWdodAorICAgIEFTdHJpbmcgbWltZTsKKyAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOworICAgIGlmIChzdHJjYXNlY21wKG1pbWUuY19zdHIoKSwgTUVESUFfTUlNRVRZUEVfVklERU9fUkFXKSkgeworICAgICAgICBBTE9HRSgiQmFkIG1pbWU6ICVzIiwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgc2lnbmFsRXJyb3IoQkFEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aWR0aCIsICZtV2lkdGgpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiaGVpZ2h0IiwgJm1IZWlnaHQpKTsKKyAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJzdHJpZGUiLCAmbVN0cmlkZSkpIHsKKyAgICAgICAgbVN0cmlkZSA9IG1XaWR0aDsKKyAgICB9CisgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigic2xpY2UtaGVpZ2h0IiwgJm1TbGljZUhlaWdodCkpIHsKKyAgICAgICAgbVNsaWNlSGVpZ2h0ID0gbUhlaWdodDsKKyAgICB9CisKKyAgICBtTWF4SW5wdXRTaXplID0gbVdpZHRoICogbUhlaWdodCAqIDQ7ICAgLy8gcm9vbSBmb3IgQVJHQjg4ODgKKyAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoIm1heC1pbnB1dC1zaXplIiwgJm1heElucHV0U2l6ZSkKKyAgICAgICAgICAgICYmIChzaXplX3QpbWF4SW5wdXRTaXplID4gbU1heElucHV0U2l6ZSkgeworICAgICAgICBtTWF4SW5wdXRTaXplID0gbWF4SW5wdXRTaXplOworICAgIH0KKworICAgIGlmICghbXNnLT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZtQ29sb3JGb3JtYXRJbikpIHsKKyAgICAgICAgLy8gZGVmYXVsdCB0byBPTVhfQ09MT1JfRm9ybWF0MzJiaXRBUkdCODg4OAorICAgICAgICBtQ29sb3JGb3JtYXRJbiA9IE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEFSR0I4ODg4OworICAgICAgICBtc2ctPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBtQ29sb3JGb3JtYXRJbik7CisgICAgfQorICAgIG1Db2xvckZvcm1hdE91dCA9IG1Db2xvckZvcm1hdEluOworCisgICAgbU1heE91dHB1dFNpemUgPSBtV2lkdGggKiBtSGVpZ2h0ICogNDsgIC8vIHJvb20gZm9yIEFSR0I4ODg4CisKKyAgICBBU3RyaW5nIGNhY2hlRGlyOworICAgIGlmICghbXNnLT5maW5kU3RyaW5nKCJjYWNoZURpciIsICZjYWNoZURpcikpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmaW5kIGNhY2hlIGRpcmVjdG9yeSBpbiBjb25maWcgbWVzc2FnZS4iKTsKKyAgICAgICAgc2lnbmFsRXJyb3IoTkFNRV9OT1RfRk9VTkQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyOworICAgIGVyciA9IG1GaWx0ZXItPmNvbmZpZ3VyZShtc2cpOworICAgIGlmIChlcnIgIT0gKHN0YXR1c190KU9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29uZmlndXJlIGZpbHRlciBjb21wb25lbnQsIGVyciAlZCIsIGVycik7CisgICAgICAgIHNpZ25hbEVycm9yKGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtSW5wdXRGb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBtSW5wdXRGb3JtYXQtPnNldFN0cmluZygibWltZSIsIG1pbWUuY19zdHIoKSk7CisgICAgbUlucHV0Rm9ybWF0LT5zZXRJbnQzMigic3RyaWRlIiwgbVN0cmlkZSk7CisgICAgbUlucHV0Rm9ybWF0LT5zZXRJbnQzMigic2xpY2UtaGVpZ2h0IiwgbVNsaWNlSGVpZ2h0KTsKKyAgICBtSW5wdXRGb3JtYXQtPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBtQ29sb3JGb3JtYXRJbik7CisgICAgbUlucHV0Rm9ybWF0LT5zZXRSZWN0KCJjcm9wIiwgMCwgMCwgbVN0cmlkZSwgbVNsaWNlSGVpZ2h0KTsKKyAgICBtSW5wdXRGb3JtYXQtPnNldEludDMyKCJ3aWR0aCIsIG1XaWR0aCk7CisgICAgbUlucHV0Rm9ybWF0LT5zZXRJbnQzMigiaGVpZ2h0IiwgbUhlaWdodCk7CisKKyAgICBtT3V0cHV0Rm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisgICAgbU91dHB1dEZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgbWltZS5jX3N0cigpKTsKKyAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigic3RyaWRlIiwgbVN0cmlkZSk7CisgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoInNsaWNlLWhlaWdodCIsIG1TbGljZUhlaWdodCk7CisgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIG1Db2xvckZvcm1hdE91dCk7CisgICAgbU91dHB1dEZvcm1hdC0+c2V0UmVjdCgiY3JvcCIsIDAsIDAsIG1TdHJpZGUsIG1TbGljZUhlaWdodCk7CisgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoIndpZHRoIiwgbVdpZHRoKTsKKyAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiaGVpZ2h0IiwgbUhlaWdodCk7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0Q29tcG9uZW50Q29uZmlndXJlZCk7CisgICAgbm90aWZ5LT5zZXRTdHJpbmcoImNvbXBvbmVudE5hbWUiLCAiTWVkaWFGaWx0ZXIiKTsKKyAgICBub3RpZnktPnNldE1lc3NhZ2UoImlucHV0LWZvcm1hdCIsIG1JbnB1dEZvcm1hdCk7CisgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJvdXRwdXQtZm9ybWF0IiwgbU91dHB1dEZvcm1hdCk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgbVN0YXRlID0gQ09ORklHVVJFRDsKKyAgICBBTE9HVigiSGFuZGxlZCBrV2hhdENvbmZpZ3VyZUNvbXBvbmVudC4iKTsKKworICAgIHNlbmRGb3JtYXRDaGFuZ2UoKTsKK30KKwordm9pZCBNZWRpYUZpbHRlcjo6b25TdGFydCgpIHsKKyAgICBDSEVDS19FUShtU3RhdGUsIENPTkZJR1VSRUQpOworCisgICAgYWxsb2NhdGVCdWZmZXJzT25Qb3J0KGtQb3J0SW5kZXhJbnB1dCk7CisKKyAgICBhbGxvY2F0ZUJ1ZmZlcnNPblBvcnQoa1BvcnRJbmRleE91dHB1dCk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtRmlsdGVyLT5zdGFydCgpOworICAgIGlmIChlcnIgIT0gKHN0YXR1c190KU9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc3RhcnQgZmlsdGVyIGNvbXBvbmVudCwgZXJyICVkIiwgZXJyKTsKKyAgICAgICAgc2lnbmFsRXJyb3IoZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1Qb3J0RU9TW2tQb3J0SW5kZXhJbnB1dF0gPSBmYWxzZTsKKyAgICBtUG9ydEVPU1trUG9ydEluZGV4T3V0cHV0XSA9IGZhbHNlOworICAgIG1JbnB1dEVPU1Jlc3VsdCA9IE9LOworICAgIG1TdGF0ZSA9IFNUQVJURUQ7CisKKyAgICByZXF1ZXN0RmlsbEVtcHR5SW5wdXQoKTsKKyAgICBBTE9HVigiSGFuZGxlZCBrV2hhdFN0YXJ0LiIpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpvbklucHV0QnVmZmVyRmlsbGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcklEOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJidWZmZXItaWQiLCAoaW50MzJfdCopJmJ1ZmZlcklEKSk7CisgICAgQnVmZmVySW5mbyAqaW5mbyA9IGZpbmRCdWZmZXJCeUlEKGtQb3J0SW5kZXhJbnB1dCwgYnVmZmVySUQpOworCisgICAgaWYgKG1TdGF0ZSAhPSBTVEFSVEVEKSB7CisgICAgICAgIC8vIHdlJ3JlIG5vdCBydW5uaW5nLCBzbyB3ZSdsbCBqdXN0IGtlZXAgdGhhdCBidWZmZXIuLi4KKyAgICAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGluZm8tPm1HZW5lcmF0aW9uICE9IG1HZW5lcmF0aW9uKSB7CisgICAgICAgIEFMT0dWKCJDYXVnaHQgYSBzdGFsZSBpbnB1dCBidWZmZXIgW0lEICVkXSIsIGJ1ZmZlcklEKTsKKyAgICAgICAgLy8gYnVmZmVyIGlzIHN0YWxlICh0YWtlbiBiZWZvcmUgYSBmbHVzaC9zaHV0ZG93bikgLSByZXBvc3QgaXQKKyAgICAgICAgQ0hFQ0tfRVEoaW5mby0+bVN0YXR1cywgQnVmZmVySW5mbzo6T1dORURfQllfVVMpOworICAgICAgICBwb3N0RmlsbFRoaXNCdWZmZXIoaW5mbyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDSEVDS19FUShpbmZvLT5tU3RhdHVzLCBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUFNUUkVBTSk7CisgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTOworCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgIGludDMyX3QgZXJyID0gT0s7CisgICAgYm9vbCBlb3MgPSBmYWxzZTsKKworICAgIGlmICghbXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKSkgeworICAgICAgICAvLyB0aGVzZSBhcmUgdW5maWxsZWQgYnVmZmVycyByZXR1cm5lZCBieSBjbGllbnQKKyAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKworICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAvLyBidWZmZXJzIHdpdGggbm8gZXJyb3JzIGFyZSByZXR1cm5lZCBvbiBNZWRpYUNvZGVjLmZsdXNoCisgICAgICAgICAgICBBTE9HVigic2F3IHVuZmlsbGVkIGJ1ZmZlciAoTWVkaWFDb2RlYy5mbHVzaCkiKTsKKyAgICAgICAgICAgIHBvc3RGaWxsVGhpc0J1ZmZlcihpbmZvKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJzYXcgZXJyb3IgJWQgaW5zdGVhZCBvZiBhbiBpbnB1dCBidWZmZXIiLCBlcnIpOworICAgICAgICAgICAgZW9zID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlci5jbGVhcigpOworICAgIH0KKworICAgIGludDMyX3QgaXNDU0Q7CisgICAgaWYgKGJ1ZmZlciAhPSBOVUxMICYmIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImNzZCIsICZpc0NTRCkKKyAgICAgICAgICAgICYmIGlzQ1NEICE9IDApIHsKKyAgICAgICAgLy8gaWdub3JlIGNvZGVjLXNwZWNpZmljIGRhdGEgYnVmZmVycworICAgICAgICBBTE9HVygiTWVkaWFGaWx0ZXIgcmVjZWl2ZWQgYSBjb2RlYy1zcGVjaWZpYyBkYXRhIGJ1ZmZlciIpOworICAgICAgICBwb3N0RmlsbFRoaXNCdWZmZXIoaW5mbyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQzMl90IHRtcDsKKyAgICBpZiAoYnVmZmVyICE9IE5VTEwgJiYgYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZW9zIiwgJnRtcCkgJiYgdG1wKSB7CisgICAgICAgIGVvcyA9IHRydWU7CisgICAgICAgIGVyciA9IEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfQorCisgICAgbUF2YWlsYWJsZUlucHV0QnVmZmVycy5wdXNoX2JhY2soaW5mbyk7CisgICAgcHJvY2Vzc0J1ZmZlcnMoKTsKKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVBvcnRFT1Nba1BvcnRJbmRleElucHV0XSA9IHRydWU7CisgICAgICAgIG1JbnB1dEVPU1Jlc3VsdCA9IGVycjsKKyAgICB9CisKKyAgICBBTE9HVigiSGFuZGxlZCBrV2hhdElucHV0QnVmZmVyRmlsbGVkLiBbSUQgJXVdIiwgYnVmZmVySUQpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpvbk91dHB1dEJ1ZmZlckRyYWluZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBJT01YOjpidWZmZXJfaWQgYnVmZmVySUQ7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImJ1ZmZlci1pZCIsIChpbnQzMl90KikmYnVmZmVySUQpKTsKKyAgICBCdWZmZXJJbmZvICppbmZvID0gZmluZEJ1ZmZlckJ5SUQoa1BvcnRJbmRleE91dHB1dCwgYnVmZmVySUQpOworCisgICAgaWYgKG1TdGF0ZSAhPSBTVEFSVEVEKSB7CisgICAgICAgIC8vIHdlJ3JlIG5vdCBydW5uaW5nLCBzbyB3ZSdsbCBqdXN0IGtlZXAgdGhhdCBidWZmZXIuLi4KKyAgICAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGluZm8tPm1HZW5lcmF0aW9uICE9IG1HZW5lcmF0aW9uKSB7CisgICAgICAgIEFMT0dWKCJDYXVnaHQgYSBzdGFsZSBvdXRwdXQgYnVmZmVyIFtJRCAlZF0iLCBidWZmZXJJRCk7CisgICAgICAgIC8vIGJ1ZmZlciBpcyBzdGFsZSAodGFrZW4gYmVmb3JlIGEgZmx1c2gvc2h1dGRvd24pIC0ga2VlcCBpdAorICAgICAgICBDSEVDS19FUShpbmZvLT5tU3RhdHVzLCBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDSEVDS19FUShpbmZvLT5tU3RhdHVzLCBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUFNUUkVBTSk7CisgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTOworCisgICAgbUF2YWlsYWJsZU91dHB1dEJ1ZmZlcnMucHVzaF9iYWNrKGluZm8pOworCisgICAgcHJvY2Vzc0J1ZmZlcnMoKTsKKworICAgIEFMT0dWKCJIYW5kbGVkIGtXaGF0T3V0cHV0QnVmZmVyRHJhaW5lZC4gW0lEICV1XSIsCisgICAgICAgICAgICBidWZmZXJJRCk7Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6Om9uU2h1dGRvd24oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBtR2VuZXJhdGlvbisrOworCisgICAgaWYgKG1TdGF0ZSAhPSBVTklOSVRJQUxJWkVEKSB7CisgICAgICAgIG1GaWx0ZXItPnJlc2V0KCk7CisgICAgfQorCisgICAgaW50MzJfdCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJrZWVwQ29tcG9uZW50QWxsb2NhdGVkIiwgJmtlZXBDb21wb25lbnRBbGxvY2F0ZWQpKTsKKyAgICBpZiAoIWtlZXBDb21wb25lbnRBbGxvY2F0ZWQgfHwgbVN0YXRlID09IFVOSU5JVElBTElaRUQpIHsKKyAgICAgICAgbVN0YXRlID0gVU5JTklUSUFMSVpFRDsKKyAgICB9IGVsc2UgeworICAgICAgICBtU3RhdGUgPSBJTklUSUFMSVpFRDsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRTaHV0ZG93bkNvbXBsZXRlZCk7CisgICAgbm90aWZ5LT5wb3N0KCk7Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6Om9uRmx1c2goKSB7CisgICAgbUdlbmVyYXRpb24rKzsKKworICAgIG1BdmFpbGFibGVJbnB1dEJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzW2tQb3J0SW5kZXhJbnB1dF0uc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQnVmZmVySW5mbyAqaW5mbyA9ICZtQnVmZmVyc1trUG9ydEluZGV4SW5wdXRdLmVkaXRJdGVtQXQoaSk7CisgICAgICAgIGluZm8tPm1TdGF0dXMgPSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUzsKKyAgICB9CisgICAgbUF2YWlsYWJsZU91dHB1dEJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzW2tQb3J0SW5kZXhPdXRwdXRdLnNpemUoKTsgKytpKSB7CisgICAgICAgIEJ1ZmZlckluZm8gKmluZm8gPSAmbUJ1ZmZlcnNba1BvcnRJbmRleE91dHB1dF0uZWRpdEl0ZW1BdChpKTsKKyAgICAgICAgaW5mby0+bVN0YXR1cyA9IEJ1ZmZlckluZm86Ok9XTkVEX0JZX1VTOworICAgICAgICBtQXZhaWxhYmxlT3V0cHV0QnVmZmVycy5wdXNoX2JhY2soaW5mbyk7CisgICAgfQorCisgICAgbVBvcnRFT1Nba1BvcnRJbmRleElucHV0XSA9IGZhbHNlOworICAgIG1Qb3J0RU9TW2tQb3J0SW5kZXhPdXRwdXRdID0gZmFsc2U7CisgICAgbUlucHV0RU9TUmVzdWx0ID0gT0s7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIENvZGVjQmFzZTo6a1doYXRGbHVzaENvbXBsZXRlZCk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgQUxPR1YoIlBvc3RlZCBrV2hhdEZsdXNoQ29tcGxldGVkIik7CisKKyAgICAvLyBNZWRpYUNvZGVjIHJldHVybnMgYWxsIGlucHV0IGJ1ZmZlcnMgYWZ0ZXIgZmx1c2gsIHNvIGluCisgICAgLy8gb25JbnB1dEJ1ZmZlckZpbGxlZCB3ZSBjYWxsIHBvc3RGaWxsVGhpc0J1ZmZlciBvbiB0aGVtCit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6Om9uU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIENIRUNLKG1TdGF0ZSAhPSBTVEFSVEVEKTsKKworICAgIHN0YXR1c190IGVyciA9IG1GaWx0ZXItPnNldFBhcmFtZXRlcnMobXNnKTsKKyAgICBpZiAoZXJyICE9IChzdGF0dXNfdClPSykgeworICAgICAgICBBTE9HRSgic2V0UGFyYW1ldGVycyByZXR1cm5lZCBlcnIgJWQiLCBlcnIpOworICAgIH0KK30KKwordm9pZCBNZWRpYUZpbHRlcjo6b25DcmVhdGVJbnB1dFN1cmZhY2UoKSB7CisgICAgQ0hFQ0sobVN0YXRlID09IENPTkZJR1VSRUQpOworCisgICAgbUdyYXBoaWNCdWZmZXJMaXN0ZW5lciA9IG5ldyBHcmFwaGljQnVmZmVyTGlzdGVuZXI7CisKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKCk7CisgICAgbm90aWZ5LT5zZXRUYXJnZXQodGhpcyk7CisgICAgc3RhdHVzX3QgZXJyID0gbUdyYXBoaWNCdWZmZXJMaXN0ZW5lci0+aW5pdCgKKyAgICAgICAgICAgIG5vdGlmeSwgbVN0cmlkZSwgbVNsaWNlSGVpZ2h0LCBrQnVmZmVyQ291bnRBY3R1YWwpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgbUdyYXBoaWNCdWZmZXJMaXN0ZW5lcjogJWQiLCBlcnIpOworICAgICAgICBzaWduYWxFcnJvcihlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgcmVwbHktPnNldEludDMyKCJ3aGF0IiwgQ29kZWNCYXNlOjprV2hhdElucHV0U3VyZmFjZUNyZWF0ZWQpOworICAgIHJlcGx5LT5zZXRPYmplY3QoCisgICAgICAgICAgICAiaW5wdXQtc3VyZmFjZSIsCisgICAgICAgICAgICBuZXcgQnVmZmVyUHJvZHVjZXJXcmFwcGVyKAorICAgICAgICAgICAgICAgICAgICBtR3JhcGhpY0J1ZmZlckxpc3RlbmVyLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkpKTsKKyAgICByZXBseS0+cG9zdCgpOworfQorCit2b2lkIE1lZGlhRmlsdGVyOjpvbklucHV0RnJhbWVBdmFpbGFibGUoKSB7CisgICAgQnVmZmVySXRlbSBpdGVtID0gbUdyYXBoaWNCdWZmZXJMaXN0ZW5lci0+Z2V0QnVmZmVySXRlbSgpOworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZiA9IG1HcmFwaGljQnVmZmVyTGlzdGVuZXItPmdldEJ1ZmZlcihpdGVtKTsKKworICAgIC8vIGdldCBwb2ludGVyIHRvIGdyYXBoaWMgYnVmZmVyCisgICAgdm9pZCogYnVmUHRyOworICAgIGJ1Zi0+bG9jayhHcmFwaGljQnVmZmVyOjpVU0FHRV9TV19SRUFEX09GVEVOLCAmYnVmUHRyKTsKKworICAgIC8vIEhBQ0sgLSB0aGVyZSBpcyBubyBPTVhfQ09MT1JfRk9STUFUVFlQRSB2YWx1ZSBmb3IgUkdCQSwgc28gdGhlIGZvcm1hdAorICAgIC8vIGNvbnZlcnNpb24gaXMgaGFyZGNvZGVkIHVudGlsIHdlIGFkZCB0aGlzLgorICAgIC8vIFRPRE86IGNoZWNrIGlucHV0IGZvcm1hdCBhbmQgY29udmVydCBvbmx5IGlmIG5lY2Vzc2FyeQorICAgIC8vIGNvcHkgUkdCQSBncmFwaGljIGJ1ZmZlciBpbnRvIHRlbXBvcmFyeSBBUkdCIGlucHV0IGJ1ZmZlcgorICAgIEJ1ZmZlckluZm8gKmlucHV0SW5mbyA9IG5ldyBCdWZmZXJJbmZvOworICAgIGlucHV0SW5mby0+bURhdGEgPSBuZXcgQUJ1ZmZlcihidWYtPmdldFdpZHRoKCkgKiBidWYtPmdldEhlaWdodCgpICogNCk7CisgICAgQUxPR1YoIkNvcHlpbmcgc3VyZmFjZSBkYXRhIGludG8gdGVtcCBidWZmZXIuIik7CisgICAgY29udmVydFJHQkFUb0FSR0IoCisgICAgICAgICAgICAodWludDhfdCopYnVmUHRyLCBidWYtPmdldFdpZHRoKCksIGJ1Zi0+Z2V0SGVpZ2h0KCksCisgICAgICAgICAgICBidWYtPmdldFN0cmlkZSgpLCBpbnB1dEluZm8tPm1EYXRhLT5kYXRhKCkpOworICAgIGlucHV0SW5mby0+bUJ1ZmZlcklEID0gaXRlbS5tQnVmOworICAgIGlucHV0SW5mby0+bUdlbmVyYXRpb24gPSBtR2VuZXJhdGlvbjsKKyAgICBpbnB1dEluZm8tPm1PdXRwdXRGbGFncyA9IDA7CisgICAgaW5wdXRJbmZvLT5tU3RhdHVzID0gQnVmZmVySW5mbzo6T1dORURfQllfVVM7CisgICAgaW5wdXRJbmZvLT5tRGF0YS0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgaXRlbS5tVGltZXN0YW1wIC8gMTAwMCk7CisKKyAgICBtQXZhaWxhYmxlSW5wdXRCdWZmZXJzLnB1c2hfYmFjayhpbnB1dEluZm8pOworCisgICAgbUdyYXBoaWNCdWZmZXJMaXN0ZW5lci0+cmVsZWFzZUJ1ZmZlcihpdGVtKTsKKworICAgIHNpZ25hbFByb2Nlc3NCdWZmZXJzKCk7Cit9CisKK3ZvaWQgTWVkaWFGaWx0ZXI6Om9uU2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIHsKKyAgICAvLyBpZiB1c2luZyBpbnB1dCBzdXJmYWNlLCBuZWVkIHRvIHNlbmQgYW4gRU9TIG91dHB1dCBidWZmZXIKKyAgICBpZiAobUdyYXBoaWNCdWZmZXJMaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIFZlY3RvcjxCdWZmZXJJbmZvPiAqb3V0cHV0QnVmcyA9ICZtQnVmZmVyc1trUG9ydEluZGV4T3V0cHV0XTsKKyAgICAgICAgQnVmZmVySW5mbyogZW9zQnVmOworICAgICAgICBib29sIGZvdW5kQnVmID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga0J1ZmZlckNvdW50QWN0dWFsOyBpKyspIHsKKyAgICAgICAgICAgIGVvc0J1ZiA9ICZvdXRwdXRCdWZzLT5lZGl0SXRlbUF0KGkpOworICAgICAgICAgICAgaWYgKGVvc0J1Zi0+bVN0YXR1cyA9PSBCdWZmZXJJbmZvOjpPV05FRF9CWV9VUykgeworICAgICAgICAgICAgICAgIGZvdW5kQnVmID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghZm91bmRCdWYpIHsKKyAgICAgICAgICAgIEFMT0dFKCJvblNpZ25hbEVuZE9mSW5wdXRTdHJlYW0gZmFpbGVkIHRvIGZpbmQgYW4gb3V0cHV0IGJ1ZmZlciIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZW9zQnVmLT5tT3V0cHV0RmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgIGVvc0J1Zi0+bUdlbmVyYXRpb24gPSBtR2VuZXJhdGlvbjsKKyAgICAgICAgZW9zQnVmLT5tRGF0YS0+c2V0UmFuZ2UoMCwgMCk7CisgICAgICAgIHBvc3REcmFpblRoaXNCdWZmZXIoZW9zQnVmKTsKKyAgICAgICAgQUxPR1YoIlBvc3RlZCBFT1Mgb24gb3V0cHV0IGJ1ZmZlciAldSIsIGVvc0J1Zi0+bUJ1ZmZlcklEKTsKKyAgICB9CisKKyAgICBtUG9ydEVPU1trUG9ydEluZGV4T3V0cHV0XSA9IHRydWU7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBDb2RlY0Jhc2U6OmtXaGF0U2lnbmFsZWRJbnB1dEVPUyk7CisgICAgbm90aWZ5LT5wb3N0KCk7CisKKyAgICBBTE9HVigiT3V0cHV0IHN0cmVhbSBzYXcgRU9TLiIpOworfQorCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvUlNGaWx0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9SU0ZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU2OTk0NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvUlNGaWx0ZXIuY3BwCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlJTRmlsdGVyIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2luY2x1ZGUgIlJTRmlsdGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworUlNGaWx0ZXI6OlJTRmlsdGVyKCkgeworCit9CisKK1JTRmlsdGVyOjp+UlNGaWx0ZXIoKSB7CisKK30KKworc3RhdHVzX3QgUlNGaWx0ZXI6OmNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN0YXR1c190IGVyciA9IFNpbXBsZUZpbHRlcjo6Y29uZmlndXJlKG1zZyk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICghbXNnLT5maW5kU3RyaW5nKCJjYWNoZURpciIsICZtQ2FjaGVEaXIpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmluZCBjYWNoZSBkaXJlY3RvcnkgaW4gY29uZmlnIG1lc3NhZ2UuIik7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICBzcDxSZW5kZXJTY3JpcHRXcmFwcGVyPiB3cmFwcGVyOworICAgIGlmICghbXNnLT5maW5kT2JqZWN0KCJycy13cmFwcGVyIiwgKHNwPFJlZkJhc2U+Kikmd3JhcHBlcikpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmaW5kIFJlbmRlclNjcmlwdFdyYXBwZXIgaW4gY29uZmlnIG1lc3NhZ2UuIik7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICBtUlMgPSB3cmFwcGVyLT5tQ29udGV4dDsKKyAgICBtQ2FsbGJhY2sgPSB3cmFwcGVyLT5tQ2FsbGJhY2s7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFJTRmlsdGVyOjpzdGFydCgpIHsKKyAgICAvLyAzMi1iaXQgZWxlbWVudHMgZm9yIEFSR0I4ODg4CisgICAgUlNDOjpzcDxjb25zdCBSU0M6OkVsZW1lbnQ+IGUgPSBSU0M6OkVsZW1lbnQ6OlU4XzQobVJTKTsKKworICAgIFJTQzo6VHlwZTo6QnVpbGRlciB0YihtUlMsIGUpOworICAgIHRiLnNldFgobVdpZHRoKTsKKyAgICB0Yi5zZXRZKG1IZWlnaHQpOworICAgIFJTQzo6c3A8Y29uc3QgUlNDOjpUeXBlPiB0ID0gdGIuY3JlYXRlKCk7CisKKyAgICBtQWxsb2NJbiA9IFJTQzo6QWxsb2NhdGlvbjo6Y3JlYXRlVHlwZWQobVJTLCB0KTsKKyAgICBtQWxsb2NPdXQgPSBSU0M6OkFsbG9jYXRpb246OmNyZWF0ZVR5cGVkKG1SUywgdCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgUlNGaWx0ZXI6OnJlc2V0KCkgeworICAgIG1DYWxsYmFjay5jbGVhcigpOworICAgIG1BbGxvY091dC5jbGVhcigpOworICAgIG1BbGxvY0luLmNsZWFyKCk7CisgICAgbVJTLmNsZWFyKCk7Cit9CisKK3N0YXR1c190IFJTRmlsdGVyOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgcmV0dXJuIG1DYWxsYmFjay0+aGFuZGxlU2V0UGFyYW1ldGVycyhtc2cpOworfQorCitzdGF0dXNfdCBSU0ZpbHRlcjo6cHJvY2Vzc0J1ZmZlcnMoCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZzcmNCdWZmZXIsIGNvbnN0IHNwPEFCdWZmZXI+ICZvdXRCdWZmZXIpIHsKKyAgICBtQWxsb2NJbi0+Y29weTFEUmFuZ2VGcm9tKDAsIG1XaWR0aCAqIG1IZWlnaHQsIHNyY0J1ZmZlci0+ZGF0YSgpKTsKKyAgICBtQ2FsbGJhY2stPnByb2Nlc3NCdWZmZXJzKG1BbGxvY0luLmdldCgpLCBtQWxsb2NPdXQuZ2V0KCkpOworICAgIG1BbGxvY091dC0+Y29weTFEUmFuZ2VUbygwLCBtV2lkdGggKiBtSGVpZ2h0LCBvdXRCdWZmZXItPmRhdGEoKSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9SU0ZpbHRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9SU0ZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjUwNzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1JTRmlsdGVyLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUlNfRklMVEVSX0hfCisjZGVmaW5lIFJTX0ZJTFRFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUmVuZGVyU2NyaXB0V3JhcHBlci5oPgorI2luY2x1ZGUgPFJlbmRlclNjcmlwdC5oPgorCisjaW5jbHVkZSAiU2ltcGxlRmlsdGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFTdHJpbmc7CisKK3N0cnVjdCBSU0ZpbHRlciA6IHB1YmxpYyBTaW1wbGVGaWx0ZXIgeworcHVibGljOgorICAgIFJTRmlsdGVyKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzQnVmZmVycygKKyAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZzcmNCdWZmZXIsIGNvbnN0IHNwPEFCdWZmZXI+ICZvdXRCdWZmZXIpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+UlNGaWx0ZXIoKTsKKworcHJpdmF0ZToKKyAgICBBU3RyaW5nIG1DYWNoZURpcjsKKyAgICBzcDxSZW5kZXJTY3JpcHRXcmFwcGVyOjpSU0ZpbHRlckNhbGxiYWNrPiBtQ2FsbGJhY2s7CisgICAgUlNDOjpzcDxSU0M6OlJTPiBtUlM7CisgICAgUlNDOjpzcDxSU0M6OkFsbG9jYXRpb24+IG1BbGxvY0luOworICAgIFJTQzo6c3A8UlNDOjpBbGxvY2F0aW9uPiBtQWxsb2NPdXQ7Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBSU19GSUxURVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvU2F0dXJhdGlvbkZpbHRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1NhdHVyYXRpb25GaWx0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNWY3NWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1NhdHVyYXRpb25GaWx0ZXIuY3BwCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNhdHVyYXRpb25GaWx0ZXIiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaW5jbHVkZSAiU2F0dXJhdGlvbkZpbHRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXR1c190IFNhdHVyYXRpb25GaWx0ZXI6OmNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN0YXR1c190IGVyciA9IFNpbXBsZUZpbHRlcjo6Y29uZmlndXJlKG1zZyk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICghbXNnLT5maW5kU3RyaW5nKCJjYWNoZURpciIsICZtQ2FjaGVEaXIpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmluZCBjYWNoZSBkaXJlY3RvcnkgaW4gY29uZmlnIG1lc3NhZ2UuIik7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFNhdHVyYXRpb25GaWx0ZXI6OnN0YXJ0KCkgeworICAgIC8vIFRPRE86IHVzZSBhIHNpbmdsZSBSUyBjb250ZXh0IG9iamVjdCBmb3IgZW50aXJlIGFwcGxpY2F0aW9uCisgICAgbVJTID0gbmV3IFJTQzo6UlMoKTsKKworICAgIGlmICghbVJTLT5pbml0KG1DYWNoZURpci5jX3N0cigpKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgUmVuZGVyU2NyaXB0IGNvbnRleHQuIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIC8vIDMyLWJpdCBlbGVtZW50cyBmb3IgQVJHQjg4ODgKKyAgICBSU0M6OnNwPGNvbnN0IFJTQzo6RWxlbWVudD4gZSA9IFJTQzo6RWxlbWVudDo6VThfNChtUlMpOworCisgICAgUlNDOjpUeXBlOjpCdWlsZGVyIHRiKG1SUywgZSk7CisgICAgdGIuc2V0WChtV2lkdGgpOworICAgIHRiLnNldFkobUhlaWdodCk7CisgICAgUlNDOjpzcDxjb25zdCBSU0M6OlR5cGU+IHQgPSB0Yi5jcmVhdGUoKTsKKworICAgIG1BbGxvY0luID0gUlNDOjpBbGxvY2F0aW9uOjpjcmVhdGVUeXBlZChtUlMsIHQpOworICAgIG1BbGxvY091dCA9IFJTQzo6QWxsb2NhdGlvbjo6Y3JlYXRlVHlwZWQobVJTLCB0KTsKKworICAgIG1TY3JpcHQgPSBuZXcgU2NyaXB0Q19zYXR1cmF0aW9uQVJHQihtUlMpOworCisgICAgbVNjcmlwdC0+c2V0X2dTYXR1cmF0aW9uKG1TYXR1cmF0aW9uKTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBTYXR1cmF0aW9uRmlsdGVyOjpyZXNldCgpIHsKKyAgICBtU2NyaXB0LmNsZWFyKCk7CisgICAgbUFsbG9jT3V0LmNsZWFyKCk7CisgICAgbUFsbG9jSW4uY2xlYXIoKTsKKyAgICBtUlMuY2xlYXIoKTsKK30KKworc3RhdHVzX3QgU2F0dXJhdGlvbkZpbHRlcjo6c2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNwPEFNZXNzYWdlPiBwYXJhbXM7CisgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicGFyYW1zIiwgJnBhcmFtcykpOworCisgICAgZmxvYXQgc2F0dXJhdGlvbjsKKyAgICBpZiAocGFyYW1zLT5maW5kRmxvYXQoInNhdHVyYXRpb24iLCAmc2F0dXJhdGlvbikpIHsKKyAgICAgICAgbVNhdHVyYXRpb24gPSBzYXR1cmF0aW9uOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU2F0dXJhdGlvbkZpbHRlcjo6cHJvY2Vzc0J1ZmZlcnMoCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZzcmNCdWZmZXIsIGNvbnN0IHNwPEFCdWZmZXI+ICZvdXRCdWZmZXIpIHsKKyAgICBtQWxsb2NJbi0+Y29weTFEUmFuZ2VGcm9tKDAsIG1XaWR0aCAqIG1IZWlnaHQsIHNyY0J1ZmZlci0+ZGF0YSgpKTsKKyAgICBtU2NyaXB0LT5mb3JFYWNoX3Jvb3QobUFsbG9jSW4sIG1BbGxvY091dCk7CisgICAgbUFsbG9jT3V0LT5jb3B5MURSYW5nZVRvKDAsIG1XaWR0aCAqIG1IZWlnaHQsIG91dEJ1ZmZlci0+ZGF0YSgpKTsKKworICAgIHJldHVybiBPSzsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1NhdHVyYXRpb25GaWx0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvU2F0dXJhdGlvbkZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NDUwMjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1NhdHVyYXRpb25GaWx0ZXIuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTQVRVUkFUSU9OX0ZJTFRFUl9IXworI2RlZmluZSBTQVRVUkFUSU9OX0ZJTFRFUl9IXworCisjaW5jbHVkZSA8UmVuZGVyU2NyaXB0Lmg+CisKKyNpbmNsdWRlICJTY3JpcHRDX3NhdHVyYXRpb25BUkdCLmgiCisjaW5jbHVkZSAiU2ltcGxlRmlsdGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IFNhdHVyYXRpb25GaWx0ZXIgOiBwdWJsaWMgU2ltcGxlRmlsdGVyIHsKK3B1YmxpYzoKKyAgICBTYXR1cmF0aW9uRmlsdGVyKCkgOiBtU2F0dXJhdGlvbigxLmYpIHt9OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2Vzc0J1ZmZlcnMoCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmc3JjQnVmZmVyLCBjb25zdCBzcDxBQnVmZmVyPiAmb3V0QnVmZmVyKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNhdHVyYXRpb25GaWx0ZXIoKSB7fTsKKworcHJpdmF0ZToKKyAgICBBU3RyaW5nIG1DYWNoZURpcjsKKyAgICBSU0M6OnNwPFJTQzo6UlM+IG1SUzsKKyAgICBSU0M6OnNwPFJTQzo6QWxsb2NhdGlvbj4gbUFsbG9jSW47CisgICAgUlNDOjpzcDxSU0M6OkFsbG9jYXRpb24+IG1BbGxvY091dDsKKyAgICBSU0M6OnNwPFNjcmlwdENfc2F0dXJhdGlvbkFSR0I+IG1TY3JpcHQ7CisgICAgZmxvYXQgbVNhdHVyYXRpb247Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTQVRVUkFUSU9OX0ZJTFRFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9TaW1wbGVGaWx0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9TaW1wbGVGaWx0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMWNhMmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1NpbXBsZUZpbHRlci5jcHAKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2luY2x1ZGUgIlNpbXBsZUZpbHRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXR1c190IFNpbXBsZUZpbHRlcjo6Y29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndpZHRoIiwgJm1XaWR0aCkpOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJoZWlnaHQiLCAmbUhlaWdodCkpOworICAgIGlmICghbXNnLT5maW5kSW50MzIoInN0cmlkZSIsICZtU3RyaWRlKSkgeworICAgICAgICBtU3RyaWRlID0gbVdpZHRoOworICAgIH0KKyAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJzbGljZS1oZWlnaHQiLCAmbVNsaWNlSGVpZ2h0KSkgeworICAgICAgICBtU2xpY2VIZWlnaHQgPSBtSGVpZ2h0OworICAgIH0KKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJm1Db2xvckZvcm1hdEluKSk7CisgICAgbUNvbG9yRm9ybWF0T3V0ID0gbUNvbG9yRm9ybWF0SW47CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9TaW1wbGVGaWx0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvU2ltcGxlRmlsdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNkMzdlZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvU2ltcGxlRmlsdGVyLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0lNUExFX0ZJTFRFUl9IXworI2RlZmluZSBTSU1QTEVfRklMVEVSX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK3N0cnVjdCBBQnVmZmVyOworc3RydWN0IEFNZXNzYWdlOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBTaW1wbGVGaWx0ZXIgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgU2ltcGxlRmlsdGVyKCkgOiBtV2lkdGgoMCksIG1IZWlnaHQoMCksIG1TdHJpZGUoMCksIG1TbGljZUhlaWdodCgwKSwKKyAgICAgICAgICAgIG1Db2xvckZvcm1hdEluKDApLCBtQ29sb3JGb3JtYXRPdXQoMCkge307CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCByZXNldCgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3NCdWZmZXJzKAorICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnNyY0J1ZmZlciwgY29uc3Qgc3A8QUJ1ZmZlcj4gJm91dEJ1ZmZlcikgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgaW50MzJfdCBtV2lkdGgsIG1IZWlnaHQ7CisgICAgaW50MzJfdCBtU3RyaWRlLCBtU2xpY2VIZWlnaHQ7CisgICAgaW50MzJfdCBtQ29sb3JGb3JtYXRJbiwgbUNvbG9yRm9ybWF0T3V0OworCisgICAgdmlydHVhbCB+U2ltcGxlRmlsdGVyKCkge307Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTSU1QTEVfRklMVEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1plcm9GaWx0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9aZXJvRmlsdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjEyNDNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9aZXJvRmlsdGVyLmNwcApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJaZXJvRmlsdGVyIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlICJaZXJvRmlsdGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdHVzX3QgWmVyb0ZpbHRlcjo6c2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHNwPEFNZXNzYWdlPiBwYXJhbXM7CisgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgicGFyYW1zIiwgJnBhcmFtcykpOworCisgICAgaW50MzJfdCBpbnZlcnQ7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJpbnZlcnQiLCAmaW52ZXJ0KSkgeworICAgICAgICBtSW52ZXJ0RGF0YSA9IChpbnZlcnQgIT0gMCk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBaZXJvRmlsdGVyOjpwcm9jZXNzQnVmZmVycygKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJnNyY0J1ZmZlciwgY29uc3Qgc3A8QUJ1ZmZlcj4gJm91dEJ1ZmZlcikgeworICAgIC8vIGFzc3VtaW5nIGlkZW50aWNhbCBpbnB1dCAmIG91dHB1dCBidWZmZXJzLCBzaW5jZSB3ZSdyZSBhIGNvcHkgZmlsdGVyCisgICAgaWYgKG1JbnZlcnREYXRhKSB7CisgICAgICAgIHVpbnQzMl90KiBzcmMgPSAodWludDMyX3QqKXNyY0J1ZmZlci0+ZGF0YSgpOworICAgICAgICB1aW50MzJfdCogZGVzdCA9ICh1aW50MzJfdCopb3V0QnVmZmVyLT5kYXRhKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3JjQnVmZmVyLT5zaXplKCkgLyA0OyArK2kpIHsKKyAgICAgICAgICAgICooZGVzdCsrKSA9ICooc3JjKyspIF4gMHhGRkZGRkZGRjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShvdXRCdWZmZXItPmRhdGEoKSwgc3JjQnVmZmVyLT5kYXRhKCksIHNyY0J1ZmZlci0+c2l6ZSgpKTsKKyAgICB9CisgICAgb3V0QnVmZmVyLT5zZXRSYW5nZSgwLCBzcmNCdWZmZXItPnNpemUoKSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9aZXJvRmlsdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL1plcm9GaWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDM0ZGZiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9aZXJvRmlsdGVyLmgKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgWkVST19GSUxURVJfSF8KKyNkZWZpbmUgWkVST19GSUxURVJfSF8KKworI2luY2x1ZGUgIlNpbXBsZUZpbHRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBaZXJvRmlsdGVyIDogcHVibGljIFNpbXBsZUZpbHRlciB7CitwdWJsaWM6CisgICAgWmVyb0ZpbHRlcigpIDogbUludmVydERhdGEoZmFsc2UpIHt9OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpIHsgcmV0dXJuIE9LOyB9OworICAgIHZpcnR1YWwgdm9pZCByZXNldCgpIHt9OworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzQnVmZmVycygKKyAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZzcmNCdWZmZXIsIGNvbnN0IHNwPEFCdWZmZXI+ICZvdXRCdWZmZXIpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+WmVyb0ZpbHRlcigpIHt9OworCitwcml2YXRlOgorICAgIGJvb2wgbUludmVydERhdGE7Cit9OworCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBaRVJPX0ZJTFRFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9zYXR1cmF0aW9uLnJzIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9zYXR1cmF0aW9uLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjODY3YWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL3NhdHVyYXRpb24ucnMKQEAgLTAsMCArMSw0MCBAQAorLy8gU2FtcGxlIHNjcmlwdCBmb3IgUkdCODg4IHN1cHBvcnQgKGNvbXBhcmUgdG8gc2F0dXJhdGlvbkFSR0IucnMpCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSB2ZXJzaW9uKDEpCisjcHJhZ21hIHJzIGphdmFfcGFja2FnZV9uYW1lKGNvbS5hbmRyb2lkLnJzLmNwcGJhc2ljKQorI3ByYWdtYSByc19mcF9yZWxheGVkCisKK2NvbnN0IHN0YXRpYyBmbG9hdDMgZ01vbm9NdWx0ID0gezAuMjk5ZiwgMC41ODdmLCAwLjExNGZ9OworCisvLyBnbG9iYWwgdmFyaWFibGVzIChwYXJhbWV0ZXJzIGFjY2Vzc2libGUgdG8gYXBwbGljYXRpb24gY29kZSkKK2Zsb2F0IGdTYXR1cmF0aW9uID0gMS4wZjsKKwordm9pZCByb290KGNvbnN0IHVjaGFyMyAqdl9pbiwgdWNoYXIzICp2X291dCkgeworICAgIC8vIHNjYWxlIDAtMjU1IHVjaGFyIHRvIDAtMS4wIGZsb2F0CisgICAgZmxvYXQzIGluID0ge3ZfaW4tPnIgKiAwLjAwMzkyMTU2OWYsIHZfaW4tPmcgKiAwLjAwMzkyMTU2OWYsCisgICAgICAgICAgICB2X2luLT5iICogMC4wMDM5MjE1NjlmfTsKKworICAgIC8vIGFwcGx5IHNhdHVyYXRpb24gZmlsdGVyCisgICAgZmxvYXQzIHJlc3VsdCA9IGRvdChpbiwgZ01vbm9NdWx0KTsKKyAgICByZXN1bHQgPSBtaXgocmVzdWx0LCBpbiwgZ1NhdHVyYXRpb24pOworCisgICAgLy8gY29udmVydCB0byB1Y2hhciwgY29waWVkIGZyb20gcnNQYWNrQ29sb3JUbzg4ODgKKyAgICB2X291dC0+eCA9ICh1Y2hhciljbGFtcCgocmVzdWx0LnIgKiAyNTUuZiArIDAuNWYpLCAwLmYsIDI1NS5mKTsKKyAgICB2X291dC0+eSA9ICh1Y2hhciljbGFtcCgocmVzdWx0LmcgKiAyNTUuZiArIDAuNWYpLCAwLmYsIDI1NS5mKTsKKyAgICB2X291dC0+eiA9ICh1Y2hhciljbGFtcCgocmVzdWx0LmIgKiAyNTUuZiArIDAuNWYpLCAwLmYsIDI1NS5mKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvc2F0dXJhdGlvbkFSR0IucnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL3NhdHVyYXRpb25BUkdCLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZTlkZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL3NhdHVyYXRpb25BUkdCLnJzCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIHZlcnNpb24oMSkKKyNwcmFnbWEgcnMgamF2YV9wYWNrYWdlX25hbWUoY29tLmFuZHJvaWQucnMuY3BwYmFzaWMpCisjcHJhZ21hIHJzX2ZwX3JlbGF4ZWQKKworY29uc3Qgc3RhdGljIGZsb2F0MyBnTW9ub011bHQgPSB7MC4yOTlmLCAwLjU4N2YsIDAuMTE0Zn07CisKKy8vIGdsb2JhbCB2YXJpYWJsZXMgKHBhcmFtZXRlcnMgYWNjZXNzaWJsZSB0byBhcHBsaWNhdGlvbiBjb2RlKQorZmxvYXQgZ1NhdHVyYXRpb24gPSAxLjBmOworCit2b2lkIHJvb3QoY29uc3QgdWNoYXI0ICp2X2luLCB1Y2hhcjQgKnZfb3V0KSB7CisgICAgdl9vdXQtPnggPSB2X2luLT54OyAvLyBkb24ndCBtb2RpZnkgQQorCisgICAgLy8gZ2V0IFJHQiwgc2NhbGUgMC0yNTUgdWNoYXIgdG8gMC0xLjAgZmxvYXQKKyAgICBmbG9hdDMgcmdiID0ge3ZfaW4tPnkgKiAwLjAwMzkyMTU2OWYsIHZfaW4tPnogKiAwLjAwMzkyMTU2OWYsCisgICAgICAgICAgICB2X2luLT53ICogMC4wMDM5MjE1NjlmfTsKKworICAgIC8vIGFwcGx5IHNhdHVyYXRpb24gZmlsdGVyCisgICAgZmxvYXQzIHJlc3VsdCA9IGRvdChyZ2IsIGdNb25vTXVsdCk7CisgICAgcmVzdWx0ID0gbWl4KHJlc3VsdCwgcmdiLCBnU2F0dXJhdGlvbik7CisKKyAgICB2X291dC0+eSA9ICh1Y2hhciljbGFtcCgocmVzdWx0LnIgKiAyNTUuZiArIDAuNWYpLCAwLmYsIDI1NS5mKTsKKyAgICB2X291dC0+eiA9ICh1Y2hhciljbGFtcCgocmVzdWx0LmcgKiAyNTUuZiArIDAuNWYpLCAwLmYsIDI1NS5mKTsKKyAgICB2X291dC0+dyA9ICh1Y2hhciljbGFtcCgocmVzdWx0LmIgKiAyNTUuZiArIDAuNWYpLCAwLmYsIDI1NS5mKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuY3BwCmluZGV4IDQ5MTNmZDQuLmE1YjgxYTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmNwcApAQCAtNTIsNiArNTIsOSBAQAogc3A8QUJ1ZmZlcj4gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBjYXBhY2l0eSkKIHsKICAgICBzcDxBQnVmZmVyPiByZXMgPSBuZXcgQUJ1ZmZlcihjYXBhY2l0eSk7CisgICAgaWYgKHJlcy0+YmFzZSgpID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIG1lbWNweShyZXMtPmRhdGEoKSwgZGF0YSwgY2FwYWNpdHkpOwogICAgIHJldHVybiByZXM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5jcHAKaW5kZXggZWM0YTk2MC4uMmM1ZjU0NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmNwcApAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGN0eXBlLmg+CiAKICNkZWZpbmUgTE9HX1RBRyAiQURlYnVnIgorI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9taXNjLmg+CiAKQEAgLTI4LDE0ICsyOSwxNSBAQAogI2luY2x1ZGUgPEFTdHJpbmdVdGlscy5oPgogI2luY2x1ZGUgPEFVdGlscy5oPgogCisjZGVmaW5lIFVOVVNFRCh4KSAoKHZvaWQpKHgpKQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vc3RhdGljCi1BRGVidWc6OkxldmVsIEFEZWJ1Zzo6R2V0RGVidWdMZXZlbEZyb21TdHJpbmcoCi0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlLCBBRGVidWc6OkxldmVsIGRlZikgeworbG9uZyBBRGVidWc6OkdldExldmVsRnJvbVNldHRpbmdzU3RyaW5nKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgbG9uZyBkZWYpIHsKICAgICAvLyBzcGxpdCBvbiAsCiAgICAgY29uc3QgY2hhciAqbmV4dCA9IHZhbHVlLCAqY3VycmVudDsKLSAgICBjb25zdCB1bnNpZ25lZCBsb25nIG1heExldmVsID0gKHVuc2lnbmVkIGxvbmcpa0RlYnVnTWF4OwogICAgIHdoaWxlIChuZXh0ICE9IE5VTEwpIHsKICAgICAgICAgY3VycmVudCA9IG5leHQ7CiAgICAgICAgIG5leHQgPSBzdHJjaHIoY3VycmVudCwgJywnKTsKQEAgLTUxLDggKzUzLDggQEAKIAogICAgICAgICAvLyBnZXQgbGV2ZWwKICAgICAgICAgY2hhciAqZW5kOwotICAgICAgICBlcnJubyA9IDA7ICAvLyBzdHJ0b3VsIGRvZXMgbm90IGNsZWFyIGVycm5vLCBidXQgaXQgY2FuIGJlIHNldCBmb3IgYW55IHJldHVybiB2YWx1ZQotICAgICAgICB1bnNpZ25lZCBsb25nIGxldmVsID0gc3RydG91bChjdXJyZW50LCAmZW5kLCAxMCk7CisgICAgICAgIGVycm5vID0gMDsgIC8vIHN0cnRvbCBkb2VzIG5vdCBjbGVhciBlcnJubywgYnV0IGl0IGNhbiBiZSBzZXQgZm9yIGFueSByZXR1cm4gdmFsdWUKKyAgICAgICAgbG9uZyBsZXZlbCA9IHN0cnRvbChjdXJyZW50LCAmZW5kLCAxMCk7CiAgICAgICAgIHdoaWxlIChpc3NwYWNlKCplbmQpKSB7CiAgICAgICAgICAgICArK2VuZDsKICAgICAgICAgfQpAQCAtNzYsOCArNzgsMTggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vIHVwZGF0ZSBkZWJ1ZyBsZXZlbAotICAgICAgICBkZWYgPSAoTGV2ZWwpbWluKGxldmVsLCBtYXhMZXZlbCk7CisgICAgICAgIC8vIHVwZGF0ZSB2YWx1ZQorICAgICAgICBkZWYgPSBsZXZlbDsKKyAgICB9CisgICAgcmV0dXJuIGRlZjsKK30KKworLy9zdGF0aWMKK2xvbmcgQURlYnVnOjpHZXRMZXZlbEZyb21Qcm9wZXJ0eSgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcHJvcGVydHlOYW1lLCBsb25nIGRlZikgeworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAocHJvcGVydHlfZ2V0KHByb3BlcnR5TmFtZSwgdmFsdWUsIE5VTEwpKSB7CisgICAgICAgIGRlZiA9IEdldExldmVsRnJvbVNldHRpbmdzU3RyaW5nKG5hbWUsIHZhbHVlLCBkZWYpOwogICAgIH0KICAgICByZXR1cm4gZGVmOwogfQpAQCAtODUsMTEgKzk3LDggQEAKIC8vc3RhdGljCiBBRGVidWc6OkxldmVsIEFEZWJ1Zzo6R2V0RGVidWdMZXZlbEZyb21Qcm9wZXJ0eSgKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcHJvcGVydHlOYW1lLCBBRGVidWc6OkxldmVsIGRlZikgewotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBpZiAocHJvcGVydHlfZ2V0KHByb3BlcnR5TmFtZSwgdmFsdWUsIE5VTEwpKSB7Ci0gICAgICAgIHJldHVybiBHZXREZWJ1Z0xldmVsRnJvbVN0cmluZyhuYW1lLCB2YWx1ZSwgZGVmKTsKLSAgICB9Ci0gICAgcmV0dXJuIGRlZjsKKyAgICBsb25nIGxldmVsID0gR2V0TGV2ZWxGcm9tUHJvcGVydHkobmFtZSwgcHJvcGVydHlOYW1lLCAobG9uZylkZWYpOworICAgIHJldHVybiAoTGV2ZWwpbWluKG1heChsZXZlbCwgKGxvbmcpa0RlYnVnTm9uZSksIChsb25nKWtEZWJ1Z01heCk7CiB9CiAKIC8vc3RhdGljCkBAIC0xMTMsNSArMTIyLDY5IEBACiAgICAgcmV0dXJuIGRlYnVnTmFtZTsKIH0KIAorLy9zdGF0aWMKK2Jvb2wgQURlYnVnOjpnZXRFeHBlcmltZW50RmxhZygKKyAgICAgICAgYm9vbCBhbGxvdywgY29uc3QgY2hhciAqbmFtZSwgdWludDY0X3QgbW9kdWxvLAorICAgICAgICB1aW50NjRfdCBsaW1pdCwgdWludDY0X3QgcGx1cywgdWludDY0X3QgdGltZURpdmlzb3IpIHsKKyAgICAvLyBzZWUgaWYgdGhpcyBleHBlcmltZW50IHNob3VsZCBiZSBkaXNhYmxlZC9lbmFibGVkIGJhc2VkIG9uIHByb3BlcnRpZXMuCisgICAgLy8gZGVmYXVsdCB0byAyIHRvIGFsbG93IDAvMSBzcGVjaWZpY2F0aW9uCisgICAgY29uc3QgaW50IHVuZGVmaW5lZCA9IDI7CisgICAgbG9uZyBsZXZlbCA9IEdldExldmVsRnJvbVByb3BlcnR5KG5hbWUsICJkZWJ1Zy5zdGFnZWZyaWdodC5leHBlcmltZW50cyIsIHVuZGVmaW5lZCk7CisgICAgaWYgKGxldmVsICE9IHVuZGVmaW5lZCkgeworICAgICAgICBBTE9HSSgiZXhwZXJpbWVudCAnJXMnOiAlcyBmcm9tIHByb3BlcnR5IiwgbmFtZSwgbGV2ZWwgPyAiRU5BQkxFRCIgOiAiZGlzYWJsZWQiKTsKKyAgICAgICAgcmV0dXJuIGFsbG93ICYmIChsZXZlbCAhPSAwKTsKKyAgICB9CisKKyNpZm5kZWYgRU5BQkxFX1NUQUdFRlJJR0hUX0FVVE9fRVhQRVJJTUVOVFMKKyAgICBVTlVTRUQobW9kdWxvKTsKKyAgICBVTlVTRUQobGltaXQpOworICAgIFVOVVNFRChwbHVzKTsKKyAgICBVTlVTRUQodGltZURpdmlzb3IpOworICAgIHJldHVybiBmYWxzZTsKKyNlbHNlCisgICAgLy8gRGlzYWJsZSBhdXRvbWF0aWMgZXhwZXJpbWVudHMgaW4gIm5vbi1leHBlcmltZW50YWwiIGJ1aWxkcyAodGhhdCBpcywgX2FsbF8gYnVpbGRzCisgICAgLy8gYXMgdGhlcmUgaXMgbm8gImV4cGVyaW1lbnRhbCIgYnVpbGQpLgorICAgIC8vIFRPRE86IGNoYW5nZSBidWlsZCB0eXBlIHRvIGVuYWJsZSBhdXRvbWF0aWMgZXhwZXJpbWVudHMgaW4gdGhlIGZ1dHVyZSBmb3Igc29tZSBidWlsZHMKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldCgicm8uYnVpbGQudHlwZSIsIHZhbHVlLCBOVUxMKSkgeworICAgICAgICBpZiAoc3RyY21wKHZhbHVlLCAiZXhwZXJpbWVudGFsIikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyB2b2xhdGlsZSBpbnQzMl90IGhhdmVTZXJpYWwgPSAwOworICAgIHN0YXRpYyB1aW50NjRfdCBzZXJpYWxOdW07CisgICAgaWYgKCFhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJmhhdmVTZXJpYWwpKSB7CisgICAgICAgIC8vIGNhbGN1bGF0ZSBpbml0aWFsIGNvdW50ZXIgdmFsdWUgYmFzZWQgb24gc2VyaWFsIG51bWJlcgorICAgICAgICBzdGF0aWMgY2hhciBzZXJpYWxbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICAgICAgcHJvcGVydHlfZ2V0KCJyby5zZXJpYWxubyIsIHNlcmlhbCwgIjAiKTsKKyAgICAgICAgdWludDY0X3QgbnVtID0gMDsgLy8gaXQgaXMgb2theSBmb3IgdGhpcyBudW1iZXIgdG8gb3ZlcmZsb3cKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBORUxFTShzZXJpYWwpICYmIHNlcmlhbFtpXSAhPSAnXDAnOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgJmMgPSBzZXJpYWxbaV07CisgICAgICAgICAgICAvLyB0cnkgdG8gdXNlIG1vc3QgbGV0dGVycyBvZiBzZXJpYWxubworICAgICAgICAgICAgaWYgKGlzZGlnaXQoYykpIHsKKyAgICAgICAgICAgICAgICBudW0gPSBudW0gKiAxMCArIChjIC0gJzAnKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNsb3dlcihjKSkgeworICAgICAgICAgICAgICAgIG51bSA9IG51bSAqIDI2ICsgKGMgLSAnYScpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpc3VwcGVyKGMpKSB7CisgICAgICAgICAgICAgICAgbnVtID0gbnVtICogMjYgKyAoYyAtICdBJyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG51bSA9IG51bSAqIDI1NiArIGM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2VyaWFsTnVtID0gbnVtOworICAgICAgICBhbmRyb2lkX2F0b21pY19yZWxlYXNlX3N0b3JlKDEsICZoYXZlU2VyaWFsKTsKKyAgICB9CisgICAgQUxPR0QoInNlcmlhbDogJWxsdSwgdGltZTogJWxsZCIsIChsb25nIGxvbmcgdW5zaWduZWQpc2VyaWFsTnVtLCAobG9uZyBsb25nKXRpbWUoTlVMTCkpOworICAgIC8vIE1JTk9SOiB1c2UgbW9kdWxvIGZvciBjb3VudGVyIGFuZCB0aW1lLCBzbyB0aGF0IHRoZWlyIHN1bSBkb2VzIG5vdAorICAgIC8vIHJvbGwgb3ZlciwgYW5kIG1lc3MgdXAgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gcmVsYXRlZCBleHBlcmltZW50cy4KKyAgICAvLyBlLmcuIGtlZXAgKGEgbW9kIDJOKSA9IDAgaW1wbCAoYSBtb2QgTikgPSAwCisgICAgdGltZV90IGNvdW50ZXIgPSAodGltZShOVUxMKSAvIHRpbWVEaXZpc29yKSAlIG1vZHVsbyArIHBsdXMgKyBzZXJpYWxOdW0gJSBtb2R1bG87CisgICAgYm9vbCBlbmFibGUgPSBhbGxvdyAmJiAoY291bnRlciAlIG1vZHVsbyA8IGxpbWl0KTsKKyAgICBBTE9HSSgiZXhwZXJpbWVudCAnJXMnOiAlcyIsIG5hbWUsIGVuYWJsZSA/ICJFTkFCTEVEIiA6ICJkaXNhYmxlZCIpOworICAgIHJldHVybiBlbmFibGU7CisjZW5kaWYKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmNwcAppbmRleCBiZDVmN2U5Li43ZGJiZTU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmNwcApAQCAtMTksMTUgKzE5LDIzIEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3A8QUxvb3Blcj4gQUhhbmRsZXI6Omxvb3BlcigpIHsKLSAgICBleHRlcm4gQUxvb3BlclJvc3RlciBnTG9vcGVyUm9zdGVyOwordm9pZCBBSGFuZGxlcjo6ZGVsaXZlck1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBvbk1lc3NhZ2VSZWNlaXZlZChtc2cpOworICAgIG1NZXNzYWdlQ291bnRlcisrOwogCi0gICAgcmV0dXJuIGdMb29wZXJSb3N0ZXIuZmluZExvb3BlcihpZCgpKTsKKyAgICBpZiAobVZlcmJvc2VTdGF0cykgeworICAgICAgICB1aW50MzJfdCB3aGF0ID0gbXNnLT53aGF0KCk7CisgICAgICAgIHNzaXplX3QgaWR4ID0gbU1lc3NhZ2VzLmluZGV4T2ZLZXkod2hhdCk7CisgICAgICAgIGlmIChpZHggPCAwKSB7CisgICAgICAgICAgICBtTWVzc2FnZXMuYWRkKHdoYXQsIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU1lc3NhZ2VzLmVkaXRWYWx1ZUF0KGlkeCkrKzsKKyAgICAgICAgfQorICAgIH0KIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwCmluZGV4IDVmN2M3MGQuLmI4MzdmNjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcApAQCAtMTA5LDcgKzEwOSw4IEBACiAgICAgICAgIEEuZWRpdEl0ZW1BdChpKS0+c3RhdGVFeGl0ZWQoKTsKICAgICB9CiAKLSAgICBmb3IgKHNpemVfdCBpID0gQi5zaXplKCk7IGktLSA+IDA7KSB7CisgICAgZm9yIChzaXplX3QgaSA9IEIuc2l6ZSgpOyBpID4gMDspIHsKKyAgICAgICAgaS0tOwogICAgICAgICBCLmVkaXRJdGVtQXQoaSktPnN0YXRlRW50ZXJlZCgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCmluZGV4IDg4YjFjOTIuLjkwYjVmNjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcApAQCAtMTYsNiArMTYsOSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkFMb29wZXIiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxzeXMvdGltZS5oPgpAQCAtMjEwLDcgKzIxMyw3IEBACiAgICAgICAgIG1FdmVudFF1ZXVlLmVyYXNlKG1FdmVudFF1ZXVlLmJlZ2luKCkpOwogICAgIH0KIAotICAgIGdMb29wZXJSb3N0ZXIuZGVsaXZlck1lc3NhZ2UoZXZlbnQubU1lc3NhZ2UpOworICAgIGV2ZW50Lm1NZXNzYWdlLT5kZWxpdmVyKCk7CiAKICAgICAvLyBOT1RFOiBJdCdzIGltcG9ydGFudCB0byBub3RlIHRoYXQgYXQgdGhpcyBwb2ludCBvdXIgIkFMb29wZXIiIG9iamVjdAogICAgIC8vIG1heSBubyBsb25nZXIgZXhpc3QgKGl0cyBmaW5hbCByZWZlcmVuY2UgbWF5IGhhdmUgZ29uZSBhd2F5IHdoaWxlCkBAIC0yMjAsNCArMjIzLDI5IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKKy8vIHRvIGJlIGNhbGxlZCBieSBBTWVzc2FnZTo6cG9zdEFuZEF3YWl0UmVzcG9uc2Ugb25seQorc3A8QVJlcGx5VG9rZW4+IEFMb29wZXI6OmNyZWF0ZVJlcGx5VG9rZW4oKSB7CisgICAgcmV0dXJuIG5ldyBBUmVwbHlUb2tlbih0aGlzKTsKK30KKworLy8gdG8gYmUgY2FsbGVkIGJ5IEFNZXNzYWdlOjpwb3N0QW5kQXdhaXRSZXNwb25zZSBvbmx5CitzdGF0dXNfdCBBTG9vcGVyOjphd2FpdFJlc3BvbnNlKGNvbnN0IHNwPEFSZXBseVRva2VuPiAmcmVwbHlUb2tlbiwgc3A8QU1lc3NhZ2U+ICpyZXNwb25zZSkgeworICAgIC8vIHJldHVybiBzdGF0dXMgaW4gY2FzZSB3ZSB3YW50IHRvIGhhbmRsZSBhbiBpbnRlcnJ1cHRlZCB3YWl0CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1SZXBsaWVzTG9jayk7CisgICAgQ0hFQ0socmVwbHlUb2tlbiAhPSBOVUxMKTsKKyAgICB3aGlsZSAoIXJlcGx5VG9rZW4tPnJldHJpZXZlUmVwbHkocmVzcG9uc2UpKSB7CisgICAgICAgIG1SZXBsaWVzQ29uZGl0aW9uLndhaXQobVJlcGxpZXNMb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBTG9vcGVyOjpwb3N0UmVwbHkoY29uc3Qgc3A8QVJlcGx5VG9rZW4+ICZyZXBseVRva2VuLCBjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1SZXBsaWVzTG9jayk7CisgICAgc3RhdHVzX3QgZXJyID0gcmVwbHlUb2tlbi0+c2V0UmVwbHkocmVwbHkpOworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgbVJlcGxpZXNDb25kaXRpb24uYnJvYWRjYXN0KCk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcAppbmRleCAyZDU3YWVlLi45ZWQ1M2U3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAKQEAgLTMwLDggKzMwLDcgQEAKIHN0YXRpYyBib29sIHZlcmJvc2VTdGF0cyA9IGZhbHNlOwogCiBBTG9vcGVyUm9zdGVyOjpBTG9vcGVyUm9zdGVyKCkKLSAgICA6IG1OZXh0SGFuZGxlcklEKDEpLAotICAgICAgbU5leHRSZXBseUlEKDEpIHsKKyAgICA6IG1OZXh0SGFuZGxlcklEKDEpIHsKIH0KIAogQUxvb3Blcjo6aGFuZGxlcl9pZCBBTG9vcGVyUm9zdGVyOjpyZWdpc3RlckhhbmRsZXIoCkBAIC00OSw3ICs0OCw3IEBACiAgICAgQUxvb3Blcjo6aGFuZGxlcl9pZCBoYW5kbGVySUQgPSBtTmV4dEhhbmRsZXJJRCsrOwogICAgIG1IYW5kbGVycy5hZGQoaGFuZGxlcklELCBpbmZvKTsKIAotICAgIGhhbmRsZXItPnNldElEKGhhbmRsZXJJRCk7CisgICAgaGFuZGxlci0+c2V0SUQoaGFuZGxlcklELCBsb29wZXIpOwogCiAgICAgcmV0dXJuIGhhbmRsZXJJRDsKIH0KQEAgLTY4LDcgKzY3LDcgQEAKICAgICBzcDxBSGFuZGxlcj4gaGFuZGxlciA9IGluZm8ubUhhbmRsZXIucHJvbW90ZSgpOwogCiAgICAgaWYgKGhhbmRsZXIgIT0gTlVMTCkgewotICAgICAgICBoYW5kbGVyLT5zZXRJRCgwKTsKKyAgICAgICAgaGFuZGxlci0+c2V0SUQoMCwgTlVMTCk7CiAgICAgfQogCiAgICAgbUhhbmRsZXJzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwpAQCAtODAsNyArNzksOCBAQAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgICAgICBmb3IgKHNpemVfdCBpID0gbUhhbmRsZXJzLnNpemUoKTsgaS0tID4gMDspIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IG1IYW5kbGVycy5zaXplKCk7IGkgPiAwOykgeworICAgICAgICAgICAgaS0tOwogICAgICAgICAgICAgY29uc3QgSGFuZGxlckluZm8gJmluZm8gPSBtSGFuZGxlcnMudmFsdWVBdChpKTsKIAogICAgICAgICAgICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gaW5mby5tTG9vcGVyLnByb21vdGUoKTsKQEAgLTEwMCwxMTYgKzEwMCw2IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBTG9vcGVyUm9zdGVyOjpwb3N0TWVzc2FnZSgKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDY0X3QgZGVsYXlVcykgewotCi0gICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gZmluZExvb3Blcihtc2ctPnRhcmdldCgpKTsKLQotICAgIGlmIChsb29wZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0gICAgbG9vcGVyLT5wb3N0KG1zZywgZGVsYXlVcyk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIEFMb29wZXJSb3N0ZXI6OmRlbGl2ZXJNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgc3A8QUhhbmRsZXI+IGhhbmRsZXI7Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAgICAgc3NpemVfdCBpbmRleCA9IG1IYW5kbGVycy5pbmRleE9mS2V5KG1zZy0+dGFyZ2V0KCkpOwotCi0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gZGVsaXZlciBtZXNzYWdlLiBUYXJnZXQgaGFuZGxlciBub3QgcmVnaXN0ZXJlZC4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IEhhbmRsZXJJbmZvICZpbmZvID0gbUhhbmRsZXJzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICBoYW5kbGVyID0gaW5mby5tSGFuZGxlci5wcm9tb3RlKCk7Ci0KLSAgICAgICAgaWYgKGhhbmRsZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byBkZWxpdmVyIG1lc3NhZ2UuICIKLSAgICAgICAgICAgICAgICAgIlRhcmdldCBoYW5kbGVyICVkIHJlZ2lzdGVyZWQsIGJ1dCBvYmplY3QgZ29uZS4iLAotICAgICAgICAgICAgICAgICBtc2ctPnRhcmdldCgpKTsKLQotICAgICAgICAgICAgbUhhbmRsZXJzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaGFuZGxlci0+b25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKLSAgICBoYW5kbGVyLT5tTWVzc2FnZUNvdW50ZXIrKzsKLQotICAgIGlmICh2ZXJib3NlU3RhdHMpIHsKLSAgICAgICAgdWludDMyX3Qgd2hhdCA9IG1zZy0+d2hhdCgpOwotICAgICAgICBzc2l6ZV90IGlkeCA9IGhhbmRsZXItPm1NZXNzYWdlcy5pbmRleE9mS2V5KHdoYXQpOwotICAgICAgICBpZiAoaWR4IDwgMCkgewotICAgICAgICAgICAgaGFuZGxlci0+bU1lc3NhZ2VzLmFkZCh3aGF0LCAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGhhbmRsZXItPm1NZXNzYWdlcy5lZGl0VmFsdWVBdChpZHgpKys7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXNwPEFMb29wZXI+IEFMb29wZXJSb3N0ZXI6OmZpbmRMb29wZXIoQUxvb3Blcjo6aGFuZGxlcl9pZCBoYW5kbGVySUQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1IYW5kbGVycy5pbmRleE9mS2V5KGhhbmRsZXJJRCk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IG1IYW5kbGVycy52YWx1ZUF0KGluZGV4KS5tTG9vcGVyLnByb21vdGUoKTsKLQotICAgIGlmIChsb29wZXIgPT0gTlVMTCkgewotICAgICAgICBtSGFuZGxlcnMucmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBsb29wZXI7Ci19Ci0KLXN0YXR1c190IEFMb29wZXJSb3N0ZXI6OnBvc3RBbmRBd2FpdFJlc3BvbnNlKAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgc3A8QU1lc3NhZ2U+ICpyZXNwb25zZSkgewotICAgIHNwPEFMb29wZXI+IGxvb3BlciA9IGZpbmRMb29wZXIobXNnLT50YXJnZXQoKSk7Ci0KLSAgICBpZiAobG9vcGVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImZhaWxlZCB0byBwb3N0IG1lc3NhZ2UuICIKLSAgICAgICAgICAgICAgICAiVGFyZ2V0IGhhbmRsZXIgJWQgc3RpbGwgcmVnaXN0ZXJlZCwgYnV0IG9iamVjdCBnb25lLiIsCi0gICAgICAgICAgICAgICAgbXNnLT50YXJnZXQoKSk7Ci0gICAgICAgIHJlc3BvbnNlLT5jbGVhcigpOwotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgdWludDMyX3QgcmVwbHlJRCA9IG1OZXh0UmVwbHlJRCsrOwotCi0gICAgbXNnLT5zZXRJbnQzMigicmVwbHlJRCIsIHJlcGx5SUQpOwotCi0gICAgbG9vcGVyLT5wb3N0KG1zZywgMCAvKiBkZWxheVVzICovKTsKLQotICAgIHNzaXplX3QgaW5kZXg7Ci0gICAgd2hpbGUgKChpbmRleCA9IG1SZXBsaWVzLmluZGV4T2ZLZXkocmVwbHlJRCkpIDwgMCkgewotICAgICAgICBtUmVwbGllc0NvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICAqcmVzcG9uc2UgPSBtUmVwbGllcy52YWx1ZUF0KGluZGV4KTsKLSAgICBtUmVwbGllcy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBBTG9vcGVyUm9zdGVyOjpwb3N0UmVwbHkodWludDMyX3QgcmVwbHlJRCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBDSEVDSyhtUmVwbGllcy5pbmRleE9mS2V5KHJlcGx5SUQpIDwgMCk7Ci0gICAgbVJlcGxpZXMuYWRkKHJlcGx5SUQsIHJlcGx5KTsKLSAgICBtUmVwbGllc0NvbmRpdGlvbi5icm9hZGNhc3QoKTsKLX0KLQogc3RhdGljIHZvaWQgbWFrZUZvdXJDQyh1aW50MzJfdCBmb3VyY2MsIGNoYXIgKnMpIHsKICAgICBzWzBdID0gKGZvdXJjYyA+PiAyNCkgJiAweGZmOwogICAgIGlmIChzWzBdKSB7CkBAIC0yMjUsNyArMTE1LDcgQEAKIHZvaWQgQUxvb3BlclJvc3Rlcjo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKICAgICBib29sIGNsZWFyID0gZmFsc2U7CiAgICAgYm9vbCBvbGRWZXJib3NlID0gdmVyYm9zZVN0YXRzOwotICAgIGZvciAoc2l6ZV90IGkgPSAwO2kgPCBhcmdzLnNpemUoKTsgaSsrKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGlmIChhcmdzW2ldID09IFN0cmluZzE2KCItYyIpKSB7CiAgICAgICAgICAgICBjbGVhciA9IHRydWU7CiAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1tpXSA9PSBTdHJpbmcxNigiLXZvbiIpKSB7CkBAIC0yNDEsMjIgKzEzMSwyMyBAQAogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICBzaXplX3QgbiA9IG1IYW5kbGVycy5zaXplKCk7Ci0gICAgcy5hcHBlbmRGb3JtYXQoIiAlemQgcmVnaXN0ZXJlZCBoYW5kbGVyczpcbiIsIG4pOworICAgIHMuYXBwZW5kRm9ybWF0KCIgJXp1IHJlZ2lzdGVyZWQgaGFuZGxlcnM6XG4iLCBuKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgIHMuYXBwZW5kRm9ybWF0KCIgICV6ZDogIiwgaSk7CisgICAgICAgIHMuYXBwZW5kRm9ybWF0KCIgICVkOiAiLCBtSGFuZGxlcnMua2V5QXQoaSkpOwogICAgICAgICBIYW5kbGVySW5mbyAmaW5mbyA9IG1IYW5kbGVycy5lZGl0VmFsdWVBdChpKTsKICAgICAgICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gaW5mby5tTG9vcGVyLnByb21vdGUoKTsKICAgICAgICAgaWYgKGxvb3BlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzLmFwcGVuZChsb29wZXItPm1OYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcy5hcHBlbmQobG9vcGVyLT5nZXROYW1lKCkpOwogICAgICAgICAgICAgc3A8QUhhbmRsZXI+IGhhbmRsZXIgPSBpbmZvLm1IYW5kbGVyLnByb21vdGUoKTsKICAgICAgICAgICAgIGlmIChoYW5kbGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVyLT5tVmVyYm9zZVN0YXRzID0gdmVyYm9zZVN0YXRzOwogICAgICAgICAgICAgICAgIHMuYXBwZW5kRm9ybWF0KCI6ICV1IG1lc3NhZ2VzIHByb2Nlc3NlZCIsIGhhbmRsZXItPm1NZXNzYWdlQ291bnRlcik7CiAgICAgICAgICAgICAgICAgaWYgKHZlcmJvc2VTdGF0cykgewogICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGhhbmRsZXItPm1NZXNzYWdlcy5zaXplKCk7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmb3VyY2NbMTVdOwogICAgICAgICAgICAgICAgICAgICAgICAgbWFrZUZvdXJDQyhoYW5kbGVyLT5tTWVzc2FnZXMua2V5QXQoaiksIGZvdXJjYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzLmFwcGVuZEZvcm1hdCgiXG4gICAgJXM6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHMuYXBwZW5kRm9ybWF0KCJcbiAgICAlczogJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VyY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXItPm1NZXNzYWdlcy52YWx1ZUF0KGopKTsKICAgICAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcAppbmRleCA0OTQyYmE3Li43MjVhNTc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmNwcApAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgIkFCdWZmZXIuaCIKICNpbmNsdWRlICJBRGVidWcuaCIKICNpbmNsdWRlICJBTG9vcGVyUm9zdGVyLmgiCisjaW5jbHVkZSAiQUhhbmRsZXIuaCIKICNpbmNsdWRlICJBU3RyaW5nLmgiCiAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CkBAIC0zNiwxMiArMzcsMjkgQEAKIAogZXh0ZXJuIEFMb29wZXJSb3N0ZXIgZ0xvb3BlclJvc3RlcjsKIAotQU1lc3NhZ2U6OkFNZXNzYWdlKHVpbnQzMl90IHdoYXQsIEFMb29wZXI6OmhhbmRsZXJfaWQgdGFyZ2V0KQotICAgIDogbVdoYXQod2hhdCksCi0gICAgICBtVGFyZ2V0KHRhcmdldCksCitzdGF0dXNfdCBBUmVwbHlUb2tlbjo6c2V0UmVwbHkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSkgeworICAgIGlmIChtUmVwbGllZCkgeworICAgICAgICBBTE9HRSgidHJ5aW5nIHRvIHBvc3QgYSBkdXBsaWNhdGUgcmVwbHkiKTsKKyAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICB9CisgICAgQ0hFQ0sobVJlcGx5ID09IE5VTEwpOworICAgIG1SZXBseSA9IHJlcGx5OworICAgIG1SZXBsaWVkID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK0FNZXNzYWdlOjpBTWVzc2FnZSh2b2lkKQorICAgIDogbVdoYXQoMCksCisgICAgICBtVGFyZ2V0KDApLAogICAgICAgbU51bUl0ZW1zKDApIHsKIH0KIAorQU1lc3NhZ2U6OkFNZXNzYWdlKHVpbnQzMl90IHdoYXQsIGNvbnN0IHNwPGNvbnN0IEFIYW5kbGVyPiAmaGFuZGxlcikKKyAgICA6IG1XaGF0KHdoYXQpLAorICAgICAgbU51bUl0ZW1zKDApIHsKKyAgICBzZXRUYXJnZXQoaGFuZGxlcik7Cit9CisKIEFNZXNzYWdlOjp+QU1lc3NhZ2UoKSB7CiAgICAgY2xlYXIoKTsKIH0KQEAgLTU0LDEyICs3MiwxNiBAQAogICAgIHJldHVybiBtV2hhdDsKIH0KIAotdm9pZCBBTWVzc2FnZTo6c2V0VGFyZ2V0KEFMb29wZXI6OmhhbmRsZXJfaWQgaGFuZGxlcklEKSB7Ci0gICAgbVRhcmdldCA9IGhhbmRsZXJJRDsKLX0KLQotQUxvb3Blcjo6aGFuZGxlcl9pZCBBTWVzc2FnZTo6dGFyZ2V0KCkgY29uc3QgewotICAgIHJldHVybiBtVGFyZ2V0Owordm9pZCBBTWVzc2FnZTo6c2V0VGFyZ2V0KGNvbnN0IHNwPGNvbnN0IEFIYW5kbGVyPiAmaGFuZGxlcikgeworICAgIGlmIChoYW5kbGVyID09IE5VTEwpIHsKKyAgICAgICAgbVRhcmdldCA9IDA7CisgICAgICAgIG1IYW5kbGVyLmNsZWFyKCk7CisgICAgICAgIG1Mb29wZXIuY2xlYXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtVGFyZ2V0ID0gaGFuZGxlci0+aWQoKTsKKyAgICAgICAgbUhhbmRsZXIgPSBoYW5kbGVyLT5nZXRIYW5kbGVyKCk7CisgICAgICAgIG1Mb29wZXIgPSBoYW5kbGVyLT5nZXRMb29wZXIoKTsKKyAgICB9CiB9CiAKIHZvaWQgQU1lc3NhZ2U6OmNsZWFyKCkgewpAQCAtMzIyLDMzICszNDQsNzYgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBBTWVzc2FnZTo6cG9zdChpbnQ2NF90IGRlbGF5VXMpIHsKLSAgICBnTG9vcGVyUm9zdGVyLnBvc3RNZXNzYWdlKHRoaXMsIGRlbGF5VXMpOwordm9pZCBBTWVzc2FnZTo6ZGVsaXZlcigpIHsKKyAgICBzcDxBSGFuZGxlcj4gaGFuZGxlciA9IG1IYW5kbGVyLnByb21vdGUoKTsKKyAgICBpZiAoaGFuZGxlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gZGVsaXZlciBtZXNzYWdlIGFzIHRhcmdldCBoYW5kbGVyICVkIGlzIGdvbmUuIiwgbVRhcmdldCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBoYW5kbGVyLT5kZWxpdmVyTWVzc2FnZSh0aGlzKTsKK30KKworc3RhdHVzX3QgQU1lc3NhZ2U6OnBvc3QoaW50NjRfdCBkZWxheVVzKSB7CisgICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gbUxvb3Blci5wcm9tb3RlKCk7CisgICAgaWYgKGxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gcG9zdCBtZXNzYWdlIGFzIHRhcmdldCBsb29wZXIgZm9yIGhhbmRsZXIgJWQgaXMgZ29uZS4iLCBtVGFyZ2V0KTsKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorCisgICAgbG9vcGVyLT5wb3N0KHRoaXMsIGRlbGF5VXMpOworICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQU1lc3NhZ2U6OnBvc3RBbmRBd2FpdFJlc3BvbnNlKHNwPEFNZXNzYWdlPiAqcmVzcG9uc2UpIHsKLSAgICByZXR1cm4gZ0xvb3BlclJvc3Rlci5wb3N0QW5kQXdhaXRSZXNwb25zZSh0aGlzLCByZXNwb25zZSk7CisgICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gbUxvb3Blci5wcm9tb3RlKCk7CisgICAgaWYgKGxvb3BlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gcG9zdCBtZXNzYWdlIGFzIHRhcmdldCBsb29wZXIgZm9yIGhhbmRsZXIgJWQgaXMgZ29uZS4iLCBtVGFyZ2V0KTsKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorCisgICAgc3A8QVJlcGx5VG9rZW4+IHRva2VuID0gbG9vcGVyLT5jcmVhdGVSZXBseVRva2VuKCk7CisgICAgaWYgKHRva2VuID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBjcmVhdGUgcmVwbHkgdG9rZW4iKTsKKyAgICAgICAgcmV0dXJuIC1FTk9NRU07CisgICAgfQorICAgIHNldE9iamVjdCgicmVwbHlJRCIsIHRva2VuKTsKKworICAgIGxvb3Blci0+cG9zdCh0aGlzLCAwIC8qIGRlbGF5VXMgKi8pOworICAgIHJldHVybiBsb29wZXItPmF3YWl0UmVzcG9uc2UodG9rZW4sIHJlc3BvbnNlKTsKIH0KIAotdm9pZCBBTWVzc2FnZTo6cG9zdFJlcGx5KHVpbnQzMl90IHJlcGx5SUQpIHsKLSAgICBnTG9vcGVyUm9zdGVyLnBvc3RSZXBseShyZXBseUlELCB0aGlzKTsKK3N0YXR1c190IEFNZXNzYWdlOjpwb3N0UmVwbHkoY29uc3Qgc3A8QVJlcGx5VG9rZW4+ICZyZXBseVRva2VuKSB7CisgICAgaWYgKHJlcGx5VG9rZW4gPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiZmFpbGVkIHRvIHBvc3QgcmVwbHkgdG8gYSBOVUxMIHRva2VuIik7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKyAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSByZXBseVRva2VuLT5nZXRMb29wZXIoKTsKKyAgICBpZiAobG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImZhaWxlZCB0byBwb3N0IHJlcGx5IGFzIHRhcmdldCBsb29wZXIgaXMgZ29uZS4iKTsKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorICAgIHJldHVybiBsb29wZXItPnBvc3RSZXBseShyZXBseVRva2VuLCB0aGlzKTsKIH0KIAotYm9vbCBBTWVzc2FnZTo6c2VuZGVyQXdhaXRzUmVzcG9uc2UodWludDMyX3QgKnJlcGx5SUQpIGNvbnN0IHsKLSAgICBpbnQzMl90IHRtcDsKLSAgICBib29sIGZvdW5kID0gZmluZEludDMyKCJyZXBseUlEIiwgJnRtcCk7Citib29sIEFNZXNzYWdlOjpzZW5kZXJBd2FpdHNSZXNwb25zZShzcDxBUmVwbHlUb2tlbj4gKnJlcGx5VG9rZW4pIHsKKyAgICBzcDxSZWZCYXNlPiB0bXA7CisgICAgYm9vbCBmb3VuZCA9IGZpbmRPYmplY3QoInJlcGx5SUQiLCAmdG1wKTsKIAogICAgIGlmICghZm91bmQpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgICpyZXBseUlEID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHRtcCk7CisgICAgKnJlcGx5VG9rZW4gPSBzdGF0aWNfY2FzdDxBUmVwbHlUb2tlbiAqPih0bXAuZ2V0KCkpOworICAgIHRtcC5jbGVhcigpOworICAgIHNldE9iamVjdCgicmVwbHlJRCIsIHRtcCk7CisgICAgLy8gVE9ETzogZGVsZXRlIE9iamVjdCBpbnN0ZWFkIG9mIHNldHRpbmcgaXQgdG8gTlVMTAogCi0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuICpyZXBseVRva2VuICE9IE5VTEw7CiB9CiAKIHNwPEFNZXNzYWdlPiBBTWVzc2FnZTo6ZHVwKCkgY29uc3QgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UobVdoYXQsIG1UYXJnZXQpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UobVdoYXQsIG1IYW5kbGVyLnByb21vdGUoKSk7CiAgICAgbXNnLT5tTnVtSXRlbXMgPSBtTnVtSXRlbXM7CiAKICNpZmRlZiBEVU1QX1NUQVRTCkBAIC01MzIsNyArNTk3LDggQEAKIC8vIHN0YXRpYwogc3A8QU1lc3NhZ2U+IEFNZXNzYWdlOjpGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKSB7CiAgICAgaW50MzJfdCB3aGF0ID0gcGFyY2VsLnJlYWRJbnQzMigpOwotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uod2hhdCk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOworICAgIG1zZy0+c2V0V2hhdCh3aGF0KTsKIAogICAgIG1zZy0+bU51bUl0ZW1zID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwucmVhZEludDMyKCkpOwogICAgIGlmIChtc2ctPm1OdW1JdGVtcyA+IGtNYXhOdW1JdGVtcykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLm1rCmluZGV4IDA4MzU1YzcuLmM2ODI2NGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQubWsKQEAgLTI5LDcgKzI5LDggQEAKICAgICAgICAgbGlibG9nICAgICAgICAgICAgXAogICAgICAgICBsaWJwb3dlcm1hbmFnZXIKIAotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCiAKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLm1rCmluZGV4IDdmMzMwN2QuLjVmYjUxYzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0FuZHJvaWQubWsKQEAgLTIxLDcgKzIxLDggQEAKIAogTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCiAKLUxPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcAppbmRleCBiYjg5NTY3Li44MDFmZjI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwCkBAIC0zMCwxMiArMzAsMTEgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogTWVkaWFIVFRQOjpNZWRpYUhUVFAoY29uc3Qgc3A8SU1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKQotICAgIDogbUluaXRDaGVjayhOT19JTklUKSwKKyAgICA6IG1Jbml0Q2hlY2soKGNvbm4gIT0gTlVMTCkgPyBPSyA6IE5PX0lOSVQpLAogICAgICAgbUhUVFBDb25uZWN0aW9uKGNvbm4pLAogICAgICAgbUNhY2hlZFNpemVWYWxpZChmYWxzZSksCiAgICAgICBtQ2FjaGVkU2l6ZSgwbGwpLAogICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCkgewotICAgIG1Jbml0Q2hlY2sgPSBPSzsKIH0KIAogTWVkaWFIVFRQOjp+TWVkaWFIVFRQKCkgewpAQCAtNTQsNyArNTMsMTAgQEAKICAgICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7CiAgICAgICAgIGV4dEhlYWRlcnMgPSAqaGVhZGVyczsKICAgICB9Ci0gICAgZXh0SGVhZGVycy5hZGQoU3RyaW5nOCgiVXNlci1BZ2VudCIpLCBTdHJpbmc4KE1ha2VVc2VyQWdlbnQoKS5jX3N0cigpKSk7CisKKyAgICBpZiAoZXh0SGVhZGVycy5pbmRleE9mS2V5KFN0cmluZzgoIlVzZXItQWdlbnQiKSkgPCAwKSB7CisgICAgICAgIGV4dEhlYWRlcnMuYWRkKFN0cmluZzgoIlVzZXItQWdlbnQiKSwgU3RyaW5nOChNYWtlVXNlckFnZW50KCkuY19zdHIoKSkpOworICAgIH0KIAogICAgIGJvb2wgc3VjY2VzcyA9IG1IVFRQQ29ubmVjdGlvbi0+Y29ubmVjdCh1cmksICZleHRIZWFkZXJzKTsKIApAQCAtMTcxLDYgKzE3MywxMCBAQAogfQogCiBTdHJpbmc4IE1lZGlhSFRUUDo6Z2V0VXJpKCkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4OjplbXB0eSgpOworICAgIH0KKwogICAgIFN0cmluZzggdXJpOwogICAgIGlmIChPSyA9PSBtSFRUUENvbm5lY3Rpb24tPmdldFVyaSgmdXJpKSkgewogICAgICAgICByZXR1cm4gdXJpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQubWsKaW5kZXggOTNiNzkzNS4uZmM4NTgzNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLm1rCkBAIC0zLDYgKzMsNyBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAorICAgICAgICBIVFRQRG93bmxvYWRlci5jcHAgICAgICBcCiAgICAgICAgIExpdmVEYXRhU291cmNlLmNwcCAgICAgIFwKICAgICAgICAgTGl2ZVNlc3Npb24uY3BwICAgICAgICAgXAogICAgICAgICBNM1VQYXJzZXIuY3BwICAgICAgICAgICBcCkBAIC0xMiw3ICsxMyw4IEBACiAJJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgKIAotTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJiaW5kZXIgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNDRiYWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5jcHAKQEAgLTAsMCArMSwyNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSFRUUERvd25sb2FkZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJIVFRQRG93bmxvYWRlci5oIgorI2luY2x1ZGUgIk0zVVBhcnNlci5oIgorCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgorI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitIVFRQRG93bmxvYWRlcjo6SFRUUERvd25sb2FkZXIoCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICZoZWFkZXJzKSA6CisgICAgbUhUVFBEYXRhU291cmNlKG5ldyBNZWRpYUhUVFAoaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpKSksCisgICAgbUV4dHJhSGVhZGVycyhoZWFkZXJzKSwKKyAgICBtRGlzY29ubmVjdGluZyhmYWxzZSkgeworfQorCit2b2lkIEhUVFBEb3dubG9hZGVyOjpyZWNvbm5lY3QoKSB7CisgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKKyAgICBtRGlzY29ubmVjdGluZyA9IGZhbHNlOworfQorCit2b2lkIEhUVFBEb3dubG9hZGVyOjpkaXNjb25uZWN0KCkgeworICAgIHsKKyAgICAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKKyAgICAgICAgbURpc2Nvbm5lY3RpbmcgPSB0cnVlOworICAgIH0KKyAgICBtSFRUUERhdGFTb3VyY2UtPmRpc2Nvbm5lY3QoKTsKK30KKworYm9vbCBIVFRQRG93bmxvYWRlcjo6aXNEaXNjb25uZWN0aW5nKCkgeworICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisgICAgcmV0dXJuIG1EaXNjb25uZWN0aW5nOworfQorCisvKgorICogSWxsdXN0cmF0aW9uIG9mIHBhcmFtZXRlcnM6CisgKgorICogMCAgICAgIGByYW5nZV9vZmZzZXRgCisgKiArLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0rLS0rCisgKiB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbmV4dCBibG9jayB0byBmZXRjaCB8ICB8ICB8CisgKiB8ICAgICAgICAgICAgfCBgc291cmNlYCBoYW5kbGUgPT4gYG91dGAgYnVmZmVyIHwgICAgICAgICAgICAgICAgICAgICB8ICB8ICB8CisgKiB8IGB1cmxgIGZpbGUgfDwtLS0tLS0tLS0gYnVmZmVyIHNpemUgLS0tLS0tLS0tPnw8LS0tIGBibG9ja19zaXplYCAtLT58ICB8ICB8CisgKiB8ICAgICAgICAgICAgfDwtLS0tLS0tLS0tLSBgcmFuZ2VfbGVuZ3RoYCAvIGJ1ZmZlciBjYXBhY2l0eSAtLS0tLS0tLS0tLT58ICB8CisgKiB8PC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBmaWxlX3NpemUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT58CisgKgorICogU3BlY2lhbCBwYXJhbWV0ZXIgdmFsdWVzOgorICogLSByYW5nZV9sZW5ndGggPT0gLTEgbWVhbnMgZW50aXJlIGZpbGUKKyAqIC0gYmxvY2tfc2l6ZSA9PSAwIG1lYW5zIGVudGlyZSByYW5nZQorICoKKyAqLworc3NpemVfdCBIVFRQRG93bmxvYWRlcjo6ZmV0Y2hCbG9jaygKKyAgICAgICAgY29uc3QgY2hhciAqdXJsLCBzcDxBQnVmZmVyPiAqb3V0LAorICAgICAgICBpbnQ2NF90IHJhbmdlX29mZnNldCwgaW50NjRfdCByYW5nZV9sZW5ndGgsCisgICAgICAgIHVpbnQzMl90IGJsb2NrX3NpemUsIC8qIGRvd25sb2FkIGJsb2NrIHNpemUgKi8KKyAgICAgICAgU3RyaW5nOCAqYWN0dWFsVXJsLAorICAgICAgICBib29sIHJlY29ubmVjdCAvKiBmb3JjZSBjb25uZWN0IEhUVFAgd2hlbiByZXN1aW5nIHNvdXJjZSAqLykgeworICAgIGlmIChpc0Rpc2Nvbm5lY3RpbmcoKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTk9UX0NPTk5FQ1RFRDsKKyAgICB9CisKKyAgICBvZmY2NF90IHNpemU7CisKKyAgICBpZiAocmVjb25uZWN0KSB7CisgICAgICAgIGlmICghc3RybmNhc2VjbXAodXJsLCAiZmlsZTovLyIsIDcpKSB7CisgICAgICAgICAgICBtRGF0YVNvdXJjZSA9IG5ldyBGaWxlU291cmNlKHVybCArIDcpOworICAgICAgICB9IGVsc2UgaWYgKHN0cm5jYXNlY21wKHVybCwgImh0dHA6Ly8iLCA3KQorICAgICAgICAgICAgICAgICYmIHN0cm5jYXNlY21wKHVybCwgImh0dHBzOi8vIiwgOCkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGhlYWRlcnMgPSBtRXh0cmFIZWFkZXJzOworICAgICAgICAgICAgaWYgKHJhbmdlX29mZnNldCA+IDAgfHwgcmFuZ2VfbGVuZ3RoID49IDApIHsKKyAgICAgICAgICAgICAgICBoZWFkZXJzLmFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIlJhbmdlIiksCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlcz0lbGxkLSVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Vfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9sZW5ndGggPCAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICIiIDogQVN0cmluZ1ByaW50ZigiJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlX29mZnNldCArIHJhbmdlX2xlbmd0aCAtIDEpLmNfc3RyKCkpLmNfc3RyKCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUhUVFBEYXRhU291cmNlLT5jb25uZWN0KHVybCwgJmhlYWRlcnMpOworCisgICAgICAgICAgICBpZiAoaXNEaXNjb25uZWN0aW5nKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTk9UX0NPTk5FQ1RFRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1EYXRhU291cmNlID0gbUhUVFBEYXRhU291cmNlOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzX3QgZ2V0U2l6ZUVyciA9IG1EYXRhU291cmNlLT5nZXRTaXplKCZzaXplKTsKKworICAgIGlmIChpc0Rpc2Nvbm5lY3RpbmcoKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTk9UX0NPTk5FQ1RFRDsKKyAgICB9CisKKyAgICBpZiAoZ2V0U2l6ZUVyciAhPSBPSykgeworICAgICAgICBzaXplID0gNjU1MzY7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gKm91dCAhPSBOVUxMID8gKm91dCA6IG5ldyBBQnVmZmVyKHNpemUpOworICAgIGlmICgqb3V0ID09IE5VTEwpIHsKKyAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKyAgICB9CisKKyAgICBzc2l6ZV90IGJ5dGVzUmVhZCA9IDA7CisgICAgLy8gYWRqdXN0IHJhbmdlX2xlbmd0aCBpZiBvbmx5IHJlYWRpbmcgcGFydGlhbCBibG9jaworICAgIGlmIChibG9ja19zaXplID4gMCAmJiAocmFuZ2VfbGVuZ3RoID09IC0xIHx8IChpbnQ2NF90KShidWZmZXItPnNpemUoKSArIGJsb2NrX3NpemUpIDwgcmFuZ2VfbGVuZ3RoKSkgeworICAgICAgICByYW5nZV9sZW5ndGggPSBidWZmZXItPnNpemUoKSArIGJsb2NrX3NpemU7CisgICAgfQorICAgIGZvciAoOzspIHsKKyAgICAgICAgLy8gT25seSByZXNpemUgd2hlbiB3ZSBkb24ndCBrbm93IHRoZSBzaXplLgorICAgICAgICBzaXplX3QgYnVmZmVyUmVtYWluaW5nID0gYnVmZmVyLT5jYXBhY2l0eSgpIC0gYnVmZmVyLT5zaXplKCk7CisgICAgICAgIGlmIChidWZmZXJSZW1haW5pbmcgPT0gMCAmJiBnZXRTaXplRXJyICE9IE9LKSB7CisgICAgICAgICAgICBzaXplX3QgYnVmZmVySW5jcmVtZW50ID0gYnVmZmVyLT5zaXplKCkgLyAyOworICAgICAgICAgICAgaWYgKGJ1ZmZlckluY3JlbWVudCA8IDMyNzY4KSB7CisgICAgICAgICAgICAgICAgYnVmZmVySW5jcmVtZW50ID0gMzI3Njg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJSZW1haW5pbmcgPSBidWZmZXJJbmNyZW1lbnQ7CisKKyAgICAgICAgICAgIEFMT0dWKCJpbmNyZWFzaW5nIGRvd25sb2FkIGJ1ZmZlciB0byAlenUgYnl0ZXMiLAorICAgICAgICAgICAgICAgICBidWZmZXItPnNpemUoKSArIGJ1ZmZlclJlbWFpbmluZyk7CisKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNvcHkgPSBuZXcgQUJ1ZmZlcihidWZmZXItPnNpemUoKSArIGJ1ZmZlclJlbWFpbmluZyk7CisgICAgICAgICAgICBtZW1jcHkoY29weS0+ZGF0YSgpLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworICAgICAgICAgICAgY29weS0+c2V0UmFuZ2UoMCwgYnVmZmVyLT5zaXplKCkpOworCisgICAgICAgICAgICBidWZmZXIgPSBjb3B5OworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG1heEJ5dGVzVG9SZWFkID0gYnVmZmVyUmVtYWluaW5nOworICAgICAgICBpZiAocmFuZ2VfbGVuZ3RoID49IDApIHsKKyAgICAgICAgICAgIGludDY0X3QgYnl0ZXNMZWZ0SW5SYW5nZSA9IHJhbmdlX2xlbmd0aCAtIGJ1ZmZlci0+c2l6ZSgpOworICAgICAgICAgICAgaWYgKGJ5dGVzTGVmdEluUmFuZ2UgPCAoaW50NjRfdCltYXhCeXRlc1RvUmVhZCkgeworICAgICAgICAgICAgICAgIG1heEJ5dGVzVG9SZWFkID0gYnl0ZXNMZWZ0SW5SYW5nZTsKKworICAgICAgICAgICAgICAgIGlmIChieXRlc0xlZnRJblJhbmdlID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIERhdGFTb3VyY2UgaXMgcmVzcG9uc2libGUgZm9yIGluZm9ybWluZyB1cyBvZiBlcnJvciAobiA8IDApIG9yIGVvZiAobiA9PSAwKQorICAgICAgICAvLyB0byBoZWxwIHVzIGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KKyAgICAgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICBidWZmZXItPnNpemUoKSwgYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnNpemUoKSwKKyAgICAgICAgICAgICAgICBtYXhCeXRlc1RvUmVhZCk7CisKKyAgICAgICAgaWYgKGlzRGlzY29ubmVjdGluZygpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTk9UX0NPTk5FQ1RFRDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0KKworICAgICAgICBpZiAobiA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgYnVmZmVyLT5zaXplKCkgKyAoc2l6ZV90KW4pOworICAgICAgICBieXRlc1JlYWQgKz0gbjsKKyAgICB9CisKKyAgICAqb3V0ID0gYnVmZmVyOworICAgIGlmIChhY3R1YWxVcmwgIT0gTlVMTCkgeworICAgICAgICAqYWN0dWFsVXJsID0gbURhdGFTb3VyY2UtPmdldFVyaSgpOworICAgICAgICBpZiAoYWN0dWFsVXJsLT5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICphY3R1YWxVcmwgPSB1cmw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYnl0ZXNSZWFkOworfQorCitzc2l6ZV90IEhUVFBEb3dubG9hZGVyOjpmZXRjaEZpbGUoCisgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgc3A8QUJ1ZmZlcj4gKm91dCwgU3RyaW5nOCAqYWN0dWFsVXJsKSB7CisgICAgc3NpemVfdCBlcnIgPSBmZXRjaEJsb2NrKHVybCwgb3V0LCAwLCAtMSwgMCwgYWN0dWFsVXJsLCB0cnVlIC8qIHJlY29ubmVjdCAqLyk7CisKKyAgICAvLyBjbG9zZSBvZmYgdGhlIGNvbm5lY3Rpb24gYWZ0ZXIgdXNlCisgICAgbUhUVFBEYXRhU291cmNlLT5kaXNjb25uZWN0KCk7CisKKyAgICByZXR1cm4gZXJyOworfQorCitzcDxNM1VQYXJzZXI+IEhUVFBEb3dubG9hZGVyOjpmZXRjaFBsYXlsaXN0KAorICAgICAgICBjb25zdCBjaGFyICp1cmwsIHVpbnQ4X3QgKmN1clBsYXlsaXN0SGFzaCwgYm9vbCAqdW5jaGFuZ2VkKSB7CisgICAgQUxPR1YoImZldGNoUGxheWxpc3QgJyVzJyIsIHVybCk7CisKKyAgICAqdW5jaGFuZ2VkID0gZmFsc2U7CisKKyAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgU3RyaW5nOCBhY3R1YWxVcmw7CisgICAgc3NpemVfdCBlcnIgPSBmZXRjaEZpbGUodXJsLCAmYnVmZmVyLCAmYWN0dWFsVXJsKTsKKworICAgIC8vIGNsb3NlIG9mZiB0aGUgY29ubmVjdGlvbiBhZnRlciB1c2UKKyAgICBtSFRUUERhdGFTb3VyY2UtPmRpc2Nvbm5lY3QoKTsKKworICAgIGlmIChlcnIgPD0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBNRDUgZnVuY3Rpb25hbGl0eSBpcyBub3QgYXZhaWxhYmxlIG9uIHRoZSBzaW11bGF0b3IsIHRyZWF0IGFsbAorICAgIC8vIHBsYXlsaXN0cyBhcyBjaGFuZ2VkLgorCisjaWYgZGVmaW5lZChIQVZFX0FORFJPSURfT1MpCisgICAgdWludDhfdCBoYXNoWzE2XTsKKworICAgIE1ENV9DVFggbTsKKyAgICBNRDVfSW5pdCgmbSk7CisgICAgTUQ1X1VwZGF0ZSgmbSwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKworICAgIE1ENV9GaW5hbChoYXNoLCAmbSk7CisKKyAgICBpZiAoY3VyUGxheWxpc3RIYXNoICE9IE5VTEwgJiYgIW1lbWNtcChoYXNoLCBjdXJQbGF5bGlzdEhhc2gsIDE2KSkgeworICAgICAgICAvLyBwbGF5bGlzdCB1bmNoYW5nZWQKKyAgICAgICAgKnVuY2hhbmdlZCA9IHRydWU7CisKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKGN1clBsYXlsaXN0SGFzaCAhPSBOVUxMKSB7CisgICAgICAgIG1lbWNweShjdXJQbGF5bGlzdEhhc2gsIGhhc2gsIHNpemVvZihoYXNoKSk7CisgICAgfQorI2VuZGlmCisKKyAgICBzcDxNM1VQYXJzZXI+IHBsYXlsaXN0ID0KKyAgICAgICAgbmV3IE0zVVBhcnNlcihhY3R1YWxVcmwuc3RyaW5nKCksIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisKKyAgICBpZiAocGxheWxpc3QtPmluaXRDaGVjaygpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcGFyc2UgLm0zdTggcGxheWxpc3QiKTsKKworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gcGxheWxpc3Q7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGI0YTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEhUVFBfRE9XTkxPQURFUl9IXworCisjZGVmaW5lIEhUVFBfRE9XTkxPQURFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBQnVmZmVyOworY2xhc3MgRGF0YVNvdXJjZTsKK3N0cnVjdCBIVFRQQmFzZTsKK3N0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKK3N0cnVjdCBNM1VQYXJzZXI7CisKK3N0cnVjdCBIVFRQRG93bmxvYWRlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBIVFRQRG93bmxvYWRlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAmaGVhZGVycyk7CisKKyAgICB2b2lkIHJlY29ubmVjdCgpOworICAgIHZvaWQgZGlzY29ubmVjdCgpOworICAgIGJvb2wgaXNEaXNjb25uZWN0aW5nKCk7CisgICAgLy8gSWYgZ2l2ZW4gYSBub24temVybyBibG9ja19zaXplIChkZWZhdWx0IDApLCBpdCBpcyB1c2VkIHRvIGNhcCB0aGUgbnVtYmVyIG9mCisgICAgLy8gYnl0ZXMgcmVhZCBpbiBmcm9tIHRoZSBEYXRhU291cmNlLiBJZiBnaXZlbiBhIG5vbi1OVUxMIGJ1ZmZlciwgbmV3IGNvbnRlbnQKKyAgICAvLyBpcyByZWFkIGludG8gdGhlIGVuZC4KKyAgICAvLworICAgIC8vIFRoZSBEYXRhU291cmNlIHdlIHJlYWQgZnJvbSBpcyByZXNwb25zaWJsZSBmb3Igc2lnbmFsaW5nIGVycm9yIG9yIEVPRiB0byBoZWxwIHVzCisgICAgLy8gYnJlYWsgb3V0IG9mIHRoZSByZWFkIGxvb3AuIFRoZSBEYXRhU291cmNlIGNhbiBiZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyLCBzbworICAgIC8vIHRoYXQgdGhlIGNhbGxlciBjYW4gcmV1c2UgaXQgZm9yIHN1YnNlcXVlbnQgZmV0Y2hlcyAod2l0aGluIHRoZSBpbml0aWFsbHkKKyAgICAvLyByZXF1ZXN0ZWQgcmFuZ2UpLgorICAgIC8vCisgICAgLy8gRm9yIHJldXNlZCBIVFRQIHNvdXJjZXMsIHRoZSBjYWxsZXIgbXVzdCBkb3dubG9hZCBhIGZpbGUgc2VxdWVudGlhbGx5IHdpdGhvdXQKKyAgICAvLyBhbnkgb3ZlcmxhcHMgb3IgZ2FwcyB0byBwcmV2ZW50IHJlY29ubmVjdGlvbi4KKyAgICBzc2l6ZV90IGZldGNoQmxvY2soCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBzcDxBQnVmZmVyPiAqb3V0LAorICAgICAgICAgICAgaW50NjRfdCByYW5nZV9vZmZzZXQsIC8qIG9wZW4gZmlsZSBhdCByYW5nZV9vZmZzZXQgKi8KKyAgICAgICAgICAgIGludDY0X3QgcmFuZ2VfbGVuZ3RoLCAvKiBvcGVuIGZpbGUgZm9yIHJhbmdlX2xlbmd0aCAoLTE6IGVudGlyZSBmaWxlKSAqLworICAgICAgICAgICAgdWludDMyX3QgYmxvY2tfc2l6ZSwgIC8qIGRvd25sb2FkIGJsb2NrIHNpemUgKDA6IGVudGlyZSByYW5nZSkgKi8KKyAgICAgICAgICAgIFN0cmluZzggKmFjdHVhbFVybCwgICAvKiByZXR1cm5zIGFjdHVhbCBVUkwgKi8KKyAgICAgICAgICAgIGJvb2wgcmVjb25uZWN0ICAgICAgICAvKiBmb3JjZSBjb25uZWN0IGh0dHAgKi8KKyAgICAgICAgICAgICk7CisKKyAgICAvLyBzaW1wbGlmaWVkIHZlcnNpb24gdG8gZmV0Y2ggYSBzaW5nbGUgZmlsZQorICAgIHNzaXplX3QgZmV0Y2hGaWxlKAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gKm91dCwKKyAgICAgICAgICAgIFN0cmluZzggKmFjdHVhbFVybCA9IE5VTEwpOworCisgICAgLy8gZmV0Y2ggYSBwbGF5bGlzdCBmaWxlCisgICAgc3A8TTNVUGFyc2VyPiBmZXRjaFBsYXlsaXN0KAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCB1aW50OF90ICpjdXJQbGF5bGlzdEhhc2gsIGJvb2wgKnVuY2hhbmdlZCk7CisKK3ByaXZhdGU6CisgICAgc3A8SFRUUEJhc2U+IG1IVFRQRGF0YVNvdXJjZTsKKyAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtRXh0cmFIZWFkZXJzOworCisgICAgTXV0ZXggbUxvY2s7CisgICAgYm9vbCBtRGlzY29ubmVjdGluZzsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEhUVFBEb3dubG9hZGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gSFRUUF9ET1dOTE9BREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKaW5kZXggZDBmM2JjMi4uMTU1NzQwMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcApAQCAtMTksMjQgKzE5LDE5IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJMaXZlU2Vzc2lvbi5oIgotCisjaW5jbHVkZSAiSFRUUERvd25sb2FkZXIuaCIKICNpbmNsdWRlICJNM1VQYXJzZXIuaCIKICNpbmNsdWRlICJQbGF5bGlzdEZldGNoZXIuaCIKIAotI2luY2x1ZGUgImluY2x1ZGUvSFRUUEJhc2UuaCIKICNpbmNsdWRlICJtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaCIKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIApAQCAtNDQsMTMgKzM5LDIzOSBAQAogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+Ci0jaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vLyBOdW1iZXIgb2YgcmVjZW50bHktcmVhZCBieXRlcyB0byB1c2UgZm9yIGJhbmR3aWR0aCBlc3RpbWF0aW9uCi1jb25zdCBzaXplX3QgTGl2ZVNlc3Npb246OmtCYW5kd2lkdGhIaXN0b3J5Qnl0ZXMgPSAyMDAgKiAxMDI0OworLy8gc3RhdGljCisvLyBCYW5kd2lkdGggU3dpdGNoIE1hcmsgRGVmYXVsdHMKK2NvbnN0IGludDY0X3QgTGl2ZVNlc3Npb246OmtVcFN3aXRjaE1hcmtVcyA9IDE1MDAwMDAwbGw7Citjb25zdCBpbnQ2NF90IExpdmVTZXNzaW9uOjprRG93blN3aXRjaE1hcmtVcyA9IDIwMDAwMDAwbGw7Citjb25zdCBpbnQ2NF90IExpdmVTZXNzaW9uOjprVXBTd2l0Y2hNYXJnaW5VcyA9IDUwMDAwMDBsbDsKK2NvbnN0IGludDY0X3QgTGl2ZVNlc3Npb246OmtSZXN1bWVUaHJlc2hvbGRVcyA9IDEwMDAwMGxsOworCisvLyBCdWZmZXIgUHJlcGFyZS9SZWFkeS9VbmRlcmZsb3cgTWFya3MKK2NvbnN0IGludDY0X3QgTGl2ZVNlc3Npb246OmtSZWFkeU1hcmtVcyA9IDUwMDAwMDBsbDsKK2NvbnN0IGludDY0X3QgTGl2ZVNlc3Npb246OmtQcmVwYXJlTWFya1VzID0gMTUwMDAwMGxsOworY29uc3QgaW50NjRfdCBMaXZlU2Vzc2lvbjo6a1VuZGVyZmxvd01hcmtVcyA9IDEwMDAwMDBsbDsKKworc3RydWN0IExpdmVTZXNzaW9uOjpCYW5kd2lkdGhFc3RpbWF0b3IgOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgQmFuZHdpZHRoRXN0aW1hdG9yKCk7CisKKyAgICB2b2lkIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KHNpemVfdCBudW1CeXRlcywgaW50NjRfdCBkZWxheVVzKTsKKyAgICBib29sIGVzdGltYXRlQmFuZHdpZHRoKAorICAgICAgICAgICAgaW50MzJfdCAqYmFuZHdpZHRoLAorICAgICAgICAgICAgYm9vbCAqaXNTdGFibGUgPSBOVUxMLAorICAgICAgICAgICAgaW50MzJfdCAqc2hvcnRUZXJtQnBzID0gTlVMTCk7CisKK3ByaXZhdGU6CisgICAgLy8gQmFuZHdpZHRoIGVzdGltYXRpb24gcGFyYW1ldGVycworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtTaG9ydFRlcm1CYW5kd2lkdGhJdGVtcyA9IDM7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga01pbkJhbmR3aWR0aEhpc3RvcnlJdGVtcyA9IDIwOworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNaW5CYW5kd2lkdGhIaXN0b3J5V2luZG93VXMgPSA1MDAwMDAwbGw7IC8vIDUgc2VjCisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01heEJhbmR3aWR0aEhpc3RvcnlXaW5kb3dVcyA9IDMwMDAwMDAwbGw7IC8vIDMwIHNlYworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhCYW5kd2lkdGhIaXN0b3J5QWdlVXMgPSA2MDAwMDAwMGxsOyAvLyA2MCBzZWMKKworICAgIHN0cnVjdCBCYW5kd2lkdGhFbnRyeSB7CisgICAgICAgIGludDY0X3QgbVRpbWVzdGFtcFVzOworICAgICAgICBpbnQ2NF90IG1EZWxheVVzOworICAgICAgICBzaXplX3QgbU51bUJ5dGVzOworICAgIH07CisKKyAgICBNdXRleCBtTG9jazsKKyAgICBMaXN0PEJhbmR3aWR0aEVudHJ5PiBtQmFuZHdpZHRoSGlzdG9yeTsKKyAgICBMaXN0PGludDMyX3Q+IG1QcmV2RXN0aW1hdGVzOworICAgIGludDMyX3QgbVNob3J0VGVybUVzdGltYXRlOworICAgIGJvb2wgbUhhc05ld1NhbXBsZTsKKyAgICBib29sIG1Jc1N0YWJsZTsKKyAgICBpbnQ2NF90IG1Ub3RhbFRyYW5zZmVyVGltZVVzOworICAgIHNpemVfdCBtVG90YWxUcmFuc2ZlckJ5dGVzOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQmFuZHdpZHRoRXN0aW1hdG9yKTsKK307CisKK0xpdmVTZXNzaW9uOjpCYW5kd2lkdGhFc3RpbWF0b3I6OkJhbmR3aWR0aEVzdGltYXRvcigpIDoKKyAgICBtU2hvcnRUZXJtRXN0aW1hdGUoMCksCisgICAgbUhhc05ld1NhbXBsZShmYWxzZSksCisgICAgbUlzU3RhYmxlKHRydWUpLAorICAgIG1Ub3RhbFRyYW5zZmVyVGltZVVzKDApLAorICAgIG1Ub3RhbFRyYW5zZmVyQnl0ZXMoMCkgeworfQorCit2b2lkIExpdmVTZXNzaW9uOjpCYW5kd2lkdGhFc3RpbWF0b3I6OmFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KAorICAgICAgICBzaXplX3QgbnVtQnl0ZXMsIGludDY0X3QgZGVsYXlVcykgeworICAgIEF1dG9NdXRleCBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBCYW5kd2lkdGhFbnRyeSBlbnRyeTsKKyAgICBlbnRyeS5tVGltZXN0YW1wVXMgPSBub3dVczsKKyAgICBlbnRyeS5tRGVsYXlVcyA9IGRlbGF5VXM7CisgICAgZW50cnkubU51bUJ5dGVzID0gbnVtQnl0ZXM7CisgICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMgKz0gZGVsYXlVczsKKyAgICBtVG90YWxUcmFuc2ZlckJ5dGVzICs9IG51bUJ5dGVzOworICAgIG1CYW5kd2lkdGhIaXN0b3J5LnB1c2hfYmFjayhlbnRyeSk7CisgICAgbUhhc05ld1NhbXBsZSA9IHRydWU7CisKKyAgICAvLyBSZW1vdmUgbm8gbW9yZSB0aGFuIDEwJSBvZiB0b3RhbCB0cmFuc2ZlciB0aW1lIGF0IGEgdGltZQorICAgIC8vIHRvIGF2b2lkIHN1ZGRlbiBqdW1wIG9uIGJhbmR3aWR0aCBlc3RpbWF0aW9uLiBUaGVyZSBtaWdodAorICAgIC8vIGJlIGxvbmcgYmxvY2tpbmcgcmVhZHMgdGhhdCB0YWtlcyB1cCBzaWduaWZpY2F0aW9uIHRpbWUsCisgICAgLy8gd2UgaGF2ZSB0byBrZWVwIGEgbG9uZ2VyIHdpbmRvdyBpbiB0aGF0IGNhc2UuCisgICAgaW50NjRfdCBiYW5kd2lkdGhIaXN0b3J5V2luZG93VXMgPSBtVG90YWxUcmFuc2ZlclRpbWVVcyAqIDkgLyAxMDsKKyAgICBpZiAoYmFuZHdpZHRoSGlzdG9yeVdpbmRvd1VzIDwga01pbkJhbmR3aWR0aEhpc3RvcnlXaW5kb3dVcykgeworICAgICAgICBiYW5kd2lkdGhIaXN0b3J5V2luZG93VXMgPSBrTWluQmFuZHdpZHRoSGlzdG9yeVdpbmRvd1VzOworICAgIH0gZWxzZSBpZiAoYmFuZHdpZHRoSGlzdG9yeVdpbmRvd1VzID4ga01heEJhbmR3aWR0aEhpc3RvcnlXaW5kb3dVcykgeworICAgICAgICBiYW5kd2lkdGhIaXN0b3J5V2luZG93VXMgPSBrTWF4QmFuZHdpZHRoSGlzdG9yeVdpbmRvd1VzOworICAgIH0KKyAgICAvLyB0cmltIG9sZCBzYW1wbGVzLCBrZWVwaW5nIGF0IGxlYXN0IGtNYXhCYW5kd2lkdGhIaXN0b3J5SXRlbXMgc2FtcGxlcywKKyAgICAvLyBhbmQgdG90YWwgdHJhbnNmZXIgdGltZSBhdCBsZWFzdCBrTWF4QmFuZHdpZHRoSGlzdG9yeVdpbmRvd1VzLgorICAgIHdoaWxlIChtQmFuZHdpZHRoSGlzdG9yeS5zaXplKCkgPiBrTWluQmFuZHdpZHRoSGlzdG9yeUl0ZW1zKSB7CisgICAgICAgIExpc3Q8QmFuZHdpZHRoRW50cnk+OjppdGVyYXRvciBpdCA9IG1CYW5kd2lkdGhIaXN0b3J5LmJlZ2luKCk7CisgICAgICAgIC8vIHJlbW92ZSBzYW1wbGUgaWYgZWl0aGVyIGFic29sdXRlIGFnZSBvciB0b3RhbCB0cmFuc2ZlciB0aW1lIGlzCisgICAgICAgIC8vIG92ZXIga01heEJhbmR3aWR0aEhpc3RvcnlXaW5kb3dVcworICAgICAgICBpZiAobm93VXMgLSBpdC0+bVRpbWVzdGFtcFVzIDwga01heEJhbmR3aWR0aEhpc3RvcnlBZ2VVcyAmJgorICAgICAgICAgICAgICAgIG1Ub3RhbFRyYW5zZmVyVGltZVVzIC0gaXQtPm1EZWxheVVzIDwgYmFuZHdpZHRoSGlzdG9yeVdpbmRvd1VzKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBtVG90YWxUcmFuc2ZlclRpbWVVcyAtPSBpdC0+bURlbGF5VXM7CisgICAgICAgIG1Ub3RhbFRyYW5zZmVyQnl0ZXMgLT0gaXQtPm1OdW1CeXRlczsKKyAgICAgICAgbUJhbmR3aWR0aEhpc3RvcnkuZXJhc2UobUJhbmR3aWR0aEhpc3RvcnkuYmVnaW4oKSk7CisgICAgfQorfQorCitib29sIExpdmVTZXNzaW9uOjpCYW5kd2lkdGhFc3RpbWF0b3I6OmVzdGltYXRlQmFuZHdpZHRoKAorICAgICAgICBpbnQzMl90ICpiYW5kd2lkdGhCcHMsIGJvb2wgKmlzU3RhYmxlLCBpbnQzMl90ICpzaG9ydFRlcm1CcHMpIHsKKyAgICBBdXRvTXV0ZXggYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1CYW5kd2lkdGhIaXN0b3J5LnNpemUoKSA8IDIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghbUhhc05ld1NhbXBsZSkgeworICAgICAgICAqYmFuZHdpZHRoQnBzID0gKigtLW1QcmV2RXN0aW1hdGVzLmVuZCgpKTsKKyAgICAgICAgaWYgKGlzU3RhYmxlKSB7CisgICAgICAgICAgICAqaXNTdGFibGUgPSBtSXNTdGFibGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNob3J0VGVybUJwcykgeworICAgICAgICAgICAgKnNob3J0VGVybUJwcyA9IG1TaG9ydFRlcm1Fc3RpbWF0ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAqYmFuZHdpZHRoQnBzID0gKChkb3VibGUpbVRvdGFsVHJhbnNmZXJCeXRlcyAqIDhFNiAvIG1Ub3RhbFRyYW5zZmVyVGltZVVzKTsKKyAgICBtUHJldkVzdGltYXRlcy5wdXNoX2JhY2soKmJhbmR3aWR0aEJwcyk7CisgICAgd2hpbGUgKG1QcmV2RXN0aW1hdGVzLnNpemUoKSA+IDMpIHsKKyAgICAgICAgbVByZXZFc3RpbWF0ZXMuZXJhc2UobVByZXZFc3RpbWF0ZXMuYmVnaW4oKSk7CisgICAgfQorICAgIG1IYXNOZXdTYW1wbGUgPSBmYWxzZTsKKworICAgIGludDY0X3QgdG90YWxUaW1lVXMgPSAwOworICAgIHNpemVfdCB0b3RhbEJ5dGVzID0gMDsKKyAgICBpZiAobUJhbmR3aWR0aEhpc3Rvcnkuc2l6ZSgpID49IGtTaG9ydFRlcm1CYW5kd2lkdGhJdGVtcykgeworICAgICAgICBMaXN0PEJhbmR3aWR0aEVudHJ5Pjo6aXRlcmF0b3IgaXQgPSAtLW1CYW5kd2lkdGhIaXN0b3J5LmVuZCgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtTaG9ydFRlcm1CYW5kd2lkdGhJdGVtczsgaSsrLCBpdC0tKSB7CisgICAgICAgICAgICB0b3RhbFRpbWVVcyArPSBpdC0+bURlbGF5VXM7CisgICAgICAgICAgICB0b3RhbEJ5dGVzICs9IGl0LT5tTnVtQnl0ZXM7CisgICAgICAgIH0KKyAgICB9CisgICAgbVNob3J0VGVybUVzdGltYXRlID0gdG90YWxUaW1lVXMgPiAwID8KKyAgICAgICAgICAgICh0b3RhbEJ5dGVzICogOEU2IC8gdG90YWxUaW1lVXMpIDogKmJhbmR3aWR0aEJwczsKKyAgICBpZiAoc2hvcnRUZXJtQnBzKSB7CisgICAgICAgICpzaG9ydFRlcm1CcHMgPSBtU2hvcnRUZXJtRXN0aW1hdGU7CisgICAgfQorCisgICAgaW50MzJfdCBtaW5Fc3RpbWF0ZSA9IC0xLCBtYXhFc3RpbWF0ZSA9IC0xOworICAgIExpc3Q8aW50MzJfdD46Oml0ZXJhdG9yIGl0OworICAgIGZvciAoaXQgPSBtUHJldkVzdGltYXRlcy5iZWdpbigpOyBpdCAhPSBtUHJldkVzdGltYXRlcy5lbmQoKTsgaXQrKykgeworICAgICAgICBpbnQzMl90IGVzdGltYXRlID0gKml0OworICAgICAgICBpZiAobWluRXN0aW1hdGUgPCAwIHx8IG1pbkVzdGltYXRlID4gZXN0aW1hdGUpIHsKKyAgICAgICAgICAgIG1pbkVzdGltYXRlID0gZXN0aW1hdGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1heEVzdGltYXRlIDwgMCB8fCBtYXhFc3RpbWF0ZSA8IGVzdGltYXRlKSB7CisgICAgICAgICAgICBtYXhFc3RpbWF0ZSA9IGVzdGltYXRlOworICAgICAgICB9CisgICAgfQorICAgIC8vIGNvbnNpZGVyIGl0IHN0YWJsZSBpZiBsb25nLXRlcm0gYXZlcmFnZSBpcyBub3QganVtcGluZyBhIGxvdAorICAgIC8vIGFuZCBzaG9ydC10ZXJtIGF2ZXJhZ2UgaXMgbm90IG11Y2ggbG93ZXIgdGhhbiBsb25nLXRlcm0gYXZlcmFnZQorICAgIG1Jc1N0YWJsZSA9IChtYXhFc3RpbWF0ZSA8PSBtaW5Fc3RpbWF0ZSAqIDQgLyAzKQorICAgICAgICAgICAgJiYgbVNob3J0VGVybUVzdGltYXRlID4gbWluRXN0aW1hdGUgKiA3IC8gMTA7CisgICAgaWYgKGlzU3RhYmxlKSB7CisgICAgICAgICppc1N0YWJsZSA9IG1Jc1N0YWJsZTsKKyAgICB9CisKKyNpZiAwCisgICAgeworICAgICAgICBjaGFyIGR1bXBTdHJbMTAyNF0gPSB7MH07CisgICAgICAgIHNpemVfdCBpdGVtSWR4ID0gMDsKKyAgICAgICAgc2l6ZV90IGhpc3RTaXplID0gbUJhbmR3aWR0aEhpc3Rvcnkuc2l6ZSgpOworICAgICAgICBzcHJpbnRmKGR1bXBTdHIsICJlc3RpbWF0ZSBicHM9JWQgc3RhYmxlPSVkIGhpc3RvcnkgKG49JWQpOiB7IiwKKyAgICAgICAgICAgICpiYW5kd2lkdGhCcHMsIG1Jc1N0YWJsZSwgaGlzdFNpemUpOworICAgICAgICBMaXN0PEJhbmR3aWR0aEVudHJ5Pjo6aXRlcmF0b3IgaXQgPSBtQmFuZHdpZHRoSGlzdG9yeS5iZWdpbigpOworICAgICAgICBmb3IgKDsgaXQgIT0gbUJhbmR3aWR0aEhpc3RvcnkuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGlmIChpdGVtSWR4ID4gNTApIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGR1bXBTdHIgKyBzdHJsZW4oZHVtcFN0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAiLi4uKCV6ZCBtb3JlIGl0ZW1zKS4uLiB9IiwgaGlzdFNpemUgLSBpdGVtSWR4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwcmludGYoZHVtcFN0ciArIHN0cmxlbihkdW1wU3RyKSwgIiVkay8lLjNmcyVzIiwKKyAgICAgICAgICAgICAgICBpdC0+bU51bUJ5dGVzIC8gMTAyNCwKKyAgICAgICAgICAgICAgICAoZG91YmxlKWl0LT5tRGVsYXlVcyAqIDEuMGUtNiwKKyAgICAgICAgICAgICAgICAoaXQgPT0gKC0tbUJhbmR3aWR0aEhpc3RvcnkuZW5kKCkpKSA/ICJ9IiA6ICIsICIpOworICAgICAgICAgICAgaXRlbUlkeCsrOworICAgICAgICB9CisgICAgICAgIEFMT0dFKGR1bXBTdHIpOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiB0cnVlOworfQorCisvL3N0YXRpYworY29uc3QgY2hhciAqTGl2ZVNlc3Npb246OmdldEtleUZvclN0cmVhbShTdHJlYW1UeXBlIHR5cGUpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1ZJREVPOgorICAgICAgICAgICAgcmV0dXJuICJ0aW1lVXNWaWRlbyI7CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9BVURJTzoKKyAgICAgICAgICAgIHJldHVybiAidGltZVVzQXVkaW8iOworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfU1VCVElUTEVTOgorICAgICAgICAgICAgcmV0dXJuICJ0aW1lVXNTdWJ0aXRsZSI7CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NRVRBREFUQToKKyAgICAgICAgICAgIHJldHVybiAidGltZVVzTWV0YWRhdGEiOyAvLyB1bnVzZWQKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvL3N0YXRpYworY29uc3QgY2hhciAqTGl2ZVNlc3Npb246OmdldE5hbWVGb3JTdHJlYW0oU3RyZWFtVHlwZSB0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9WSURFTzoKKyAgICAgICAgICAgIHJldHVybiAidmlkZW8iOworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfQVVESU86CisgICAgICAgICAgICByZXR1cm4gImF1ZGlvIjsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1NVQlRJVExFUzoKKyAgICAgICAgICAgIHJldHVybiAic3VicyI7CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NRVRBREFUQToKKyAgICAgICAgICAgIHJldHVybiAibWV0YWRhdGEiOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAidW5rbm93biI7Cit9CisKKy8vc3RhdGljCitBVFNQYXJzZXI6OlNvdXJjZVR5cGUgTGl2ZVNlc3Npb246OmdldFNvdXJjZVR5cGVGb3JTdHJlYW0oU3RyZWFtVHlwZSB0eXBlKSB7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9WSURFTzoKKyAgICAgICAgICAgIHJldHVybiBBVFNQYXJzZXI6OlZJREVPOworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfQVVESU86CisgICAgICAgICAgICByZXR1cm4gQVRTUGFyc2VyOjpBVURJTzsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX01FVEFEQVRBOgorICAgICAgICAgICAgcmV0dXJuIEFUU1BhcnNlcjo6TUVUQTsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1NVQlRJVExFUzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgfQorICAgIHJldHVybiBBVFNQYXJzZXI6Ok5VTV9TT1VSQ0VfVFlQRVM7IC8vIHNob3VsZCBub3QgcmVhY2ggaGVyZQorfQogCiBMaXZlU2Vzc2lvbjo6TGl2ZVNlc3Npb24oCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCB1aW50MzJfdCBmbGFncywKQEAgLTU4LDE2OSArMjc5LDk1IEBACiAgICAgOiBtTm90aWZ5KG5vdGlmeSksCiAgICAgICBtRmxhZ3MoZmxhZ3MpLAogICAgICAgbUhUVFBTZXJ2aWNlKGh0dHBTZXJ2aWNlKSwKKyAgICAgIG1CdWZmZXJpbmcoZmFsc2UpLAogICAgICAgbUluUHJlcGFyYXRpb25QaGFzZSh0cnVlKSwKLSAgICAgIG1IVFRQRGF0YVNvdXJjZShuZXcgTWVkaWFIVFRQKG1IVFRQU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCkpKSwKKyAgICAgIG1Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbigwKSwKKyAgICAgIG1QcmV2QnVmZmVyUGVyY2VudGFnZSgtMSksCiAgICAgICBtQ3VyQmFuZHdpZHRoSW5kZXgoLTEpLAorICAgICAgbU9yaWdCYW5kd2lkdGhJbmRleCgtMSksCisgICAgICBtTGFzdEJhbmR3aWR0aEJwcygtMWxsKSwKKyAgICAgIG1MYXN0QmFuZHdpZHRoU3RhYmxlKGZhbHNlKSwKKyAgICAgIG1CYW5kd2lkdGhFc3RpbWF0b3IobmV3IEJhbmR3aWR0aEVzdGltYXRvcigpKSwKKyAgICAgIG1NYXhXaWR0aCg3MjApLAorICAgICAgbU1heEhlaWdodCg0ODApLAogICAgICAgbVN0cmVhbU1hc2soMCksCiAgICAgICBtTmV3U3RyZWFtTWFzaygwKSwKICAgICAgIG1Td2FwTWFzaygwKSwKLSAgICAgIG1DaGVja0JhbmR3aWR0aEdlbmVyYXRpb24oMCksCiAgICAgICBtU3dpdGNoR2VuZXJhdGlvbigwKSwKICAgICAgIG1TdWJ0aXRsZUdlbmVyYXRpb24oMCksCiAgICAgICBtTGFzdERlcXVldWVkVGltZVVzKDBsbCksCiAgICAgICBtUmVhbFRpbWVCYXNlVXMoMGxsKSwKICAgICAgIG1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzKGZhbHNlKSwKICAgICAgIG1Td2l0Y2hJblByb2dyZXNzKGZhbHNlKSwKLSAgICAgIG1EaXNjb25uZWN0UmVwbHlJRCgwKSwKLSAgICAgIG1TZWVrUmVwbHlJRCgwKSwKKyAgICAgIG1VcFN3aXRjaE1hcmsoa1VwU3dpdGNoTWFya1VzKSwKKyAgICAgIG1Eb3duU3dpdGNoTWFyayhrRG93blN3aXRjaE1hcmtVcyksCisgICAgICBtVXBTd2l0Y2hNYXJnaW4oa1VwU3dpdGNoTWFyZ2luVXMpLAogICAgICAgbUZpcnN0VGltZVVzVmFsaWQoZmFsc2UpLAogICAgICAgbUZpcnN0VGltZVVzKDApLAotICAgICAgbUxhc3RTZWVrVGltZVVzKDApIHsKLQorICAgICAgbUxhc3RTZWVrVGltZVVzKDApLAorICAgICAgbUhhc01ldGFkYXRhKGZhbHNlKSB7CiAgICAgbVN0cmVhbXNba0F1ZGlvSW5kZXhdID0gU3RyZWFtSXRlbSgiYXVkaW8iKTsKICAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0gPSBTdHJlYW1JdGVtKCJ2aWRlbyIpOwogICAgIG1TdHJlYW1zW2tTdWJ0aXRsZUluZGV4XSA9IFN0cmVhbUl0ZW0oInN1YnRpdGxlcyIpOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7Ci0gICAgICAgIG1EaXNjb250aW51aXRpZXMuYWRkKGluZGV4VG9UeXBlKGkpLCBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShOVUxMIC8qIG1ldGEgKi8pKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1Tb3VyY2VzOyArK2kpIHsKICAgICAgICAgbVBhY2tldFNvdXJjZXMuYWRkKGluZGV4VG9UeXBlKGkpLCBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShOVUxMIC8qIG1ldGEgKi8pKTsKICAgICAgICAgbVBhY2tldFNvdXJjZXMyLmFkZChpbmRleFRvVHlwZShpKSwgbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UoTlVMTCAvKiBtZXRhICovKSk7Ci0gICAgICAgIG1CdWZmZXJpbmdbaV0gPSBmYWxzZTsKICAgICB9Ci0KLSAgICBzaXplX3QgbnVtSGlzdG9yeUl0ZW1zID0ga0JhbmR3aWR0aEhpc3RvcnlCeXRlcyAvCi0gICAgICAgICAgICBQbGF5bGlzdEZldGNoZXI6OmtEb3dubG9hZEJsb2NrU2l6ZSArIDE7Ci0gICAgaWYgKG51bUhpc3RvcnlJdGVtcyA8IDUpIHsKLSAgICAgICAgbnVtSGlzdG9yeUl0ZW1zID0gNTsKLSAgICB9Ci0gICAgbUhUVFBEYXRhU291cmNlLT5zZXRCYW5kd2lkdGhIaXN0b3J5U2l6ZShudW1IaXN0b3J5SXRlbXMpOwogfQogCiBMaXZlU2Vzc2lvbjo6fkxpdmVTZXNzaW9uKCkgeworICAgIGlmIChtRmV0Y2hlckxvb3BlciAhPSBOVUxMKSB7CisgICAgICAgIG1GZXRjaGVyTG9vcGVyLT5zdG9wKCk7CisgICAgfQogfQogCi1zcDxBQnVmZmVyPiBMaXZlU2Vzc2lvbjo6Y3JlYXRlRm9ybWF0Q2hhbmdlQnVmZmVyKGJvb2wgc3dhcCkgewotICAgIEFCdWZmZXIgKmRpc2NvbnRpbnVpdHkgPSBuZXcgQUJ1ZmZlcigwKTsKLSAgICBkaXNjb250aW51aXR5LT5tZXRhKCktPnNldEludDMyKCJkaXNjb250aW51aXR5IiwgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVENIQU5HRSk7Ci0gICAgZGlzY29udGludWl0eS0+bWV0YSgpLT5zZXRJbnQzMigic3dhcFBhY2tldFNvdXJjZSIsIHN3YXApOwotICAgIGRpc2NvbnRpbnVpdHktPm1ldGEoKS0+c2V0SW50MzIoInN3aXRjaEdlbmVyYXRpb24iLCBtU3dpdGNoR2VuZXJhdGlvbik7Ci0gICAgZGlzY29udGludWl0eS0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgLTEpOwotICAgIHJldHVybiBkaXNjb250aW51aXR5OwotfQotCi12b2lkIExpdmVTZXNzaW9uOjpzd2FwUGFja2V0U291cmNlKFN0cmVhbVR5cGUgc3RyZWFtKSB7Ci0gICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmFwcyA9IG1QYWNrZXRTb3VyY2VzLmVkaXRWYWx1ZUZvcihzdHJlYW0pOwotICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZhcHMyID0gbVBhY2tldFNvdXJjZXMyLmVkaXRWYWx1ZUZvcihzdHJlYW0pOwotICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHRtcCA9IGFwczsKLSAgICBhcHMgPSBhcHMyOwotICAgIGFwczIgPSB0bXA7Ci0gICAgYXBzMi0+Y2xlYXIoKTsKK2ludDY0X3QgTGl2ZVNlc3Npb246OmNhbGN1bGF0ZU1lZGlhVGltZVVzKAorICAgICAgICBpbnQ2NF90IGZpcnN0VGltZVVzLCBpbnQ2NF90IHRpbWVVcywgaW50MzJfdCBkaXNjb250aW51aXR5U2VxKSB7CisgICAgaWYgKHRpbWVVcyA+PSBmaXJzdFRpbWVVcykgeworICAgICAgICB0aW1lVXMgLT0gZmlyc3RUaW1lVXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGltZVVzID0gMDsKKyAgICB9CisgICAgdGltZVVzICs9IG1MYXN0U2Vla1RpbWVVczsKKyAgICBpZiAobURpc2NvbnRpbnVpdHlPZmZzZXRUaW1lc1VzLmluZGV4T2ZLZXkoZGlzY29udGludWl0eVNlcSkgPj0gMCkgeworICAgICAgICB0aW1lVXMgKz0gbURpc2NvbnRpbnVpdHlPZmZzZXRUaW1lc1VzLnZhbHVlRm9yKGRpc2NvbnRpbnVpdHlTZXEpOworICAgIH0KKyAgICByZXR1cm4gdGltZVVzOwogfQogCiBzdGF0dXNfdCBMaXZlU2Vzc2lvbjo6ZGVxdWV1ZUFjY2Vzc1VuaXQoCiAgICAgICAgIFN0cmVhbVR5cGUgc3RyZWFtLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCkgewotICAgIGlmICghKG1TdHJlYW1NYXNrICYgc3RyZWFtKSkgewotICAgICAgICAvLyByZXR1cm4gLUVXT1VMREJMT0NLIHRvIGF2b2lkIGhhbHRpbmcgdGhlIGRlY29kZXIKLSAgICAgICAgLy8gd2hlbiBzd2l0Y2hpbmcgYmV0d2VlbiBhdWRpby92aWRlbyBhbmQgYXVkaW8gb25seS4KLSAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKLSAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBkaXNjb250aW51aXR5UXVldWUgID0gbURpc2NvbnRpbnVpdGllcy52YWx1ZUZvcihzdHJlYW0pOwotICAgIGlmIChkaXNjb250aW51aXR5UXVldWUtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7Ci0gICAgICAgIGRpc2NvbnRpbnVpdHlRdWV1ZS0+ZGVxdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7Ci0gICAgICAgIC8vIHNlZWtpbmcsIHRyYWNrIHN3aXRjaGluZwotICAgICAgICBzcDxBTWVzc2FnZT4gZXh0cmE7Ci0gICAgICAgIGludDY0X3QgdGltZVVzOwotICAgICAgICBpZiAoKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kTWVzc2FnZSgiZXh0cmEiLCAmZXh0cmEpCi0gICAgICAgICAgICAgICAgJiYgZXh0cmEgIT0gTlVMTAotICAgICAgICAgICAgICAgICYmIGV4dHJhLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKSB7Ci0gICAgICAgICAgICAvLyBzZWVraW5nIG9ubHkKLSAgICAgICAgICAgIG1MYXN0U2Vla1RpbWVVcyA9IHRpbWVVczsKLSAgICAgICAgICAgIG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy5jbGVhcigpOwotICAgICAgICAgICAgbURpc2NvbnRpbnVpdHlBYnNTdGFydFRpbWVzVXMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSU5GT19ESVNDT05USU5VSVRZOwotICAgIH0KLQorICAgIHN0YXR1c190IGZpbmFsUmVzdWx0ID0gT0s7CiAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gcGFja2V0U291cmNlID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3Ioc3RyZWFtKTsKIAotICAgIHNzaXplX3QgaWR4ID0gdHlwZVRvSW5kZXgoc3RyZWFtKTsKLSAgICBpZiAoIXBhY2tldFNvdXJjZS0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkpIHsKKyAgICBzc2l6ZV90IHN0cmVhbUlkeCA9IHR5cGVUb0luZGV4KHN0cmVhbSk7CisgICAgaWYgKHN0cmVhbUlkeCA8IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgY29uc3QgY2hhciAqc3RyZWFtU3RyID0gZ2V0TmFtZUZvclN0cmVhbShzdHJlYW0pOworICAgIC8vIERvIG5vdCBsZXQgY2xpZW50IHB1bGwgZGF0YSBpZiB3ZSBkb24ndCBoYXZlIGRhdGEgcGFja2V0cyB5ZXQuCisgICAgLy8gV2UgbWlnaHQgb25seSBoYXZlIGEgZm9ybWF0IGRpc2NvbnRpbnVpdHkgcXVldWVkIHdpdGhvdXQgZGF0YS4KKyAgICAvLyBXaGVuIE51UGxheWVyRGVjb2RlciBkZXF1ZXVlcyB0aGUgZm9ybWF0IGRpc2NvbnRpbnVpdHksIGl0IHdpbGwKKyAgICAvLyBpbW1lZGlhdGVseSB0cnkgdG8gZ2V0Rm9ybWF0LiBJZiB3ZSByZXR1cm4gTlVMTCwgTnVQbGF5ZXJEZWNvZGVyCisgICAgLy8gdGhpbmtzIGl0IGNhbiBkbyBzZWFtbGVzcyBjaGFuZ2UsIHNvIHdpbGwgbm90IHNodXRkb3duIGRlY29kZXIuCisgICAgLy8gV2hlbiB0aGUgYWN0dWFsIGZvcm1hdCBhcnJpdmVzLCBpdCBjYW4ndCBoYW5kbGUgaXQgYW5kIGdldCBzdHVjay4KKyAgICBpZiAoIXBhY2tldFNvdXJjZS0+aGFzRGF0YUJ1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CisgICAgICAgIEFMT0dWKCJbJXNdIGRlcXVldWVBY2Nlc3NVbml0OiBubyBidWZmZXIgYXZhaWxhYmxlIChmaW5hbFJlc3VsdD0lZCkiLAorICAgICAgICAgICAgICAgIHN0cmVhbVN0ciwgZmluYWxSZXN1bHQpOworCiAgICAgICAgIGlmIChmaW5hbFJlc3VsdCA9PSBPSykgewotICAgICAgICAgICAgbUJ1ZmZlcmluZ1tpZHhdID0gdHJ1ZTsKICAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIGZpbmFsUmVzdWx0OwogICAgICAgICB9CiAgICAgfQogCi0gICAgaW50MzJfdCB0YXJnZXREdXJhdGlvbiA9IDA7Ci0gICAgc3A8QU1lc3NhZ2U+IG1ldGEgPSBwYWNrZXRTb3VyY2UtPmdldExhdGVzdEVucXVldWVkTWV0YSgpOwotICAgIGlmIChtZXRhICE9IE5VTEwpIHsKLSAgICAgICAgbWV0YS0+ZmluZEludDMyKCJ0YXJnZXREdXJhdGlvbiIsICZ0YXJnZXREdXJhdGlvbik7Ci0gICAgfQotCi0gICAgaW50NjRfdCB0YXJnZXREdXJhdGlvblVzID0gdGFyZ2V0RHVyYXRpb24gKiAxMDAwMDAwbGw7Ci0gICAgaWYgKHRhcmdldER1cmF0aW9uVXMgPT0gMCB8fAotICAgICAgICAgICAgdGFyZ2V0RHVyYXRpb25VcyA+IFBsYXlsaXN0RmV0Y2hlcjo6a01pbkJ1ZmZlcmVkRHVyYXRpb25VcykgewotICAgICAgICAvLyBGZXRjaGVycyBsaW1pdCBidWZmZXJpbmcgdG8KLSAgICAgICAgLy8gbWluKDMgKiB0YXJnZXREdXJhdGlvbiwga01pbkJ1ZmZlcmVkRHVyYXRpb25VcykKLSAgICAgICAgdGFyZ2V0RHVyYXRpb25VcyA9IFBsYXlsaXN0RmV0Y2hlcjo6a01pbkJ1ZmZlcmVkRHVyYXRpb25VczsKLSAgICB9Ci0KLSAgICBpZiAobUJ1ZmZlcmluZ1tpZHhdKSB7Ci0gICAgICAgIGlmIChtU3dpdGNoSW5Qcm9ncmVzcwotICAgICAgICAgICAgICAgIHx8IHBhY2tldFNvdXJjZS0+aXNGaW5pc2hlZCgwKQotICAgICAgICAgICAgICAgIHx8IHBhY2tldFNvdXJjZS0+Z2V0RXN0aW1hdGVkRHVyYXRpb25VcygpID4gdGFyZ2V0RHVyYXRpb25VcykgewotICAgICAgICAgICAgbUJ1ZmZlcmluZ1tpZHhdID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobUJ1ZmZlcmluZ1tpZHhdKSB7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLQotICAgIC8vIHdhaXQgZm9yIGNvdW50ZXJwYXJ0Ci0gICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gb3RoZXJTb3VyY2U7Ci0gICAgdWludDMyX3QgbWFzayA9IG1OZXdTdHJlYW1NYXNrICYgbVN0cmVhbU1hc2s7Ci0gICAgdWludDMyX3QgZmV0Y2hlcnNNYXNrICA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmV0Y2hlckluZm9zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHVpbnQzMl90IGZldGNoZXJNYXNrID0gbUZldGNoZXJJbmZvcy52YWx1ZUF0KGkpLm1GZXRjaGVyLT5nZXRTdHJlYW1UeXBlTWFzaygpOwotICAgICAgICBmZXRjaGVyc01hc2sgfD0gZmV0Y2hlck1hc2s7Ci0gICAgfQotICAgIG1hc2sgJj0gZmV0Y2hlcnNNYXNrOwotICAgIGlmIChzdHJlYW0gPT0gU1RSRUFNVFlQRV9BVURJTyAmJiAobWFzayAmIFNUUkVBTVRZUEVfVklERU8pKSB7Ci0gICAgICAgIG90aGVyU291cmNlID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoU1RSRUFNVFlQRV9WSURFTyk7Ci0gICAgfSBlbHNlIGlmIChzdHJlYW0gPT0gU1RSRUFNVFlQRV9WSURFTyAmJiAobWFzayAmIFNUUkVBTVRZUEVfQVVESU8pKSB7Ci0gICAgICAgIG90aGVyU291cmNlID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoU1RSRUFNVFlQRV9BVURJTyk7Ci0gICAgfQotICAgIGlmIChvdGhlclNvdXJjZSAhPSBOVUxMICYmICFvdGhlclNvdXJjZS0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkpIHsKLSAgICAgICAgcmV0dXJuIGZpbmFsUmVzdWx0ID09IE9LID8gLUVBR0FJTiA6IGZpbmFsUmVzdWx0OwotICAgIH0KKyAgICAvLyBMZXQgdGhlIGNsaWVudCBkZXF1ZXVlIGFzIGxvbmcgYXMgd2UgaGF2ZSBidWZmZXJzIGF2YWlsYWJsZQorICAgIC8vIERvIG5vdCBtYWtlIHBhdXNlL3Jlc3VtZSBkZWNpc2lvbnMgaGVyZS4KIAogICAgIHN0YXR1c190IGVyciA9IHBhY2tldFNvdXJjZS0+ZGVxdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CiAKLSAgICBzaXplX3Qgc3RyZWFtSWR4OwotICAgIGNvbnN0IGNoYXIgKnN0cmVhbVN0cjsKLSAgICBzd2l0Y2ggKHN0cmVhbSkgewotICAgICAgICBjYXNlIFNUUkVBTVRZUEVfQVVESU86Ci0gICAgICAgICAgICBzdHJlYW1JZHggPSBrQXVkaW9JbmRleDsKLSAgICAgICAgICAgIHN0cmVhbVN0ciA9ICJhdWRpbyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1ZJREVPOgotICAgICAgICAgICAgc3RyZWFtSWR4ID0ga1ZpZGVvSW5kZXg7Ci0gICAgICAgICAgICBzdHJlYW1TdHIgPSAidmlkZW8iOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RSRUFNVFlQRV9TVUJUSVRMRVM6Ci0gICAgICAgICAgICBzdHJlYW1JZHggPSBrU3VidGl0bGVJbmRleDsKLSAgICAgICAgICAgIHN0cmVhbVN0ciA9ICJzdWJzIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICB9Ci0KLSAgICBTdHJlYW1JdGVtJiBzdHJtID0gbVN0cmVhbXNbc3RyZWFtSWR4XTsKICAgICBpZiAoZXJyID09IElORk9fRElTQ09OVElOVUlUWSkgewogICAgICAgICAvLyBhZGFwdGl2ZSBzdHJlYW1pbmcsIGRpc2NvbnRpbnVpdGllcyBpbiB0aGUgcGxheWxpc3QKICAgICAgICAgaW50MzJfdCB0eXBlOwpAQCAtMjM1LDUwICszODIsMzYgQEAKICAgICAgICAgICAgICAgc3RyZWFtU3RyLAogICAgICAgICAgICAgICB0eXBlLAogICAgICAgICAgICAgICBleHRyYSA9PSBOVUxMID8gIk5VTEwiIDogZXh0cmEtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Ci0KLSAgICAgICAgaW50MzJfdCBzd2FwOwotICAgICAgICBpZiAoKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kSW50MzIoInN3YXBQYWNrZXRTb3VyY2UiLCAmc3dhcCkgJiYgc3dhcCkgewotICAgICAgICAgICAgaW50MzJfdCBzd2l0Y2hHZW5lcmF0aW9uOwotICAgICAgICAgICAgQ0hFQ0soKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kSW50MzIoInN3aXRjaEdlbmVyYXRpb24iLCAmc3dpdGNoR2VuZXJhdGlvbikpOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Td2FwTXV0ZXgpOwotICAgICAgICAgICAgICAgIGlmIChzd2l0Y2hHZW5lcmF0aW9uID09IG1Td2l0Y2hHZW5lcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN3YXBQYWNrZXRTb3VyY2Uoc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN3YXBwZWQsIGlkKCkpOwotICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJzdHJlYW0iLCBzdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJzd2l0Y2hHZW5lcmF0aW9uIiwgc3dpdGNoR2VuZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNpemVfdCBzZXEgPSBzdHJtLm1DdXJEaXNjb250aW51aXR5U2VxOwotICAgICAgICAgICAgaW50NjRfdCBvZmZzZXRUaW1lVXM7Ci0gICAgICAgICAgICBpZiAobURpc2NvbnRpbnVpdHlPZmZzZXRUaW1lc1VzLmluZGV4T2ZLZXkoc2VxKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0VGltZVVzID0gbURpc2NvbnRpbnVpdHlPZmZzZXRUaW1lc1VzLnZhbHVlRm9yKHNlcSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG9mZnNldFRpbWVVcyA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlcSArPSAxOwotICAgICAgICAgICAgaWYgKG1EaXNjb250aW51aXR5QWJzU3RhcnRUaW1lc1VzLmluZGV4T2ZLZXkoc3RybS5tQ3VyRGlzY29udGludWl0eVNlcSkgPj0gMCkgewotICAgICAgICAgICAgICAgIGludDY0X3QgZmlyc3RUaW1lVXM7Ci0gICAgICAgICAgICAgICAgZmlyc3RUaW1lVXMgPSBtRGlzY29udGludWl0eUFic1N0YXJ0VGltZXNVcy52YWx1ZUZvcihzdHJtLm1DdXJEaXNjb250aW51aXR5U2VxKTsKLSAgICAgICAgICAgICAgICBvZmZzZXRUaW1lVXMgKz0gc3RybS5tTGFzdERlcXVldWVkVGltZVVzIC0gZmlyc3RUaW1lVXM7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0VGltZVVzICs9IHN0cm0ubUxhc3RTYW1wbGVEdXJhdGlvblVzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvZmZzZXRUaW1lVXMgKz0gc3RybS5tTGFzdFNhbXBsZUR1cmF0aW9uVXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy5hZGQoc2VxLCBvZmZzZXRUaW1lVXMpOwotICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChlcnIgPT0gT0spIHsKIAogICAgICAgICBpZiAoc3RyZWFtID09IFNUUkVBTVRZUEVfQVVESU8gfHwgc3RyZWFtID09IFNUUkVBTVRZUEVfVklERU8pIHsKLSAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMsIG9yaWdpbmFsVGltZVVzOwogICAgICAgICAgICAgaW50MzJfdCBkaXNjb250aW51aXR5U2VxID0gMDsKKyAgICAgICAgICAgIFN0cmVhbUl0ZW0mIHN0cm0gPSBtU3RyZWFtc1tzdHJlYW1JZHhdOwogICAgICAgICAgICAgQ0hFQ0soKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICAmdGltZVVzKSk7CisgICAgICAgICAgICBvcmlnaW5hbFRpbWVVcyA9IHRpbWVVczsKICAgICAgICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgJmRpc2NvbnRpbnVpdHlTZXEpOwotICAgICAgICAgICAgc3RybS5tQ3VyRGlzY29udGludWl0eVNlcSA9IGRpc2NvbnRpbnVpdHlTZXE7CisgICAgICAgICAgICBpZiAoZGlzY29udGludWl0eVNlcSA+IChpbnQzMl90KSBzdHJtLm1DdXJEaXNjb250aW51aXR5U2VxKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBvZmZzZXRUaW1lVXM7CisgICAgICAgICAgICAgICAgaWYgKG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy5pbmRleE9mS2V5KHN0cm0ubUN1ckRpc2NvbnRpbnVpdHlTZXEpID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0VGltZVVzID0gbURpc2NvbnRpbnVpdHlPZmZzZXRUaW1lc1VzLnZhbHVlRm9yKHN0cm0ubUN1ckRpc2NvbnRpbnVpdHlTZXEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldFRpbWVVcyA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1EaXNjb250aW51aXR5QWJzU3RhcnRUaW1lc1VzLmluZGV4T2ZLZXkoc3RybS5tQ3VyRGlzY29udGludWl0eVNlcSkgPj0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3RybS5tTGFzdERlcXVldWVkVGltZVVzID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBmaXJzdFRpbWVVczsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RUaW1lVXMgPSBtRGlzY29udGludWl0eUFic1N0YXJ0VGltZXNVcy52YWx1ZUZvcihzdHJtLm1DdXJEaXNjb250aW51aXR5U2VxKTsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0VGltZVVzICs9IHN0cm0ubUxhc3REZXF1ZXVlZFRpbWVVcyAtIGZpcnN0VGltZVVzOworICAgICAgICAgICAgICAgICAgICBvZmZzZXRUaW1lVXMgKz0gc3RybS5tTGFzdFNhbXBsZUR1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0VGltZVVzICs9IHN0cm0ubUxhc3RTYW1wbGVEdXJhdGlvblVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy5hZGQoZGlzY29udGludWl0eVNlcSwgb2Zmc2V0VGltZVVzKTsKKyAgICAgICAgICAgICAgICBzdHJtLm1DdXJEaXNjb250aW51aXR5U2VxID0gZGlzY29udGludWl0eVNlcTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50MzJfdCBkaXNjYXJkID0gMDsKICAgICAgICAgICAgIGludDY0X3QgZmlyc3RUaW1lVXM7CkBAIC0yOTksMTcgKzQzMiwxMCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdHJtLm1MYXN0RGVxdWV1ZWRUaW1lVXMgPSB0aW1lVXM7Ci0gICAgICAgICAgICBpZiAodGltZVVzID49IGZpcnN0VGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgdGltZVVzIC09IGZpcnN0VGltZVVzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aW1lVXMgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGltZVVzICs9IG1MYXN0U2Vla1RpbWVVczsKLSAgICAgICAgICAgIGlmIChtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXMuaW5kZXhPZktleShkaXNjb250aW51aXR5U2VxKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGltZVVzICs9IG1EaXNjb250aW51aXR5T2Zmc2V0VGltZXNVcy52YWx1ZUZvcihkaXNjb250aW51aXR5U2VxKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRpbWVVcyA9IGNhbGN1bGF0ZU1lZGlhVGltZVVzKGZpcnN0VGltZVVzLCB0aW1lVXMsIGRpc2NvbnRpbnVpdHlTZXEpOwogCi0gICAgICAgICAgICBBTE9HVigiWyVzXSByZWFkIGJ1ZmZlciBhdCB0aW1lICUiIFBSSWQ2NCAiIHVzIiwgc3RyZWFtU3RyLCB0aW1lVXMpOworICAgICAgICAgICAgQUxPR1YoIlslc10gZGVxdWV1ZUFjY2Vzc1VuaXQ6IHRpbWUgJWxsZCB1cywgb3JpZ2luYWwgJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbVN0ciwgKGxvbmcgbG9uZyl0aW1lVXMsIChsb25nIGxvbmcpb3JpZ2luYWxUaW1lVXMpOwogICAgICAgICAgICAgKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgIHRpbWVVcyk7CiAgICAgICAgICAgICBtTGFzdERlcXVldWVkVGltZVVzID0gdGltZVVzOwogICAgICAgICAgICAgbVJlYWxUaW1lQmFzZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHRpbWVVczsKQEAgLTMyMiw2ICs0NDgsMTcgQEAKICAgICAgICAgICAgICgqYWNjZXNzVW5pdCktPm1ldGEoKS0+c2V0SW50MzIoCiAgICAgICAgICAgICAgICAgICAgICJ0cmFja0luZGV4IiwgbVBsYXlsaXN0LT5nZXRTZWxlY3RlZEluZGV4KCkpOwogICAgICAgICAgICAgKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5zZXRJbnQ2NCgiYmFzZVVzIiwgbVJlYWxUaW1lQmFzZVVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0gPT0gU1RSRUFNVFlQRV9NRVRBREFUQSkgeworICAgICAgICAgICAgSExTVGltZSBtZFRpbWUoKCphY2Nlc3NVbml0KS0+bWV0YSgpKTsKKyAgICAgICAgICAgIGlmIChtRGlzY29udGludWl0eUFic1N0YXJ0VGltZXNVcy5pbmRleE9mS2V5KG1kVGltZS5tU2VxKSA8IDApIHsKKyAgICAgICAgICAgICAgICBwYWNrZXRTb3VyY2UtPnJlcXVldWVBY2Nlc3NVbml0KCgqYWNjZXNzVW5pdCkpOworICAgICAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGZpcnN0VGltZVVzID0gbURpc2NvbnRpbnVpdHlBYnNTdGFydFRpbWVzVXMudmFsdWVGb3IobWRUaW1lLm1TZXEpOworICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzID0gY2FsY3VsYXRlTWVkaWFUaW1lVXMoZmlyc3RUaW1lVXMsIG1kVGltZS5tVGltZVVzLCBtZFRpbWUubVNlcSk7CisgICAgICAgICAgICAgICAgKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5zZXRJbnQ2NCgiYmFzZVVzIiwgbVJlYWxUaW1lQmFzZVVzKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dJKCJbJXNdIGVuY291bnRlcmVkIGVycm9yICVkIiwgc3RyZWFtU3RyLCBlcnIpOwpAQCAtMzMxLDcgKzQ2OCw2IEBACiB9CiAKIHN0YXR1c190IExpdmVTZXNzaW9uOjpnZXRTdHJlYW1Gb3JtYXQoU3RyZWFtVHlwZSBzdHJlYW0sIHNwPEFNZXNzYWdlPiAqZm9ybWF0KSB7Ci0gICAgLy8gTm8gc3dhcFBhY2tldFNvdXJjZSByYWNlIGNvbmRpdGlvbjsgY2FsbGVkIGZyb20gdGhlIHNhbWUgdGhyZWFkIGFzIGRlcXVldWVBY2Nlc3NVbml0LgogICAgIGlmICghKG1TdHJlYW1NYXNrICYgc3RyZWFtKSkgewogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CkBAIC0zNDQsMTIgKzQ4MCwyNCBAQAogICAgICAgICByZXR1cm4gLUVBR0FJTjsKICAgICB9CiAKKyAgICBpZiAoc3RyZWFtID09IFNUUkVBTVRZUEVfQVVESU8pIHsKKyAgICAgICAgLy8gc2V0IEFBQyBpbnB1dCBidWZmZXIgc2l6ZSB0byAzMksgYnl0ZXMgKDI1NmticHMgeCAxc2VjKQorICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCAzMiAqIDEwMjQpOworICAgIH0gZWxzZSBpZiAoc3RyZWFtID09IFNUUkVBTVRZUEVfVklERU8pIHsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleU1heFdpZHRoLCBtTWF4V2lkdGgpOworICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5TWF4SGVpZ2h0LCBtTWF4SGVpZ2h0KTsKKyAgICB9CisKICAgICByZXR1cm4gY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKG1ldGEsIGZvcm1hdCk7CiB9CiAKK3NwPEhUVFBEb3dubG9hZGVyPiBMaXZlU2Vzc2lvbjo6Z2V0SFRUUERvd25sb2FkZXIoKSB7CisgICAgcmV0dXJuIG5ldyBIVFRQRG93bmxvYWRlcihtSFRUUFNlcnZpY2UsIG1FeHRyYUhlYWRlcnMpOworfQorCiB2b2lkIExpdmVTZXNzaW9uOjpjb25uZWN0QXN5bmMoCiAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29ubmVjdCwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbm5lY3QsIHRoaXMpOwogICAgIG1zZy0+c2V0U3RyaW5nKCJ1cmwiLCB1cmwpOwogCiAgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgewpAQCAtMzYyLDcgKzUxMCw3IEBACiB9CiAKIHN0YXR1c190IExpdmVTZXNzaW9uOjpkaXNjb25uZWN0KCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREaXNjb25uZWN0LCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RGlzY29ubmVjdCwgdGhpcyk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CiAgICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwpAQCAtMzcxLDcgKzUxOSw3IEBACiB9CiAKIHN0YXR1c190IExpdmVTZXNzaW9uOjpzZWVrVG8oaW50NjRfdCB0aW1lVXMpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VlaywgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlZWssIHRoaXMpOwogICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CkBAIC0zODAsNiArNTI4LDk1IEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAorYm9vbCBMaXZlU2Vzc2lvbjo6Y2hlY2tTd2l0Y2hQcm9ncmVzcygKKyAgICAgICAgc3A8QU1lc3NhZ2U+ICZzdG9wUGFyYW1zLCBpbnQ2NF90IGRlbGF5VXMsIGJvb2wgKm5lZWRSZXN1bWVVbnRpbCkgeworICAgIEFTdHJpbmcgbmV3VXJpOworICAgIENIRUNLKHN0b3BQYXJhbXMtPmZpbmRTdHJpbmcoInVyaSIsICZuZXdVcmkpKTsKKworICAgICpuZWVkUmVzdW1lVW50aWwgPSBmYWxzZTsKKyAgICBzcDxBTWVzc2FnZT4gZmlyc3ROZXdNZXRhW2tNYXhTdHJlYW1zXTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKKyAgICAgICAgU3RyZWFtVHlwZSBzdHJlYW0gPSBpbmRleFRvVHlwZShpKTsKKyAgICAgICAgaWYgKCEobVN3YXBNYXNrICYgbU5ld1N0cmVhbU1hc2sgJiBzdHJlYW0pCisgICAgICAgICAgICB8fCAobVN0cmVhbXNbaV0ubU5ld1VyaSAhPSBuZXdVcmkpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyZWFtID09IFNUUkVBTVRZUEVfU1VCVElUTEVTKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmc291cmNlID0gbVBhY2tldFNvdXJjZXMuZWRpdFZhbHVlQXQoaSk7CisKKyAgICAgICAgLy8gRmlyc3QsIGdldCBsYXRlc3QgZGVxdWV1ZWQgbWV0YSwgd2hpY2ggaXMgd2hlcmUgdGhlIGRlY29kZXIgaXMgYXQuCisgICAgICAgIC8vICh3aGVuIHVwc3dpdGNoaW5nLCB3ZSB0YWtlIHRoZSBtZXRhIGFmdGVyIGEgY2VydGFpbiBkZWxheSwgc28gdGhhdAorICAgICAgICAvLyB0aGUgZGVjb2RlciBpcyBsZWZ0IHdpdGggc29tZSBjdXNoaW9uKQorICAgICAgICBzcDxBTWVzc2FnZT4gbGFzdERlcXVldWVNZXRhLCBsYXN0RW5xdWV1ZU1ldGE7CisgICAgICAgIGlmIChkZWxheVVzID4gMCkgeworICAgICAgICAgICAgbGFzdERlcXVldWVNZXRhID0gc291cmNlLT5nZXRNZXRhQWZ0ZXJMYXN0RGVxdWV1ZWQoZGVsYXlVcyk7CisgICAgICAgICAgICBpZiAobGFzdERlcXVldWVNZXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIG1lYW5zIHdlIGRvbid0IGhhdmUgZW5vdWdoIGN1c2hpb24sIHRyeSBhZ2FpbiBsYXRlcgorICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIHVwIHN3aXRjaGluZyBmYWlsZWQgZHVlIHRvIGluc3VmZmljaWVudCBidWZmZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZUZvclN0cmVhbShzdHJlYW0pKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBJdCdzIG9rYXkgZm9yIGxhc3REZXF1ZXVlTWV0YSB0byBiZSBOVUxMIGhlcmUsIGl0IG1lYW5zIHRoZQorICAgICAgICAgICAgLy8gZGVjb2RlciBoYXNuJ3QgZXZlbiBzdGFydGVkIGRlcXVldWVpbmcKKyAgICAgICAgICAgIGxhc3REZXF1ZXVlTWV0YSA9IHNvdXJjZS0+Z2V0TGF0ZXN0RGVxdWV1ZWRNZXRhKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlbiwgdHJpbSBvZmYgcGFja2V0cyBhdCBiZWdpbm5pbmcgb2YgbVBhY2tldFNvdXJjZXMyIHRoYXQncyBiZWZvcmUKKyAgICAgICAgLy8gdGhlIGxhdGVzdCBkZXF1ZXVlZCB0aW1lLiBUaGVzZSBzYW1wbGVzIGFyZSBkZWZpbml0ZWx5IHRvbyBsYXRlLgorICAgICAgICBmaXJzdE5ld01ldGFbaV0gPSBtUGFja2V0U291cmNlczIuZWRpdFZhbHVlQXQoaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnRyaW1CdWZmZXJzQmVmb3JlTWV0YShsYXN0RGVxdWV1ZU1ldGEpOworCisgICAgICAgIC8vIE5vdyBmaXJzdE5ld01ldGFbaV0gaXMgdGhlIGZpcnN0IHNhbXBsZSBhZnRlciB0aGUgdHJpbS4KKyAgICAgICAgLy8gSWYgaXQncyBOVUxMLCB3ZSBmYWlsZWQgYmVjYXVzZSBkZXF1ZXVlIGFscmVhZHkgcGFzdCBhbGwgc2FtcGxlcworICAgICAgICAvLyBpbiBtUGFja2V0U291cmNlMiwgd2UgaGF2ZSB0byB0cnkgYWdhaW4uCisgICAgICAgIGlmIChmaXJzdE5ld01ldGFbaV0gPT0gTlVMTCkgeworICAgICAgICAgICAgSExTVGltZSBkZXF1ZXVlVGltZShsYXN0RGVxdWV1ZU1ldGEpOworICAgICAgICAgICAgQUxPR1YoIlslc10gZGVxdWV1ZSB0aW1lICglZCwgJWxsZCkgcGFzdCBzdGFydCB0aW1lIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0TmFtZUZvclN0cmVhbShzdHJlYW0pLAorICAgICAgICAgICAgICAgICAgICBkZXF1ZXVlVGltZS5tU2VxLCAobG9uZyBsb25nKSBkZXF1ZXVlVGltZS5tVGltZVVzKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgY2hlY2sgaWYgbVBhY2tldFNvdXJjZXMyIG92ZXJsYXBzIHdpdGggd2hhdCBvbGQgZmV0Y2hlcgorICAgICAgICAvLyBhbHJlYWR5IGZldGNoZWQsIGFuZCBzZWUgaWYgd2UgbmVlZCB0byByZXN1bWVVbnRpbAorICAgICAgICBsYXN0RW5xdWV1ZU1ldGEgPSBzb3VyY2UtPmdldExhdGVzdEVucXVldWVkTWV0YSgpOworICAgICAgICAvLyBsYXN0RW5xdWV1ZU1ldGEgPT0gTlVMTCBtZWFucyBvbGQgZmV0Y2hlciBzdG9wcGVkIGF0IGEgZGlzY29udGludWl0eQorICAgICAgICAvLyBib3VuZGFyeSwgbm8gbmVlZCB0byByZXN1bWUgYXMgdGhlIGNvbnRlbnQgd2lsbCBsb29rIGRpZmZlcmVudCBhbnl3YXlzCisgICAgICAgIGlmIChsYXN0RW5xdWV1ZU1ldGEgIT0gTlVMTCkgeworICAgICAgICAgICAgSExTVGltZSBsYXN0VGltZShsYXN0RW5xdWV1ZU1ldGEpLCBzdGFydFRpbWUoZmlyc3ROZXdNZXRhW2ldKTsKKworICAgICAgICAgICAgLy8gbm8gbmVlZCB0byByZXN1bWUgb2xkIGZldGNoZXIgaWYgbmV3IGZldGNoZXIgc3RhcnRlZCBpbiBkaWZmZXJlbnQKKyAgICAgICAgICAgIC8vIGRpc2NvbnRpbnVpdHkgc2VxdWVuY2UsIGFzIHRoZSBjb250ZW50IHdpbGwgbG9vayBkaWZmZXJlbnQuCisgICAgICAgICAgICAqbmVlZFJlc3VtZVVudGlsIHw9IChzdGFydFRpbWUubVNlcSA9PSBsYXN0VGltZS5tU2VxCisgICAgICAgICAgICAgICAgICAgICYmIHN0YXJ0VGltZS5tVGltZVVzIC0gbGFzdFRpbWUubVRpbWVVcyA+IGtSZXN1bWVUaHJlc2hvbGRVcyk7CisKKyAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgc3RvcFRpbWUgZm9yIHJlc3VtZVVudGlsCisgICAgICAgICAgICBzdG9wUGFyYW1zLT5zZXRJbnQzMigiZGlzY29udGludWl0eVNlcSIsIHN0YXJ0VGltZS5tU2VxKTsKKyAgICAgICAgICAgIHN0b3BQYXJhbXMtPnNldEludDY0KGdldEtleUZvclN0cmVhbShzdHJlYW0pLCBzdGFydFRpbWUubVRpbWVVcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpZiB3ZSdyZSBoZXJlLCBpdCBtZWFucyBkZXF1ZXVlIHByb2dyZXNzIGhhc24ndCBwYXNzZWQgc29tZSBzYW1wbGVzIGluCisgICAgLy8gbVBhY2tldFNvdXJjZTIsIHdlIGNhbiB0cmltIG9mZiB0aGUgZXhjZXNzIGluIG1QYWNrZXRTb3VyY2UuCisgICAgLy8gKG9sZCBmZXRjaGVyIG1pZ2h0IHN0aWxsIG5lZWQgdG8gcmVzdW1lVW50aWwgdGhlIHN0YXJ0IHRpbWUgb2YgbmV3IGZldGNoZXIpCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7CisgICAgICAgIFN0cmVhbVR5cGUgc3RyZWFtID0gaW5kZXhUb1R5cGUoaSk7CisgICAgICAgIGlmICghKG1Td2FwTWFzayAmIG1OZXdTdHJlYW1NYXNrICYgc3RyZWFtKQorICAgICAgICAgICAgfHwgKG5ld1VyaSAhPSBtU3RyZWFtc1tpXS5tTmV3VXJpKQorICAgICAgICAgICAgfHwgc3RyZWFtID09IFNUUkVBTVRZUEVfU1VCVElUTEVTKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtUGFja2V0U291cmNlcy52YWx1ZUZvcihzdHJlYW0pLT50cmltQnVmZmVyc0FmdGVyTWV0YShmaXJzdE5ld01ldGFbaV0pOworICAgIH0KKworICAgIC8vIG5vIHJlc3VtZVVudGlsIGlmIGFscmVhZHkgdW5kZXJmbG93CisgICAgKm5lZWRSZXN1bWVVbnRpbCAmPSAhbUJ1ZmZlcmluZzsKKworICAgIHJldHVybiB0cnVlOworfQorCiB2b2lkIExpdmVTZXNzaW9uOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgICAgY2FzZSBrV2hhdENvbm5lY3Q6CkBAIC00MDIsMTYgKzYzOSwxNSBAQAogCiAgICAgICAgIGNhc2Uga1doYXRTZWVrOgogICAgICAgICB7Ci0gICAgICAgICAgICB1aW50MzJfdCBzZWVrUmVwbHlJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnNlZWtSZXBseUlEKSk7Ci0gICAgICAgICAgICBtU2Vla1JlcGx5SUQgPSBzZWVrUmVwbHlJRDsKKyAgICAgICAgICAgIGlmIChtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcykgeworICAgICAgICAgICAgICAgIG1zZy0+cG9zdCg1MDAwMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJm1TZWVrUmVwbHlJRCkpOwogICAgICAgICAgICAgbVNlZWtSZXBseSA9IG5ldyBBTWVzc2FnZTsKIAotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gb25TZWVrKG1zZyk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBtc2ctPnBvc3QoNTAwMDApOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgb25TZWVrKG1zZyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC00MjYsMTYgKzY2MiwzMCBAQAogICAgICAgICAgICAgICAgIGNhc2UgUGxheWxpc3RGZXRjaGVyOjprV2hhdFBhdXNlZDoKICAgICAgICAgICAgICAgICBjYXNlIFBsYXlsaXN0RmV0Y2hlcjo6a1doYXRTdG9wcGVkOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gUGxheWxpc3RGZXRjaGVyOjprV2hhdFN0b3BwZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgdXJpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJ1cmkiLCAmdXJpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZldGNoZXJJbmZvcy5yZW1vdmVJdGVtKHVyaSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGR1cGxpY2F0ZWQga1doYXRTdG9wcGVkIG1lc3NhZ2VzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIHVyaTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJ1cmkiLCAmdXJpKSk7CisgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtRmV0Y2hlckluZm9zLmluZGV4T2ZLZXkodXJpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIG1zZ3MgZnJvbSBmZXRjaGVycyB0aGF0J3MgYWxyZWFkeSBnb25lCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN3aXRjaEluUHJvZ3Jlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnlUb0ZpbmlzaEJhbmR3aWR0aFN3aXRjaCgpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiZmV0Y2hlci0lZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZldGNoZXJJbmZvc1tpbmRleF0ubUZldGNoZXItPmdldEZldGNoZXJJRCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoYXQgPT0gUGxheWxpc3RGZXRjaGVyOjprV2hhdFBhdXNlZCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGF1c2VkIiA6ICJzdG9wcGVkIik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gUGxheWxpc3RGZXRjaGVyOjprV2hhdFN0b3BwZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GZXRjaGVyTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZldGNoZXJJbmZvc1tpbmRleF0ubUZldGNoZXItPmlkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbUZldGNoZXJJbmZvcy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFBsYXlsaXN0RmV0Y2hlcjo6a1doYXRQYXVzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vla01vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic2Vla01vZGUiLCAmc2Vla01vZGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RyZWFtc1tpXS5tVXJpID09IHVyaSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtc1tpXS5tU2Vla01vZGUgPSAoU2Vla01vZGUpIHNlZWtNb2RlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogCkBAIC00NDMsMTUgKzY5Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19HVChtQ29udGludWF0aW9uQ291bnRlciwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS1tQ29udGludWF0aW9uQ291bnRlciA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRpbnVhdGlvbi0+cG9zdCgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWVrUmVwbHlJRCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1TZWVrUmVwbHkgIT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrUmVwbHktPnNldEludDMyKCJlcnIiLCBPSyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrUmVwbHktPnBvc3RSZXBseShtU2Vla1JlcGx5SUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1JlcGx5SUQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1JlcGx5LmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV6dSBmZXRjaGVyKHMpIGxlZnQiLCBtQ29udGludWF0aW9uQ291bnRlcik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDY0LDggKzcwNywyMSBAQAogICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CiAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJkdXJhdGlvblVzIiwgJmR1cmF0aW9uVXMpKTsKIAotICAgICAgICAgICAgICAgICAgICBGZXRjaGVySW5mbyAqaW5mbyA9ICZtRmV0Y2hlckluZm9zLmVkaXRWYWx1ZUZvcih1cmkpOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5tRHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtRmV0Y2hlckluZm9zLmluZGV4T2ZLZXkodXJpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZldGNoZXJJbmZvICppbmZvID0gJm1GZXRjaGVySW5mb3MuZWRpdFZhbHVlRm9yKHVyaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5tRHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBQbGF5bGlzdEZldGNoZXI6OmtXaGF0VGFyZ2V0RHVyYXRpb25VcGRhdGU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRhcmdldER1cmF0aW9uVXM7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0YXJnZXREdXJhdGlvblVzIiwgJnRhcmdldER1cmF0aW9uVXMpKTsKKyAgICAgICAgICAgICAgICAgICAgbVVwU3dpdGNoTWFyayA9IG1pbihrVXBTd2l0Y2hNYXJrVXMsIHRhcmdldER1cmF0aW9uVXMgKiA3IC8gNCk7CisgICAgICAgICAgICAgICAgICAgIG1Eb3duU3dpdGNoTWFyayA9IG1pbihrRG93blN3aXRjaE1hcmtVcywgdGFyZ2V0RHVyYXRpb25VcyAqIDkgLyA0KTsKKyAgICAgICAgICAgICAgICAgICAgbVVwU3dpdGNoTWFyZ2luID0gbWluKGtVcFN3aXRjaE1hcmdpblVzLCB0YXJnZXREdXJhdGlvblVzKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCkBAIC00OTMsNiArNzQ5LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgICAgICAvLyByZW1lbWJlciB0aGUgZmFpbHVyZSBpbmRleCAoYXMgbUN1ckJhbmR3aWR0aEluZGV4IHdpbGwgYmUgcmVzdG9yZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgY2FuY2VsQmFuZHdpZHRoU3dpdGNoKCkpLCBhbmQgcmVjb3JkIGxhc3QgZmFpbCB0aW1lCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmYWlsdXJlSW5kZXggPSBtQ3VyQmFuZHdpZHRoSW5kZXg7CisgICAgICAgICAgICAgICAgICAgIG1CYW5kd2lkdGhJdGVtcy5lZGl0SXRlbUF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVJbmRleCkubUxhc3RGYWlsdXJlVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChtU3dpdGNoSW5Qcm9ncmVzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgZXJyb3IgaGFwcGVuZWQgd2hlbiB3ZSBzd2l0Y2ggdG8gYSB2YXJpYW50LCB0cnkgZmFsbGJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIG90aGVyIHZhcmlhbnQgdG8gc2F2ZSB0aGUgc2Vzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyeUJhbmR3aWR0aEZhbGxiYWNrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIGlmIChtSW5QcmVwYXJhdGlvblBoYXNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0UHJlcGFyZWQoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNTA2LDM4ICs3NzYsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RSRUFNVFlQRV9TVUJUSVRMRVMpLT5zaWduYWxFT1MoZXJyKTsKIAotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEVycm9yKTsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIHBvc3RFcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBjYXNlIFBsYXlsaXN0RmV0Y2hlcjo6a1doYXRUZW1wb3JhcmlseURvbmVGZXRjaGluZzoKKyAgICAgICAgICAgICAgICBjYXNlIFBsYXlsaXN0RmV0Y2hlcjo6a1doYXRTdG9wUmVhY2hlZDoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgdXJpOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoInVyaSIsICZ1cmkpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImtXaGF0U3RvcFJlYWNoZWQiKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAobUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KHVyaSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY291bGRuJ3QgZmluZCB1cmkiKTsKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBvbGRVcmk7CisgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygidXJpIiwgJm9sZFVyaSkpOworCisgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtRmV0Y2hlckluZm9zLmluZGV4T2ZLZXkob2xkVXJpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgRmV0Y2hlckluZm8gKmluZm8gPSAmbUZldGNoZXJJbmZvcy5lZGl0VmFsdWVGb3IodXJpKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+bUlzUHJlcGFyZWQgPSB0cnVlOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChtSW5QcmVwYXJhdGlvblBoYXNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbEZldGNoZXJzUHJlcGFyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmV0Y2hlckluZm9zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtRmV0Y2hlckluZm9zLnZhbHVlQXQoaSkubUlzUHJlcGFyZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsRmV0Y2hlcnNQcmVwYXJlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGxGZXRjaGVyc1ByZXBhcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFByZXBhcmVkKE9LKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cnlUb0ZpbmlzaEJhbmR3aWR0aFN3aXRjaChvbGRVcmkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTU0NiwxOSArODAxLDk3IEBACiAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3dpdGNoR2VuZXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInN3aXRjaEdlbmVyYXRpb24iLCAmc3dpdGNoR2VuZXJhdGlvbikpOwogCisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJrV2hhdFN0YXJ0ZWRBdDogc3dpdGNoR2VuPSVkLCBtU3dpdGNoR2VuPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hHZW5lcmF0aW9uLCBtU3dpdGNoR2VuZXJhdGlvbik7CisKICAgICAgICAgICAgICAgICAgICAgaWYgKHN3aXRjaEdlbmVyYXRpb24gIT0gbVN3aXRjaEdlbmVyYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVzdW1lIGZldGNoZXIgZm9yIHRoZSBvcmlnaW5hbCB2YXJpYW50OyB0aGUgcmVzdW1lZCBmZXRjaGVyIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51ZSB1bnRpbCB0aGUgdGltZXN0YW1wcyBmb3VuZCBpbiBtc2csIHdoaWNoIGlzIHN0b3JlZCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gbmV3IGZldGNoZXIgdG8gaW5kaWNhdGUgd2hlcmUgdGhlIG5ldyB2YXJpYW50IGhhcyBzdGFydGVkIGJ1ZmZlcmluZy4KLSAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmV0Y2hlckluZm9zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGZXRjaGVySW5mbyBpbmZvID0gbUZldGNoZXJJbmZvcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8ubVRvQmVSZW1vdmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5tRmV0Y2hlci0+cmVzdW1lVW50aWxBc3luYyhtc2cpOworICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIHVyaTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU3RyaW5nKCJ1cmkiLCAmdXJpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gbWFyayBuZXcgZmV0Y2hlciBtVG9CZVJlc3VtZWQKKyAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1GZXRjaGVySW5mb3MuaW5kZXhPZktleSh1cmkpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUZldGNoZXJJbmZvcy5lZGl0VmFsdWVBdChpbmRleCkubVRvQmVSZXN1bWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHRlbXBvcmFyaWx5IGRpc2FibGUgcGFja2V0IHNvdXJjZXMgdG8gYmUgc3dhcHBlZCB0byBwcmV2ZW50CisgICAgICAgICAgICAgICAgICAgIC8vIE51UGxheWVyRGVjb2RlciBmcm9tIGRlcXVldWluZyB3aGlsZSB3ZSBjaGVjayBwcm9ncmVzcworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYWNrZXRTb3VyY2VzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1Td2FwTWFzayAmIG1QYWNrZXRTb3VyY2VzLmtleUF0KGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB1cmkgPT0gbVN0cmVhbXNbaV0ubU5ld1VyaSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYWNrZXRTb3VyY2VzLmVkaXRWYWx1ZUF0KGkpLT5lbmFibGUoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJvb2wgc3dpdGNoVXAgPSAobUN1ckJhbmR3aWR0aEluZGV4ID4gbU9yaWdCYW5kd2lkdGhJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHN3aXRjaGluZyB1cCwgcmVxdWlyZSBhIGN1c2hpb24gYmlnZ2VyIHRoYW4ga1VuZGVyZmxvd01hcmsKKyAgICAgICAgICAgICAgICAgICAgLy8gdG8gYXZvaWQgYnVmZmVyaW5nIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBzd2l0Y2guCisgICAgICAgICAgICAgICAgICAgIC8vIChJZiB3ZSBkb24ndCBoYXZlIHRoYXQgY3VzaGlvbiB3ZSdkIHJhdGhlciBjYW5jZWwgYW5kIHRyeSBhZ2Fpbi4pCisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IHN3aXRjaFVwID8gKGtVbmRlcmZsb3dNYXJrVXMgKyAxMDAwMDAwbGwpIDogMDsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkUmVzdW1lVW50aWwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHN0b3BQYXJhbXMgPSBtc2c7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja1N3aXRjaFByb2dyZXNzKHN0b3BQYXJhbXMsIGRlbGF5VXMsICZuZWVkUmVzdW1lVW50aWwpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayB0aW1lIGhhc24ndCBwYXNzZWQgc3RhcnRBdCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5lZWRSZXN1bWVVbnRpbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmaW5pc2ggc3dpdGNoIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobVN3YXBNYXNrICYgaW5kZXhUb1R5cGUoaSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdXJpID09IG1TdHJlYW1zW2ldLm1OZXdVcmkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgdG8gbWFrZSBhIGNvcHkgb2YgbVN0cmVhbXNbaV0ubVVyaSBiZWNhdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnlUb0ZpbmlzaEJhbmR3aWR0aFN3aXRjaCBpcyBtb2RpZnlpbmcgbVN0cmVhbXNbXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBvbGRVUkkgPSBtU3RyZWFtc1tpXS5tVXJpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5VG9GaW5pc2hCYW5kd2lkdGhTd2l0Y2gob2xkVVJJKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydEF0IHRpbWUgaXMgYWZ0ZXIgbGFzdCBlbnF1ZXVlIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN1bWUgZmV0Y2hlciBmb3IgdGhlIG9yaWdpbmFsIHZhcmlhbnQ7IHRoZSByZXN1bWVkIGZldGNoZXIgc2hvdWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWUgdW50aWwgdGhlIHRpbWVzdGFtcHMgZm91bmQgaW4gbXNnLCB3aGljaCBpcyBzdG9yZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3IGZldGNoZXIgdG8gaW5kaWNhdGUgd2hlcmUgdGhlIG5ldyB2YXJpYW50IGhhcyBzdGFydGVkIGJ1ZmZlcmluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZmluaXNoIHN3aXRjaCB3aXRoIHJlc3VtZVVudGlsQXN5bmMiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GZXRjaGVySW5mb3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmV0Y2hlckluZm8gJmluZm8gPSBtRmV0Y2hlckluZm9zLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvLm1Ub0JlUmVtb3ZlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5tRmV0Y2hlci0+cmVzdW1lVW50aWxBc3luYyhzdG9wUGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBsYXliYWNrIHRpbWUgcGFzc2VkIHN0YXJ0QXQgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN3aXRjaFVwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgc3dpdGNoaW5nIHVwLCBjYW5jZWwgYW5kIHJldHJ5IGlmIGNvbmRpdGlvbiBzYXRpc2ZpZXMgYWdhaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2FuY2VsIHVwIHN3aXRjaCBiZWNhdXNlIHdlJ3JlIHRvbyBsYXRlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsQmFuZHdpZHRoU3dpdGNoKHRydWUgLyogcmVzdW1lICovKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJldHJ5IGRvd24gc3dpdGNoIGF0IG5leHQgc2FtcGxlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1lRmV0Y2hlcih1cmksIG1Td2FwTWFzaywgLTEsIHRydWUgLyogbmV3VXJpICovKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyByZS1lbmFibGUgYWxsIHBhY2tldCBzb3VyY2VzCisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhY2tldFNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QYWNrZXRTb3VyY2VzLmVkaXRWYWx1ZUF0KGkpLT5lbmFibGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIFBsYXlsaXN0RmV0Y2hlcjo6a1doYXRQbGF5bGlzdEZldGNoZWQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvbk1hc3RlclBsYXlsaXN0RmV0Y2hlZChtc2cpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIFBsYXlsaXN0RmV0Y2hlcjo6a1doYXRNZXRhZGF0YURldGVjdGVkOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtSGFzTWV0YWRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1IYXNNZXRhZGF0YSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRNZXRhZGF0YURldGVjdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIApAQCAtNTY5LDE5ICs5MDIsNiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIGtXaGF0Q2hlY2tCYW5kd2lkdGg6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKLQotICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gbUNoZWNrQmFuZHdpZHRoR2VuZXJhdGlvbikgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvbkNoZWNrQmFuZHdpZHRoKG1zZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCiAgICAgICAgIGNhc2Uga1doYXRDaGFuZ2VDb25maWd1cmF0aW9uOgogICAgICAgICB7CiAgICAgICAgICAgICBvbkNoYW5nZUNvbmZpZ3VyYXRpb24obXNnKTsKQEAgLTYwMCwyNyArOTIwLDEzIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2Uga1doYXRGaW5pc2hEaXNjb25uZWN0MjoKKyAgICAgICAgY2FzZSBrV2hhdFBvbGxCdWZmZXJpbmc6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG9uRmluaXNoRGlzY29ubmVjdDIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFN3YXBwZWQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG9uU3dhcHBlZChtc2cpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0Q2hlY2tTd2l0Y2hEb3duOgotICAgICAgICB7Ci0gICAgICAgICAgICBvbkNoZWNrU3dpdGNoRG93bigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0U3dpdGNoRG93bjoKLSAgICAgICAgewotICAgICAgICAgICAgb25Td2l0Y2hEb3duKCk7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiA9PSBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBvblBvbGxCdWZmZXJpbmcoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTYzMSw2ICs5MzcsMTMgQEAKIH0KIAogLy8gc3RhdGljCitib29sIExpdmVTZXNzaW9uOjppc0JhbmR3aWR0aFZhbGlkKGNvbnN0IEJhbmR3aWR0aEl0ZW0gJml0ZW0pIHsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrQmxhY2tsaXN0V2luZG93VXMgPSAzMDAgKiAxMDAwMDAwbGw7CisgICAgcmV0dXJuIGl0ZW0ubUxhc3RGYWlsdXJlVXMgPCAwCisgICAgICAgICAgICB8fCBBTG9vcGVyOjpHZXROb3dVcygpIC0gaXRlbS5tTGFzdEZhaWx1cmVVcyA+IGtCbGFja2xpc3RXaW5kb3dVczsKK30KKworLy8gc3RhdGljCiBpbnQgTGl2ZVNlc3Npb246OlNvcnRCeUJhbmR3aWR0aChjb25zdCBCYW5kd2lkdGhJdGVtICphLCBjb25zdCBCYW5kd2lkdGhJdGVtICpiKSB7CiAgICAgaWYgKGEtPm1CYW5kd2lkdGggPCBiLT5tQmFuZHdpZHRoKSB7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTY0Myw3ICs5NTYsNyBAQAogCiAvLyBzdGF0aWMKIExpdmVTZXNzaW9uOjpTdHJlYW1UeXBlIExpdmVTZXNzaW9uOjppbmRleFRvVHlwZShpbnQgaWR4KSB7Ci0gICAgQ0hFQ0soaWR4ID49IDAgJiYgaWR4IDwga01heFN0cmVhbXMpOworICAgIENIRUNLKGlkeCA+PSAwICYmIGlkeCA8IGtOdW1Tb3VyY2VzKTsKICAgICByZXR1cm4gKFN0cmVhbVR5cGUpKDEgPDwgaWR4KTsKIH0KIApAQCAtNjU2LDYgKzk2OSw4IEBACiAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1NVQlRJVExFUzoKICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTUVUQURBVEE6CisgICAgICAgICAgICByZXR1cm4gMzsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICB9OwpAQCAtNjYzLDggKzk3OCwxMCBAQAogfQogCiB2b2lkIExpdmVTZXNzaW9uOjpvbkNvbm5lY3QoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBBU3RyaW5nIHVybDsKLSAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoInVybCIsICZ1cmwpKTsKKyAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoInVybCIsICZtTWFzdGVyVVJMKSk7CisKKyAgICAvLyBUT0RPIGN1cnJlbnRseSB3ZSBkb24ndCBrbm93IGlmIHdlIGFyZSBjb21pbmcgaGVyZSBmcm9tIGluY29nbml0byBtb2RlCisgICAgQUxPR0koIm9uQ29ubmVjdCAlcyIsIHVyaURlYnVnU3RyaW5nKG1NYXN0ZXJVUkwpLmNfc3RyKCkpOwogCiAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMOwogICAgIGlmICghbXNnLT5maW5kUG9pbnRlcigiaGVhZGVycyIsICh2b2lkICoqKSZoZWFkZXJzKSkgewpAQCAtNjc2LDIxICs5OTMsMzkgQEAKICAgICAgICAgaGVhZGVycyA9IE5VTEw7CiAgICAgfQogCi0gICAgLy8gVE9ETyBjdXJyZW50bHkgd2UgZG9uJ3Qga25vdyBpZiB3ZSBhcmUgY29taW5nIGhlcmUgZnJvbSBpbmNvZ25pdG8gbW9kZQotICAgIEFMT0dJKCJvbkNvbm5lY3QgJXMiLCB1cmlEZWJ1Z1N0cmluZyh1cmwpLmNfc3RyKCkpOworICAgIC8vIGNyZWF0ZSBsb29wZXIgZm9yIGZldGNoZXJzCisgICAgaWYgKG1GZXRjaGVyTG9vcGVyID09IE5VTEwpIHsKKyAgICAgICAgbUZldGNoZXJMb29wZXIgPSBuZXcgQUxvb3BlcigpOwogCi0gICAgbU1hc3RlclVSTCA9IHVybDsKKyAgICAgICAgbUZldGNoZXJMb29wZXItPnNldE5hbWUoIkZldGNoZXIiKTsKKyAgICAgICAgbUZldGNoZXJMb29wZXItPnN0YXJ0KGZhbHNlLCBmYWxzZSk7CisgICAgfQogCi0gICAgYm9vbCBkdW1teTsKLSAgICBtUGxheWxpc3QgPSBmZXRjaFBsYXlsaXN0KHVybC5jX3N0cigpLCBOVUxMIC8qIGN1clBsYXlsaXN0SGFzaCAqLywgJmR1bW15KTsKKyAgICAvLyBjcmVhdGUgZmV0Y2hlciB0byBmZXRjaCB0aGUgbWFzdGVyIHBsYXlsaXN0CisgICAgYWRkRmV0Y2hlcihtTWFzdGVyVVJMLmNfc3RyKCkpLT5mZXRjaFBsYXlsaXN0QXN5bmMoKTsKK30KIAordm9pZCBMaXZlU2Vzc2lvbjo6b25NYXN0ZXJQbGF5bGlzdEZldGNoZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBBU3RyaW5nIHVyaTsKKyAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoInVyaSIsICZ1cmkpKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KHVyaSk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygiZmV0Y2hlciBmb3IgbWFzdGVyIHBsYXlsaXN0IGlzIGdvbmUuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBubyBsb25nZXIgdXNlZnVsLCByZW1vdmUKKyAgICBtRmV0Y2hlckxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUZldGNoZXJJbmZvc1tpbmRleF0ubUZldGNoZXItPmlkKCkpOworICAgIG1GZXRjaGVySW5mb3MucmVtb3ZlSXRlbXNBdChpbmRleCk7CisKKyAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInBsYXlsaXN0IiwgKHNwPFJlZkJhc2U+ICopJm1QbGF5bGlzdCkpOwogICAgIGlmIChtUGxheWxpc3QgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgidW5hYmxlIHRvIGZldGNoIG1hc3RlciBwbGF5bGlzdCAlcy4iLCB1cmlEZWJ1Z1N0cmluZyh1cmwpLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgidW5hYmxlIHRvIGZldGNoIG1hc3RlciBwbGF5bGlzdCAlcy4iLAorICAgICAgICAgICAgICAgIHVyaURlYnVnU3RyaW5nKG1NYXN0ZXJVUkwpLmNfc3RyKCkpOwogCiAgICAgICAgIHBvc3RQcmVwYXJlZChFUlJPUl9JTyk7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0KICAgICAvLyBXZSB0cnVzdCB0aGUgY29udGVudCBwcm92aWRlciB0byBtYWtlIGEgcmVhc29uYWJsZSBjaG9pY2Ugb2YgcHJlZmVycmVkCiAgICAgLy8gaW5pdGlhbCBiYW5kd2lkdGggYnkgbGlzdGluZyBpdCBmaXJzdCBpbiB0aGUgdmFyaWFudCBwbGF5bGlzdC4KICAgICAvLyBBdCBzdGFydHVwIHdlIHJlYWxseSBkb24ndCBoYXZlIGEgZ29vZCBlc3RpbWF0ZSBvbiB0aGUgYXZhaWxhYmxlCkBAIC02OTksMTEgKzEwMzQsMTYgQEAKICAgICBzaXplX3QgaW5pdGlhbEJhbmR3aWR0aCA9IDA7CiAgICAgc2l6ZV90IGluaXRpYWxCYW5kd2lkdGhJbmRleCA9IDA7CiAKKyAgICBpbnQzMl90IG1heFdpZHRoID0gMDsKKyAgICBpbnQzMl90IG1heEhlaWdodCA9IDA7CisKICAgICBpZiAobVBsYXlsaXN0LT5pc1ZhcmlhbnRQbGF5bGlzdCgpKSB7CisgICAgICAgIFZlY3RvcjxCYW5kd2lkdGhJdGVtPiBpdGVtc1dpdGhWaWRlbzsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWxpc3QtPnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICBCYW5kd2lkdGhJdGVtIGl0ZW07CiAKICAgICAgICAgICAgIGl0ZW0ubVBsYXlsaXN0SW5kZXggPSBpOworICAgICAgICAgICAgaXRlbS5tTGFzdEZhaWx1cmVVcyA9IC0xbGw7CiAKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtZXRhOwogICAgICAgICAgICAgQVN0cmluZyB1cmk7CkBAIC03MTEsMTQgKzEwNTEsMzAgQEAKIAogICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKCJiYW5kd2lkdGgiLCAoaW50MzJfdCAqKSZpdGVtLm1CYW5kd2lkdGgpKTsKIAotICAgICAgICAgICAgaWYgKGluaXRpYWxCYW5kd2lkdGggPT0gMCkgewotICAgICAgICAgICAgICAgIGluaXRpYWxCYW5kd2lkdGggPSBpdGVtLm1CYW5kd2lkdGg7CisgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpIHsKKyAgICAgICAgICAgICAgICBtYXhXaWR0aCA9IG1heChtYXhXaWR0aCwgd2lkdGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICBtYXhIZWlnaHQgPSBtYXgobWF4SGVpZ2h0LCBoZWlnaHQpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtQmFuZHdpZHRoSXRlbXMucHVzaChpdGVtKTsKKyAgICAgICAgICAgIGlmIChtUGxheWxpc3QtPmhhc1R5cGUoaSwgInZpZGVvIikpIHsKKyAgICAgICAgICAgICAgICBpdGVtc1dpdGhWaWRlby5wdXNoKGl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHJlbW92ZSB0aGUgYXVkaW8tb25seSB2YXJpYW50cyBpZiB3ZSBoYXZlIGF0IGxlYXN0IG9uZSB3aXRoIHZpZGVvCisgICAgICAgIGlmICghaXRlbXNXaXRoVmlkZW8uZW1wdHkoKQorICAgICAgICAgICAgICAgICYmIGl0ZW1zV2l0aFZpZGVvLnNpemUoKSA8IG1CYW5kd2lkdGhJdGVtcy5zaXplKCkpIHsKKyAgICAgICAgICAgIG1CYW5kd2lkdGhJdGVtcy5jbGVhcigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpdGVtc1dpdGhWaWRlby5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIG1CYW5kd2lkdGhJdGVtcy5wdXNoKGl0ZW1zV2l0aFZpZGVvW2ldKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIENIRUNLX0dUKG1CYW5kd2lkdGhJdGVtcy5zaXplKCksIDB1KTsKKyAgICAgICAgaW5pdGlhbEJhbmR3aWR0aCA9IG1CYW5kd2lkdGhJdGVtc1swXS5tQmFuZHdpZHRoOwogCiAgICAgICAgIG1CYW5kd2lkdGhJdGVtcy5zb3J0KFNvcnRCeUJhbmR3aWR0aCk7CiAKQEAgLTczNiwzOSArMTA5Miw0NCBAQAogICAgICAgICBtQmFuZHdpZHRoSXRlbXMucHVzaChpdGVtKTsKICAgICB9CiAKKyAgICBtTWF4V2lkdGggPSBtYXhXaWR0aCA+IDAgPyBtYXhXaWR0aCA6IG1NYXhXaWR0aDsKKyAgICBtTWF4SGVpZ2h0ID0gbWF4SGVpZ2h0ID4gMCA/IG1heEhlaWdodCA6IG1NYXhIZWlnaHQ7CisKICAgICBtUGxheWxpc3QtPnBpY2tSYW5kb21NZWRpYUl0ZW1zKCk7CiAgICAgY2hhbmdlQ29uZmlndXJhdGlvbigKICAgICAgICAgICAgIDBsbCAvKiB0aW1lVXMgKi8sIGluaXRpYWxCYW5kd2lkdGhJbmRleCwgZmFsc2UgLyogcGlja1RyYWNrICovKTsKIH0KIAogdm9pZCBMaXZlU2Vzc2lvbjo6ZmluaXNoRGlzY29ubmVjdCgpIHsKKyAgICBBTE9HVigiZmluaXNoRGlzY29ubmVjdCIpOworCiAgICAgLy8gTm8gcmVjb25maWd1cmF0aW9uIGlzIGN1cnJlbnRseSBwZW5kaW5nLCBtYWtlIHN1cmUgbm9uZSB3aWxsIHRyaWdnZXIKICAgICAvLyBkdXJpbmcgZGlzY29ubmVjdGlvbiBlaXRoZXIuCi0gICAgY2FuY2VsQ2hlY2tCYW5kd2lkdGhFdmVudCgpOwotCi0gICAgLy8gUHJvdGVjdCBtUGFja2V0U291cmNlcyBmcm9tIGEgc3dhcFBhY2tldFNvdXJjZSByYWNlIGNvbmRpdGlvbiB0aHJvdWdoIGRpc2Nvbm5lY3QuCi0gICAgLy8gKGZpbmlzaERpc2Nvbm5lY3QsIG9uRmluaXNoRGlzY29ubmVjdDIpCiAgICAgY2FuY2VsQmFuZHdpZHRoU3dpdGNoKCk7CiAKLSAgICAvLyBjYW5jZWwgc3dpdGNoIGRvd24gbW9uaXRvcgotICAgIG1Td2l0Y2hEb3duTW9uaXRvci5jbGVhcigpOworICAgIC8vIGNhbmNlbCBidWZmZXIgcG9sbGluZworICAgIGNhbmNlbFBvbGxCdWZmZXJpbmcoKTsKIAorICAgIC8vIFRSSUNLWTogZG9uJ3Qgd2FpdCBmb3IgYWxsIGZldGNoZXIgdG8gYmUgc3RvcHBlZCB3aGVuIGRpc2Nvbm5lY3RpbmcKKyAgICAvLworICAgIC8vIFNvbWUgZmV0Y2hlcnMgbWlnaHQgYmUgc3R1Y2sgaW4gY29ubmVjdC9nZXRTaXplIGF0IHRoaXMgcG9pbnQuIFRoZXNlCisgICAgLy8gb3BlcmF0aW9ucyB3aWxsIGV2ZW50dWFsbHkgdGltZW91dCAoYXMgd2UgaGF2ZSBhIHRpbWVvdXQgc2V0IGluCisgICAgLy8gTWVkaWFIVFRQQ29ubmVjdGlvbiksIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGJsb2NrIHRoZSBtYWluIFVJIHRocmVhZAorICAgIC8vIHVudGlsIHRoZW4uIEhlcmUgd2UganVzdCBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBjbGVhciBhbGwgcmVmZXJlbmNlcworICAgIC8vIHRvIHRoZSBmZXRjaGVycywgc28gdGhhdCB3aGVuIHRoZXkgZmluYWxseSBleGl0IGZyb20gdGhlIGJsb2NraW5nCisgICAgLy8gb3BlcmF0aW9uLCB0aGV5IGNhbiBiZSBkZXN0cnVjdGVkLgorICAgIC8vCisgICAgLy8gVGhlcmUgaXMgb25lIHZlcnkgdHJpY2t5IHBvaW50IHRob3VnaC4gRm9yIHRoaXMgc2NoZW1lIHRvIHdvcmssIHRoZQorICAgIC8vIGZlY3RoZXIgbXVzdCBob2xkIGEgcmVmZXJlbmNlIHRvIExpdmVTZXNzaW9uLCBzbyB0aGF0IExpdmVTZXNzaW9uIGlzCisgICAgLy8gZGVzdHJveWVkIGFmdGVyIGZldGNoZXIuIE90aGVyd2lzZSBMaXZlU2Vzc2lvbiB3b3VsZCBnZXQgc3R1Y2sgaW4gaXRzCisgICAgLy8gb3duIGRlc3RydWN0b3Igd2hlbiBpdCB3YWl0cyBmb3IgbUZldGNoZXJMb29wZXIgdG8gc3RvcCwgd2hpY2ggc3RpbGwKKyAgICAvLyBibG9ja3MgbWFpbiBVSSB0aHJlYWQuCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmV0Y2hlckluZm9zLnNpemUoKTsgKytpKSB7CiAgICAgICAgIG1GZXRjaGVySW5mb3MudmFsdWVBdChpKS5tRmV0Y2hlci0+c3RvcEFzeW5jKCk7CisgICAgICAgIG1GZXRjaGVyTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcigKKyAgICAgICAgICAgICAgICBtRmV0Y2hlckluZm9zLnZhbHVlQXQoaSkubUZldGNoZXItPmlkKCkpOwogICAgIH0KLQotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGaW5pc2hEaXNjb25uZWN0MiwgaWQoKSk7Ci0KLSAgICBtQ29udGludWF0aW9uQ291bnRlciA9IG1GZXRjaGVySW5mb3Muc2l6ZSgpOwotICAgIG1Db250aW51YXRpb24gPSBtc2c7Ci0KLSAgICBpZiAobUNvbnRpbnVhdGlvbkNvdW50ZXIgPT0gMCkgewotICAgICAgICBtc2ctPnBvc3QoKTsKLSAgICB9Ci19Ci0KLXZvaWQgTGl2ZVNlc3Npb246Om9uRmluaXNoRGlzY29ubmVjdDIoKSB7Ci0gICAgbUNvbnRpbnVhdGlvbi5jbGVhcigpOworICAgIG1GZXRjaGVySW5mb3MuY2xlYXIoKTsKIAogICAgIG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKFNUUkVBTVRZUEVfQVVESU8pLT5zaWduYWxFT1MoRVJST1JfRU5EX09GX1NUUkVBTSk7CiAgICAgbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoU1RSRUFNVFlQRV9WSURFTyktPnNpZ25hbEVPUyhFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKQEAgLTc4MCw3ICsxMTQxLDcgQEAKICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIE9LKTsKIAogICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkobURpc2Nvbm5lY3RSZXBseUlEKTsKLSAgICBtRGlzY29ubmVjdFJlcGx5SUQgPSAwOworICAgIG1EaXNjb25uZWN0UmVwbHlJRC5jbGVhcigpOwogfQogCiBzcDxQbGF5bGlzdEZldGNoZXI+IExpdmVTZXNzaW9uOjphZGRGZXRjaGVyKGNvbnN0IGNoYXIgKnVyaSkgewpAQCAtNzkwLDIxMyArMTE1MSwxODUgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEZldGNoZXJOb3RpZnksIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaGVyTm90aWZ5LCB0aGlzKTsKICAgICBub3RpZnktPnNldFN0cmluZygidXJpIiwgdXJpKTsKICAgICBub3RpZnktPnNldEludDMyKCJzd2l0Y2hHZW5lcmF0aW9uIiwgbVN3aXRjaEdlbmVyYXRpb24pOwogCiAgICAgRmV0Y2hlckluZm8gaW5mbzsKLSAgICBpbmZvLm1GZXRjaGVyID0gbmV3IFBsYXlsaXN0RmV0Y2hlcihub3RpZnksIHRoaXMsIHVyaSwgbVN1YnRpdGxlR2VuZXJhdGlvbik7CisgICAgaW5mby5tRmV0Y2hlciA9IG5ldyBQbGF5bGlzdEZldGNoZXIoCisgICAgICAgICAgICBub3RpZnksIHRoaXMsIHVyaSwgbUN1ckJhbmR3aWR0aEluZGV4LCBtU3VidGl0bGVHZW5lcmF0aW9uKTsKICAgICBpbmZvLm1EdXJhdGlvblVzID0gLTFsbDsKLSAgICBpbmZvLm1Jc1ByZXBhcmVkID0gZmFsc2U7CiAgICAgaW5mby5tVG9CZVJlbW92ZWQgPSBmYWxzZTsKLSAgICBsb29wZXIoKS0+cmVnaXN0ZXJIYW5kbGVyKGluZm8ubUZldGNoZXIpOworICAgIGluZm8ubVRvQmVSZXN1bWVkID0gZmFsc2U7CisgICAgbUZldGNoZXJMb29wZXItPnJlZ2lzdGVySGFuZGxlcihpbmZvLm1GZXRjaGVyKTsKIAogICAgIG1GZXRjaGVySW5mb3MuYWRkKHVyaSwgaW5mbyk7CiAKICAgICByZXR1cm4gaW5mby5tRmV0Y2hlcjsKIH0KIAotLyoKLSAqIElsbHVzdHJhdGlvbiBvZiBwYXJhbWV0ZXJzOgotICoKLSAqIDAgICAgICBgcmFuZ2Vfb2Zmc2V0YAotICogKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tKy0tKwotICogfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IG5leHQgYmxvY2sgdG8gZmV0Y2ggfCAgfCAgfAotICogfCAgICAgICAgICAgIHwgYHNvdXJjZWAgaGFuZGxlID0+IGBvdXRgIGJ1ZmZlciB8ICAgICAgICAgICAgICAgICAgICAgfCAgfCAgfAotICogfCBgdXJsYCBmaWxlIHw8LS0tLS0tLS0tIGJ1ZmZlciBzaXplIC0tLS0tLS0tLT58PC0tLSBgYmxvY2tfc2l6ZWAgLS0+fCAgfCAgfAotICogfCAgICAgICAgICAgIHw8LS0tLS0tLS0tLS0gYHJhbmdlX2xlbmd0aGAgLyBidWZmZXIgY2FwYWNpdHkgLS0tLS0tLS0tLS0+fCAgfAotICogfDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZmlsZV9zaXplIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+fAotICoKLSAqIFNwZWNpYWwgcGFyYW1ldGVyIHZhbHVlczoKLSAqIC0gcmFuZ2VfbGVuZ3RoID09IC0xIG1lYW5zIGVudGlyZSBmaWxlCi0gKiAtIGJsb2NrX3NpemUgPT0gMCBtZWFucyBlbnRpcmUgcmFuZ2UKLSAqCi0gKi8KLXNzaXplX3QgTGl2ZVNlc3Npb246OmZldGNoRmlsZSgKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCBzcDxBQnVmZmVyPiAqb3V0LAotICAgICAgICBpbnQ2NF90IHJhbmdlX29mZnNldCwgaW50NjRfdCByYW5nZV9sZW5ndGgsCi0gICAgICAgIHVpbnQzMl90IGJsb2NrX3NpemUsIC8qIGRvd25sb2FkIGJsb2NrIHNpemUgKi8KLSAgICAgICAgc3A8RGF0YVNvdXJjZT4gKnNvdXJjZSwgLyogdG8gcmV0dXJuIGFuZCByZXVzZSBzb3VyY2UgKi8KLSAgICAgICAgU3RyaW5nOCAqYWN0dWFsVXJsKSB7Ci0gICAgb2ZmNjRfdCBzaXplOwotICAgIHNwPERhdGFTb3VyY2U+IHRlbXBfc291cmNlOwotICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgewotICAgICAgICBzb3VyY2UgPSAmdGVtcF9zb3VyY2U7Ci0gICAgfQotCi0gICAgaWYgKCpzb3VyY2UgPT0gTlVMTCkgewotICAgICAgICBpZiAoIXN0cm5jYXNlY21wKHVybCwgImZpbGU6Ly8iLCA3KSkgewotICAgICAgICAgICAgKnNvdXJjZSA9IG5ldyBGaWxlU291cmNlKHVybCArIDcpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cm5jYXNlY21wKHVybCwgImh0dHA6Ly8iLCA3KQotICAgICAgICAgICAgICAgICYmIHN0cm5jYXNlY21wKHVybCwgImh0dHBzOi8vIiwgOCkpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGhlYWRlcnMgPSBtRXh0cmFIZWFkZXJzOwotICAgICAgICAgICAgaWYgKHJhbmdlX29mZnNldCA+IDAgfHwgcmFuZ2VfbGVuZ3RoID49IDApIHsKLSAgICAgICAgICAgICAgICBoZWFkZXJzLmFkZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIlJhbmdlIiksCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlcz0lbGxkLSVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2Vfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZV9sZW5ndGggPCAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICIiIDogQVN0cmluZ1ByaW50ZigiJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlX29mZnNldCArIHJhbmdlX2xlbmd0aCAtIDEpLmNfc3RyKCkpLmNfc3RyKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1IVFRQRGF0YVNvdXJjZS0+Y29ubmVjdCh1cmwsICZoZWFkZXJzKTsKLQotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICpzb3VyY2UgPSBtSFRUUERhdGFTb3VyY2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBnZXRTaXplRXJyID0gKCpzb3VyY2UpLT5nZXRTaXplKCZzaXplKTsKLSAgICBpZiAoZ2V0U2l6ZUVyciAhPSBPSykgewotICAgICAgICBzaXplID0gNjU1MzY7Ci0gICAgfQotCi0gICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gKm91dCAhPSBOVUxMID8gKm91dCA6IG5ldyBBQnVmZmVyKHNpemUpOwotICAgIGlmICgqb3V0ID09IE5VTEwpIHsKLSAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKLSAgICB9Ci0KLSAgICBzc2l6ZV90IGJ5dGVzUmVhZCA9IDA7Ci0gICAgLy8gYWRqdXN0IHJhbmdlX2xlbmd0aCBpZiBvbmx5IHJlYWRpbmcgcGFydGlhbCBibG9jawotICAgIGlmIChibG9ja19zaXplID4gMCAmJiAocmFuZ2VfbGVuZ3RoID09IC0xIHx8IChpbnQ2NF90KShidWZmZXItPnNpemUoKSArIGJsb2NrX3NpemUpIDwgcmFuZ2VfbGVuZ3RoKSkgewotICAgICAgICByYW5nZV9sZW5ndGggPSBidWZmZXItPnNpemUoKSArIGJsb2NrX3NpemU7Ci0gICAgfQotICAgIGZvciAoOzspIHsKLSAgICAgICAgLy8gT25seSByZXNpemUgd2hlbiB3ZSBkb24ndCBrbm93IHRoZSBzaXplLgotICAgICAgICBzaXplX3QgYnVmZmVyUmVtYWluaW5nID0gYnVmZmVyLT5jYXBhY2l0eSgpIC0gYnVmZmVyLT5zaXplKCk7Ci0gICAgICAgIGlmIChidWZmZXJSZW1haW5pbmcgPT0gMCAmJiBnZXRTaXplRXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBzaXplX3QgYnVmZmVySW5jcmVtZW50ID0gYnVmZmVyLT5zaXplKCkgLyAyOwotICAgICAgICAgICAgaWYgKGJ1ZmZlckluY3JlbWVudCA8IDMyNzY4KSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVySW5jcmVtZW50ID0gMzI3Njg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZmZXJSZW1haW5pbmcgPSBidWZmZXJJbmNyZW1lbnQ7Ci0KLSAgICAgICAgICAgIEFMT0dWKCJpbmNyZWFzaW5nIGRvd25sb2FkIGJ1ZmZlciB0byAlenUgYnl0ZXMiLAotICAgICAgICAgICAgICAgICBidWZmZXItPnNpemUoKSArIGJ1ZmZlclJlbWFpbmluZyk7Ci0KLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNvcHkgPSBuZXcgQUJ1ZmZlcihidWZmZXItPnNpemUoKSArIGJ1ZmZlclJlbWFpbmluZyk7Ci0gICAgICAgICAgICBtZW1jcHkoY29weS0+ZGF0YSgpLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgY29weS0+c2V0UmFuZ2UoMCwgYnVmZmVyLT5zaXplKCkpOwotCi0gICAgICAgICAgICBidWZmZXIgPSBjb3B5OwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IG1heEJ5dGVzVG9SZWFkID0gYnVmZmVyUmVtYWluaW5nOwotICAgICAgICBpZiAocmFuZ2VfbGVuZ3RoID49IDApIHsKLSAgICAgICAgICAgIGludDY0X3QgYnl0ZXNMZWZ0SW5SYW5nZSA9IHJhbmdlX2xlbmd0aCAtIGJ1ZmZlci0+c2l6ZSgpOwotICAgICAgICAgICAgaWYgKGJ5dGVzTGVmdEluUmFuZ2UgPCAoaW50NjRfdCltYXhCeXRlc1RvUmVhZCkgewotICAgICAgICAgICAgICAgIG1heEJ5dGVzVG9SZWFkID0gYnl0ZXNMZWZ0SW5SYW5nZTsKLQotICAgICAgICAgICAgICAgIGlmIChieXRlc0xlZnRJblJhbmdlID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIERhdGFTb3VyY2UgaXMgcmVzcG9uc2libGUgZm9yIGluZm9ybWluZyB1cyBvZiBlcnJvciAobiA8IDApIG9yIGVvZiAobiA9PSAwKQotICAgICAgICAvLyB0byBoZWxwIHVzIGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KLSAgICAgICAgc3NpemVfdCBuID0gKCpzb3VyY2UpLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgYnVmZmVyLT5zaXplKCksIGJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5zaXplKCksCi0gICAgICAgICAgICAgICAgbWF4Qnl0ZXNUb1JlYWQpOwotCi0gICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgYnVmZmVyLT5zaXplKCkgKyAoc2l6ZV90KW4pOwotICAgICAgICBieXRlc1JlYWQgKz0gbjsKLSAgICB9Ci0KLSAgICAqb3V0ID0gYnVmZmVyOwotICAgIGlmIChhY3R1YWxVcmwgIT0gTlVMTCkgewotICAgICAgICAqYWN0dWFsVXJsID0gKCpzb3VyY2UpLT5nZXRVcmkoKTsKLSAgICAgICAgaWYgKGFjdHVhbFVybC0+aXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAqYWN0dWFsVXJsID0gdXJsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGJ5dGVzUmVhZDsKLX0KLQotc3A8TTNVUGFyc2VyPiBMaXZlU2Vzc2lvbjo6ZmV0Y2hQbGF5bGlzdCgKLSAgICAgICAgY29uc3QgY2hhciAqdXJsLCB1aW50OF90ICpjdXJQbGF5bGlzdEhhc2gsIGJvb2wgKnVuY2hhbmdlZCkgewotICAgIEFMT0dWKCJmZXRjaFBsYXlsaXN0ICclcyciLCB1cmwpOwotCi0gICAgKnVuY2hhbmdlZCA9IGZhbHNlOwotCi0gICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOwotICAgIFN0cmluZzggYWN0dWFsVXJsOwotICAgIHNzaXplX3QgIGVyciA9IGZldGNoRmlsZSh1cmwsICZidWZmZXIsIDAsIC0xLCAwLCBOVUxMLCAmYWN0dWFsVXJsKTsKLQotICAgIGlmIChlcnIgPD0gMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBNRDUgZnVuY3Rpb25hbGl0eSBpcyBub3QgYXZhaWxhYmxlIG9uIHRoZSBzaW11bGF0b3IsIHRyZWF0IGFsbAotICAgIC8vIHBsYXlsaXN0cyBhcyBjaGFuZ2VkLgotCi0jaWYgZGVmaW5lZChIQVZFX0FORFJPSURfT1MpCi0gICAgdWludDhfdCBoYXNoWzE2XTsKLQotICAgIE1ENV9DVFggbTsKLSAgICBNRDVfSW5pdCgmbSk7Ci0gICAgTUQ1X1VwZGF0ZSgmbSwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgIE1ENV9GaW5hbChoYXNoLCAmbSk7Ci0KLSAgICBpZiAoY3VyUGxheWxpc3RIYXNoICE9IE5VTEwgJiYgIW1lbWNtcChoYXNoLCBjdXJQbGF5bGlzdEhhc2gsIDE2KSkgewotICAgICAgICAvLyBwbGF5bGlzdCB1bmNoYW5nZWQKLSAgICAgICAgKnVuY2hhbmdlZCA9IHRydWU7Ci0KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKGN1clBsYXlsaXN0SGFzaCAhPSBOVUxMKSB7Ci0gICAgICAgIG1lbWNweShjdXJQbGF5bGlzdEhhc2gsIGhhc2gsIHNpemVvZihoYXNoKSk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBzcDxNM1VQYXJzZXI+IHBsYXlsaXN0ID0KLSAgICAgICAgbmV3IE0zVVBhcnNlcihhY3R1YWxVcmwuc3RyaW5nKCksIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7Ci0KLSAgICBpZiAocGxheWxpc3QtPmluaXRDaGVjaygpICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcGFyc2UgLm0zdTggcGxheWxpc3QiKTsKLQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcGxheWxpc3Q7Ci19Ci0KICNpZiAwCiBzdGF0aWMgZG91YmxlIHVuaWZvcm1SYW5kKCkgewogICAgIHJldHVybiAoZG91YmxlKXJhbmQoKSAvIFJBTkRfTUFYOwogfQogI2VuZGlmCiAKLXNpemVfdCBMaXZlU2Vzc2lvbjo6Z2V0QmFuZHdpZHRoSW5kZXgoKSB7Ci0gICAgaWYgKG1CYW5kd2lkdGhJdGVtcy5zaXplKCkgPT0gMCkgeworYm9vbCBMaXZlU2Vzc2lvbjo6VXJpSXNTYW1lQXNJbmRleChjb25zdCBBU3RyaW5nICZ1cmksIGludDMyX3QgaSwgYm9vbCBuZXdVcmkpIHsKKyAgICBBTE9HSSgiW3RpbWVkX2lkM10gaSAlZCBVcmlJc1NhbWVBc0luZGV4IG5ld1VyaSAlcywgJXMiLCBpLAorICAgICAgICAgICAgbmV3VXJpID8gInRydWUiIDogImZhbHNlIiwKKyAgICAgICAgICAgIG5ld1VyaSA/IG1TdHJlYW1zW2ldLm1OZXdVcmkuY19zdHIoKSA6IG1TdHJlYW1zW2ldLm1VcmkuY19zdHIoKSk7CisgICAgcmV0dXJuIGkgPj0gMAorICAgICAgICAgICAgJiYgKCghbmV3VXJpICYmIHVyaSA9PSBtU3RyZWFtc1tpXS5tVXJpKQorICAgICAgICAgICAgfHwgKG5ld1VyaSAmJiB1cmkgPT0gbVN0cmVhbXNbaV0ubU5ld1VyaSkpOworfQorCitzcDxBbm90aGVyUGFja2V0U291cmNlPiBMaXZlU2Vzc2lvbjo6Z2V0UGFja2V0U291cmNlRm9yU3RyZWFtSW5kZXgoCisgICAgICAgIHNpemVfdCB0cmFja0luZGV4LCBib29sIG5ld1VyaSkgeworICAgIFN0cmVhbVR5cGUgdHlwZSA9IGluZGV4VG9UeXBlKHRyYWNrSW5kZXgpOworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IE5VTEw7CisgICAgaWYgKG5ld1VyaSkgeworICAgICAgICBzb3VyY2UgPSBtUGFja2V0U291cmNlczIudmFsdWVGb3IodHlwZSk7CisgICAgICAgIHNvdXJjZS0+Y2xlYXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzb3VyY2UgPSBtUGFja2V0U291cmNlcy52YWx1ZUZvcih0eXBlKTsKKyAgICB9OworICAgIHJldHVybiBzb3VyY2U7Cit9CisKK3NwPEFub3RoZXJQYWNrZXRTb3VyY2U+IExpdmVTZXNzaW9uOjpnZXRNZXRhZGF0YVNvdXJjZSgKKyAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlc1trTnVtU291cmNlc10sIHVpbnQzMl90IHN0cmVhbU1hc2ssIGJvb2wgbmV3VXJpKSB7CisgICAgLy8gdG9kbzogT25lIGNhc2Ugd2hlcmUgdGhlIGZvbGxvd2luZyBzdHJhdGVneSBjYW4gZmFpbCBpcyB3aGVuIGF1ZGlvIGFuZCB2aWRlbworICAgIC8vIGFyZSBpbiBzZXBhcmF0ZSBwbGF5bGlzdHMsIGJvdGggYXJlIHRyYW5zcG9ydCBzdHJlYW1zLCBhbmQgdGhlIG1ldGFkYXRhCisgICAgLy8gaXMgYWN0dWFsbHkgY29udGFpbmVkIGluIHRoZSBhdWRpbyBzdHJlYW0uCisgICAgQUxPR1YoIlt0aW1lZF9pZDNdIGdldE1ldGFkYXRhU291cmNlRm9yVXJpIHN0cmVhbU1hc2sgJXggbmV3VXJpICVzIiwKKyAgICAgICAgICAgIHN0cmVhbU1hc2ssIG5ld1VyaSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCisgICAgaWYgKChzb3VyY2VzW2tWaWRlb0luZGV4XSAhPSBOVUxMKSAvLyB2aWRlbyBmZXRjaGVyOyBvciAuLi4KKyAgICAgICAgICAgIHx8ICghKHN0cmVhbU1hc2sgJiBTVFJFQU1UWVBFX1ZJREVPKSAmJiBzb3VyY2VzW2tBdWRpb0luZGV4XSAhPSBOVUxMKSkgeworICAgICAgICAgICAgLy8gLi4uIGF1ZGlvIGZldGNoZXIgZm9yIGF1ZGlvIG9ubHkgdmFyaWFudAorICAgICAgICByZXR1cm4gZ2V0UGFja2V0U291cmNlRm9yU3RyZWFtSW5kZXgoa01ldGFEYXRhSW5kZXgsIG5ld1VyaSk7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2Jvb2wgTGl2ZVNlc3Npb246OnJlc3VtZUZldGNoZXIoCisgICAgICAgIGNvbnN0IEFTdHJpbmcgJnVyaSwgdWludDMyX3Qgc3RyZWFtTWFzaywgaW50NjRfdCB0aW1lVXMsIGJvb2wgbmV3VXJpKSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1GZXRjaGVySW5mb3MuaW5kZXhPZktleSh1cmkpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR0UoImRpZCBub3QgZmluZCBmZXRjaGVyIGZvciB1cmk6ICVzIiwgdXJpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCByZXN1bWUgPSBmYWxzZTsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2VzW2tOdW1Tb3VyY2VzXTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKKyAgICAgICAgaWYgKChzdHJlYW1NYXNrICYgaW5kZXhUb1R5cGUoaSkpICYmIFVyaUlzU2FtZUFzSW5kZXgodXJpLCBpLCBuZXdVcmkpKSB7CisgICAgICAgICAgICByZXN1bWUgPSB0cnVlOworICAgICAgICAgICAgc291cmNlc1tpXSA9IGdldFBhY2tldFNvdXJjZUZvclN0cmVhbUluZGV4KGksIG5ld1VyaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmVzdW1lKSB7CisgICAgICAgIHNwPFBsYXlsaXN0RmV0Y2hlcj4gJmZldGNoZXIgPSBtRmV0Y2hlckluZm9zLmVkaXRWYWx1ZUF0KGluZGV4KS5tRmV0Y2hlcjsKKyAgICAgICAgU2Vla01vZGUgc2Vla01vZGUgPSBuZXdVcmkgPyBrU2Vla01vZGVOZXh0U2FtcGxlIDoga1NlZWtNb2RlRXhhY3RQb3NpdGlvbjsKKworICAgICAgICBBTE9HVigicmVzdW1pbmcgZmV0Y2hlci0lZCwgdGltZVVzPSVsbGQsIHNlZWtNb2RlPSVkIiwKKyAgICAgICAgICAgICAgICBmZXRjaGVyLT5nZXRGZXRjaGVySUQoKSwgKGxvbmcgbG9uZyl0aW1lVXMsIHNlZWtNb2RlKTsKKworICAgICAgICBmZXRjaGVyLT5zdGFydEFzeW5jKAorICAgICAgICAgICAgICAgIHNvdXJjZXNba0F1ZGlvSW5kZXhdLAorICAgICAgICAgICAgICAgIHNvdXJjZXNba1ZpZGVvSW5kZXhdLAorICAgICAgICAgICAgICAgIHNvdXJjZXNba1N1YnRpdGxlSW5kZXhdLAorICAgICAgICAgICAgICAgIGdldE1ldGFkYXRhU291cmNlKHNvdXJjZXMsIHN0cmVhbU1hc2ssIG5ld1VyaSksCisgICAgICAgICAgICAgICAgdGltZVVzLCAtMSwgLTEsIHNlZWtNb2RlKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdW1lOworfQorCitmbG9hdCBMaXZlU2Vzc2lvbjo6Z2V0QWJvcnRUaHJlc2hvbGQoCisgICAgICAgIHNzaXplX3QgY3VycmVudEJXSW5kZXgsIHNzaXplX3QgdGFyZ2V0QldJbmRleCkgY29uc3QgeworICAgIGZsb2F0IGFib3J0VGhyZXNob2xkID0gLTEuMGY7CisgICAgaWYgKGN1cnJlbnRCV0luZGV4ID4gMCAmJiB0YXJnZXRCV0luZGV4IDwgY3VycmVudEJXSW5kZXgpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICAgSWYgd2UncmUgc3dpdGNoaW5nIGRvd24sIHdlIG5lZWQgdG8gZGVjaWRlIHdoZXRoZXIgdG8KKworICAgICAgICAgICAxKSBmaW5pc2ggbGFzdCBzZWdtZW50IG9mIGhpZ2gtYmFuZHdpZHRoIHZhcmlhbnQsIG9yCisgICAgICAgICAgIDIpIGFib3J0IGxhc3Qgc2VnbWVudCBvZiBoaWdoLWJhbmR3aWR0aCB2YXJpYW50LCBhbmQgZmV0Y2ggYW4KKyAgICAgICAgICAgICAgb3ZlcmxhcHBpbmcgcG9ydGlvbiBmcm9tIGxvdy1iYW5kd2lkdGggdmFyaWFudC4KKworICAgICAgICAgICBIZXJlIHdlIHRyeSB0byBtYXhpbWl6ZSB0aGUgYW1vdW50IG9mIGJ1ZmZlciBsZWZ0IHdoZW4gdGhlCisgICAgICAgICAgIHN3aXRjaCBwb2ludCBpcyBtZXQuIEdpdmVuIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKworICAgICAgICAgICBCOiBvdXIgY3VycmVudCBidWZmZXJpbmcgbGV2ZWwgaW4gc2Vjb25kcworICAgICAgICAgICBUOiB0YXJnZXQgZHVyYXRpb24gaW4gc2Vjb25kcworICAgICAgICAgICBYOiBzYW1wbGUgZHVyYXRpb24gaW4gc2Vjb25kcyByZW1haW4gdG8gZmV0Y2ggaW4gbGFzdCBzZWdtZW50CisgICAgICAgICAgIGJ3MDogYmFuZHdpZHRoIG9mIG9sZCB2YXJpYW50IChhcyBzcGVjaWZpZWQgaW4gcGxheWxpc3QpCisgICAgICAgICAgIGJ3MTogYmFuZHdpZHRoIG9mIG5ldyB2YXJpYW50IChhcyBzcGVjaWZpZWQgaW4gcGxheWxpc3QpCisgICAgICAgICAgIGJ3OiBtZWFzdXJlZCBiYW5kd2lkdGggYXZhaWxhYmxlCisKKyAgICAgICAgICAgSWYgd2UgY2hvb3NlIDEpLCB3aGVuIHN3aXRjaCBoYXBwZW5zIGF0IHRoZSBlbmQgb2YgY3VycmVudAorICAgICAgICAgICBzZWdtZW50LCBvdXIgYnVmZmVyaW5nIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgIEIgKyBYIC0gWCAqIGJ3MCAvIGJ3CisKKyAgICAgICAgICAgSWYgd2UgY2hvb3NlIDIpLCB3aGVuIHN3aXRjaCBoYXBwZW5zIHdoZXJlIHdlIGFib3J0ZWQgY3VycmVudAorICAgICAgICAgICBzZWdtZW50LCBvdXIgYnVmZmVyaW5nIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgIEIgLSAoVCAtIFgpICogYncxIC8gYncKKworICAgICAgICAgICBXZSBzaG91bGQgb25seSBjaG9vc2UgMSkgaWYKKyAgICAgICAgICAgICAgICAgIFgvVCA8IGJ3MSAvIChidzEgKyBidzAgLSBidykKKyAgICAgICAgKi8KKworICAgICAgICAvLyBhYm9ydCBvbGQgYmFuZHdpZHRoIGltbWVkaWF0ZWx5IGlmIGJhbmR3aWR0aCBpcyBmbHVjdHVhdGluZyBhIGxvdC4KKyAgICAgICAgLy8gb3VyIGVzdGltYXRlIGNvdWxkIGJlIGZhciBvZmYsIGFuZCBmZXRjaGluZyBvbGQgYmFuZHdpZHRoIGNvdWxkCisgICAgICAgIC8vIHRha2UgdG9vIGxvbmcuCisgICAgICAgIGlmICghbUxhc3RCYW5kd2lkdGhTdGFibGUpIHsKKyAgICAgICAgICAgIHJldHVybiAwLjBmOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGFraW5nIHRoZSBtZWFzdXJlZCBjdXJyZW50IGJhbmR3aWR0aCBhdCA1MCUgZmFjZSB2YWx1ZSBvbmx5LAorICAgICAgICAvLyBhcyBvdXIgYmFuZHdpZHRoIGVzdGltYXRpb24gaXMgYSBsYWdnaW5nIGluZGljYXRvci4gQmVpbmcKKyAgICAgICAgLy8gY29uc2VydmF0aXZlIG9uIHRoaXMsIHdlIHByZWZlciBzd2l0Y2hpbmcgdG8gbG93ZXIgYmFuZHdpZHRoCisgICAgICAgIC8vIHVubGVzcyB3ZSdyZSByZWFsbHkgY29uZmlkZW50IGZpbmlzaGluZyB1cCB0aGUgbGFzdCBzZWdtZW50CisgICAgICAgIC8vIG9mIGhpZ2hlciBiYW5kd2lkdGggd2lsbCBiZSBmYXN0LgorICAgICAgICBDSEVDSyhtTGFzdEJhbmR3aWR0aEJwcyA+PSAwKTsKKyAgICAgICAgYWJvcnRUaHJlc2hvbGQgPQorICAgICAgICAgICAgICAgIChmbG9hdCltQmFuZHdpZHRoSXRlbXMuaXRlbUF0KHRhcmdldEJXSW5kZXgpLm1CYW5kd2lkdGgKKyAgICAgICAgICAgICAvICgoZmxvYXQpbUJhbmR3aWR0aEl0ZW1zLml0ZW1BdCh0YXJnZXRCV0luZGV4KS5tQmFuZHdpZHRoCisgICAgICAgICAgICAgICsgKGZsb2F0KW1CYW5kd2lkdGhJdGVtcy5pdGVtQXQoY3VycmVudEJXSW5kZXgpLm1CYW5kd2lkdGgKKyAgICAgICAgICAgICAgLSAoZmxvYXQpbUxhc3RCYW5kd2lkdGhCcHMgKiAwLjVmKTsKKyAgICAgICAgaWYgKGFib3J0VGhyZXNob2xkIDwgMC4wZikgeworICAgICAgICAgICAgYWJvcnRUaHJlc2hvbGQgPSAtMS4wZjsgLy8gZG8gbm90IGFib3J0CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlN3aXRjaGluZyBEb3duOiBicHMgJWxkID0+ICVsZCwgbWVhc3VyZWQgJWQsIGFib3J0IHJhdGlvICUuMmYiLAorICAgICAgICAgICAgICAgIG1CYW5kd2lkdGhJdGVtcy5pdGVtQXQoY3VycmVudEJXSW5kZXgpLm1CYW5kd2lkdGgsCisgICAgICAgICAgICAgICAgbUJhbmR3aWR0aEl0ZW1zLml0ZW1BdCh0YXJnZXRCV0luZGV4KS5tQmFuZHdpZHRoLAorICAgICAgICAgICAgICAgIG1MYXN0QmFuZHdpZHRoQnBzLAorICAgICAgICAgICAgICAgIGFib3J0VGhyZXNob2xkKTsKKyAgICB9CisgICAgcmV0dXJuIGFib3J0VGhyZXNob2xkOworfQorCit2b2lkIExpdmVTZXNzaW9uOjphZGRCYW5kd2lkdGhNZWFzdXJlbWVudChzaXplX3QgbnVtQnl0ZXMsIGludDY0X3QgZGVsYXlVcykgeworICAgIG1CYW5kd2lkdGhFc3RpbWF0b3ItPmFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KG51bUJ5dGVzLCBkZWxheVVzKTsKK30KKworc3NpemVfdCBMaXZlU2Vzc2lvbjo6Z2V0TG93ZXN0VmFsaWRCYW5kd2lkdGhJbmRleCgpIGNvbnN0IHsKKyAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgbUJhbmR3aWR0aEl0ZW1zLnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICBpZiAoaXNCYW5kd2lkdGhWYWxpZChtQmFuZHdpZHRoSXRlbXNbaW5kZXhdKSkgeworICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICB9CisgICAgfQorICAgIC8vIGlmIHBsYXlsaXN0cyBhcmUgYWxsIGJsYWNrbGlzdGVkLCByZXR1cm4gMCBhbmQgaG9wZSBpdCdzIGFsaXZlCisgICAgcmV0dXJuIDA7Cit9CisKK3NpemVfdCBMaXZlU2Vzc2lvbjo6Z2V0QmFuZHdpZHRoSW5kZXgoaW50MzJfdCBiYW5kd2lkdGhCcHMpIHsKKyAgICBpZiAobUJhbmR3aWR0aEl0ZW1zLnNpemUoKSA8IDIpIHsKKyAgICAgICAgLy8gc2hvdWxkbid0IGJlIGhlcmUgaWYgd2Ugb25seSBoYXZlIDEgYmFuZHdpZHRoLCBjaGVjaworICAgICAgICAvLyBsb2dpYyB0byBnZXQgcmlkIG9mIHJlZHVuZGFudCBiYW5kd2lkdGggcG9sbGluZworICAgICAgICBBTE9HVygiZ2V0QmFuZHdpZHRoSW5kZXgoKSBjYWxsZWQgZm9yIHNpbmdsZSBiYW5kd2lkdGggcGxheWxpc3QhIik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIApAQCAtMTAxNCwxNSArMTM0Nyw2IEBACiAgICAgfQogCiAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBpbnQzMl90IGJhbmR3aWR0aEJwczsKLSAgICAgICAgaWYgKG1IVFRQRGF0YVNvdXJjZSAhPSBOVUxMCi0gICAgICAgICAgICAgICAgJiYgbUhUVFBEYXRhU291cmNlLT5lc3RpbWF0ZUJhbmR3aWR0aCgmYmFuZHdpZHRoQnBzKSkgewotICAgICAgICAgICAgQUxPR1YoImJhbmR3aWR0aCBlc3RpbWF0ZWQgYXQgJS4yZiBrYnBzIiwgYmFuZHdpZHRoQnBzIC8gMTAyNC4wZik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigibm8gYmFuZHdpZHRoIGVzdGltYXRlLiIpOwotICAgICAgICAgICAgcmV0dXJuIDA7ICAvLyBQaWNrIHRoZSBsb3dlc3QgYmFuZHdpZHRoIHN0cmVhbSBieSBkZWZhdWx0LgotICAgICAgICB9Ci0KICAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgICAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5odHRwbGl2ZS5tYXgtYnciLCB2YWx1ZSwgTlVMTCkpIHsKICAgICAgICAgICAgIGNoYXIgKmVuZDsKQEAgLTEwMzUsMjAgKzEzNTksMTggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vIFBpY2sgdGhlIGhpZ2hlc3QgYmFuZHdpZHRoIHN0cmVhbSBiZWxvdyBvciBlcXVhbCB0byBlc3RpbWF0ZWQgYmFuZHdpZHRoLgorICAgICAgICAvLyBQaWNrIHRoZSBoaWdoZXN0IGJhbmR3aWR0aCBzdHJlYW0gdGhhdCdzIG5vdCBjdXJyZW50bHkgYmxhY2tsaXN0ZWQKKyAgICAgICAgLy8gYmVsb3cgb3IgZXF1YWwgdG8gZXN0aW1hdGVkIGJhbmR3aWR0aC4KIAogICAgICAgICBpbmRleCA9IG1CYW5kd2lkdGhJdGVtcy5zaXplKCkgLSAxOwotICAgICAgICB3aGlsZSAoaW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAvLyBjb25zaWRlciBvbmx5IDgwJSBvZiB0aGUgYXZhaWxhYmxlIGJhbmR3aWR0aCwgYnV0IGlmIHdlIGFyZSBzd2l0Y2hpbmcgdXAsCi0gICAgICAgICAgICAvLyBiZSBldmVuIG1vcmUgY29uc2VydmF0aXZlICg3MCUpIHRvIGF2b2lkIG92ZXJlc3RpbWF0aW5nIGFuZCBpbW1lZGlhdGVseQotICAgICAgICAgICAgLy8gc3dpdGNoaW5nIGJhY2suCi0gICAgICAgICAgICBzaXplX3QgYWRqdXN0ZWRCYW5kd2lkdGhCcHMgPSBiYW5kd2lkdGhCcHM7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPiBtQ3VyQmFuZHdpZHRoSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBhZGp1c3RlZEJhbmR3aWR0aEJwcyA9IGFkanVzdGVkQmFuZHdpZHRoQnBzICogNyAvIDEwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhZGp1c3RlZEJhbmR3aWR0aEJwcyA9IGFkanVzdGVkQmFuZHdpZHRoQnBzICogOCAvIDEwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1CYW5kd2lkdGhJdGVtcy5pdGVtQXQoaW5kZXgpLm1CYW5kd2lkdGggPD0gYWRqdXN0ZWRCYW5kd2lkdGhCcHMpIHsKKyAgICAgICAgc3NpemVfdCBsb3dlc3RCYW5kd2lkdGggPSBnZXRMb3dlc3RWYWxpZEJhbmR3aWR0aEluZGV4KCk7CisgICAgICAgIHdoaWxlIChpbmRleCA+IGxvd2VzdEJhbmR3aWR0aCkgeworICAgICAgICAgICAgLy8gYmUgY29uc2VydmF0aXZlICg3MCUpIHRvIGF2b2lkIG92ZXJlc3RpbWF0aW5nIGFuZCBpbW1lZGlhdGVseQorICAgICAgICAgICAgLy8gc3dpdGNoaW5nIGRvd24gYWdhaW4uCisgICAgICAgICAgICBzaXplX3QgYWRqdXN0ZWRCYW5kd2lkdGhCcHMgPSBiYW5kd2lkdGhCcHMgKiA3IC8gMTA7CisgICAgICAgICAgICBjb25zdCBCYW5kd2lkdGhJdGVtICZpdGVtID0gbUJhbmR3aWR0aEl0ZW1zW2luZGV4XTsKKyAgICAgICAgICAgIGlmIChpdGVtLm1CYW5kd2lkdGggPD0gYWRqdXN0ZWRCYW5kd2lkdGhCcHMKKyAgICAgICAgICAgICAgICAgICAgJiYgaXNCYW5kd2lkdGhWYWxpZChpdGVtKSkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLS1pbmRleDsKQEAgLTExMDcsMzQgKzE0MjksMjAgQEAKICAgICByZXR1cm4gaW5kZXg7CiB9CiAKLWludDY0X3QgTGl2ZVNlc3Npb246OmxhdGVzdE1lZGlhU2VnbWVudFN0YXJ0VGltZVVzKCkgewotICAgIHNwPEFNZXNzYWdlPiBhdWRpb01ldGEgPSBtUGFja2V0U291cmNlcy52YWx1ZUZvcihTVFJFQU1UWVBFX0FVRElPKS0+Z2V0TGF0ZXN0RGVxdWV1ZWRNZXRhKCk7Ci0gICAgaW50NjRfdCBtaW5TZWdtZW50U3RhcnRUaW1lVXMgPSAtMSwgdmlkZW9TZWdtZW50U3RhcnRUaW1lVXMgPSAtMTsKLSAgICBpZiAoYXVkaW9NZXRhICE9IE5VTEwpIHsKLSAgICAgICAgYXVkaW9NZXRhLT5maW5kSW50NjQoInNlZ21lbnRTdGFydFRpbWVVcyIsICZtaW5TZWdtZW50U3RhcnRUaW1lVXMpOwotICAgIH0KK0hMU1RpbWUgTGl2ZVNlc3Npb246OmxhdGVzdE1lZGlhU2VnbWVudFN0YXJ0VGltZSgpIGNvbnN0IHsKKyAgICBITFNUaW1lIGF1ZGlvVGltZShtUGFja2V0U291cmNlcy52YWx1ZUZvcigKKyAgICAgICAgICAgICAgICAgICAgU1RSRUFNVFlQRV9BVURJTyktPmdldExhdGVzdERlcXVldWVkTWV0YSgpKTsKIAotICAgIHNwPEFNZXNzYWdlPiB2aWRlb01ldGEgPSBtUGFja2V0U291cmNlcy52YWx1ZUZvcihTVFJFQU1UWVBFX1ZJREVPKS0+Z2V0TGF0ZXN0RGVxdWV1ZWRNZXRhKCk7Ci0gICAgaWYgKHZpZGVvTWV0YSAhPSBOVUxMCi0gICAgICAgICAgICAmJiB2aWRlb01ldGEtPmZpbmRJbnQ2NCgic2VnbWVudFN0YXJ0VGltZVVzIiwgJnZpZGVvU2VnbWVudFN0YXJ0VGltZVVzKSkgewotICAgICAgICBpZiAobWluU2VnbWVudFN0YXJ0VGltZVVzIDwgMCB8fCB2aWRlb1NlZ21lbnRTdGFydFRpbWVVcyA8IG1pblNlZ21lbnRTdGFydFRpbWVVcykgewotICAgICAgICAgICAgbWluU2VnbWVudFN0YXJ0VGltZVVzID0gdmlkZW9TZWdtZW50U3RhcnRUaW1lVXM7Ci0gICAgICAgIH0KKyAgICBITFNUaW1lIHZpZGVvVGltZShtUGFja2V0U291cmNlcy52YWx1ZUZvcigKKyAgICAgICAgICAgICAgICAgICAgU1RSRUFNVFlQRV9WSURFTyktPmdldExhdGVzdERlcXVldWVkTWV0YSgpKTsKIAotICAgIH0KLSAgICByZXR1cm4gbWluU2VnbWVudFN0YXJ0VGltZVVzOworICAgIHJldHVybiBhdWRpb1RpbWUgPCB2aWRlb1RpbWUgPyB2aWRlb1RpbWUgOiBhdWRpb1RpbWU7CiB9CiAKLXN0YXR1c190IExpdmVTZXNzaW9uOjpvblNlZWsoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKK3ZvaWQgTGl2ZVNlc3Npb246Om9uU2Vlayhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIGludDY0X3QgdGltZVVzOwogICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0KLSAgICBpZiAoIW1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzKSB7Ci0gICAgICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24odGltZVVzLCBtQ3VyQmFuZHdpZHRoSW5kZXgpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKLSAgICB9CisgICAgY2hhbmdlQ29uZmlndXJhdGlvbih0aW1lVXMpOwogfQogCiBzdGF0dXNfdCBMaXZlU2Vzc2lvbjo6Z2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25VcykgY29uc3QgewpAQCAtMTE2NSw3ICsxNDczLDcgQEAKICAgICBpZiAobVBsYXlsaXN0ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1QbGF5bGlzdC0+Z2V0VHJhY2tDb3VudCgpOworICAgICAgICByZXR1cm4gbVBsYXlsaXN0LT5nZXRUcmFja0NvdW50KCkgKyAobUhhc01ldGFkYXRhID8gMSA6IDApOwogICAgIH0KIH0KIApAQCAtMTE3Myw2ICsxNDgxLDEzIEBACiAgICAgaWYgKG1QbGF5bGlzdCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh0cmFja0luZGV4ID09IG1QbGF5bGlzdC0+Z2V0VHJhY2tDb3VudCgpICYmIG1IYXNNZXRhZGF0YSkgeworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigidHlwZSIsIE1FRElBX1RSQUNLX1RZUEVfTUVUQURBVEEpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoImxhbmd1YWdlIiwgInVuZCIpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9EQVRBX1RJTUVEX0lEMyk7CisgICAgICAgICAgICByZXR1cm4gZm9ybWF0OworICAgICAgICB9CiAgICAgICAgIHJldHVybiBtUGxheWxpc3QtPmdldFRyYWNrSW5mbyh0cmFja0luZGV4KTsKICAgICB9CiB9CkBAIC0xMTgyLDExICsxNDk3LDEzIEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKKyAgICBBTE9HVigic2VsZWN0VHJhY2s6IGluZGV4PSV6dSwgc2VsZWN0PSVkLCBtU3VidGl0bGVHZW49JWQrKyIsCisgICAgICAgICAgICBpbmRleCwgc2VsZWN0LCBtU3VidGl0bGVHZW5lcmF0aW9uKTsKKwogICAgICsrbVN1YnRpdGxlR2VuZXJhdGlvbjsKICAgICBzdGF0dXNfdCBlcnIgPSBtUGxheWxpc3QtPnNlbGVjdFRyYWNrKGluZGV4LCBzZWxlY3QpOwogICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENoYW5nZUNvbmZpZ3VyYXRpb24sIGlkKCkpOwotICAgICAgICBtc2ctPnNldEludDMyKCJiYW5kd2lkdGhJbmRleCIsIG1DdXJCYW5kd2lkdGhJbmRleCk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDaGFuZ2VDb25maWd1cmF0aW9uLCB0aGlzKTsKICAgICAgICAgbXNnLT5zZXRJbnQzMigicGlja1RyYWNrIiwgc2VsZWN0KTsKICAgICAgICAgbXNnLT5wb3N0KCk7CiAgICAgfQpAQCAtMTIwMSwzNSArMTUxOCwyNSBAQAogICAgIH0KIH0KIAotYm9vbCBMaXZlU2Vzc2lvbjo6Y2FuU3dpdGNoVXAoKSB7Ci0gICAgLy8gQWxsb3cgdXB3YXJkcyBiYW5kd2lkdGggc3dpdGNoIHdoZW4gYSBzdHJlYW0gaGFzIGJ1ZmZlcmVkIGF0IGxlYXN0IDEwIHNlY29uZHMuCi0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGFja2V0U291cmNlcy5zaXplKCk7ICsraSkgewotICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBtUGFja2V0U291cmNlcy52YWx1ZUF0KGkpOwotICAgICAgICBpbnQ2NF90IGR1ciA9IHNvdXJjZS0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZlcnIpOwotICAgICAgICBpZiAoZXJyID09IE9LICYmIGR1ciA+IDEwMDAwMDAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KIHZvaWQgTGl2ZVNlc3Npb246OmNoYW5nZUNvbmZpZ3VyYXRpb24oCi0gICAgICAgIGludDY0X3QgdGltZVVzLCBzaXplX3QgYmFuZHdpZHRoSW5kZXgsIGJvb2wgcGlja1RyYWNrKSB7Ci0gICAgLy8gUHJvdGVjdCBtUGFja2V0U291cmNlcyBmcm9tIGEgc3dhcFBhY2tldFNvdXJjZSByYWNlIGNvbmRpdGlvbiB0aHJvdWdoIHJlY29uZmlndXJhdGlvbi4KLSAgICAvLyAoY2hhbmdlQ29uZmlndXJhdGlvbiwgb25DaGFuZ2VDb25maWd1cmF0aW9uMiwgb25DaGFuZ2VDb25maWd1cmF0aW9uMykuCisgICAgICAgIGludDY0X3QgdGltZVVzLCBzc2l6ZV90IGJhbmR3aWR0aEluZGV4LCBib29sIHBpY2tUcmFjaykgeworICAgIEFMT0dWKCJjaGFuZ2VDb25maWd1cmF0aW9uOiB0aW1lVXM9JWxsZCB1cywgYndJbmRleD0lemQsIHBpY2tUcmFjaz0lZCIsCisgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lVXMsIGJhbmR3aWR0aEluZGV4LCBwaWNrVHJhY2spOworCiAgICAgY2FuY2VsQmFuZHdpZHRoU3dpdGNoKCk7CiAKICAgICBDSEVDSyghbVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MpOwogICAgIG1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzID0gdHJ1ZTsKLQotICAgIG1DdXJCYW5kd2lkdGhJbmRleCA9IGJhbmR3aWR0aEluZGV4OwotCi0gICAgQUxPR1YoImNoYW5nZUNvbmZpZ3VyYXRpb24gPT4gdGltZVVzOiUiIFBSSWQ2NCAiIHVzLCBid0luZGV4OiV6dSwgcGlja1RyYWNrOiVkIiwKLSAgICAgICAgICB0aW1lVXMsIGJhbmR3aWR0aEluZGV4LCBwaWNrVHJhY2spOwotCi0gICAgQ0hFQ0tfTFQoYmFuZHdpZHRoSW5kZXgsIG1CYW5kd2lkdGhJdGVtcy5zaXplKCkpOwotICAgIGNvbnN0IEJhbmR3aWR0aEl0ZW0gJml0ZW0gPSBtQmFuZHdpZHRoSXRlbXMuaXRlbUF0KGJhbmR3aWR0aEluZGV4KTsKKyAgICBpZiAoYmFuZHdpZHRoSW5kZXggPj0gMCkgeworICAgICAgICBtT3JpZ0JhbmR3aWR0aEluZGV4ID0gbUN1ckJhbmR3aWR0aEluZGV4OworICAgICAgICBtQ3VyQmFuZHdpZHRoSW5kZXggPSBiYW5kd2lkdGhJbmRleDsKKyAgICAgICAgaWYgKG1PcmlnQmFuZHdpZHRoSW5kZXggIT0gbUN1ckJhbmR3aWR0aEluZGV4KSB7CisgICAgICAgICAgICBBTE9HSSgiIyMjIyBTdGFydGluZyBCYW5kd2lkdGggU3dpdGNoOiAlemQgPT4gJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgbU9yaWdCYW5kd2lkdGhJbmRleCwgbUN1ckJhbmR3aWR0aEluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBDSEVDS19MVChtQ3VyQmFuZHdpZHRoSW5kZXgsIG1CYW5kd2lkdGhJdGVtcy5zaXplKCkpOworICAgIGNvbnN0IEJhbmR3aWR0aEl0ZW0gJml0ZW0gPSBtQmFuZHdpZHRoSXRlbXMuaXRlbUF0KG1DdXJCYW5kd2lkdGhJbmRleCk7CiAKICAgICB1aW50MzJfdCBzdHJlYW1NYXNrID0gMDsgLy8gc3RyZWFtcyB0aGF0IHNob3VsZCBiZSBmZXRjaGVkIGJ5IHRoZSBuZXcgZmV0Y2hlcgogICAgIHVpbnQzMl90IHJlc3VtZU1hc2sgPSAwOyAvLyBzdHJlYW1zIHRoYXQgc2hvdWxkIGJlIGZldGNoZWQgYnkgdGhlIG9yaWdpbmFsIGZldGNoZXIKQEAgLTEyNDQsMzggKzE1NTEsNjAgQEAKICAgICAvLyBTdGVwIDEsIHN0b3AgYW5kIGRpc2NhcmQgZmV0Y2hlcnMgdGhhdCBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KICAgICAvLyBQYXVzZSB0aG9zZSB0aGF0IHdlJ2xsIHJldXNlLgogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZldGNoZXJJbmZvcy5zaXplKCk7ICsraSkgeworICAgICAgICAvLyBza2lwIGZldGNoZXJzIHRoYXQgYXJlIG1hcmtlZCBtVG9CZVJlbW92ZWQsCisgICAgICAgIC8vIHRoZXNlIGFyZSBkb25lIGFuZCBjYW4ndCBiZSByZXVzZWQKKyAgICAgICAgaWYgKG1GZXRjaGVySW5mb3NbaV0ubVRvQmVSZW1vdmVkKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCiAgICAgICAgIGNvbnN0IEFTdHJpbmcgJnVyaSA9IG1GZXRjaGVySW5mb3Mua2V5QXQoaSk7CisgICAgICAgIHNwPFBsYXlsaXN0RmV0Y2hlcj4gJmZldGNoZXIgPSBtRmV0Y2hlckluZm9zLmVkaXRWYWx1ZUF0KGkpLm1GZXRjaGVyOwogCi0gICAgICAgIGJvb2wgZGlzY2FyZEZldGNoZXIgPSB0cnVlOwotCi0gICAgICAgIC8vIElmIHdlJ3JlIHNlZWtpbmcgYWxsIGN1cnJlbnQgZmV0Y2hlcnMgYXJlIGRpc2NhcmRlZC4KLSAgICAgICAgaWYgKHRpbWVVcyA8IDBsbCkgewotICAgICAgICAgICAgLy8gZGVsYXkgZmV0Y2hlciByZW1vdmFsIGlmIG5vdCBwaWNraW5nIHRyYWNrcwotICAgICAgICAgICAgZGlzY2FyZEZldGNoZXIgPSBwaWNrVHJhY2s7Ci0KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwga01heFN0cmVhbXM7ICsraikgewotICAgICAgICAgICAgICAgIFN0cmVhbVR5cGUgdHlwZSA9IGluZGV4VG9UeXBlKGopOwotICAgICAgICAgICAgICAgIGlmICgoc3RyZWFtTWFzayAmIHR5cGUpICYmIHVyaSA9PSBVUklzW2pdKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VtZU1hc2sgfD0gdHlwZTsKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtTWFzayAmPSB+dHlwZTsKLSAgICAgICAgICAgICAgICAgICAgZGlzY2FyZEZldGNoZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIGJvb2wgZGlzY2FyZEZldGNoZXIgPSB0cnVlLCBkZWxheVJlbW92YWwgPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBrTWF4U3RyZWFtczsgKytqKSB7CisgICAgICAgICAgICBTdHJlYW1UeXBlIHR5cGUgPSBpbmRleFRvVHlwZShqKTsKKyAgICAgICAgICAgIGlmICgoc3RyZWFtTWFzayAmIHR5cGUpICYmIHVyaSA9PSBVUklzW2pdKSB7CisgICAgICAgICAgICAgICAgcmVzdW1lTWFzayB8PSB0eXBlOworICAgICAgICAgICAgICAgIHN0cmVhbU1hc2sgJj0gfnR5cGU7CisgICAgICAgICAgICAgICAgZGlzY2FyZEZldGNoZXIgPSBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAvLyBEZWxheSBmZXRjaGVyIHJlbW92YWwgaWYgbm90IHBpY2tpbmcgdHJhY2tzLCBBTkQgb2xkIGZldGNoZXIKKyAgICAgICAgLy8gaGFzIHN0cmVhbSBtYXNrIHRoYXQgb3ZlcmxhcHMgbmV3IHZhcmlhbnQuIChPa2F5IHRvIGRpc2NhcmQKKyAgICAgICAgLy8gb2xkIGZldGNoZXIgbm93LCBpZiBjb21wbGV0ZWx5IG5vIG92ZXJsYXAuKQorICAgICAgICBpZiAoZGlzY2FyZEZldGNoZXIgJiYgdGltZVVzIDwgMGxsICYmICFwaWNrVHJhY2sKKyAgICAgICAgICAgICAgICAmJiAoZmV0Y2hlci0+Z2V0U3RyZWFtVHlwZU1hc2soKSAmIHN0cmVhbU1hc2spKSB7CisgICAgICAgICAgICBkaXNjYXJkRmV0Y2hlciA9IGZhbHNlOworICAgICAgICAgICAgZGVsYXlSZW1vdmFsID0gdHJ1ZTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChkaXNjYXJkRmV0Y2hlcikgewotICAgICAgICAgICAgbUZldGNoZXJJbmZvcy52YWx1ZUF0KGkpLm1GZXRjaGVyLT5zdG9wQXN5bmMoKTsKKyAgICAgICAgICAgIEFMT0dWKCJkaXNjYXJkaW5nIGZldGNoZXItJWQiLCBmZXRjaGVyLT5nZXRGZXRjaGVySUQoKSk7CisgICAgICAgICAgICBmZXRjaGVyLT5zdG9wQXN5bmMoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1GZXRjaGVySW5mb3MudmFsdWVBdChpKS5tRmV0Y2hlci0+cGF1c2VBc3luYygpOworICAgICAgICAgICAgZmxvYXQgdGhyZXNob2xkID0gMC4wZjsgLy8gZGVmYXVsdCB0byBwYXVzZSBhZnRlciBjdXJyZW50IGJsb2NrICg0N0tieXRlcykKKyAgICAgICAgICAgIGJvb2wgZGlzY29ubmVjdCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKHRpbWVVcyA+PSAwbGwpIHsKKyAgICAgICAgICAgICAgICAvLyBzZWVraW5nLCBubyBuZWVkIHRvIGZpbmlzaCBmZXRjaGluZworICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3QgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChkZWxheVJlbW92YWwpIHsKKyAgICAgICAgICAgICAgICAvLyBhZGFwdGluZywgYWJvcnQgaWYgcmVtYWluaW5nIG9mIGN1cnJlbnQgc2VnbWVudCBpcyBvdmVyIHRocmVzaG9sZAorICAgICAgICAgICAgICAgIHRocmVzaG9sZCA9IGdldEFib3J0VGhyZXNob2xkKAorICAgICAgICAgICAgICAgICAgICAgICAgbU9yaWdCYW5kd2lkdGhJbmRleCwgbUN1ckJhbmR3aWR0aEluZGV4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoInBhdXNpbmcgZmV0Y2hlci0lZCwgdGhyZXNob2xkPSUuMmYiLAorICAgICAgICAgICAgICAgICAgICBmZXRjaGVyLT5nZXRGZXRjaGVySUQoKSwgdGhyZXNob2xkKTsKKyAgICAgICAgICAgIGZldGNoZXItPnBhdXNlQXN5bmModGhyZXNob2xkLCBkaXNjb25uZWN0KTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHNwPEFNZXNzYWdlPiBtc2c7CiAgICAgaWYgKHRpbWVVcyA8IDBsbCkgewogICAgICAgICAvLyBza2lwIG9uQ2hhbmdlQ29uZmlndXJhdGlvbjIgKGRlY29kZXIgZGVzdHJ1Y3Rpb24pIGlmIG5vdCBzZWVraW5nLgotICAgICAgICBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDaGFuZ2VDb25maWd1cmF0aW9uMywgaWQoKSk7CisgICAgICAgIG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENoYW5nZUNvbmZpZ3VyYXRpb24zLCB0aGlzKTsKICAgICB9IGVsc2UgewotICAgICAgICBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDaGFuZ2VDb25maWd1cmF0aW9uMiwgaWQoKSk7CisgICAgICAgIG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENoYW5nZUNvbmZpZ3VyYXRpb24yLCB0aGlzKTsKICAgICB9CiAgICAgbXNnLT5zZXRJbnQzMigic3RyZWFtTWFzayIsIHN0cmVhbU1hc2spOwogICAgIG1zZy0+c2V0SW50MzIoInJlc3VtZU1hc2siLCByZXN1bWVNYXNrKTsKQEAgLTEyOTYsNDAgKzE2MjUsNzQgQEAKIAogICAgIGlmIChtQ29udGludWF0aW9uQ291bnRlciA9PSAwKSB7CiAgICAgICAgIG1zZy0+cG9zdCgpOwotCi0gICAgICAgIGlmIChtU2Vla1JlcGx5SUQgIT0gMCkgewotICAgICAgICAgICAgQ0hFQ0sobVNlZWtSZXBseSAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1TZWVrUmVwbHktPnNldEludDMyKCJlcnIiLCBPSyk7Ci0gICAgICAgICAgICBtU2Vla1JlcGx5LT5wb3N0UmVwbHkobVNlZWtSZXBseUlEKTsKLSAgICAgICAgICAgIG1TZWVrUmVwbHlJRCA9IDA7Ci0gICAgICAgICAgICBtU2Vla1JlcGx5LmNsZWFyKCk7Ci0gICAgICAgIH0KICAgICB9CiB9CiAKIHZvaWQgTGl2ZVNlc3Npb246Om9uQ2hhbmdlQ29uZmlndXJhdGlvbihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIEFMT0dWKCJvbkNoYW5nZUNvbmZpZ3VyYXRpb24iKTsKKwogICAgIGlmICghbVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MpIHsKLSAgICAgICAgaW50MzJfdCBwaWNrVHJhY2sgPSAwLCBiYW5kd2lkdGhJbmRleCA9IG1DdXJCYW5kd2lkdGhJbmRleDsKKyAgICAgICAgaW50MzJfdCBwaWNrVHJhY2sgPSAwOwogICAgICAgICBtc2ctPmZpbmRJbnQzMigicGlja1RyYWNrIiwgJnBpY2tUcmFjayk7Ci0gICAgICAgIG1zZy0+ZmluZEludDMyKCJiYW5kd2lkdGhJbmRleCIsICZiYW5kd2lkdGhJbmRleCk7Ci0gICAgICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24oLTFsbCAvKiB0aW1lVXMgKi8sIGJhbmR3aWR0aEluZGV4LCBwaWNrVHJhY2spOworICAgICAgICBjaGFuZ2VDb25maWd1cmF0aW9uKC0xbGwgLyogdGltZVVzICovLCAtMSwgcGlja1RyYWNrKTsKICAgICB9IGVsc2UgewogICAgICAgICBtc2ctPnBvc3QoMTAwMDAwMGxsKTsgLy8gcmV0cnkgaW4gMSBzZWMKICAgICB9CiB9CiAKIHZvaWQgTGl2ZVNlc3Npb246Om9uQ2hhbmdlQ29uZmlndXJhdGlvbjIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBBTE9HVigib25DaGFuZ2VDb25maWd1cmF0aW9uMiIpOworCiAgICAgbUNvbnRpbnVhdGlvbi5jbGVhcigpOwogCiAgICAgLy8gQWxsIGZldGNoZXJzIGFyZSBlaXRoZXIgc3VzcGVuZGVkIG9yIGhhdmUgYmVlbiByZW1vdmVkIG5vdy4KIAorICAgIC8vIElmIHdlJ3JlIHNlZWtpbmcsIGNsZWFyIGFsbCBwYWNrZXQgc291cmNlcyBiZWZvcmUgd2UgcmVwb3J0CisgICAgLy8gc2VlayBjb21wbGV0ZSwgdG8gcHJldmVudCBkZWNvZGVyIGZyb20gcHVsbGluZyBzdGFsZSBkYXRhLgorICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisKKyAgICBpZiAodGltZVVzID49IDApIHsKKyAgICAgICAgbUxhc3RTZWVrVGltZVVzID0gdGltZVVzOworICAgICAgICBtTGFzdERlcXVldWVkVGltZVVzID0gdGltZVVzOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhY2tldFNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHBhY2tldFNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLmVkaXRWYWx1ZUF0KGkpOworICAgICAgICAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IHBhY2tldFNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgICAgICAgICBwYWNrZXRTb3VyY2UtPmNsZWFyKCk7CisgICAgICAgICAgICAvLyBTZXQgYSB0ZW50YXRpdmUgZm9ybWF0IGhlcmUgc3VjaCB0aGF0IEhUVFBMaXZlU291cmNlIHdpbGwgYWx3YXlzIGhhdmUKKyAgICAgICAgICAgIC8vIGEgZm9ybWF0IGF2YWlsYWJsZSB3aGVuIE51UGxheWVyIHF1ZXJpZXMuIFdpdGhvdXQgYW4gYXZhaWxhYmxlIHZpZGVvCisgICAgICAgICAgICAvLyBmb3JtYXQgd2hlbiBzZXR0aW5nIGEgc3VyZmFjZSBOdVBsYXllciBtaWdodCBkaXNhYmxlIHZpZGVvIGRlY29kaW5nCisgICAgICAgICAgICAvLyBhbHRvZ2V0aGVyLiBUaGUgdGVudGF0aXZlIGZvcm1hdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZQorICAgICAgICAgICAgLy8gYXV0aG9yaXRhdGl2ZSAoYW5kIHBvc3NpYmx5IHNhbWUpIGZvcm1hdCBvbmNlIGNvbnRlbnQgZnJvbSB0aGUgbmV3CisgICAgICAgICAgICAvLyBwb3NpdGlvbiBpcyBkZXF1ZXVlZC4KKyAgICAgICAgICAgIHBhY2tldFNvdXJjZS0+c2V0Rm9ybWF0KGZvcm1hdCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKKyAgICAgICAgICAgIG1TdHJlYW1zW2ldLnJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBtRGlzY29udGludWl0eU9mZnNldFRpbWVzVXMuY2xlYXIoKTsKKyAgICAgICAgbURpc2NvbnRpbnVpdHlBYnNTdGFydFRpbWVzVXMuY2xlYXIoKTsKKworICAgICAgICBpZiAobVNlZWtSZXBseUlEICE9IE5VTEwpIHsKKyAgICAgICAgICAgIENIRUNLKG1TZWVrUmVwbHkgIT0gTlVMTCk7CisgICAgICAgICAgICBtU2Vla1JlcGx5LT5zZXRJbnQzMigiZXJyIiwgT0spOworICAgICAgICAgICAgbVNlZWtSZXBseS0+cG9zdFJlcGx5KG1TZWVrUmVwbHlJRCk7CisgICAgICAgICAgICBtU2Vla1JlcGx5SUQuY2xlYXIoKTsKKyAgICAgICAgICAgIG1TZWVrUmVwbHkuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlc3RhcnQgYnVmZmVyIHBvbGxpbmcgYWZ0ZXIgc2VlayBiZWNhdWVzZSBwcmV2aW91cworICAgICAgICAvLyBidWZmZXJpbmcgcG9zaXRpb24gaXMgbm8gbG9uZ2VyIHZhbGlkLgorICAgICAgICByZXN0YXJ0UG9sbEJ1ZmZlcmluZygpOworICAgIH0KKwogICAgIHVpbnQzMl90IHN0cmVhbU1hc2ssIHJlc3VtZU1hc2s7CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInN0cmVhbU1hc2siLCAoaW50MzJfdCAqKSZzdHJlYW1NYXNrKSk7CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VtZU1hc2siLCAoaW50MzJfdCAqKSZyZXN1bWVNYXNrKSk7CiAKLSAgICAvLyBjdXJyZW50bHkgb25DaGFuZ2VDb25maWd1cmF0aW9uMiBpcyBvbmx5IGNhbGxlZCBmb3Igc2Vla2luZzsKLSAgICAvLyByZW1vdmUgdGhlIGZvbGxvd2luZyBDSEVDSyBpZiB1c2luZyBpdCBlbHNlIHdoZXJlLgotICAgIENIRUNLX0VRKHJlc3VtZU1hc2ssIDApOwogICAgIHN0cmVhbU1hc2sgfD0gcmVzdW1lTWFzazsKIAogICAgIEFTdHJpbmcgVVJJc1trTWF4U3RyZWFtc107CkBAIC0xMzQxLDE3ICsxNzA0LDI3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBEZXRlcm1pbmUgd2hpY2ggZGVjb2RlcnMgdG8gc2h1dGRvd24gb24gdGhlIHBsYXllciBzaWRlLAotICAgIC8vIGEgZGVjb2RlciBoYXMgdG8gYmUgc2h1dGRvd24gaWYgZWl0aGVyCi0gICAgLy8gMSkgaXRzIHN0cmVhbXR5cGUgd2FzIGFjdGl2ZSBiZWZvcmUgYnV0IG5vdyBsb25nZXIgaXNuJ3QuCi0gICAgLy8gb3IKLSAgICAvLyAyKSBpdHMgc3RyZWFtdHlwZSB3YXMgYWxyZWFkeSBhY3RpdmUgYW5kIHN0aWxsIGlzIGJ1dCB0aGUgVVJJCi0gICAgLy8gICAgaGFzIGNoYW5nZWQuCiAgICAgdWludDMyX3QgY2hhbmdlZE1hc2sgPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heFN0cmVhbXMgJiYgaSAhPSBrU3VidGl0bGVJbmRleDsgKytpKSB7Ci0gICAgICAgIGlmICgoKG1TdHJlYW1NYXNrICYgc3RyZWFtTWFzayAmIGluZGV4VG9UeXBlKGkpKQotICAgICAgICAgICAgICAgICYmICEoVVJJc1tpXSA9PSBtU3RyZWFtc1tpXS5tVXJpKSkKLSAgICAgICAgICAgICAgICB8fCAobVN0cmVhbU1hc2sgJiB+c3RyZWFtTWFzayAmIGluZGV4VG9UeXBlKGkpKSkgeworICAgICAgICAvLyBzdHJlYW0gVVJJIGNvdWxkIGNoYW5nZSBldmVuIGlmIG9uQ2hhbmdlQ29uZmlndXJhdGlvbjIgaXMgb25seQorICAgICAgICAvLyB1c2VkIGZvciBzZWVrLiBTZWVrIGNvdWxkIGhhcHBlbiBkdXJpbmcgYSBidyBzd2l0Y2gsIGluIHRoaXMKKyAgICAgICAgLy8gY2FzZSBidyBzd2l0Y2ggd2lsbCBiZSBjYW5jZWxsZWQsIGJ1dCB0aGUgc2Vla1RvIHBvc2l0aW9uIHdpbGwKKyAgICAgICAgLy8gZmV0Y2ggZnJvbSB0aGUgbmV3IFVSSS4KKyAgICAgICAgaWYgKChtU3RyZWFtTWFzayAmIHN0cmVhbU1hc2sgJiBpbmRleFRvVHlwZShpKSkKKyAgICAgICAgICAgICAgICAmJiAhbVN0cmVhbXNbaV0ubVVyaS5lbXB0eSgpCisgICAgICAgICAgICAgICAgJiYgIShVUklzW2ldID09IG1TdHJlYW1zW2ldLm1VcmkpKSB7CisgICAgICAgICAgICBBTE9HVigic3RyZWFtICV6dSBjaGFuZ2VkOiBvbGRVUkkgJXMsIG5ld1VSSSAlcyIsIGksCisgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1zW2ldLm1VcmkuY19zdHIoKSwgVVJJc1tpXS5jX3N0cigpKTsKKyAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKGluZGV4VG9UeXBlKGkpKTsKKyAgICAgICAgICAgIGlmIChzb3VyY2UtPmdldExhdGVzdERlcXVldWVkTWV0YSgpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBzb3VyY2UtPnF1ZXVlRGlzY29udGludWl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9GT1JNQVRDSEFOR0UsIE5VTEwsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIERldGVybWluZSB3aGljaCBkZWNvZGVycyB0byBzaHV0ZG93biBvbiB0aGUgcGxheWVyIHNpZGUsCisgICAgICAgIC8vIGEgZGVjb2RlciBoYXMgdG8gYmUgc2h1dGRvd24gaWYgaXRzIHN0cmVhbXR5cGUgd2FzIGFjdGl2ZQorICAgICAgICAvLyBiZWZvcmUgYnV0IG5vdyBsb25nZXIgaXNuJ3QuCisgICAgICAgIGlmICgobVN0cmVhbU1hc2sgJiB+c3RyZWFtTWFzayAmIGluZGV4VG9UeXBlKGkpKSkgewogICAgICAgICAgICAgY2hhbmdlZE1hc2sgfD0gaW5kZXhUb1R5cGUoaSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMzcyLDcgKzE3NDUsNyBAQAogICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5nZWRNYXNrIiwgY2hhbmdlZE1hc2spOwogCiAgICAgbXNnLT5zZXRXaGF0KGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbjMpOwotICAgIG1zZy0+c2V0VGFyZ2V0KGlkKCkpOworICAgIG1zZy0+c2V0VGFyZ2V0KHRoaXMpOwogCiAgICAgbm90aWZ5LT5zZXRNZXNzYWdlKCJyZXBseSIsIG1zZyk7CiAgICAgbm90aWZ5LT5wb3N0KCk7CkBAIC0xMzg3LDYgKzE3NjAsOCBAQAogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzdHJlYW1NYXNrIiwgKGludDMyX3QgKikmc3RyZWFtTWFzaykpOwogICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bWVNYXNrIiwgKGludDMyX3QgKikmcmVzdW1lTWFzaykpOwogCisgICAgbU5ld1N0cmVhbU1hc2sgPSBzdHJlYW1NYXNrIHwgcmVzdW1lTWFzazsKKwogICAgIGludDY0X3QgdGltZVVzOwogICAgIGludDMyX3QgcGlja1RyYWNrOwogICAgIGJvb2wgc3dpdGNoaW5nID0gZmFsc2U7CkBAIC0xMzk1LDEzICsxNzcwLDI2IEBACiAKICAgICBpZiAodGltZVVzIDwgMGxsKSB7CiAgICAgICAgIGlmICghcGlja1RyYWNrKSB7Ci0gICAgICAgICAgICBzd2l0Y2hpbmcgPSB0cnVlOworICAgICAgICAgICAgLy8gbVN3YXBNYXNrIGNvbnRhaW5zIHN0cmVhbXMgdGhhdCBhcmUgaW4gYm90aCBvbGQgYW5kIG5ldyB2YXJpYW50LAorICAgICAgICAgICAgLy8gKGluIG1OZXdTdHJlYW1NYXNrICYgbVN0cmVhbU1hc2spIGJ1dCB3aXRoIGRpZmZlcmVudCBVUklzCisgICAgICAgICAgICAvLyAobm90IGluIHJlc3VtZU1hc2spLgorICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsIG9sZCB2YXJpYW50IGhhcyB2aWRlbyBhbmQgYXVkaW8gaW4gdHdvIHNlcGFyYXRlCisgICAgICAgICAgICAvLyBVUklzLCBhbmQgbmV3IHZhcmlhbnQgaGFzIG9ubHkgYXVkaW8gd2l0aCB1bmNoYW5nZWQgVVJJLiBtU3dhcE1hc2sKKyAgICAgICAgICAgIC8vIHNob3VsZCBiZSAwIGFzIHRoZXJlIGlzIG5vdGhpbmcgdG8gc3dhcC4gV2Ugb25seSBuZWVkIHRvIHN0b3AgdmlkZW8sCisgICAgICAgICAgICAvLyBhbmQgcmVzdW1lIGF1ZGlvLgorICAgICAgICAgICAgbVN3YXBNYXNrID0gIG1OZXdTdHJlYW1NYXNrICYgbVN0cmVhbU1hc2sgJiB+cmVzdW1lTWFzazsKKyAgICAgICAgICAgIHN3aXRjaGluZyA9IChtU3dhcE1hc2sgIT0gMCk7CiAgICAgICAgIH0KICAgICAgICAgbVJlYWxUaW1lQmFzZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIG1MYXN0RGVxdWV1ZWRUaW1lVXM7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbVJlYWxUaW1lQmFzZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHRpbWVVczsKICAgICB9CiAKKyAgICBBTE9HVigib25DaGFuZ2VDb25maWd1cmF0aW9uMzogdGltZVVzPSVsbGQsIHN3aXRjaGluZz0lZCwgcGlja1RyYWNrPSVkLCAiCisgICAgICAgICAgICAibVN0cmVhbU1hc2s9MHgleCwgbU5ld1N0cmVhbU1hc2s9MHgleCwgbVN3YXBNYXNrPTB4JXgiLAorICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lVXMsIHN3aXRjaGluZywgcGlja1RyYWNrLAorICAgICAgICAgICAgbVN0cmVhbU1hc2ssIG1OZXdTdHJlYW1NYXNrLCBtU3dhcE1hc2spOworCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7CiAgICAgICAgIGlmIChzdHJlYW1NYXNrICYgaW5kZXhUb1R5cGUoaSkpIHsKICAgICAgICAgICAgIGlmIChzd2l0Y2hpbmcpIHsKQEAgLTE0MTIsNDcgKzE4MDAsMjEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIG1OZXdTdHJlYW1NYXNrID0gc3RyZWFtTWFzayB8IHJlc3VtZU1hc2s7Ci0gICAgaWYgKHN3aXRjaGluZykgewotICAgICAgICBtU3dhcE1hc2sgPSBtU3RyZWFtTWFzayAmIH5yZXN1bWVNYXNrOwotICAgIH0KLQogICAgIC8vIE9mIGFsbCBleGlzdGluZyBmZXRjaGVyczoKICAgICAvLyAqIFJlc3VtZSBmZXRjaGVycyB0aGF0IGFyZSBzdGlsbCBuZWVkZWQgYW5kIGFzc2lnbiB0aGVtIG9yaWdpbmFsIHBhY2tldCBzb3VyY2VzLgogICAgIC8vICogTWFyayBvdGhlcndpc2UgdW5uZWVkZWQgZmV0Y2hlcnMgZm9yIHJlbW92YWwuCiAgICAgQUxPR1YoInJlc3VtaW5nIGZldGNoZXJzIGZvciBtYXNrIDB4JTA4eCIsIHJlc3VtZU1hc2spOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZldGNoZXJJbmZvcy5zaXplKCk7ICsraSkgewogICAgICAgICBjb25zdCBBU3RyaW5nICZ1cmkgPSBtRmV0Y2hlckluZm9zLmtleUF0KGkpOworICAgICAgICBpZiAoIXJlc3VtZUZldGNoZXIodXJpLCByZXN1bWVNYXNrLCB0aW1lVXMpKSB7CisgICAgICAgICAgICBBTE9HVigibWFya2luZyBmZXRjaGVyLSVkIHRvIGJlIHJlbW92ZWQiLAorICAgICAgICAgICAgICAgICAgICBtRmV0Y2hlckluZm9zW2ldLm1GZXRjaGVyLT5nZXRGZXRjaGVySUQoKSk7CiAKLSAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlc1trTWF4U3RyZWFtc107Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwga01heFN0cmVhbXM7ICsraikgewotICAgICAgICAgICAgaWYgKChyZXN1bWVNYXNrICYgaW5kZXhUb1R5cGUoaikpICYmIHVyaSA9PSBtU3RyZWFtc1tqXS5tVXJpKSB7Ci0gICAgICAgICAgICAgICAgc291cmNlc1tqXSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKLQotICAgICAgICAgICAgICAgIGlmIChqICE9IGtTdWJ0aXRsZUluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJxdWV1ZWluZyBkdW1teSBkaXNjb250aW51aXR5IGZvciBzdHJlYW0gdHlwZSAlZCIsIGluZGV4VG9UeXBlKGopKTsKLSAgICAgICAgICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gZGlzY29udGludWl0eVF1ZXVlOwotICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5UXVldWUgPSBtRGlzY29udGludWl0aWVzLnZhbHVlRm9yKGluZGV4VG9UeXBlKGopKTsKLSAgICAgICAgICAgICAgICAgICAgZGlzY29udGludWl0eVF1ZXVlLT5xdWV1ZURpc2NvbnRpbnVpdHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBGZXRjaGVySW5mbyAmaW5mbyA9IG1GZXRjaGVySW5mb3MuZWRpdFZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChzb3VyY2VzW2tBdWRpb0luZGV4XSAhPSBOVUxMIHx8IHNvdXJjZXNba1ZpZGVvSW5kZXhdICE9IE5VTEwKLSAgICAgICAgICAgICAgICB8fCBzb3VyY2VzW2tTdWJ0aXRsZUluZGV4XSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpbmZvLm1GZXRjaGVyLT5zdGFydEFzeW5jKAotICAgICAgICAgICAgICAgICAgICBzb3VyY2VzW2tBdWRpb0luZGV4XSwgc291cmNlc1trVmlkZW9JbmRleF0sIHNvdXJjZXNba1N1YnRpdGxlSW5kZXhdKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGluZm8ubVRvQmVSZW1vdmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIG1GZXRjaGVySW5mb3MuZWRpdFZhbHVlQXQoaSkubVRvQmVSZW1vdmVkID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8vIHN0cmVhbU1hc2sgbm93IG9ubHkgY29udGFpbnMgdGhlIHR5cGVzIHRoYXQgbmVlZCBhIG5ldyBmZXRjaGVyIGNyZWF0ZWQuCi0KICAgICBpZiAoc3RyZWFtTWFzayAhPSAwKSB7CiAgICAgICAgIEFMT0dWKCJjcmVhdGluZyBuZXcgZmV0Y2hlcnMgZm9yIG1hc2sgMHglMDh4Iiwgc3RyZWFtTWFzayk7CiAgICAgfQpAQCAtMTQ3MCwxMyArMTgzMiwxMiBAQAogICAgICAgICBzcDxQbGF5bGlzdEZldGNoZXI+IGZldGNoZXIgPSBhZGRGZXRjaGVyKHVyaS5jX3N0cigpKTsKICAgICAgICAgQ0hFQ0soZmV0Y2hlciAhPSBOVUxMKTsKIAotICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gLTE7Ci0gICAgICAgIGludDY0X3Qgc2VnbWVudFN0YXJ0VGltZVVzID0gLTFsbDsKLSAgICAgICAgaW50MzJfdCBkaXNjb250aW51aXR5U2VxID0gLTE7Ci0gICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZXNba01heFN0cmVhbXNdOworICAgICAgICBITFNUaW1lIHN0YXJ0VGltZTsKKyAgICAgICAgU2Vla01vZGUgc2Vla01vZGUgPSBrU2Vla01vZGVFeGFjdFBvc2l0aW9uOworICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2VzW2tOdW1Tb3VyY2VzXTsKIAotICAgICAgICBpZiAoaSA9PSBrU3VidGl0bGVJbmRleCkgewotICAgICAgICAgICAgc2VnbWVudFN0YXJ0VGltZVVzID0gbGF0ZXN0TWVkaWFTZWdtZW50U3RhcnRUaW1lVXMoKTsKKyAgICAgICAgaWYgKGkgPT0ga1N1YnRpdGxlSW5kZXggfHwgKCFwaWNrVHJhY2sgJiYgIXN3aXRjaGluZykpIHsKKyAgICAgICAgICAgIHN0YXJ0VGltZSA9IGxhdGVzdE1lZGlhU2VnbWVudFN0YXJ0VGltZSgpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gVFJJQ0tZOiBsb29waW5nIGZyb20gaSBhcyBlYXJsaWVyIHN0cmVhbXMgYXJlIGFscmVhZHkgcmVtb3ZlZCBmcm9tIHN0cmVhbU1hc2sKQEAgLTE0ODYsNjMgKzE4NDcsNTAgQEAKICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoaW5kZXhUb1R5cGUoaikpOwogCiAgICAgICAgICAgICAgICAgaWYgKHRpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvdXJjZXNbal0tPmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZVVzID0gdGltZVVzOwotCi0gICAgICAgICAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGRpc2NvbnRpbnVpdHlRdWV1ZTsKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGV4dHJhID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgICAgICBleHRyYS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7Ci0gICAgICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVpdHlRdWV1ZSA9IG1EaXNjb250aW51aXRpZXMudmFsdWVGb3IoaW5kZXhUb1R5cGUoaikpOwotICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5UXVldWUtPnF1ZXVlRGlzY29udGludWl0eSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfVElNRSwgZXh0cmEsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUubVRpbWVVcyA9IHRpbWVVczsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHR5cGU7CiAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtZXRhOwotICAgICAgICAgICAgICAgICAgICBpZiAocGlja1RyYWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWxlY3RpbmcKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzd2l0Y2hpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbGVjdGluZywgb3IgYWRhcHRpbmcgYnV0IG5vIHN3YXAgcmVxdWlyZWQKICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEgPSBzb3VyY2VzW2pdLT5nZXRMYXRlc3REZXF1ZXVlZE1ldGEoKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkYXB0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGFwdGluZyBhbmQgc3dhcCByZXF1aXJlZAogICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSA9IHNvdXJjZXNbal0tPmdldExhdGVzdEVucXVldWVkTWV0YSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGEgIT0gTlVMTCAmJiAhbWV0YS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJnR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRtcFVzOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0bXBTZWdtZW50VXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRtcFVzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kSW50NjQoInNlZ21lbnRTdGFydFRpbWVVcyIsICZ0bXBTZWdtZW50VXMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFRpbWVVcyA8IDAgfHwgdG1wU2VnbWVudFVzIDwgc2VnbWVudFN0YXJ0VGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lVXMgPSB0bXBVczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50U3RhcnRUaW1lVXMgPSB0bXBTZWdtZW50VXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRtcFNlZ21lbnRVcyA9PSBzZWdtZW50U3RhcnRUaW1lVXMgJiYgdG1wVXMgPCBzdGFydFRpbWVVcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZVVzID0gdG1wVXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2VxOwotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgJnNlcSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc2NvbnRpbnVpdHlTZXEgPCAwIHx8IHNlcSA8IGRpc2NvbnRpbnVpdHlTZXEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5U2VxID0gc2VxOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGEgIT0gTlVMTCAmJiBtQ3VyQmFuZHdpZHRoSW5kZXggPiBtT3JpZ0JhbmR3aWR0aEluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3dpdGNoaW5nIHVwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSA9IHNvdXJjZXNbal0tPmdldE1ldGFBZnRlckxhc3REZXF1ZXVlZChtVXBTd2l0Y2hNYXJnaW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBpY2tUcmFjaykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0aW5nIHRyYWNrLCBxdWV1ZSBkaXNjb250aW51aXRpZXMgYmVmb3JlIGNvbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgaWYgKChqID09IGtBdWRpb0luZGV4IHx8IGogPT0ga1ZpZGVvSW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWV0YSAhPSBOVUxMICYmICFtZXRhLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEhMU1RpbWUgdG1wVGltZShtZXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFRpbWUgPCB0bXBUaW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gdG1wVGltZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICghc3dpdGNoaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWxlY3RpbmcsIG9yIGFkYXB0aW5nIGJ1dCBubyBzd2FwIHJlcXVpcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdLT5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0ga1N1YnRpdGxlSW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGRpc2NvbnRpbnVpdHlRdWV1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvbnRpbnVpdHlRdWV1ZSA9IG1EaXNjb250aW51aXRpZXMudmFsdWVGb3IoaW5kZXhUb1R5cGUoaikpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGlzY29udGludWl0eVF1ZXVlLT5xdWV1ZURpc2NvbnRpbnVpdHkoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9GT1JNQVRDSEFOR0UsIE5VTEwsIHRydWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigic3RyZWFtWyV6dV06IHF1ZXVlIGZvcm1hdCBjaGFuZ2UiLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXNbal0tPnF1ZXVlRGlzY29udGludWl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVF9PTkxZLCBOVUxMLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkYXB0aW5nLCBxdWV1ZSBkaXNjb250aW51aXRpZXMgYWZ0ZXIgcmVzdW1lCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzd2l0Y2hpbmcsIHF1ZXVlIGRpc2NvbnRpbnVpdGllcyBhZnRlciByZXN1bWUKICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXNbal0gPSBtUGFja2V0U291cmNlczIudmFsdWVGb3IoaW5kZXhUb1R5cGUoaikpOwogICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlc1tqXS0+Y2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGV4dHJhU3RyZWFtcyA9IG1OZXdTdHJlYW1NYXNrICYgKH5tU3RyZWFtTWFzayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0cmFTdHJlYW1zICYgaW5kZXhUb1R5cGUoaikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzW2pdLT5xdWV1ZUFjY2Vzc1VuaXQoY3JlYXRlRm9ybWF0Q2hhbmdlQnVmZmVyKC8qc3dhcCovIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmV3IGZldGNoZXIgbWlnaHQgYmUgcHJvdmlkaW5nIHN0cmVhbXMgdGhhdCB1c2VkIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm92aWRlZCBieSB0d28gZGlmZmVyZW50IGZldGNoZXJzLCAgaWYgb25lIG9mIHRoZSBmZXRjaGVyCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXVzZWQgaW4gdGhlIG1pZGRsZSB3aGlsZSB0aGUgb3RoZXIgc29tZWhvdyBwYXVzZWQgaW4gbmV4dAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VnLCB3ZSBoYXZlIHRvIHN0YXJ0IGZyb20gbmV4dCBzZWcuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vla01vZGUgPCBtU3RyZWFtc1tqXS5tU2Vla01vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVrTW9kZSA9IG1TdHJlYW1zW2pdLm1TZWVrTW9kZTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTE1NTEsNTQgKzE4OTksMTA0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBBTE9HVigiW2ZldGNoZXItJWRdIHN0YXJ0QXN5bmM6IHN0YXJ0VGltZVVzICVsbGQgbUxhc3RTZWVrVGltZVVzICVsbGQgIgorICAgICAgICAgICAgICAgICJzZWdtZW50U3RhcnRUaW1lVXMgJWxsZCBzZWVrTW9kZSAlZCIsCisgICAgICAgICAgICAgICAgZmV0Y2hlci0+Z2V0RmV0Y2hlcklEKCksCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzdGFydFRpbWUubVRpbWVVcywKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1MYXN0U2Vla1RpbWVVcywKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKXN0YXJ0VGltZS5nZXRTZWdtZW50VGltZVVzKCksCisgICAgICAgICAgICAgICAgc2Vla01vZGUpOworCisgICAgICAgIC8vIFNldCB0aGUgdGFyZ2V0IHNlZ21lbnQgc3RhcnQgdGltZSB0byB0aGUgbWlkZGxlIHBvaW50IG9mIHRoZQorICAgICAgICAvLyBzZWdtZW50IHdoZXJlIHRoZSBsYXN0IHNhbXBsZSB3YXMuCisgICAgICAgIC8vIFRoaXMgZ2l2ZXMgYSBiZXR0ZXIgZ3Vlc3MgaWYgc2VnbWVudHMgb2YgdGhlIHR3byB2YXJpYW50cyBhcmUgbm90CisgICAgICAgIC8vIHBlcmZlY3RseSBhbGlnbmVkLiAoSWYgdGhlIGNvcnJlc3BvbmRpbmcgc2VnbWVudCBpbiBuZXcgdmFyaWFudAorICAgICAgICAvLyBzdGFydHMgc2xpZ2h0bHkgbGF0ZXIgdGhhbiB0aGF0IGluIHRoZSBvbGQgdmFyaWFudCwgd2Ugc3RpbGwgd2FudAorICAgICAgICAvLyB0byBwaWNrIHRoYXQgc2VnbWVudCwgbm90IHRoZSBvbmUgYmVmb3JlKQogICAgICAgICBmZXRjaGVyLT5zdGFydEFzeW5jKAogICAgICAgICAgICAgICAgIHNvdXJjZXNba0F1ZGlvSW5kZXhdLAogICAgICAgICAgICAgICAgIHNvdXJjZXNba1ZpZGVvSW5kZXhdLAogICAgICAgICAgICAgICAgIHNvdXJjZXNba1N1YnRpdGxlSW5kZXhdLAotICAgICAgICAgICAgICAgIHN0YXJ0VGltZVVzIDwgMCA/IG1MYXN0U2Vla1RpbWVVcyA6IHN0YXJ0VGltZVVzLAotICAgICAgICAgICAgICAgIHNlZ21lbnRTdGFydFRpbWVVcywKLSAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5U2VxLAotICAgICAgICAgICAgICAgIHN3aXRjaGluZyk7CisgICAgICAgICAgICAgICAgZ2V0TWV0YWRhdGFTb3VyY2Uoc291cmNlcywgbU5ld1N0cmVhbU1hc2ssIHN3aXRjaGluZyksCisgICAgICAgICAgICAgICAgc3RhcnRUaW1lLm1UaW1lVXMgPCAwID8gbUxhc3RTZWVrVGltZVVzIDogc3RhcnRUaW1lLm1UaW1lVXMsCisgICAgICAgICAgICAgICAgc3RhcnRUaW1lLmdldFNlZ21lbnRUaW1lVXMoKSwKKyAgICAgICAgICAgICAgICBzdGFydFRpbWUubVNlcSwKKyAgICAgICAgICAgICAgICBzZWVrTW9kZSk7CiAgICAgfQogCiAgICAgLy8gQWxsIGZldGNoZXJzIGhhdmUgbm93IGJlZW4gc3RhcnRlZCwgdGhlIGNvbmZpZ3VyYXRpb24gY2hhbmdlCiAgICAgLy8gaGFzIGNvbXBsZXRlZC4KIAotICAgIGNhbmNlbENoZWNrQmFuZHdpZHRoRXZlbnQoKTsKLSAgICBzY2hlZHVsZUNoZWNrQmFuZHdpZHRoRXZlbnQoKTsKLQotICAgIEFMT0dWKCJYWFggY29uZmlndXJhdGlvbiBjaGFuZ2UgY29tcGxldGVkLiIpOwogICAgIG1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzID0gZmFsc2U7CiAgICAgaWYgKHN3aXRjaGluZykgewogICAgICAgICBtU3dpdGNoSW5Qcm9ncmVzcyA9IHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbVN0cmVhbU1hc2sgPSBtTmV3U3RyZWFtTWFzazsKKyAgICAgICAgaWYgKG1PcmlnQmFuZHdpZHRoSW5kZXggIT0gbUN1ckJhbmR3aWR0aEluZGV4KSB7CisgICAgICAgICAgICBBTE9HVigiIyMjIyBGaW5pc2hlZCBCYW5kd2lkdGggU3dpdGNoIEVhcmx5OiAlemQgPT4gJXpkIiwKKyAgICAgICAgICAgICAgICAgICAgbU9yaWdCYW5kd2lkdGhJbmRleCwgbUN1ckJhbmR3aWR0aEluZGV4KTsKKyAgICAgICAgICAgIG1PcmlnQmFuZHdpZHRoSW5kZXggPSBtQ3VyQmFuZHdpZHRoSW5kZXg7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAobURpc2Nvbm5lY3RSZXBseUlEICE9IDApIHsKKyAgICBBTE9HVigib25DaGFuZ2VDb25maWd1cmF0aW9uMzogbVN3aXRjaEluUHJvZ3Jlc3MgJWQsIG1TdHJlYW1NYXNrIDB4JXgiLAorICAgICAgICAgICAgbVN3aXRjaEluUHJvZ3Jlc3MsIG1TdHJlYW1NYXNrKTsKKworICAgIGlmIChtRGlzY29ubmVjdFJlcGx5SUQgIT0gTlVMTCkgewogICAgICAgICBmaW5pc2hEaXNjb25uZWN0KCk7CiAgICAgfQogfQogCi12b2lkIExpdmVTZXNzaW9uOjpvblN3YXBwZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBpbnQzMl90IHN3aXRjaEdlbmVyYXRpb247Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInN3aXRjaEdlbmVyYXRpb24iLCAmc3dpdGNoR2VuZXJhdGlvbikpOwotICAgIGlmIChzd2l0Y2hHZW5lcmF0aW9uICE9IG1Td2l0Y2hHZW5lcmF0aW9uKSB7Cit2b2lkIExpdmVTZXNzaW9uOjpzd2FwUGFja2V0U291cmNlKFN0cmVhbVR5cGUgc3RyZWFtKSB7CisgICAgQUxPR1YoIlslc10gc3dhcFBhY2tldFNvdXJjZSIsIGdldE5hbWVGb3JTdHJlYW0oc3RyZWFtKSk7CisKKyAgICAvLyB0cmFuc2ZlciBwYWNrZXRzIGZyb20gc291cmNlMiB0byBzb3VyY2UKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmYXBzID0gbVBhY2tldFNvdXJjZXMuZWRpdFZhbHVlRm9yKHN0cmVhbSk7CisgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmFwczIgPSBtUGFja2V0U291cmNlczIuZWRpdFZhbHVlRm9yKHN0cmVhbSk7CisKKyAgICAvLyBxdWV1ZSBkaXNjb250aW51aXR5IGluIG1QYWNrZXRTb3VyY2UKKyAgICBhcHMtPnF1ZXVlRGlzY29udGludWl0eShBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUX09OTFksIE5VTEwsIGZhbHNlKTsKKworICAgIC8vIHF1ZXVlIHBhY2tldHMgaW4gbVBhY2tldFNvdXJjZTIgdG8gbVBhY2tldFNvdXJjZQorICAgIHN0YXR1c190IGZpbmFsUmVzdWx0ID0gT0s7CisgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdDsKKyAgICB3aGlsZSAoYXBzMi0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkgJiYgZmluYWxSZXN1bHQgPT0gT0sgJiYKKyAgICAgICAgICBPSyA9PSBhcHMyLT5kZXF1ZXVlQWNjZXNzVW5pdCgmYWNjZXNzVW5pdCkpIHsKKyAgICAgICAgYXBzLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CisgICAgfQorICAgIGFwczItPmNsZWFyKCk7Cit9CisKK3ZvaWQgTGl2ZVNlc3Npb246OnRyeVRvRmluaXNoQmFuZHdpZHRoU3dpdGNoKGNvbnN0IEFTdHJpbmcgJm9sZFVyaSkgeworICAgIGlmICghbVN3aXRjaEluUHJvZ3Jlc3MpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGludDMyX3Qgc3RyZWFtOwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzdHJlYW0iLCAmc3RyZWFtKSk7Ci0KLSAgICBzc2l6ZV90IGlkeCA9IHR5cGVUb0luZGV4KHN0cmVhbSk7Ci0gICAgQ0hFQ0soaWR4ID49IDApOwotICAgIGlmICgobU5ld1N0cmVhbU1hc2sgJiBzdHJlYW0pICYmIG1TdHJlYW1zW2lkeF0ubU5ld1VyaS5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dXKCJzd2FwcGluZyBzdHJlYW0gdHlwZSAlZCAlcyB0byBlbXB0eSBzdHJlYW0iLCBzdHJlYW0sIG1TdHJlYW1zW2lkeF0ubVVyaS5jX3N0cigpKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KG9sZFVyaSk7CisgICAgaWYgKGluZGV4IDwgMCB8fCAhbUZldGNoZXJJbmZvc1tpbmRleF0ubVRvQmVSZW1vdmVkKSB7CisgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgbVN0cmVhbXNbaWR4XS5tVXJpID0gbVN0cmVhbXNbaWR4XS5tTmV3VXJpOwotICAgIG1TdHJlYW1zW2lkeF0ubU5ld1VyaS5jbGVhcigpOwogCi0gICAgbVN3YXBNYXNrICY9IH5zdHJlYW07CisgICAgLy8gU3dhcCBwYWNrZXQgc291cmNlIG9mIHN0cmVhbXMgcHJvdmlkZWQgYnkgb2xkIHZhcmlhbnQKKyAgICBmb3IgKHNpemVfdCBpZHggPSAwOyBpZHggPCBrTWF4U3RyZWFtczsgaWR4KyspIHsKKyAgICAgICAgU3RyZWFtVHlwZSBzdHJlYW0gPSBpbmRleFRvVHlwZShpZHgpOworICAgICAgICBpZiAoKG1Td2FwTWFzayAmIHN0cmVhbSkgJiYgKG9sZFVyaSA9PSBtU3RyZWFtc1tpZHhdLm1VcmkpKSB7CisgICAgICAgICAgICBzd2FwUGFja2V0U291cmNlKHN0cmVhbSk7CisKKyAgICAgICAgICAgIGlmICgobU5ld1N0cmVhbU1hc2sgJiBzdHJlYW0pICYmIG1TdHJlYW1zW2lkeF0ubU5ld1VyaS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInN3YXBwaW5nIHN0cmVhbSB0eXBlICVkICVzIHRvIGVtcHR5IHN0cmVhbSIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIG1TdHJlYW1zW2lkeF0ubVVyaS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdHJlYW1zW2lkeF0ubVVyaSA9IG1TdHJlYW1zW2lkeF0ubU5ld1VyaTsKKyAgICAgICAgICAgIG1TdHJlYW1zW2lkeF0ubU5ld1VyaS5jbGVhcigpOworCisgICAgICAgICAgICBtU3dhcE1hc2sgJj0gfnN0cmVhbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1GZXRjaGVySW5mb3MuZWRpdFZhbHVlQXQoaW5kZXgpLm1GZXRjaGVyLT5zdG9wQXN5bmMoZmFsc2UgLyogY2xlYXIgKi8pOworCisgICAgQUxPR1YoInRyeVRvRmluaXNoQmFuZHdpZHRoU3dpdGNoOiBtU3dhcE1hc2s9MHgleCIsIG1Td2FwTWFzayk7CiAgICAgaWYgKG1Td2FwTWFzayAhPSAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0xNjA2LDE1NyArMjAwNCwzNzIgQEAKICAgICAvLyBDaGVjayBpZiBuZXcgdmFyaWFudCBjb250YWlucyBleHRyYSBzdHJlYW1zLgogICAgIHVpbnQzMl90IGV4dHJhU3RyZWFtcyA9IG1OZXdTdHJlYW1NYXNrICYgKH5tU3RyZWFtTWFzayk7CiAgICAgd2hpbGUgKGV4dHJhU3RyZWFtcykgewotICAgICAgICBTdHJlYW1UeXBlIGV4dHJhU3RyZWFtID0gKFN0cmVhbVR5cGUpIChleHRyYVN0cmVhbXMgJiB+KGV4dHJhU3RyZWFtcyAtIDEpKTsKLSAgICAgICAgc3dhcFBhY2tldFNvdXJjZShleHRyYVN0cmVhbSk7Ci0gICAgICAgIGV4dHJhU3RyZWFtcyAmPSB+ZXh0cmFTdHJlYW07CisgICAgICAgIFN0cmVhbVR5cGUgc3RyZWFtID0gKFN0cmVhbVR5cGUpIChleHRyYVN0cmVhbXMgJiB+KGV4dHJhU3RyZWFtcyAtIDEpKTsKKyAgICAgICAgZXh0cmFTdHJlYW1zICY9IH5zdHJlYW07CiAKLSAgICAgICAgaWR4ID0gdHlwZVRvSW5kZXgoZXh0cmFTdHJlYW0pOworICAgICAgICBzd2FwUGFja2V0U291cmNlKHN0cmVhbSk7CisKKyAgICAgICAgc3NpemVfdCBpZHggPSB0eXBlVG9JbmRleChzdHJlYW0pOwogICAgICAgICBDSEVDSyhpZHggPj0gMCk7CiAgICAgICAgIGlmIChtU3RyZWFtc1tpZHhdLm1OZXdVcmkuZW1wdHkoKSkgewogICAgICAgICAgICAgQUxPR1coInN3YXBwaW5nIGV4dHJhIHN0cmVhbSB0eXBlICVkICVzIHRvIGVtcHR5IHN0cmVhbSIsCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhU3RyZWFtLCBtU3RyZWFtc1tpZHhdLm1VcmkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgbVN0cmVhbXNbaWR4XS5tVXJpLmNfc3RyKCkpOwogICAgICAgICB9CiAgICAgICAgIG1TdHJlYW1zW2lkeF0ubVVyaSA9IG1TdHJlYW1zW2lkeF0ubU5ld1VyaTsKICAgICAgICAgbVN0cmVhbXNbaWR4XS5tTmV3VXJpLmNsZWFyKCk7CiAgICAgfQogCi0gICAgdHJ5VG9GaW5pc2hCYW5kd2lkdGhTd2l0Y2goKTsKLX0KLQotdm9pZCBMaXZlU2Vzc2lvbjo6b25DaGVja1N3aXRjaERvd24oKSB7Ci0gICAgaWYgKG1Td2l0Y2hEb3duTW9uaXRvciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobVN3aXRjaEluUHJvZ3Jlc3MgfHwgbVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MpIHsKLSAgICAgICAgQUxPR1YoIlN3aXRjaC9SZWNvbmZpZyBpbiBwcm9ncmVzcywgZGVmZXIgc3dpdGNoIGRvd24iKTsKLSAgICAgICAgbVN3aXRjaERvd25Nb25pdG9yLT5wb3N0KDEwMDAwMDBsbCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhTdHJlYW1zOyArK2kpIHsKLSAgICAgICAgaW50MzJfdCB0YXJnZXREdXJhdGlvbjsKLSAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gcGFja2V0U291cmNlID0gbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoaW5kZXhUb1R5cGUoaSkpOwotICAgICAgICBzcDxBTWVzc2FnZT4gbWV0YSA9IHBhY2tldFNvdXJjZS0+Z2V0TGF0ZXN0RGVxdWV1ZWRNZXRhKCk7Ci0KLSAgICAgICAgaWYgKG1ldGEgIT0gTlVMTCAmJiBtZXRhLT5maW5kSW50MzIoInRhcmdldER1cmF0aW9uIiwgJnRhcmdldER1cmF0aW9uKSApIHsKLSAgICAgICAgICAgIGludDY0X3QgYnVmZmVyZWREdXJhdGlvblVzID0gcGFja2V0U291cmNlLT5nZXRFc3RpbWF0ZWREdXJhdGlvblVzKCk7Ci0gICAgICAgICAgICBpbnQ2NF90IHRhcmdldER1cmF0aW9uVXMgPSB0YXJnZXREdXJhdGlvbiAqIDEwMDAwMDBsbDsKLQotICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA8IHRhcmdldER1cmF0aW9uVXMgLyAzKSB7Ci0gICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN3aXRjaERvd24sIGlkKCkpKS0+cG9zdCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQorICAgIC8vIFJlc3RhcnQgbmV3IGZldGNoZXIgKGl0IHdhcyBwYXVzZWQgYWZ0ZXIgdGhlIGZpcnN0IDQ3ayBibG9jaykKKyAgICAvLyBhbmQgbGV0IGl0IGZldGNoIGludG8gbVBhY2tldFNvdXJjZXMgKG5vdCBtUGFja2V0U291cmNlczIpCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmV0Y2hlckluZm9zLnNpemUoKTsgKytpKSB7CisgICAgICAgIEZldGNoZXJJbmZvICZpbmZvID0gbUZldGNoZXJJbmZvcy5lZGl0VmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGluZm8ubVRvQmVSZXN1bWVkKSB7CisgICAgICAgICAgICByZXN1bWVGZXRjaGVyKG1GZXRjaGVySW5mb3Mua2V5QXQoaSksIG1OZXdTdHJlYW1NYXNrKTsKKyAgICAgICAgICAgIGluZm8ubVRvQmVSZXN1bWVkID0gZmFsc2U7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtU3dpdGNoRG93bk1vbml0b3ItPnBvc3QoMTAwMDAwMGxsKTsKKyAgICBBTE9HSSgiIyMjIyBGaW5pc2hlZCBCYW5kd2lkdGggU3dpdGNoOiAlemQgPT4gJXpkIiwKKyAgICAgICAgICAgIG1PcmlnQmFuZHdpZHRoSW5kZXgsIG1DdXJCYW5kd2lkdGhJbmRleCk7CisKKyAgICBtU3RyZWFtTWFzayA9IG1OZXdTdHJlYW1NYXNrOworICAgIG1Td2l0Y2hJblByb2dyZXNzID0gZmFsc2U7CisgICAgbU9yaWdCYW5kd2lkdGhJbmRleCA9IG1DdXJCYW5kd2lkdGhJbmRleDsKKworICAgIHJlc3RhcnRQb2xsQnVmZmVyaW5nKCk7CiB9CiAKLXZvaWQgTGl2ZVNlc3Npb246Om9uU3dpdGNoRG93bigpIHsKLSAgICBpZiAobVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MgfHwgbVN3aXRjaEluUHJvZ3Jlc3MgfHwgbUN1ckJhbmR3aWR0aEluZGV4ID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNzaXplX3QgYmFuZHdpZHRoSW5kZXggPSBnZXRCYW5kd2lkdGhJbmRleCgpOwotICAgIGlmIChiYW5kd2lkdGhJbmRleCA8IG1DdXJCYW5kd2lkdGhJbmRleCkgewotICAgICAgICBjaGFuZ2VDb25maWd1cmF0aW9uKC0xLCBiYW5kd2lkdGhJbmRleCwgZmFsc2UpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCit2b2lkIExpdmVTZXNzaW9uOjpzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxCdWZmZXJpbmcsIHRoaXMpOworICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24pOworICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOwogfQogCi0vLyBNYXJrIHN3aXRjaCBkb25lIHdoZW46Ci0vLyAgIDEuIGFsbCBvbGQgYnVmZmVycyBhcmUgc3dhcHBlZCBvdXQKLXZvaWQgTGl2ZVNlc3Npb246OnRyeVRvRmluaXNoQmFuZHdpZHRoU3dpdGNoKCkgewordm9pZCBMaXZlU2Vzc2lvbjo6Y2FuY2VsUG9sbEJ1ZmZlcmluZygpIHsKKyAgICArK21Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbjsKKyAgICBtUHJldkJ1ZmZlclBlcmNlbnRhZ2UgPSAtMTsKK30KKwordm9pZCBMaXZlU2Vzc2lvbjo6cmVzdGFydFBvbGxCdWZmZXJpbmcoKSB7CisgICAgY2FuY2VsUG9sbEJ1ZmZlcmluZygpOworICAgIG9uUG9sbEJ1ZmZlcmluZygpOworfQorCit2b2lkIExpdmVTZXNzaW9uOjpvblBvbGxCdWZmZXJpbmcoKSB7CisgICAgQUxPR1YoIm9uUG9sbEJ1ZmZlcmluZzogbVN3aXRjaEluUHJvZ3Jlc3MgJWQsIG1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzICVkLCAiCisgICAgICAgICAgICAibUluUHJlcGFyYXRpb25QaGFzZSAlZCwgbUN1ckJhbmR3aWR0aEluZGV4ICV6ZCwgbVN0cmVhbU1hc2sgMHgleCIsCisgICAgICAgIG1Td2l0Y2hJblByb2dyZXNzLCBtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcywKKyAgICAgICAgbUluUHJlcGFyYXRpb25QaGFzZSwgbUN1ckJhbmR3aWR0aEluZGV4LCBtU3RyZWFtTWFzayk7CisKKyAgICBib29sIHVuZGVyZmxvdywgcmVhZHksIGRvd24sIHVwOworICAgIGlmIChjaGVja0J1ZmZlcmluZyh1bmRlcmZsb3csIHJlYWR5LCBkb3duLCB1cCkpIHsKKyAgICAgICAgaWYgKG1JblByZXBhcmF0aW9uUGhhc2UpIHsKKyAgICAgICAgICAgIC8vIEFsbG93IGRvd24gc3dpdGNoIGV2ZW4gaWYgd2UncmUgc3RpbGwgcHJlcGFyaW5nLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNvbWUgc3RyZWFtcyBoYXZlIGEgaGlnaCBiYW5kd2lkdGggaW5kZXggYXMgZGVmYXVsdCwKKyAgICAgICAgICAgIC8vIHdoZW4gYmFuZHdpZHRoIGlzIGxvdywgaXQgdGFrZXMgYSBsb25nIHRpbWUgdG8gYnVmZmVyCisgICAgICAgICAgICAvLyB0byByZWFkeSBtYXJrLCB0aGVuIGl0IGltbWVkaWF0ZWx5IHBhdXNlcyBhZnRlciBzdGFydAorICAgICAgICAgICAgLy8gYXMgd2UgaGF2ZSB0byBkbyBhIGRvd24gc3dpdGNoLiBJdCdzIGJldHRlciBleHBlcmllbmNlCisgICAgICAgICAgICAvLyB0byByZXN0YXJ0IGZyb20gYSBsb3dlciBpbmRleCwgaWYgd2UgZGV0ZWN0IGxvdyBidy4KKyAgICAgICAgICAgIGlmICghc3dpdGNoQmFuZHdpZHRoSWZOZWVkZWQoZmFsc2UgLyogdXAgKi8sIGRvd24pICYmIHJlYWR5KSB7CisgICAgICAgICAgICAgICAgcG9zdFByZXBhcmVkKE9LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUluUHJlcGFyYXRpb25QaGFzZSkgeworICAgICAgICAgICAgaWYgKHJlYWR5KSB7CisgICAgICAgICAgICAgICAgc3RvcEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHVuZGVyZmxvdykgeworICAgICAgICAgICAgICAgIHN0YXJ0QnVmZmVyaW5nSWZOZWNlc3NhcnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaEJhbmR3aWR0aElmTmVlZGVkKHVwLCBkb3duKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOworfQorCit2b2lkIExpdmVTZXNzaW9uOjpjYW5jZWxCYW5kd2lkdGhTd2l0Y2goYm9vbCByZXN1bWUpIHsKKyAgICBBTE9HVigiY2FuY2VsQmFuZHdpZHRoU3dpdGNoOiBtU3dpdGNoR2VuKCVkKSsrLCBvcmlnICV6ZCwgY3VyICV6ZCIsCisgICAgICAgICAgICBtU3dpdGNoR2VuZXJhdGlvbiwgbU9yaWdCYW5kd2lkdGhJbmRleCwgbUN1ckJhbmR3aWR0aEluZGV4KTsKICAgICBpZiAoIW1Td2l0Y2hJblByb2dyZXNzKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBib29sIG5lZWRUb1JlbW92ZUZldGNoZXJzID0gZmFsc2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmV0Y2hlckluZm9zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmIChtRmV0Y2hlckluZm9zLnZhbHVlQXQoaSkubVRvQmVSZW1vdmVkKSB7Ci0gICAgICAgICAgICBuZWVkVG9SZW1vdmVGZXRjaGVycyA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghbmVlZFRvUmVtb3ZlRmV0Y2hlcnMgJiYgbVN3YXBNYXNrID09IDApIHsKLSAgICAgICAgQUxPR0koIm1Td2l0Y2hJblByb2dyZXNzID0gZmFsc2UiKTsKLSAgICAgICAgbVN0cmVhbU1hc2sgPSBtTmV3U3RyZWFtTWFzazsKLSAgICAgICAgbVN3aXRjaEluUHJvZ3Jlc3MgPSBmYWxzZTsKLSAgICB9Ci19Ci0KLXZvaWQgTGl2ZVNlc3Npb246OnNjaGVkdWxlQ2hlY2tCYW5kd2lkdGhFdmVudCgpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hlY2tCYW5kd2lkdGgsIGlkKCkpOwotICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQ2hlY2tCYW5kd2lkdGhHZW5lcmF0aW9uKTsKLSAgICBtc2ctPnBvc3QoMTAwMDAwMDBsbCk7Ci19Ci0KLXZvaWQgTGl2ZVNlc3Npb246OmNhbmNlbENoZWNrQmFuZHdpZHRoRXZlbnQoKSB7Ci0gICAgKyttQ2hlY2tCYW5kd2lkdGhHZW5lcmF0aW9uOwotfQotCi12b2lkIExpdmVTZXNzaW9uOjpjYW5jZWxCYW5kd2lkdGhTd2l0Y2goKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN3YXBNdXRleCk7Ci0gICAgbVN3aXRjaEdlbmVyYXRpb24rKzsKLSAgICBtU3dpdGNoSW5Qcm9ncmVzcyA9IGZhbHNlOwotICAgIG1Td2FwTWFzayA9IDA7Ci0KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GZXRjaGVySW5mb3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgRmV0Y2hlckluZm8mIGluZm8gPSBtRmV0Y2hlckluZm9zLmVkaXRWYWx1ZUF0KGkpOwogICAgICAgICBpZiAoaW5mby5tVG9CZVJlbW92ZWQpIHsKICAgICAgICAgICAgIGluZm8ubVRvQmVSZW1vdmVkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAocmVzdW1lKSB7CisgICAgICAgICAgICAgICAgcmVzdW1lRmV0Y2hlcihtRmV0Y2hlckluZm9zLmtleUF0KGkpLCBtU3dhcE1hc2spOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4U3RyZWFtczsgKytpKSB7Ci0gICAgICAgIGlmICghbVN0cmVhbXNbaV0ubU5ld1VyaS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBzc2l6ZV90IGogPSBtRmV0Y2hlckluZm9zLmluZGV4T2ZLZXkobVN0cmVhbXNbaV0ubU5ld1VyaSk7Ci0gICAgICAgICAgICBpZiAoaiA8IDApIHsKLSAgICAgICAgICAgICAgICBtU3RyZWFtc1tpXS5tTmV3VXJpLmNsZWFyKCk7CisgICAgICAgIEFTdHJpbmcgbmV3VXJpID0gbVN0cmVhbXNbaV0ubU5ld1VyaTsKKyAgICAgICAgaWYgKCFuZXdVcmkuZW1wdHkoKSkgeworICAgICAgICAgICAgLy8gY2xlYXIgYWxsIG1OZXdVcmkgbWF0Y2hpbmcgdGhpcyBuZXdVcmkKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSBpOyBqIDwga01heFN0cmVhbXM7ICsraikgeworICAgICAgICAgICAgICAgIGlmIChtU3RyZWFtc1tqXS5tTmV3VXJpID09IG5ld1VyaSkgeworICAgICAgICAgICAgICAgICAgICBtU3RyZWFtc1tqXS5tTmV3VXJpLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoInN0b3BwaW5nIG5ld1VyaSA9ICVzIiwgbmV3VXJpLmNfc3RyKCkpOworICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1GZXRjaGVySW5mb3MuaW5kZXhPZktleShuZXdVcmkpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJkaWQgbm90IGZpbmQgZmV0Y2hlciBmb3IgbmV3VXJpOiAlcyIsIG5ld1VyaS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY29uc3QgRmV0Y2hlckluZm8gJmluZm8gPSBtRmV0Y2hlckluZm9zLnZhbHVlQXQoaik7CisgICAgICAgICAgICBGZXRjaGVySW5mbyAmaW5mbyA9IG1GZXRjaGVySW5mb3MuZWRpdFZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgaW5mby5tVG9CZVJlbW92ZWQgPSB0cnVlOwogICAgICAgICAgICAgaW5mby5tRmV0Y2hlci0+c3RvcEFzeW5jKCk7Ci0gICAgICAgICAgICBtRmV0Y2hlckluZm9zLnJlbW92ZUl0ZW1zQXQoaik7Ci0gICAgICAgICAgICBtU3RyZWFtc1tpXS5tTmV3VXJpLmNsZWFyKCk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBBTE9HSSgiIyMjIyBDYW5jZWxlZCBCYW5kd2lkdGggU3dpdGNoOiAlemQgPT4gJXpkIiwKKyAgICAgICAgICAgIG1PcmlnQmFuZHdpZHRoSW5kZXgsIG1DdXJCYW5kd2lkdGhJbmRleCk7CisKKyAgICBtU3dpdGNoR2VuZXJhdGlvbisrOworICAgIG1Td2l0Y2hJblByb2dyZXNzID0gZmFsc2U7CisgICAgbUN1ckJhbmR3aWR0aEluZGV4ID0gbU9yaWdCYW5kd2lkdGhJbmRleDsKKyAgICBtU3dhcE1hc2sgPSAwOwogfQogCi1ib29sIExpdmVTZXNzaW9uOjpjYW5Td2l0Y2hCYW5kd2lkdGhUbyhzaXplX3QgYmFuZHdpZHRoSW5kZXgpIHsKLSAgICBpZiAobVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MgfHwgbVN3aXRjaEluUHJvZ3Jlc3MpIHsKK2Jvb2wgTGl2ZVNlc3Npb246OmNoZWNrQnVmZmVyaW5nKAorICAgICAgICBib29sICZ1bmRlcmZsb3csIGJvb2wgJnJlYWR5LCBib29sICZkb3duLCBib29sICZ1cCkgeworICAgIHVuZGVyZmxvdyA9IHJlYWR5ID0gZG93biA9IHVwID0gZmFsc2U7CisKKyAgICBpZiAobVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MpIHsKKyAgICAgICAgQUxPR1YoIlN3aXRjaC9SZWNvbmZpZyBpbiBwcm9ncmVzcywgZGVmZXIgYnVmZmVyIHBvbGxpbmciKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmIChtQ3VyQmFuZHdpZHRoSW5kZXggPCAwKSB7CisgICAgc2l6ZV90IGFjdGl2ZUNvdW50LCB1bmRlcmZsb3dDb3VudCwgcmVhZHlDb3VudCwgZG93bkNvdW50LCB1cENvdW50OworICAgIGFjdGl2ZUNvdW50ID0gdW5kZXJmbG93Q291bnQgPSByZWFkeUNvdW50ID0gZG93bkNvdW50ID0gdXBDb3VudCA9MDsKKyAgICBpbnQzMl90IG1pbkJ1ZmZlclBlcmNlbnQgPSAtMTsKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgaWYgKGdldER1cmF0aW9uKCZkdXJhdGlvblVzKSAhPSBPSykgeworICAgICAgICBkdXJhdGlvblVzID0gLTE7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhY2tldFNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgLy8gd2UgZG9uJ3QgY2hlY2sgc3VidGl0bGVzIGZvciBidWZmZXJpbmcgbGV2ZWwKKyAgICAgICAgaWYgKCEobVN0cmVhbU1hc2sgJiBtUGFja2V0U291cmNlcy5rZXlBdChpKQorICAgICAgICAgICAgICAgICYgKFNUUkVBTVRZUEVfQVVESU8gfCBTVFJFQU1UWVBFX1ZJREVPKSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIGlnbm9yZSBzdHJlYW1zIHRoYXQgbmV2ZXIgaGFkIGFueSBwYWNrZXQgcXVldWVkLgorICAgICAgICAvLyAoaXQncyBwb3NzaWJsZSB0aGF0IHRoZSB2YXJpYW50IG9ubHkgaGFzIGF1ZGlvIG9yIHZpZGVvKQorICAgICAgICBzcDxBTWVzc2FnZT4gbWV0YSA9IG1QYWNrZXRTb3VyY2VzW2ldLT5nZXRMYXRlc3RFbnF1ZXVlZE1ldGEoKTsKKyAgICAgICAgaWYgKG1ldGEgPT0gTlVMTCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKKyAgICAgICAgaW50NjRfdCBidWZmZXJlZER1cmF0aW9uVXMgPQorICAgICAgICAgICAgICAgIG1QYWNrZXRTb3VyY2VzW2ldLT5nZXRCdWZmZXJlZER1cmF0aW9uVXMoJmZpbmFsUmVzdWx0KTsKKyAgICAgICAgQUxPR1YoIlslc10gYnVmZmVyZWQgJWxsZCB1cyIsCisgICAgICAgICAgICAgICAgZ2V0TmFtZUZvclN0cmVhbShtUGFja2V0U291cmNlcy5rZXlBdChpKSksCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylidWZmZXJlZER1cmF0aW9uVXMpOworICAgICAgICBpZiAoZHVyYXRpb25VcyA+PSAwKSB7CisgICAgICAgICAgICBpbnQzMl90IHBlcmNlbnQ7CisgICAgICAgICAgICBpZiAobVBhY2tldFNvdXJjZXNbaV0tPmlzRmluaXNoZWQoMCAvKiBkdXJhdGlvbiAqLykpIHsKKyAgICAgICAgICAgICAgICBwZXJjZW50ID0gMTAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwZXJjZW50ID0gKGludDMyX3QpKDEwMC4wICoKKyAgICAgICAgICAgICAgICAgICAgICAgIChtTGFzdERlcXVldWVkVGltZVVzICsgYnVmZmVyZWREdXJhdGlvblVzKSAvIGR1cmF0aW9uVXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1pbkJ1ZmZlclBlcmNlbnQgPCAwIHx8IHBlcmNlbnQgPCBtaW5CdWZmZXJQZXJjZW50KSB7CisgICAgICAgICAgICAgICAgbWluQnVmZmVyUGVyY2VudCA9IHBlcmNlbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICArK2FjdGl2ZUNvdW50OworICAgICAgICBpbnQ2NF90IHJlYWR5TWFyayA9IG1JblByZXBhcmF0aW9uUGhhc2UgPyBrUHJlcGFyZU1hcmtVcyA6IGtSZWFkeU1hcmtVczsKKyAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA+IHJlYWR5TWFyaworICAgICAgICAgICAgICAgIHx8IG1QYWNrZXRTb3VyY2VzW2ldLT5pc0ZpbmlzaGVkKDApKSB7CisgICAgICAgICAgICArK3JlYWR5Q291bnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtUGFja2V0U291cmNlc1tpXS0+aXNGaW5pc2hlZCgwKSkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA8IGtVbmRlcmZsb3dNYXJrVXMpIHsKKyAgICAgICAgICAgICAgICArK3VuZGVyZmxvd0NvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA+IG1VcFN3aXRjaE1hcmspIHsKKyAgICAgICAgICAgICAgICArK3VwQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzIDwgbURvd25Td2l0Y2hNYXJrKSB7CisgICAgICAgICAgICAgICAgKytkb3duQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWluQnVmZmVyUGVyY2VudCA+PSAwKSB7CisgICAgICAgIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShtaW5CdWZmZXJQZXJjZW50KTsKKyAgICB9CisKKyAgICBpZiAoYWN0aXZlQ291bnQgPiAwKSB7CisgICAgICAgIHVwICAgICAgICA9ICh1cENvdW50ID09IGFjdGl2ZUNvdW50KTsKKyAgICAgICAgZG93biAgICAgID0gKGRvd25Db3VudCA+IDApOworICAgICAgICByZWFkeSAgICAgPSAocmVhZHlDb3VudCA9PSBhY3RpdmVDb3VudCk7CisgICAgICAgIHVuZGVyZmxvdyA9ICh1bmRlcmZsb3dDb3VudCA+IDApOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBpZiAoYmFuZHdpZHRoSW5kZXggPT0gKHNpemVfdCltQ3VyQmFuZHdpZHRoSW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSBpZiAoYmFuZHdpZHRoSW5kZXggPiAoc2l6ZV90KW1DdXJCYW5kd2lkdGhJbmRleCkgewotICAgICAgICByZXR1cm4gY2FuU3dpdGNoVXAoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgTGl2ZVNlc3Npb246OnN0YXJ0QnVmZmVyaW5nSWZOZWNlc3NhcnkoKSB7CisgICAgQUxPR1YoInN0YXJ0QnVmZmVyaW5nSWZOZWNlc3Nhcnk6IG1JblByZXBhcmF0aW9uUGhhc2U9JWQsIG1CdWZmZXJpbmc9JWQiLAorICAgICAgICAgICAgbUluUHJlcGFyYXRpb25QaGFzZSwgbUJ1ZmZlcmluZyk7CisgICAgaWYgKCFtQnVmZmVyaW5nKSB7CisgICAgICAgIG1CdWZmZXJpbmcgPSB0cnVlOworCisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0QnVmZmVyaW5nU3RhcnQpOworICAgICAgICBub3RpZnktPnBvc3QoKTsKICAgICB9CiB9CiAKLXZvaWQgTGl2ZVNlc3Npb246Om9uQ2hlY2tCYW5kd2lkdGgoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBzaXplX3QgYmFuZHdpZHRoSW5kZXggPSBnZXRCYW5kd2lkdGhJbmRleCgpOwotICAgIGlmIChjYW5Td2l0Y2hCYW5kd2lkdGhUbyhiYW5kd2lkdGhJbmRleCkpIHsKLSAgICAgICAgY2hhbmdlQ29uZmlndXJhdGlvbigtMWxsIC8qIHRpbWVVcyAqLywgYmFuZHdpZHRoSW5kZXgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIENvbWUgYmFjayBhbmQgY2hlY2sgYWdhaW4gMTAgc2Vjb25kcyBsYXRlciBpbiBjYXNlIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gbm93LgotICAgICAgICAvLyBJZiB3ZSBETyBjaGFuZ2UgY29uZmlndXJhdGlvbiwgb25jZSB0aGF0IGNvbXBsZXRlcyBpdCdsbCBzY2hlZHVsZSBhIG5ldwotICAgICAgICAvLyBjaGVjayBiYW5kd2lkdGggZXZlbnQgd2l0aCBhbiBpbmNyZW1lbnRlZCBtQ2hlY2tCYW5kd2lkdGhHZW5lcmF0aW9uLgotICAgICAgICBtc2ctPnBvc3QoMTAwMDAwMDBsbCk7Cit2b2lkIExpdmVTZXNzaW9uOjpzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnkoKSB7CisgICAgQUxPR1YoInN0b3BCdWZmZXJpbmdJZk5lY2Vzc2FyeTogbUluUHJlcGFyYXRpb25QaGFzZT0lZCwgbUJ1ZmZlcmluZz0lZCIsCisgICAgICAgICAgICBtSW5QcmVwYXJhdGlvblBoYXNlLCBtQnVmZmVyaW5nKTsKKworICAgIGlmIChtQnVmZmVyaW5nKSB7CisgICAgICAgIG1CdWZmZXJpbmcgPSBmYWxzZTsKKworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEJ1ZmZlcmluZ0VuZCk7CisgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogICAgIH0KIH0KIAordm9pZCBMaXZlU2Vzc2lvbjo6bm90aWZ5QnVmZmVyaW5nVXBkYXRlKGludDMyX3QgcGVyY2VudGFnZSkgeworICAgIGlmIChwZXJjZW50YWdlIDwgbVByZXZCdWZmZXJQZXJjZW50YWdlKSB7CisgICAgICAgIHBlcmNlbnRhZ2UgPSBtUHJldkJ1ZmZlclBlcmNlbnRhZ2U7CisgICAgfSBlbHNlIGlmIChwZXJjZW50YWdlID4gMTAwKSB7CisgICAgICAgIHBlcmNlbnRhZ2UgPSAxMDA7CisgICAgfQorCisgICAgbVByZXZCdWZmZXJQZXJjZW50YWdlID0gcGVyY2VudGFnZTsKKworICAgIEFMT0dWKCJub3RpZnlCdWZmZXJpbmdVcGRhdGU6IHBlcmNlbnRhZ2U9JWQlJSIsIHBlcmNlbnRhZ2UpOworCisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEJ1ZmZlcmluZ1VwZGF0ZSk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigicGVyY2VudGFnZSIsIHBlcmNlbnRhZ2UpOworICAgIG5vdGlmeS0+cG9zdCgpOworfQorCitib29sIExpdmVTZXNzaW9uOjp0cnlCYW5kd2lkdGhGYWxsYmFjaygpIHsKKyAgICBpZiAobUluUHJlcGFyYXRpb25QaGFzZSB8fCBtUmVjb25maWd1cmF0aW9uSW5Qcm9ncmVzcykgeworICAgICAgICAvLyBEb24ndCB0cnkgZmFsbGJhY2sgZHVyaW5nIHByZXBhcmUgb3IgcmVjb25maWcuCisgICAgICAgIC8vIElmIGVycm9yIGhhcHBlbnMgdGhlcmUsIGl0J3MgbGlrZWx5IHVucmVjb3ZlcmFibGUuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1DdXJCYW5kd2lkdGhJbmRleCA+IG1PcmlnQmFuZHdpZHRoSW5kZXgpIHsKKyAgICAgICAgLy8gaWYgd2UncmUgc3dpdGNoaW5nIHVwLCBzaW1wbHkgY2FuY2VsIGFuZCByZXN1bWUgb2xkIHZhcmlhbnQKKyAgICAgICAgY2FuY2VsQmFuZHdpZHRoU3dpdGNoKHRydWUgLyogcmVzdW1lICovKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gaWYgd2UncmUgc3dpdGNoaW5nIGRvd24sIHdlJ3JlIGxpa2VseSBhYm91dCB0byB1bmRlcmZsb3cgKGlmCisgICAgICAgIC8vIG5vdCBhbHJlYWR5IHVuZGVyZmxvd2luZykuIHRyeSB0aGUgbG93ZXN0IHZpYWJsZSBiYW5kd2lkdGggaWYKKyAgICAgICAgLy8gbm90IG9uIHRoYXQgdmFyaWFudCBhbHJlYWR5LgorICAgICAgICBzc2l6ZV90IGxvd2VzdFZhbGlkID0gZ2V0TG93ZXN0VmFsaWRCYW5kd2lkdGhJbmRleCgpOworICAgICAgICBpZiAobUN1ckJhbmR3aWR0aEluZGV4ID4gbG93ZXN0VmFsaWQpIHsKKyAgICAgICAgICAgIGNhbmNlbEJhbmR3aWR0aFN3aXRjaCgpOworICAgICAgICAgICAgY2hhbmdlQ29uZmlndXJhdGlvbigtMWxsLCBsb3dlc3RWYWxpZCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyByZXR1cm4gZmFsc2UgaWYgd2UgY291bGRuJ3QgZmluZCBhbnkgZmFsbGJhY2sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qCisgKiByZXR1cm5zIHRydWUgaWYgYSBiYW5kd2lkdGggc3dpdGNoIGlzIGFjdHVhbGx5IG5lZWRlZCAoYW5kIHN0YXJ0ZWQpLAorICogcmV0dXJucyBmYWxzZSBvdGhlcndpc2UKKyAqLworYm9vbCBMaXZlU2Vzc2lvbjo6c3dpdGNoQmFuZHdpZHRoSWZOZWVkZWQoYm9vbCBidWZmZXJIaWdoLCBib29sIGJ1ZmZlckxvdykgeworICAgIC8vIG5vIG5lZWQgdG8gY2hlY2sgYmFuZHdpZHRoIGlmIHdlIG9ubHkgaGF2ZSAxIGJhbmR3aWR0aCBzZXR0aW5ncworICAgIGlmIChtQmFuZHdpZHRoSXRlbXMuc2l6ZSgpIDwgMikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1Td2l0Y2hJblByb2dyZXNzKSB7CisgICAgICAgIGlmIChtQnVmZmVyaW5nKSB7CisgICAgICAgICAgICB0cnlCYW5kd2lkdGhGYWxsYmFjaygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IGJhbmR3aWR0aEJwcywgc2hvcnRUZXJtQnBzOworICAgIGJvb2wgaXNTdGFibGU7CisgICAgaWYgKG1CYW5kd2lkdGhFc3RpbWF0b3ItPmVzdGltYXRlQmFuZHdpZHRoKAorICAgICAgICAgICAgJmJhbmR3aWR0aEJwcywgJmlzU3RhYmxlLCAmc2hvcnRUZXJtQnBzKSkgeworICAgICAgICBBTE9HVigiYmFuZHdpZHRoIGVzdGltYXRlZCBhdCAlLjJmIGticHMsICIKKyAgICAgICAgICAgICAgICAic3RhYmxlICVkLCBzaG9ydFRlcm1CcHMgJS4yZiBrYnBzIiwKKyAgICAgICAgICAgICAgICBiYW5kd2lkdGhCcHMgLyAxMDI0LjBmLCBpc1N0YWJsZSwgc2hvcnRUZXJtQnBzIC8gMTAyNC4wZik7CisgICAgICAgIG1MYXN0QmFuZHdpZHRoQnBzID0gYmFuZHdpZHRoQnBzOworICAgICAgICBtTGFzdEJhbmR3aWR0aFN0YWJsZSA9IGlzU3RhYmxlOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJubyBiYW5kd2lkdGggZXN0aW1hdGUuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IGN1ckJhbmR3aWR0aCA9IG1CYW5kd2lkdGhJdGVtcy5pdGVtQXQobUN1ckJhbmR3aWR0aEluZGV4KS5tQmFuZHdpZHRoOworICAgIC8vIGNhblN3aXRoRG93biBhbmQgY2FuU3dpdGNoVXAgY2FuJ3QgYm90aCBiZSB0cnVlLgorICAgIC8vIHdlIG9ubHkgd2FudCB0byBzd2l0Y2ggdXAgd2hlbiBtZWFzdXJlZCBidyBpcyAxMjAlIGhpZ2hlciB0aGFuIGN1cnJlbnQgdmFyaWFudCwKKyAgICAvLyBhbmQgd2Ugb25seSB3YW50IHRvIHN3aXRjaCBkb3duIHdoZW4gbWVhc3VyZWQgYncgaXMgYmVsb3cgY3VycmVudCB2YXJpYW50LgorICAgIGJvb2wgY2FuU3dpdGNoRG93biA9IGJ1ZmZlckxvdworICAgICAgICAgICAgJiYgKGJhbmR3aWR0aEJwcyA8IChpbnQzMl90KWN1ckJhbmR3aWR0aCk7CisgICAgYm9vbCBjYW5Td2l0Y2hVcCA9IGJ1ZmZlckhpZ2gKKyAgICAgICAgICAgICYmIChiYW5kd2lkdGhCcHMgPiAoaW50MzJfdCljdXJCYW5kd2lkdGggKiAxMiAvIDEwKTsKKworICAgIGlmIChjYW5Td2l0Y2hEb3duIHx8IGNhblN3aXRjaFVwKSB7CisgICAgICAgIC8vIGJhbmR3aWR0aCBlc3RpbWF0aW5nIGhhcyBzb21lIGRlbGF5LCBpZiB3ZSBoYXZlIHRvIGRvd25zd2l0Y2ggd2hlbgorICAgICAgICAvLyBpdCBoYXNuJ3Qgc3RhYmlsaXplZCwgdXNlIHRoZSBzaG9ydCB0ZXJtIHRvIGd1ZXNzIHJlYWwgYmFuZHdpZHRoLAorICAgICAgICAvLyBzaW5jZSBpdCBtYXkgYmUgZHJvcHBpbmcgdG9vIGZhc3QuCisgICAgICAgIC8vIChub3RlIHRoaXMgZG9lc24ndCBhcHBseSB0byB1cHN3aXRjaCwgYWx3YXlzIHVzZSBsb25nZXIgYXZlcmFnZSB0aGVyZSkKKyAgICAgICAgaWYgKCFpc1N0YWJsZSAmJiBjYW5Td2l0Y2hEb3duKSB7CisgICAgICAgICAgICBpZiAoc2hvcnRUZXJtQnBzIDwgYmFuZHdpZHRoQnBzKSB7CisgICAgICAgICAgICAgICAgYmFuZHdpZHRoQnBzID0gc2hvcnRUZXJtQnBzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3NpemVfdCBiYW5kd2lkdGhJbmRleCA9IGdldEJhbmR3aWR0aEluZGV4KGJhbmR3aWR0aEJwcyk7CisKKyAgICAgICAgLy8gaXQncyBwb3NzaWJsZSB0aGF0IHdlJ3JlIGNoZWNraW5nIGZvciBjYW5Td2l0Y2hVcCBjYXNlLCBidXQgdGhlIHJldHVybmVkCisgICAgICAgIC8vIGJhbmR3aWR0aEluZGV4IGlzIDwgbUN1ckJhbmR3aWR0aEluZGV4LCBhcyBnZXRCYW5kd2lkdGhJbmRleCgpIG9ubHkgdXNlcyA3MCUKKyAgICAgICAgLy8gb2YgbWVhc3VyZWQgYncuIEluIHRoYXQgY2FzZSB3ZSBkb24ndCB3YW50IHRvIGRvIGFueXRoaW5nLCBzaW5jZSB3ZSBoYXZlCisgICAgICAgIC8vIGJvdGggZW5vdWdoIGJ1ZmZlciBhbmQgZW5vdWdoIGJ3LgorICAgICAgICBpZiAoKGNhblN3aXRjaFVwICYmIGJhbmR3aWR0aEluZGV4ID4gbUN1ckJhbmR3aWR0aEluZGV4KQorICAgICAgICAgfHwgKGNhblN3aXRjaERvd24gJiYgYmFuZHdpZHRoSW5kZXggPCBtQ3VyQmFuZHdpZHRoSW5kZXgpKSB7CisgICAgICAgICAgICAvLyBpZiBub3QgeWV0IHByZXBhcmVkLCBqdXN0IHJlc3RhcnQgYWdhaW4gd2l0aCBuZXcgYncgaW5kZXguCisgICAgICAgICAgICAvLyB0aGlzIGlzIGZhc3RlciBhbmQgcGxheWJhY2sgZXhwZXJpZW5jZSBpcyBjbGVhbmVyLgorICAgICAgICAgICAgY2hhbmdlQ29uZmlndXJhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgbUluUHJlcGFyYXRpb25QaGFzZSA/IDAgOiAtMWxsLCBiYW5kd2lkdGhJbmRleCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgTGl2ZVNlc3Npb246OnBvc3RFcnJvcihzdGF0dXNfdCBlcnIpIHsKKyAgICAvLyBpZiB3ZSByZWFjaGVkIEVPUywgbm90aWZ5IGJ1ZmZlcmluZyBvZiAxMDAlCisgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZSgxMDApOworICAgIH0KKyAgICAvLyB3ZSdsbCBzdG9wIGJ1ZmZlciBwb2xsaW5nIG5vdywgYmVmb3JlIHRoYXQgbm90aWZ5CisgICAgLy8gc3RvcCBidWZmZXJpbmcgdG8gc3RvcCB0aGUgc3Bpbm5pbmcgaWNvbgorICAgIHN0b3BCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpOworICAgIGNhbmNlbFBvbGxCdWZmZXJpbmcoKTsKKworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRFcnJvcik7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKwogdm9pZCBMaXZlU2Vzc2lvbjo6cG9zdFByZXBhcmVkKHN0YXR1c190IGVycikgewogICAgIENIRUNLKG1JblByZXBhcmF0aW9uUGhhc2UpOwogCkBAIC0xNzY0LDYgKzIzNzcsOCBAQAogICAgIGlmIChlcnIgPT0gT0sgfHwgZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UHJlcGFyZWQpOwogICAgIH0gZWxzZSB7CisgICAgICAgIGNhbmNlbFBvbGxCdWZmZXJpbmcoKTsKKwogICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRQcmVwYXJhdGlvbkZhaWxlZCk7CiAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImVyciIsIGVycik7CiAgICAgfQpAQCAtMTc3MSwxMCArMjM4Niw4IEBACiAgICAgbm90aWZ5LT5wb3N0KCk7CiAKICAgICBtSW5QcmVwYXJhdGlvblBoYXNlID0gZmFsc2U7Ci0KLSAgICBtU3dpdGNoRG93bk1vbml0b3IgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDaGVja1N3aXRjaERvd24sIGlkKCkpOwotICAgIG1Td2l0Y2hEb3duTW9uaXRvci0+cG9zdCgpOwogfQogCisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5oCmluZGV4IDJkM2EyNWEuLjkwZDU2ZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uaApAQCAtMjMsNDMgKzIzLDYyIEBACiAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKKyNpbmNsdWRlICJtcGVnMnRzL0FUU1BhcnNlci5oIgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBQnVmZmVyOworc3RydWN0IEFSZXBseVRva2VuOwogc3RydWN0IEFub3RoZXJQYWNrZXRTb3VyY2U7Ci1zdHJ1Y3QgRGF0YVNvdXJjZTsKK2NsYXNzIERhdGFTb3VyY2U7CiBzdHJ1Y3QgSFRUUEJhc2U7CiBzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBzdHJ1Y3QgTGl2ZURhdGFTb3VyY2U7CiBzdHJ1Y3QgTTNVUGFyc2VyOwogc3RydWN0IFBsYXlsaXN0RmV0Y2hlcjsKK3N0cnVjdCBITFNUaW1lOworc3RydWN0IEhUVFBEb3dubG9hZGVyOwogCiBzdHJ1Y3QgTGl2ZVNlc3Npb24gOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIGVudW0gRmxhZ3MgewogICAgICAgICAvLyBEb24ndCBsb2cgYW55IFVSTHMuCiAgICAgICAgIGtGbGFnSW5jb2duaXRvID0gMSwKICAgICB9OwotICAgIExpdmVTZXNzaW9uKAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICB1aW50MzJfdCBmbGFncywKLSAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpOwogCiAgICAgZW51bSBTdHJlYW1JbmRleCB7CiAgICAgICAgIGtBdWRpb0luZGV4ICAgID0gMCwKICAgICAgICAga1ZpZGVvSW5kZXggICAgPSAxLAogICAgICAgICBrU3VidGl0bGVJbmRleCA9IDIsCiAgICAgICAgIGtNYXhTdHJlYW1zICAgID0gMywKKyAgICAgICAga01ldGFEYXRhSW5kZXggPSAzLAorICAgICAgICBrTnVtU291cmNlcyAgICA9IDQsCiAgICAgfTsKIAogICAgIGVudW0gU3RyZWFtVHlwZSB7CiAgICAgICAgIFNUUkVBTVRZUEVfQVVESU8gICAgICAgID0gMSA8PCBrQXVkaW9JbmRleCwKICAgICAgICAgU1RSRUFNVFlQRV9WSURFTyAgICAgICAgPSAxIDw8IGtWaWRlb0luZGV4LAogICAgICAgICBTVFJFQU1UWVBFX1NVQlRJVExFUyAgICA9IDEgPDwga1N1YnRpdGxlSW5kZXgsCisgICAgICAgIFNUUkVBTVRZUEVfTUVUQURBVEEgICAgID0gMSA8PCBrTWV0YURhdGFJbmRleCwKICAgICB9OworCisgICAgZW51bSBTZWVrTW9kZSB7CisgICAgICAgIGtTZWVrTW9kZUV4YWN0UG9zaXRpb24gPSAwLCAvLyB1c2VkIGZvciBzZWVraW5nCisgICAgICAgIGtTZWVrTW9kZU5leHRTYW1wbGUgICAgPSAxLCAvLyB1c2VkIGZvciBzZWFtbGVzcyBzd2l0Y2hpbmcKKyAgICAgICAga1NlZWtNb2RlTmV4dFNlZ21lbnQgICA9IDIsIC8vIHVzZWQgZm9yIHNlYW1sZXNzIHN3aXRjaGluZworICAgIH07CisKKyAgICBMaXZlU2Vzc2lvbigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKKworICAgIGludDY0X3QgY2FsY3VsYXRlTWVkaWFUaW1lVXMoaW50NjRfdCBmaXJzdFRpbWVVcywgaW50NjRfdCB0aW1lVXMsIGludDMyX3QgZGlzY29udGludWl0eVNlcSk7CiAgICAgc3RhdHVzX3QgZGVxdWV1ZUFjY2Vzc1VuaXQoU3RyZWFtVHlwZSBzdHJlYW0sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KTsKIAogICAgIHN0YXR1c190IGdldFN0cmVhbUZvcm1hdChTdHJlYW1UeXBlIHN0cmVhbSwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpOwogCisgICAgc3A8SFRUUERvd25sb2FkZXI+IGdldEhUVFBEb3dubG9hZGVyKCk7CisKICAgICB2b2lkIGNvbm5lY3RBc3luYygKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKICAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCk7CkBAIC03OCwxOCArOTcsMjEgQEAKICAgICBib29sIGlzU2Vla2FibGUoKSBjb25zdDsKICAgICBib29sIGhhc0R5bmFtaWNEdXJhdGlvbigpIGNvbnN0OwogCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldEtleUZvclN0cmVhbShTdHJlYW1UeXBlIHR5cGUpOworICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lRm9yU3RyZWFtKFN0cmVhbVR5cGUgdHlwZSk7CisgICAgc3RhdGljIEFUU1BhcnNlcjo6U291cmNlVHlwZSBnZXRTb3VyY2VUeXBlRm9yU3RyZWFtKFN0cmVhbVR5cGUgdHlwZSk7CisKICAgICBlbnVtIHsKICAgICAgICAga1doYXRTdHJlYW1zQ2hhbmdlZCwKICAgICAgICAga1doYXRFcnJvciwKICAgICAgICAga1doYXRQcmVwYXJlZCwKICAgICAgICAga1doYXRQcmVwYXJhdGlvbkZhaWxlZCwKKyAgICAgICAga1doYXRCdWZmZXJpbmdTdGFydCwKKyAgICAgICAga1doYXRCdWZmZXJpbmdFbmQsCisgICAgICAgIGtXaGF0QnVmZmVyaW5nVXBkYXRlLAorICAgICAgICBrV2hhdE1ldGFkYXRhRGV0ZWN0ZWQsCiAgICAgfTsKIAotICAgIC8vIGNyZWF0ZSBhIGZvcm1hdC1jaGFuZ2UgZGlzY29udGludWl0eQotICAgIC8vCi0gICAgLy8gc3dhcDoKLSAgICAvLyAgIHdoZXRoZXIgaXMgZm9ybWF0LWNoYW5nZSBkaXNjb250aW51aXR5IHNob3VsZCB0cmlnZ2VyIGEgYnVmZmVyIHN3YXAKLSAgICBzcDxBQnVmZmVyPiBjcmVhdGVGb3JtYXRDaGFuZ2VCdWZmZXIoYm9vbCBzd2FwID0gdHJ1ZSk7CiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TGl2ZVNlc3Npb24oKTsKIApAQCAtMTAzLDQ2ICsxMjUsNTYgQEAKICAgICAgICAga1doYXREaXNjb25uZWN0ICAgICAgICAgICAgICAgICA9ICdkaXNjJywKICAgICAgICAga1doYXRTZWVrICAgICAgICAgICAgICAgICAgICAgICA9ICdzZWVrJywKICAgICAgICAga1doYXRGZXRjaGVyTm90aWZ5ICAgICAgICAgICAgICA9ICdub3RmJywKLSAgICAgICAga1doYXRDaGVja0JhbmR3aWR0aCAgICAgICAgICAgICA9ICdibmR3JywKICAgICAgICAga1doYXRDaGFuZ2VDb25maWd1cmF0aW9uICAgICAgICA9ICdjaEMwJywKICAgICAgICAga1doYXRDaGFuZ2VDb25maWd1cmF0aW9uMiAgICAgICA9ICdjaEMyJywKICAgICAgICAga1doYXRDaGFuZ2VDb25maWd1cmF0aW9uMyAgICAgICA9ICdjaEMzJywKLSAgICAgICAga1doYXRGaW5pc2hEaXNjb25uZWN0MiAgICAgICAgICA9ICdmaW4yJywKLSAgICAgICAga1doYXRTd2FwcGVkICAgICAgICAgICAgICAgICAgICA9ICdzd2FwJywKLSAgICAgICAga1doYXRDaGVja1N3aXRjaERvd24gICAgICAgICAgICA9ICdja1NEJywKLSAgICAgICAga1doYXRTd2l0Y2hEb3duICAgICAgICAgICAgICAgICA9ICdzRHduJywKKyAgICAgICAga1doYXRQb2xsQnVmZmVyaW5nICAgICAgICAgICAgICA9ICdwb2xsJywKICAgICB9OwogCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrQmFuZHdpZHRoSGlzdG9yeUJ5dGVzOworICAgIC8vIEJhbmR3aWR0aCBTd2l0Y2ggTWFyayBEZWZhdWx0cworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtVcFN3aXRjaE1hcmtVczsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrRG93blN3aXRjaE1hcmtVczsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrVXBTd2l0Y2hNYXJnaW5VczsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrUmVzdW1lVGhyZXNob2xkVXM7CiAKKyAgICAvLyBCdWZmZXIgUHJlcGFyZS9SZWFkeS9VbmRlcmZsb3cgTWFya3MKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrUmVhZHlNYXJrVXM7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1ByZXBhcmVNYXJrVXM7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1VuZGVyZmxvd01hcmtVczsKKworICAgIHN0cnVjdCBCYW5kd2lkdGhFc3RpbWF0b3I7CiAgICAgc3RydWN0IEJhbmR3aWR0aEl0ZW0gewogICAgICAgICBzaXplX3QgbVBsYXlsaXN0SW5kZXg7CiAgICAgICAgIHVuc2lnbmVkIGxvbmcgbUJhbmR3aWR0aDsKKyAgICAgICAgaW50NjRfdCBtTGFzdEZhaWx1cmVVczsKICAgICB9OwogCiAgICAgc3RydWN0IEZldGNoZXJJbmZvIHsKICAgICAgICAgc3A8UGxheWxpc3RGZXRjaGVyPiBtRmV0Y2hlcjsKICAgICAgICAgaW50NjRfdCBtRHVyYXRpb25VczsKLSAgICAgICAgYm9vbCBtSXNQcmVwYXJlZDsKICAgICAgICAgYm9vbCBtVG9CZVJlbW92ZWQ7CisgICAgICAgIGJvb2wgbVRvQmVSZXN1bWVkOwogICAgIH07CiAKICAgICBzdHJ1Y3QgU3RyZWFtSXRlbSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKm1UeXBlOwogICAgICAgICBBU3RyaW5nIG1VcmksIG1OZXdVcmk7CisgICAgICAgIFNlZWtNb2RlIG1TZWVrTW9kZTsKICAgICAgICAgc2l6ZV90IG1DdXJEaXNjb250aW51aXR5U2VxOwogICAgICAgICBpbnQ2NF90IG1MYXN0RGVxdWV1ZWRUaW1lVXM7CiAgICAgICAgIGludDY0X3QgbUxhc3RTYW1wbGVEdXJhdGlvblVzOwogICAgICAgICBTdHJlYW1JdGVtKCkKLSAgICAgICAgICAgIDogbVR5cGUoIiIpLAotICAgICAgICAgICAgICBtQ3VyRGlzY29udGludWl0eVNlcSgwKSwKLSAgICAgICAgICAgICAgbUxhc3REZXF1ZXVlZFRpbWVVcygwKSwKLSAgICAgICAgICAgICAgbUxhc3RTYW1wbGVEdXJhdGlvblVzKDApIHt9CisgICAgICAgICAgICA6IFN0cmVhbUl0ZW0oIiIpIHt9CiAgICAgICAgIFN0cmVhbUl0ZW0oY29uc3QgY2hhciAqdHlwZSkKICAgICAgICAgICAgIDogbVR5cGUodHlwZSksCi0gICAgICAgICAgICAgIG1DdXJEaXNjb250aW51aXR5U2VxKDApLAotICAgICAgICAgICAgICBtTGFzdERlcXVldWVkVGltZVVzKDApLAotICAgICAgICAgICAgICBtTGFzdFNhbXBsZUR1cmF0aW9uVXMoMCkge30KKyAgICAgICAgICAgICAgbVNlZWtNb2RlKGtTZWVrTW9kZUV4YWN0UG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIG1DdXJEaXNjb250aW51aXR5U2VxID0gMDsKKyAgICAgICAgICAgIG1MYXN0RGVxdWV1ZWRUaW1lVXMgPSAtMWxsOworICAgICAgICAgICAgbUxhc3RTYW1wbGVEdXJhdGlvblVzID0gMGxsOworICAgICAgICB9CiAgICAgICAgIEFTdHJpbmcgdXJpS2V5KCkgewogICAgICAgICAgICAgQVN0cmluZyBrZXkobVR5cGUpOwogICAgICAgICAgICAga2V5LmFwcGVuZCgiVVJJIik7CkBAIC0xNTUsMTkgKzE4NywyNyBAQAogICAgIHVpbnQzMl90IG1GbGFnczsKICAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gbUhUVFBTZXJ2aWNlOwogCisgICAgYm9vbCBtQnVmZmVyaW5nOwogICAgIGJvb2wgbUluUHJlcGFyYXRpb25QaGFzZTsKLSAgICBib29sIG1CdWZmZXJpbmdba01heFN0cmVhbXNdOworICAgIGludDMyX3QgbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uOworICAgIGludDMyX3QgbVByZXZCdWZmZXJQZXJjZW50YWdlOwogCi0gICAgc3A8SFRUUEJhc2U+IG1IVFRQRGF0YVNvdXJjZTsKICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtRXh0cmFIZWFkZXJzOwogCiAgICAgQVN0cmluZyBtTWFzdGVyVVJMOwogCiAgICAgVmVjdG9yPEJhbmR3aWR0aEl0ZW0+IG1CYW5kd2lkdGhJdGVtczsKICAgICBzc2l6ZV90IG1DdXJCYW5kd2lkdGhJbmRleDsKKyAgICBzc2l6ZV90IG1PcmlnQmFuZHdpZHRoSW5kZXg7CisgICAgaW50MzJfdCBtTGFzdEJhbmR3aWR0aEJwczsKKyAgICBib29sIG1MYXN0QmFuZHdpZHRoU3RhYmxlOworICAgIHNwPEJhbmR3aWR0aEVzdGltYXRvcj4gbUJhbmR3aWR0aEVzdGltYXRvcjsKIAogICAgIHNwPE0zVVBhcnNlcj4gbVBsYXlsaXN0OworICAgIGludDMyX3QgbU1heFdpZHRoOworICAgIGludDMyX3QgbU1heEhlaWdodDsKIAorICAgIHNwPEFMb29wZXI+IG1GZXRjaGVyTG9vcGVyOwogICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIEZldGNoZXJJbmZvPiBtRmV0Y2hlckluZm9zOwogICAgIHVpbnQzMl90IG1TdHJlYW1NYXNrOwogCkBAIC0xODAsMTcgKzIyMCwxMCBAQAogICAgIC8vIHdlIHVzZSB0aGlzIHRvIHRyYWNrIHJlY29uZmlndXJhdGlvbiBwcm9ncmVzcy4KICAgICB1aW50MzJfdCBtU3dhcE1hc2s7CiAKLSAgICBLZXllZFZlY3RvcjxTdHJlYW1UeXBlLCBzcDxBbm90aGVyUGFja2V0U291cmNlPiA+IG1EaXNjb250aW51aXRpZXM7CiAgICAgS2V5ZWRWZWN0b3I8U3RyZWFtVHlwZSwgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gPiBtUGFja2V0U291cmNlczsKICAgICAvLyBBIHNlY29uZCBzZXQgb2YgcGFja2V0IHNvdXJjZXMgdGhhdCBidWZmZXIgY29udGVudCBmb3IgdGhlIHZhcmlhbnQgd2UncmUgc3dpdGNoaW5nIHRvLgogICAgIEtleWVkVmVjdG9yPFN0cmVhbVR5cGUsIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ID4gbVBhY2tldFNvdXJjZXMyOwogCi0gICAgLy8gQSBtdXRleCB1c2VkIHRvIHNlcmlhbGl6ZSB0d28gc2V0cyBvZiBldmVudHM6Ci0gICAgLy8gKiB0aGUgc3dhcHBpbmcgb2YgcGFja2V0IHNvdXJjZXMgaW4gZGVxdWV1ZUFjY2Vzc1VuaXQgb24gdGhlIHBsYXllciB0aHJlYWQsIEFORAotICAgIC8vICogYSBmb3JjZWQgYmFuZHdpZHRoIHN3aXRjaCB0ZXJtaW5hdGlvbiBpbiBjYW5jZWxTd2l0Y2ggb24gdGhlIGxpdmUgbG9vcGVyLgotICAgIE11dGV4IG1Td2FwTXV0ZXg7Ci0KLSAgICBpbnQzMl90IG1DaGVja0JhbmR3aWR0aEdlbmVyYXRpb247CiAgICAgaW50MzJfdCBtU3dpdGNoR2VuZXJhdGlvbjsKICAgICBpbnQzMl90IG1TdWJ0aXRsZUdlbmVyYXRpb247CiAKQEAgLTIwMyw4MCArMjM2LDc2IEBACiAKICAgICBib29sIG1SZWNvbmZpZ3VyYXRpb25JblByb2dyZXNzOwogICAgIGJvb2wgbVN3aXRjaEluUHJvZ3Jlc3M7Ci0gICAgdWludDMyX3QgbURpc2Nvbm5lY3RSZXBseUlEOwotICAgIHVpbnQzMl90IG1TZWVrUmVwbHlJRDsKKyAgICBpbnQ2NF90IG1VcFN3aXRjaE1hcms7CisgICAgaW50NjRfdCBtRG93blN3aXRjaE1hcms7CisgICAgaW50NjRfdCBtVXBTd2l0Y2hNYXJnaW47CisKKyAgICBzcDxBUmVwbHlUb2tlbj4gbURpc2Nvbm5lY3RSZXBseUlEOworICAgIHNwPEFSZXBseVRva2VuPiBtU2Vla1JlcGx5SUQ7CiAKICAgICBib29sIG1GaXJzdFRpbWVVc1ZhbGlkOwogICAgIGludDY0X3QgbUZpcnN0VGltZVVzOwogICAgIGludDY0X3QgbUxhc3RTZWVrVGltZVVzOwotICAgIHNwPEFNZXNzYWdlPiBtU3dpdGNoRG93bk1vbml0b3I7CisgICAgYm9vbCBtSGFzTWV0YWRhdGE7CisKICAgICBLZXllZFZlY3RvcjxzaXplX3QsIGludDY0X3Q+IG1EaXNjb250aW51aXR5QWJzU3RhcnRUaW1lc1VzOwogICAgIEtleWVkVmVjdG9yPHNpemVfdCwgaW50NjRfdD4gbURpc2NvbnRpbnVpdHlPZmZzZXRUaW1lc1VzOwogCiAgICAgc3A8UGxheWxpc3RGZXRjaGVyPiBhZGRGZXRjaGVyKGNvbnN0IGNoYXIgKnVyaSk7CiAKICAgICB2b2lkIG9uQ29ubmVjdChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgc3RhdHVzX3Qgb25TZWVrKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2b2lkIG9uRmluaXNoRGlzY29ubmVjdDIoKTsKKyAgICB2b2lkIG9uTWFzdGVyUGxheWxpc3RGZXRjaGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIG9uU2Vlayhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAKLSAgICAvLyBJZiBnaXZlbiBhIG5vbi16ZXJvIGJsb2NrX3NpemUgKGRlZmF1bHQgMCksIGl0IGlzIHVzZWQgdG8gY2FwIHRoZSBudW1iZXIgb2YKLSAgICAvLyBieXRlcyByZWFkIGluIGZyb20gdGhlIERhdGFTb3VyY2UuIElmIGdpdmVuIGEgbm9uLU5VTEwgYnVmZmVyLCBuZXcgY29udGVudAotICAgIC8vIGlzIHJlYWQgaW50byB0aGUgZW5kLgotICAgIC8vCi0gICAgLy8gVGhlIERhdGFTb3VyY2Ugd2UgcmVhZCBmcm9tIGlzIHJlc3BvbnNpYmxlIGZvciBzaWduYWxpbmcgZXJyb3Igb3IgRU9GIHRvIGhlbHAgdXMKLSAgICAvLyBicmVhayBvdXQgb2YgdGhlIHJlYWQgbG9vcC4gVGhlIERhdGFTb3VyY2UgY2FuIGJlIHJldHVybmVkIHRvIHRoZSBjYWxsZXIsIHNvCi0gICAgLy8gdGhhdCB0aGUgY2FsbGVyIGNhbiByZXVzZSBpdCBmb3Igc3Vic2VxdWVudCBmZXRjaGVzICh3aXRoaW4gdGhlIGluaXRpYWxseQotICAgIC8vIHJlcXVlc3RlZCByYW5nZSkuCi0gICAgLy8KLSAgICAvLyBGb3IgcmV1c2VkIEhUVFAgc291cmNlcywgdGhlIGNhbGxlciBtdXN0IGRvd25sb2FkIGEgZmlsZSBzZXF1ZW50aWFsbHkgd2l0aG91dAotICAgIC8vIGFueSBvdmVybGFwcyBvciBnYXBzIHRvIHByZXZlbnQgcmVjb25uZWN0aW9uLgotICAgIHNzaXplX3QgZmV0Y2hGaWxlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqdXJsLCBzcDxBQnVmZmVyPiAqb3V0LAotICAgICAgICAgICAgLyogcmVxdWVzdC9vcGVuIGEgZmlsZSBzdGFydGluZyBhdCByYW5nZV9vZmZzZXQgZm9yIHJhbmdlX2xlbmd0aCBieXRlcyAqLwotICAgICAgICAgICAgaW50NjRfdCByYW5nZV9vZmZzZXQgPSAwLCBpbnQ2NF90IHJhbmdlX2xlbmd0aCA9IC0xLAotICAgICAgICAgICAgLyogZG93bmxvYWQgYmxvY2sgc2l6ZSAqLwotICAgICAgICAgICAgdWludDMyX3QgYmxvY2tfc2l6ZSA9IDAsCi0gICAgICAgICAgICAvKiByZXVzZSBEYXRhU291cmNlIGlmIGRvaW5nIHBhcnRpYWwgZmV0Y2ggKi8KLSAgICAgICAgICAgIHNwPERhdGFTb3VyY2U+ICpzb3VyY2UgPSBOVUxMLAotICAgICAgICAgICAgU3RyaW5nOCAqYWN0dWFsVXJsID0gTlVMTCk7CisgICAgYm9vbCBVcmlJc1NhbWVBc0luZGV4KCBjb25zdCBBU3RyaW5nICZ1cmksIGludDMyX3QgaW5kZXgsIGJvb2wgbmV3VXJpKTsKKyAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBnZXRQYWNrZXRTb3VyY2VGb3JTdHJlYW1JbmRleChzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBuZXdVcmkpOworICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGdldE1ldGFkYXRhU291cmNlKAorICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlc1trTnVtU291cmNlc10sIHVpbnQzMl90IHN0cmVhbU1hc2ssIGJvb2wgbmV3VXJpKTsKIAotICAgIHNwPE0zVVBhcnNlcj4gZmV0Y2hQbGF5bGlzdCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgdWludDhfdCAqY3VyUGxheWxpc3RIYXNoLCBib29sICp1bmNoYW5nZWQpOworICAgIGJvb2wgcmVzdW1lRmV0Y2hlcigKKyAgICAgICAgICAgIGNvbnN0IEFTdHJpbmcgJnVyaSwgdWludDMyX3Qgc3RyZWFtTWFzaywKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzID0gLTFsbCwgYm9vbCBuZXdVcmkgPSBmYWxzZSk7CiAKLSAgICBzaXplX3QgZ2V0QmFuZHdpZHRoSW5kZXgoKTsKLSAgICBpbnQ2NF90IGxhdGVzdE1lZGlhU2VnbWVudFN0YXJ0VGltZVVzKCk7CisgICAgZmxvYXQgZ2V0QWJvcnRUaHJlc2hvbGQoCisgICAgICAgICAgICBzc2l6ZV90IGN1cnJlbnRCV0luZGV4LCBzc2l6ZV90IHRhcmdldEJXSW5kZXgpIGNvbnN0OworICAgIHZvaWQgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQoc2l6ZV90IG51bUJ5dGVzLCBpbnQ2NF90IGRlbGF5VXMpOworICAgIHNpemVfdCBnZXRCYW5kd2lkdGhJbmRleChpbnQzMl90IGJhbmR3aWR0aEJwcyk7CisgICAgc3NpemVfdCBnZXRMb3dlc3RWYWxpZEJhbmR3aWR0aEluZGV4KCkgY29uc3Q7CisgICAgSExTVGltZSBsYXRlc3RNZWRpYVNlZ21lbnRTdGFydFRpbWUoKSBjb25zdDsKIAorICAgIHN0YXRpYyBib29sIGlzQmFuZHdpZHRoVmFsaWQoY29uc3QgQmFuZHdpZHRoSXRlbSAmaXRlbSk7CiAgICAgc3RhdGljIGludCBTb3J0QnlCYW5kd2lkdGgoY29uc3QgQmFuZHdpZHRoSXRlbSAqLCBjb25zdCBCYW5kd2lkdGhJdGVtICopOwogICAgIHN0YXRpYyBTdHJlYW1UeXBlIGluZGV4VG9UeXBlKGludCBpZHgpOwogICAgIHN0YXRpYyBzc2l6ZV90IHR5cGVUb0luZGV4KGludDMyX3QgdHlwZSk7CiAKICAgICB2b2lkIGNoYW5nZUNvbmZpZ3VyYXRpb24oCi0gICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgc2l6ZV90IGJhbmR3aWR0aEluZGV4LCBib29sIHBpY2tUcmFjayA9IGZhbHNlKTsKKyAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBzc2l6ZV90IGJ3SW5kZXggPSAtMSwgYm9vbCBwaWNrVHJhY2sgPSBmYWxzZSk7CiAgICAgdm9pZCBvbkNoYW5nZUNvbmZpZ3VyYXRpb24oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgb25DaGFuZ2VDb25maWd1cmF0aW9uMihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CiAgICAgdm9pZCBvbkNoYW5nZUNvbmZpZ3VyYXRpb24zKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2b2lkIG9uU3dhcHBlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgdm9pZCBvbkNoZWNrU3dpdGNoRG93bigpOwotICAgIHZvaWQgb25Td2l0Y2hEb3duKCk7Ci0gICAgdm9pZCB0cnlUb0ZpbmlzaEJhbmR3aWR0aFN3aXRjaCgpOwogCi0gICAgdm9pZCBzY2hlZHVsZUNoZWNrQmFuZHdpZHRoRXZlbnQoKTsKLSAgICB2b2lkIGNhbmNlbENoZWNrQmFuZHdpZHRoRXZlbnQoKTsKKyAgICB2b2lkIHN3YXBQYWNrZXRTb3VyY2UoU3RyZWFtVHlwZSBzdHJlYW0pOworICAgIHZvaWQgdHJ5VG9GaW5pc2hCYW5kd2lkdGhTd2l0Y2goY29uc3QgQVN0cmluZyAmb2xkVXJpKTsKKyAgICB2b2lkIGNhbmNlbEJhbmR3aWR0aFN3aXRjaChib29sIHJlc3VtZSA9IGZhbHNlKTsKKyAgICBib29sIGNoZWNrU3dpdGNoUHJvZ3Jlc3MoCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gJm1zZywgaW50NjRfdCBkZWxheVVzLCBib29sICpuZWVkUmVzdW1lVW50aWwpOwogCi0gICAgLy8gY2FuY2VsQmFuZHdpZHRoU3dpdGNoIGlzIGF0b21pYyB3cnQgc3dhcFBhY2tldFNvdXJjZTsgY2FsbCBpdCB0byBwcmV2ZW50IHBhY2tldCBzb3VyY2VzCi0gICAgLy8gZnJvbSBiZWluZyBzd2FwcGVkIG91dCBvbiBzdGFsZSBkaXNjb250aW51aXRpZXMgd2hpbGUgbWFuaXB1bGF0aW5nCi0gICAgLy8gbVBhY2tldFNvdXJjZXMvbVBhY2tldFNvdXJjZXMyLgotICAgIHZvaWQgY2FuY2VsQmFuZHdpZHRoU3dpdGNoKCk7CisgICAgYm9vbCBzd2l0Y2hCYW5kd2lkdGhJZk5lZWRlZChib29sIGJ1ZmZlckhpZ2gsIGJvb2wgYnVmZmVyTG93KTsKKyAgICBib29sIHRyeUJhbmR3aWR0aEZhbGxiYWNrKCk7CiAKLSAgICBib29sIGNhblN3aXRjaEJhbmR3aWR0aFRvKHNpemVfdCBiYW5kd2lkdGhJbmRleCk7Ci0gICAgdm9pZCBvbkNoZWNrQmFuZHdpZHRoKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOworICAgIHZvaWQgY2FuY2VsUG9sbEJ1ZmZlcmluZygpOworICAgIHZvaWQgcmVzdGFydFBvbGxCdWZmZXJpbmcoKTsKKyAgICB2b2lkIG9uUG9sbEJ1ZmZlcmluZygpOworICAgIGJvb2wgY2hlY2tCdWZmZXJpbmcoYm9vbCAmdW5kZXJmbG93LCBib29sICZyZWFkeSwgYm9vbCAmZG93biwgYm9vbCAmdXApOworICAgIHZvaWQgc3RhcnRCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpOworICAgIHZvaWQgc3RvcEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCk7CisgICAgdm9pZCBub3RpZnlCdWZmZXJpbmdVcGRhdGUoaW50MzJfdCBwZXJjZW50YWdlKTsKIAogICAgIHZvaWQgZmluaXNoRGlzY29ubmVjdCgpOwogCiAgICAgdm9pZCBwb3N0UHJlcGFyZWQoc3RhdHVzX3QgZXJyKTsKLQotICAgIHZvaWQgc3dhcFBhY2tldFNvdXJjZShTdHJlYW1UeXBlIHN0cmVhbSk7Ci0gICAgYm9vbCBjYW5Td2l0Y2hVcCgpOworICAgIHZvaWQgcG9zdEVycm9yKHN0YXR1c190IGVycik7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhMaXZlU2Vzc2lvbik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKaW5kZXggOTk3YjY5NC4uZmYyYmIyNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCkBAIC0yNTAsNyArMjUwLDExIEBACiAgICAgICBtSXNWYXJpYW50UGxheWxpc3QoZmFsc2UpLAogICAgICAgbUlzQ29tcGxldGUoZmFsc2UpLAogICAgICAgbUlzRXZlbnQoZmFsc2UpLAorICAgICAgbUZpcnN0U2VxTnVtYmVyKC0xKSwKKyAgICAgIG1MYXN0U2VxTnVtYmVyKC0xKSwKKyAgICAgIG1UYXJnZXREdXJhdGlvblVzKC0xbGwpLAogICAgICAgbURpc2NvbnRpbnVpdHlTZXEoMCksCisgICAgICBtRGlzY29udGludWl0eUNvdW50KDApLAogICAgICAgbVNlbGVjdGVkSW5kZXgoLTEpIHsKICAgICBtSW5pdENoZWNrID0gcGFyc2UoZGF0YSwgc2l6ZSk7CiB9CkBAIC0yODIsNiArMjg2LDE5IEBACiAgICAgcmV0dXJuIG1EaXNjb250aW51aXR5U2VxOwogfQogCitpbnQ2NF90IE0zVVBhcnNlcjo6Z2V0VGFyZ2V0RHVyYXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIG1UYXJnZXREdXJhdGlvblVzOworfQorCitpbnQzMl90IE0zVVBhcnNlcjo6Z2V0Rmlyc3RTZXFOdW1iZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIG1GaXJzdFNlcU51bWJlcjsKK30KKwordm9pZCBNM1VQYXJzZXI6OmdldFNlcU51bWJlclJhbmdlKGludDMyX3QgKmZpcnN0U2VxLCBpbnQzMl90ICpsYXN0U2VxKSBjb25zdCB7CisgICAgKmZpcnN0U2VxID0gbUZpcnN0U2VxTnVtYmVyOworICAgICpsYXN0U2VxID0gbUxhc3RTZXFOdW1iZXI7Cit9CisKIHNwPEFNZXNzYWdlPiBNM1VQYXJzZXI6Om1ldGEoKSB7CiAgICAgcmV0dXJuIG1NZXRhOwogfQpAQCAtMzk0LDcgKzQxMSw5IEBACiAKIGJvb2wgTTNVUGFyc2VyOjpnZXRUeXBlVVJJKHNpemVfdCBpbmRleCwgY29uc3QgY2hhciAqa2V5LCBBU3RyaW5nICp1cmkpIGNvbnN0IHsKICAgICBpZiAoIW1Jc1ZhcmlhbnRQbGF5bGlzdCkgewotICAgICAgICAqdXJpID0gbUJhc2VVUkk7CisgICAgICAgIGlmICh1cmkgIT0gTlVMTCkgeworICAgICAgICAgICAgKnVyaSA9IG1CYXNlVVJJOworICAgICAgICB9CiAKICAgICAgICAgLy8gQXNzdW1lIG1lZGlhIHdpdGhvdXQgYW55IG1vcmUgc3BlY2lmaWMgYXR0cmlidXRlIGNvbnRhaW5zCiAgICAgICAgIC8vIGF1ZGlvIGFuZCB2aWRlbywgYnV0IG5vIHN1YnRpdGxlcy4KQEAgLTQwNyw3ICs0MjYsOSBAQAogCiAgICAgQVN0cmluZyBncm91cElEOwogICAgIGlmICghbWV0YS0+ZmluZFN0cmluZyhrZXksICZncm91cElEKSkgewotICAgICAgICAqdXJpID0gbUl0ZW1zLml0ZW1BdChpbmRleCkubVVSSTsKKyAgICAgICAgaWYgKHVyaSAhPSBOVUxMKSB7CisgICAgICAgICAgICAqdXJpID0gbUl0ZW1zLml0ZW1BdChpbmRleCkubVVSSTsKKyAgICAgICAgfQogCiAgICAgICAgIEFTdHJpbmcgY29kZWNzOwogICAgICAgICBpZiAoIW1ldGEtPmZpbmRTdHJpbmcoImNvZGVjcyIsICZjb2RlY3MpKSB7CkBAIC00MzMsMTggKzQ1NCwyNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3A8TWVkaWFHcm91cD4gZ3JvdXAgPSBtTWVkaWFHcm91cHMudmFsdWVGb3IoZ3JvdXBJRCk7Ci0gICAgaWYgKCFncm91cC0+Z2V0QWN0aXZlVVJJKHVyaSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KKyAgICAvLyBpZiB1cmkgPT0gTlVMTCwgd2UncmUgb25seSBjaGVja2luZyBpZiB0aGUgdHlwZSBpcyBwcmVzZW50LAorICAgIC8vIGRvbid0IGNhcmUgYWJvdXQgdGhlIGFjdGl2ZSBVUkkgKG9yIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBvbmUpCisgICAgaWYgKHVyaSAhPSBOVUxMKSB7CisgICAgICAgIHNwPE1lZGlhR3JvdXA+IGdyb3VwID0gbU1lZGlhR3JvdXBzLnZhbHVlRm9yKGdyb3VwSUQpOworICAgICAgICBpZiAoIWdyb3VwLT5nZXRBY3RpdmVVUkkodXJpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAKLSAgICBpZiAoKCp1cmkpLmVtcHR5KCkpIHsKLSAgICAgICAgKnVyaSA9IG1JdGVtcy5pdGVtQXQoaW5kZXgpLm1VUkk7CisgICAgICAgIGlmICgoKnVyaSkuZW1wdHkoKSkgeworICAgICAgICAgICAgKnVyaSA9IG1JdGVtcy5pdGVtQXQoaW5kZXgpLm1VUkk7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbCBNM1VQYXJzZXI6Omhhc1R5cGUoc2l6ZV90IGluZGV4LCBjb25zdCBjaGFyICprZXkpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VHlwZVVSSShpbmRleCwga2V5LCBOVUxMIC8qIHVyaSAqLyk7Cit9CisKIHN0YXRpYyBib29sIE1ha2VVUkwoY29uc3QgY2hhciAqYmFzZVVSTCwgY29uc3QgY2hhciAqdXJsLCBBU3RyaW5nICpvdXQpIHsKICAgICBvdXQtPmNsZWFyKCk7CiAKQEAgLTU4Miw2ICs2MTEsNyBAQAogICAgICAgICAgICAgICAgICAgICBpdGVtTWV0YSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaXRlbU1ldGEtPnNldEludDMyKCJkaXNjb250aW51aXR5IiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgKyttRGlzY29udGludWl0eUNvdW50OwogICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiNFWFQtWC1TVFJFQU0tSU5GIikpIHsKICAgICAgICAgICAgICAgICBpZiAobU1ldGEgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwpAQCAtNjA5LDYgKzYzOSw5IEBACiAgICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgiI0VYVC1YLU1FRElBIikpIHsKICAgICAgICAgICAgICAgICBlcnIgPSBwYXJzZU1lZGlhKGxpbmUpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoIiNFWFQtWC1ESVNDT05USU5VSVRZLVNFUVVFTkNFIikpIHsKKyAgICAgICAgICAgICAgICBpZiAobUlzVmFyaWFudFBsYXlsaXN0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHNpemVfdCBzZXE7CiAgICAgICAgICAgICAgICAgZXJyID0gcGFyc2VEaXNjb250aW51aXR5U2VxdWVuY2UobGluZSwgJnNlcSk7CiAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewpAQCAtNjI4LDYgKzY2MSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhaXRlbU1ldGEtPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZkdXJhdGlvblVzKSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpdGVtTWV0YS0+c2V0SW50MzIoImRpc2NvbnRpbnVpdHktc2VxdWVuY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgbURpc2NvbnRpbnVpdHlTZXEgKyBtRGlzY29udGludWl0eUNvdW50KTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbUl0ZW1zLnB1c2goKTsKQEAgLTY0NCw2ICs2NzksMjUgQEAKICAgICAgICAgKytsaW5lTm87CiAgICAgfQogCisgICAgLy8gZXJyb3IgY2hlY2tpbmcgb2YgYWxsIGZpZWxkcyB0aGF0J3MgcmVxdWlyZWQgdG8gYXBwZWFyIG9uY2UKKyAgICAvLyAoY3VycmVudGx5IG9ubHkgY2hlY2tpbmcgInRhcmdldC1kdXJhdGlvbiIpLCBhbmQKKyAgICAvLyBpbml0aWFsaXphdGlvbiBvZiBwbGF5bGlzdCBwcm9wZXJ0aWVzIChlZy4gbVRhcmdldER1cmF0aW9uVXMpCisgICAgaWYgKCFtSXNWYXJpYW50UGxheWxpc3QpIHsKKyAgICAgICAgaW50MzJfdCB0YXJnZXREdXJhdGlvblNlY3M7CisgICAgICAgIGlmIChtTWV0YSA9PSBOVUxMIHx8ICFtTWV0YS0+ZmluZEludDMyKAorICAgICAgICAgICAgICAgICJ0YXJnZXQtZHVyYXRpb24iLCAmdGFyZ2V0RHVyYXRpb25TZWNzKSkgeworICAgICAgICAgICAgQUxPR0UoIk1lZGlhIHBsYXlsaXN0IG1pc3NpbmcgI0VYVC1YLVRBUkdFVERVUkFUSU9OIik7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIG1UYXJnZXREdXJhdGlvblVzID0gdGFyZ2V0RHVyYXRpb25TZWNzICogMTAwMDAwMGxsOworCisgICAgICAgIG1GaXJzdFNlcU51bWJlciA9IDA7CisgICAgICAgIGlmIChtTWV0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtTWV0YS0+ZmluZEludDMyKCJtZWRpYS1zZXF1ZW5jZSIsICZtRmlyc3RTZXFOdW1iZXIpOworICAgICAgICB9CisgICAgICAgIG1MYXN0U2VxTnVtYmVyID0gbUZpcnN0U2VxTnVtYmVyICsgbUl0ZW1zLnNpemUoKSAtIDE7CisgICAgfQorCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC03ODEsNiArODM1LDI5IEBACiAgICAgICAgICAgICAgICAgKm1ldGEgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAoKm1ldGEpLT5zZXRTdHJpbmcoa2V5LmNfc3RyKCksIGNvZGVjcy5jX3N0cigpKTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcCgicmVzb2x1dGlvbiIsIGtleS5jX3N0cigpKSkgeworICAgICAgICAgICAgY29uc3QgY2hhciAqcyA9IHZhbC5jX3N0cigpOworICAgICAgICAgICAgY2hhciAqZW5kOworICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB3aWR0aCA9IHN0cnRvdWwocywgJmVuZCwgMTApOworCisgICAgICAgICAgICBpZiAoZW5kID09IHMgfHwgKmVuZCAhPSAneCcpIHsKKyAgICAgICAgICAgICAgICAvLyBtYWxmb3JtZWQKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcyA9IGVuZCArIDE7CisgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGhlaWdodCA9IHN0cnRvdWwocywgJmVuZCwgMTApOworCisgICAgICAgICAgICBpZiAoZW5kID09IHMgfHwgKmVuZCAhPSAnXDAnKSB7CisgICAgICAgICAgICAgICAgLy8gbWFsZm9ybWVkCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtZXRhLT5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKm1ldGEgPSBuZXcgQU1lc3NhZ2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKm1ldGEpLT5zZXRJbnQzMigid2lkdGgiLCB3aWR0aCk7CisgICAgICAgICAgICAoKm1ldGEpLT5zZXRJbnQzMigiaGVpZ2h0IiwgaGVpZ2h0KTsKICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcCgiYXVkaW8iLCBrZXkuY19zdHIoKSkKICAgICAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcCgidmlkZW8iLCBrZXkuY19zdHIoKSkKICAgICAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcCgic3VidGl0bGVzIiwga2V5LmNfc3RyKCkpKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5oCmluZGV4IDFjYWQwNjAuLmZhNjQ4ZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5oCkBAIC0zNiw2ICszNiw5IEBACiAgICAgYm9vbCBpc0NvbXBsZXRlKCkgY29uc3Q7CiAgICAgYm9vbCBpc0V2ZW50KCkgY29uc3Q7CiAgICAgc2l6ZV90IGdldERpc2NvbnRpbnVpdHlTZXEoKSBjb25zdDsKKyAgICBpbnQ2NF90IGdldFRhcmdldER1cmF0aW9uKCkgY29uc3Q7CisgICAgaW50MzJfdCBnZXRGaXJzdFNlcU51bWJlcigpIGNvbnN0OworICAgIHZvaWQgZ2V0U2VxTnVtYmVyUmFuZ2UoaW50MzJfdCAqZmlyc3RTZXEsIGludDMyX3QgKmxhc3RTZXEpIGNvbnN0OwogCiAgICAgc3A8QU1lc3NhZ2U+IG1ldGEoKTsKIApAQCAtNTAsNiArNTMsNyBAQAogICAgIHNzaXplX3QgZ2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIC8qIHR5cGUgKi8pIGNvbnN0OwogCiAgICAgYm9vbCBnZXRUeXBlVVJJKHNpemVfdCBpbmRleCwgY29uc3QgY2hhciAqa2V5LCBBU3RyaW5nICp1cmkpIGNvbnN0OworICAgIGJvb2wgaGFzVHlwZShzaXplX3QgaW5kZXgsIGNvbnN0IGNoYXIgKmtleSkgY29uc3Q7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NM1VQYXJzZXIoKTsKQEAgLTY5LDcgKzczLDExIEBACiAgICAgYm9vbCBtSXNWYXJpYW50UGxheWxpc3Q7CiAgICAgYm9vbCBtSXNDb21wbGV0ZTsKICAgICBib29sIG1Jc0V2ZW50OworICAgIGludDMyX3QgbUZpcnN0U2VxTnVtYmVyOworICAgIGludDMyX3QgbUxhc3RTZXFOdW1iZXI7CisgICAgaW50NjRfdCBtVGFyZ2V0RHVyYXRpb25VczsKICAgICBzaXplX3QgbURpc2NvbnRpbnVpdHlTZXE7CisgICAgaW50MzJfdCBtRGlzY29udGludWl0eUNvdW50OwogCiAgICAgc3A8QU1lc3NhZ2U+IG1NZXRhOwogICAgIFZlY3RvcjxJdGVtPiBtSXRlbXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcAppbmRleCAxMjI3NjAwLi43MmQ4MzJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKQEAgLTE3LDI0ICsxNywxOSBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJQbGF5bGlzdEZldGNoZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgogCiAjaW5jbHVkZSAiUGxheWxpc3RGZXRjaGVyLmgiCi0KLSNpbmNsdWRlICJMaXZlRGF0YVNvdXJjZS5oIgorI2luY2x1ZGUgIkhUVFBEb3dubG9hZGVyLmgiCiAjaW5jbHVkZSAiTGl2ZVNlc3Npb24uaCIKICNpbmNsdWRlICJNM1VQYXJzZXIuaCIKLQogI2luY2x1ZGUgImluY2x1ZGUvYXZjX3V0aWxzLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgogI2luY2x1ZGUgImluY2x1ZGUvSUQzLmgiCiAjaW5jbHVkZSAibXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9JU3RyZWFtU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgpAQCAtNDIsNjMgKzM3LDE1NiBAQAogI2luY2x1ZGUgPGN0eXBlLmg+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgotI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CisKKyNkZWZpbmUgRkxPR1YoZm10LCAuLi4pIEFMT0dWKCJbZmV0Y2hlci0lZF0gIiBmbXQsIG1GZXRjaGVySUQsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIEZTTE9HVihzdHJlYW0sIGZtdCwgLi4uKSBBTE9HVigiW2ZldGNoZXItJWRdIFslc10gIiBmbXQsIG1GZXRjaGVySUQsIFwKKyAgICAgICAgIExpdmVTZXNzaW9uOjpnZXROYW1lRm9yU3RyZWFtKHN0cmVhbSksICMjX19WQV9BUkdTX18pCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gc3RhdGljCi1jb25zdCBpbnQ2NF90IFBsYXlsaXN0RmV0Y2hlcjo6a01pbkJ1ZmZlcmVkRHVyYXRpb25VcyA9IDEwMDAwMDAwbGw7Citjb25zdCBpbnQ2NF90IFBsYXlsaXN0RmV0Y2hlcjo6a01pbkJ1ZmZlcmVkRHVyYXRpb25VcyA9IDMwMDAwMDAwbGw7CiBjb25zdCBpbnQ2NF90IFBsYXlsaXN0RmV0Y2hlcjo6a01heE1vbml0b3JEZWxheVVzID0gMzAwMDAwMGxsOwogLy8gTENNIG9mIDE4OCAoc2l6ZSBvZiBhIFRTIHBhY2tldCkgJiAxayB3b3JrcyB3ZWxsCiBjb25zdCBpbnQzMl90IFBsYXlsaXN0RmV0Y2hlcjo6a0Rvd25sb2FkQmxvY2tTaXplID0gNDcgKiAxMDI0OwotY29uc3QgaW50MzJfdCBQbGF5bGlzdEZldGNoZXI6OmtOdW1Ta2lwRnJhbWVzID0gNTsKKworc3RydWN0IFBsYXlsaXN0RmV0Y2hlcjo6RG93bmxvYWRTdGF0ZSA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBEb3dubG9hZFN0YXRlKCk7CisgICAgdm9pZCByZXNldFN0YXRlKCk7CisgICAgYm9vbCBoYXNTYXZlZFN0YXRlKCkgY29uc3Q7CisgICAgdm9pZCByZXN0b3JlU3RhdGUoCisgICAgICAgICAgICBBU3RyaW5nICZ1cmksCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gJml0ZW1NZXRhLAorICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+ICZ0c0J1ZmZlciwKKyAgICAgICAgICAgIGludDMyX3QgJmZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKKyAgICAgICAgICAgIGludDMyX3QgJmxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KTsKKyAgICB2b2lkIHNhdmVTdGF0ZSgKKyAgICAgICAgICAgIEFTdHJpbmcgJnVyaSwKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiAmaXRlbU1ldGEsCisgICAgICAgICAgICBzcDxBQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gJnRzQnVmZmVyLAorICAgICAgICAgICAgaW50MzJfdCAmZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LAorICAgICAgICAgICAgaW50MzJfdCAmbGFzdFNlcU51bWJlckluUGxheWxpc3QpOworCitwcml2YXRlOgorICAgIGJvb2wgbUhhc1NhdmVkU3RhdGU7CisgICAgQVN0cmluZyBtVXJpOworICAgIHNwPEFNZXNzYWdlPiBtSXRlbU1ldGE7CisgICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKKyAgICBzcDxBQnVmZmVyPiBtVHNCdWZmZXI7CisgICAgaW50MzJfdCBtRmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0OworICAgIGludDMyX3QgbUxhc3RTZXFOdW1iZXJJblBsYXlsaXN0OworfTsKKworUGxheWxpc3RGZXRjaGVyOjpEb3dubG9hZFN0YXRlOjpEb3dubG9hZFN0YXRlKCkgeworICAgIHJlc2V0U3RhdGUoKTsKK30KKworYm9vbCBQbGF5bGlzdEZldGNoZXI6OkRvd25sb2FkU3RhdGU6Omhhc1NhdmVkU3RhdGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1IYXNTYXZlZFN0YXRlOworfQorCit2b2lkIFBsYXlsaXN0RmV0Y2hlcjo6RG93bmxvYWRTdGF0ZTo6cmVzZXRTdGF0ZSgpIHsKKyAgICBtSGFzU2F2ZWRTdGF0ZSA9IGZhbHNlOworCisgICAgbVVyaS5jbGVhcigpOworICAgIG1JdGVtTWV0YSA9IE5VTEw7CisgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgbVRzQnVmZmVyID0gTlVMTDsKKyAgICBtRmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ID0gMDsKKyAgICBtTGFzdFNlcU51bWJlckluUGxheWxpc3QgPSAwOworfQorCit2b2lkIFBsYXlsaXN0RmV0Y2hlcjo6RG93bmxvYWRTdGF0ZTo6cmVzdG9yZVN0YXRlKAorICAgICAgICBBU3RyaW5nICZ1cmksCisgICAgICAgIHNwPEFNZXNzYWdlPiAmaXRlbU1ldGEsCisgICAgICAgIHNwPEFCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIHNwPEFCdWZmZXI+ICZ0c0J1ZmZlciwKKyAgICAgICAgaW50MzJfdCAmZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LAorICAgICAgICBpbnQzMl90ICZsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCkgeworICAgIGlmICghbUhhc1NhdmVkU3RhdGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVyaSA9IG1Vcmk7CisgICAgaXRlbU1ldGEgPSBtSXRlbU1ldGE7CisgICAgYnVmZmVyID0gbUJ1ZmZlcjsKKyAgICB0c0J1ZmZlciA9IG1Uc0J1ZmZlcjsKKyAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgPSBtRmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0OworICAgIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0ID0gbUxhc3RTZXFOdW1iZXJJblBsYXlsaXN0OworCisgICAgcmVzZXRTdGF0ZSgpOworfQorCit2b2lkIFBsYXlsaXN0RmV0Y2hlcjo6RG93bmxvYWRTdGF0ZTo6c2F2ZVN0YXRlKAorICAgICAgICBBU3RyaW5nICZ1cmksCisgICAgICAgIHNwPEFNZXNzYWdlPiAmaXRlbU1ldGEsCisgICAgICAgIHNwPEFCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIHNwPEFCdWZmZXI+ICZ0c0J1ZmZlciwKKyAgICAgICAgaW50MzJfdCAmZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LAorICAgICAgICBpbnQzMl90ICZsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCkgeworICAgIG1IYXNTYXZlZFN0YXRlID0gdHJ1ZTsKKworICAgIG1VcmkgPSB1cmk7CisgICAgbUl0ZW1NZXRhID0gaXRlbU1ldGE7CisgICAgbUJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICBtVHNCdWZmZXIgPSB0c0J1ZmZlcjsKKyAgICBtRmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ID0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0OworICAgIG1MYXN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0OworfQogCiBQbGF5bGlzdEZldGNoZXI6OlBsYXlsaXN0RmV0Y2hlcigKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCiAgICAgICAgIGNvbnN0IHNwPExpdmVTZXNzaW9uPiAmc2Vzc2lvbiwKICAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBpbnQzMl90IGlkLAogICAgICAgICBpbnQzMl90IHN1YnRpdGxlR2VuZXJhdGlvbikKICAgICA6IG1Ob3RpZnkobm90aWZ5KSwKLSAgICAgIG1TdGFydFRpbWVVc05vdGlmeShub3RpZnktPmR1cCgpKSwKICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLAogICAgICAgbVVSSSh1cmkpLAorICAgICAgbUZldGNoZXJJRChpZCksCiAgICAgICBtU3RyZWFtVHlwZU1hc2soMCksCiAgICAgICBtU3RhcnRUaW1lVXMoLTFsbCksCiAgICAgICBtU2VnbWVudFN0YXJ0VGltZVVzKC0xbGwpLAogICAgICAgbURpc2NvbnRpbnVpdHlTZXEoLTFsbCksCiAgICAgICBtU3RhcnRUaW1lVXNSZWxhdGl2ZShmYWxzZSksCiAgICAgICBtTGFzdFBsYXlsaXN0RmV0Y2hUaW1lVXMoLTFsbCksCisgICAgICBtUGxheWxpc3RUaW1lVXMoLTFsbCksCiAgICAgICBtU2VxTnVtYmVyKC0xKSwKICAgICAgIG1OdW1SZXRyaWVzKDApLAogICAgICAgbVN0YXJ0dXAodHJ1ZSksCi0gICAgICBtQWRhcHRpdmUoZmFsc2UpLAotICAgICAgbVByZXBhcmVkKGZhbHNlKSwKKyAgICAgIG1JRFJGb3VuZChmYWxzZSksCisgICAgICBtU2Vla01vZGUoTGl2ZVNlc3Npb246OmtTZWVrTW9kZUV4YWN0UG9zaXRpb24pLAorICAgICAgbVRpbWVDaGFuZ2VTaWduYWxlZChmYWxzZSksCiAgICAgICBtTmV4dFBUU1RpbWVVcygtMWxsKSwKICAgICAgIG1Nb25pdG9yUXVldWVHZW5lcmF0aW9uKDApLAogICAgICAgbVN1YnRpdGxlR2VuZXJhdGlvbihzdWJ0aXRsZUdlbmVyYXRpb24pLAorICAgICAgbUxhc3REaXNjb250aW51aXR5U2VxKC0xbGwpLAogICAgICAgbVJlZnJlc2hTdGF0ZShJTklUSUFMX01JTklNVU1fUkVMT0FEX0RFTEFZKSwKICAgICAgIG1GaXJzdFBUU1ZhbGlkKGZhbHNlKSwKLSAgICAgIG1BYnNvbHV0ZVRpbWVBbmNob3JVcygwbGwpLAotICAgICAgbVZpZGVvQnVmZmVyKG5ldyBBbm90aGVyUGFja2V0U291cmNlKE5VTEwpKSB7CisgICAgICBtRmlyc3RUaW1lVXMoLTFsbCksCisgICAgICBtVmlkZW9CdWZmZXIobmV3IEFub3RoZXJQYWNrZXRTb3VyY2UoTlVMTCkpLAorICAgICAgbVRocmVzaG9sZFJhdGlvKC0xLjBmKSwKKyAgICAgIG1Eb3dubG9hZFN0YXRlKG5ldyBEb3dubG9hZFN0YXRlKCkpLAorICAgICAgbUhhc01ldGFkYXRhKGZhbHNlKSB7CiAgICAgbWVtc2V0KG1QbGF5bGlzdEhhc2gsIDAsIHNpemVvZihtUGxheWxpc3RIYXNoKSk7Ci0gICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0U3RhcnRlZEF0KTsKLSAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDMyKCJzdHJlYW1NYXNrIiwgMCk7CisgICAgbUhUVFBEb3dubG9hZGVyID0gbVNlc3Npb24tPmdldEhUVFBEb3dubG9hZGVyKCk7CiB9CiAKIFBsYXlsaXN0RmV0Y2hlcjo6flBsYXlsaXN0RmV0Y2hlcigpIHsKIH0KIAoraW50MzJfdCBQbGF5bGlzdEZldGNoZXI6OmdldEZldGNoZXJJRCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUZldGNoZXJJRDsKK30KKwogaW50NjRfdCBQbGF5bGlzdEZldGNoZXI6OmdldFNlZ21lbnRTdGFydFRpbWVVcyhpbnQzMl90IHNlcU51bWJlcikgY29uc3QgewogICAgIENIRUNLKG1QbGF5bGlzdCAhPSBOVUxMKTsKIAotICAgIGludDMyX3QgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0OwotICAgIGlmIChtUGxheWxpc3QtPm1ldGEoKSA9PSBOVUxMIHx8ICFtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgICJtZWRpYS1zZXF1ZW5jZSIsICZmaXJzdFNlcU51bWJlckluUGxheWxpc3QpKSB7Ci0gICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IDA7Ci0gICAgfQotCi0gICAgaW50MzJfdCBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCA9Ci0gICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIChpbnQzMl90KW1QbGF5bGlzdC0+c2l6ZSgpIC0gMTsKKyAgICBpbnQzMl90IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwgbGFzdFNlcU51bWJlckluUGxheWxpc3Q7CisgICAgbVBsYXlsaXN0LT5nZXRTZXFOdW1iZXJSYW5nZSgKKyAgICAgICAgICAgICZmaXJzdFNlcU51bWJlckluUGxheWxpc3QsICZsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCk7CiAKICAgICBDSEVDS19HRShzZXFOdW1iZXIsIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCk7CiAgICAgQ0hFQ0tfTEUoc2VxTnVtYmVyLCBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCk7CkBAIC0xMTksNiArMjA3LDI3IEBACiAgICAgcmV0dXJuIHNlZ21lbnRTdGFydFVzOwogfQogCitpbnQ2NF90IFBsYXlsaXN0RmV0Y2hlcjo6Z2V0U2VnbWVudER1cmF0aW9uVXMoaW50MzJfdCBzZXFOdW1iZXIpIGNvbnN0IHsKKyAgICBDSEVDSyhtUGxheWxpc3QgIT0gTlVMTCk7CisKKyAgICBpbnQzMl90IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwgbGFzdFNlcU51bWJlckluUGxheWxpc3Q7CisgICAgbVBsYXlsaXN0LT5nZXRTZXFOdW1iZXJSYW5nZSgKKyAgICAgICAgICAgICZmaXJzdFNlcU51bWJlckluUGxheWxpc3QsICZsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCk7CisKKyAgICBDSEVDS19HRShzZXFOdW1iZXIsIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCk7CisgICAgQ0hFQ0tfTEUoc2VxTnVtYmVyLCBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCk7CisKKyAgICBpbnQzMl90IGluZGV4ID0gc2VxTnVtYmVyIC0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0OworICAgIHNwPEFNZXNzYWdlPiBpdGVtTWV0YTsKKyAgICBDSEVDSyhtUGxheWxpc3QtPml0ZW1BdCgKKyAgICAgICAgICAgICAgICBpbmRleCwgTlVMTCAvKiB1cmkgKi8sICZpdGVtTWV0YSkpOworCisgICAgaW50NjRfdCBpdGVtRHVyYXRpb25VczsKKyAgICBDSEVDSyhpdGVtTWV0YS0+ZmluZEludDY0KCJkdXJhdGlvblVzIiwgJml0ZW1EdXJhdGlvblVzKSk7CisKKyAgICByZXR1cm4gaXRlbUR1cmF0aW9uVXM7Cit9CisKIGludDY0X3QgUGxheWxpc3RGZXRjaGVyOjpkZWxheVVzVG9SZWZyZXNoUGxheWxpc3QoKSBjb25zdCB7CiAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CiAKQEAgLTEzMSwxMCArMjQwLDcgQEAKICAgICAgICAgcmV0dXJuICh+MGxsdSA+PiAxKTsKICAgICB9CiAKLSAgICBpbnQzMl90IHRhcmdldER1cmF0aW9uU2VjczsKLSAgICBDSEVDSyhtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKCJ0YXJnZXQtZHVyYXRpb24iLCAmdGFyZ2V0RHVyYXRpb25TZWNzKSk7Ci0KLSAgICBpbnQ2NF90IHRhcmdldER1cmF0aW9uVXMgPSB0YXJnZXREdXJhdGlvblNlY3MgKiAxMDAwMDAwbGw7CisgICAgaW50NjRfdCB0YXJnZXREdXJhdGlvblVzID0gbVBsYXlsaXN0LT5nZXRUYXJnZXREdXJhdGlvbigpOwogCiAgICAgaW50NjRfdCBtaW5QbGF5bGlzdEFnZVVzOwogCkBAIC0yMjQsOSArMzMwLDExIEBACiAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAga2V5ID0gbUFFU0tleUZvclVSSS52YWx1ZUF0KGluZGV4KTsKICAgICB9IGVsc2UgewotICAgICAgICBzc2l6ZV90IGVyciA9IG1TZXNzaW9uLT5mZXRjaEZpbGUoa2V5VVJJLmNfc3RyKCksICZrZXkpOworICAgICAgICBzc2l6ZV90IGVyciA9IG1IVFRQRG93bmxvYWRlci0+ZmV0Y2hGaWxlKGtleVVSSS5jX3N0cigpLCAma2V5KTsKIAotICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBpZiAoZXJyID09IEVSUk9SX05PVF9DT05ORUNURUQpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9OT1RfQ09OTkVDVEVEOworICAgICAgICB9IGVsc2UgaWYgKGVyciA8IDApIHsKICAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZmV0Y2ggY2lwaGVyIGtleSBmcm9tICclcycuIiwga2V5VVJJLmNfc3RyKCkpOwogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICB9IGVsc2UgaWYgKGtleS0+c2l6ZSgpICE9IDE2KSB7CkBAIC0zMjIsMTAgKzQzMCwxMCBAQAogICAgICAgICBtYXhEZWxheVVzID0gbWluRGVsYXlVczsKICAgICB9CiAgICAgaWYgKGRlbGF5VXMgPiBtYXhEZWxheVVzKSB7Ci0gICAgICAgIEFMT0dWKCJOZWVkIHRvIHJlZnJlc2ggcGxheWxpc3QgaW4gJSIgUFJJZDY0ICwgbWF4RGVsYXlVcyk7CisgICAgICAgIEZMT0dWKCJOZWVkIHRvIHJlZnJlc2ggcGxheWxpc3QgaW4gJWxsZCIsIChsb25nIGxvbmcpbWF4RGVsYXlVcyk7CiAgICAgICAgIGRlbGF5VXMgPSBtYXhEZWxheVVzOwogICAgIH0KLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0TW9uaXRvclF1ZXVlLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0TW9uaXRvclF1ZXVlLCB0aGlzKTsKICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbU1vbml0b3JRdWV1ZUdlbmVyYXRpb24pOwogICAgIG1zZy0+cG9zdChkZWxheVVzKTsKIH0KQEAgLTMzNCwxNSArNDQyLDQ0IEBACiAgICAgKyttTW9uaXRvclF1ZXVlR2VuZXJhdGlvbjsKIH0KIAordm9pZCBQbGF5bGlzdEZldGNoZXI6OnNldFN0b3BwaW5nVGhyZXNob2xkKGZsb2F0IHRocmVzaG9sZFJhdGlvLCBib29sIGRpc2Nvbm5lY3QpIHsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBfbChtVGhyZXNob2xkTG9jayk7CisgICAgICAgIG1UaHJlc2hvbGRSYXRpbyA9IHRocmVzaG9sZFJhdGlvOworICAgIH0KKyAgICBpZiAoZGlzY29ubmVjdCkgeworICAgICAgICBtSFRUUERvd25sb2FkZXItPmRpc2Nvbm5lY3QoKTsKKyAgICB9Cit9CisKK3ZvaWQgUGxheWxpc3RGZXRjaGVyOjpyZXNldFN0b3BwaW5nVGhyZXNob2xkKGJvb2wgZGlzY29ubmVjdCkgeworICAgIHsKKyAgICAgICAgQXV0b011dGV4IF9sKG1UaHJlc2hvbGRMb2NrKTsKKyAgICAgICAgbVRocmVzaG9sZFJhdGlvID0gLTEuMGY7CisgICAgfQorICAgIGlmIChkaXNjb25uZWN0KSB7CisgICAgICAgIG1IVFRQRG93bmxvYWRlci0+ZGlzY29ubmVjdCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGFsbG93IHJlY29ubmVjdAorICAgICAgICBtSFRUUERvd25sb2FkZXItPnJlY29ubmVjdCgpOworICAgIH0KK30KKworZmxvYXQgUGxheWxpc3RGZXRjaGVyOjpnZXRTdG9wcGluZ1RocmVzaG9sZCgpIHsKKyAgICBBdXRvTXV0ZXggX2wobVRocmVzaG9sZExvY2spOworICAgIHJldHVybiBtVGhyZXNob2xkUmF0aW87Cit9CisKIHZvaWQgUGxheWxpc3RGZXRjaGVyOjpzdGFydEFzeW5jKAogICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmYXVkaW9Tb3VyY2UsCiAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZ2aWRlb1NvdXJjZSwKICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJnN1YnRpdGxlU291cmNlLAorICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmbWV0YWRhdGFTb3VyY2UsCiAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXMsCiAgICAgICAgIGludDY0X3Qgc2VnbWVudFN0YXJ0VGltZVVzLAogICAgICAgICBpbnQzMl90IHN0YXJ0RGlzY29udGludWl0eVNlcSwKLSAgICAgICAgYm9vbCBhZGFwdGl2ZSkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgaWQoKSk7CisgICAgICAgIExpdmVTZXNzaW9uOjpTZWVrTW9kZSBzZWVrTW9kZSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgdGhpcyk7CiAKICAgICB1aW50MzJfdCBzdHJlYW1UeXBlTWFzayA9IDB1bDsKIApAQCAtMzYxLDMwICs0OTgsNTMgQEAKICAgICAgICAgc3RyZWFtVHlwZU1hc2sgfD0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfU1VCVElUTEVTOwogICAgIH0KIAorICAgIGlmIChtZXRhZGF0YVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcigibWV0YWRhdGFTb3VyY2UiLCBtZXRhZGF0YVNvdXJjZS5nZXQoKSk7CisgICAgICAgIC8vIG1ldGFkYXRhU291cmNlIGRvZXMgbm90IGFmZmVjdCBzdHJlYW1UeXBlTWFzay4KKyAgICB9CisKICAgICBtc2ctPnNldEludDMyKCJzdHJlYW1UeXBlTWFzayIsIHN0cmVhbVR5cGVNYXNrKTsKICAgICBtc2ctPnNldEludDY0KCJzdGFydFRpbWVVcyIsIHN0YXJ0VGltZVVzKTsKICAgICBtc2ctPnNldEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCBzZWdtZW50U3RhcnRUaW1lVXMpOwogICAgIG1zZy0+c2V0SW50MzIoInN0YXJ0RGlzY29udGludWl0eVNlcSIsIHN0YXJ0RGlzY29udGludWl0eVNlcSk7Ci0gICAgbXNnLT5zZXRJbnQzMigiYWRhcHRpdmUiLCBhZGFwdGl2ZSk7CisgICAgbXNnLT5zZXRJbnQzMigic2Vla01vZGUiLCBzZWVrTW9kZSk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKLXZvaWQgUGxheWxpc3RGZXRjaGVyOjpwYXVzZUFzeW5jKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQYXVzZSwgaWQoKSkpLT5wb3N0KCk7CisvKgorICogcGF1c2VBc3luYworICoKKyAqIHRocmVzaG9sZDogMC4wZiAtIHBhdXNlIGFmdGVyIGN1cnJlbnQgZmV0Y2ggYmxvY2sgKGRlZmF1bHQgNDdLYnl0ZXMpCisgKiAgICAgICAgICAgLTEuMGYgLSBwYXVzZSBhZnRlciBmaW5pc2hpbmcgY3VycmVudCBzZWdtZW50CisgKiAgICAgICAgMC4wfjEuMGYgLSBwYXVzZSBpZiByZW1haW5pbmcgb2YgY3VycmVudCBzZWdtZW50IGV4Y2VlZHMgdGhyZXNob2xkCisgKi8KK3ZvaWQgUGxheWxpc3RGZXRjaGVyOjpwYXVzZUFzeW5jKAorICAgICAgICBmbG9hdCB0aHJlc2hvbGRSYXRpbywgYm9vbCBkaXNjb25uZWN0KSB7CisgICAgc2V0U3RvcHBpbmdUaHJlc2hvbGQodGhyZXNob2xkUmF0aW8sIGRpc2Nvbm5lY3QpOworCisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCB0aGlzKSktPnBvc3QoKTsKIH0KIAogdm9pZCBQbGF5bGlzdEZldGNoZXI6OnN0b3BBc3luYyhib29sIGNsZWFyKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0b3AsIGlkKCkpOworICAgIHNldFN0b3BwaW5nVGhyZXNob2xkKDAuMGYsIHRydWUgLyogZGlzY29ubmNlY3QgKi8pOworCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFN0b3AsIHRoaXMpOwogICAgIG1zZy0+c2V0SW50MzIoImNsZWFyIiwgY2xlYXIpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCiB2b2lkIFBsYXlsaXN0RmV0Y2hlcjo6cmVzdW1lVW50aWxBc3luYyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcykgewotICAgIEFNZXNzYWdlKiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bWVVbnRpbCwgaWQoKSk7CisgICAgRkxPR1YoInJlc3VtZVVudGlsQXN5bmM6IHBhcmFtcz0lcyIsIHBhcmFtcy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKworICAgIEFNZXNzYWdlKiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bWVVbnRpbCwgdGhpcyk7CiAgICAgbXNnLT5zZXRNZXNzYWdlKCJwYXJhbXMiLCBwYXJhbXMpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCit2b2lkIFBsYXlsaXN0RmV0Y2hlcjo6ZmV0Y2hQbGF5bGlzdEFzeW5jKCkgeworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRGZXRjaFBsYXlsaXN0LCB0aGlzKSktPnBvc3QoKTsKK30KKwogdm9pZCBQbGF5bGlzdEZldGNoZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewogICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6CkBAIC00MDQsNiArNTY0LDEwIEBACiAKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFBhdXNlZCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzZWVrTW9kZSIsCisgICAgICAgICAgICAgICAgICAgIG1Eb3dubG9hZFN0YXRlLT5oYXNTYXZlZFN0YXRlKCkKKyAgICAgICAgICAgICAgICAgICAgPyBMaXZlU2Vzc2lvbjo6a1NlZWtNb2RlTmV4dFNhbXBsZQorICAgICAgICAgICAgICAgICAgICA6IExpdmVTZXNzaW9uOjprU2Vla01vZGVOZXh0U2VnbWVudCk7CiAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC00MTgsNiArNTgyLDE5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRGZXRjaFBsYXlsaXN0OgorICAgICAgICB7CisgICAgICAgICAgICBib29sIHVuY2hhbmdlZDsKKyAgICAgICAgICAgIHNwPE0zVVBhcnNlcj4gcGxheWxpc3QgPSBtSFRUUERvd25sb2FkZXItPmZldGNoUGxheWxpc3QoCisgICAgICAgICAgICAgICAgICAgIG1VUkkuY19zdHIoKSwgTlVMTCAvKiBjdXJQbGF5bGlzdEhhc2ggKi8sICZ1bmNoYW5nZWQpOworCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRQbGF5bGlzdEZldGNoZWQpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRPYmplY3QoInBsYXlsaXN0IiwgcGxheWxpc3QpOworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2Uga1doYXRNb25pdG9yUXVldWU6CiAgICAgICAgIGNhc2Uga1doYXREb3dubG9hZE5leHQ6CiAgICAgICAgIHsKQEAgLTQ1MCw2ICs2MjcsMTAgQEAKIAogc3RhdHVzX3QgUGxheWxpc3RGZXRjaGVyOjpvblN0YXJ0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgbVBhY2tldFNvdXJjZXMuY2xlYXIoKTsKKyAgICBtU3RvcFBhcmFtcy5jbGVhcigpOworICAgIG1TdGFydFRpbWVVc05vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFN0YXJ0ZWRBdCk7CisgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRTdHJpbmcoInVyaSIsIG1VUkkpOwogCiAgICAgdWludDMyX3Qgc3RyZWFtVHlwZU1hc2s7CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInN0cmVhbVR5cGVNYXNrIiwgKGludDMyX3QgKikmc3RyZWFtVHlwZU1hc2spKTsKQEAgLTQ1NywxMSArNjM4LDExIEBACiAgICAgaW50NjRfdCBzdGFydFRpbWVVczsKICAgICBpbnQ2NF90IHNlZ21lbnRTdGFydFRpbWVVczsKICAgICBpbnQzMl90IHN0YXJ0RGlzY29udGludWl0eVNlcTsKLSAgICBpbnQzMl90IGFkYXB0aXZlOworICAgIGludDMyX3Qgc2Vla01vZGU7CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInN0YXJ0VGltZVVzIiwgJnN0YXJ0VGltZVVzKSk7CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNlZ21lbnRTdGFydFRpbWVVcyIsICZzZWdtZW50U3RhcnRUaW1lVXMpKTsKICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic3RhcnREaXNjb250aW51aXR5U2VxIiwgJnN0YXJ0RGlzY29udGludWl0eVNlcSkpOwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhZGFwdGl2ZSIsICZhZGFwdGl2ZSkpOworICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzZWVrTW9kZSIsICZzZWVrTW9kZSkpOwogCiAgICAgaWYgKHN0cmVhbVR5cGVNYXNrICYgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfQVVESU8pIHsKICAgICAgICAgdm9pZCAqcHRyOwpAQCAtNDkwLDE3ICs2NzEsMzggQEAKICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBbm90aGVyUGFja2V0U291cmNlICo+KHB0cikpOwogICAgIH0KIAorICAgIHZvaWQgKnB0cjsKKyAgICAvLyBtZXRhZGF0YVNvdXJjZSBpcyBub3QgcGFydCBvZiBzdHJlYW1UeXBlTWFzaworICAgIGlmICgoc3RyZWFtVHlwZU1hc2sgJiAoTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfQVVESU8gfCBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9WSURFTykpCisgICAgICAgICAgICAmJiBtc2ctPmZpbmRQb2ludGVyKCJtZXRhZGF0YVNvdXJjZSIsICZwdHIpKSB7CisgICAgICAgIG1QYWNrZXRTb3VyY2VzLmFkZCgKKyAgICAgICAgICAgICAgICBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9NRVRBREFUQSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBbm90aGVyUGFja2V0U291cmNlICo+KHB0cikpOworICAgIH0KKwogICAgIG1TdHJlYW1UeXBlTWFzayA9IHN0cmVhbVR5cGVNYXNrOwogCiAgICAgbVNlZ21lbnRTdGFydFRpbWVVcyA9IHNlZ21lbnRTdGFydFRpbWVVczsKLSAgICBtRGlzY29udGludWl0eVNlcSA9IHN0YXJ0RGlzY29udGludWl0eVNlcTsKKworICAgIGlmIChzdGFydERpc2NvbnRpbnVpdHlTZXEgPj0gMCkgeworICAgICAgICBtRGlzY29udGludWl0eVNlcSA9IHN0YXJ0RGlzY29udGludWl0eVNlcTsKKyAgICB9CisKKyAgICBtUmVmcmVzaFN0YXRlID0gSU5JVElBTF9NSU5JTVVNX1JFTE9BRF9ERUxBWTsKKyAgICBtU2Vla01vZGUgPSAoTGl2ZVNlc3Npb246OlNlZWtNb2RlKSBzZWVrTW9kZTsKKworICAgIGlmIChzdGFydFRpbWVVcyA+PSAwIHx8IG1TZWVrTW9kZSA9PSBMaXZlU2Vzc2lvbjo6a1NlZWtNb2RlTmV4dFNhbXBsZSkgeworICAgICAgICBtU3RhcnR1cCA9IHRydWU7CisgICAgICAgIG1JRFJGb3VuZCA9IGZhbHNlOworICAgICAgICBtVmlkZW9CdWZmZXItPmNsZWFyKCk7CisgICAgfQogCiAgICAgaWYgKHN0YXJ0VGltZVVzID49IDApIHsKICAgICAgICAgbVN0YXJ0VGltZVVzID0gc3RhcnRUaW1lVXM7CisgICAgICAgIG1GaXJzdFBUU1ZhbGlkID0gZmFsc2U7CiAgICAgICAgIG1TZXFOdW1iZXIgPSAtMTsKLSAgICAgICAgbVN0YXJ0dXAgPSB0cnVlOwotICAgICAgICBtUHJlcGFyZWQgPSBmYWxzZTsKLSAgICAgICAgbUFkYXB0aXZlID0gYWRhcHRpdmU7CisgICAgICAgIG1UaW1lQ2hhbmdlU2lnbmFsZWQgPSBmYWxzZTsKKyAgICAgICAgbURvd25sb2FkU3RhdGUtPnJlc2V0U3RhdGUoKTsKICAgICB9CiAKICAgICBwb3N0TW9uaXRvclF1ZXVlKCk7CkBAIC01MTAsNiArNzEyLDkgQEAKIAogdm9pZCBQbGF5bGlzdEZldGNoZXI6Om9uUGF1c2UoKSB7CiAgICAgY2FuY2VsTW9uaXRvclF1ZXVlKCk7CisgICAgbUxhc3REaXNjb250aW51aXR5U2VxID0gbURpc2NvbnRpbnVpdHlTZXE7CisKKyAgICByZXNldFN0b3BwaW5nVGhyZXNob2xkKGZhbHNlIC8qIGRpc2Nvbm5lY3QgKi8pOwogfQogCiB2b2lkIFBsYXlsaXN0RmV0Y2hlcjo6b25TdG9wKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CkBAIC01MjQsOCArNzI5LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBtRG93bmxvYWRTdGF0ZS0+cmVzZXRTdGF0ZSgpOwogICAgIG1QYWNrZXRTb3VyY2VzLmNsZWFyKCk7CiAgICAgbVN0cmVhbVR5cGVNYXNrID0gMDsKKworICAgIHJlc2V0U3RvcHBpbmdUaHJlc2hvbGQodHJ1ZSAvKiBkaXNjb25uZWN0ICovKTsKIH0KIAogLy8gUmVzdW1lIHVudGlsIHdlIGhhdmUgcmVhY2hlZCB0aGUgYm91bmRhcnkgdGltZXN0YW1wcyBsaXN0ZWQgaW4gYG1zZ2A7IHdoZW4KQEAgLTUzNSw1NyArNzQzLDE4IEBACiAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtczsKICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJwYXJhbXMiLCAmcGFyYW1zKSk7CiAKLSAgICBib29sIHN0b3AgPSBmYWxzZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYWNrZXRTb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHBhY2tldFNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlQXQoaSk7Ci0KLSAgICAgICAgY29uc3QgY2hhciAqc3RvcEtleTsKLSAgICAgICAgaW50IHN0cmVhbVR5cGUgPSBtUGFja2V0U291cmNlcy5rZXlBdChpKTsKLSAgICAgICAgc3dpdGNoIChzdHJlYW1UeXBlKSB7Ci0gICAgICAgIGNhc2UgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfVklERU86Ci0gICAgICAgICAgICBzdG9wS2V5ID0gInRpbWVVc1ZpZGVvIjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfQVVESU86Ci0gICAgICAgICAgICBzdG9wS2V5ID0gInRpbWVVc0F1ZGlvIjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfU1VCVElUTEVTOgotICAgICAgICAgICAgc3RvcEtleSA9ICJ0aW1lVXNTdWJ0aXRsZSI7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIERvbid0IHJlc3VtZSBpZiB3ZSB3b3VsZCBzdG9wIHdpdGhpbiBhIHJlc3VtZSB0aHJlc2hvbGQuCi0gICAgICAgIGludDMyX3QgZGlzY29udGludWl0eVNlcTsKLSAgICAgICAgaW50NjRfdCBsYXRlc3RUaW1lVXMgPSAwLCBzdG9wVGltZVVzID0gMDsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IGxhdGVzdE1ldGEgPSBwYWNrZXRTb3VyY2UtPmdldExhdGVzdEVucXVldWVkTWV0YSgpOwotICAgICAgICBpZiAobGF0ZXN0TWV0YSAhPSBOVUxMCi0gICAgICAgICAgICAgICAgJiYgbGF0ZXN0TWV0YS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgJmRpc2NvbnRpbnVpdHlTZXEpCi0gICAgICAgICAgICAgICAgJiYgZGlzY29udGludWl0eVNlcSA9PSBtRGlzY29udGludWl0eVNlcQotICAgICAgICAgICAgICAgICYmIGxhdGVzdE1ldGEtPmZpbmRJbnQ2NCgidGltZVVzIiwgJmxhdGVzdFRpbWVVcykKLSAgICAgICAgICAgICAgICAmJiBwYXJhbXMtPmZpbmRJbnQ2NChzdG9wS2V5LCAmc3RvcFRpbWVVcykKLSAgICAgICAgICAgICAgICAmJiBzdG9wVGltZVVzIC0gbGF0ZXN0VGltZVVzIDwgcmVzdW1lVGhyZXNob2xkKGxhdGVzdE1ldGEpKSB7Ci0gICAgICAgICAgICBzdG9wID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChzdG9wKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhY2tldFNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG1QYWNrZXRTb3VyY2VzLnZhbHVlQXQoaSktPnF1ZXVlQWNjZXNzVW5pdChtU2Vzc2lvbi0+Y3JlYXRlRm9ybWF0Q2hhbmdlQnVmZmVyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHN0b3BBc3luYygvKiBjbGVhciA9ICovIGZhbHNlKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQogICAgIG1TdG9wUGFyYW1zID0gcGFyYW1zOwotICAgIHBvc3RNb25pdG9yUXVldWUoKTsKKyAgICBvbkRvd25sb2FkTmV4dCgpOwogCiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIFBsYXlsaXN0RmV0Y2hlcjo6bm90aWZ5U3RvcFJlYWNoZWQoKSB7CisgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFN0b3BSZWFjaGVkKTsKKyAgICBub3RpZnktPnBvc3QoKTsKK30KKwogdm9pZCBQbGF5bGlzdEZldGNoZXI6Om5vdGlmeUVycm9yKHN0YXR1c190IGVycikgewogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRFcnJvcik7CkBAIC02MDQsOTYgKzc3Myw4NCBAQAogfQogCiB2b2lkIFBsYXlsaXN0RmV0Y2hlcjo6b25Nb25pdG9yUXVldWUoKSB7Ci0gICAgYm9vbCBkb3dubG9hZE1vcmUgPSBmYWxzZTsKLSAgICByZWZyZXNoUGxheWxpc3QoKTsKLQotICAgIGludDMyX3QgdGFyZ2V0RHVyYXRpb25TZWNzOwotICAgIGludDY0X3QgdGFyZ2V0RHVyYXRpb25VcyA9IGtNaW5CdWZmZXJlZER1cmF0aW9uVXM7Ci0gICAgaWYgKG1QbGF5bGlzdCAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChtUGxheWxpc3QtPm1ldGEoKSA9PSBOVUxMIHx8ICFtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgICJ0YXJnZXQtZHVyYXRpb24iLCAmdGFyZ2V0RHVyYXRpb25TZWNzKSkgewotICAgICAgICAgICAgQUxPR0UoIlBsYXlsaXN0IGlzIG1pc3NpbmcgcmVxdWlyZWQgRVhULVgtVEFSR0VURFVSQVRJT04gdGFnIik7Ci0gICAgICAgICAgICBub3RpZnlFcnJvcihFUlJPUl9NQUxGT1JNRUQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRhcmdldER1cmF0aW9uVXMgPSB0YXJnZXREdXJhdGlvblNlY3MgKiAxMDAwMDAwbGw7CisgICAgLy8gaW4gdGhlIG1pZGRsZSBvZiBhbiB1bmZpbmlzaGVkIGRvd25sb2FkLCBkZWxheQorICAgIC8vIHBsYXlsaXN0IHJlZnJlc2ggYXMgaXQnbGwgY2hhbmdlIHNlcSBudW1iZXJzCisgICAgaWYgKCFtRG93bmxvYWRTdGF0ZS0+aGFzU2F2ZWRTdGF0ZSgpKSB7CisgICAgICAgIHJlZnJlc2hQbGF5bGlzdCgpOwogICAgIH0KIAotICAgIC8vIGJ1ZmZlciBhdCBsZWFzdCAzIHRpbWVzIHRoZSB0YXJnZXQgZHVyYXRpb24sIG9yIHVwIHRvIDEwIHNlY29uZHMKLSAgICBpbnQ2NF90IGR1cmF0aW9uVG9CdWZmZXJVcyA9IHRhcmdldER1cmF0aW9uVXMgKiAzOwotICAgIGlmIChkdXJhdGlvblRvQnVmZmVyVXMgPiBrTWluQnVmZmVyZWREdXJhdGlvblVzKSAgewotICAgICAgICBkdXJhdGlvblRvQnVmZmVyVXMgPSBrTWluQnVmZmVyZWREdXJhdGlvblVzOworICAgIGludDY0X3QgdGFyZ2V0RHVyYXRpb25VcyA9IGtNaW5CdWZmZXJlZER1cmF0aW9uVXM7CisgICAgaWYgKG1QbGF5bGlzdCAhPSBOVUxMKSB7CisgICAgICAgIHRhcmdldER1cmF0aW9uVXMgPSBtUGxheWxpc3QtPmdldFRhcmdldER1cmF0aW9uKCk7CiAgICAgfQogCiAgICAgaW50NjRfdCBidWZmZXJlZER1cmF0aW9uVXMgPSAwbGw7Ci0gICAgc3RhdHVzX3QgZmluYWxSZXN1bHQgPSBOT1RfRU5PVUdIX0RBVEE7CisgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQgPSBPSzsKICAgICBpZiAobVN0cmVhbVR5cGVNYXNrID09IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUykgewogICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBwYWNrZXRTb3VyY2UgPQogICAgICAgICAgICAgbVBhY2tldFNvdXJjZXMudmFsdWVGb3IoTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfU1VCVElUTEVTKTsKIAogICAgICAgICBidWZmZXJlZER1cmF0aW9uVXMgPQogICAgICAgICAgICAgICAgIHBhY2tldFNvdXJjZS0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZmaW5hbFJlc3VsdCk7Ci0gICAgICAgIGZpbmFsUmVzdWx0ID0gT0s7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVXNlIG1heCBzdHJlYW0gZHVyYXRpb24gdG8gcHJldmVudCB1cyBmcm9tIHdhaXRpbmcgb24gYSBub24tZXhpc3RlbnQgc3RyZWFtOwotICAgICAgICAvLyB3aGVuIHdlIGNhbm5vdCBtYWtlIG91dCBmcm9tIHRoZSBtYW5pZmVzdCB3aGF0IHN0cmVhbXMgYXJlIGluY2x1ZGVkIGluIGEgcGxheWxpc3QKLSAgICAgICAgLy8gd2UgbWlnaHQgYXNzdW1lIGV4dHJhIHN0cmVhbXMuCisgICAgICAgIC8vIFVzZSBtaW4gc3RyZWFtIGR1cmF0aW9uLCBidXQgaWdub3JlIHN0cmVhbXMgdGhhdCBuZXZlciBoYXZlIGFueSBwYWNrZXQKKyAgICAgICAgLy8gZW5xdWV1ZWQgdG8gcHJldmVudCB1cyBmcm9tIHdhaXRpbmcgb24gYSBub24tZXhpc3RlbnQgc3RyZWFtOworICAgICAgICAvLyB3aGVuIHdlIGNhbm5vdCBtYWtlIG91dCBmcm9tIHRoZSBtYW5pZmVzdCB3aGF0IHN0cmVhbXMgYXJlIGluY2x1ZGVkIGluCisgICAgICAgIC8vIGEgcGxheWxpc3Qgd2UgbWlnaHQgYXNzdW1lIGV4dHJhIHN0cmVhbXMuCisgICAgICAgIGJ1ZmZlcmVkRHVyYXRpb25VcyA9IC0xbGw7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhY2tldFNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGlmICgobVN0cmVhbVR5cGVNYXNrICYgbVBhY2tldFNvdXJjZXMua2V5QXQoaSkpID09IDApIHsKKyAgICAgICAgICAgIGlmICgobVN0cmVhbVR5cGVNYXNrICYgbVBhY2tldFNvdXJjZXMua2V5QXQoaSkpID09IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgbVBhY2tldFNvdXJjZXNbaV0tPmdldExhdGVzdEVucXVldWVkTWV0YSgpID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50NjRfdCBidWZmZXJlZFN0cmVhbUR1cmF0aW9uVXMgPQogICAgICAgICAgICAgICAgIG1QYWNrZXRTb3VyY2VzLnZhbHVlQXQoaSktPmdldEJ1ZmZlcmVkRHVyYXRpb25VcygmZmluYWxSZXN1bHQpOwotICAgICAgICAgICAgQUxPR1YoImJ1ZmZlcmVkICUiIFBSSWQ2NCAiIGZvciBzdHJlYW0gJWQiLAotICAgICAgICAgICAgICAgICAgICBidWZmZXJlZFN0cmVhbUR1cmF0aW9uVXMsIG1QYWNrZXRTb3VyY2VzLmtleUF0KGkpKTsKLSAgICAgICAgICAgIGlmIChidWZmZXJlZFN0cmVhbUR1cmF0aW9uVXMgPiBidWZmZXJlZER1cmF0aW9uVXMpIHsKKworICAgICAgICAgICAgRlNMT0dWKG1QYWNrZXRTb3VyY2VzLmtleUF0KGkpLCAiYnVmZmVyZWQgJWxsZCIsIChsb25nIGxvbmcpYnVmZmVyZWRTdHJlYW1EdXJhdGlvblVzKTsKKworICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA9PSAtMWxsCisgICAgICAgICAgICAgICAgIHx8IGJ1ZmZlcmVkU3RyZWFtRHVyYXRpb25VcyA8IGJ1ZmZlcmVkRHVyYXRpb25VcykgewogICAgICAgICAgICAgICAgIGJ1ZmZlcmVkRHVyYXRpb25VcyA9IGJ1ZmZlcmVkU3RyZWFtRHVyYXRpb25VczsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0KLSAgICBkb3dubG9hZE1vcmUgPSAoYnVmZmVyZWREdXJhdGlvblVzIDwgZHVyYXRpb25Ub0J1ZmZlclVzKTsKLQotICAgIC8vIHNpZ25hbCBzdGFydCBpZiBidWZmZXJlZCB1cCBhdCBsZWFzdCB0aGUgdGFyZ2V0IHNpemUKLSAgICBpZiAoIW1QcmVwYXJlZCAmJiBidWZmZXJlZER1cmF0aW9uVXMgPiB0YXJnZXREdXJhdGlvblVzICYmIGRvd25sb2FkTW9yZSkgewotICAgICAgICBtUHJlcGFyZWQgPSB0cnVlOwotCi0gICAgICAgIEFMT0dWKCJwcmVwYXJlZCwgYnVmZmVyZWQ9JSIgUFJJZDY0ICIgPiAlIiBQUklkNjQgIiIsCi0gICAgICAgICAgICAgICAgYnVmZmVyZWREdXJhdGlvblVzLCB0YXJnZXREdXJhdGlvblVzKTsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXRUZW1wb3JhcmlseURvbmVGZXRjaGluZyk7Ci0gICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzID09IC0xbGwpIHsKKyAgICAgICAgICAgIGJ1ZmZlcmVkRHVyYXRpb25VcyA9IDBsbDsKKyAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChmaW5hbFJlc3VsdCA9PSBPSyAmJiBkb3dubG9hZE1vcmUpIHsKLSAgICAgICAgQUxPR1YoIm1vbml0b3JpbmcsIGJ1ZmZlcmVkPSUiIFBSSWQ2NCAiIDwgJSIgUFJJZDY0ICIiLAotICAgICAgICAgICAgICAgIGJ1ZmZlcmVkRHVyYXRpb25VcywgZHVyYXRpb25Ub0J1ZmZlclVzKTsKKyAgICBpZiAoZmluYWxSZXN1bHQgPT0gT0sgJiYgYnVmZmVyZWREdXJhdGlvblVzIDwga01pbkJ1ZmZlcmVkRHVyYXRpb25VcykgeworICAgICAgICBGTE9HVigibW9uaXRvcmluZywgYnVmZmVyZWQ9JWxsZCA8ICVsbGQiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpYnVmZmVyZWREdXJhdGlvblVzLCAobG9uZyBsb25nKWtNaW5CdWZmZXJlZER1cmF0aW9uVXMpOworCiAgICAgICAgIC8vIGRlbGF5IHRoZSBuZXh0IGRvd25sb2FkIHNsaWdodGx5OyBob3BlZnVsbHkgdGhpcyBnaXZlcyBvdGhlciBjb25jdXJyZW50IGZldGNoZXJzCiAgICAgICAgIC8vIGEgYmV0dGVyIGNoYW5jZSB0byBydW4uCiAgICAgICAgIC8vIG9uRG93bmxvYWROZXh0KCk7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREb3dubG9hZE5leHQsIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RG93bmxvYWROZXh0LCB0aGlzKTsKICAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Nb25pdG9yUXVldWVHZW5lcmF0aW9uKTsKICAgICAgICAgbXNnLT5wb3N0KDEwMDBsKTsKICAgICB9IGVsc2UgewotICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIHlldCwgdHJ5IGFnYWluIGluIGEgc2Vjb25kLgorICAgICAgICAvLyBXZSdkIGxpa2UgdG8gbWFpbnRhaW4gYnVmZmVyaW5nIGFib3ZlIGR1cmF0aW9uVG9CdWZmZXJVcywgc28gdHJ5CisgICAgICAgIC8vIGFnYWluIHdoZW4gYnVmZmVyIGp1c3QgYWJvdXQgdG8gZ28gYmVsb3cgZHVyYXRpb25Ub0J1ZmZlclVzCisgICAgICAgIC8vIChvciBhZnRlciB0YXJnZXREdXJhdGlvblVzIC8gMiwgd2hpY2hldmVyIGlzIHNtYWxsZXIpLgorICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSBidWZmZXJlZER1cmF0aW9uVXMgLSBrTWluQnVmZmVyZWREdXJhdGlvblVzICsgMTAwMDAwMGxsOworICAgICAgICBpZiAoZGVsYXlVcyA+IHRhcmdldER1cmF0aW9uVXMgLyAyKSB7CisgICAgICAgICAgICBkZWxheVVzID0gdGFyZ2V0RHVyYXRpb25VcyAvIDI7CisgICAgICAgIH0KIAotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFRlbXBvcmFyaWx5RG9uZUZldGNoaW5nKTsKLSAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgIEZMT0dWKCJwYXVzaW5nIGZvciAlbGxkLCBidWZmZXJlZD0lbGxkID4gJWxsZCIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkZWxheVVzLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpYnVmZmVyZWREdXJhdGlvblVzLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpa01pbkJ1ZmZlcmVkRHVyYXRpb25Vcyk7CiAKLSAgICAgICAgaW50NjRfdCBkZWxheVVzID0gbVByZXBhcmVkID8ga01heE1vbml0b3JEZWxheVVzIDogdGFyZ2V0RHVyYXRpb25VcyAvIDI7Ci0gICAgICAgIEFMT0dWKCJwYXVzaW5nIGZvciAlIiBQUklkNjQgIiwgYnVmZmVyZWQ9JSIgUFJJZDY0ICIgPiAlIiBQUklkNjQgIiIsCi0gICAgICAgICAgICAgICAgZGVsYXlVcywgYnVmZmVyZWREdXJhdGlvblVzLCBkdXJhdGlvblRvQnVmZmVyVXMpOwotICAgICAgICAvLyA6VFJJQ0tZOiBuZWVkIHRvIGVuZm9yY2UgbWluaW11bSBkZWxheSBiZWNhdXNlIHRoZSBkZWxheSB0bwotICAgICAgICAvLyByZWZyZXNoIHRoZSBwbGF5bGlzdCB3aWxsIGJlY29tZSAwCi0gICAgICAgIHBvc3RNb25pdG9yUXVldWUoZGVsYXlVcywgbVByZXBhcmVkID8gdGFyZ2V0RHVyYXRpb25VcyAqIDIgOiAwKTsKKyAgICAgICAgcG9zdE1vbml0b3JRdWV1ZShkZWxheVVzKTsKICAgICB9CiB9CiAKIHN0YXR1c190IFBsYXlsaXN0RmV0Y2hlcjo6cmVmcmVzaFBsYXlsaXN0KCkgewogICAgIGlmIChkZWxheVVzVG9SZWZyZXNoUGxheWxpc3QoKSA8PSAwKSB7CiAgICAgICAgIGJvb2wgdW5jaGFuZ2VkOwotICAgICAgICBzcDxNM1VQYXJzZXI+IHBsYXlsaXN0ID0gbVNlc3Npb24tPmZldGNoUGxheWxpc3QoCisgICAgICAgIHNwPE0zVVBhcnNlcj4gcGxheWxpc3QgPSBtSFRUUERvd25sb2FkZXItPmZldGNoUGxheWxpc3QoCiAgICAgICAgICAgICAgICAgbVVSSS5jX3N0cigpLCBtUGxheWxpc3RIYXNoLCAmdW5jaGFuZ2VkKTsKIAogICAgICAgICBpZiAocGxheWxpc3QgPT0gTlVMTCkgewpAQCAtNzE1LDYgKzg3MiwxNCBAQAogICAgICAgICAgICAgaWYgKG1QbGF5bGlzdC0+aXNDb21wbGV0ZSgpIHx8IG1QbGF5bGlzdC0+aXNFdmVudCgpKSB7CiAgICAgICAgICAgICAgICAgdXBkYXRlRHVyYXRpb24oKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE5vdGlmeSBMaXZlU2Vzc2lvbiB0byB1c2UgdGFyZ2V0LWR1cmF0aW9uIGJhc2VkIGJ1ZmZlcmluZyBsZXZlbAorICAgICAgICAgICAgLy8gZm9yIHVwL2Rvd24gc3dpdGNoLiBEZWZhdWx0IExpdmVTZXNzaW9uOjprVXBTd2l0Y2hNYXJrIG1heSBub3QKKyAgICAgICAgICAgIC8vIGJlIHJlYWNoYWJsZSBmb3IgbGl2ZSBzdHJlYW1zLCBhcyBvdXIgbWF4IGJ1ZmZlcmluZyBhbW91bnQgaXMKKyAgICAgICAgICAgIC8vIGxpbWl0ZWQgdG8gMyBzZWdtZW50cy4KKyAgICAgICAgICAgIGlmICghbVBsYXlsaXN0LT5pc0NvbXBsZXRlKCkpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVUYXJnZXREdXJhdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVBsYXlsaXN0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKICAgICAgICAgfQogCiAgICAgICAgIG1MYXN0UGxheWxpc3RGZXRjaFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CkBAIC03MjcsMjUgKzg5Miw4MyBAQAogICAgIHJldHVybiBidWZmZXItPnNpemUoKSA+IDAgJiYgYnVmZmVyLT5kYXRhKClbMF0gPT0gMHg0NzsKIH0KIAotdm9pZCBQbGF5bGlzdEZldGNoZXI6Om9uRG93bmxvYWROZXh0KCkgeworYm9vbCBQbGF5bGlzdEZldGNoZXI6OnNob3VsZFBhdXNlRG93bmxvYWQoKSB7CisgICAgaWYgKG1TdHJlYW1UeXBlTWFzayA9PSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9TVUJUSVRMRVMpIHsKKyAgICAgICAgLy8gZG9lc24ndCBhcHBseSB0byBzdWJ0aXRsZXMKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIENhbGN1bGF0ZSB0aHJlc2hvbGQgdG8gYWJvcnQgY3VycmVudCBkb3dubG9hZAorICAgIGZsb2F0IHRocmVzaG9sZFJhdGlvID0gZ2V0U3RvcHBpbmdUaHJlc2hvbGQoKTsKKworICAgIGlmICh0aHJlc2hvbGRSYXRpbyA8IDAuMGYpIHsKKyAgICAgICAgLy8gbmV2ZXIgYWJvcnQKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAodGhyZXNob2xkUmF0aW8gPT0gMC4wZikgeworICAgICAgICAvLyBpbW1lZGlhdGVseSBhYm9ydAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBub3cgd2UgaGF2ZSBhIHBvc2l0aXZlIHRocmVzaG9sZFVzLCBhYm9ydCBpZiByZW1haW5pbmcKKyAgICAvLyBwb3J0aW9uIHRvIGRvd25sb2FkIGlzIG92ZXIgdGhhdCB0aHJlc2hvbGQuCisgICAgaWYgKG1TZWdtZW50Rmlyc3RQVFMgPCAwKSB7CisgICAgICAgIC8vIHRoaXMgbWVhbnMgd2UgaGF2ZW4ndCBldmVuIGZpbmQgdGhlIGZpcnN0IGFjY2VzcyB1bml0LAorICAgICAgICAvLyBhYm9ydCBub3cgYXMgd2UgbXVzdCBiZSB2ZXJ5IGZhciBhd2F5IGZyb20gdGhlIGVuZC4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGludDY0X3QgbGFzdEVucXVldWVVcyA9IG1TZWdtZW50Rmlyc3RQVFM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGFja2V0U291cmNlcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoKG1TdHJlYW1UeXBlTWFzayAmIG1QYWNrZXRTb3VyY2VzLmtleUF0KGkpKSA9PSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzcDxBTWVzc2FnZT4gbWV0YSA9IG1QYWNrZXRTb3VyY2VzW2ldLT5nZXRMYXRlc3RFbnF1ZXVlZE1ldGEoKTsKKyAgICAgICAgaW50MzJfdCB0eXBlOworICAgICAgICBpZiAobWV0YSA9PSBOVUxMIHx8IG1ldGEtPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZ0eXBlKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaW50NjRfdCB0bXBVczsKKyAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdG1wVXMpKTsKKyAgICAgICAgaWYgKHRtcFVzID4gbGFzdEVucXVldWVVcykgeworICAgICAgICAgICAgbGFzdEVucXVldWVVcyA9IHRtcFVzOworICAgICAgICB9CisgICAgfQorICAgIGxhc3RFbnF1ZXVlVXMgLT0gbVNlZ21lbnRGaXJzdFBUUzsKKworICAgIGludDY0X3QgdGFyZ2V0RHVyYXRpb25VcyA9IG1QbGF5bGlzdC0+Z2V0VGFyZ2V0RHVyYXRpb24oKTsKKyAgICBpbnQ2NF90IHRocmVzaG9sZFVzID0gdGhyZXNob2xkUmF0aW8gKiB0YXJnZXREdXJhdGlvblVzOworCisgICAgRkxPR1YoIiVzcGF1c2luZyBub3csIHRocmVzaG9sZFVzICVsbGQsIHJlbWFpbmluZyAlbGxkIiwKKyAgICAgICAgICAgIHRhcmdldER1cmF0aW9uVXMgLSBsYXN0RW5xdWV1ZVVzID4gdGhyZXNob2xkVXMgPyAiIiA6ICJub3QgIiwKKyAgICAgICAgICAgIChsb25nIGxvbmcpdGhyZXNob2xkVXMsCisgICAgICAgICAgICAobG9uZyBsb25nKSh0YXJnZXREdXJhdGlvblVzIC0gbGFzdEVucXVldWVVcykpOworCisgICAgaWYgKHRhcmdldER1cmF0aW9uVXMgLSBsYXN0RW5xdWV1ZVVzID4gdGhyZXNob2xkVXMpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBQbGF5bGlzdEZldGNoZXI6OmluaXREb3dubG9hZFN0YXRlKAorICAgICAgICBBU3RyaW5nICZ1cmksCisgICAgICAgIHNwPEFNZXNzYWdlPiAmaXRlbU1ldGEsCisgICAgICAgIGludDMyX3QgJmZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKKyAgICAgICAgaW50MzJfdCAmbGFzdFNlcU51bWJlckluUGxheWxpc3QpIHsKICAgICBzdGF0dXNfdCBlcnIgPSByZWZyZXNoUGxheWxpc3QoKTsKLSAgICBpbnQzMl90IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IDA7Ci0gICAgaW50MzJfdCBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IDA7CisgICAgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ID0gMDsKKyAgICBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IDA7CiAgICAgYm9vbCBkaXNjb250aW51aXR5ID0gZmFsc2U7CiAKICAgICBpZiAobVBsYXlsaXN0ICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKG1QbGF5bGlzdC0+bWV0YSgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1QbGF5bGlzdC0+bWV0YSgpLT5maW5kSW50MzIoIm1lZGlhLXNlcXVlbmNlIiwgJmZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCA9Ci0gICAgICAgICAgICAgICAgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgKGludDMyX3QpbVBsYXlsaXN0LT5zaXplKCkgLSAxOworICAgICAgICBtUGxheWxpc3QtPmdldFNlcU51bWJlclJhbmdlKAorICAgICAgICAgICAgICAgICZmaXJzdFNlcU51bWJlckluUGxheWxpc3QsICZsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCk7CiAKICAgICAgICAgaWYgKG1EaXNjb250aW51aXR5U2VxIDwgMCkgewogICAgICAgICAgICAgbURpc2NvbnRpbnVpdHlTZXEgPSBtUGxheWxpc3QtPmdldERpc2NvbnRpbnVpdHlTZXEoKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIG1TZWdtZW50Rmlyc3RQVFMgPSAtMWxsOworCiAgICAgaWYgKG1QbGF5bGlzdCAhPSBOVUxMICYmIG1TZXFOdW1iZXIgPCAwKSB7CiAgICAgICAgIENIRUNLX0dFKG1TdGFydFRpbWVVcywgMGxsKTsKIApAQCAtNzY0LDE4ICs5ODcsMjYgQEAKICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXMgLT0gZ2V0U2VnbWVudFN0YXJ0VGltZVVzKG1TZXFOdW1iZXIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVN0YXJ0VGltZVVzUmVsYXRpdmUgPSB0cnVlOwotICAgICAgICAgICAgQUxPR1YoIkluaXRpYWwgc2VxdWVuY2UgbnVtYmVyIGZvciB0aW1lICUiIFBSSWQ2NCAiIGlzICVkIGZyb20gKCVkIC4uICVkKSIsCi0gICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVcywgbVNlcU51bWJlciwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LAorICAgICAgICAgICAgRkxPR1YoIkluaXRpYWwgc2VxdWVuY2UgbnVtYmVyIGZvciB0aW1lICVsbGQgaXMgJWQgZnJvbSAoJWQgLi4gJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltU3RhcnRUaW1lVXMsIG1TZXFOdW1iZXIsIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKICAgICAgICAgICAgICAgICAgICAgbGFzdFNlcU51bWJlckluUGxheWxpc3QpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gV2hlbiBhZGFwdGluZyBvciB0cmFjayBzd2l0Y2hpbmcsIG1TZWdtZW50U3RhcnRUaW1lVXMgKHJlbGF0aXZlCiAgICAgICAgICAgICAvLyB0byBtZWRpYSB0aW1lIDApIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBzdGFydCBzZWdtZW50OyBtU3RhcnRUaW1lVXMgKGFic29sdXRlCiAgICAgICAgICAgICAvLyB0aW1lc3RhbXBzIGNvbWluZyBmcm9tIHRoZSBtZWRpYSBjb250YWluZXIpIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBwb3NpdGlvbgogICAgICAgICAgICAgLy8gaW5zaWRlIGEgc2VnbWVudHMuCi0gICAgICAgICAgICBtU2VxTnVtYmVyID0gZ2V0U2VxTnVtYmVyRm9yVGltZShtU2VnbWVudFN0YXJ0VGltZVVzKTsKLSAgICAgICAgICAgIGlmIChtQWRhcHRpdmUpIHsKKyAgICAgICAgICAgIGlmIChtU3RyZWFtVHlwZU1hc2sgIT0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfU1VCVElUTEVTCisgICAgICAgICAgICAgICAgICAgICYmIG1TZWVrTW9kZSAhPSBMaXZlU2Vzc2lvbjo6a1NlZWtNb2RlTmV4dFNhbXBsZSkgewogICAgICAgICAgICAgICAgIC8vIGF2b2lkIGRvdWJsZSBmZXRjaC9kZWNvZGUKLSAgICAgICAgICAgICAgICBtU2VxTnVtYmVyICs9IDE7CisgICAgICAgICAgICAgICAgLy8gVXNlIChtU2VnbWVudFN0YXJ0VGltZVVzICsgMS8yICogdGFyZ2V0RHVyYXRpb25VcykgdG8gc2VhcmNoCisgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBzdGFydGluZyBzZWdtZW50IGluIG5ldyB2YXJpYW50LgorICAgICAgICAgICAgICAgIC8vIElmIHRoZSB0d28gdmFyaWFudHMnIHNlZ21lbnRzIGFyZSBhbGlnbmVkLCB0aGlzIGdpdmVzIHRoZQorICAgICAgICAgICAgICAgIC8vIG5leHQgc2VnbWVudC4gSWYgdGhleSdyZSBub3QgYWxpZ25lZCwgdGhpcyBnaXZlcyB0aGUgc2VnbWVudAorICAgICAgICAgICAgICAgIC8vIHRoYXQgb3ZlcmxhcHMgbm8gbW9yZSB0aGFuIDEvMiAqIHRhcmdldER1cmF0aW9uVXMuCisgICAgICAgICAgICAgICAgbVNlcU51bWJlciA9IGdldFNlcU51bWJlckZvclRpbWUobVNlZ21lbnRTdGFydFRpbWVVcworICAgICAgICAgICAgICAgICAgICAgICAgKyBtUGxheWxpc3QtPmdldFRhcmdldER1cmF0aW9uKCkgLyAyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVNlcU51bWJlciA9IGdldFNlcU51bWJlckZvclRpbWUobVNlZ21lbnRTdGFydFRpbWVVcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzc2l6ZV90IG1pblNlcSA9IGdldFNlcU51bWJlckZvckRpc2NvbnRpbnVpdHkobURpc2NvbnRpbnVpdHlTZXEpOwogICAgICAgICAgICAgaWYgKG1TZXFOdW1iZXIgPCBtaW5TZXEpIHsKQEAgLTc4OSw3ICsxMDIwLDcgQEAKICAgICAgICAgICAgIGlmIChtU2VxTnVtYmVyID4gbGFzdFNlcU51bWJlckluUGxheWxpc3QpIHsKICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyID0gbGFzdFNlcU51bWJlckluUGxheWxpc3Q7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiSW5pdGlhbCBzZXF1ZW5jZSBudW1iZXIgZm9yIGxpdmUgZXZlbnQgJWQgZnJvbSAoJWQgLi4gJWQpIiwKKyAgICAgICAgICAgIEZMT0dWKCJJbml0aWFsIHNlcXVlbmNlIG51bWJlciBpcyAlZCBmcm9tICglZCAuLiAlZCkiLAogICAgICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCiAgICAgICAgICAgICAgICAgICAgIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KTsKICAgICAgICAgfQpAQCAtODA5LDI2ICsxMDQwLDI0IEBACiAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaCBpbiBpbmNyZWFzaW5nIGZyYWN0aW9uICgxLzIsIDEvMywgLi4uKSBvZiB0aGUKICAgICAgICAgICAgICAgICAvLyBwbGF5bGlzdCdzIHRhcmdldCBkdXJhdGlvbiBvciAzIHNlY29uZHMsIHdoaWNoZXZlciBpcyBsZXNzCiAgICAgICAgICAgICAgICAgaW50NjRfdCBkZWxheVVzID0ga01heE1vbml0b3JEZWxheVVzOwotICAgICAgICAgICAgICAgIGlmIChtUGxheWxpc3QgIT0gTlVMTCAmJiBtUGxheWxpc3QtPm1ldGEoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGFyZ2V0RHVyYXRpb25TZWNzOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKCJ0YXJnZXQtZHVyYXRpb24iLCAmdGFyZ2V0RHVyYXRpb25TZWNzKSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGF5VXMgPSBtUGxheWxpc3QtPnNpemUoKSAqIHRhcmdldER1cmF0aW9uU2VjcyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMGxsIC8gKDEgKyBtTnVtUmV0cmllcyk7CisgICAgICAgICAgICAgICAgaWYgKG1QbGF5bGlzdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGF5VXMgPSBtUGxheWxpc3QtPnNpemUoKSAqIG1QbGF5bGlzdC0+Z2V0VGFyZ2V0RHVyYXRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKDEgKyBtTnVtUmV0cmllcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChkZWxheVVzID4ga01heE1vbml0b3JEZWxheVVzKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlbGF5VXMgPSBrTWF4TW9uaXRvckRlbGF5VXM7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWKCJzZXF1ZW5jZSBudW1iZXIgaGlnaDogJWQgZnJvbSAoJWQgLi4gJWQpLCAiCi0gICAgICAgICAgICAgICAgICAgICAgIm1vbml0b3IgaW4gJSIgUFJJZDY0ICIgKHJldHJ5PSVkKSIsCisgICAgICAgICAgICAgICAgRkxPR1YoInNlcXVlbmNlIG51bWJlciBoaWdoOiAlZCBmcm9tICglZCAuLiAlZCksICIKKyAgICAgICAgICAgICAgICAgICAgICAibW9uaXRvciBpbiAlbGxkIChyZXRyeT0lZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgbVNlcU51bWJlciwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlcU51bWJlckluUGxheWxpc3QsIGRlbGF5VXMsIG1OdW1SZXRyaWVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0LCAobG9uZyBsb25nKWRlbGF5VXMsIG1OdW1SZXRyaWVzKTsKICAgICAgICAgICAgICAgICBwb3N0TW9uaXRvclF1ZXVlKGRlbGF5VXMpOwotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICBub3RpZnlFcnJvcihlcnIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIHdlJ3ZlIG1pc3NlZCB0aGUgYm9hdCwgbGV0J3Mgc3RhcnQgMyBzZWdtZW50cyBwcmlvciB0byB0aGUgbGF0ZXN0IHNlcXVlbmNlCkBAIC04NDMsMTIgKzEwNzIsOCBAQAogICAgICAgICAgICAgICAgIC8vIGJ1dCBzaW5jZSB0aGUgc2VnbWVudHMgd2UgYXJlIHN1cHBvc2VkIHRvIGZldGNoIGhhdmUgYWxyZWFkeSByb2xsZWQgb2ZmCiAgICAgICAgICAgICAgICAgLy8gdGhlIHBsYXlsaXN0LCBpLmUuIHdlIGhhdmUgYWxyZWFkeSBtaXNzZWQgdGhlIGJvYXQsIHdlIGluZXZpdGFibHkgaGF2ZSB0bwogICAgICAgICAgICAgICAgIC8vIHNraXAuCi0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGFja2V0U291cmNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBmb3JtYXRDaGFuZ2UgPSBtU2Vzc2lvbi0+Y3JlYXRlRm9ybWF0Q2hhbmdlQnVmZmVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1QYWNrZXRTb3VyY2VzLnZhbHVlQXQoaSktPnF1ZXVlQWNjZXNzVW5pdChmb3JtYXRDaGFuZ2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdG9wQXN5bmMoLyogY2xlYXIgPSAqLyBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIG5vdGlmeVN0b3BSZWFjaGVkKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVNlcU51bWJlciA9IGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0IC0gMzsKICAgICAgICAgICAgIGlmIChtU2VxTnVtYmVyIDwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0KSB7CkBAIC04NTgsMjkgKzEwODMsMTU2IEBACiAKICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBmaW5kIHNlcXVlbmNlIG51bWJlciAlZCBpbiBwbGF5bGlzdCAiCi0gICAgICAgICAgICAgICAgICIoY29udGFpbnMgJWQgLSAlZCkiLAotICAgICAgICAgICAgICAgICBtU2VxTnVtYmVyLCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCi0gICAgICAgICAgICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgKyAoaW50MzJfdCltUGxheWxpc3QtPnNpemUoKSAtIDEpOworICAgICAgICAgICAgaWYgKG1QbGF5bGlzdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBmaW5kIHNlcXVlbmNlIG51bWJlciAlZCBpbiBwbGF5bGlzdCAiCisgICAgICAgICAgICAgICAgICAgICAiKGNvbnRhaW5zICVkIC0gJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIsIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgKyAoaW50MzJfdCltUGxheWxpc3QtPnNpemUoKSAtIDEpOwogCi0gICAgICAgICAgICBub3RpZnlFcnJvcihFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICBpZiAobVRTUGFyc2VyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRTUGFyc2VyLT5zaWduYWxFT1MoRVJST1JfRU5EX09GX1NUUkVBTSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBhbiBlbXB0eSBidWZmZXI7IHdlIGRvbid0IGhhdmUgYW55IG5ldyBkYXRhLCBqdXN0IHdhbnQgdG8gZXh0cmFjdAorICAgICAgICAgICAgICAgICAgICAvLyBwb3RlbnRpYWwgbmV3IGFjY2VzcyB1bml0cyBhZnRlciBmbHVzaC4gIFJlc2V0IG1TZXFOdW1iZXIgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gbGFzdFNlcU51bWJlckluUGxheWxpc3Qgc3VjaCB0aGF0IHdlIHNldCB0aGUgY29ycmVjdCBhY2Nlc3MgdW5pdAorICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0aWVzIGluIGV4dHJhY3RBbmRRdWV1ZUFjY2Vzc1VuaXRzRnJvbVRzLgorICAgICAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcigwKTsKKyAgICAgICAgICAgICAgICAgICAgbVNlcU51bWJlciA9IGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0OworICAgICAgICAgICAgICAgICAgICBleHRyYWN0QW5kUXVldWVBY2Nlc3NVbml0c0Zyb21UcyhidWZmZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub3RpZnlFcnJvcihFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHdlIHdlcmUgbmV2ZXIgYWJsZSB0byBkb3dubG9hZCB0aGUgcGxheWxpc3QuCisgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHdlIHNob3VsZCBub3RpZnkgZXJyb3IsIGluc3RlYWQgb2YgRU9TLCBhcyBFT1MgZHVyaW5nCisgICAgICAgICAgICAgICAgLy8gcHJlcGFyZSBtZWFucyB3ZSBzdWNjZWVkZWQgaW4gZG93bmxvYWRpbmcgZXZlcnl0aGluZy4KKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRvd25sb2FkIHBsYXlsaXN0ISIpOworICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yKEVSUk9SX0lPKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCiAgICAgbU51bVJldHJpZXMgPSAwOwogCi0gICAgQVN0cmluZyB1cmk7Ci0gICAgc3A8QU1lc3NhZ2U+IGl0ZW1NZXRhOwogICAgIENIRUNLKG1QbGF5bGlzdC0+aXRlbUF0KAogICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgLSBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsCiAgICAgICAgICAgICAgICAgJnVyaSwKICAgICAgICAgICAgICAgICAmaXRlbU1ldGEpKTsKIAorICAgIENIRUNLKGl0ZW1NZXRhLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHktc2VxdWVuY2UiLCAmbURpc2NvbnRpbnVpdHlTZXEpKTsKKwogICAgIGludDMyX3QgdmFsOwogICAgIGlmIChpdGVtTWV0YS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJnZhbCkgJiYgdmFsICE9IDApIHsKLSAgICAgICAgbURpc2NvbnRpbnVpdHlTZXErKzsKICAgICAgICAgZGlzY29udGludWl0eSA9IHRydWU7CisgICAgfSBlbHNlIGlmIChtTGFzdERpc2NvbnRpbnVpdHlTZXEgPj0gMAorICAgICAgICAgICAgJiYgbURpc2NvbnRpbnVpdHlTZXEgIT0gbUxhc3REaXNjb250aW51aXR5U2VxKSB7CisgICAgICAgIC8vIFNlZWsganVtcGVkIHRvIGEgbmV3IGRpc2NvbnRpbnVpdHkgc2VxdWVuY2UuIFdlIG5lZWQgdG8gc2lnbmFsCisgICAgICAgIC8vIGEgZm9ybWF0IGNoYW5nZSB0byBkZWNvZGVyLiBEZWNvZGVyIG5lZWRzIHRvIHNodXRkb3duIGFuZCBiZQorICAgICAgICAvLyBjcmVhdGVkIGFnYWluIGlmIHNlYW1sZXNzIGZvcm1hdCBjaGFuZ2UgaXMgdW5zdXBwb3J0ZWQuCisgICAgICAgIEZMT0dWKCJzYXcgZGlzY29udGludWl0eTogbVN0YXJ0dXAgJWQsIG1MYXN0RGlzY29udGludWl0eVNlcSAlZCwgIgorICAgICAgICAgICAgICAgICJtRGlzY29udGludWl0eVNlcSAlZCwgbVN0YXJ0VGltZVVzICVsbGQiLAorICAgICAgICAgICAgICAgIG1TdGFydHVwLCBtTGFzdERpc2NvbnRpbnVpdHlTZXEsIG1EaXNjb250aW51aXR5U2VxLCAobG9uZyBsb25nKW1TdGFydFRpbWVVcyk7CisgICAgICAgIGRpc2NvbnRpbnVpdHkgPSB0cnVlOworICAgIH0KKyAgICBtTGFzdERpc2NvbnRpbnVpdHlTZXEgPSAtMTsKKworICAgIC8vIGRlY3J5cHQgYSBqdW5rIGJ1ZmZlciB0byBwcmVmZXRjaCBrZXk7IHNpbmNlIGEgc2Vzc2lvbiB1c2VzIG9ubHkgb25lIGh0dHAgY29ubmVjdGlvbiwKKyAgICAvLyB0aGlzIGF2b2lkcyBpbnRlcmxlYXZlZCBjb25uZWN0aW9ucyB0byB0aGUga2V5IGFuZCBzZWdtZW50IGZpbGUuCisgICAgeworICAgICAgICBzcDxBQnVmZmVyPiBqdW5rID0gbmV3IEFCdWZmZXIoMTYpOworICAgICAgICBqdW5rLT5zZXRSYW5nZSgwLCAxNik7CisgICAgICAgIHN0YXR1c190IGVyciA9IGRlY3J5cHRCdWZmZXIobVNlcU51bWJlciAtIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwganVuaywKKyAgICAgICAgICAgICAgICB0cnVlIC8qIGZpcnN0ICovKTsKKyAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9OT1RfQ09OTkVDVEVEKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBub3RpZnlFcnJvcihlcnIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChtU3RhcnR1cCAmJiAhbVRpbWVDaGFuZ2VTaWduYWxlZCkgfHwgZGlzY29udGludWl0eSkgeworICAgICAgICAvLyBXZSBuZWVkIHRvIHNpZ25hbCBhIHRpbWUgZGlzY29udGludWl0eSB0byBBVFNQYXJzZXIgb24gdGhlCisgICAgICAgIC8vIGZpcnN0IHNlZ21lbnQgYWZ0ZXIgc3RhcnQsIG9yIG9uIGEgZGlzY29udGludWl0eSBzZWdtZW50LgorICAgICAgICAvLyBTZXR0aW5nIG1OZXh0UFRTVGltZVVzIGluZm9ybXMgZXh0cmFjdEFuZFF1ZXVlQWNjZXNzVW5pdHNYWCgpCisgICAgICAgIC8vIHRvIHNlbmQgdGhlIHRpbWUgZGlzY29udGludWl0eS4KKyAgICAgICAgaWYgKG1QbGF5bGlzdC0+aXNDb21wbGV0ZSgpIHx8IG1QbGF5bGlzdC0+aXNFdmVudCgpKSB7CisgICAgICAgICAgICAvLyBJZiB0aGlzIHdhcyBhIGxpdmUgZXZlbnQgdGhpcyBtYWRlIG5vIHNlbnNlIHNpbmNlCisgICAgICAgICAgICAvLyB3ZSBkb24ndCBoYXZlIGFjY2VzcyB0byBhbGwgdGhlIHNlZ21lbnQgYmVmb3JlIHRoZSBjdXJyZW50CisgICAgICAgICAgICAvLyBvbmUuCisgICAgICAgICAgICBtTmV4dFBUU1RpbWVVcyA9IGdldFNlZ21lbnRTdGFydFRpbWVVcyhtU2VxTnVtYmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldHRpbmcgbVRpbWVDaGFuZ2VTaWduYWxlZCB0byB0cnVlLCBzbyB0aGF0IGlmIHN0YXJ0IHRpbWUKKyAgICAgICAgLy8gc2VhcmNoaW5nIGdvZXMgaW50byAybmQgc2VnbWVudCAod2l0aG91dCBhIGRpc2NvbnRpbnVpdHkpLAorICAgICAgICAvLyB3ZSBkb24ndCByZXNldCB0aW1lIGFnYWluLiBJdCBjYXVzZXMgY29ycnVwdGlvbiB3aGVuIHBlbmRpbmcKKyAgICAgICAgLy8gZGF0YSBpbiBBVFNQYXJzZXIgaXMgY2xlYXJlZC4KKyAgICAgICAgbVRpbWVDaGFuZ2VTaWduYWxlZCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKGRpc2NvbnRpbnVpdHkpIHsKKyAgICAgICAgQUxPR0koInF1ZXVlaW5nIGRpc2NvbnRpbnVpdHkgKGV4cGxpY2l0PSVkKSIsIGRpc2NvbnRpbnVpdHkpOworCisgICAgICAgIC8vIFNpZ25hbCBhIGZvcm1hdCBkaXNjb250aW51aXR5IHRvIEFUU1BhcnNlciB0byBjbGVhciBwYXJ0aWFsIGRhdGEKKyAgICAgICAgLy8gZnJvbSBwcmV2aW91cyBzdHJlYW1zLiBOb3QgZG9pbmcgdGhpcyBjYXVzZXMgYml0c3RyZWFtIGNvcnJ1cHRpb24uCisgICAgICAgIGlmIChtVFNQYXJzZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbVRTUGFyc2VyLT5zaWduYWxEaXNjb250aW51aXR5KAorICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFLCBOVUxMIC8qIGV4dHJhICovKTsKKyAgICAgICAgfQorCisgICAgICAgIHF1ZXVlRGlzY29udGludWl0eSgKKyAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUX09OTFksCisgICAgICAgICAgICAgICAgTlVMTCAvKiBleHRyYSAqLyk7CisKKyAgICAgICAgaWYgKG1TdGFydHVwICYmIG1TdGFydFRpbWVVc1JlbGF0aXZlICYmIG1GaXJzdFBUU1ZhbGlkKSB7CisgICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHdlIGd1ZXNzZWQgbVN0YXJ0VGltZVVzIHRvIGJlIGluIHRoZSBwcmV2aW91cworICAgICAgICAgICAgLy8gc2VnbWVudCAobGlrZWx5IHZlcnkgY2xvc2UgdG8gdGhlIGVuZCksIGJ1dCBlaXRoZXIgdmlkZW8gb3IKKyAgICAgICAgICAgIC8vIGF1ZGlvIGhhcyBub3QgZm91bmQgc3RhcnQgYnkgdGhlIGVuZCBvZiB0aGF0IHNlZ21lbnQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgdGhpcyBuZXcgc2VnbWVudCBpcyBub3QgYSBkaXNjb250aW51aXR5LCBrZWVwIHNlYXJjaGluZy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiB0aGlzIG5ldyBzZWdtZW50IGV2ZW4gZ290IGEgZGlzY29udGludWl0eSBtYXJrZXIsIGp1c3QKKyAgICAgICAgICAgIC8vIHNldCBtU3RhcnRUaW1lVXM9MCwgYW5kIHRha2UgYWxsIHNhbXBsZXMgZnJvbSBub3cgb24uCisgICAgICAgICAgICBtU3RhcnRUaW1lVXMgPSAwOworICAgICAgICAgICAgbUZpcnN0UFRTVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1JRFJGb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgRkxPR1YoImZldGNoaW5nIHNlZ21lbnQgJWQgZnJvbSAoJWQgLi4gJWQpIiwKKyAgICAgICAgICAgIG1TZXFOdW1iZXIsIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwgbGFzdFNlcU51bWJlckluUGxheWxpc3QpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFBsYXlsaXN0RmV0Y2hlcjo6b25Eb3dubG9hZE5leHQoKSB7CisgICAgQVN0cmluZyB1cmk7CisgICAgc3A8QU1lc3NhZ2U+IGl0ZW1NZXRhOworICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICBzcDxBQnVmZmVyPiB0c0J1ZmZlcjsKKyAgICBpbnQzMl90IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IDA7CisgICAgaW50MzJfdCBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IDA7CisgICAgYm9vbCBjb25uZWN0SFRUUCA9IHRydWU7CisKKyAgICBpZiAobURvd25sb2FkU3RhdGUtPmhhc1NhdmVkU3RhdGUoKSkgeworICAgICAgICBtRG93bmxvYWRTdGF0ZS0+cmVzdG9yZVN0YXRlKAorICAgICAgICAgICAgICAgIHVyaSwKKyAgICAgICAgICAgICAgICBpdGVtTWV0YSwKKyAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgdHNCdWZmZXIsCisgICAgICAgICAgICAgICAgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LAorICAgICAgICAgICAgICAgIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KTsKKyAgICAgICAgY29ubmVjdEhUVFAgPSBmYWxzZTsKKyAgICAgICAgRkxPR1YoInJlc3VtaW5nOiAnJXMnIiwgdXJpLmNfc3RyKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghaW5pdERvd25sb2FkU3RhdGUoCisgICAgICAgICAgICAgICAgdXJpLAorICAgICAgICAgICAgICAgIGl0ZW1NZXRhLAorICAgICAgICAgICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKKyAgICAgICAgICAgICAgICBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBGTE9HVigiZmV0Y2hpbmc6ICclcyciLCB1cmkuY19zdHIoKSk7CiAgICAgfQogCiAgICAgaW50NjRfdCByYW5nZV9vZmZzZXQsIHJhbmdlX2xlbmd0aDsKQEAgLTg5MCwzMyArMTI0MiwxOSBAQAogICAgICAgICByYW5nZV9sZW5ndGggPSAtMTsKICAgICB9CiAKLSAgICBBTE9HVigiZmV0Y2hpbmcgc2VnbWVudCAlZCBmcm9tICglZCAuLiAlZCkiLAotICAgICAgICAgIG1TZXFOdW1iZXIsIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwgbGFzdFNlcU51bWJlckluUGxheWxpc3QpOwotCi0gICAgQUxPR1YoImZldGNoaW5nICclcyciLCB1cmkuY19zdHIoKSk7Ci0KLSAgICBzcDxEYXRhU291cmNlPiBzb3VyY2U7Ci0gICAgc3A8QUJ1ZmZlcj4gYnVmZmVyLCB0c0J1ZmZlcjsKLSAgICAvLyBkZWNyeXB0IGEganVuayBidWZmZXIgdG8gcHJlZmV0Y2gga2V5OyBzaW5jZSBhIHNlc3Npb24gdXNlcyBvbmx5IG9uZSBodHRwIGNvbm5lY3Rpb24sCi0gICAgLy8gdGhpcyBhdm9pZHMgaW50ZXJsZWF2ZWQgY29ubmVjdGlvbnMgdG8gdGhlIGtleSBhbmQgc2VnbWVudCBmaWxlLgotICAgIHsKLSAgICAgICAgc3A8QUJ1ZmZlcj4ganVuayA9IG5ldyBBQnVmZmVyKDE2KTsKLSAgICAgICAganVuay0+c2V0UmFuZ2UoMCwgMTYpOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBkZWNyeXB0QnVmZmVyKG1TZXFOdW1iZXIgLSBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsIGp1bmssCi0gICAgICAgICAgICAgICAgdHJ1ZSAvKiBmaXJzdCAqLyk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIG5vdGlmeUVycm9yKGVycik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvLyBibG9jay13aXNlIGRvd25sb2FkCi0gICAgYm9vbCBzdGFydHVwID0gbVN0YXJ0dXA7CisgICAgYm9vbCBzaG91bGRQYXVzZSA9IGZhbHNlOwogICAgIHNzaXplX3QgYnl0ZXNSZWFkOwogICAgIGRvIHsKLSAgICAgICAgYnl0ZXNSZWFkID0gbVNlc3Npb24tPmZldGNoRmlsZSgKLSAgICAgICAgICAgICAgICB1cmkuY19zdHIoKSwgJmJ1ZmZlciwgcmFuZ2Vfb2Zmc2V0LCByYW5nZV9sZW5ndGgsIGtEb3dubG9hZEJsb2NrU2l6ZSwgJnNvdXJjZSk7CisgICAgICAgIGludDY0X3Qgc3RhcnRVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgIGJ5dGVzUmVhZCA9IG1IVFRQRG93bmxvYWRlci0+ZmV0Y2hCbG9jaygKKyAgICAgICAgICAgICAgICB1cmkuY19zdHIoKSwgJmJ1ZmZlciwgcmFuZ2Vfb2Zmc2V0LCByYW5nZV9sZW5ndGgsIGtEb3dubG9hZEJsb2NrU2l6ZSwKKyAgICAgICAgICAgICAgICBOVUxMIC8qIGFjdHVhbFVSTCAqLywgY29ubmVjdEhUVFApOworICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRVczsKIAorICAgICAgICBpZiAoYnl0ZXNSZWFkID09IEVSUk9SX05PVF9DT05ORUNURUQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBpZiAoYnl0ZXNSZWFkIDwgMCkgewogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gYnl0ZXNSZWFkOwogICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBmZXRjaCAudHMgc2VnbWVudCBhdCB1cmwgJyVzJyIsIHVyaS5jX3N0cigpKTsKQEAgLTkyNCw2ICsxMjYyLDIyIEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAorICAgICAgICAvLyBhZGQgc2FtcGxlIGZvciBiYW5kd2lkdGggZXN0aW1hdGlvbiwgZXhjbHVkaW5nIHNhbXBsZXMgZnJvbSBzdWJ0aXRsZXMgKGFzCisgICAgICAgIC8vIGl0cyB0b28gc21hbGwpLCBvciBkdXJpbmcgc3RhcnR1cC9yZXN1bWVVbnRpbCAod2hlbiB3ZSBjb3VsZCBoYXZlIG1vcmUgdGhhbgorICAgICAgICAvLyBvbmUgY29ubmVjdGlvbiBvcGVuIHdoaWNoIGFmZmVjdHMgYmFuZHdpZHRoKQorICAgICAgICBpZiAoIW1TdGFydHVwICYmIG1TdG9wUGFyYW1zID09IE5VTEwgJiYgYnl0ZXNSZWFkID4gMAorICAgICAgICAgICAgICAgICYmIChtU3RyZWFtVHlwZU1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgICYgKExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPCisgICAgICAgICAgICAgICAgICAgICAgICB8IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1ZJREVPKSkpIHsKKyAgICAgICAgICAgIG1TZXNzaW9uLT5hZGRCYW5kd2lkdGhNZWFzdXJlbWVudChieXRlc1JlYWQsIGRlbGF5VXMpOworICAgICAgICAgICAgaWYgKGRlbGF5VXMgPiAyMDAwMDAwbGwpIHsKKyAgICAgICAgICAgICAgICBGTE9HVigiYnl0ZXNSZWFkICV6ZCB0b29rICUuMmYgc2Vjb25kcyAtIGFibm9ybWFsIGJhbmR3aWR0aCBkaXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNSZWFkLCAoZG91YmxlKWRlbGF5VXMgLyAxLjBlNik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb25uZWN0SFRUUCA9IGZhbHNlOworCiAgICAgICAgIENIRUNLKGJ1ZmZlciAhPSBOVUxMKTsKIAogICAgICAgICBzaXplX3Qgc2l6ZSA9IGJ1ZmZlci0+c2l6ZSgpOwpAQCAtOTQxLDI4ICsxMjk1LDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChzdGFydHVwIHx8IGRpc2NvbnRpbnVpdHkpIHsKLSAgICAgICAgICAgIC8vIFNpZ25hbCBkaXNjb250aW51aXR5LgotCi0gICAgICAgICAgICBpZiAobVBsYXlsaXN0LT5pc0NvbXBsZXRlKCkgfHwgbVBsYXlsaXN0LT5pc0V2ZW50KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHdhcyBhIGxpdmUgZXZlbnQgdGhpcyBtYWRlIG5vIHNlbnNlIHNpbmNlCi0gICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gYWxsIHRoZSBzZWdtZW50IGJlZm9yZSB0aGUgY3VycmVudAotICAgICAgICAgICAgICAgIC8vIG9uZS4KLSAgICAgICAgICAgICAgICBtTmV4dFBUU1RpbWVVcyA9IGdldFNlZ21lbnRTdGFydFRpbWVVcyhtU2VxTnVtYmVyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGRpc2NvbnRpbnVpdHkpIHsKLSAgICAgICAgICAgICAgICBBTE9HSSgicXVldWVpbmcgZGlzY29udGludWl0eSAoZXhwbGljaXQ9JWQpIiwgZGlzY29udGludWl0eSk7Ci0KLSAgICAgICAgICAgICAgICBxdWV1ZURpc2NvbnRpbnVpdHkoCi0gICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFLAotICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKiBleHRyYSAqLyk7Ci0KLSAgICAgICAgICAgICAgICBkaXNjb250aW51aXR5ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXJ0dXAgPSBmYWxzZTsKLSAgICAgICAgfQorICAgICAgICBib29sIHN0YXJ0VXAgPSBtU3RhcnR1cDsgLy8gc2F2ZSBjdXJyZW50IHN0YXJ0IHVwIHN0YXRlCiAKICAgICAgICAgZXJyID0gT0s7CiAgICAgICAgIGlmIChidWZmZXJTdGFydHNXaXRoVHNTeW5jQnl0ZShidWZmZXIpKSB7CkBAIC05NzYsNyArMTMwOSw2IEBACiAgICAgICAgICAgICAgICAgdHNCdWZmZXItPnNldFJhbmdlKHRzT2ZmLCB0c1NpemUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdHNCdWZmZXItPnNldFJhbmdlKHRzQnVmZmVyLT5vZmZzZXQoKSwgdHNCdWZmZXItPnNpemUoKSArIGJ5dGVzUmVhZCk7Ci0KICAgICAgICAgICAgIGVyciA9IGV4dHJhY3RBbmRRdWV1ZUFjY2Vzc1VuaXRzRnJvbVRzKHRzQnVmZmVyKTsKICAgICAgICAgfQogCkBAIC05OTEsMjMgKzEzMjMsNDUgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfT1VUX09GX1JBTkdFKSB7CiAgICAgICAgICAgICAvLyByZWFjaGVkIHN0b3BwaW5nIHBvaW50Ci0gICAgICAgICAgICBzdG9wQXN5bmMoLyogY2xlYXIgPSAqLyBmYWxzZSk7CisgICAgICAgICAgICBub3RpZnlTdG9wUmVhY2hlZCgpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgbm90aWZ5RXJyb3IoZXJyKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotCisgICAgICAgIC8vIElmIHdlJ3JlIHN3aXRjaGluZywgcG9zdCBzdGFydCBub3RpZmljYXRpb24KKyAgICAgICAgLy8gdGhpcyBzaG91bGQgb25seSBiZSBwb3N0ZWQgd2hlbiB0aGUgbGFzdCBjaHVuayBpcyBmdWxsIHByb2Nlc3NlZCBieSBUU1BhcnNlcgorICAgICAgICBpZiAobVNlZWtNb2RlICE9IExpdmVTZXNzaW9uOjprU2Vla01vZGVFeGFjdFBvc2l0aW9uICYmIHN0YXJ0VXAgIT0gbVN0YXJ0dXApIHsKKyAgICAgICAgICAgIENIRUNLKG1TdGFydFRpbWVVc05vdGlmeSAhPSBOVUxMKTsKKyAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LmNsZWFyKCk7CisgICAgICAgICAgICBzaG91bGRQYXVzZSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNob3VsZFBhdXNlIHx8IHNob3VsZFBhdXNlRG93bmxvYWQoKSkgeworICAgICAgICAgICAgLy8gc2F2ZSBzdGF0ZSBhbmQgcmV0dXJuIGlmIHRoaXMgaXMgbm90IHRoZSBsYXN0IGNodW5rLAorICAgICAgICAgICAgLy8gbGVhdmluZyB0aGUgZmV0Y2hlciBpbiBwYXVzZWQgc3RhdGUuCisgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkICE9IDApIHsKKyAgICAgICAgICAgICAgICBtRG93bmxvYWRTdGF0ZS0+c2F2ZVN0YXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgdXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgaXRlbU1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICB0c0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaG91bGRQYXVzZSA9IHRydWU7CisgICAgICAgIH0KICAgICB9IHdoaWxlIChieXRlc1JlYWQgIT0gMCk7CiAKICAgICBpZiAoYnVmZmVyU3RhcnRzV2l0aFRzU3luY0J5dGUoYnVmZmVyKSkgewogICAgICAgICAvLyBJZiB3ZSBkb24ndCBzZWUgYSBzdHJlYW0gaW4gdGhlIHByb2dyYW0gdGFibGUgYWZ0ZXIgZmV0Y2hpbmcgYSBmdWxsIHRzIHNlZ21lbnQKICAgICAgICAgLy8gbWFyayBpdCBhcyBub25leGlzdGVudC4KLSAgICAgICAgY29uc3Qgc2l6ZV90IGtOdW1UeXBlcyA9IEFUU1BhcnNlcjo6TlVNX1NPVVJDRV9UWVBFUzsKLSAgICAgICAgQVRTUGFyc2VyOjpTb3VyY2VUeXBlIHNyY1R5cGVzW2tOdW1UeXBlc10gPQorICAgICAgICBBVFNQYXJzZXI6OlNvdXJjZVR5cGUgc3JjVHlwZXNbXSA9CiAgICAgICAgICAgICAgICAgeyBBVFNQYXJzZXI6OlZJREVPLCBBVFNQYXJzZXI6OkFVRElPIH07Ci0gICAgICAgIExpdmVTZXNzaW9uOjpTdHJlYW1UeXBlIHN0cmVhbVR5cGVzW2tOdW1UeXBlc10gPQorICAgICAgICBMaXZlU2Vzc2lvbjo6U3RyZWFtVHlwZSBzdHJlYW1UeXBlc1tdID0KICAgICAgICAgICAgICAgICB7IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1ZJREVPLCBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9BVURJTyB9OworICAgICAgICBjb25zdCBzaXplX3Qga051bVR5cGVzID0gTkVMRU0oc3JjVHlwZXMpOwogCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVR5cGVzOyBpKyspIHsKICAgICAgICAgICAgIEFUU1BhcnNlcjo6U291cmNlVHlwZSBzcmNUeXBlID0gc3JjVHlwZXNbaV07CkBAIC0xMDM0LDcgKzEzODgsNiBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgZXJyID0gT0s7CiAgICAgaWYgKHRzQnVmZmVyICE9IE5VTEwpIHsKICAgICAgICAgQVN0cmluZyBtZXRob2Q7CiAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kU3RyaW5nKCJjaXBoZXItbWV0aG9kIiwgJm1ldGhvZCkpOwpAQCAtMTA0OCw4MSArMTQwMSwxMTcgQEAKICAgICB9CiAKICAgICAvLyBidWxrIGV4dHJhY3Qgbm9uLXRzIGZpbGVzCisgICAgYm9vbCBzdGFydFVwID0gbVN0YXJ0dXA7CiAgICAgaWYgKHRzQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgZXJyID0gZXh0cmFjdEFuZFF1ZXVlQWNjZXNzVW5pdHMoYnVmZmVyLCBpdGVtTWV0YSk7CisgICAgICAgIHN0YXR1c190IGVyciA9IGV4dHJhY3RBbmRRdWV1ZUFjY2Vzc1VuaXRzKGJ1ZmZlciwgaXRlbU1ldGEpOwogICAgICAgICBpZiAoZXJyID09IC1FQUdBSU4pIHsKICAgICAgICAgICAgIC8vIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlciB0b28gbG93L2hpZ2gKICAgICAgICAgICAgIHBvc3RNb25pdG9yUXVldWUoKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfT1VUX09GX1JBTkdFKSB7CiAgICAgICAgICAgICAvLyByZWFjaGVkIHN0b3BwaW5nIHBvaW50Ci0gICAgICAgICAgICBzdG9wQXN5bmMoLyogY2xlYXIgPSAqL2ZhbHNlKTsKKyAgICAgICAgICAgIG5vdGlmeVN0b3BSZWFjaGVkKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBub3RpZnlFcnJvcihlcnIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBub3RpZnlFcnJvcihlcnIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCiAgICAgKyttU2VxTnVtYmVyOwogCi0gICAgcG9zdE1vbml0b3JRdWV1ZSgpOworICAgIC8vIGlmIGFkYXB0aW5nLCBwYXVzZSBhZnRlciBmb3VuZCB0aGUgbmV4dCBzdGFydGluZyBwb2ludAorICAgIGlmIChtU2Vla01vZGUgIT0gTGl2ZVNlc3Npb246OmtTZWVrTW9kZUV4YWN0UG9zaXRpb24gJiYgc3RhcnRVcCAhPSBtU3RhcnR1cCkgeworICAgICAgICBDSEVDSyhtU3RhcnRUaW1lVXNOb3RpZnkgIT0gTlVMTCk7CisgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+cG9zdCgpOworICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnkuY2xlYXIoKTsKKyAgICAgICAgc2hvdWxkUGF1c2UgPSB0cnVlOworICAgIH0KKworICAgIGlmICghc2hvdWxkUGF1c2UpIHsKKyAgICAgICAgcG9zdE1vbml0b3JRdWV1ZSgpOworICAgIH0KIH0KIAotaW50MzJfdCBQbGF5bGlzdEZldGNoZXI6OmdldFNlcU51bWJlcldpdGhBbmNob3JUaW1lKGludDY0X3QgYW5jaG9yVGltZVVzKSBjb25zdCB7Ci0gICAgaW50MzJfdCBmaXJzdFNlcU51bWJlckluUGxheWxpc3QsIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0OwotICAgIGlmIChtUGxheWxpc3QtPm1ldGEoKSA9PSBOVUxMCi0gICAgICAgICAgICB8fCAhbVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigibWVkaWEtc2VxdWVuY2UiLCAmZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0KSkgewotICAgICAgICBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgPSAwOwotICAgIH0KLSAgICBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIG1QbGF5bGlzdC0+c2l6ZSgpIC0gMTsKKy8qCisgKiByZXR1cm5zIHRydWUgaWYgd2UgbmVlZCB0byBhZGp1c3QgbVNlcU51bWJlcgorICovCitib29sIFBsYXlsaXN0RmV0Y2hlcjo6YWRqdXN0U2VxTnVtYmVyV2l0aEFuY2hvclRpbWUoaW50NjRfdCBhbmNob3JUaW1lVXMpIHsKKyAgICBpbnQzMl90IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IG1QbGF5bGlzdC0+Z2V0Rmlyc3RTZXFOdW1iZXIoKTsKIAotICAgIGludDMyX3QgaW5kZXggPSBtU2VxTnVtYmVyIC0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0IC0gMTsKLSAgICB3aGlsZSAoaW5kZXggPj0gMCAmJiBhbmNob3JUaW1lVXMgPiBtU3RhcnRUaW1lVXMpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IGl0ZW1NZXRhOwotICAgICAgICBDSEVDSyhtUGxheWxpc3QtPml0ZW1BdChpbmRleCwgTlVMTCAvKiB1cmkgKi8sICZpdGVtTWV0YSkpOwotCi0gICAgICAgIGludDY0X3QgaXRlbUR1cmF0aW9uVXM7Ci0gICAgICAgIENIRUNLKGl0ZW1NZXRhLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmaXRlbUR1cmF0aW9uVXMpKTsKLQotICAgICAgICBhbmNob3JUaW1lVXMgLT0gaXRlbUR1cmF0aW9uVXM7Ci0gICAgICAgIC0taW5kZXg7Ci0gICAgfQotCi0gICAgaW50MzJfdCBuZXdTZXFOdW1iZXIgPSBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgKyBpbmRleCArIDE7Ci0gICAgaWYgKG5ld1NlcU51bWJlciA8PSBsYXN0U2VxTnVtYmVySW5QbGF5bGlzdCkgewotICAgICAgICByZXR1cm4gbmV3U2VxTnVtYmVyOworICAgIGludDY0X3QgbWluRGlmZlVzLCBtYXhEaWZmVXM7CisgICAgaWYgKG1TZWVrTW9kZSA9PSBMaXZlU2Vzc2lvbjo6a1NlZWtNb2RlTmV4dFNhbXBsZSkgeworICAgICAgICAvLyBpZiB0aGUgcHJldmlvdXMgZmV0Y2hlciBwYXVzZWQgaW4gdGhlIG1pZGRsZSBvZiBhIHNlZ21lbnQsIHdlCisgICAgICAgIC8vIHdhbnQgdG8gc3RhcnQgYXQgYSBzZWdtZW50IHRoYXQgb3ZlcmxhcHMgdGhlIGxhc3Qgc2FtcGxlCisgICAgICAgIG1pbkRpZmZVcyA9IC1tUGxheWxpc3QtPmdldFRhcmdldER1cmF0aW9uKCk7CisgICAgICAgIG1heERpZmZVcyA9IDBsbDsKICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbGFzdFNlcU51bWJlckluUGxheWxpc3Q7CisgICAgICAgIC8vIGlmIHRoZSBwcmV2aW91cyBmZXRjaGVyIHBhdXNlZCBhdCB0aGUgZW5kIG9mIGEgc2VnbWVudCwgaWRlYWxseQorICAgICAgICAvLyB3ZSB3YW50IHRvIHN0YXJ0IGF0IHRoZSBzZWdtZW50IHRoYXQncyByb3VnaGx5IGFsaWduZWQgd2l0aCBpdHMKKyAgICAgICAgLy8gbmV4dCBzZWdtZW50LCBidXQgaWYgdGhlIHR3byB2YXJpYW50cyBhcmUgbm90IHdlbGwgYWxpZ25lZCB3ZQorICAgICAgICAvLyBhZGp1c3QgdGhlIGRpZmYgdG8gd2l0aGluICgtVC8yLCBULzIpCisgICAgICAgIG1pbkRpZmZVcyA9IC1tUGxheWxpc3QtPmdldFRhcmdldER1cmF0aW9uKCkgLyAyOworICAgICAgICBtYXhEaWZmVXMgPSBtUGxheWxpc3QtPmdldFRhcmdldER1cmF0aW9uKCkgLyAyOwogICAgIH0KKworICAgIGludDMyX3Qgb2xkU2VxTnVtYmVyID0gbVNlcU51bWJlcjsKKyAgICBzc2l6ZV90IGluZGV4ID0gbVNlcU51bWJlciAtIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKKworICAgIC8vIGFkanVzdCBhbmNob3JUaW1lVXMgdG8gd2l0aGluIChtaW5EaWZmVXMsIG1heERpZmZVcykgZnJvbSBtU3RhcnRUaW1lVXMKKyAgICBpbnQ2NF90IGRpZmZVcyA9IGFuY2hvclRpbWVVcyAtIG1TdGFydFRpbWVVczsKKyAgICBpZiAoZGlmZlVzID4gbWF4RGlmZlVzKSB7CisgICAgICAgIHdoaWxlIChpbmRleCA+IDAgJiYgZGlmZlVzID4gbWF4RGlmZlVzKSB7CisgICAgICAgICAgICAtLWluZGV4OworCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gaXRlbU1ldGE7CisgICAgICAgICAgICBDSEVDSyhtUGxheWxpc3QtPml0ZW1BdChpbmRleCwgTlVMTCAvKiB1cmkgKi8sICZpdGVtTWV0YSkpOworCisgICAgICAgICAgICBpbnQ2NF90IGl0ZW1EdXJhdGlvblVzOworICAgICAgICAgICAgQ0hFQ0soaXRlbU1ldGEtPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZpdGVtRHVyYXRpb25VcykpOworCisgICAgICAgICAgICBkaWZmVXMgLT0gaXRlbUR1cmF0aW9uVXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGRpZmZVcyA8IG1pbkRpZmZVcykgeworICAgICAgICB3aGlsZSAoaW5kZXggKyAxIDwgKHNzaXplX3QpIG1QbGF5bGlzdC0+c2l6ZSgpCisgICAgICAgICAgICAgICAgJiYgZGlmZlVzIDwgbWluRGlmZlVzKSB7CisgICAgICAgICAgICArK2luZGV4OworCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gaXRlbU1ldGE7CisgICAgICAgICAgICBDSEVDSyhtUGxheWxpc3QtPml0ZW1BdChpbmRleCwgTlVMTCAvKiB1cmkgKi8sICZpdGVtTWV0YSkpOworCisgICAgICAgICAgICBpbnQ2NF90IGl0ZW1EdXJhdGlvblVzOworICAgICAgICAgICAgQ0hFQ0soaXRlbU1ldGEtPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZpdGVtRHVyYXRpb25VcykpOworCisgICAgICAgICAgICBkaWZmVXMgKz0gaXRlbUR1cmF0aW9uVXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtU2VxTnVtYmVyID0gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgaW5kZXg7CisKKyAgICBpZiAobVNlcU51bWJlciAhPSBvbGRTZXFOdW1iZXIpIHsKKyAgICAgICAgRkxPR1YoImd1ZXNzZWQgd3Jvbmcgc2VnIG51bWJlcjogZGlmZiAlbGxkIG91dCBvZiBbJWxsZCwgJWxsZF0iLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIGFuY2hvclRpbWVVcyAtIG1TdGFydFRpbWVVcywKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBtaW5EaWZmVXMsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgbWF4RGlmZlVzKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKIH0KIAogaW50MzJfdCBQbGF5bGlzdEZldGNoZXI6OmdldFNlcU51bWJlckZvckRpc2NvbnRpbnVpdHkoc2l6ZV90IGRpc2NvbnRpbnVpdHlTZXEpIGNvbnN0IHsKLSAgICBpbnQzMl90IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdDsKLSAgICBpZiAobVBsYXlsaXN0LT5tZXRhKCkgPT0gTlVMTAotICAgICAgICAgICAgfHwgIW1QbGF5bGlzdC0+bWV0YSgpLT5maW5kSW50MzIoIm1lZGlhLXNlcXVlbmNlIiwgJmZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCkpIHsKLSAgICAgICAgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ID0gMDsKLSAgICB9Ci0KLSAgICBzaXplX3QgY3VyRGlzY29udGludWl0eVNlcSA9IG1QbGF5bGlzdC0+Z2V0RGlzY29udGludWl0eVNlcSgpOwotICAgIGlmIChkaXNjb250aW51aXR5U2VxIDwgY3VyRGlzY29udGludWl0eVNlcSkgewotICAgICAgICByZXR1cm4gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0IDw9IDAgPyAwIDogKGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCAtIDEpOwotICAgIH0KKyAgICBpbnQzMl90IGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IG1QbGF5bGlzdC0+Z2V0Rmlyc3RTZXFOdW1iZXIoKTsKIAogICAgIHNpemVfdCBpbmRleCA9IDA7CiAgICAgd2hpbGUgKGluZGV4IDwgbVBsYXlsaXN0LT5zaXplKCkpIHsKICAgICAgICAgc3A8QU1lc3NhZ2U+IGl0ZW1NZXRhOwogICAgICAgICBDSEVDSyhtUGxheWxpc3QtPml0ZW1BdCggaW5kZXgsIE5VTEwgLyogdXJpICovLCAmaXRlbU1ldGEpKTsKLQotICAgICAgICBpbnQ2NF90IGRpc2NvbnRpbnVpdHk7Ci0gICAgICAgIGlmIChpdGVtTWV0YS0+ZmluZEludDY0KCJkaXNjb250aW51aXR5IiwgJmRpc2NvbnRpbnVpdHkpKSB7Ci0gICAgICAgICAgICBjdXJEaXNjb250aW51aXR5U2VxKys7Ci0gICAgICAgIH0KLQorICAgICAgICBzaXplX3QgY3VyRGlzY29udGludWl0eVNlcTsKKyAgICAgICAgQ0hFQ0soaXRlbU1ldGEtPmZpbmRJbnQzMigiZGlzY29udGludWl0eS1zZXF1ZW5jZSIsIChpbnQzMl90ICopJmN1ckRpc2NvbnRpbnVpdHlTZXEpKTsKKyAgICAgICAgaW50MzJfdCBzZXFOdW1iZXIgPSBmaXJzdFNlcU51bWJlckluUGxheWxpc3QgKyBpbmRleDsKICAgICAgICAgaWYgKGN1ckRpc2NvbnRpbnVpdHlTZXEgPT0gZGlzY29udGludWl0eVNlcSkgewotICAgICAgICAgICAgcmV0dXJuIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCArIGluZGV4OworICAgICAgICAgICAgcmV0dXJuIHNlcU51bWJlcjsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJEaXNjb250aW51aXR5U2VxID4gZGlzY29udGludWl0eVNlcSkgeworICAgICAgICAgICAgcmV0dXJuIHNlcU51bWJlciA8PSAwID8gMCA6IHNlcU51bWJlciAtIDE7CiAgICAgICAgIH0KIAogICAgICAgICArK2luZGV4OwpAQCAtMTEzMiwxMiArMTUyMSw2IEBACiB9CiAKIGludDMyX3QgUGxheWxpc3RGZXRjaGVyOjpnZXRTZXFOdW1iZXJGb3JUaW1lKGludDY0X3QgdGltZVVzKSBjb25zdCB7Ci0gICAgaW50MzJfdCBmaXJzdFNlcU51bWJlckluUGxheWxpc3Q7Ci0gICAgaWYgKG1QbGF5bGlzdC0+bWV0YSgpID09IE5VTEwgfHwgIW1QbGF5bGlzdC0+bWV0YSgpLT5maW5kSW50MzIoCi0gICAgICAgICAgICAgICAgIm1lZGlhLXNlcXVlbmNlIiwgJmZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCkpIHsKLSAgICAgICAgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ID0gMDsKLSAgICB9Ci0KICAgICBzaXplX3QgaW5kZXggPSAwOwogICAgIGludDY0X3Qgc2VnbWVudFN0YXJ0VXMgPSAwOwogICAgIHdoaWxlIChpbmRleCA8IG1QbGF5bGlzdC0+c2l6ZSgpKSB7CkBAIC0xMTYwLDcgKzE1NDMsNyBAQAogICAgICAgICBpbmRleCA9IG1QbGF5bGlzdC0+c2l6ZSgpIC0gMTsKICAgICB9CiAKLSAgICByZXR1cm4gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0ICsgaW5kZXg7CisgICAgcmV0dXJuIG1QbGF5bGlzdC0+Z2V0Rmlyc3RTZXFOdW1iZXIoKSArIGluZGV4OwogfQogCiBjb25zdCBzcDxBQnVmZmVyPiAmUGxheWxpc3RGZXRjaGVyOjpzZXRBY2Nlc3NVbml0UHJvcGVydGllcygKQEAgLTExNzUsMTYgKzE1NTgsMzcgQEAKICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiZGlzY2FyZCIsIGRpc2NhcmQpOwogICAgIH0KIAotICAgIGludDMyX3QgdGFyZ2V0RHVyYXRpb25TZWNzOwotICAgIGlmIChtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKCJ0YXJnZXQtZHVyYXRpb24iLCAmdGFyZ2V0RHVyYXRpb25TZWNzKSkgewotICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJ0YXJnZXREdXJhdGlvbiIsIHRhcmdldER1cmF0aW9uU2Vjcyk7Ci0gICAgfQotCiAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiZGlzY29udGludWl0eVNlcSIsIG1EaXNjb250aW51aXR5U2VxKTsKICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCBnZXRTZWdtZW50U3RhcnRUaW1lVXMobVNlcU51bWJlcikpOworICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInNlZ21lbnRGaXJzdFRpbWVVcyIsIG1TZWdtZW50Rmlyc3RQVFMpOworICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInNlZ21lbnREdXJhdGlvblVzIiwgZ2V0U2VnbWVudER1cmF0aW9uVXMobVNlcU51bWJlcikpOworICAgIGlmICghbVBsYXlsaXN0LT5pc0NvbXBsZXRlKCkgJiYgIW1QbGF5bGlzdC0+aXNFdmVudCgpKSB7CisgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInBsYXlsaXN0VGltZVVzIiwgbVBsYXlsaXN0VGltZVVzKTsKKyAgICB9CiAgICAgcmV0dXJuIGFjY2Vzc1VuaXQ7CiB9CiAKK2Jvb2wgUGxheWxpc3RGZXRjaGVyOjppc1N0YXJ0VGltZVJlYWNoZWQoaW50NjRfdCB0aW1lVXMpIHsKKyAgICBpZiAoIW1GaXJzdFBUU1ZhbGlkKSB7CisgICAgICAgIG1GaXJzdFRpbWVVcyA9IHRpbWVVczsKKyAgICAgICAgbUZpcnN0UFRTVmFsaWQgPSB0cnVlOworICAgIH0KKyAgICBib29sIHN0YXJ0VGltZVJlYWNoZWQgPSB0cnVlOworICAgIGlmIChtU3RhcnRUaW1lVXNSZWxhdGl2ZSkgeworICAgICAgICBGTE9HVigic3RhcnRUaW1lVXNSZWxhdGl2ZSwgdGltZVVzICglbGxkKSAtICVsbGQgPSAlbGxkIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVVcywKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1GaXJzdFRpbWVVcywKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKSh0aW1lVXMgLSBtRmlyc3RUaW1lVXMpKTsKKyAgICAgICAgdGltZVVzIC09IG1GaXJzdFRpbWVVczsKKyAgICAgICAgaWYgKHRpbWVVcyA8IDApIHsKKyAgICAgICAgICAgIEZMT0dWKCJjbGFtcCBuZWdhdGl2ZSB0aW1lVXMgdG8gMCIpOworICAgICAgICAgICAgdGltZVVzID0gMDsKKyAgICAgICAgfQorICAgICAgICBzdGFydFRpbWVSZWFjaGVkID0gKHRpbWVVcyA+PSBtU3RhcnRUaW1lVXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhcnRUaW1lUmVhY2hlZDsKK30KKwogc3RhdHVzX3QgUGxheWxpc3RGZXRjaGVyOjpleHRyYWN0QW5kUXVldWVBY2Nlc3NVbml0c0Zyb21Ucyhjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CiAgICAgaWYgKG1UU1BhcnNlciA9PSBOVUxMKSB7CiAgICAgICAgIC8vIFVzZSBUU19USU1FU1RBTVBTX0FSRV9BQlNPTFVURSBzbyBwdHMgY2Fycnkgb3ZlciBiZXR3ZWVuIGZldGNoZXJzLgpAQCAtMTE5NywxMiArMTYwMSwxNiBAQAogICAgICAgICAvLyBBVFNQYXJzZXIgZnJvbSBza2V3aW5nIHRoZSB0aW1lc3RhbXBzIG9mIGFjY2VzcyB1bml0cy4KICAgICAgICAgZXh0cmEtPnNldEludDY0KElTdHJlYW1MaXN0ZW5lcjo6a0tleU1lZGlhVGltZVVzLCAwKTsKIAorICAgICAgICAvLyBXaGVuIGFkYXB0aW5nLCBzaWduYWwgYSByZWNlbnQgbWVkaWEgdGltZSB0byB0aGUgcGFyc2VyLAorICAgICAgICAvLyBzbyB0aGF0IFBUUyB3cmFwIGFyb3VuZCBpcyBoYW5kbGVkIGZvciB0aGUgbmV3IHZhcmlhbnQuCisgICAgICAgIGlmIChtU3RhcnRUaW1lVXMgPj0gMCAmJiAhbVN0YXJ0VGltZVVzUmVsYXRpdmUpIHsKKyAgICAgICAgICAgIGV4dHJhLT5zZXRJbnQ2NChJU3RyZWFtTGlzdGVuZXI6OmtLZXlSZWNlbnRNZWRpYVRpbWVVcywgbVN0YXJ0VGltZVVzKTsKKyAgICAgICAgfQorCiAgICAgICAgIG1UU1BhcnNlci0+c2lnbmFsRGlzY29udGludWl0eSgKICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfVElNRSwgZXh0cmEpOwogCi0gICAgICAgIG1BYnNvbHV0ZVRpbWVBbmNob3JVcyA9IG1OZXh0UFRTVGltZVVzOwogICAgICAgICBtTmV4dFBUU1RpbWVVcyA9IC0xbGw7Ci0gICAgICAgIG1GaXJzdFBUU1ZhbGlkID0gZmFsc2U7CiAgICAgfQogCiAgICAgc2l6ZV90IG9mZnNldCA9IDA7CkBAIC0xMjE4LDM1ICsxNjI2LDc1IEBACiAgICAgLy8gc2V0UmFuZ2UgdG8gaW5kaWNhdGUgY29uc3VtZWQgYnl0ZXMuCiAgICAgYnVmZmVyLT5zZXRSYW5nZShidWZmZXItPm9mZnNldCgpICsgb2Zmc2V0LCBidWZmZXItPnNpemUoKSAtIG9mZnNldCk7CiAKKyAgICBpZiAobVNlZ21lbnRGaXJzdFBUUyA8IDBsbCkgeworICAgICAgICAvLyBnZXQgdGhlIHNtYWxsZXN0IGZpcnN0IFBUUyBmcm9tIGFsbCBzdHJlYW1zIHByZXNlbnQgaW4gdGhpcyBwYXJzZXIKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IG1QYWNrZXRTb3VyY2VzLnNpemUoKTsgaS0tID4gMDspIHsKKyAgICAgICAgICAgIGNvbnN0IExpdmVTZXNzaW9uOjpTdHJlYW1UeXBlIHN0cmVhbSA9IG1QYWNrZXRTb3VyY2VzLmtleUF0KGkpOworICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9TVUJUSVRMRVMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiTVBFRzIgVHJhbnNwb3J0IHN0cmVhbXMgZG8gbm90IGNvbnRhaW4gc3VidGl0bGVzLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RyZWFtID09IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX01FVEFEQVRBKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBVFNQYXJzZXI6OlNvdXJjZVR5cGUgdHlwZSA9TGl2ZVNlc3Npb246OmdldFNvdXJjZVR5cGVGb3JTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QW5vdGhlclBhY2tldFNvdXJjZSAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UU1BhcnNlci0+Z2V0U291cmNlKHR5cGUpLmdldCgpKTsKKworICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbWV0YSA9IHNvdXJjZS0+Z2V0TWV0YUFmdGVyTGFzdERlcXVldWVkKDApOworICAgICAgICAgICAgaWYgKG1ldGEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworICAgICAgICAgICAgICAgIGlmIChtU2VnbWVudEZpcnN0UFRTIDwgMGxsIHx8IHRpbWVVcyA8IG1TZWdtZW50Rmlyc3RQVFMpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNlZ21lbnRGaXJzdFBUUyA9IHRpbWVVczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1TZWdtZW50Rmlyc3RQVFMgPCAwbGwpIHsKKyAgICAgICAgICAgIC8vIGRpZG4ndCBmaW5kIGFueSBUUyBwYWNrZXQsIGNhbiByZXR1cm4gZWFybHkKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1TdGFydFRpbWVVc1JlbGF0aXZlKSB7CisgICAgICAgICAgICAvLyBtU3RhcnR1cAorICAgICAgICAgICAgLy8gICBtU3RhcnR1cCBpcyB0cnVlIHVudGlsIHdlIGhhdmUgcXVldWVkIGEgcGFja2V0IGZvciBhbGwgdGhlIHN0cmVhbXMKKyAgICAgICAgICAgIC8vICAgd2UgYXJlIGZldGNoaW5nLiBXZSBxdWV1ZSBwYWNrZXRzIHdob3NlIHRpbWVzdGFtcHMgYXJlIGdyZWF0ZXIgdGhhbgorICAgICAgICAgICAgLy8gICBtU3RhcnRUaW1lVXMuCisgICAgICAgICAgICAvLyBtU2VnbWVudFN0YXJ0VGltZVVzID49IDAKKyAgICAgICAgICAgIC8vICAgbVNlZ21lbnRTdGFydFRpbWVVcyBpcyBub24tbmVnYXRpdmUgd2hlbiBhZGFwdGluZyBvciBzd2l0Y2hpbmcgdHJhY2tzCisgICAgICAgICAgICAvLyBhZGp1c3RTZXFOdW1iZXJXaXRoQW5jaG9yVGltZSh0aW1lVXMpID09IHRydWUKKyAgICAgICAgICAgIC8vICAgd2UgZ3Vlc3NlZCBhIHNlcSBudW1iZXIgdGhhdCdzIGVpdGhlciB0b28gbGFyZ2Ugb3IgdG9vIHNtYWxsLgorICAgICAgICAgICAgLy8gSWYgdGhpcyBoYXBwZW5zLCB3ZSdsbCBhZGp1c3QgbVNlcU51bWJlciBhbmQgcmVzdGFydCBmZXRjaGluZyBmcm9tIG5ldworICAgICAgICAgICAgLy8gbG9jYXRpb24uIE5vdGUgdGhhdCB3ZSBvbmx5IHdhbnQgdG8gYWRqdXN0IG9uY2UsIHNvIHNldCBtU2VnbWVudFN0YXJ0VGltZVVzCisgICAgICAgICAgICAvLyB0byAtMSBzbyB0aGF0IHdlIGRvbid0IGVudGVyIHRoaXMgY2h1bmsgbmV4dCB0aW1lLgorICAgICAgICAgICAgaWYgKG1TdGFydHVwICYmIG1TZWdtZW50U3RhcnRUaW1lVXMgPj0gMAorICAgICAgICAgICAgICAgICAgICAmJiBhZGp1c3RTZXFOdW1iZXJXaXRoQW5jaG9yVGltZShtU2VnbWVudEZpcnN0UFRTKSkgeworICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOworICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFN0YXJ0ZWRBdCk7CisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRTdHJpbmcoInVyaSIsIG1VUkkpOworICAgICAgICAgICAgICAgIG1JRFJGb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1TZWdtZW50U3RhcnRUaW1lVXMgPSAtMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHN0YXR1c190IGVyciA9IE9LOwogICAgIGZvciAoc2l6ZV90IGkgPSBtUGFja2V0U291cmNlcy5zaXplKCk7IGktLSA+IDA7KSB7CiAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHBhY2tldFNvdXJjZSA9IG1QYWNrZXRTb3VyY2VzLnZhbHVlQXQoaSk7CiAKLSAgICAgICAgY29uc3QgY2hhciAqa2V5OwotICAgICAgICBBVFNQYXJzZXI6OlNvdXJjZVR5cGUgdHlwZTsKICAgICAgICAgY29uc3QgTGl2ZVNlc3Npb246OlN0cmVhbVR5cGUgc3RyZWFtID0gbVBhY2tldFNvdXJjZXMua2V5QXQoaSk7Ci0gICAgICAgIHN3aXRjaCAoc3RyZWFtKSB7Ci0gICAgICAgICAgICBjYXNlIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1ZJREVPOgotICAgICAgICAgICAgICAgIHR5cGUgPSBBVFNQYXJzZXI6OlZJREVPOwotICAgICAgICAgICAgICAgIGtleSA9ICJ0aW1lVXNWaWRlbyI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfQVVESU86Ci0gICAgICAgICAgICAgICAgdHlwZSA9IEFUU1BhcnNlcjo6QVVESU87Ci0gICAgICAgICAgICAgICAga2V5ID0gInRpbWVVc0F1ZGlvIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9TVUJUSVRMRVM6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIk1QRUcyIFRyYW5zcG9ydCBzdHJlYW1zIGRvIG5vdCBjb250YWluIHN1YnRpdGxlcy4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgIGlmIChzdHJlYW0gPT0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfU1VCVElUTEVTKSB7CisgICAgICAgICAgICBBTE9HRSgiTVBFRzIgVHJhbnNwb3J0IHN0cmVhbXMgZG8gbm90IGNvbnRhaW4gc3VidGl0bGVzLiIpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogCisgICAgICAgIGNvbnN0IGNoYXIgKmtleSA9IExpdmVTZXNzaW9uOjpnZXRLZXlGb3JTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgQVRTUGFyc2VyOjpTb3VyY2VUeXBlIHR5cGUgPUxpdmVTZXNzaW9uOjpnZXRTb3VyY2VUeXBlRm9yU3RyZWFtKHN0cmVhbSk7CisKICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0KICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFub3RoZXJQYWNrZXRTb3VyY2UgKj4oCiAgICAgICAgICAgICAgICAgICAgIG1UU1BhcnNlci0+Z2V0U291cmNlKHR5cGUpLmdldCgpKTsKQEAgLTEyNTUsMTE2ICsxNzAzLDY1IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ICA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgICAgIGJvb2wgaXNBdmMgPSBmb3JtYXQgIT0gTlVMTCAmJiBmb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpCisgICAgICAgICAgICAgICAgJiYgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKwogICAgICAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0OwogICAgICAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKICAgICAgICAgd2hpbGUgKHNvdXJjZS0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkKICAgICAgICAgICAgICAgICAmJiBzb3VyY2UtPmRlcXVldWVBY2Nlc3NVbml0KCZhY2Nlc3NVbml0KSA9PSBPSykgewogCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKICAgICAgICAgICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CiAKICAgICAgICAgICAgIGlmIChtU3RhcnR1cCkgewotICAgICAgICAgICAgICAgIGlmICghbUZpcnN0UFRTVmFsaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZpcnN0VGltZVVzID0gdGltZVVzOwotICAgICAgICAgICAgICAgICAgICBtRmlyc3RQVFNWYWxpZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtU3RhcnRUaW1lVXNSZWxhdGl2ZSkgewotICAgICAgICAgICAgICAgICAgICB0aW1lVXMgLT0gbUZpcnN0VGltZVVzOwotICAgICAgICAgICAgICAgICAgICBpZiAodGltZVVzIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBib29sIHN0YXJ0VGltZVJlYWNoZWQgPSBpc1N0YXJ0VGltZVJlYWNoZWQodGltZVVzKTsKIAotICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPCBtU3RhcnRUaW1lVXMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVyIHVwIHRvIHRoZSBjbG9zZXN0IHByZWNlZGluZyBJRFIgZnJhbWUKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoInRpbWVVcyAlIiBQUklkNjQgIiB1cyA8IG1TdGFydFRpbWVVcyAlIiBQUklkNjQgIiB1cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzLCBtU3RhcnRUaW1lVXMpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ICA9IHNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2wgaXNBdmMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBOVUxMICYmIGZvcm1hdC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc0F2YyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXZjICYmIElzSURSKGFjY2Vzc1VuaXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9CdWZmZXItPmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXN0YXJ0VGltZVJlYWNoZWQgfHwgKGlzQXZjICYmICFtSURSRm91bmQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlciB1cCB0byB0aGUgY2xvc2VzdCBwcmVjZWRpbmcgSURSIGZyYW1lIGluIHRoZSBuZXh0IHNlZ2VtZW50LAorICAgICAgICAgICAgICAgICAgICAvLyBvciB0aGUgY2xvc2VzdCBzdWNjZWVkaW5nIElEUiBmcmFtZSBhZnRlciB0aGUgZXhhY3QgcG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgRlNMT0dWKHN0cmVhbSwgInRpbWVVcyglbGxkKS1tU3RhcnRUaW1lVXMoJWxsZCk9JWxsZCwgbUlEUkZvdW5kPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1TdGFydFRpbWVVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVVcyAtIG1TdGFydFRpbWVVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSURSRm91bmQpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaXNBdmMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0J1ZmZlci0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElzSURSKGFjY2Vzc1VuaXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTTE9HVihzdHJlYW0sICJmb3VuZCBJRFIsIGNsZWFyIG1WaWRlb0J1ZmZlciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JRFJGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUlEUkZvdW5kICYmIG1TdGFydFRpbWVVc1JlbGF0aXZlICYmICFzdGFydFRpbWVSZWFjaGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNMT0dWKHN0cmVhbSwgInNhdmluZyBBVkMgdmlkZW8gQWNjZXNzVW5pdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RhcnRUaW1lUmVhY2hlZCB8fCAoaXNBdmMgJiYgIW1JRFJGb3VuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotICAgICAgICAgICAgaWYgKG1TdGFydFRpbWVVc05vdGlmeSAhPSBOVUxMICYmIHRpbWVVcyA+IG1TdGFydFRpbWVVcykgewotICAgICAgICAgICAgICAgIGludDMyX3QgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0OwotICAgICAgICAgICAgICAgIGlmIChtUGxheWxpc3QtPm1ldGEoKSA9PSBOVUxMIHx8ICFtUGxheWxpc3QtPm1ldGEoKS0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZWRpYS1zZXF1ZW5jZSIsICZmaXJzdFNlcU51bWJlckluUGxheWxpc3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0U2VxTnVtYmVySW5QbGF5bGlzdCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50MzJfdCB0YXJnZXREdXJhdGlvblNlY3M7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobVBsYXlsaXN0LT5tZXRhKCktPmZpbmRJbnQzMigidGFyZ2V0LWR1cmF0aW9uIiwgJnRhcmdldER1cmF0aW9uU2VjcykpOwotICAgICAgICAgICAgICAgIGludDY0X3QgdGFyZ2V0RHVyYXRpb25VcyA9IHRhcmdldER1cmF0aW9uU2VjcyAqIDEwMDAwMDBsbDsKLSAgICAgICAgICAgICAgICAvLyBtU3RhcnR1cAotICAgICAgICAgICAgICAgIC8vICAgbVN0YXJ0dXAgaXMgdHJ1ZSB1bnRpbCB3ZSBoYXZlIHF1ZXVlZCBhIHBhY2tldCBmb3IgYWxsIHRoZSBzdHJlYW1zCi0gICAgICAgICAgICAgICAgLy8gICB3ZSBhcmUgZmV0Y2hpbmcuIFdlIHF1ZXVlIHBhY2tldHMgd2hvc2UgdGltZXN0YW1wcyBhcmUgZ3JlYXRlciB0aGFuCi0gICAgICAgICAgICAgICAgLy8gICBtU3RhcnRUaW1lVXMuCi0gICAgICAgICAgICAgICAgLy8gbVNlZ21lbnRTdGFydFRpbWVVcyA+PSAwCi0gICAgICAgICAgICAgICAgLy8gICBtU2VnbWVudFN0YXJ0VGltZVVzIGlzIG5vbi1uZWdhdGl2ZSB3aGVuIGFkYXB0aW5nIG9yIHN3aXRjaGluZyB0cmFja3MKLSAgICAgICAgICAgICAgICAvLyBtU2VxTnVtYmVyID4gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0Ci0gICAgICAgICAgICAgICAgLy8gICBkb24ndCBkZWNyZW1lbnQgbVNlcU51bWJlciBpZiBpdCBhbHJlYWR5IHBvaW50cyB0byB0aGUgMXN0IHNlZ21lbnQKLSAgICAgICAgICAgICAgICAvLyB0aW1lVXMgLSBtU3RhcnRUaW1lVXMgPiB0YXJnZXREdXJhdGlvblVzOgotICAgICAgICAgICAgICAgIC8vICAgVGhpcyBhbmQgdGhlIDIgYWJvdmUgY29uZGl0aW9ucyBzaG91bGQgb25seSBoYXBwZW4gd2hlbiBhZGFwdGluZyBpbiBhIGxpdmUKLSAgICAgICAgICAgICAgICAvLyAgIHN0cmVhbTsgdGhlIG9sZCBmZXRjaGVyIGhhcyBhbHJlYWR5IGZldGNoZWQgdG8gbVN0YXJ0VGltZVVzOyB0aGUgbmV3IGZldGNoZXIKLSAgICAgICAgICAgICAgICAvLyAgIHdvdWxkIHN0YXJ0IGZldGNoaW5nIGFmdGVyIHRpbWVVcywgd2hpY2ggc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiBtU3RhcnRUaW1lVXM7Ci0gICAgICAgICAgICAgICAgLy8gICB0aGUgb2xkIGZldGNoZXIgd291bGQgdGhlbiBjb250aW51ZSBmZXRjaGluZyBkYXRhIHVudGlsIHRpbWVVcy4gV2UgZG9uJ3Qgd2FudAotICAgICAgICAgICAgICAgIC8vICAgdGltZVVzIHRvIGJlIHRvbyBmYXIgYWhlYWQgb2YgbVN0YXJ0VGltZVVzIGJlY2F1c2Ugd2Ugd2FudCB0aGUgb2xkIGZldGNoZXIgdG8KLSAgICAgICAgICAgICAgICAvLyAgIHN0b3AgYXMgZWFybHkgYXMgcG9zc2libGUuIFRoZSBkZWZpbml0aW9uIG9mIGJlaW5nICJ0b28gZmFyIGFoZWFkIiBpcwotICAgICAgICAgICAgICAgIC8vICAgYXJiaXRyYXJ5OyBoZXJlIHdlIHVzZSB0YXJnZXREdXJhdGlvblVzIGFzIHRocmVzaG9sZC4KLSAgICAgICAgICAgICAgICBpZiAobVN0YXJ0dXAgJiYgbVNlZ21lbnRTdGFydFRpbWVVcyA+PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtU2VxTnVtYmVyID4gZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAmJiB0aW1lVXMgLSBtU3RhcnRUaW1lVXMgPiB0YXJnZXREdXJhdGlvblVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdlIGp1c3QgZ3Vlc3NlZCBhIHN0YXJ0aW5nIHRpbWVzdGFtcCB0aGF0IGlzIHRvbyBoaWdoIHdoZW4gYWRhcHRpbmcgaW4gYQotICAgICAgICAgICAgICAgICAgICAvLyBsaXZlIHN0cmVhbTsgcmUtYWRqdXN0IGJhc2VkIG9uIHRoZSBhY3R1YWwgdGltZXN0YW1wIGV4dHJhY3RlZCBmcm9tIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBtZWRpYSBzZWdtZW50OyBpZiB3ZSBkaWRuJ3QgbW92ZSBiYWNrd2FyZCBhZnRlciB0aGUgcmUtYWRqdXN0bWVudAotICAgICAgICAgICAgICAgICAgICAvLyAobmV3U2VxTnVtYmVyKSwgc3RhcnQgYXQgbGVhc3QgMSBzZWdtZW50IHByaW9yLgotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5ld1NlcU51bWJlciA9IGdldFNlcU51bWJlcldpdGhBbmNob3JUaW1lKHRpbWVVcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdTZXFOdW1iZXIgPj0gbVNlcU51bWJlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgLS1tU2VxTnVtYmVyOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlcU51bWJlciA9IG5ld1NlcU51bWJlcjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0U3RhcnRlZEF0KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50MzJfdCBzZXE7Ci0gICAgICAgICAgICAgICAgaWYgKCFtU3RhcnRUaW1lVXNOb3RpZnktPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZzZXEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCBtRGlzY29udGludWl0eVNlcSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXM7Ci0gICAgICAgICAgICAgICAgaWYgKCFtU3RhcnRUaW1lVXNOb3RpZnktPmZpbmRJbnQ2NChrZXksICZzdGFydFRpbWVVcykpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQ2NChrZXksIHRpbWVVcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtTWFzayA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+ZmluZEludDMyKCJzdHJlYW1NYXNrIiwgKGludDMyX3QgKikgJnN0cmVhbU1hc2spOworICAgICAgICAgICAgaWYgKG1TdGFydFRpbWVVc05vdGlmeSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtTWFzayA9IDA7CisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5maW5kSW50MzIoInN0cmVhbU1hc2siLCAoaW50MzJfdCAqKSAmc3RyZWFtTWFzayk7CisgICAgICAgICAgICAgICAgaWYgKChtU3RyZWFtVHlwZU1hc2sgJiBtUGFja2V0U291cmNlcy5rZXlBdChpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICEoc3RyZWFtTWFzayAmIG1QYWNrZXRTb3VyY2VzLmtleUF0KGkpKSkgewogICAgICAgICAgICAgICAgICAgICBzdHJlYW1NYXNrIHw9IG1QYWNrZXRTb3VyY2VzLmtleUF0KGkpOwogICAgICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnNldEludDMyKCJzdHJlYW1NYXNrIiwgc3RyZWFtTWFzayk7CisgICAgICAgICAgICAgICAgICAgIEZTTE9HVihzdHJlYW0sICJmb3VuZCBzdGFydCBwb2ludCwgdGltZVVzPSVsbGQsIHN0cmVhbU1hc2sgYmVjb21lcyAleCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lVXMsIHN0cmVhbU1hc2spOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1NYXNrID09IG1TdHJlYW1UeXBlTWFzaykgeworICAgICAgICAgICAgICAgICAgICAgICAgRkxPR1YoImZvdW5kIHN0YXJ0IHBvaW50IGZvciBhbGwgc3RyZWFtcyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0dXAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+cG9zdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtU3RvcFBhcmFtcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgLy8gUXVldWUgZGlzY29udGludWl0eSBpbiBvcmlnaW5hbCBzdHJlYW0uCiAgICAgICAgICAgICAgICAgaW50MzJfdCBkaXNjb250aW51aXR5U2VxOwogICAgICAgICAgICAgICAgIGludDY0X3Qgc3RvcFRpbWVVczsKICAgICAgICAgICAgICAgICBpZiAoIW1TdG9wUGFyYW1zLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCAmZGlzY29udGludWl0eVNlcSkKQEAgLTEzNzIsMTQgKzE3NjksMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFtU3RvcFBhcmFtcy0+ZmluZEludDY0KGtleSwgJnN0b3BUaW1lVXMpCiAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZGlzY29udGludWl0eVNlcSA9PSBtRGlzY29udGludWl0eVNlcQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aW1lVXMgPj0gc3RvcFRpbWVVcykpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFja2V0U291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQobVNlc3Npb24tPmNyZWF0ZUZvcm1hdENoYW5nZUJ1ZmZlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgRlNMT0dWKHN0cmVhbSwgInJlYWNoZWQgc3RvcCBwb2ludCwgdGltZVVzPSVsbGQiLCAobG9uZyBsb25nKXRpbWVVcyk7CiAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlTWFzayAmPSB+c3RyZWFtOwogICAgICAgICAgICAgICAgICAgICBtUGFja2V0U291cmNlcy5yZW1vdmVJdGVtc0F0KGkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkbyBOT1QgZGVxdWV1ZSBhbnkgZGlzY29udGludWl0aWVzIGV4Y2VwdCBmb3IgZm9ybWF0IGNoYW5nZS4KICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfVklERU8pIHsKICAgICAgICAgICAgICAgICBjb25zdCBib29sIGRpc2NhcmQgPSB0cnVlOwogICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1czsKQEAgLTEzODgsMTEgKzE3ODQsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgbVZpZGVvQnVmZmVyLT5kZXF1ZXVlQWNjZXNzVW5pdCgmdmlkZW9CdWZmZXIpOwogICAgICAgICAgICAgICAgICAgICBzZXRBY2Nlc3NVbml0UHJvcGVydGllcyh2aWRlb0J1ZmZlciwgc291cmNlLCBkaXNjYXJkKTsKICAgICAgICAgICAgICAgICAgICAgcGFja2V0U291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQodmlkZW9CdWZmZXIpOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGJ1ZmZlclRpbWVVczsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sodmlkZW9CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmYnVmZmVyVGltZVVzKSk7CisgICAgICAgICAgICAgICAgICAgIEZTTE9HVihzdHJlYW0sICJxdWV1ZUFjY2Vzc1VuaXQgKHNhdmVkKSwgdGltZVVzPSVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpYnVmZmVyVGltZVVzKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbSA9PSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9NRVRBREFUQSAmJiAhbUhhc01ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgbUhhc01ldGFkYXRhID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0TWV0YWRhdGFEZXRlY3RlZCk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNldEFjY2Vzc1VuaXRQcm9wZXJ0aWVzKGFjY2Vzc1VuaXQsIHNvdXJjZSk7CiAgICAgICAgICAgICBwYWNrZXRTb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKKyAgICAgICAgICAgIEZTTE9HVihzdHJlYW0sICJxdWV1ZUFjY2Vzc1VuaXQsIHRpbWVVcz0lbGxkIiwgKGxvbmcgbG9uZyl0aW1lVXMpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMTQxMCw3ICsxODE2LDcgQEAKIAogICAgIGlmICghbVN0cmVhbVR5cGVNYXNrKSB7CiAgICAgICAgIC8vIFNpZ25hbCBnYXAgaXMgZmlsbGVkIGJldHdlZW4gb3JpZ2luYWwgYW5kIG5ldyBzdHJlYW0uCi0gICAgICAgIEFMT0dWKCJFUlJPUiBPVVQgT0YgUkFOR0UiKTsKKyAgICAgICAgRkxPR1YoInJlYWNoZWQgc3RvcCBwb2ludCBmb3IgYWxsIHN0cmVhbXMiKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CiAKQEAgLTE0NjEsMTQgKzE4NjcsMTEgQEAKICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCBnZXRTZWdtZW50U3RhcnRUaW1lVXMobVNlcU51bWJlcikpOwogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCBtRGlzY29udGludWl0eVNlcSk7CiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigic3VidGl0bGVHZW5lcmF0aW9uIiwgbVN1YnRpdGxlR2VuZXJhdGlvbik7Ci0KICAgICAgICAgcGFja2V0U291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYnVmZmVyKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAogICAgIGlmIChtTmV4dFBUU1RpbWVVcyA+PSAwbGwpIHsKLSAgICAgICAgbUZpcnN0UFRTVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgbUFic29sdXRlVGltZUFuY2hvclVzID0gbU5leHRQVFNUaW1lVXM7CiAgICAgICAgIG1OZXh0UFRTVGltZVVzID0gLTFsbDsKICAgICB9CiAKQEAgLTE1NjksMTEgKzE5NzIsMjMgQEAKICAgICBDSEVDSyhwYWNrZXRTb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSk7CiAKICAgICBpbnQ2NF90IHRpbWVVcyA9IChQVFMgKiAxMDBsbCkgLyA5bGw7Ci0gICAgaWYgKCFtRmlyc3RQVFNWYWxpZCkgeworICAgIGlmIChtU3RhcnR1cCAmJiAhbUZpcnN0UFRTVmFsaWQpIHsKICAgICAgICAgbUZpcnN0UFRTVmFsaWQgPSB0cnVlOwogICAgICAgICBtRmlyc3RUaW1lVXMgPSB0aW1lVXM7CiAgICAgfQogCisgICAgaWYgKG1TZWdtZW50Rmlyc3RQVFMgPCAwbGwpIHsKKyAgICAgICAgbVNlZ21lbnRGaXJzdFBUUyA9IHRpbWVVczsKKyAgICAgICAgaWYgKCFtU3RhcnRUaW1lVXNSZWxhdGl2ZSkgeworICAgICAgICAgICAgLy8gRHVwbGljYXRlZCBsb2dpYyBmcm9tIGhvdyB3ZSBoYW5kbGUgLnRzIHBsYXlsaXN0cy4KKyAgICAgICAgICAgIGlmIChtU3RhcnR1cCAmJiBtU2VnbWVudFN0YXJ0VGltZVVzID49IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgYWRqdXN0U2VxTnVtYmVyV2l0aEFuY2hvclRpbWUodGltZVVzKSkgeworICAgICAgICAgICAgICAgIG1TZWdtZW50U3RhcnRUaW1lVXMgPSAtMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHNpemVfdCBvZmZzZXQgPSAwOwogICAgIHdoaWxlIChvZmZzZXQgPCBidWZmZXItPnNpemUoKSkgewogICAgICAgICBjb25zdCB1aW50OF90ICphZHRzSGVhZGVyID0gYnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQ7CkBAIC0xNjE3LDQwICsyMDMyLDE4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtU3RhcnRUaW1lVXNOb3RpZnkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGludDMyX3QgdGFyZ2V0RHVyYXRpb25TZWNzOwotICAgICAgICAgICAgICAgIENIRUNLKG1QbGF5bGlzdC0+bWV0YSgpLT5maW5kSW50MzIoInRhcmdldC1kdXJhdGlvbiIsICZ0YXJnZXREdXJhdGlvblNlY3MpKTsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IHRhcmdldER1cmF0aW9uVXMgPSB0YXJnZXREdXJhdGlvblNlY3MgKiAxMDAwMDAwbGw7Ci0KLSAgICAgICAgICAgICAgICAvLyBEdXBsaWNhdGVkIGxvZ2ljIGZyb20gaG93IHdlIGhhbmRsZSAudHMgcGxheWxpc3RzLgotICAgICAgICAgICAgICAgIGlmIChtU3RhcnR1cCAmJiBtU2VnbWVudFN0YXJ0VGltZVVzID49IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHRpbWVVcyAtIG1TdGFydFRpbWVVcyA+IHRhcmdldER1cmF0aW9uVXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuZXdTZXFOdW1iZXIgPSBnZXRTZXFOdW1iZXJXaXRoQW5jaG9yVGltZSh0aW1lVXMpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV3U2VxTnVtYmVyID49IG1TZXFOdW1iZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC0tbVNlcU51bWJlcjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXFOdW1iZXIgPSBuZXdTZXFOdW1iZXI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQUdBSU47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQ2NCgidGltZVVzQXVkaW8iLCB0aW1lVXMpOwotICAgICAgICAgICAgICAgIG1TdGFydFRpbWVVc05vdGlmeS0+c2V0SW50MzIoImRpc2NvbnRpbnVpdHlTZXEiLCBtRGlzY29udGludWl0eVNlcSk7CiAgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzTm90aWZ5LT5zZXRJbnQzMigic3RyZWFtTWFzayIsIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPKTsKLSAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnktPnBvc3QoKTsKLSAgICAgICAgICAgICAgICBtU3RhcnRUaW1lVXNOb3RpZnkuY2xlYXIoKTsKICAgICAgICAgICAgICAgICBtU3RhcnR1cCA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1TdG9wUGFyYW1zICE9IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIFF1ZXVlIGRpc2NvbnRpbnVpdHkgaW4gb3JpZ2luYWwgc3RyZWFtLgogICAgICAgICAgICAgaW50MzJfdCBkaXNjb250aW51aXR5U2VxOwogICAgICAgICAgICAgaW50NjRfdCBzdG9wVGltZVVzOwogICAgICAgICAgICAgaWYgKCFtU3RvcFBhcmFtcy0+ZmluZEludDMyKCJkaXNjb250aW51aXR5U2VxIiwgJmRpc2NvbnRpbnVpdHlTZXEpCiAgICAgICAgICAgICAgICAgICAgIHx8IGRpc2NvbnRpbnVpdHlTZXEgPiBtRGlzY29udGludWl0eVNlcQogICAgICAgICAgICAgICAgICAgICB8fCAhbVN0b3BQYXJhbXMtPmZpbmRJbnQ2NCgidGltZVVzQXVkaW8iLCAmc3RvcFRpbWVVcykKICAgICAgICAgICAgICAgICAgICAgfHwgKGRpc2NvbnRpbnVpdHlTZXEgPT0gbURpc2NvbnRpbnVpdHlTZXEgJiYgdW5pdFRpbWVVcyA+PSBzdG9wVGltZVVzKSkgewotICAgICAgICAgICAgICAgIHBhY2tldFNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KG1TZXNzaW9uLT5jcmVhdGVGb3JtYXRDaGFuZ2VCdWZmZXIoKSk7CiAgICAgICAgICAgICAgICAgbVN0cmVhbVR5cGVNYXNrID0gMDsKICAgICAgICAgICAgICAgICBtUGFja2V0U291cmNlcy5jbGVhcigpOwogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CkBAIC0xNjg3LDMzICsyMDgwLDExIEBACiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKLWludDY0X3QgUGxheWxpc3RGZXRjaGVyOjpyZXN1bWVUaHJlc2hvbGQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgaWYgKG1zZy0+ZmluZEludDY0KCJkdXJhdGlvblVzIiwgJmR1cmF0aW9uVXMpICYmIGR1cmF0aW9uVXMgPiAwKSB7Ci0gICAgICAgIHJldHVybiBrTnVtU2tpcEZyYW1lcyAqIGR1cmF0aW9uVXM7Ci0gICAgfQotCi0gICAgc3A8UmVmQmFzZT4gb2JqOwotICAgIG1zZy0+ZmluZE9iamVjdCgiZm9ybWF0IiwgJm9iaik7Ci0gICAgTWV0YURhdGEgKmZvcm1hdCA9IHN0YXRpY19jYXN0PE1ldGFEYXRhICo+KG9iai5nZXQoKSk7Ci0KLSAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKGZvcm1hdC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotICAgIGJvb2wgYXVkaW8gPSAhc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpOwotICAgIGlmIChhdWRpbykgewotICAgICAgICAvLyBBc3N1bWVzIDEwMDAgc2FtcGxlcyBwZXIgZnJhbWUuCi0gICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKLSAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSk7Ci0gICAgICAgIHJldHVybiBrTnVtU2tpcEZyYW1lcyAgLyogZnJhbWVzICovICogMTAwMCAvKiBzYW1wbGVzICovCi0gICAgICAgICAgICAgICAgKiAoMTAwMDAwMCAvIHNhbXBsZVJhdGUpIC8qIHNhbXBsZSBkdXJhdGlvbiAodXMpICovOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludDMyX3QgZnJhbWVSYXRlOwotICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoa0tleUZyYW1lUmF0ZSwgJmZyYW1lUmF0ZSkgJiYgZnJhbWVSYXRlID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIGtOdW1Ta2lwRnJhbWVzICogKDEwMDAwMDAgLyBmcmFtZVJhdGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDUwMDAwMGxsOwordm9pZCBQbGF5bGlzdEZldGNoZXI6OnVwZGF0ZVRhcmdldER1cmF0aW9uKCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKKyAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXRUYXJnZXREdXJhdGlvblVwZGF0ZSk7CisgICAgbXNnLT5zZXRJbnQ2NCgidGFyZ2V0RHVyYXRpb25VcyIsIG1QbGF5bGlzdC0+Z2V0VGFyZ2V0RHVyYXRpb24oKSk7CisgICAgbXNnLT5wb3N0KCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5oCmluZGV4IDRlMTVmODUuLmM4Y2E0NTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5oCkBAIC0yNyw3ICsyNyw3IEBACiAKIHN0cnVjdCBBQnVmZmVyOwogc3RydWN0IEFub3RoZXJQYWNrZXRTb3VyY2U7Ci1zdHJ1Y3QgRGF0YVNvdXJjZTsKK2NsYXNzIERhdGFTb3VyY2U7CiBzdHJ1Y3QgSFRUUEJhc2U7CiBzdHJ1Y3QgTGl2ZURhdGFTb3VyY2U7CiBzdHJ1Y3QgTTNVUGFyc2VyOwpAQCAtMzYsNiArMzYsNyBAQAogc3RydWN0IFBsYXlsaXN0RmV0Y2hlciA6IHB1YmxpYyBBSGFuZGxlciB7CiAgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01pbkJ1ZmZlcmVkRHVyYXRpb25VczsKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrRG93bmxvYWRCbG9ja1NpemU7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga0ZldGNoZXJSZXN1bWVUaHJlc2hvbGQ7CiAKICAgICBlbnVtIHsKICAgICAgICAga1doYXRTdGFydGVkLApAQCAtNDMsMzYgKzQ0LDQzIEBACiAgICAgICAgIGtXaGF0U3RvcHBlZCwKICAgICAgICAga1doYXRFcnJvciwKICAgICAgICAga1doYXREdXJhdGlvblVwZGF0ZSwKLSAgICAgICAga1doYXRUZW1wb3JhcmlseURvbmVGZXRjaGluZywKKyAgICAgICAga1doYXRUYXJnZXREdXJhdGlvblVwZGF0ZSwKICAgICAgICAga1doYXRQcmVwYXJlZCwKICAgICAgICAga1doYXRQcmVwYXJhdGlvbkZhaWxlZCwKICAgICAgICAga1doYXRTdGFydGVkQXQsCisgICAgICAgIGtXaGF0U3RvcFJlYWNoZWQsCisgICAgICAgIGtXaGF0UGxheWxpc3RGZXRjaGVkLAorICAgICAgICBrV2hhdE1ldGFkYXRhRGV0ZWN0ZWQsCiAgICAgfTsKIAogICAgIFBsYXlsaXN0RmV0Y2hlcigKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICAgICAgY29uc3Qgc3A8TGl2ZVNlc3Npb24+ICZzZXNzaW9uLAogICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICAgICAgaW50MzJfdCBpZCwKICAgICAgICAgICAgIGludDMyX3Qgc3VidGl0bGVHZW5lcmF0aW9uKTsKIAotICAgIHNwPERhdGFTb3VyY2U+IGdldERhdGFTb3VyY2UoKTsKKyAgICBpbnQzMl90IGdldEZldGNoZXJJRCgpIGNvbnN0OwogCiAgICAgdm9pZCBzdGFydEFzeW5jKAogICAgICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmF1ZGlvU291cmNlLAogICAgICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJnZpZGVvU291cmNlLAogICAgICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJnN1YnRpdGxlU291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJm1ldGFkYXRhU291cmNlLAogICAgICAgICAgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IC0xbGwsICAgICAgICAgLy8gc3RhcnRpbmcgdGltZXN0YW1wcwogICAgICAgICAgICAgaW50NjRfdCBzZWdtZW50U3RhcnRUaW1lVXMgPSAtMWxsLCAvLyBzdGFydGluZyBwb3NpdGlvbiB3aXRoaW4gcGxheWxpc3QKICAgICAgICAgICAgIC8vIHN0YXJ0VGltZVVzIT1zZWdtZW50U3RhcnRUaW1lVXMgb25seSB3aGVuIHBsYXlsaXN0IGlzIGxpdmUKLSAgICAgICAgICAgIGludDMyX3Qgc3RhcnREaXNjb250aW51aXR5U2VxID0gMCwKLSAgICAgICAgICAgIGJvb2wgYWRhcHRpdmUgPSBmYWxzZSk7CisgICAgICAgICAgICBpbnQzMl90IHN0YXJ0RGlzY29udGludWl0eVNlcSA9IC0xLAorICAgICAgICAgICAgTGl2ZVNlc3Npb246OlNlZWtNb2RlIHNlZWtNb2RlID0gTGl2ZVNlc3Npb246OmtTZWVrTW9kZUV4YWN0UG9zaXRpb24pOwogCi0gICAgdm9pZCBwYXVzZUFzeW5jKCk7CisgICAgdm9pZCBwYXVzZUFzeW5jKGZsb2F0IHRocmVzaG9sZFJhdGlvLCBib29sIGRpc2Nvbm5lY3QpOwogCiAgICAgdm9pZCBzdG9wQXN5bmMoYm9vbCBjbGVhciA9IHRydWUpOwogCiAgICAgdm9pZCByZXN1bWVVbnRpbEFzeW5jKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKTsKIAorICAgIHZvaWQgZmV0Y2hQbGF5bGlzdEFzeW5jKCk7CisKICAgICB1aW50MzJfdCBnZXRTdHJlYW1UeXBlTWFzaygpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1TdHJlYW1UeXBlTWFzazsKICAgICB9CkBAIC05Myw4ICsxMDEsMTEgQEAKICAgICAgICAga1doYXRNb25pdG9yUXVldWUgICA9ICdtb25pJywKICAgICAgICAga1doYXRSZXN1bWVVbnRpbCAgICA9ICdyc21lJywKICAgICAgICAga1doYXREb3dubG9hZE5leHQgICA9ICdkbG54JywKKyAgICAgICAga1doYXRGZXRjaFBsYXlsaXN0ICA9ICdmbHN0JwogICAgIH07CiAKKyAgICBzdHJ1Y3QgRG93bmxvYWRTdGF0ZTsKKwogICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhNb25pdG9yRGVsYXlVczsKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtU2tpcEZyYW1lczsKIApAQCAtMTA1LDkgKzExNiwxMiBAQAogICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwogICAgIHNwPEFNZXNzYWdlPiBtU3RhcnRUaW1lVXNOb3RpZnk7CiAKKyAgICBzcDxIVFRQRG93bmxvYWRlcj4gbUhUVFBEb3dubG9hZGVyOwogICAgIHNwPExpdmVTZXNzaW9uPiBtU2Vzc2lvbjsKICAgICBBU3RyaW5nIG1VUkk7CiAKKyAgICBpbnQzMl90IG1GZXRjaGVySUQ7CisKICAgICB1aW50MzJfdCBtU3RyZWFtVHlwZU1hc2s7CiAgICAgaW50NjRfdCBtU3RhcnRUaW1lVXM7CiAKQEAgLTExNiw3ICsxMzAsNyBAQAogICAgIC8vIGFkYXB0aW5nIG9yIHN3aXRjaGluZyB0cmFja3MuCiAgICAgaW50NjRfdCBtU2VnbWVudFN0YXJ0VGltZVVzOwogCi0gICAgc3NpemVfdCBtRGlzY29udGludWl0eVNlcTsKKyAgICBpbnQzMl90IG1EaXNjb250aW51aXR5U2VxOwogICAgIGJvb2wgbVN0YXJ0VGltZVVzUmVsYXRpdmU7CiAgICAgc3A8QU1lc3NhZ2U+IG1TdG9wUGFyYW1zOyAvLyBtZXNzYWdlIGNvbnRhaW5pbmcgdGhlIGxhdGVzdCB0aW1lc3RhbXBzIHdlIHNob3VsZCBmZXRjaC4KIApAQCAtMTI2LDE3ICsxNDAsMjEgQEAKICAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBzcDxBQnVmZmVyPiA+IG1BRVNLZXlGb3JVUkk7CiAKICAgICBpbnQ2NF90IG1MYXN0UGxheWxpc3RGZXRjaFRpbWVVczsKKyAgICBpbnQ2NF90IG1QbGF5bGlzdFRpbWVVczsKICAgICBzcDxNM1VQYXJzZXI+IG1QbGF5bGlzdDsKICAgICBpbnQzMl90IG1TZXFOdW1iZXI7CiAgICAgaW50MzJfdCBtTnVtUmV0cmllczsKICAgICBib29sIG1TdGFydHVwOwotICAgIGJvb2wgbUFkYXB0aXZlOwotICAgIGJvb2wgbVByZXBhcmVkOworICAgIGJvb2wgbUlEUkZvdW5kOworICAgIGludDMyX3QgbVNlZWtNb2RlOworICAgIGJvb2wgbVRpbWVDaGFuZ2VTaWduYWxlZDsKICAgICBpbnQ2NF90IG1OZXh0UFRTVGltZVVzOwogCiAgICAgaW50MzJfdCBtTW9uaXRvclF1ZXVlR2VuZXJhdGlvbjsKICAgICBjb25zdCBpbnQzMl90IG1TdWJ0aXRsZUdlbmVyYXRpb247CiAKKyAgICBpbnQzMl90IG1MYXN0RGlzY29udGludWl0eVNlcTsKKwogICAgIGVudW0gUmVmcmVzaFN0YXRlIHsKICAgICAgICAgSU5JVElBTF9NSU5JTVVNX1JFTE9BRF9ERUxBWSwKICAgICAgICAgRklSU1RfVU5DSEFOR0VEX1JFTE9BRF9BVFRFTVBULApAQCAtMTUwLDkgKzE2OCw4IEBACiAgICAgc3A8QVRTUGFyc2VyPiBtVFNQYXJzZXI7CiAKICAgICBib29sIG1GaXJzdFBUU1ZhbGlkOwotICAgIHVpbnQ2NF90IG1GaXJzdFBUUzsKICAgICBpbnQ2NF90IG1GaXJzdFRpbWVVczsKLSAgICBpbnQ2NF90IG1BYnNvbHV0ZVRpbWVBbmNob3JVczsKKyAgICBpbnQ2NF90IG1TZWdtZW50Rmlyc3RQVFM7CiAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gbVZpZGVvQnVmZmVyOwogCiAgICAgLy8gU3RvcmVzIHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgdG8gZGVjcnlwdCB0aGUgbmV4dCBibG9jayBvZiBjaXBoZXIgdGV4dCwgd2hpY2ggY2FuCkBAIC0xNjAsNiArMTc3LDEzIEBACiAgICAgLy8gdGhlIGxhc3QgYmxvY2sgb2YgY2lwaGVyIHRleHQgKGNpcGhlci1ibG9jayBjaGFpbmluZykuCiAgICAgdW5zaWduZWQgY2hhciBtQUVTSW5pdFZlY1sxNl07CiAKKyAgICBNdXRleCBtVGhyZXNob2xkTG9jazsKKyAgICBmbG9hdCBtVGhyZXNob2xkUmF0aW87CisKKyAgICBzcDxEb3dubG9hZFN0YXRlPiBtRG93bmxvYWRTdGF0ZTsKKworICAgIGJvb2wgbUhhc01ldGFkYXRhOworCiAgICAgLy8gU2V0IGZpcnN0IHRvIHRydWUgaWYgZGVjcnlwdGluZyB0aGUgZmlyc3Qgc2VnbWVudCBvZiBhIHBsYXlsaXN0IHNlZ21lbnQuIFdoZW4KICAgICAvLyBmaXJzdCBpcyB0cnVlLCByZXNldCB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUKICAgICAvLyBpbmZvcm1hdGlvbiBpbiB0aGUgbWFuaWZlc3Q7IG90aGVyd2lzZSwgdXNlIHRoZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgYXMKQEAgLTE3NSw2ICsxOTksMTAgQEAKIAogICAgIHZvaWQgcG9zdE1vbml0b3JRdWV1ZShpbnQ2NF90IGRlbGF5VXMgPSAwLCBpbnQ2NF90IG1pbkRlbGF5VXMgPSAwKTsKICAgICB2b2lkIGNhbmNlbE1vbml0b3JRdWV1ZSgpOworICAgIHZvaWQgc2V0U3RvcHBpbmdUaHJlc2hvbGQoZmxvYXQgdGhyZXNob2xkUmF0aW8sIGJvb2wgZGlzY29ubmVjdCk7CisgICAgdm9pZCByZXNldFN0b3BwaW5nVGhyZXNob2xkKGJvb2wgZGlzY29ubmVjdCk7CisgICAgZmxvYXQgZ2V0U3RvcHBpbmdUaHJlc2hvbGQoKTsKKyAgICBib29sIHNob3VsZFBhdXNlRG93bmxvYWQoKTsKIAogICAgIGludDY0X3QgZGVsYXlVc1RvUmVmcmVzaFBsYXlsaXN0KCkgY29uc3Q7CiAgICAgc3RhdHVzX3QgcmVmcmVzaFBsYXlsaXN0KCk7CkBAIC0xODIsMTIgKzIxMCwxOSBAQAogICAgIC8vIFJldHVybnMgdGhlIG1lZGlhIHRpbWUgaW4gdXMgb2YgdGhlIHNlZ21lbnQgc3BlY2lmaWVkIGJ5IHNlcU51bWJlci4KICAgICAvLyBUaGlzIGlzIGNvbXB1dGVkIGJ5IHN1bW1pbmcgdGhlIGR1cmF0aW9ucyBvZiBhbGwgc2VnbWVudHMgYmVmb3JlIGl0LgogICAgIGludDY0X3QgZ2V0U2VnbWVudFN0YXJ0VGltZVVzKGludDMyX3Qgc2VxTnVtYmVyKSBjb25zdDsKKyAgICAvLyBSZXR1cm5zIHRoZSBkdXJhdGlvbiB0aW1lIGluIHVzIG9mIHRoZSBzZWdtZW50IHNwZWNpZmllZC4KKyAgICBpbnQ2NF90IGdldFNlZ21lbnREdXJhdGlvblVzKGludDMyX3Qgc2VxTnVtYmVyKSBjb25zdDsKIAogICAgIHN0YXR1c190IG9uU3RhcnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogICAgIHZvaWQgb25QYXVzZSgpOwogICAgIHZvaWQgb25TdG9wKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKICAgICB2b2lkIG9uTW9uaXRvclF1ZXVlKCk7CiAgICAgdm9pZCBvbkRvd25sb2FkTmV4dCgpOworICAgIGJvb2wgaW5pdERvd25sb2FkU3RhdGUoCisgICAgICAgICAgICBBU3RyaW5nICZ1cmksCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gJml0ZW1NZXRhLAorICAgICAgICAgICAgaW50MzJfdCAmZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0LAorICAgICAgICAgICAgaW50MzJfdCAmbGFzdFNlcU51bWJlckluUGxheWxpc3QpOwogCiAgICAgLy8gUmVzdW1lIGEgZmV0Y2hlciB0byBjb250aW51ZSB1bnRpbCB0aGUgc3RvcHBpbmcgcG9pbnQgc3RvcmVkIGluIG1zZy4KICAgICBzdGF0dXNfdCBvblJlc3VtZVVudGlsKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKQEAgLTE5NiwyNSArMjMxLDI0IEBACiAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCwKICAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZzb3VyY2UsCiAgICAgICAgICAgICBib29sIGRpc2NhcmQgPSBmYWxzZSk7CisgICAgYm9vbCBpc1N0YXJ0VGltZVJlYWNoZWQoaW50NjRfdCB0aW1lVXMpOwogICAgIHN0YXR1c190IGV4dHJhY3RBbmRRdWV1ZUFjY2Vzc1VuaXRzRnJvbVRzKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogCiAgICAgc3RhdHVzX3QgZXh0cmFjdEFuZFF1ZXVlQWNjZXNzVW5pdHMoCiAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLCBjb25zdCBzcDxBTWVzc2FnZT4gJml0ZW1NZXRhKTsKIAorICAgIHZvaWQgbm90aWZ5U3RvcFJlYWNoZWQoKTsKICAgICB2b2lkIG5vdGlmeUVycm9yKHN0YXR1c190IGVycik7CiAKICAgICB2b2lkIHF1ZXVlRGlzY29udGludWl0eSgKICAgICAgICAgICAgIEFUU1BhcnNlcjo6RGlzY29udGludWl0eVR5cGUgdHlwZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZleHRyYSk7CiAKLSAgICBpbnQzMl90IGdldFNlcU51bWJlcldpdGhBbmNob3JUaW1lKGludDY0X3QgYW5jaG9yVGltZVVzKSBjb25zdDsKKyAgICBib29sIGFkanVzdFNlcU51bWJlcldpdGhBbmNob3JUaW1lKGludDY0X3QgYW5jaG9yVGltZVVzKTsKICAgICBpbnQzMl90IGdldFNlcU51bWJlckZvckRpc2NvbnRpbnVpdHkoc2l6ZV90IGRpc2NvbnRpbnVpdHlTZXEpIGNvbnN0OwogICAgIGludDMyX3QgZ2V0U2VxTnVtYmVyRm9yVGltZShpbnQ2NF90IHRpbWVVcykgY29uc3Q7CiAKICAgICB2b2lkIHVwZGF0ZUR1cmF0aW9uKCk7Ci0KLSAgICAvLyBCZWZvcmUgcmVzdW1pbmcgYSBmZXRjaGVyIGluIG9uUmVzdW1lLCBjaGVjayB0aGUgcmVtYWluaW5nIGR1cmF0aW9uIGlzIGxvbmdlciB0aGFuIHRoYXQKLSAgICAvLyByZXR1cm5lZCBieSByZXN1bWVUaHJlc2hvbGQuCi0gICAgaW50NjRfdCByZXN1bWVUaHJlc2hvbGQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgdXBkYXRlVGFyZ2V0RHVyYXRpb24oKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBsYXlsaXN0RmV0Y2hlcik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5tawppbmRleCAyMTk0YzM4Li42OGJkMDE3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5tawpAQCAtNCw3ICs0LDggQEAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAJSUQzLmNwcAogCi1MT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKIAogTE9DQUxfTU9EVUxFIDo9IGxpYnN0YWdlZnJpZ2h0X2lkMwogCkBAIC0xNyw3ICsxOCw4IEBACiBMT0NBTF9TUkNfRklMRVMgOj0gXAogCXRlc3RpZDMuY3BwCiAKLUxPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJzdGFnZWZyaWdodCBsaWJ1dGlscyBsaWJsb2cgbGliYmluZGVyIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQXdlc29tZVBsYXllci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgKaW5kZXggNzdkNjVlMC4uNzU4YjJjOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Bd2Vzb21lUGxheWVyLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlICJIVFRQQmFzZS5oIgogI2luY2x1ZGUgIlRpbWVkRXZlbnRRdWV1ZS5oIgogCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KQEAgLTMxLDIwICszMiwyMCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBBdWRpb1BsYXllcjsKK2NsYXNzIEF1ZGlvUGxheWVyOwogc3RydWN0IENsb2NrRXN0aW1hdG9yOwotc3RydWN0IERhdGFTb3VyY2U7Ci1zdHJ1Y3QgTWVkaWFCdWZmZXI7CitjbGFzcyBJRGF0YVNvdXJjZTsKK2NsYXNzIE1lZGlhQnVmZmVyOwogc3RydWN0IE1lZGlhRXh0cmFjdG9yOwogc3RydWN0IE1lZGlhU291cmNlOwogc3RydWN0IE51Q2FjaGVkU291cmNlMjsKLXN0cnVjdCBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworY2xhc3MgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKIAogY2xhc3MgRHJtTWFuYWdlckNsaW5ldDsKIGNsYXNzIERlY3J5cHRIYW5kbGU7CiAKIGNsYXNzIFRpbWVkVGV4dERyaXZlcjsKLXN0cnVjdCBXVk1FeHRyYWN0b3I7CitjbGFzcyBXVk1FeHRyYWN0b3I7CiAKIHN0cnVjdCBBd2Vzb21lUmVuZGVyZXIgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgQXdlc29tZVJlbmRlcmVyKCkge30KQEAgLTkzLDYgKzk0LDggQEAKIAogICAgIHN0YXR1c190IHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpOwogICAgIHN0YXR1c190IGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KTsKKyAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKTsKKyAgICBzdGF0dXNfdCBnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlIC8qIG5vbm51bGwgKi8pOwogICAgIHN0YXR1c190IGludm9rZShjb25zdCBQYXJjZWwgJnJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpOwogICAgIHN0YXR1c190IHNldENhY2hlU3RhdENvbGxlY3RGcmVxKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7CiAKQEAgLTE4MCw2ICsxODMsNyBAQAogICAgIHNwPE1lZGlhU291cmNlPiBtT214U291cmNlOwogICAgIHNwPE1lZGlhU291cmNlPiBtQXVkaW9Tb3VyY2U7CiAgICAgQXVkaW9QbGF5ZXIgKm1BdWRpb1BsYXllcjsKKyAgICBBdWRpb1BsYXliYWNrUmF0ZSBtUGxheWJhY2tTZXR0aW5nczsKICAgICBpbnQ2NF90IG1EdXJhdGlvblVzOwogCiAgICAgaW50MzJfdCBtRGlzcGxheVdpZHRoOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9DYWxsYmFja0RhdGFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQ2FsbGJhY2tEYXRhU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEyMWRkMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQ2FsbGJhY2tEYXRhU291cmNlLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0NBTExCQUNLREFUQVNPVVJDRV9ICisjZGVmaW5lIEFORFJPSURfQ0FMTEJBQ0tEQVRBU09VUkNFX0gKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElEYXRhU291cmNlOworY2xhc3MgSU1lbW9yeTsKKworLy8gQSBzdGFnZWZyaWdodCBEYXRhU291cmNlIHRoYXQgd3JhcHMgYSBiaW5kZXIgSURhdGFTb3VyY2UuIEl0J3MgYSAiQ2FsbGJhY2siCisvLyBEYXRhU291cmNlIGJlY2F1c2UgaXQgY2FsbHMgYmFjayB0byB0aGUgSURhdGFTb3VyY2UgZm9yIGRhdGEuCitjbGFzcyBDYWxsYmFja0RhdGFTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZSB7CitwdWJsaWM6CisgICAgQ2FsbGJhY2tEYXRhU291cmNlKGNvbnN0IHNwPElEYXRhU291cmNlPiYgaURhdGFTb3VyY2UpOworICAgIHZpcnR1YWwgfkNhbGxiYWNrRGF0YVNvdXJjZSgpOworCisgICAgLy8gRGF0YVNvdXJjZSBpbXBsZW1lbnRhdGlvbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CisKK3ByaXZhdGU6CisgICAgc3A8SURhdGFTb3VyY2U+IG1JRGF0YVNvdXJjZTsKKyAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ2FsbGJhY2tEYXRhU291cmNlKTsKK307CisKKworLy8gQSBjYWNoaW5nIERhdGFTb3VyY2UgdGhhdCB3cmFwcyBhIENhbGxiYWNrRGF0YVNvdXJjZS4gRm9yIHJlYWRzIHNtYWxsZXIKKy8vIHRoYW4ga0NhY2hlU2l6ZSBpdCB3aWxsIHJlYWQgdXAgdG8ga0NhY2hlU2l6ZSBhaGVhZCBhbmQgY2FjaGUgaXQuCisvLyBUaGlzIHJlZHVjZXMgdGhlIG51bWJlciBvZiBiaW5kZXIgcm91bmQgdHJpcHMgdG8gdGhlIElEYXRhU291cmNlIGFuZCBoYXMgYSBzaWduaWZpY2FudAorLy8gaW1wYWN0IG9uIHRpbWUgdGFrZW4gZm9yIGZpbGV0eXBlIHNuaWZmaW5nIGFuZCBtZXRhZGF0YSBleHRyYWN0aW9uLgorY2xhc3MgVGlueUNhY2hlU291cmNlIDogcHVibGljIERhdGFTb3VyY2UgeworcHVibGljOgorICAgIFRpbnlDYWNoZVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiYgc291cmNlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90KiBzaXplKTsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CisKK3ByaXZhdGU6CisgICAgLy8gMmtiIGNvbWVzIGZyb20gZXhwZXJpbWVudGluZyB3aXRoIHRoZSB0aW1lLXRvLWZpcnN0LWZyYW1lIGZyb20gYSBNZWRpYVBsYXllcgorICAgIC8vIHdpdGggYW4gaW4tbWVtb3J5IE1lZGlhRGF0YVNvdXJjZSBzb3VyY2Ugb24gYSBOZXh1cyA1LiBCZXlvbmQgMmtiIHRoZXJlIHdhcworICAgIC8vIG5vIGltcHJvdmVtZW50LgorICAgIGVudW0geworICAgICAgICBrQ2FjaGVTaXplID0gMjA0OCwKKyAgICB9OworCisgICAgc3A8RGF0YVNvdXJjZT4gbVNvdXJjZTsKKyAgICB1aW50OF90IG1DYWNoZVtrQ2FjaGVTaXplXTsKKyAgICBvZmY2NF90IG1DYWNoZWRPZmZzZXQ7CisgICAgc2l6ZV90IG1DYWNoZWRTaXplOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGlueUNhY2hlU291cmNlKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0NBTExCQUNLREFUQVNPVVJDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyUFNFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJQU0V4dHJhY3Rvci5oCmluZGV4IGZiNzY1NjQuLjIyY2IwMmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJQU0V4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJQU0V4dHJhY3Rvci5oCkBAIC0yOCw3ICsyOCw3IEBACiBzdHJ1Y3QgQUJ1ZmZlcjsKIHN0cnVjdCBBTWVzc2FnZTsKIHN0cnVjdCBUcmFjazsKLXN0cnVjdCBTdHJpbmc4OworY2xhc3MgU3RyaW5nODsKIAogc3RydWN0IE1QRUcyUFNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewogICAgIE1QRUcyUFNFeHRyYWN0b3IoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUcyVFNFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCmluZGV4IGRiMTE4N2QuLjhlYjhmNmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzJUU0V4dHJhY3Rvci5oCkBAIC0yMCw3ICsyMCw5IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0zMCw3ICszMiw3IEBACiBzdHJ1Y3QgQVRTUGFyc2VyOwogY2xhc3MgRGF0YVNvdXJjZTsKIHN0cnVjdCBNUEVHMlRTU291cmNlOwotc3RydWN0IFN0cmluZzg7CitjbGFzcyBTdHJpbmc4OwogCiBzdHJ1Y3QgTVBFRzJUU0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CiAgICAgTVBFRzJUU0V4dHJhY3Rvcihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKTsKQEAgLTU0LDEwICs1NiwyMSBAQAogCiAgICAgVmVjdG9yPHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ID4gbVNvdXJjZUltcGxzOwogCisgICAgVmVjdG9yPEtleWVkVmVjdG9yPGludDY0X3QsIG9mZjY0X3Q+ID4gbVN5bmNQb2ludHM7CisgICAgLy8gU3luYyBwb2ludHMgdXNlZCBmb3Igc2Vla2luZyAtLS0gbm9ybWFsbHkgb25lIGZvciB2aWRlbyB0cmFjayBpcyB1c2VkLgorICAgIC8vIElmIG5vIHZpZGVvIHRyYWNrIGlzIHByZXNlbnQsIGF1ZGlvIHRyYWNrIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLgorICAgIEtleWVkVmVjdG9yPGludDY0X3QsIG9mZjY0X3Q+ICptU2Vla1N5bmNQb2ludHM7CisKICAgICBvZmY2NF90IG1PZmZzZXQ7CiAKICAgICB2b2lkIGluaXQoKTsKICAgICBzdGF0dXNfdCBmZWVkTW9yZSgpOworICAgIHN0YXR1c190IHNlZWsoaW50NjRfdCBzZWVrVGltZVVzLAorICAgICAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSYgc2Vla01vZGUpOworICAgIHN0YXR1c190IHF1ZXVlRGlzY29udGludWl0eUZvclNlZWsoaW50NjRfdCBhY3R1YWxTZWVrVGltZVVzKTsKKyAgICBzdGF0dXNfdCBzZWVrQmV5b25kKGludDY0X3Qgc2Vla1RpbWVVcyk7CisKKyAgICBzdGF0dXNfdCBmZWVkVW50aWxCdWZmZXJBdmFpbGFibGUoY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwpOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTVBFRzJUU0V4dHJhY3Rvcik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9NUEVHNEV4dHJhY3Rvci5oCmluZGV4IDFmZTZmY2YuLjMwNjdjM2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTVBFRzRFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL01QRUc0RXh0cmFjdG9yLmgKQEAgLTgzLDYgKzgzLDggQEAKIAogICAgIFZlY3RvcjxTaWR4RW50cnk+IG1TaWR4RW50cmllczsKICAgICBvZmY2NF90IG1Nb29mT2Zmc2V0OworICAgIGJvb2wgbU1vb2ZGb3VuZDsKKyAgICBib29sIG1NZGF0Rm91bmQ7CiAKICAgICBWZWN0b3I8UHNzaEluZm8+IG1Qc3NoOwogCkBAIC0xMDIsMTEgKzEwNCwxNSBAQAogICAgIFN0cmluZzggbUxhc3RDb21tZW50TmFtZTsKICAgICBTdHJpbmc4IG1MYXN0Q29tbWVudERhdGE7CiAKKyAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgQVN0cmluZz4gbU1ldGFLZXlNYXA7CisKICAgICBzdGF0dXNfdCByZWFkTWV0YURhdGEoKTsKICAgICBzdGF0dXNfdCBwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCwgaW50IGRlcHRoKTsKICAgICBzdGF0dXNfdCBwYXJzZUlUdW5lc01ldGFEYXRhKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CiAgICAgc3RhdHVzX3QgcGFyc2UzR1BQTWV0YURhdGEob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBpbnQgZGVwdGgpOwogICAgIHZvaWQgcGFyc2VJRDN2Mk1ldGFEYXRhKG9mZjY0X3Qgb2Zmc2V0KTsKKyAgICBzdGF0dXNfdCBwYXJzZVFUTWV0YUtleShvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgZGF0YV9zaXplKTsKKyAgICBzdGF0dXNfdCBwYXJzZVFUTWV0YVZhbChpbnQzMl90IGtleUlkLCBvZmY2NF90IGRhdGFfb2Zmc2V0LCBzaXplX3QgZGF0YV9zaXplKTsKIAogICAgIHN0YXR1c190IHVwZGF0ZUF1ZGlvVHJhY2tJbmZvRnJvbUVTRFNfTVBFRzRBdWRpbygKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmVzZHNfZGF0YSwgc2l6ZV90IGVzZHNfc2l6ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVguaAppbmRleCA4MjljMzhiLi5iMjBiMmVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YLmgKQEAgLTI0LDcgKzI0LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IE9NWE1hc3RlcjsKLWNsYXNzIE9NWE5vZGVJbnN0YW5jZTsKK3N0cnVjdCBPTVhOb2RlSW5zdGFuY2U7CiAKIGNsYXNzIE9NWCA6IHB1YmxpYyBCbk9NWCwKICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CkBAIC02OSw3ICs2OSw3IEBACiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX1UzMiogdXNhZ2UpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzKAotICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSk7CisgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgT01YX0JPT0wgZW5hYmxlLCBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjaygKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwKQEAgLTgxLDcgKzgxLDcgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgdXNlQnVmZmVyKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCi0gICAgICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgT01YX0JPT0wgY3Jvc3NQcm9jZXNzKTsKKyAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfVTMyIGFsbG90dGVkU2l6ZSwgT01YX0JPT0wgY3Jvc3NQcm9jZXNzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgdXNlR3JhcGhpY0J1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LApAQCAtOTMsNyArOTMsMTcgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdXJmYWNlKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsCi0gICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIpOworICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyLAorICAgICAgICAgICAgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGVyc2lzdGVudElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlciwKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICpidWZmZXJDb25zdW1lcik7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LAorICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gJmJ1ZmZlckNvbnN1bWVyLAorICAgICAgICAgICAgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbShub2RlX2lkIG5vZGUpOwogCkBAIC0xMDMsMTggKzExMywxOCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcldpdGhCYWNrdXAoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKLSAgICAgICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfQk9PTCBjcm9zc1Byb2Nlc3MpOworICAgICAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIE9NWF9VMzIgYWxsb3R0ZWRTaXplLCBPTVhfQk9PTCBjcm9zc1Byb2Nlc3MpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBmcmVlQnVmZmVyKAogICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGJ1ZmZlcl9pZCBidWZmZXIpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmaWxsQnVmZmVyKG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlcik7CisgICAgdmlydHVhbCBzdGF0dXNfdCBmaWxsQnVmZmVyKG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgaW50IGZlbmNlRmQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBlbXB0eUJ1ZmZlcigKICAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwKICAgICAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIsCiAgICAgICAgICAgICBPTVhfVTMyIHJhbmdlX29mZnNldCwgT01YX1UzMiByYW5nZV9sZW5ndGgsCi0gICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXAsIGludCBmZW5jZUZkKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RXh0ZW5zaW9uSW5kZXgoCiAgICAgICAgICAgICBub2RlX2lkIG5vZGUsCkBAIC0xNDAsMTAgKzE1MCwxMCBAQAogICAgICAgICAgICAgT01YX0lOIE9NWF9QVFIgcEV2ZW50RGF0YSk7CiAKICAgICBPTVhfRVJST1JUWVBFIE9uRW1wdHlCdWZmZXJEb25lKAotICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyLCBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXIpOworICAgICAgICAgICAgbm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyLCBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXIsIGludCBmZW5jZUZkKTsKIAogICAgIE9NWF9FUlJPUlRZUEUgT25GaWxsQnVmZmVyRG9uZSgKLSAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKTsKKyAgICAgICAgICAgIG5vZGVfaWQgbm9kZSwgYnVmZmVyX2lkIGJ1ZmZlciwgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyLCBpbnQgZmVuY2VGZCk7CiAKICAgICB2b2lkIGludmFsaWRhdGVOb2RlSUQobm9kZV9pZCBub2RlKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT01YTm9kZUluc3RhbmNlLmgKaW5kZXggNjE2ZGRhMS4uYmQzM2FiNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PTVhOb2RlSW5zdGFuY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09NWE5vZGVJbnN0YW5jZS5oCkBAIC0yOCw3ICsyOCw5IEBACiAKIGNsYXNzIElPTVhPYnNlcnZlcjsKIHN0cnVjdCBPTVhNYXN0ZXI7Ci1zdHJ1Y3QgR3JhcGhpY0J1ZmZlclNvdXJjZTsKK2NsYXNzIEdyYXBoaWNCdWZmZXJTb3VyY2U7CisKK3N0YXR1c190IFN0YXR1c0Zyb21PTVhFcnJvcihPTVhfRVJST1JUWVBFIGVycik7CiAKIHN0cnVjdCBPTVhOb2RlSW5zdGFuY2UgewogICAgIE9NWE5vZGVJbnN0YW5jZSgKQEAgLTU3LDcgKzU5LDggQEAKIAogICAgIHN0YXR1c190IGdldEdyYXBoaWNCdWZmZXJVc2FnZShPTVhfVTMyIHBvcnRJbmRleCwgT01YX1UzMiogdXNhZ2UpOwogCi0gICAgc3RhdHVzX3Qgc3RvcmVNZXRhRGF0YUluQnVmZmVycyhPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlKTsKKyAgICBzdGF0dXNfdCBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKTsKIAogICAgIHN0YXR1c190IHByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKAogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwKQEAgLTY5LDcgKzcyLDcgQEAKIAogICAgIHN0YXR1c190IHVzZUJ1ZmZlcigKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAotICAgICAgICAgICAgT01YOjpidWZmZXJfaWQgKmJ1ZmZlciwgT01YX0JPT0wgY3Jvc3NQcm9jZXNzKTsKKyAgICAgICAgICAgIE9NWDo6YnVmZmVyX2lkICpidWZmZXIsIE9NWF9VMzIgYWxsb3R0ZWRTaXplLCBPTVhfQk9PTCBjcm9zc1Byb2Nlc3MpOwogCiAgICAgc3RhdHVzX3QgdXNlR3JhcGhpY0J1ZmZlcigKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmZ3JhcGhpY0J1ZmZlciwKQEAgLTgwLDcgKzgzLDE2IEBACiAgICAgICAgICAgICBPTVg6OmJ1ZmZlcl9pZCBidWZmZXIpOwogCiAgICAgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdXJmYWNlKAotICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlcik7CisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyLAorICAgICAgICAgICAgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBjcmVhdGVQZXJzaXN0ZW50SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyLAorICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gKmJ1ZmZlckNvbnN1bWVyKTsKKworICAgIHN0YXR1c190IHNldElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAmYnVmZmVyQ29uc3VtZXIsCisgICAgICAgICAgICBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUpOwogCiAgICAgc3RhdHVzX3Qgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpOwogCkBAIC05MCwyMSArMTAyLDIwIEBACiAKICAgICBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcldpdGhCYWNrdXAoCiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKLSAgICAgICAgICAgIE9NWDo6YnVmZmVyX2lkICpidWZmZXIsIE9NWF9CT09MIGNyb3NzUHJvY2Vzcyk7CisgICAgICAgICAgICBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfVTMyIGFsbG90dGVkU2l6ZSwgT01YX0JPT0wgY3Jvc3NQcm9jZXNzKTsKIAogICAgIHN0YXR1c190IGZyZWVCdWZmZXIoT01YX1UzMiBwb3J0SW5kZXgsIE9NWDo6YnVmZmVyX2lkIGJ1ZmZlcik7CiAKLSAgICBzdGF0dXNfdCBmaWxsQnVmZmVyKE9NWDo6YnVmZmVyX2lkIGJ1ZmZlcik7CisgICAgc3RhdHVzX3QgZmlsbEJ1ZmZlcihPTVg6OmJ1ZmZlcl9pZCBidWZmZXIsIGludCBmZW5jZUZkKTsKIAogICAgIHN0YXR1c190IGVtcHR5QnVmZmVyKAogICAgICAgICAgICAgT01YOjpidWZmZXJfaWQgYnVmZmVyLAogICAgICAgICAgICAgT01YX1UzMiByYW5nZU9mZnNldCwgT01YX1UzMiByYW5nZUxlbmd0aCwKLSAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXApOworICAgICAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCwgaW50IGZlbmNlRmQpOwogCi0gICAgc3RhdHVzX3QgZW1wdHlEaXJlY3RCdWZmZXIoCi0gICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyLAotICAgICAgICAgICAgT01YX1UzMiByYW5nZU9mZnNldCwgT01YX1UzMiByYW5nZUxlbmd0aCwKLSAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXApOworICAgIHN0YXR1c190IGVtcHR5R3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIsIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCk7CiAKICAgICBzdGF0dXNfdCBnZXRFeHRlbnNpb25JbmRleCgKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhcmFtZXRlck5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KTsKQEAgLTExOSw2ICsxMzAsOCBAQAogICAgICAgICByZXR1cm4gbUlzU2VjdXJlOwogICAgIH0KIAorICAgIC8vIGhhbmRsZXMgbWVzc2FnZXMgYW5kIHJlbW92ZXMgdGhlbSBmcm9tIHRoZSBsaXN0CisgICAgdm9pZCBvbk1lc3NhZ2VzKHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT4gJm1lc3NhZ2VzKTsKICAgICB2b2lkIG9uTWVzc2FnZShjb25zdCBvbXhfbWVzc2FnZSAmbXNnKTsKICAgICB2b2lkIG9uT2JzZXJ2ZXJEaWVkKE9NWE1hc3RlciAqbWFzdGVyKTsKICAgICB2b2lkIG9uR2V0SGFuZGxlRmFpbGVkKCk7CkBAIC0xNTYsOSArMTY5LDcgQEAKICAgICB1aW50MzJfdCBtQnVmZmVySURDb3VudDsKICAgICBLZXllZFZlY3RvcjxPTVg6OmJ1ZmZlcl9pZCwgT01YX0JVRkZFUkhFQURFUlRZUEUgKj4gbUJ1ZmZlcklEVG9CdWZmZXJIZWFkZXI7CiAgICAgS2V5ZWRWZWN0b3I8T01YX0JVRkZFUkhFQURFUlRZUEUgKiwgT01YOjpidWZmZXJfaWQ+IG1CdWZmZXJIZWFkZXJUb0J1ZmZlcklEOwotCi0gICAgLy8gbWV0YWRhdGEgbW9kZSB0cmFja2luZwotICAgIGJvb2wgbVVzaW5nTWV0YWRhdGFbMl07CisgICAgTWV0YWRhdGFCdWZmZXJUeXBlIG1NZXRhZGF0YVR5cGVbMl07CiAKICAgICAvLyBGb3IgZGVidWcgc3VwcG9ydAogICAgIGNoYXIgKm1OYW1lOwpAQCAtMjA4LDE2ICsyMTksMzUgQEAKICAgICAgICAgICAgIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlcik7CiAKICAgICBzdGF0dXNfdCBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzX2woCi0gICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAotICAgICAgICAgICAgT01YX0JPT0wgdXNlR3JhcGhpY0J1ZmZlciwgT01YX0JPT0wgKnVzaW5nR3JhcGhpY0J1ZmZlckluTWV0YSk7CisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLCBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUpOworCisgICAgLy8gU3RvcmVzIGZlbmNlIGludG8gYnVmZmVyIGlmIGl0IGlzIEFOV0J1ZmZlciB0eXBlIGFuZCBoYXMgZW5vdWdoIHNwYWNlLgorICAgIC8vIG90aGVyd2lzZSwgd2FpdHMgZm9yIHRoZSBmZW5jZSB0byBzaWduYWwuICBUYWtlcyBvd25lcnNoaXAgb2YgfGZlbmNlRmR8LgorICAgIHN0YXR1c190IHN0b3JlRmVuY2VJbk1ldGFfbCgKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIsIGludCBmZW5jZUZkLCBPTVhfVTMyIHBvcnRJbmRleCk7CisKKyAgICAvLyBSZXRyaWV2ZXMgdGhlIGZlbmNlIGZyb20gYnVmZmVyIGlmIEFOV0J1ZmZlciB0eXBlIGFuZCBoYXMgZW5vdWdoIHNwYWNlLiBPdGhlcndpc2UsIHJldHVybnMgLTEKKyAgICBpbnQgcmV0cmlldmVGZW5jZUZyb21NZXRhX2woCisgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyLCBPTVhfVTMyIHBvcnRJbmRleCk7CiAKICAgICBzdGF0dXNfdCBlbXB0eUJ1ZmZlcl9sKAogICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciwKLSAgICAgICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXAsIGludHB0cl90IGRlYnVnQWRkcik7CisgICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnRwdHJfdCBkZWJ1Z0FkZHIsIGludCBmZW5jZUZkKTsKIAorICAgIHN0YXR1c190IHVwZGF0ZUdyYXBoaWNCdWZmZXJJbk1ldGFfbCgKKyAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmZ3JhcGhpY0J1ZmZlciwKKyAgICAgICAgICAgIE9NWDo6YnVmZmVyX2lkIGJ1ZmZlciwgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlcik7CisKKyAgICBzdGF0dXNfdCBjcmVhdGVHcmFwaGljQnVmZmVyU291cmNlKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyIC8qIG51bGxhYmxlICovLAorICAgICAgICAgICAgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKTsKICAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBnZXRHcmFwaGljQnVmZmVyU291cmNlKCk7CiAgICAgdm9pZCBzZXRHcmFwaGljQnVmZmVyU291cmNlKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBidWZmZXJTb3VyY2UpOwogCisgICAgLy8gSGFuZGxlcyB8bXNnfCwgYW5kIG1heSBtb2RpZnkgaXQuIFJldHVybnMgdHJ1ZSBpZmYgY29tcGxldGVseSBoYW5kbGVkIGl0IGFuZAorICAgIC8vIHxtc2d8IGRvZXMgbm90IG5lZWQgdG8gYmUgc2VudCB0byB0aGUgZXZlbnQgbGlzdGVuZXIuCisgICAgYm9vbCBoYW5kbGVNZXNzYWdlKG9teF9tZXNzYWdlICZtc2cpOworCiAgICAgT01YTm9kZUluc3RhbmNlKGNvbnN0IE9NWE5vZGVJbnN0YW5jZSAmKTsKICAgICBPTVhOb2RlSW5zdGFuY2UgJm9wZXJhdG9yPShjb25zdCBPTVhOb2RlSW5zdGFuY2UgJik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PZ2dFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvT2dnRXh0cmFjdG9yLmgKaW5kZXggZTk3YzhjZC4uYzY0N2NiYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9PZ2dFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL09nZ0V4dHJhY3Rvci5oCkBAIC0yNyw3ICsyNyw3IEBACiBjbGFzcyBEYXRhU291cmNlOwogY2xhc3MgU3RyaW5nODsKIAotc3RydWN0IE15Vm9yYmlzRXh0cmFjdG9yOworc3RydWN0IE15T2dnRXh0cmFjdG9yOwogc3RydWN0IE9nZ1NvdXJjZTsKIAogc3RydWN0IE9nZ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CkBAIC00OCw3ICs0OCw3IEBACiAgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKIAotICAgIE15Vm9yYmlzRXh0cmFjdG9yICptSW1wbDsKKyAgICBNeU9nZ0V4dHJhY3RvciAqbUltcGw7CiAKICAgICBPZ2dFeHRyYWN0b3IoY29uc3QgT2dnRXh0cmFjdG9yICYpOwogICAgIE9nZ0V4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE9nZ0V4dHJhY3RvciAmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlSXRlcmF0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2FtcGxlSXRlcmF0b3IuaAppbmRleCA2MGM5ZTdlLi43MDUzMjQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NhbXBsZUl0ZXJhdG9yLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TYW1wbGVJdGVyYXRvci5oCkBAIC0xOCw3ICsxOCw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IFNhbXBsZVRhYmxlOworY2xhc3MgU2FtcGxlVGFibGU7CiAKIHN0cnVjdCBTYW1wbGVJdGVyYXRvciB7CiAgICAgU2FtcGxlSXRlcmF0b3IoU2FtcGxlVGFibGUgKnRhYmxlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdE9NWENvbXBvbmVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0T01YQ29tcG9uZW50LmgKaW5kZXggYTM5Yzg5My4uM2FiNmY4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0T01YQ29tcG9uZW50LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0T01YQ29tcG9uZW50LmgKQEAgLTE2OCw0OCArMTY4LDE2IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdE9NWENvbXBvbmVudCk7CiB9OwogCi0vLyBtaW5pbWFsIGltcGxlbWVudGF0aW9ucyBvZiBpc19zYW1lIGFuZCBzdGF0aWNfYXNzZXJ0IHRoYXQgd29yayBvbiBLLAotLy8gdGhvdWdoIGVycm9yIG1lc3NhZ2VzIGFyZSBtaW5pbWFsCi0KLS8vIGEgdHlwZSB0aGF0IGhhcyBhIG1lbWJlciBjb25zdGFudCBvZiBhIHNwZWNpZmllZCB0eXBlIGFuZCB2YWx1ZQotdGVtcGxhdGU8dHlwZW5hbWUgVCwgVCBzb21ldmFsdWU+Ci1zdHJ1Y3QgY29tcGF0X2ludGVncmFsX2NvbnN0YW50Ci17Ci0gICAgc3RhdGljIGNvbnN0IFQgdmFsdWUgPSBzb21ldmFsdWU7Ci19OwotCi0vLyB0eXBlcyB0byBob2xkIHRydWUgYW5kIGZhbHNlCi10eXBlZGVmIGNvbXBhdF9pbnRlZ3JhbF9jb25zdGFudDxib29sLCB0cnVlPiBjb21wYXRfdHJ1ZV90eXBlOwotdHlwZWRlZiBjb21wYXRfaW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgZmFsc2U+IGNvbXBhdF9mYWxzZV90eXBlOwotCi0vLyBhIHR5cGUgdGhhdCBpbmRpY2F0ZXMgdHdvIG90aGVyIHR5cGVzIGFyZSBkaWZmZXJlbnQKLXRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gc3RydWN0IGNvbXBhdF9pc19zYW1lIDogcHVibGljIGNvbXBhdF9mYWxzZV90eXBlIHsgfTsKLQotLy8gYSB0eXBlIHRoYXQgaW5kaWNhdGVzIHR3byBvdGhlciB0eXBlcyBhcmUgdGhlIHNhbWUKLXRlbXBsYXRlPHR5cGVuYW1lIHNhbWV0eXBlPiBzdHJ1Y3QgY29tcGF0X2lzX3NhbWU8c2FtZXR5cGUsIHNhbWV0eXBlPiA6IHB1YmxpYyBjb21wYXRfdHJ1ZV90eXBlIHsgfTsKLS8vIGZvciB0aGUgc3BlY2lmaWMgdXNlIGJlbG93LCB3ZSB3YW50IHRvIGNvbnNpZGVyICJjb25zdCB0eXBlIiBhbmQgInR5cGUiIHRvIGJlIHRoZSBzYW1lCi10ZW1wbGF0ZTx0eXBlbmFtZSBzYW1ldHlwZT4gc3RydWN0IGNvbXBhdF9pc19zYW1lPGNvbnN0IHNhbWV0eXBlLCBzYW1ldHlwZT4gOiBwdWJsaWMgY29tcGF0X3RydWVfdHlwZSB7IH07Ci0KLQotLy8gQ29tcGlsZSB0aW1lIGFzc2VydC4gTm90ZSB0aGF0IHRoZSBtZXNzYWdlIGlzIGlnbm9yZWQuIEluc3RlYWQsIHRoZQotLy8gY29tcGlsZXIgd2lsbCByZXBvcnQgYSBkaXZpc2lvbiBieSB6ZXJvIGFuZC9vciBhIG5vbi1jb25zdGFudCBleHByZXNzaW9uCi0vLyB3aGVuIHRoZSBhc3NlcnRpb24gdHJpZ2dlcnMuCi0jZGVmaW5lIFNUQVRJQ19BU1NFUlQoZSwgbSkgXAotICAgIGRvIHsgXAotICAgICAgICBlbnVtIHsgU1RBVElDX0FTU0VSVF9fID0gMS8oZSkgfTsgXAotICAgIH0gd2hpbGUgKDApCi0KIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiBib29sIGlzVmFsaWRPTVhQYXJhbShUICphKSB7Ci0gIFNUQVRJQ19BU1NFUlQob2Zmc2V0b2YodHlwZW9mKCphKSwgblNpemUpID09IDAsICJuU2l6ZSBub3QgYXQgb2Zmc2V0IDAiKTsKLSAgY29uc3QgYm9vbCBpc1NhbWUxID0gY29tcGF0X2lzX3NhbWU8dHlwZW9mKGEtPm5TaXplKSwgT01YX1UzMj46OnZhbHVlOwotICBTVEFUSUNfQVNTRVJUKGlzU2FtZTEsICJuU2l6ZSBoYXMgd3JvbmcgdHlwZSIpOwotICBTVEFUSUNfQVNTRVJUKG9mZnNldG9mKHR5cGVvZigqYSksIG5WZXJzaW9uKSA9PSA0LCAiblZlcnNpb24gbm90IGF0IG9mZnNldCA0Iik7Ci0gIGNvbnN0IGJvb2wgaXNTYW1lMiA9IGNvbXBhdF9pc19zYW1lPHR5cGVvZihhLT5uVmVyc2lvbiksIE9NWF9WRVJTSU9OVFlQRT46OnZhbHVlOwotICBTVEFUSUNfQVNTRVJUKGlzU2FtZTIsICJuVmVyc2lvbiBoYXMgd3JvbmcgdHlwZSIpOworICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKHR5cGVvZigqYSksIG5TaXplKSA9PSAwLCAiblNpemUgbm90IGF0IG9mZnNldCAwIik7CisgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPCBkZWNsdHlwZShhLT5uU2l6ZSksIE9NWF9VMzI+Ojp2YWx1ZSwgIm5TaXplIGhhcyB3cm9uZyB0eXBlIik7CisgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YodHlwZW9mKCphKSwgblZlcnNpb24pID09IDQsICJuVmVyc2lvbiBub3QgYXQgb2Zmc2V0IDQiKTsKKyAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8IGRlY2x0eXBlKGEtPm5WZXJzaW9uKSwgT01YX1ZFUlNJT05UWVBFPjo6dmFsdWUsCisgICAgICAgICAgIm5WZXJzaW9uIGhhcyB3cm9uZyB0eXBlIik7CiAKICAgaWYgKGEtPm5TaXplIDwgc2l6ZW9mKCphKSkgewotICAgICAgQUxPR0UoImIvMjcyMDcyNzU6IG5lZWQgJXp1LCBnb3QgJWx1Iiwgc2l6ZW9mKCphKSwgYS0+blNpemUpOworICAgICAgQUxPR0UoImIvMjcyMDcyNzU6IG5lZWQgJXp1LCBnb3QgJXUiLCBzaXplb2YoKmEpLCBhLT5uU2l6ZSk7CiAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3MjA3Mjc1Iik7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgKaW5kZXggZmEzZWE4OS4uNzU3YjMwOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmgKQEAgLTE5LDIyICsxOSwyNyBAQAogI2RlZmluZSBTT0ZUV0FSRV9SRU5ERVJFUl9IXwogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgogCisjaW5jbHVkZSA8bGlzdD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU1lc3NhZ2U7CiAKIGNsYXNzIFNvZnR3YXJlUmVuZGVyZXIgewogcHVibGljOgotICAgIGV4cGxpY2l0IFNvZnR3YXJlUmVuZGVyZXIoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvdz4gJm5hdGl2ZVdpbmRvdyk7CisgICAgZXhwbGljaXQgU29mdHdhcmVSZW5kZXJlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3c+ICZuYXRpdmVXaW5kb3csIGludDMyX3Qgcm90YXRpb24gPSAwKTsKIAogICAgIH5Tb2Z0d2FyZVJlbmRlcmVyKCk7CiAKLSAgICB2b2lkIHJlbmRlcigKLSAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBpbnQ2NF90IHRpbWVzdGFtcE5zLAorICAgIHN0ZDo6bGlzdDxGcmFtZVJlbmRlclRyYWNrZXI6OkluZm8+IHJlbmRlcigKKyAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBpbnQ2NF90IG1lZGlhVGltZVVzLCBuc2Vjc190IHJlbmRlclRpbWVOcywKICAgICAgICAgICAgIHZvaWQgKnBsYXRmb3JtUHJpdmF0ZSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOworICAgIHZvaWQgY2xlYXJUcmFja2VyKCk7CiAKIHByaXZhdGU6CiAgICAgZW51bSBZVVZNb2RlIHsKQEAgLTQ4LDYgKzUzLDggQEAKICAgICBpbnQzMl90IG1XaWR0aCwgbUhlaWdodDsKICAgICBpbnQzMl90IG1Dcm9wTGVmdCwgbUNyb3BUb3AsIG1Dcm9wUmlnaHQsIG1Dcm9wQm90dG9tOwogICAgIGludDMyX3QgbUNyb3BXaWR0aCwgbUNyb3BIZWlnaHQ7CisgICAgaW50MzJfdCBtUm90YXRpb25EZWdyZWVzOworICAgIEZyYW1lUmVuZGVyVHJhY2tlciBtUmVuZGVyVHJhY2tlcjsKIAogICAgIFNvZnR3YXJlUmVuZGVyZXIoY29uc3QgU29mdHdhcmVSZW5kZXJlciAmKTsKICAgICBTb2Z0d2FyZVJlbmRlcmVyICZvcGVyYXRvcj0oY29uc3QgU29mdHdhcmVSZW5kZXJlciAmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgKaW5kZXggNjYzMmMyNy4uZmQ3MzlkMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmgKQEAgLTI1LDcgKzI1LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgRGF0YVNvdXJjZTsKK2NsYXNzIERhdGFTb3VyY2U7CiBjbGFzcyBNZWRpYUV4dHJhY3RvcjsKIAogc3RydWN0IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIgOiBwdWJsaWMgTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZSB7CkBAIC0zOCw2ICszOCw3IEBACiAgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiYgc291cmNlKTsKIAogICAgIHZpcnR1YWwgVmlkZW9GcmFtZSAqZ2V0RnJhbWVBdFRpbWUoaW50NjRfdCB0aW1lVXMsIGludCBvcHRpb24pOwogICAgIHZpcnR1YWwgTWVkaWFBbGJ1bUFydCAqZXh0cmFjdEFsYnVtQXJ0KCk7CkBAIC01Myw2ICs1NCw4IEBACiAgICAgTWVkaWFBbGJ1bUFydCAqbUFsYnVtQXJ0OwogCiAgICAgdm9pZCBwYXJzZU1ldGFEYXRhKCk7CisgICAgLy8gRGVsZXRlIGFsYnVtIGFydCBhbmQgY2xlYXIgbWV0YWRhdGEuCisgICAgdm9pZCBjbGVhck1ldGFkYXRhKCk7CiAKICAgICBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyKGNvbnN0IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIgJik7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVGltZWRFdmVudFF1ZXVlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1RpbWVkRXZlbnRRdWV1ZS5oCmluZGV4IDI5NjMxNTAuLjg5MGY3ZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVGltZWRFdmVudFF1ZXVlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9UaW1lZEV2ZW50UXVldWUuaApAQCAtNDYsNyArNDYsNyBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgZmlyZShUaW1lZEV2ZW50UXVldWUgKnF1ZXVlLCBpbnQ2NF90IG5vd191cykgPSAwOwogCiAgICAgcHJpdmF0ZToKLSAgICAgICAgZnJpZW5kIGNsYXNzIFRpbWVkRXZlbnRRdWV1ZTsKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBUaW1lZEV2ZW50UXVldWU7CiAKICAgICAgICAgZXZlbnRfaWQgbUV2ZW50SUQ7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVkJSSVNlZWtlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9WQlJJU2Vla2VyLmgKaW5kZXggMWEyYmY5Zi4uYzU3ZDU3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9WQlJJU2Vla2VyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9WQlJJU2Vla2VyLmgKQEAgLTI0LDcgKzI0LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgRGF0YVNvdXJjZTsKK2NsYXNzIERhdGFTb3VyY2U7CiAKIHN0cnVjdCBWQlJJU2Vla2VyIDogcHVibGljIE1QM1NlZWtlciB7CiAgICAgc3RhdGljIHNwPFZCUklTZWVrZXI+IENyZWF0ZUZyb21Tb3VyY2UoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1hJTkdTZWVrZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvWElOR1NlZWtlci5oCmluZGV4IGM0MDg1NzYuLmNjZTA0ZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvWElOR1NlZWtlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvWElOR1NlZWtlci5oCkBAIC0yMiw3ICsyMiw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IERhdGFTb3VyY2U7CitjbGFzcyBEYXRhU291cmNlOwogCiBzdHJ1Y3QgWElOR1NlZWtlciA6IHB1YmxpYyBNUDNTZWVrZXIgewogICAgIHN0YXRpYyBzcDxYSU5HU2Vla2VyPiBDcmVhdGVGcm9tU291cmNlKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9hdmNfdXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvYXZjX3V0aWxzLmgKaW5kZXggYzI3MGJjMS4uZGFmYTA3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9hdmNfdXRpbHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL2F2Y191dGlscy5oCkBAIC0zNiw2ICszNiwxMSBAQAogICAgIGtBVkNQcm9maWxlQ0FWTEM0NDRJbnRyYSA9IDB4MmMKIH07CiAKK3N0cnVjdCBOQUxQb3NpdGlvbiB7CisgICAgc2l6ZV90IG5hbE9mZnNldDsKKyAgICBzaXplX3QgbmFsU2l6ZTsKK307CisKIC8vIE9wdGlvbmFsbHkgcmV0dXJucyBzYW1wbGUgYXNwZWN0IHJhdGlvIGFzIHdlbGwuCiB2b2lkIEZpbmRBVkNEaW1lbnNpb25zKAogICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmc2VxUGFyYW1TZXQsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvQW5kcm9pZC5tawppbmRleCA0NDZmZjhjLi4xZThjMmIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL0FuZHJvaWQubWsKQEAgLTgsNyArOCw4IEBACiAgICAgICAgICQoVE9QKS9leHRlcm5hbC9saWJ2cHgvbGlid2VibSBcCiAgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogCi1MT0NBTF9DRkxBR1MgKz0gLVduby1tdWx0aWNoYXIgLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKIAogTE9DQUxfTU9EVUxFOj0gbGlic3RhZ2VmcmlnaHRfbWF0cm9za2EKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbWF0cm9za2EvTWF0cm9za2FFeHRyYWN0b3IuY3BwCmluZGV4IGMzMGU4MDcuLmVjYzI1NzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21hdHJvc2thL01hdHJvc2thRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tYXRyb3NrYS9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKQEAgLTk0NCw2ICs5NDQsMTEgQEAKICAgICAgICAgQUxPR1YoImNvZGVjIGlkID0gJXMiLCBjb2RlY0lEKTsKICAgICAgICAgQUxPR1YoImNvZGVjIG5hbWUgPSAlcyIsIHRyYWNrLT5HZXRDb2RlY05hbWVBc1VURjgoKSk7CiAKKyAgICAgICAgaWYgKGNvZGVjSUQgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR1coInVua25vd24gY29kZWNJRCBpcyBub3Qgc3VwcG9ydGVkLiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKwogICAgICAgICBzaXplX3QgY29kZWNQcml2YXRlU2l6ZTsKICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqY29kZWNQcml2YXRlID0KICAgICAgICAgICAgIHRyYWNrLT5HZXRDb2RlY1ByaXZhdGUoY29kZWNQcml2YXRlU2l6ZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKaW5kZXggMWVhZTZjZi4uMmYyYjExNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcApAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCkBAIC00NywxNSArNDgsMTkgQEAKIHN0YXRpYyBjb25zdCBzaXplX3Qga1RTUGFja2V0U2l6ZSA9IDE4ODsKIAogc3RydWN0IEFUU1BhcnNlcjo6UHJvZ3JhbSA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBQcm9ncmFtKEFUU1BhcnNlciAqcGFyc2VyLCB1bnNpZ25lZCBwcm9ncmFtTnVtYmVyLCB1bnNpZ25lZCBwcm9ncmFtTWFwUElEKTsKKyAgICBQcm9ncmFtKEFUU1BhcnNlciAqcGFyc2VyLCB1bnNpZ25lZCBwcm9ncmFtTnVtYmVyLCB1bnNpZ25lZCBwcm9ncmFtTWFwUElELAorICAgICAgICAgICAgaW50NjRfdCBsYXN0UmVjb3ZlcmVkUFRTKTsKIAogICAgIGJvb2wgcGFyc2VQU0lTZWN0aW9uKAogICAgICAgICAgICAgdW5zaWduZWQgcGlkLCBBQml0UmVhZGVyICpiciwgc3RhdHVzX3QgKmVycik7CiAKKyAgICAvLyBQYXNzIHRvIGFwcHJvcHJpYXRlIHN0cmVhbSBhY2NvcmRpbmcgdG8gcGlkLCBhbmQgc2V0IGV2ZW50IGlmIGl0J3MgYSBQRVMKKyAgICAvLyB3aXRoIGEgc3luYyBmcmFtZS4KKyAgICAvLyBOb3RlIHRoYXQgdGhlIG1ldGhvZCBpdHNlbGYgZG9lcyBub3QgdG91Y2ggZXZlbnQuCiAgICAgYm9vbCBwYXJzZVBJRCgKICAgICAgICAgICAgIHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgY29udGludWl0eV9jb3VudGVyLAogICAgICAgICAgICAgdW5zaWduZWQgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwKLSAgICAgICAgICAgIEFCaXRSZWFkZXIgKmJyLCBzdGF0dXNfdCAqZXJyKTsKKyAgICAgICAgICAgIEFCaXRSZWFkZXIgKmJyLCBzdGF0dXNfdCAqZXJyLCBTeW5jRXZlbnQgKmV2ZW50KTsKIAogICAgIHZvaWQgc2lnbmFsRGlzY29udGludWl0eSgKICAgICAgICAgICAgIERpc2NvbnRpbnVpdHlUeXBlIHR5cGUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZXh0cmEpOwpAQCAtODYsMTQgKzkxLDIyIEBACiAgICAgfQogCiBwcml2YXRlOgorICAgIHN0cnVjdCBTdHJlYW1JbmZvIHsKKyAgICAgICAgdW5zaWduZWQgbVR5cGU7CisgICAgICAgIHVuc2lnbmVkIG1QSUQ7CisgICAgfTsKKwogICAgIEFUU1BhcnNlciAqbVBhcnNlcjsKICAgICB1bnNpZ25lZCBtUHJvZ3JhbU51bWJlcjsKICAgICB1bnNpZ25lZCBtUHJvZ3JhbU1hcFBJRDsKICAgICBLZXllZFZlY3Rvcjx1bnNpZ25lZCwgc3A8U3RyZWFtPiA+IG1TdHJlYW1zOwogICAgIGJvb2wgbUZpcnN0UFRTVmFsaWQ7CiAgICAgdWludDY0X3QgbUZpcnN0UFRTOworICAgIGludDY0X3QgbUxhc3RSZWNvdmVyZWRQVFM7CiAKICAgICBzdGF0dXNfdCBwYXJzZVByb2dyYW1NYXAoQUJpdFJlYWRlciAqYnIpOworICAgIGludDY0X3QgcmVjb3ZlclBUUyh1aW50NjRfdCBQVFNfMzNiaXQpOworICAgIGJvb2wgc3dpdGNoUElEcyhjb25zdCBWZWN0b3I8U3RyZWFtSW5mbz4gJmluZm9zKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFByb2dyYW0pOwogfTsKQEAgLTEwOCwxMCArMTIxLDE0IEBACiAgICAgdW5zaWduZWQgcGlkKCkgY29uc3QgeyByZXR1cm4gbUVsZW1lbnRhcnlQSUQ7IH0KICAgICB2b2lkIHNldFBJRCh1bnNpZ25lZCBwaWQpIHsgbUVsZW1lbnRhcnlQSUQgPSBwaWQ7IH0KIAorICAgIC8vIFBhcnNlIHRoZSBwYXlsb2FkIGFuZCBzZXQgZXZlbnQgd2hlbiBQRVMgd2l0aCBhIHN5bmMgZnJhbWUgaXMgZGV0ZWN0ZWQuCisgICAgLy8gVGhpcyBtZXRob2Qga25vd3Mgd2hlbiBhIFBFUyBzdGFydHM7IHNvIHJlY29yZCBtUGVzU3RhcnRPZmZzZXQgaW4gdGhhdAorICAgIC8vIGNhc2UuCiAgICAgc3RhdHVzX3QgcGFyc2UoCiAgICAgICAgICAgICB1bnNpZ25lZCBjb250aW51aXR5X2NvdW50ZXIsCiAgICAgICAgICAgICB1bnNpZ25lZCBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yLAotICAgICAgICAgICAgQUJpdFJlYWRlciAqYnIpOworICAgICAgICAgICAgQUJpdFJlYWRlciAqYnIsCisgICAgICAgICAgICBTeW5jRXZlbnQgKmV2ZW50KTsKIAogICAgIHZvaWQgc2lnbmFsRGlzY29udGludWl0eSgKICAgICAgICAgICAgIERpc2NvbnRpbnVpdHlUeXBlIHR5cGUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZXh0cmEpOwpAQCAtMTIyLDYgKzEzOSw3IEBACiAKICAgICBib29sIGlzQXVkaW8oKSBjb25zdDsKICAgICBib29sIGlzVmlkZW8oKSBjb25zdDsKKyAgICBib29sIGlzTWV0YSgpIGNvbnN0OwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+U3RyZWFtKCk7CkBAIC0xMzksMTcgKzE1NywyNCBAQAogICAgIGJvb2wgbUVPU1JlYWNoZWQ7CiAKICAgICB1aW50NjRfdCBtUHJldlBUUzsKKyAgICBvZmY2NF90IG1QZXNTdGFydE9mZnNldDsKIAogICAgIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZSAqbVF1ZXVlOwogCi0gICAgc3RhdHVzX3QgZmx1c2goKTsKLSAgICBzdGF0dXNfdCBwYXJzZVBFUyhBQml0UmVhZGVyICpicik7CisgICAgLy8gRmx1c2ggYWNjdW11bGF0ZWQgcGF5bG9hZCBpZiBuZWNlc3NhcnkgLS0tIGkuZS4gYXQgRU9TIG9yIGF0IHRoZSBzdGFydCBvZgorICAgIC8vIGFub3RoZXIgcGF5bG9hZC4gZXZlbnQgaXMgc2V0IGlmIHRoZSBmbHVzaGVkIHBheWxvYWQgaXMgUEVTIHdpdGggYSBzeW5jCisgICAgLy8gZnJhbWUuCisgICAgc3RhdHVzX3QgZmx1c2goU3luY0V2ZW50ICpldmVudCk7CisgICAgLy8gU3RyaXAgYW5kIHBhcnNlIFBFUyBoZWFkZXJzIGFuZCBwYXNzIHJlbWFpbmluZyBwYXlsb2FkIGludG8gb25QYXlsb2FkCisgICAgLy8gd2l0aCBwYXJzZWQgbWV0YWRhdGEuIGV2ZW50IGlzIHNldCBpZiB0aGUgUEVTIGNvbnRhaW5zIGEgc3luYyBmcmFtZS4KKyAgICBzdGF0dXNfdCBwYXJzZVBFUyhBQml0UmVhZGVyICpiciwgU3luY0V2ZW50ICpldmVudCk7CiAKKyAgICAvLyBGZWVkIHRoZSBwYXlsb2FkIGludG8gbVF1ZXVlIGFuZCBpZiBhIHBhY2tldCBpcyBpZGVudGlmaWVkLCBxdWV1ZSBpdAorICAgIC8vIGludG8gbVNvdXJjZS4gSWYgdGhlIHBhY2tldCBpcyBhIHN5bmMgZnJhbWUuIHNldCBldmVudCB3aXRoIHN0YXJ0IG9mZnNldAorICAgIC8vIGFuZCB0aW1lc3RhbXAgb2YgdGhlIHBhY2tldC4KICAgICB2b2lkIG9uUGF5bG9hZERhdGEoCiAgICAgICAgICAgICB1bnNpZ25lZCBQVFNfRFRTX2ZsYWdzLCB1aW50NjRfdCBQVFMsIHVpbnQ2NF90IERUUywKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIHZvaWQgZXh0cmFjdEFBQ0ZyYW1lcyhjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplLCBTeW5jRXZlbnQgKmV2ZW50KTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFN0cmVhbSk7CiB9OwpAQCAtMTU4LDEwICsxODMsMTIgQEAKICAgICBQU0lTZWN0aW9uKCk7CiAKICAgICBzdGF0dXNfdCBhcHBlbmQoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIHZvaWQgc2V0U2tpcEJ5dGVzKHVpbnQ4X3Qgc2tpcCk7CiAgICAgdm9pZCBjbGVhcigpOwogCiAgICAgYm9vbCBpc0NvbXBsZXRlKCkgY29uc3Q7CiAgICAgYm9vbCBpc0VtcHR5KCkgY29uc3Q7CisgICAgYm9vbCBpc0NSQ09rYXkoKSBjb25zdDsKIAogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEoKSBjb25zdDsKICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0OwpAQCAtMTcxLDE5ICsxOTgsMzQgQEAKIAogcHJpdmF0ZToKICAgICBzcDxBQnVmZmVyPiBtQnVmZmVyOworICAgIHVpbnQ4X3QgbVNraXBCeXRlczsKKyAgICBzdGF0aWMgdWludDMyX3QgQ1JDX1RBQkxFW107CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQU0lTZWN0aW9uKTsKIH07CiAKK0FUU1BhcnNlcjo6U3luY0V2ZW50OjpTeW5jRXZlbnQob2ZmNjRfdCBvZmZzZXQpCisgICAgOiBtSW5pdChmYWxzZSksIG1PZmZzZXQob2Zmc2V0KSwgbVRpbWVVcygwKSB7fQorCit2b2lkIEFUU1BhcnNlcjo6U3luY0V2ZW50Ojppbml0KG9mZjY0X3Qgb2Zmc2V0LCBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgaW50NjRfdCB0aW1lVXMpIHsKKyAgICBtSW5pdCA9IHRydWU7CisgICAgbU9mZnNldCA9IG9mZnNldDsKKyAgICBtTWVkaWFTb3VyY2UgPSBzb3VyY2U7CisgICAgbVRpbWVVcyA9IHRpbWVVczsKK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogQVRTUGFyc2VyOjpQcm9ncmFtOjpQcm9ncmFtKAotICAgICAgICBBVFNQYXJzZXIgKnBhcnNlciwgdW5zaWduZWQgcHJvZ3JhbU51bWJlciwgdW5zaWduZWQgcHJvZ3JhbU1hcFBJRCkKKyAgICAgICAgQVRTUGFyc2VyICpwYXJzZXIsIHVuc2lnbmVkIHByb2dyYW1OdW1iZXIsIHVuc2lnbmVkIHByb2dyYW1NYXBQSUQsCisgICAgICAgIGludDY0X3QgbGFzdFJlY292ZXJlZFBUUykKICAgICA6IG1QYXJzZXIocGFyc2VyKSwKICAgICAgIG1Qcm9ncmFtTnVtYmVyKHByb2dyYW1OdW1iZXIpLAogICAgICAgbVByb2dyYW1NYXBQSUQocHJvZ3JhbU1hcFBJRCksCiAgICAgICBtRmlyc3RQVFNWYWxpZChmYWxzZSksCi0gICAgICBtRmlyc3RQVFMoMCkgeworICAgICAgbUZpcnN0UFRTKDApLAorICAgICAgbUxhc3RSZWNvdmVyZWRQVFMobGFzdFJlY292ZXJlZFBUUykgewogICAgIEFMT0dWKCJuZXcgcHJvZ3JhbSBudW1iZXIgJXUiLCBwcm9ncmFtTnVtYmVyKTsKIH0KIApAQCAtMjAzLDcgKzI0NSw3IEBACiBib29sIEFUU1BhcnNlcjo6UHJvZ3JhbTo6cGFyc2VQSUQoCiAgICAgICAgIHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgY29udGludWl0eV9jb3VudGVyLAogICAgICAgICB1bnNpZ25lZCBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yLAotICAgICAgICBBQml0UmVhZGVyICpiciwgc3RhdHVzX3QgKmVycikgeworICAgICAgICBBQml0UmVhZGVyICpiciwgc3RhdHVzX3QgKmVyciwgU3luY0V2ZW50ICpldmVudCkgewogICAgICplcnIgPSBPSzsKIAogICAgIHNzaXplX3QgaW5kZXggPSBtU3RyZWFtcy5pbmRleE9mS2V5KHBpZCk7CkBAIC0yMTIsNyArMjU0LDcgQEAKICAgICB9CiAKICAgICAqZXJyID0gbVN0cmVhbXMuZWRpdFZhbHVlQXQoaW5kZXgpLT5wYXJzZSgKLSAgICAgICAgICAgIGNvbnRpbnVpdHlfY291bnRlciwgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwgYnIpOworICAgICAgICAgICAgY29udGludWl0eV9jb3VudGVyLCBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yLCBiciwgZXZlbnQpOwogCiAgICAgcmV0dXJuIHRydWU7CiB9CkBAIC0yMzgsMTAgKzI4MCw3NSBAQAogICAgIH0KIH0KIAotc3RydWN0IFN0cmVhbUluZm8gewotICAgIHVuc2lnbmVkIG1UeXBlOwotICAgIHVuc2lnbmVkIG1QSUQ7Ci19OworYm9vbCBBVFNQYXJzZXI6OlByb2dyYW06OnN3aXRjaFBJRHMoY29uc3QgVmVjdG9yPFN0cmVhbUluZm8+ICZpbmZvcykgeworICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworCisgICAgaWYgKG1TdHJlYW1zLnNpemUoKSA9PSBpbmZvcy5zaXplKCkpIHsKKyAgICAgICAgLy8gYnVpbGQgdHlwZS0+UElEcyBtYXAgZm9yIG9sZCBhbmQgbmV3IG1hcHBpbmcKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIEtleWVkVmVjdG9yPGludDMyX3QsIFZlY3RvcjxpbnQzMl90PiA+IG9sZFR5cGUyUElEcywgbmV3VHlwZTJQSURzOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbVN0cmVhbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBvbGRUeXBlMlBJRHMuaW5kZXhPZktleShtU3RyZWFtc1tpXS0+dHlwZSgpKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBvbGRUeXBlMlBJRHMuYWRkKG1TdHJlYW1zW2ldLT50eXBlKCksIFZlY3RvcjxpbnQzMl90PigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9sZFR5cGUyUElEcy5lZGl0VmFsdWVGb3IobVN0cmVhbXNbaV0tPnR5cGUoKSkucHVzaF9iYWNrKG1TdHJlYW1zW2ldLT5waWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGluZm9zLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbmV3VHlwZTJQSURzLmluZGV4T2ZLZXkoaW5mb3NbaV0ubVR5cGUpOworICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgIG5ld1R5cGUyUElEcy5hZGQoaW5mb3NbaV0ubVR5cGUsIFZlY3RvcjxpbnQzMl90PigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5ld1R5cGUyUElEcy5lZGl0VmFsdWVGb3IoaW5mb3NbaV0ubVR5cGUpLnB1c2hfYmFjayhpbmZvc1tpXS5tUElEKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdlIGNhbiByZWNvdmVyIGlmIHRoZSBudW1iZXIgb2Ygc3RyZWFtcyBmb3IgZWFjaCB0eXBlIGhhc24ndCBjaGFuZ2VkCisgICAgICAgIGlmIChvbGRUeXBlMlBJRHMuc2l6ZSgpID09IG5ld1R5cGUyUElEcy5zaXplKCkpIHsKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9sZFR5cGUyUElEcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIC8vIEtleWVkVmVjdG9yIGlzIHNvcnRlZCwgd2UganVzdCBjb21wYXJlIGtleSBhbmQgc2l6ZSBvZiBlYWNoIGluZGV4CisgICAgICAgICAgICAgICAgaWYgKG9sZFR5cGUyUElEcy5rZXlBdChpKSAhPSBuZXdUeXBlMlBJRHMua2V5QXQoaSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG9sZFR5cGUyUElEc1tpXS5zaXplKCkgIT0gbmV3VHlwZTJQSURzW2ldLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIC8vIHNhdmUgY3VycmVudCBzdHJlYW1zIHRvIHRlbXAKKyAgICAgICAgICAgIEtleWVkVmVjdG9yPGludDMyX3QsIHNwPFN0cmVhbT4gPiB0ZW1wOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1TdHJlYW1zLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgIHRlbXAuYWRkKG1TdHJlYW1zLmtleUF0KGkpLCBtU3RyZWFtcy5lZGl0VmFsdWVBdChpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1TdHJlYW1zLmNsZWFyKCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGVtcC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSB0d28gY2hlY2tzIGJlbG93IHNob3VsZG4ndCBoYXBwZW4sCisgICAgICAgICAgICAgICAgLy8gd2UgYWxyZWFkeSBjaGVja2VkIGFib3ZlIHRoZSBzdHJlYW0gY291bnQgbWF0Y2hlcworICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBuZXdUeXBlMlBJRHMuaW5kZXhPZktleSh0ZW1wW2ldLT50eXBlKCkpOworICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBWZWN0b3I8aW50MzJfdD4gJm5ld1BJRHMgPSBuZXdUeXBlMlBJRHMuZWRpdFZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgICAgIGlmIChuZXdQSURzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBuZXh0IFBJRCBmb3IgdGVtcFtpXS0+dHlwZSgpIGluIHRoZSBuZXcgUElEIG1hcAorICAgICAgICAgICAgICAgIFZlY3RvcjxpbnQzMl90Pjo6aXRlcmF0b3IgaXQgPSBuZXdQSURzLmJlZ2luKCk7CisKKyAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIFBJRCBvZiB0aGUgc3RyZWFtLCBhbmQgYWRkIGl0IGJhY2sKKyAgICAgICAgICAgICAgICB0ZW1wLmVkaXRWYWx1ZUF0KGkpLT5zZXRQSUQoKml0KTsKKyAgICAgICAgICAgICAgICBtU3RyZWFtcy5hZGQodGVtcFtpXS0+cGlkKCksIHRlbXAuZWRpdFZhbHVlQXQoaSkpOworCisgICAgICAgICAgICAgICAgLy8gcmVtb3ZlZCB0aGUgdXNlZCBQSUQKKyAgICAgICAgICAgICAgICBuZXdQSURzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3VjY2VzczsKK30KIAogc3RhdHVzX3QgQVRTUGFyc2VyOjpQcm9ncmFtOjpwYXJzZVByb2dyYW1NYXAoQUJpdFJlYWRlciAqYnIpIHsKICAgICB1bnNpZ25lZCB0YWJsZV9pZCA9IGJyLT5nZXRCaXRzKDgpOwpAQCAtMjU3LDEzICszNjQsMTEgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMHUpOworICAgIGJyLT5za2lwQml0cygxKTsgIC8vICcwJwogICAgIE1ZX0xPR1YoIiAgcmVzZXJ2ZWQgPSAldSIsIGJyLT5nZXRCaXRzKDIpKTsKIAogICAgIHVuc2lnbmVkIHNlY3Rpb25fbGVuZ3RoID0gYnItPmdldEJpdHMoMTIpOwogICAgIEFMT0dWKCIgIHNlY3Rpb25fbGVuZ3RoID0gJXUiLCBzZWN0aW9uX2xlbmd0aCk7Ci0gICAgQ0hFQ0tfRVEoc2VjdGlvbl9sZW5ndGggJiAweGMwMCwgMHUpOwotICAgIENIRUNLX0xFKHNlY3Rpb25fbGVuZ3RoLCAxMDIxdSk7CiAKICAgICBNWV9MT0dWKCIgIHByb2dyYW1fbnVtYmVyID0gJXUiLCBici0+Z2V0Qml0cygxNikpOwogICAgIE1ZX0xPR1YoIiAgcmVzZXJ2ZWQgPSAldSIsIGJyLT5nZXRCaXRzKDIpKTsKQEAgLTI4MCw3ICszODUsNiBAQAogCiAgICAgdW5zaWduZWQgcHJvZ3JhbV9pbmZvX2xlbmd0aCA9IGJyLT5nZXRCaXRzKDEyKTsKICAgICBBTE9HVigiICBwcm9ncmFtX2luZm9fbGVuZ3RoID0gJXUiLCBwcm9ncmFtX2luZm9fbGVuZ3RoKTsKLSAgICBDSEVDS19FUShwcm9ncmFtX2luZm9fbGVuZ3RoICYgMHhjMDAsIDB1KTsKIAogICAgIGJyLT5za2lwQml0cyhwcm9ncmFtX2luZm9fbGVuZ3RoICogOCk7ICAvLyBza2lwIGRlc2NyaXB0b3JzCiAKQEAgLTI5MSw4ICszOTUsNyBAQAogICAgIC8vIGZpbmFsIENSQy4KICAgICBzaXplX3QgaW5mb0J5dGVzUmVtYWluaW5nID0gc2VjdGlvbl9sZW5ndGggLSA5IC0gcHJvZ3JhbV9pbmZvX2xlbmd0aCAtIDQ7CiAKLSAgICB3aGlsZSAoaW5mb0J5dGVzUmVtYWluaW5nID4gMCkgewotICAgICAgICBDSEVDS19HRShpbmZvQnl0ZXNSZW1haW5pbmcsIDV1KTsKKyAgICB3aGlsZSAoaW5mb0J5dGVzUmVtYWluaW5nID49IDUpIHsKIAogICAgICAgICB1bnNpZ25lZCBzdHJlYW1UeXBlID0gYnItPmdldEJpdHMoOCk7CiAgICAgICAgIEFMT0dWKCIgICAgc3RyZWFtX3R5cGUgPSAweCUwMngiLCBzdHJlYW1UeXBlKTsKQEAgLTMwNiw5ICs0MDksNiBAQAogCiAgICAgICAgIHVuc2lnbmVkIEVTX2luZm9fbGVuZ3RoID0gYnItPmdldEJpdHMoMTIpOwogICAgICAgICBBTE9HVigiICAgIEVTX2luZm9fbGVuZ3RoID0gJXUiLCBFU19pbmZvX2xlbmd0aCk7Ci0gICAgICAgIENIRUNLX0VRKEVTX2luZm9fbGVuZ3RoICYgMHhjMDAsIDB1KTsKLQotICAgICAgICBDSEVDS19HRShpbmZvQnl0ZXNSZW1haW5pbmcgLSA1LCBFU19pbmZvX2xlbmd0aCk7CiAKICNpZiAwCiAgICAgICAgIGJyLT5za2lwQml0cyhFU19pbmZvX2xlbmd0aCAqIDgpOyAgLy8gc2tpcCBkZXNjcmlwdG9ycwpAQCAtMzIwLDEzICs0MjAsMTMgQEAKICAgICAgICAgICAgIHVuc2lnbmVkIGRlc2NMZW5ndGggPSBici0+Z2V0Qml0cyg4KTsKICAgICAgICAgICAgIEFMT0dWKCIgICAgICBsZW4gPSAldSIsIGRlc2NMZW5ndGgpOwogCi0gICAgICAgICAgICBDSEVDS19HRShpbmZvX2J5dGVzX3JlbWFpbmluZywgMiArIGRlc2NMZW5ndGgpOwotCisgICAgICAgICAgICBpZiAoaW5mb19ieXRlc19yZW1haW5pbmcgPCBkZXNjTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyLT5za2lwQml0cyhkZXNjTGVuZ3RoICogOCk7CiAKICAgICAgICAgICAgIGluZm9fYnl0ZXNfcmVtYWluaW5nIC09IGRlc2NMZW5ndGggKyAyOwogICAgICAgICB9Ci0gICAgICAgIENIRUNLX0VRKGluZm9fYnl0ZXNfcmVtYWluaW5nLCAwdSk7CiAjZW5kaWYKIAogICAgICAgICBTdHJlYW1JbmZvIGluZm87CkBAIC0zMzcsNyArNDM3LDkgQEAKICAgICAgICAgaW5mb0J5dGVzUmVtYWluaW5nIC09IDUgKyBFU19pbmZvX2xlbmd0aDsKICAgICB9CiAKLSAgICBDSEVDS19FUShpbmZvQnl0ZXNSZW1haW5pbmcsIDB1KTsKKyAgICBpZiAoaW5mb0J5dGVzUmVtYWluaW5nICE9IDApIHsKKyAgICAgICAgQUxPR1coIlNlY3Rpb24gZGF0YSByZW1haW5zIHVuY29uc3VtZWQiKTsKKyAgICB9CiAgICAgTVlfTE9HVigiICBDUkMgPSAweCUwOHgiLCBici0+Z2V0Qml0cygzMikpOwogCiAgICAgYm9vbCBQSURzQ2hhbmdlZCA9IGZhbHNlOwpAQCAtMzcwLDM5ICs0NzIsOCBAQAogICAgICAgICB9CiAjZW5kaWYKIAotICAgICAgICAvLyBUaGUgb25seSBjYXNlIHdlIGNhbiByZWNvdmVyIGZyb20gaXMgaWYgd2UgaGF2ZSB0d28gc3RyZWFtcwotICAgICAgICAvLyBhbmQgdGhleSBzd2l0Y2hlZCBQSURzLgotCi0gICAgICAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwotCi0gICAgICAgIGlmIChtU3RyZWFtcy5zaXplKCkgPT0gMiAmJiBpbmZvcy5zaXplKCkgPT0gMikgewotICAgICAgICAgICAgY29uc3QgU3RyZWFtSW5mbyAmaW5mbzEgPSBpbmZvcy5pdGVtQXQoMCk7Ci0gICAgICAgICAgICBjb25zdCBTdHJlYW1JbmZvICZpbmZvMiA9IGluZm9zLml0ZW1BdCgxKTsKLQotICAgICAgICAgICAgc3A8U3RyZWFtPiBzMSA9IG1TdHJlYW1zLmVkaXRWYWx1ZUF0KDApOwotICAgICAgICAgICAgc3A8U3RyZWFtPiBzMiA9IG1TdHJlYW1zLmVkaXRWYWx1ZUF0KDEpOwotCi0gICAgICAgICAgICBib29sIGNhc2VBID0KLSAgICAgICAgICAgICAgICBpbmZvMS5tUElEID09IHMxLT5waWQoKSAmJiBpbmZvMS5tVHlwZSA9PSBzMi0+dHlwZSgpCi0gICAgICAgICAgICAgICAgICAgICYmIGluZm8yLm1QSUQgPT0gczItPnBpZCgpICYmIGluZm8yLm1UeXBlID09IHMxLT50eXBlKCk7Ci0KLSAgICAgICAgICAgIGJvb2wgY2FzZUIgPQotICAgICAgICAgICAgICAgIGluZm8xLm1QSUQgPT0gczItPnBpZCgpICYmIGluZm8xLm1UeXBlID09IHMxLT50eXBlKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgaW5mbzIubVBJRCA9PSBzMS0+cGlkKCkgJiYgaW5mbzIubVR5cGUgPT0gczItPnR5cGUoKTsKLQotICAgICAgICAgICAgaWYgKGNhc2VBIHx8IGNhc2VCKSB7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgcGlkMSA9IHMxLT5waWQoKTsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBwaWQyID0gczItPnBpZCgpOwotICAgICAgICAgICAgICAgIHMxLT5zZXRQSUQocGlkMik7Ci0gICAgICAgICAgICAgICAgczItPnNldFBJRChwaWQxKTsKLQotICAgICAgICAgICAgICAgIG1TdHJlYW1zLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgbVN0cmVhbXMuYWRkKHMxLT5waWQoKSwgczEpOwotICAgICAgICAgICAgICAgIG1TdHJlYW1zLmFkZChzMi0+cGlkKCksIHMyKTsKLQotICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIC8vIHdlIGNhbiByZWNvdmVyIGlmIG51bWJlciBvZiBzdHJlYW1zIGZvciBlYWNoIHR5cGUgcmVtYWluIHRoZSBzYW1lCisgICAgICAgIGJvb2wgc3VjY2VzcyA9IHN3aXRjaFBJRHMoaW5mb3MpOwogCiAgICAgICAgIGlmICghc3VjY2VzcykgewogICAgICAgICAgICAgQUxPR0koIlN0cmVhbSBQSURzIGNoYW5nZWQgYW5kIHdlIGNhbm5vdCByZWNvdmVyLiIpOwpAQCAtNDI2LDYgKzQ5NywzMiBAQAogICAgIHJldHVybiBPSzsKIH0KIAoraW50NjRfdCBBVFNQYXJzZXI6OlByb2dyYW06OnJlY292ZXJQVFModWludDY0X3QgUFRTXzMzYml0KSB7CisgICAgLy8gV2Ugb25seSBoYXZlIHRoZSBsb3dlciAzMy1iaXQgb2YgdGhlIFBUUy4gSXQgY291bGQgb3ZlcmZsb3cgd2l0aGluIGEKKyAgICAvLyByZWFzb25hYmxlIGFtb3VudCBvZiB0aW1lLiBUbyBoYW5kbGUgdGhlIHdyYXAtYXJvdW5kLCB1c2UgZmFuY3kgbWF0aAorICAgIC8vIHRvIGdldCBhbiBleHRlbmRlZCBQVFMgdGhhdCBpcyB3aXRoaW4gWy0weGZmZmZmZmZmLCAweGZmZmZmZmZmXQorICAgIC8vIG9mIHRoZSBsYXRlc3QgcmVjb3ZlcmVkIFBUUy4KKyAgICBpZiAobUxhc3RSZWNvdmVyZWRQVFMgPCAwbGwpIHsKKyAgICAgICAgLy8gVXNlIHRoZSBvcmlnaW5hbCAzM2JpdCBudW1iZXIgZm9yIDFzdCBmcmFtZSwgdGhlIHJlYXNvbiBpcyB0aGF0CisgICAgICAgIC8vIGlmIDFzdCBmcmFtZSB3cmFwcyB0byBuZWdhdGl2ZSB0aGF0J3MgZmFyIGF3YXkgZnJvbSAwLCB3ZSBjb3VsZAorICAgICAgICAvLyBuZXZlciBzdGFydC4gT25seSBzdGFydCB3cmFwcGluZyBhcm91bmQgZnJvbSAybmQgZnJhbWUuCisgICAgICAgIG1MYXN0UmVjb3ZlcmVkUFRTID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oUFRTXzMzYml0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtTGFzdFJlY292ZXJlZFBUUyA9IHN0YXRpY19jYXN0PGludDY0X3Q+KAorICAgICAgICAgICAgICAgICgobUxhc3RSZWNvdmVyZWRQVFMgLSBQVFNfMzNiaXQgKyAweDEwMDAwMDAwMGxsKQorICAgICAgICAgICAgICAgICYgMHhmZmZmZmZmZTAwMDAwMDAwdWxsKSB8IFBUU18zM2JpdCk7CisgICAgICAgIC8vIFdlIHN0YXJ0IGZyb20gMCwgYnV0IHJlY292ZXJlZCBQVFMgY291bGQgYmUgc2xpZ2h0bHkgYmVsb3cgMC4KKyAgICAgICAgLy8gQ2xhbXAgaXQgdG8gMCBhcyByZXN0IG9mIHRoZSBwaXBlbGluZSBkb2Vzbid0IHRha2UgbmVnYXRpdmUgcHRzLgorICAgICAgICAvLyAoZWcuIHZpZGVvIGlzIHJlYWQgZmlyc3QgYW5kIHN0YXJ0cyBhdCAwLCBidXQgYXVkaW8gc3RhcnRzIGF0IDB4ZmZmZmZmZjApCisgICAgICAgIGlmIChtTGFzdFJlY292ZXJlZFBUUyA8IDBsbCkgeworICAgICAgICAgICAgQUxPR0koIkNsYW1waW5nIG5lZ2F0aXZlIHJlY292ZXJlZCBQVFMgKCUiIFBSSWQ2NCAiKSB0byAwIiwgbUxhc3RSZWNvdmVyZWRQVFMpOworICAgICAgICAgICAgbUxhc3RSZWNvdmVyZWRQVFMgPSAwbGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbUxhc3RSZWNvdmVyZWRQVFM7Cit9CisKIHNwPE1lZGlhU291cmNlPiBBVFNQYXJzZXI6OlByb2dyYW06OmdldFNvdXJjZShTb3VyY2VUeXBlIHR5cGUpIHsKICAgICBzaXplX3QgaW5kZXggPSAodHlwZSA9PSBBVURJTykgPyAwIDogMDsKIApAQCAtNDU2LDYgKzU1Myw4IEBACiB9CiAKIGludDY0X3QgQVRTUGFyc2VyOjpQcm9ncmFtOjpjb252ZXJ0UFRTVG9UaW1lc3RhbXAodWludDY0X3QgUFRTKSB7CisgICAgUFRTID0gcmVjb3ZlclBUUyhQVFMpOworCiAgICAgaWYgKCEobVBhcnNlci0+bUZsYWdzICYgVFNfVElNRVNUQU1QU19BUkVfQUJTT0xVVEUpKSB7CiAgICAgICAgIGlmICghbUZpcnN0UFRTVmFsaWQpIHsKICAgICAgICAgICAgIG1GaXJzdFBUU1ZhbGlkID0gdHJ1ZTsKQEAgLTUzMCw2ICs2MjksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpBQzMpOwogICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX01FVEFEQVRBOgorICAgICAgICAgICAgbVF1ZXVlID0gbmV3IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZSgKKyAgICAgICAgICAgICAgICAgICAgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpNRVRBREFUQSk7CisgICAgICAgICAgICBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtNTQ5LDcgKzY1Myw4IEBACiAKIHN0YXR1c190IEFUU1BhcnNlcjo6U3RyZWFtOjpwYXJzZSgKICAgICAgICAgdW5zaWduZWQgY29udGludWl0eV9jb3VudGVyLAotICAgICAgICB1bnNpZ25lZCBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yLCBBQml0UmVhZGVyICpicikgeworICAgICAgICB1bnNpZ25lZCBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yLCBBQml0UmVhZGVyICpiciwKKyAgICAgICAgU3luY0V2ZW50ICpldmVudCkgewogICAgIGlmIChtUXVldWUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQpAQCAtNTgwLDE5ICs2ODUsMjIgQEAKICAgICBtRXhwZWN0ZWRDb250aW51aXR5Q291bnRlciA9IChjb250aW51aXR5X2NvdW50ZXIgKyAxKSAmIDB4MGY7CiAKICAgICBpZiAocGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvcikgeworICAgICAgICBvZmY2NF90IG9mZnNldCA9IChldmVudCAhPSBOVUxMKSA/IGV2ZW50LT5nZXRPZmZzZXQoKSA6IDA7CiAgICAgICAgIGlmIChtUGF5bG9hZFN0YXJ0ZWQpIHsKICAgICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSBydW4gdGhlIGRhbmdlciBvZiByZWNlaXZpbmcgdGhlIHRyYWlsaW5nIGJ5dGVzCiAgICAgICAgICAgICAvLyBvZiBhIFBFUyBwYWNrZXQgdGhhdCB3ZSBuZXZlciBzYXcgdGhlIHN0YXJ0IG9mIGFuZCBhc3N1bWluZwogICAgICAgICAgICAgLy8gd2UgaGF2ZSBhIGEgY29tcGxldGUgUEVTIHBhY2tldC4KIAotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZmx1c2goKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGZsdXNoKGV2ZW50KTsKIAogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgQUxPR1coIkVycm9yICglMDh4KSBoYXBwZW5lZCB3aGlsZSBmbHVzaGluZzsgd2Ugc2ltcGx5IGRpc2NhcmQgIgorICAgICAgICAgICAgICAgICAgICAgICJ0aGUgUEVTIHBhY2tldCBhbmQgY29udGludWUuIiwgZXJyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIG1QYXlsb2FkU3RhcnRlZCA9IHRydWU7CisgICAgICAgIG1QZXNTdGFydE9mZnNldCA9IG9mZnNldDsKICAgICB9CiAKICAgICBpZiAoIW1QYXlsb2FkU3RhcnRlZCkgewpAQCAtNjAwLDcgKzcwOCwxMCBAQAogICAgIH0KIAogICAgIHNpemVfdCBwYXlsb2FkU2l6ZUJpdHMgPSBici0+bnVtQml0c0xlZnQoKTsKLSAgICBDSEVDS19FUShwYXlsb2FkU2l6ZUJpdHMgJSA4LCAwdSk7CisgICAgaWYgKHBheWxvYWRTaXplQml0cyAlIDggIT0gMHUpIHsKKyAgICAgICAgQUxPR0UoIldyb25nIHZhbHVlIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogCiAgICAgc2l6ZV90IG5lZWRlZFNpemUgPSBtQnVmZmVyLT5zaXplKCkgKyBwYXlsb2FkU2l6ZUJpdHMgLyA4OwogICAgIGlmIChtQnVmZmVyLT5jYXBhY2l0eSgpIDwgbmVlZGVkU2l6ZSkgewpAQCAtNjQ4LDYgKzc1OSwxMyBAQAogICAgIH0KIH0KIAorYm9vbCBBVFNQYXJzZXI6OlN0cmVhbTo6aXNNZXRhKCkgY29uc3QgeworICAgIGlmIChtU3RyZWFtVHlwZSA9PSBTVFJFQU1UWVBFX01FVEFEQVRBKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIHZvaWQgQVRTUGFyc2VyOjpTdHJlYW06OnNpZ25hbERpc2NvbnRpbnVpdHkoCiAgICAgICAgIERpc2NvbnRpbnVpdHlUeXBlIHR5cGUsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZXh0cmEpIHsKICAgICBtRXhwZWN0ZWRDb250aW51aXR5Q291bnRlciA9IC0xOwpAQCAtNjU3LDYgKzc3NSw3IEBACiAgICAgfQogCiAgICAgbVBheWxvYWRTdGFydGVkID0gZmFsc2U7CisgICAgbUVPU1JlYWNoZWQgPSBmYWxzZTsKICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKIAogICAgIGJvb2wgY2xlYXJGb3JtYXQgPSBmYWxzZTsKQEAgLTY5NSwxMCArODE0LDEwIEBACiAgICAgICAgIG1Tb3VyY2UtPnNpZ25hbEVPUyhmaW5hbFJlc3VsdCk7CiAgICAgfQogICAgIG1FT1NSZWFjaGVkID0gdHJ1ZTsKLSAgICBmbHVzaCgpOworICAgIGZsdXNoKE5VTEwpOwogfQogCi1zdGF0dXNfdCBBVFNQYXJzZXI6OlN0cmVhbTo6cGFyc2VQRVMoQUJpdFJlYWRlciAqYnIpIHsKK3N0YXR1c190IEFUU1BhcnNlcjo6U3RyZWFtOjpwYXJzZVBFUyhBQml0UmVhZGVyICpiciwgU3luY0V2ZW50ICpldmVudCkgewogICAgIHVuc2lnbmVkIHBhY2tldF9zdGFydGNvZGVfcHJlZml4ID0gYnItPmdldEJpdHMoMjQpOwogCiAgICAgQUxPR1YoInBhY2tldF9zdGFydGNvZGVfcHJlZml4ID0gMHglMDh4IiwgcGFja2V0X3N0YXJ0Y29kZV9wcmVmaXgpOwpAQCAtNzEwLDggKzgyOSw2IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgQ0hFQ0tfRVEocGFja2V0X3N0YXJ0Y29kZV9wcmVmaXgsIDB4MDAwMDAxdSk7Ci0KICAgICB1bnNpZ25lZCBzdHJlYW1faWQgPSBici0+Z2V0Qml0cyg4KTsKICAgICBBTE9HVigic3RyZWFtX2lkID0gMHglMDJ4Iiwgc3RyZWFtX2lkKTsKIApAQCAtNzI2LDcgKzg0Myw5IEBACiAgICAgICAgICAgICAmJiBzdHJlYW1faWQgIT0gMHhmZiAgLy8gcHJvZ3JhbV9zdHJlYW1fZGlyZWN0b3J5CiAgICAgICAgICAgICAmJiBzdHJlYW1faWQgIT0gMHhmMiAgLy8gRFNNQ0MKICAgICAgICAgICAgICYmIHN0cmVhbV9pZCAhPSAweGY4KSB7ICAvLyBILjIyMi4xIHR5cGUgRQotICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygyKSwgMnUpOworICAgICAgICBpZiAoYnItPmdldEJpdHMoMikgIT0gMnUpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KIAogICAgICAgICBNWV9MT0dWKCJQRVNfc2NyYW1ibGluZ19jb250cm9sID0gJXUiLCBici0+Z2V0Qml0cygyKSk7CiAgICAgICAgIE1ZX0xPR1YoIlBFU19wcmlvcml0eSA9ICV1IiwgYnItPmdldEJpdHMoMSkpOwpAQCAtNzYwLDM0ICs4NzksNTEgQEAKICAgICAgICAgdWludDY0X3QgUFRTID0gMCwgRFRTID0gMDsKIAogICAgICAgICBpZiAoUFRTX0RUU19mbGFncyA9PSAyIHx8IFBUU19EVFNfZmxhZ3MgPT0gMykgewotICAgICAgICAgICAgQ0hFQ0tfR0Uob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nLCA1dSk7CisgICAgICAgICAgICBpZiAob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIDwgNXUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoYnItPmdldEJpdHMoNCkgIT0gUFRTX0RUU19mbGFncykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJQRVMgZGF0YSBFcnJvciEiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgUFRTID0gKCh1aW50NjRfdClici0+Z2V0Qml0cygzKSkgPDwgMzA7Ci0gICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgaWYgKGJyLT5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIFBUUyB8PSAoKHVpbnQ2NF90KWJyLT5nZXRCaXRzKDE1KSkgPDwgMTU7Ci0gICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgaWYgKGJyLT5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIFBUUyB8PSBici0+Z2V0Qml0cygxNSk7Ci0gICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgaWYgKGJyLT5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQUxPR1YoIlBUUyA9IDB4JTAxNiIgUFJJeDY0ICIgKCUuMmYpIiwgUFRTLCBQVFMgLyA5MDAwMC4wKTsKIAogICAgICAgICAgICAgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIC09IDU7CiAKICAgICAgICAgICAgIGlmIChQVFNfRFRTX2ZsYWdzID09IDMpIHsKLSAgICAgICAgICAgICAgICBDSEVDS19HRShvcHRpb25hbF9ieXRlc19yZW1haW5pbmcsIDV1KTsKKyAgICAgICAgICAgICAgICBpZiAob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIDwgNXUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cyg0KSwgMXUpOworICAgICAgICAgICAgICAgIGlmIChici0+Z2V0Qml0cyg0KSAhPSAxdSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIERUUyA9ICgodWludDY0X3QpYnItPmdldEJpdHMoMykpIDw8IDMwOwotICAgICAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICAgICAgaWYgKGJyLT5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIERUUyB8PSAoKHVpbnQ2NF90KWJyLT5nZXRCaXRzKDE1KSkgPDwgMTU7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgICAgICBpZiAoYnItPmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgRFRTIHw9IGJyLT5nZXRCaXRzKDE1KTsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgICAgIGlmIChici0+Z2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIEFMT0dWKCJEVFMgPSAlIiBQUkl1NjQsIERUUyk7CiAKQEAgLTc5NiwzMSArOTMyLDQ3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoRVNDUl9mbGFnKSB7Ci0gICAgICAgICAgICBDSEVDS19HRShvcHRpb25hbF9ieXRlc19yZW1haW5pbmcsIDZ1KTsKKyAgICAgICAgICAgIGlmIChvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgPCA2dSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJyLT5nZXRCaXRzKDIpOwogCiAgICAgICAgICAgICB1aW50NjRfdCBFU0NSID0gKCh1aW50NjRfdClici0+Z2V0Qml0cygzKSkgPDwgMzA7Ci0gICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgaWYgKGJyLT5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIEVTQ1IgfD0gKCh1aW50NjRfdClici0+Z2V0Qml0cygxNSkpIDw8IDE1OwotICAgICAgICAgICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIGlmIChici0+Z2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBFU0NSIHw9IGJyLT5nZXRCaXRzKDE1KTsKLSAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICBpZiAoYnItPmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBBTE9HVigiRVNDUiA9ICUiIFBSSXU2NCwgRVNDUik7CiAgICAgICAgICAgICBNWV9MT0dWKCJFU0NSX2V4dGVuc2lvbiA9ICV1IiwgYnItPmdldEJpdHMoOSkpOwogCi0gICAgICAgICAgICBDSEVDS19FUShici0+Z2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgaWYgKGJyLT5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIC09IDY7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoRVNfcmF0ZV9mbGFnKSB7Ci0gICAgICAgICAgICBDSEVDS19HRShvcHRpb25hbF9ieXRlc19yZW1haW5pbmcsIDN1KTsKKyAgICAgICAgICAgIGlmIChvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgPCAzdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICBpZiAoYnItPmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogICAgICAgICAgICAgTVlfTE9HVigiRVNfcmF0ZSA9ICV1IiwgYnItPmdldEJpdHMoMjIpKTsKLSAgICAgICAgICAgIENIRUNLX0VRKGJyLT5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICBpZiAoYnItPmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgLT0gMzsKICAgICAgICAgfQpAQCAtODMwLDcgKzk4Miw5IEBACiAgICAgICAgIC8vIEVTIGRhdGEgZm9sbG93cy4KIAogICAgICAgICBpZiAoUEVTX3BhY2tldF9sZW5ndGggIT0gMCkgewotICAgICAgICAgICAgQ0hFQ0tfR0UoUEVTX3BhY2tldF9sZW5ndGgsIFBFU19oZWFkZXJfZGF0YV9sZW5ndGggKyAzKTsKKyAgICAgICAgICAgIGlmIChQRVNfcGFja2V0X2xlbmd0aCA8IFBFU19oZWFkZXJfZGF0YV9sZW5ndGggKyAzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdW5zaWduZWQgZGF0YUxlbmd0aCA9CiAgICAgICAgICAgICAgICAgUEVTX3BhY2tldF9sZW5ndGggLSAzIC0gUEVTX2hlYWRlcl9kYXRhX2xlbmd0aDsKQEAgLTg0MywzNSArOTk3LDM5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQ0hFQ0tfR0UoYnItPm51bUJpdHNMZWZ0KCksIGRhdGFMZW5ndGggKiA4KTsKLQogICAgICAgICAgICAgb25QYXlsb2FkRGF0YSgKLSAgICAgICAgICAgICAgICAgICAgUFRTX0RUU19mbGFncywgUFRTLCBEVFMsIGJyLT5kYXRhKCksIGRhdGFMZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBQVFNfRFRTX2ZsYWdzLCBQVFMsIERUUywgYnItPmRhdGEoKSwgZGF0YUxlbmd0aCwgZXZlbnQpOwogCiAgICAgICAgICAgICBici0+c2tpcEJpdHMoZGF0YUxlbmd0aCAqIDgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgb25QYXlsb2FkRGF0YSgKICAgICAgICAgICAgICAgICAgICAgUFRTX0RUU19mbGFncywgUFRTLCBEVFMsCi0gICAgICAgICAgICAgICAgICAgIGJyLT5kYXRhKCksIGJyLT5udW1CaXRzTGVmdCgpIC8gOCk7CisgICAgICAgICAgICAgICAgICAgIGJyLT5kYXRhKCksIGJyLT5udW1CaXRzTGVmdCgpIC8gOCwgZXZlbnQpOwogCiAgICAgICAgICAgICBzaXplX3QgcGF5bG9hZFNpemVCaXRzID0gYnItPm51bUJpdHNMZWZ0KCk7Ci0gICAgICAgICAgICBDSEVDS19FUShwYXlsb2FkU2l6ZUJpdHMgJSA4LCAwdSk7CisgICAgICAgICAgICBpZiAocGF5bG9hZFNpemVCaXRzICUgOCAhPSAwdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEFMT0dWKCJUaGVyZSdzICV6dSBieXRlcyBvZiBwYXlsb2FkLiIsIHBheWxvYWRTaXplQml0cyAvIDgpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChzdHJlYW1faWQgPT0gMHhiZSkgeyAgLy8gcGFkZGluZ19zdHJlYW0KLSAgICAgICAgQ0hFQ0tfTkUoUEVTX3BhY2tldF9sZW5ndGgsIDB1KTsKKyAgICAgICAgaWYgKFBFU19wYWNrZXRfbGVuZ3RoID09IDB1KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CiAgICAgICAgIGJyLT5za2lwQml0cyhQRVNfcGFja2V0X2xlbmd0aCAqIDgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIENIRUNLX05FKFBFU19wYWNrZXRfbGVuZ3RoLCAwdSk7CisgICAgICAgIGlmIChQRVNfcGFja2V0X2xlbmd0aCA9PSAwdSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQogICAgICAgICBici0+c2tpcEJpdHMoUEVTX3BhY2tldF9sZW5ndGggKiA4KTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IEFUU1BhcnNlcjo6U3RyZWFtOjpmbHVzaCgpIHsKLSAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpID09IDApIHsKK3N0YXR1c190IEFUU1BhcnNlcjo6U3RyZWFtOjpmbHVzaChTeW5jRXZlbnQgKmV2ZW50KSB7CisgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQnVmZmVyLT5zaXplKCkgPT0gMCkgewogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCkBAIC04NzksNyArMTAzNyw3IEBACiAKICAgICBBQml0UmVhZGVyIGJyKG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKIAotICAgIHN0YXR1c190IGVyciA9IHBhcnNlUEVTKCZicik7CisgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VQRVMoJmJyLCBldmVudCk7CiAKICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKIApAQCAtODg4LDcgKzEwNDYsNyBAQAogCiB2b2lkIEFUU1BhcnNlcjo6U3RyZWFtOjpvblBheWxvYWREYXRhKAogICAgICAgICB1bnNpZ25lZCBQVFNfRFRTX2ZsYWdzLCB1aW50NjRfdCBQVFMsIHVpbnQ2NF90IC8qIERUUyAqLywKLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUsIFN5bmNFdmVudCAqZXZlbnQpIHsKICNpZiAwCiAgICAgQUxPR0koInBheWxvYWQgc3RyZWFtVHlwZSAweCUwMngsIFBUUyA9IDB4JTAxNmxseCwgZFBUUyA9ICVsbGQiLAogICAgICAgICAgIG1TdHJlYW1UeXBlLApAQCAtOTE1LDYgKzEwNzMsNyBAQAogICAgIH0KIAogICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQ7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwogICAgIHdoaWxlICgoYWNjZXNzVW5pdCA9IG1RdWV1ZS0+ZGVxdWV1ZUFjY2Vzc1VuaXQoKSkgIT0gTlVMTCkgewogICAgICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1RdWV1ZS0+Z2V0Rm9ybWF0KCk7CkBAIC05NDIsNiArMTEwMSwxNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKChldmVudCAhPSBOVUxMKSAmJiAhZm91bmQgJiYgbVF1ZXVlLT5nZXRGb3JtYXQoKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBpbnQzMl90IHN5bmMgPSAwOworICAgICAgICAgICAgaWYgKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDMyKCJpc1N5bmMiLCAmc3luYykgJiYgc3luYykgeworICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgICAgIGlmIChhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBldmVudC0+aW5pdChtUGVzU3RhcnRPZmZzZXQsIG1Tb3VyY2UsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogfQogCkBAIC05NjMsNiArMTEzMywxNCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE1FVEE6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpc01ldGEoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtU291cmNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtOTc3LDYgKzExNTUsNyBAQAogICAgICAgbUFic29sdXRlVGltZUFuY2hvclVzKC0xbGwpLAogICAgICAgbVRpbWVPZmZzZXRWYWxpZChmYWxzZSksCiAgICAgICBtVGltZU9mZnNldFVzKDBsbCksCisgICAgICBtTGFzdFJlY292ZXJlZFBUUygtMWxsKSwKICAgICAgIG1OdW1UU1BhY2tldHNQYXJzZWQoMCksCiAgICAgICBtTnVtUENScygwKSB7CiAgICAgbVBTSVNlY3Rpb25zLmFkZCgwIC8qIFBJRCAqLywgbmV3IFBTSVNlY3Rpb24pOwpAQCAtOTg1LDMxICsxMTY0LDU0IEBACiBBVFNQYXJzZXI6On5BVFNQYXJzZXIoKSB7CiB9CiAKLXN0YXR1c190IEFUU1BhcnNlcjo6ZmVlZFRTUGFja2V0KGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgQ0hFQ0tfRVEoc2l6ZSwga1RTUGFja2V0U2l6ZSk7CitzdGF0dXNfdCBBVFNQYXJzZXI6OmZlZWRUU1BhY2tldChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgU3luY0V2ZW50ICpldmVudCkgeworICAgIGlmIChzaXplICE9IGtUU1BhY2tldFNpemUpIHsKKyAgICAgICAgQUxPR0UoIldyb25nIFRTIHBhY2tldCBzaXplIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogCiAgICAgQUJpdFJlYWRlciBicigoY29uc3QgdWludDhfdCAqKWRhdGEsIGtUU1BhY2tldFNpemUpOwotICAgIHJldHVybiBwYXJzZVRTKCZicik7CisgICAgcmV0dXJuIHBhcnNlVFMoJmJyLCBldmVudCk7CiB9CiAKIHZvaWQgQVRTUGFyc2VyOjpzaWduYWxEaXNjb250aW51aXR5KAogICAgICAgICBEaXNjb250aW51aXR5VHlwZSB0eXBlLCBjb25zdCBzcDxBTWVzc2FnZT4gJmV4dHJhKSB7CiAgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKLSAgICBpZiAoKHR5cGUgJiBESVNDT05USU5VSVRZX1RJTUUpCi0gICAgICAgICAgICAmJiBleHRyYSAhPSBOVUxMCi0gICAgICAgICAgICAmJiBleHRyYS0+ZmluZEludDY0KAotICAgICAgICAgICAgICAgIElTdHJlYW1MaXN0ZW5lcjo6a0tleU1lZGlhVGltZVVzLCAmbWVkaWFUaW1lVXMpKSB7Ci0gICAgICAgIG1BYnNvbHV0ZVRpbWVBbmNob3JVcyA9IG1lZGlhVGltZVVzOworICAgIGlmICgodHlwZSAmIERJU0NPTlRJTlVJVFlfVElNRSkgJiYgZXh0cmEgIT0gTlVMTCkgeworICAgICAgICBpZiAoZXh0cmEtPmZpbmRJbnQ2NChJU3RyZWFtTGlzdGVuZXI6OmtLZXlNZWRpYVRpbWVVcywgJm1lZGlhVGltZVVzKSkgeworICAgICAgICAgICAgbUFic29sdXRlVGltZUFuY2hvclVzID0gbWVkaWFUaW1lVXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChtRmxhZ3MgJiBUU19USU1FU1RBTVBTX0FSRV9BQlNPTFVURSkKKyAgICAgICAgICAgICAgICAmJiBleHRyYS0+ZmluZEludDY0KAorICAgICAgICAgICAgICAgICAgICBJU3RyZWFtTGlzdGVuZXI6OmtLZXlSZWNlbnRNZWRpYVRpbWVVcywgJm1lZGlhVGltZVVzKSkgeworICAgICAgICAgICAgaWYgKG1BYnNvbHV0ZVRpbWVBbmNob3JVcyA+PSAwbGwpIHsKKyAgICAgICAgICAgICAgICBtZWRpYVRpbWVVcyAtPSBtQWJzb2x1dGVUaW1lQW5jaG9yVXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVRpbWVPZmZzZXRWYWxpZCkgeworICAgICAgICAgICAgICAgIG1lZGlhVGltZVVzIC09IG1UaW1lT2Zmc2V0VXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTGFzdFJlY292ZXJlZFBUUyA9IChtZWRpYVRpbWVVcyAqIDkpIC8gMTAwOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmICh0eXBlID09IERJU0NPTlRJTlVJVFlfQUJTT0xVVEVfVElNRSkgewogICAgICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICAgICAgQ0hFQ0soZXh0cmEtPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworICAgICAgICBpZiAoIWV4dHJhLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKSB7CisgICAgICAgICAgICBBTE9HRSgidGltZVVzIG5vdCBmb3VuZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAKLSAgICAgICAgQ0hFQ0sobVByb2dyYW1zLmVtcHR5KCkpOworICAgICAgICBpZiAoIW1Qcm9ncmFtcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HRSgibVByb2dyYW1zIGlzIG5vdCBlbXB0eSIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgICAgIG1BYnNvbHV0ZVRpbWVBbmNob3JVcyA9IHRpbWVVczsKICAgICAgICAgcmV0dXJuOwogICAgIH0gZWxzZSBpZiAodHlwZSA9PSBESVNDT05USU5VSVRZX1RJTUVfT0ZGU0VUKSB7CiAgICAgICAgIGludDY0X3Qgb2Zmc2V0OwotICAgICAgICBDSEVDSyhleHRyYS0+ZmluZEludDY0KCJvZmZzZXQiLCAmb2Zmc2V0KSk7CisgICAgICAgIGlmICghZXh0cmEtPmZpbmRJbnQ2NCgib2Zmc2V0IiwgJm9mZnNldCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJvZmZzZXQgbm90IGZvdW5kIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAogICAgICAgICBtVGltZU9mZnNldFZhbGlkID0gdHJ1ZTsKICAgICAgICAgbVRpbWVPZmZzZXRVcyA9IG9mZnNldDsKQEAgLTEwMjIsNyArMTIyNCwxMCBAQAogfQogCiB2b2lkIEFUU1BhcnNlcjo6c2lnbmFsRU9TKHN0YXR1c190IGZpbmFsUmVzdWx0KSB7Ci0gICAgQ0hFQ0tfTkUoZmluYWxSZXN1bHQsIChzdGF0dXNfdClPSyk7CisgICAgaWYgKGZpbmFsUmVzdWx0ID09IChzdGF0dXNfdCkgT0spIHsKKyAgICAgICAgQUxPR0UoImZpbmFsUmVzdWx0IG5vdCBPSyIpOworICAgICAgICByZXR1cm47CisgICAgfQogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUHJvZ3JhbXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgbVByb2dyYW1zLmVkaXRJdGVtQXQoaSktPnNpZ25hbEVPUyhmaW5hbFJlc3VsdCk7CkBAIC0xMDM4LDE0ICsxMjQzLDEyIEBACiAgICAgfQogICAgIHVuc2lnbmVkIHNlY3Rpb25fc3ludGF4X2luZGljdG9yID0gYnItPmdldEJpdHMoMSk7CiAgICAgQUxPR1YoIiAgc2VjdGlvbl9zeW50YXhfaW5kaWN0b3IgPSAldSIsIHNlY3Rpb25fc3ludGF4X2luZGljdG9yKTsKLSAgICBDSEVDS19FUShzZWN0aW9uX3N5bnRheF9pbmRpY3RvciwgMXUpOwogCi0gICAgQ0hFQ0tfRVEoYnItPmdldEJpdHMoMSksIDB1KTsKKyAgICBici0+c2tpcEJpdHMoMSk7ICAvLyAnMCcKICAgICBNWV9MT0dWKCIgIHJlc2VydmVkID0gJXUiLCBici0+Z2V0Qml0cygyKSk7CiAKICAgICB1bnNpZ25lZCBzZWN0aW9uX2xlbmd0aCA9IGJyLT5nZXRCaXRzKDEyKTsKICAgICBBTE9HVigiICBzZWN0aW9uX2xlbmd0aCA9ICV1Iiwgc2VjdGlvbl9sZW5ndGgpOwotICAgIENIRUNLX0VRKHNlY3Rpb25fbGVuZ3RoICYgMHhjMDAsIDB1KTsKIAogICAgIE1ZX0xPR1YoIiAgdHJhbnNwb3J0X3N0cmVhbV9pZCA9ICV1IiwgYnItPmdldEJpdHMoMTYpKTsKICAgICBNWV9MT0dWKCIgIHJlc2VydmVkID0gJXUiLCBici0+Z2V0Qml0cygyKSk7CkBAIC0xMDU1LDcgKzEyNTgsNiBAQAogICAgIE1ZX0xPR1YoIiAgbGFzdF9zZWN0aW9uX251bWJlciA9ICV1IiwgYnItPmdldEJpdHMoOCkpOwogCiAgICAgc2l6ZV90IG51bVByb2dyYW1CeXRlcyA9IChzZWN0aW9uX2xlbmd0aCAtIDUgLyogaGVhZGVyICovIC0gNCAvKiBjcmMgKi8pOwotICAgIENIRUNLX0VRKChudW1Qcm9ncmFtQnl0ZXMgJSA0KSwgMHUpOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1Qcm9ncmFtQnl0ZXMgLyA0OyArK2kpIHsKICAgICAgICAgdW5zaWduZWQgcHJvZ3JhbV9udW1iZXIgPSBici0+Z2V0Qml0cygxNik7CkBAIC0xMDgzLDcgKzEyODUsNyBAQAogCiAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CiAgICAgICAgICAgICAgICAgbVByb2dyYW1zLnB1c2goCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvZ3JhbSh0aGlzLCBwcm9ncmFtX251bWJlciwgcHJvZ3JhbU1hcFBJRCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFByb2dyYW0odGhpcywgcHJvZ3JhbV9udW1iZXIsIHByb2dyYW1NYXBQSUQsIG1MYXN0UmVjb3ZlcmVkUFRTKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtUFNJU2VjdGlvbnMuaW5kZXhPZktleShwcm9ncmFtTWFwUElEKSA8IDApIHsKQEAgLTEwOTgsNyArMTMwMCw4IEBACiBzdGF0dXNfdCBBVFNQYXJzZXI6OnBhcnNlUElEKAogICAgICAgICBBQml0UmVhZGVyICpiciwgdW5zaWduZWQgUElELAogICAgICAgICB1bnNpZ25lZCBjb250aW51aXR5X2NvdW50ZXIsCi0gICAgICAgIHVuc2lnbmVkIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IpIHsKKyAgICAgICAgdW5zaWduZWQgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwKKyAgICAgICAgU3luY0V2ZW50ICpldmVudCkgewogICAgIHNzaXplX3Qgc2VjdGlvbkluZGV4ID0gbVBTSVNlY3Rpb25zLmluZGV4T2ZLZXkoUElEKTsKIAogICAgIGlmIChzZWN0aW9uSW5kZXggPj0gMCkgewpAQCAtMTEwNiwxNCArMTMwOSwxOCBAQAogCiAgICAgICAgIGlmIChwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yKSB7CiAgICAgICAgICAgICBpZiAoIXNlY3Rpb24tPmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICBBTE9HVygicGFyc2VQSUQgZW5jb3VudGVycyBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yIHdoZW4gc2VjdGlvbiBpcyBub3QgZW1wdHkiKTsKKyAgICAgICAgICAgICAgICBzZWN0aW9uLT5jbGVhcigpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB1bnNpZ25lZCBza2lwID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICBzZWN0aW9uLT5zZXRTa2lwQnl0ZXMoc2tpcCArIDEpOyAgLy8gc2tpcCBmaWxsZXIgYnl0ZXMgKyBwb2ludGVyIGZpZWxkIGl0c2VsZgogICAgICAgICAgICAgYnItPnNraXBCaXRzKHNraXAgKiA4KTsKICAgICAgICAgfQogCi0gICAgICAgIENIRUNLKChici0+bnVtQml0c0xlZnQoKSAlIDgpID09IDApOworICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgJSA4ICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KICAgICAgICAgc3RhdHVzX3QgZXJyID0gc2VjdGlvbi0+YXBwZW5kKGJyLT5kYXRhKCksIGJyLT5udW1CaXRzTGVmdCgpIC8gOCk7CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMTEyNCw2ICsxMzMxLDkgQEAKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogCisgICAgICAgIGlmICghc2VjdGlvbi0+aXNDUkNPa2F5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KICAgICAgICAgQUJpdFJlYWRlciBzZWN0aW9uQml0cyhzZWN0aW9uLT5kYXRhKCksIHNlY3Rpb24tPnNpemUoKSk7CiAKICAgICAgICAgaWYgKFBJRCA9PSAwKSB7CkBAIC0xMTYzLDcgKzEzNzMsNyBAQAogICAgICAgICBzdGF0dXNfdCBlcnI7CiAgICAgICAgIGlmIChtUHJvZ3JhbXMuZWRpdEl0ZW1BdChpKS0+cGFyc2VQSUQoCiAgICAgICAgICAgICAgICAgICAgIFBJRCwgY29udGludWl0eV9jb3VudGVyLCBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yLAotICAgICAgICAgICAgICAgICAgICBiciwgJmVycikpIHsKKyAgICAgICAgICAgICAgICAgICAgYnIsICZlcnIsIGV2ZW50KSkgewogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CkBAIC0xMTgwLDEwICsxMzkwLDE1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIEFUU1BhcnNlcjo6cGFyc2VBZGFwdGF0aW9uRmllbGQoQUJpdFJlYWRlciAqYnIsIHVuc2lnbmVkIFBJRCkgeworc3RhdHVzX3QgQVRTUGFyc2VyOjpwYXJzZUFkYXB0YXRpb25GaWVsZChBQml0UmVhZGVyICpiciwgdW5zaWduZWQgUElEKSB7CiAgICAgdW5zaWduZWQgYWRhcHRhdGlvbl9maWVsZF9sZW5ndGggPSBici0+Z2V0Qml0cyg4KTsKIAogICAgIGlmIChhZGFwdGF0aW9uX2ZpZWxkX2xlbmd0aCA+IDApIHsKKyAgICAgICAgaWYgKGFkYXB0YXRpb25fZmllbGRfbGVuZ3RoICogOCA+IGJyLT5udW1CaXRzTGVmdCgpKSB7CisgICAgICAgICAgICBBTE9HVigiQWRhcHRhdGlvbiBmaWVsZCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYSBzaW5nbGUgVFMgcGFja2V0LiIpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCiAgICAgICAgIHVuc2lnbmVkIGRpc2NvbnRpbnVpdHlfaW5kaWNhdG9yID0gYnItPmdldEJpdHMoMSk7CiAKICAgICAgICAgaWYgKGRpc2NvbnRpbnVpdHlfaW5kaWNhdG9yKSB7CkBAIC0xMTk2LDYgKzE0MTEsOSBAQAogICAgICAgICBzaXplX3QgbnVtQml0c1JlYWQgPSA0OwogCiAgICAgICAgIGlmIChQQ1JfZmxhZykgeworICAgICAgICAgICAgaWYgKGFkYXB0YXRpb25fZmllbGRfbGVuZ3RoICogOCA8IDUyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyLT5za2lwQml0cyg0KTsKICAgICAgICAgICAgIHVpbnQ2NF90IFBDUl9iYXNlID0gYnItPmdldEJpdHMoMzIpOwogICAgICAgICAgICAgUENSX2Jhc2UgPSAoUENSX2Jhc2UgPDwgMSkgfCBici0+Z2V0Qml0cygxKTsKQEAgLTEyMjYsMTMgKzE0NDQsMTIgQEAKICAgICAgICAgICAgIG51bUJpdHNSZWFkICs9IDUyOwogICAgICAgICB9CiAKLSAgICAgICAgQ0hFQ0tfR0UoYWRhcHRhdGlvbl9maWVsZF9sZW5ndGggKiA4LCBudW1CaXRzUmVhZCk7Ci0KICAgICAgICAgYnItPnNraXBCaXRzKGFkYXB0YXRpb25fZmllbGRfbGVuZ3RoICogOCAtIG51bUJpdHNSZWFkKTsKICAgICB9CisgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBBVFNQYXJzZXI6OnBhcnNlVFMoQUJpdFJlYWRlciAqYnIpIHsKK3N0YXR1c190IEFUU1BhcnNlcjo6cGFyc2VUUyhBQml0UmVhZGVyICpiciwgU3luY0V2ZW50ICpldmVudCkgewogICAgIEFMT0dWKCItLS0iKTsKIAogICAgIHVuc2lnbmVkIHN5bmNfYnl0ZSA9IGJyLT5nZXRCaXRzKDgpOwpAQCAtMTI2NCwxNSArMTQ4MSwxNiBAQAogCiAgICAgLy8gQUxPR0koIlBJRCA9IDB4JTA0eCwgY29udGludWl0eV9jb3VudGVyID0gJXUiLCBQSUQsIGNvbnRpbnVpdHlfY291bnRlcik7CiAKLSAgICBpZiAoYWRhcHRhdGlvbl9maWVsZF9jb250cm9sID09IDIgfHwgYWRhcHRhdGlvbl9maWVsZF9jb250cm9sID09IDMpIHsKLSAgICAgICAgcGFyc2VBZGFwdGF0aW9uRmllbGQoYnIsIFBJRCk7Ci0gICAgfQotCiAgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAKLSAgICBpZiAoYWRhcHRhdGlvbl9maWVsZF9jb250cm9sID09IDEgfHwgYWRhcHRhdGlvbl9maWVsZF9jb250cm9sID09IDMpIHsKLSAgICAgICAgZXJyID0gcGFyc2VQSUQoCi0gICAgICAgICAgICAgICAgYnIsIFBJRCwgY29udGludWl0eV9jb3VudGVyLCBwYXlsb2FkX3VuaXRfc3RhcnRfaW5kaWNhdG9yKTsKKyAgICBpZiAoYWRhcHRhdGlvbl9maWVsZF9jb250cm9sID09IDIgfHwgYWRhcHRhdGlvbl9maWVsZF9jb250cm9sID09IDMpIHsKKyAgICAgICAgZXJyID0gcGFyc2VBZGFwdGF0aW9uRmllbGQoYnIsIFBJRCk7CisgICAgfQorICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgaWYgKGFkYXB0YXRpb25fZmllbGRfY29udHJvbCA9PSAxIHx8IGFkYXB0YXRpb25fZmllbGRfY29udHJvbCA9PSAzKSB7CisgICAgICAgICAgICBlcnIgPSBwYXJzZVBJRChiciwgUElELCBjb250aW51aXR5X2NvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IsIGV2ZW50KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgICsrbU51bVRTUGFja2V0c1BhcnNlZDsKQEAgLTEzNDYsNyArMTU2NCw3OSBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1BVFNQYXJzZXI6OlBTSVNlY3Rpb246OlBTSVNlY3Rpb24oKSB7CisKKy8vIENSQzMyIHVzZWQgZm9yIFBTSSBzZWN0aW9uLiBUaGUgdGFibGUgd2FzIGdlbmVyYXRlZCBieSBmb2xsb3dpbmcgY29tbWFuZDoKKy8vICQgcHl0aG9uIHB5Y3JjLnB5IC0tbW9kZWwgY3JjLTMyLW1wZWcgLS1hbGdvcml0aG0gdGFibGUtZHJpdmVuIC0tZ2VuZXJhdGUgYworLy8gVmlzaXQgaHR0cDovL3d3dy50dHkxLm5ldC9weWNyYy9pbmRleF9lbi5odG1sIGZvciBtb3JlIGRldGFpbHMuCit1aW50MzJfdCBBVFNQYXJzZXI6OlBTSVNlY3Rpb246OkNSQ19UQUJMRVtdID0geworICAgIDB4MDAwMDAwMDAsIDB4MDRjMTFkYjcsIDB4MDk4MjNiNmUsIDB4MGQ0MzI2ZDksCisgICAgMHgxMzA0NzZkYywgMHgxN2M1NmI2YiwgMHgxYTg2NGRiMiwgMHgxZTQ3NTAwNSwKKyAgICAweDI2MDhlZGI4LCAweDIyYzlmMDBmLCAweDJmOGFkNmQ2LCAweDJiNGJjYjYxLAorICAgIDB4MzUwYzliNjQsIDB4MzFjZDg2ZDMsIDB4M2M4ZWEwMGEsIDB4Mzg0ZmJkYmQsCisgICAgMHg0YzExZGI3MCwgMHg0OGQwYzZjNywgMHg0NTkzZTAxZSwgMHg0MTUyZmRhOSwKKyAgICAweDVmMTVhZGFjLCAweDViZDRiMDFiLCAweDU2OTc5NmMyLCAweDUyNTY4Yjc1LAorICAgIDB4NmExOTM2YzgsIDB4NmVkODJiN2YsIDB4NjM5YjBkYTYsIDB4Njc1YTEwMTEsCisgICAgMHg3OTFkNDAxNCwgMHg3ZGRjNWRhMywgMHg3MDlmN2I3YSwgMHg3NDVlNjZjZCwKKyAgICAweDk4MjNiNmUwLCAweDljZTJhYjU3LCAweDkxYTE4ZDhlLCAweDk1NjA5MDM5LAorICAgIDB4OGIyN2MwM2MsIDB4OGZlNmRkOGIsIDB4ODJhNWZiNTIsIDB4ODY2NGU2ZTUsCisgICAgMHhiZTJiNWI1OCwgMHhiYWVhNDZlZiwgMHhiN2E5NjAzNiwgMHhiMzY4N2Q4MSwKKyAgICAweGFkMmYyZDg0LCAweGE5ZWUzMDMzLCAweGE0YWQxNmVhLCAweGEwNmMwYjVkLAorICAgIDB4ZDQzMjZkOTAsIDB4ZDBmMzcwMjcsIDB4ZGRiMDU2ZmUsIDB4ZDk3MTRiNDksCisgICAgMHhjNzM2MWI0YywgMHhjM2Y3MDZmYiwgMHhjZWI0MjAyMiwgMHhjYTc1M2Q5NSwKKyAgICAweGYyM2E4MDI4LCAweGY2ZmI5ZDlmLCAweGZiYjhiYjQ2LCAweGZmNzlhNmYxLAorICAgIDB4ZTEzZWY2ZjQsIDB4ZTVmZmViNDMsIDB4ZThiY2NkOWEsIDB4ZWM3ZGQwMmQsCisgICAgMHgzNDg2NzA3NywgMHgzMDQ3NmRjMCwgMHgzZDA0NGIxOSwgMHgzOWM1NTZhZSwKKyAgICAweDI3ODIwNmFiLCAweDIzNDMxYjFjLCAweDJlMDAzZGM1LCAweDJhYzEyMDcyLAorICAgIDB4MTI4ZTlkY2YsIDB4MTY0ZjgwNzgsIDB4MWIwY2E2YTEsIDB4MWZjZGJiMTYsCisgICAgMHgwMThhZWIxMywgMHgwNTRiZjZhNCwgMHgwODA4ZDA3ZCwgMHgwY2M5Y2RjYSwKKyAgICAweDc4OTdhYjA3LCAweDdjNTZiNmIwLCAweDcxMTU5MDY5LCAweDc1ZDQ4ZGRlLAorICAgIDB4NmI5M2RkZGIsIDB4NmY1MmMwNmMsIDB4NjIxMWU2YjUsIDB4NjZkMGZiMDIsCisgICAgMHg1ZTlmNDZiZiwgMHg1YTVlNWIwOCwgMHg1NzFkN2RkMSwgMHg1M2RjNjA2NiwKKyAgICAweDRkOWIzMDYzLCAweDQ5NWEyZGQ0LCAweDQ0MTkwYjBkLCAweDQwZDgxNmJhLAorICAgIDB4YWNhNWM2OTcsIDB4YTg2NGRiMjAsIDB4YTUyN2ZkZjksIDB4YTFlNmUwNGUsCisgICAgMHhiZmExYjA0YiwgMHhiYjYwYWRmYywgMHhiNjIzOGIyNSwgMHhiMmUyOTY5MiwKKyAgICAweDhhYWQyYjJmLCAweDhlNmMzNjk4LCAweDgzMmYxMDQxLCAweDg3ZWUwZGY2LAorICAgIDB4OTlhOTVkZjMsIDB4OWQ2ODQwNDQsIDB4OTAyYjY2OWQsIDB4OTRlYTdiMmEsCisgICAgMHhlMGI0MWRlNywgMHhlNDc1MDA1MCwgMHhlOTM2MjY4OSwgMHhlZGY3M2IzZSwKKyAgICAweGYzYjA2YjNiLCAweGY3NzE3NjhjLCAweGZhMzI1MDU1LCAweGZlZjM0ZGUyLAorICAgIDB4YzZiY2YwNWYsIDB4YzI3ZGVkZTgsIDB4Y2YzZWNiMzEsIDB4Y2JmZmQ2ODYsCisgICAgMHhkNWI4ODY4MywgMHhkMTc5OWIzNCwgMHhkYzNhYmRlZCwgMHhkOGZiYTA1YSwKKyAgICAweDY5MGNlMGVlLCAweDZkY2RmZDU5LCAweDYwOGVkYjgwLCAweDY0NGZjNjM3LAorICAgIDB4N2EwODk2MzIsIDB4N2VjOThiODUsIDB4NzM4YWFkNWMsIDB4Nzc0YmIwZWIsCisgICAgMHg0ZjA0MGQ1NiwgMHg0YmM1MTBlMSwgMHg0Njg2MzYzOCwgMHg0MjQ3MmI4ZiwKKyAgICAweDVjMDA3YjhhLCAweDU4YzE2NjNkLCAweDU1ODI0MGU0LCAweDUxNDM1ZDUzLAorICAgIDB4MjUxZDNiOWUsIDB4MjFkYzI2MjksIDB4MmM5ZjAwZjAsIDB4Mjg1ZTFkNDcsCisgICAgMHgzNjE5NGQ0MiwgMHgzMmQ4NTBmNSwgMHgzZjliNzYyYywgMHgzYjVhNmI5YiwKKyAgICAweDAzMTVkNjI2LCAweDA3ZDRjYjkxLCAweDBhOTdlZDQ4LCAweDBlNTZmMGZmLAorICAgIDB4MTAxMWEwZmEsIDB4MTRkMGJkNGQsIDB4MTk5MzliOTQsIDB4MWQ1Mjg2MjMsCisgICAgMHhmMTJmNTYwZSwgMHhmNWVlNGJiOSwgMHhmOGFkNmQ2MCwgMHhmYzZjNzBkNywKKyAgICAweGUyMmIyMGQyLCAweGU2ZWEzZDY1LCAweGViYTkxYmJjLCAweGVmNjgwNjBiLAorICAgIDB4ZDcyN2JiYjYsIDB4ZDNlNmE2MDEsIDB4ZGVhNTgwZDgsIDB4ZGE2NDlkNmYsCisgICAgMHhjNDIzY2Q2YSwgMHhjMGUyZDBkZCwgMHhjZGExZjYwNCwgMHhjOTYwZWJiMywKKyAgICAweGJkM2U4ZDdlLCAweGI5ZmY5MGM5LCAweGI0YmNiNjEwLCAweGIwN2RhYmE3LAorICAgIDB4YWUzYWZiYTIsIDB4YWFmYmU2MTUsIDB4YTdiOGMwY2MsIDB4YTM3OWRkN2IsCisgICAgMHg5YjM2NjBjNiwgMHg5ZmY3N2Q3MSwgMHg5MmI0NWJhOCwgMHg5Njc1NDYxZiwKKyAgICAweDg4MzIxNjFhLCAweDhjZjMwYmFkLCAweDgxYjAyZDc0LCAweDg1NzEzMGMzLAorICAgIDB4NWQ4YTkwOTksIDB4NTk0YjhkMmUsIDB4NTQwOGFiZjcsIDB4NTBjOWI2NDAsCisgICAgMHg0ZThlZTY0NSwgMHg0YTRmZmJmMiwgMHg0NzBjZGQyYiwgMHg0M2NkYzA5YywKKyAgICAweDdiODI3ZDIxLCAweDdmNDM2MDk2LCAweDcyMDA0NjRmLCAweDc2YzE1YmY4LAorICAgIDB4Njg4NjBiZmQsIDB4NmM0NzE2NGEsIDB4NjEwNDMwOTMsIDB4NjVjNTJkMjQsCisgICAgMHgxMTliNGJlOSwgMHgxNTVhNTY1ZSwgMHgxODE5NzA4NywgMHgxY2Q4NmQzMCwKKyAgICAweDAyOWYzZDM1LCAweDA2NWUyMDgyLCAweDBiMWQwNjViLCAweDBmZGMxYmVjLAorICAgIDB4Mzc5M2E2NTEsIDB4MzM1MmJiZTYsIDB4M2UxMTlkM2YsIDB4M2FkMDgwODgsCisgICAgMHgyNDk3ZDA4ZCwgMHgyMDU2Y2QzYSwgMHgyZDE1ZWJlMywgMHgyOWQ0ZjY1NCwKKyAgICAweGM1YTkyNjc5LCAweGMxNjgzYmNlLCAweGNjMmIxZDE3LCAweGM4ZWEwMGEwLAorICAgIDB4ZDZhZDUwYTUsIDB4ZDI2YzRkMTIsIDB4ZGYyZjZiY2IsIDB4ZGJlZTc2N2MsCisgICAgMHhlM2ExY2JjMSwgMHhlNzYwZDY3NiwgMHhlYTIzZjBhZiwgMHhlZWUyZWQxOCwKKyAgICAweGYwYTViZDFkLCAweGY0NjRhMGFhLCAweGY5Mjc4NjczLCAweGZkZTY5YmM0LAorICAgIDB4ODliOGZkMDksIDB4OGQ3OWUwYmUsIDB4ODAzYWM2NjcsIDB4ODRmYmRiZDAsCisgICAgMHg5YWJjOGJkNSwgMHg5ZTdkOTY2MiwgMHg5MzNlYjBiYiwgMHg5N2ZmYWQwYywKKyAgICAweGFmYjAxMGIxLCAweGFiNzEwZDA2LCAweGE2MzIyYmRmLCAweGEyZjMzNjY4LAorICAgIDB4YmNiNDY2NmQsIDB4Yjg3NTdiZGEsIDB4YjUzNjVkMDMsIDB4YjFmNzQwYjQKKyAgICB9OworCitBVFNQYXJzZXI6OlBTSVNlY3Rpb246OlBTSVNlY3Rpb24oKSA6CisgICAgbVNraXBCeXRlcygwKSB7CiB9CiAKIEFUU1BhcnNlcjo6UFNJU2VjdGlvbjo6flBTSVNlY3Rpb24oKSB7CkBAIC0xMzc3LDEwICsxNjY3LDE1IEBACiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIEFUU1BhcnNlcjo6UFNJU2VjdGlvbjo6c2V0U2tpcEJ5dGVzKHVpbnQ4X3Qgc2tpcCkgeworICAgIG1Ta2lwQnl0ZXMgPSBza2lwOworfQorCiB2b2lkIEFUU1BhcnNlcjo6UFNJU2VjdGlvbjo6Y2xlYXIoKSB7CiAgICAgaWYgKG1CdWZmZXIgIT0gTlVMTCkgewogICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKICAgICB9CisgICAgbVNraXBCeXRlcyA9IDA7CiB9CiAKIGJvb2wgQVRTUGFyc2VyOjpQU0lTZWN0aW9uOjppc0NvbXBsZXRlKCkgY29uc3QgewpAQCAtMTQwNCw0ICsxNjk5LDM3IEBACiAgICAgcmV0dXJuIG1CdWZmZXIgPT0gTlVMTCA/IDAgOiBtQnVmZmVyLT5zaXplKCk7CiB9CiAKK2Jvb2wgQVRTUGFyc2VyOjpQU0lTZWN0aW9uOjppc0NSQ09rYXkoKSBjb25zdCB7CisgICAgaWYgKCFpc0NvbXBsZXRlKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB1aW50OF90KiBkYXRhID0gbUJ1ZmZlci0+ZGF0YSgpOworCisgICAgLy8gUmV0dXJuIHRydWUgaWYgc2VjdGlvbl9zeW50YXhfaW5kaWNhdG9yIHNheXMgbm8gc2VjdGlvbiBmb2xsb3dzIHRoZSBmaWVsZCBzZWN0aW9uX2xlbmd0aC4KKyAgICBpZiAoKGRhdGFbMV0gJiAweDgwKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHVuc2lnbmVkIHNlY3Rpb25MZW5ndGggPSBVMTZfQVQoZGF0YSArIDEpICYgMHhmZmY7CisgICAgQUxPR1YoInNlY3Rpb25MZW5ndGggJXUsIHNraXAgJXUiLCBzZWN0aW9uTGVuZ3RoLCBtU2tpcEJ5dGVzKTsKKworCisgICAgaWYoc2VjdGlvbkxlbmd0aCA8IG1Ta2lwQnl0ZXMpIHsKKyAgICAgICAgQUxPR0UoImIvMjgzMzMwMDYiKTsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyODMzMzAwNiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gU2tpcCB0aGUgcHJlY2VkaW5nIGZpZWxkIHByZXNlbnQgd2hlbiBwYXlsb2FkIHN0YXJ0IGluZGljYXRvciBpcyBvbi4KKyAgICBzZWN0aW9uTGVuZ3RoIC09IG1Ta2lwQnl0ZXM7CisKKyAgICB1aW50MzJfdCBjcmMgPSAweGZmZmZmZmZmOworICAgIGZvcih1bnNpZ25lZCBpID0gMDsgaSA8IHNlY3Rpb25MZW5ndGggKyA0IC8qIGNyYyAqLzsgaSsrKSB7CisgICAgICAgIHVpbnQ4X3QgYiA9IGRhdGFbaV07CisgICAgICAgIGludCBpbmRleCA9ICgoY3JjID4+IDI0KSBeIChiICYgMHhmZikpICYgMHhmZjsKKyAgICAgICAgY3JjID0gQ1JDX1RBQkxFW2luZGV4XSBeIChjcmMgPDwgOCk7CisgICAgfQorICAgIEFMT0dWKCJjcmM6ICUwOHhcbiIsIGNyYyk7CisgICAgcmV0dXJuIChjcmMgPT0gMCk7Cit9CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKaW5kZXggNzVkNzZkYy4uNDMwYThkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCkBAIC0yMiw2ICsyMiw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CkBAIC0zMCw3ICszMSw2IEBACiAKIGNsYXNzIEFCaXRSZWFkZXI7CiBzdHJ1Y3QgQUJ1ZmZlcjsKLXN0cnVjdCBNZWRpYVNvdXJjZTsKIAogc3RydWN0IEFUU1BhcnNlciA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBlbnVtIERpc2NvbnRpbnVpdHlUeXBlIHsKQEAgLTQ2LDYgKzQ2LDkgQEAKICAgICAgICAgICAgIERJU0NPTlRJTlVJVFlfQVVESU9fRk9STUFUCiAgICAgICAgICAgICAgICAgfCBESVNDT05USU5VSVRZX1ZJREVPX0ZPUk1BVAogICAgICAgICAgICAgICAgIHwgRElTQ09OVElOVUlUWV9USU1FLAorICAgICAgICBESVNDT05USU5VSVRZX0ZPUk1BVF9PTkxZICAgICAgID0KKyAgICAgICAgICAgIERJU0NPTlRJTlVJVFlfQVVESU9fRk9STUFUCisgICAgICAgICAgICAgICAgfCBESVNDT05USU5VSVRZX1ZJREVPX0ZPUk1BVCwKICAgICB9OwogCiAgICAgZW51bSBGbGFncyB7CkBAIC01OSw5ICs2Miw0MyBAQAogICAgICAgICBBTElHTkVEX1ZJREVPX0RBVEEgICAgICAgICA9IDIsCiAgICAgfTsKIAorICAgIC8vIEV2ZW50IGlzIHVzZWQgdG8gc2lnbmFsIHN5bmMgcG9pbnQgZXZlbnQgYXQgZmVlZFRTUGFja2V0KCkuCisgICAgc3RydWN0IFN5bmNFdmVudCB7CisgICAgICAgIFN5bmNFdmVudChvZmY2NF90IG9mZnNldCk7CisKKyAgICAgICAgdm9pZCBpbml0KG9mZjY0X3Qgb2Zmc2V0LCBjb25zdCBzcDxNZWRpYVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcyk7CisKKyAgICAgICAgYm9vbCBpc0luaXQoKSB7IHJldHVybiBtSW5pdDsgfQorICAgICAgICBvZmY2NF90IGdldE9mZnNldCgpIHsgcmV0dXJuIG1PZmZzZXQ7IH0KKyAgICAgICAgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZnZXRNZWRpYVNvdXJjZSgpIHsgcmV0dXJuIG1NZWRpYVNvdXJjZTsgfQorICAgICAgICBpbnQ2NF90IGdldFRpbWVVcygpIHsgcmV0dXJuIG1UaW1lVXM7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGJvb2wgbUluaXQ7CisgICAgICAgIC8qCisgICAgICAgICAqIG1Jbml0ID09IGZhbHNlOiB0aGUgY3VycmVudCBvZmZzZXQKKyAgICAgICAgICogbUluaXQgPT0gdHJ1ZTogdGhlIHN0YXJ0IG9mZnNldCBvZiBzeW5jIHBheWxvYWQKKyAgICAgICAgICovCisgICAgICAgIG9mZjY0X3QgbU9mZnNldDsKKyAgICAgICAgLyogVGhlIG1lZGlhIHNvdXJjZSBvYmplY3QgZm9yIHRoaXMgZXZlbnQuICovCisgICAgICAgIHNwPE1lZGlhU291cmNlPiBtTWVkaWFTb3VyY2U7CisgICAgICAgIC8qIFRoZSB0aW1lc3RhbXAgb2YgdGhlIHN5bmMgZnJhbWUuICovCisgICAgICAgIGludDY0X3QgbVRpbWVVczsKKyAgICB9OworCiAgICAgQVRTUGFyc2VyKHVpbnQzMl90IGZsYWdzID0gMCk7CiAKLSAgICBzdGF0dXNfdCBmZWVkVFNQYWNrZXQoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworICAgIC8vIEZlZWQgYSBUUyBwYWNrZXQgaW50byB0aGUgcGFyc2VyLiB1bmluaXRpYWxpemVkIGV2ZW50IHdpdGggdGhlIHN0YXJ0CisgICAgLy8gb2Zmc2V0IG9mIHRoaXMgVFMgcGFja2V0IGdvZXMgaW4sIGFuZCBpZiB0aGUgcGFyc2VyIGRldGVjdHMgUEVTIHdpdGgKKyAgICAvLyBhIHN5bmMgZnJhbWUsIHRoZSBldmVudCB3aWxsIGJlIGluaXRpYWlsemVkIHdpdGggdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUKKyAgICAvLyBQRVMuIE5vdGUgdGhhdCB0aGUgb2Zmc2V0IG9mIHRoZSBldmVudCBjYW4gYmUgZGlmZmVyZW50IGZyb20gd2hhdCB3ZSBmZWQsCisgICAgLy8gYXMgYSBQRVMgbWF5IGNvbnNpc3Qgb2YgbXVsdGlwbGUgVFMgcGFja2V0cy4KKyAgICAvLworICAgIC8vIEV2ZW4gaW4gdGhlIGNhc2UgZmVlZFRTUGFja2V0KCkgcmV0dXJucyBub24tT0sgdmFsdWUsIGV2ZW50IHN0aWxsIG1heSBiZQorICAgIC8vIGluaXRpYWxpemVkIGlmIHRoZSBwYXJzaW5nIGZhaWxlZCBhZnRlciB0aGUgZGV0ZWN0aW9uLgorICAgIHN0YXR1c190IGZlZWRUU1BhY2tldCgKKyAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBTeW5jRXZlbnQgKmV2ZW50ID0gTlVMTCk7CiAKICAgICB2b2lkIHNpZ25hbERpc2NvbnRpbnVpdHkoCiAgICAgICAgICAgICBEaXNjb250aW51aXR5VHlwZSB0eXBlLCBjb25zdCBzcDxBTWVzc2FnZT4gJmV4dHJhKTsKQEAgLTcxLDcgKzEwOCw4IEBACiAgICAgZW51bSBTb3VyY2VUeXBlIHsKICAgICAgICAgVklERU8gPSAwLAogICAgICAgICBBVURJTyA9IDEsCi0gICAgICAgIE5VTV9TT1VSQ0VfVFlQRVMgPSAyCisgICAgICAgIE1FVEEgID0gMiwKKyAgICAgICAgTlVNX1NPVVJDRV9UWVBFUyA9IDMKICAgICB9OwogICAgIHNwPE1lZGlhU291cmNlPiBnZXRTb3VyY2UoU291cmNlVHlwZSB0eXBlKTsKICAgICBib29sIGhhc1NvdXJjZShTb3VyY2VUeXBlIHR5cGUpIGNvbnN0OwpAQCAtODcsNiArMTI1LDcgQEAKICAgICAgICAgU1RSRUFNVFlQRV9NUEVHMl9BVURJTyAgICAgICAgICA9IDB4MDQsCiAgICAgICAgIFNUUkVBTVRZUEVfTVBFRzJfQVVESU9fQURUUyAgICAgPSAweDBmLAogICAgICAgICBTVFJFQU1UWVBFX01QRUc0X1ZJREVPICAgICAgICAgID0gMHgxMCwKKyAgICAgICAgU1RSRUFNVFlQRV9NRVRBREFUQSAgICAgICAgICAgICA9IDB4MTUsCiAgICAgICAgIFNUUkVBTVRZUEVfSDI2NCAgICAgICAgICAgICAgICAgPSAweDFiLAogCiAgICAgICAgIC8vIEZyb20gQVRTQyBBLzUzIFBhcnQgMzoyMDA5LCA2LjcuMQpAQCAtMTE1LDIwICsxNTQsMzEgQEAKIAogICAgIGJvb2wgbVRpbWVPZmZzZXRWYWxpZDsKICAgICBpbnQ2NF90IG1UaW1lT2Zmc2V0VXM7CisgICAgaW50NjRfdCBtTGFzdFJlY292ZXJlZFBUUzsKIAogICAgIHNpemVfdCBtTnVtVFNQYWNrZXRzUGFyc2VkOwogCiAgICAgdm9pZCBwYXJzZVByb2dyYW1Bc3NvY2lhdGlvblRhYmxlKEFCaXRSZWFkZXIgKmJyKTsKICAgICB2b2lkIHBhcnNlUHJvZ3JhbU1hcChBQml0UmVhZGVyICpicik7Ci0gICAgdm9pZCBwYXJzZVBFUyhBQml0UmVhZGVyICpicik7CisgICAgLy8gUGFyc2UgUEVTIHBhY2tldCB3aGVyZSBiciBpcyBwb2ludGluZyB0by4gSWYgdGhlIFBFUyBjb250YWlucyBhIHN5bmMKKyAgICAvLyBmcmFtZSwgc2V0IGV2ZW50IHdpdGggdGhlIHRpbWUgYW5kIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhpcyBQRVMuCisgICAgLy8gTm90ZSB0aGF0IHRoZSBtZXRob2QgaXRzZWxmIGRvZXMgbm90IHRvdWNoIGV2ZW50LgorICAgIHZvaWQgcGFyc2VQRVMoQUJpdFJlYWRlciAqYnIsIFN5bmNFdmVudCAqZXZlbnQpOwogCisgICAgLy8gU3RyaXAgcmVtYWluaW5nIHBhY2tldCBoZWFkZXJzIGFuZCBwYXNzIHRvIGFwcHJvcHJpYXRlIHByb2dyYW0vc3RyZWFtCisgICAgLy8gdG8gcGFyc2UgdGhlIHBheWxvYWQuIElmIHRoZSBwYXlsb2FkIHR1cm5zIG91dCB0byBiZSBQRVMgYW5kIGNvbnRhaW5zCisgICAgLy8gYSBzeW5jIGZyYW1lLCBldmVudCBzaGFsbCBiZSBzZXQgd2l0aCB0aGUgdGltZSBhbmQgc3RhcnQgb2Zmc2V0IG9mIHRoZQorICAgIC8vIFBFUy4KKyAgICAvLyBOb3RlIHRoYXQgdGhlIG1ldGhvZCBpdHNlbGYgZG9lcyBub3QgdG91Y2ggZXZlbnQuCiAgICAgc3RhdHVzX3QgcGFyc2VQSUQoCiAgICAgICAgIEFCaXRSZWFkZXIgKmJyLCB1bnNpZ25lZCBQSUQsCiAgICAgICAgIHVuc2lnbmVkIGNvbnRpbnVpdHlfY291bnRlciwKLSAgICAgICAgdW5zaWduZWQgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvcik7CisgICAgICAgIHVuc2lnbmVkIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IsCisgICAgICAgIFN5bmNFdmVudCAqZXZlbnQpOwogCi0gICAgdm9pZCBwYXJzZUFkYXB0YXRpb25GaWVsZChBQml0UmVhZGVyICpiciwgdW5zaWduZWQgUElEKTsKLSAgICBzdGF0dXNfdCBwYXJzZVRTKEFCaXRSZWFkZXIgKmJyKTsKKyAgICBzdGF0dXNfdCBwYXJzZUFkYXB0YXRpb25GaWVsZChBQml0UmVhZGVyICpiciwgdW5zaWduZWQgUElEKTsKKyAgICAvLyBzZWUgZmVlZFRTUGFja2V0KCkuCisgICAgc3RhdHVzX3QgcGFyc2VUUyhBQml0UmVhZGVyICpiciwgU3luY0V2ZW50ICpldmVudCk7CiAKICAgICB2b2lkIHVwZGF0ZVBDUih1bnNpZ25lZCBQSUQsIHVpbnQ2NF90IFBDUiwgc2l6ZV90IGJ5dGVPZmZzZXRGcm9tU3RhcnQpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQubWsKaW5kZXggYzE3YTBiNy4uMTZiMDE2MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5tawpAQCAtMTMsNyArMTMsOCBAQAogCSQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKLUxPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQogCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9tcGVnMnRzCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwCmluZGV4IGYyNjZmZTcuLmNhYmRlMzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcApAQCAtMTksNiArMTksOCBAQAogCiAjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgogCisjaW5jbHVkZSAiaW5jbHVkZS9hdmNfdXRpbHMuaCIKKwogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMjcsNiArMjksNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KQEAgLTM4LDE3ICs0MSwyMiBAQAogQW5vdGhlclBhY2tldFNvdXJjZTo6QW5vdGhlclBhY2tldFNvdXJjZShjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEpCiAgICAgOiBtSXNBdWRpbyhmYWxzZSksCiAgICAgICBtSXNWaWRlbyhmYWxzZSksCisgICAgICBtRW5hYmxlZCh0cnVlKSwKICAgICAgIG1Gb3JtYXQoTlVMTCksCiAgICAgICBtTGFzdFF1ZXVlZFRpbWVVcygwKSwKICAgICAgIG1FT1NSZXN1bHQoT0spLAogICAgICAgbUxhdGVzdEVucXVldWVkTWV0YShOVUxMKSwKLSAgICAgIG1MYXRlc3REZXF1ZXVlZE1ldGEoTlVMTCksCi0gICAgICBtUXVldWVkRGlzY29udGludWl0eUNvdW50KDApIHsKKyAgICAgIG1MYXRlc3REZXF1ZXVlZE1ldGEoTlVMTCkgewogICAgIHNldEZvcm1hdChtZXRhKTsKKworICAgIG1EaXNjb250aW51aXR5U2VnbWVudHMucHVzaF9iYWNrKERpc2NvbnRpbnVpdHlTZWdtZW50KCkpOwogfQogCiB2b2lkIEFub3RoZXJQYWNrZXRTb3VyY2U6OnNldEZvcm1hdChjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEpIHsKLSAgICBDSEVDSyhtRm9ybWF0ID09IE5VTEwpOworICAgIGlmIChtRm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgLy8gT25seSBhbGxvd2VkIHRvIGJlIHNldCBvbmNlLiBSZXF1aXJlcyBleHBsaWNpdCBjbGVhciB0byByZXNldC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KIAogICAgIG1Jc0F1ZGlvID0gZmFsc2U7CiAgICAgbUlzVmlkZW8gPSBmYWxzZTsKQEAgLTY2LDcgKzc0LDcgQEAKICAgICB9IGVsc2UgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKSB7CiAgICAgICAgIG1Jc1ZpZGVvID0gdHJ1ZTsKICAgICB9IGVsc2UgewotICAgICAgICBDSEVDSyghc3RybmNhc2VjbXAoInRleHQvIiwgbWltZSwgNSkpOworICAgICAgICBDSEVDSyghc3RybmNhc2VjbXAoInRleHQvIiwgbWltZSwgNSkgfHwgIXN0cm5jYXNlY21wKCJhcHBsaWNhdGlvbi8iLCBtaW1lLCAxMikpOwogICAgIH0KIH0KIApAQCAtOTEsMTMgKzk5LDEyIEBACiAgICAgd2hpbGUgKGl0ICE9IG1CdWZmZXJzLmVuZCgpKSB7CiAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9ICppdDsKICAgICAgICAgaW50MzJfdCBkaXNjb250aW51aXR5OwotICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZkaXNjb250aW51aXR5KSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBzcDxSZWZCYXNlPiBvYmplY3Q7Ci0gICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZE9iamVjdCgiZm9ybWF0IiwgJm9iamVjdCkpIHsKLSAgICAgICAgICAgIHJldHVybiBtRm9ybWF0ID0gc3RhdGljX2Nhc3Q8TWV0YURhdGEqPihvYmplY3QuZ2V0KCkpOworICAgICAgICBpZiAoIWJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmZGlzY29udGludWl0eSkpIHsKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iamVjdDsKKyAgICAgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZE9iamVjdCgiZm9ybWF0IiwgJm9iamVjdCkpIHsKKyAgICAgICAgICAgICAgICBzZXRGb3JtYXQoc3RhdGljX2Nhc3Q8TWV0YURhdGEqPihvYmplY3QuZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUZvcm1hdDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgICsraXQ7CkBAIC0xMjMsMTUgKzEzMCwyNCBAQAogICAgICAgICAgICAgICAgIG1Gb3JtYXQuY2xlYXIoKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLS1tUXVldWVkRGlzY29udGludWl0eUNvdW50OworICAgICAgICAgICAgbURpc2NvbnRpbnVpdHlTZWdtZW50cy5lcmFzZShtRGlzY29udGludWl0eVNlZ21lbnRzLmJlZ2luKCkpOworICAgICAgICAgICAgLy8gQ0hFQ0soIW1EaXNjb250aW51aXR5U2VnbWVudHMuZW1wdHkoKSk7CiAgICAgICAgICAgICByZXR1cm4gSU5GT19ESVNDT05USU5VSVRZOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gQ0hFQ0soIW1EaXNjb250aW51aXR5U2VnbWVudHMuZW1wdHkoKSk7CisgICAgICAgIERpc2NvbnRpbnVpdHlTZWdtZW50ICZzZWcgPSAqbURpc2NvbnRpbnVpdHlTZWdtZW50cy5iZWdpbigpOworCisgICAgICAgIGludDY0X3QgdGltZVVzOwogICAgICAgICBtTGF0ZXN0RGVxdWV1ZWRNZXRhID0gKCpidWZmZXIpLT5tZXRhKCktPmR1cCgpOworICAgICAgICBDSEVDSyhtTGF0ZXN0RGVxdWV1ZWRNZXRhLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKyAgICAgICAgaWYgKHRpbWVVcyA+IHNlZy5tTWF4RGVxdWVUaW1lVXMpIHsKKyAgICAgICAgICAgIHNlZy5tTWF4RGVxdWVUaW1lVXMgPSB0aW1lVXM7CisgICAgICAgIH0KIAogICAgICAgICBzcDxSZWZCYXNlPiBvYmplY3Q7CiAgICAgICAgIGlmICgoKmJ1ZmZlciktPm1ldGEoKS0+ZmluZE9iamVjdCgiZm9ybWF0IiwgJm9iamVjdCkpIHsKLSAgICAgICAgICAgIG1Gb3JtYXQgPSBzdGF0aWNfY2FzdDxNZXRhRGF0YSo+KG9iamVjdC5nZXQoKSk7CisgICAgICAgICAgICBzZXRGb3JtYXQoc3RhdGljX2Nhc3Q8TWV0YURhdGEqPihvYmplY3QuZ2V0KCkpKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBPSzsKQEAgLTE0MCw2ICsxNTYsMTIgQEAKICAgICByZXR1cm4gbUVPU1Jlc3VsdDsKIH0KIAordm9pZCBBbm90aGVyUGFja2V0U291cmNlOjpyZXF1ZXVlQWNjZXNzVW5pdChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgLy8gVE9ETzogdXBkYXRlIGNvcnJlc3BvbmRpbmcgYm9vayBrZWVwaW5nIGluZm8uCisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtQnVmZmVycy5wdXNoX2Zyb250KGJ1ZmZlcik7Cit9CisKIHN0YXR1c190IEFub3RoZXJQYWNrZXRTb3VyY2U6OnJlYWQoCiAgICAgICAgIE1lZGlhQnVmZmVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqKSB7CiAgICAgKm91dCA9IE5VTEw7CkBAIC0xNTMsNyArMTc1LDYgQEAKIAogICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiBidWZmZXIgPSAqbUJ1ZmZlcnMuYmVnaW4oKTsKICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UobUJ1ZmZlcnMuYmVnaW4oKSk7Ci0gICAgICAgIG1MYXRlc3REZXF1ZXVlZE1ldGEgPSBidWZmZXItPm1ldGEoKS0+ZHVwKCk7CiAKICAgICAgICAgaW50MzJfdCBkaXNjb250aW51aXR5OwogICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZkaXNjb250aW51aXR5KSkgewpAQCAtMTYxLDIxICsxODIsNDAgQEAKICAgICAgICAgICAgICAgICBtRm9ybWF0LmNsZWFyKCk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIG1EaXNjb250aW51aXR5U2VnbWVudHMuZXJhc2UobURpc2NvbnRpbnVpdHlTZWdtZW50cy5iZWdpbigpKTsKKyAgICAgICAgICAgIC8vIENIRUNLKCFtRGlzY29udGludWl0eVNlZ21lbnRzLmVtcHR5KCkpOwogICAgICAgICAgICAgcmV0dXJuIElORk9fRElTQ09OVElOVUlUWTsKICAgICAgICAgfQogCisgICAgICAgIG1MYXRlc3REZXF1ZXVlZE1ldGEgPSBidWZmZXItPm1ldGEoKS0+ZHVwKCk7CisKICAgICAgICAgc3A8UmVmQmFzZT4gb2JqZWN0OwogICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRPYmplY3QoImZvcm1hdCIsICZvYmplY3QpKSB7Ci0gICAgICAgICAgICBtRm9ybWF0ID0gc3RhdGljX2Nhc3Q8TWV0YURhdGEqPihvYmplY3QuZ2V0KCkpOworICAgICAgICAgICAgc2V0Rm9ybWF0KHN0YXRpY19jYXN0PE1ldGFEYXRhKj4ob2JqZWN0LmdldCgpKSk7CiAgICAgICAgIH0KIAogICAgICAgICBpbnQ2NF90IHRpbWVVczsKICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOworICAgICAgICAvLyBDSEVDSyghbURpc2NvbnRpbnVpdHlTZWdtZW50cy5lbXB0eSgpKTsKKyAgICAgICAgRGlzY29udGludWl0eVNlZ21lbnQgJnNlZyA9ICptRGlzY29udGludWl0eVNlZ21lbnRzLmJlZ2luKCk7CisgICAgICAgIGlmICh0aW1lVXMgPiBzZWcubU1heERlcXVlVGltZVVzKSB7CisgICAgICAgICAgICBzZWcubU1heERlcXVlVGltZVVzID0gdGltZVVzOworICAgICAgICB9CiAKICAgICAgICAgTWVkaWFCdWZmZXIgKm1lZGlhQnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGJ1ZmZlcik7CiAKICAgICAgICAgbWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKIAorICAgICAgICBpbnQzMl90IGlzU3luYzsKKyAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImlzU3luYyIsICZpc1N5bmMpKSB7CisgICAgICAgICAgICBtZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgaXNTeW5jKTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEFCdWZmZXI+IHNlaTsKKyAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kQnVmZmVyKCJzZWkiLCAmc2VpKSAmJiBzZWkgIT0gTlVMTCkgeworICAgICAgICAgICAgbWVkaWFCdWZmZXItPm1ldGFfZGF0YSgpLT5zZXREYXRhKGtLZXlTRUksIDAsIHNlaS0+ZGF0YSgpLCBzZWktPnNpemUoKSk7CisgICAgICAgIH0KKwogICAgICAgICAqb3V0ID0gbWVkaWFCdWZmZXI7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CkBAIC0yMDMsMTggKzI0MywzNSBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaW50NjRfdCBsYXN0UXVldWVkVGltZVVzOwotICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZsYXN0UXVldWVkVGltZVVzKSk7Ci0gICAgbUxhc3RRdWV1ZWRUaW1lVXMgPSBsYXN0UXVldWVkVGltZVVzOwotICAgIEFMT0dWKCJxdWV1ZUFjY2Vzc1VuaXQgdGltZVVzPSUiIFBSSWk2NCAiIHVzICglLjJmIHNlY3MpIiwgbUxhc3RRdWV1ZWRUaW1lVXMsIG1MYXN0UXVldWVkVGltZVVzIC8gMUU2KTsKLQogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgbUJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CiAgICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKIAogICAgIGludDMyX3QgZGlzY29udGludWl0eTsKLSAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZkaXNjb250aW51aXR5KSkgewotICAgICAgICArK21RdWV1ZWREaXNjb250aW51aXR5Q291bnQ7CisgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmZGlzY29udGludWl0eSkpeworICAgICAgICBBTE9HVigicXVldWVpbmcgYSBkaXNjb250aW51aXR5IHdpdGggcXVldWVBY2Nlc3NVbml0Iik7CisKKyAgICAgICAgbUxhc3RRdWV1ZWRUaW1lVXMgPSAwbGw7CisgICAgICAgIG1FT1NSZXN1bHQgPSBPSzsKKyAgICAgICAgbUxhdGVzdEVucXVldWVkTWV0YSA9IE5VTEw7CisKKyAgICAgICAgbURpc2NvbnRpbnVpdHlTZWdtZW50cy5wdXNoX2JhY2soRGlzY29udGludWl0eVNlZ21lbnQoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQ2NF90IGxhc3RRdWV1ZWRUaW1lVXM7CisgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJmxhc3RRdWV1ZWRUaW1lVXMpKTsKKyAgICBtTGFzdFF1ZXVlZFRpbWVVcyA9IGxhc3RRdWV1ZWRUaW1lVXM7CisgICAgQUxPR1YoInF1ZXVlQWNjZXNzVW5pdCB0aW1lVXM9JSIgUFJJaTY0ICIgdXMgKCUuMmYgc2VjcykiLAorICAgICAgICAgICAgbUxhc3RRdWV1ZWRUaW1lVXMsIG1MYXN0UXVldWVkVGltZVVzIC8gMUU2KTsKKworICAgIC8vIENIRUNLKCFtRGlzY29udGludWl0eVNlZ21lbnRzLmVtcHR5KCkpOworICAgIERpc2NvbnRpbnVpdHlTZWdtZW50ICZ0YWlsU2VnID0gKigtLW1EaXNjb250aW51aXR5U2VnbWVudHMuZW5kKCkpOworICAgIGlmIChsYXN0UXVldWVkVGltZVVzID4gdGFpbFNlZy5tTWF4RW5xdWVUaW1lVXMpIHsKKyAgICAgICAgdGFpbFNlZy5tTWF4RW5xdWVUaW1lVXMgPSBsYXN0UXVldWVkVGltZVVzOworICAgIH0KKyAgICBpZiAodGFpbFNlZy5tTWF4RGVxdWVUaW1lVXMgPT0gLTEpIHsKKyAgICAgICAgdGFpbFNlZy5tTWF4RGVxdWVUaW1lVXMgPSBsYXN0UXVldWVkVGltZVVzOwogICAgIH0KIAogICAgIGlmIChtTGF0ZXN0RW5xdWV1ZWRNZXRhID09IE5VTEwpIHsKQEAgLTI0MCw3ICsyOTcsOSBAQAogCiAgICAgbUJ1ZmZlcnMuY2xlYXIoKTsKICAgICBtRU9TUmVzdWx0ID0gT0s7Ci0gICAgbVF1ZXVlZERpc2NvbnRpbnVpdHlDb3VudCA9IDA7CisKKyAgICBtRGlzY29udGludWl0eVNlZ21lbnRzLmNsZWFyKCk7CisgICAgbURpc2NvbnRpbnVpdHlTZWdtZW50cy5wdXNoX2JhY2soRGlzY29udGludWl0eVNlZ21lbnQoKSk7CiAKICAgICBtRm9ybWF0ID0gTlVMTDsKICAgICBtTGF0ZXN0RW5xdWV1ZWRNZXRhID0gTlVMTDsKQEAgLTI2Nyw2ICszMjYsMTQgQEAKIAogICAgICAgICAgICAgKytpdDsKICAgICAgICAgfQorCisgICAgICAgIGZvciAoTGlzdDxEaXNjb250aW51aXR5U2VnbWVudD46Oml0ZXJhdG9yIGl0MiA9IG1EaXNjb250aW51aXR5U2VnbWVudHMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBpdDIgIT0gbURpc2NvbnRpbnVpdHlTZWdtZW50cy5lbmQoKTsKKyAgICAgICAgICAgICAgICArK2l0MikgeworICAgICAgICAgICAgRGlzY29udGludWl0eVNlZ21lbnQgJnNlZyA9ICppdDI7CisgICAgICAgICAgICBzZWcuY2xlYXIoKTsKKyAgICAgICAgfQorCiAgICAgfQogCiAgICAgbUVPU1Jlc3VsdCA9IE9LOwpAQCAtMjc3LDcgKzM0NCw4IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICArK21RdWV1ZWREaXNjb250aW51aXR5Q291bnQ7CisgICAgbURpc2NvbnRpbnVpdHlTZWdtZW50cy5wdXNoX2JhY2soRGlzY29udGludWl0eVNlZ21lbnQoKSk7CisKICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcigwKTsKICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImRpc2NvbnRpbnVpdHkiLCBzdGF0aWNfY2FzdDxpbnQzMl90Pih0eXBlKSk7CiAgICAgYnVmZmVyLT5tZXRhKCktPnNldE1lc3NhZ2UoImV4dHJhIiwgZXh0cmEpOwpAQCAtMjk2LDYgKzM2NCwxMCBAQAogCiBib29sIEFub3RoZXJQYWNrZXRTb3VyY2U6Omhhc0J1ZmZlckF2YWlsYWJsZShzdGF0dXNfdCAqZmluYWxSZXN1bHQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICpmaW5hbFJlc3VsdCA9IE9LOworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICBpZiAoIW1CdWZmZXJzLmVtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtMzA0LDg2ICszNzYsNTMgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wgQW5vdGhlclBhY2tldFNvdXJjZTo6aGFzRGF0YUJ1ZmZlckF2YWlsYWJsZShzdGF0dXNfdCAqZmluYWxSZXN1bHQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICpmaW5hbFJlc3VsdCA9IE9LOworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0OworICAgIGZvciAoaXQgPSBtQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQnVmZmVycy5lbmQoKTsgaXQrKykgeworICAgICAgICBpbnQzMl90IGRpc2NvbnRpbnVpdHk7CisgICAgICAgIGlmICghKCppdCktPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJmRpc2NvbnRpbnVpdHkpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpmaW5hbFJlc3VsdCA9IG1FT1NSZXN1bHQ7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzaXplX3QgQW5vdGhlclBhY2tldFNvdXJjZTo6Z2V0QXZhaWxhYmxlQnVmZmVyQ291bnQoc3RhdHVzX3QgKmZpbmFsUmVzdWx0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgICpmaW5hbFJlc3VsdCA9IE9LOworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICghbUJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gbUJ1ZmZlcnMuc2l6ZSgpOworICAgIH0KKyAgICAqZmluYWxSZXN1bHQgPSBtRU9TUmVzdWx0OworICAgIHJldHVybiAwOworfQorCiBpbnQ2NF90IEFub3RoZXJQYWNrZXRTb3VyY2U6OmdldEJ1ZmZlcmVkRHVyYXRpb25VcyhzdGF0dXNfdCAqZmluYWxSZXN1bHQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBnZXRCdWZmZXJlZER1cmF0aW9uVXNfbChmaW5hbFJlc3VsdCk7Ci19Ci0KLWludDY0X3QgQW5vdGhlclBhY2tldFNvdXJjZTo6Z2V0QnVmZmVyZWREdXJhdGlvblVzX2woc3RhdHVzX3QgKmZpbmFsUmVzdWx0KSB7CiAgICAgKmZpbmFsUmVzdWx0ID0gbUVPU1Jlc3VsdDsKIAotICAgIGlmIChtQnVmZmVycy5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGludDY0X3QgdGltZTEgPSAtMTsKLSAgICBpbnQ2NF90IHRpbWUyID0gLTE7CiAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gMDsKLQotICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQgPSBtQnVmZmVycy5iZWdpbigpOwotICAgIHdoaWxlIChpdCAhPSBtQnVmZmVycy5lbmQoKSkgewotICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyID0gKml0OwotCi0gICAgICAgIGludDY0X3QgdGltZVVzOwotICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpIHsKLSAgICAgICAgICAgIGlmICh0aW1lMSA8IDAgfHwgdGltZVVzIDwgdGltZTEpIHsKLSAgICAgICAgICAgICAgICB0aW1lMSA9IHRpbWVVczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRpbWUyIDwgMCB8fCB0aW1lVXMgPiB0aW1lMikgewotICAgICAgICAgICAgICAgIHRpbWUyID0gdGltZVVzOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGRpc2NvbnRpbnVpdHksIHJlc2V0IGV2ZXJ5dGhpbmcuCi0gICAgICAgICAgICBkdXJhdGlvblVzICs9IHRpbWUyIC0gdGltZTE7Ci0gICAgICAgICAgICB0aW1lMSA9IHRpbWUyID0gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICArK2l0OworICAgIGZvciAoTGlzdDxEaXNjb250aW51aXR5U2VnbWVudD46Oml0ZXJhdG9yIGl0ID0gbURpc2NvbnRpbnVpdHlTZWdtZW50cy5iZWdpbigpOworICAgICAgICAgICAgaXQgIT0gbURpc2NvbnRpbnVpdHlTZWdtZW50cy5lbmQoKTsKKyAgICAgICAgICAgICsraXQpIHsKKyAgICAgICAgY29uc3QgRGlzY29udGludWl0eVNlZ21lbnQgJnNlZyA9ICppdDsKKyAgICAgICAgLy8gZGVxdWV1ZWQgYWNjZXNzIHVuaXRzIHNob3VsZCBiZSBhIHN1YnNldCBvZiBlbnF1ZXVlZCBhY2Nlc3MgdW5pdHMKKyAgICAgICAgLy8gQ0hFQ0soc2VnLm1heEVucXVlVGltZVVzID49IHNlZy5tTWF4RGVxdWVUaW1lVXMpOworICAgICAgICBkdXJhdGlvblVzICs9IChzZWcubU1heEVucXVlVGltZVVzIC0gc2VnLm1NYXhEZXF1ZVRpbWVVcyk7CiAgICAgfQogCi0gICAgcmV0dXJuIGR1cmF0aW9uVXMgKyAodGltZTIgLSB0aW1lMSk7Ci19Ci0KLS8vIEEgY2hlYXBlciBidXQgbGVzcyBwcmVjaXNlIHZlcnNpb24gb2YgZ2V0QnVmZmVyZWREdXJhdGlvblVzIHRoYXQgd2Ugd291bGQgbGlrZSB0byB1c2UgaW4KLS8vIExpdmVTZXNzaW9uOjpkZXF1ZXVlQWNjZXNzVW5pdCB0byB0cmlnZ2VyIGRvd253YXJkcyBhZGFwdGF0aW9uLgotaW50NjRfdCBBbm90aGVyUGFja2V0U291cmNlOjpnZXRFc3RpbWF0ZWREdXJhdGlvblVzKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKG1CdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKG1RdWV1ZWREaXNjb250aW51aXR5Q291bnQgPiAwKSB7Ci0gICAgICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OwotICAgICAgICByZXR1cm4gZ2V0QnVmZmVyZWREdXJhdGlvblVzX2woJmZpbmFsUmVzdWx0KTsKLSAgICB9Ci0KLSAgICBMaXN0PHNwPEFCdWZmZXI+ID46Oml0ZXJhdG9yIGl0ID0gbUJ1ZmZlcnMuYmVnaW4oKTsKLSAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSAqaXQ7Ci0KLSAgICBpbnQ2NF90IHN0YXJ0VGltZVVzOwotICAgIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZzdGFydFRpbWVVcyk7Ci0gICAgaWYgKHN0YXJ0VGltZVVzIDwgMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpdCA9IG1CdWZmZXJzLmVuZCgpOwotICAgIC0taXQ7Ci0gICAgYnVmZmVyID0gKml0OwotCi0gICAgaW50NjRfdCBlbmRUaW1lVXM7Ci0gICAgYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJmVuZFRpbWVVcyk7Ci0gICAgaWYgKGVuZFRpbWVVcyA8IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaW50NjRfdCBkaWZmVXM7Ci0gICAgaWYgKGVuZFRpbWVVcyA+IHN0YXJ0VGltZVVzKSB7Ci0gICAgICAgIGRpZmZVcyA9IGVuZFRpbWVVcyAtIHN0YXJ0VGltZVVzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRpZmZVcyA9IHN0YXJ0VGltZVVzIC0gZW5kVGltZVVzOwotICAgIH0KLSAgICByZXR1cm4gZGlmZlVzOworICAgIHJldHVybiBkdXJhdGlvblVzOwogfQogCiBzdGF0dXNfdCBBbm90aGVyUGFja2V0U291cmNlOjpuZXh0QnVmZmVyVGltZShpbnQ2NF90ICp0aW1lVXMpIHsKQEAgLTQyMiw0ICs0NjEsMTcxIEBACiAgICAgcmV0dXJuIG1MYXRlc3REZXF1ZXVlZE1ldGE7CiB9CiAKK3ZvaWQgQW5vdGhlclBhY2tldFNvdXJjZTo6ZW5hYmxlKGJvb2wgZW5hYmxlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBtRW5hYmxlZCA9IGVuYWJsZTsKK30KKworLyoKKyAqIHJldHVybnMgdGhlIHNhbXBsZSBtZXRhIHRoYXQncyBkZWxheVVzIGFmdGVyIHF1ZXVlIGhlYWQKKyAqIChOVUxMIGlmIHN1Y2ggc2FtcGxlIGlzIHVuYXZhaWxhYmxlKQorICovCitzcDxBTWVzc2FnZT4gQW5vdGhlclBhY2tldFNvdXJjZTo6Z2V0TWV0YUFmdGVyTGFzdERlcXVldWVkKGludDY0X3QgZGVsYXlVcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaW50NjRfdCBmaXJzdFVzID0gLTE7CisgICAgaW50NjRfdCBsYXN0VXMgPSAtMTsKKyAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSAwOworCisgICAgTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdDsKKyAgICBmb3IgKGl0ID0gbUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUJ1ZmZlcnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciA9ICppdDsKKyAgICAgICAgaW50MzJfdCBkaXNjb250aW51aXR5OworICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZkaXNjb250aW51aXR5KSkgeworICAgICAgICAgICAgZHVyYXRpb25VcyArPSBsYXN0VXMgLSBmaXJzdFVzOworICAgICAgICAgICAgZmlyc3RVcyA9IC0xOworICAgICAgICAgICAgbGFzdFVzID0gLTE7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbnQ2NF90IHRpbWVVczsKKyAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKSB7CisgICAgICAgICAgICBpZiAoZmlyc3RVcyA8IDApIHsKKyAgICAgICAgICAgICAgICBmaXJzdFVzID0gdGltZVVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxhc3RVcyA8IDAgfHwgdGltZVVzID4gbGFzdFVzKSB7CisgICAgICAgICAgICAgICAgbGFzdFVzID0gdGltZVVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGR1cmF0aW9uVXMgKyAobGFzdFVzIC0gZmlyc3RVcykgPj0gZGVsYXlVcykgeworICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXItPm1ldGEoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIHJlbW92ZXMgc2FtcGxlcyB3aXRoIHRpbWUgZXF1YWwgb3IgYWZ0ZXIgbWV0YQorICovCit2b2lkIEFub3RoZXJQYWNrZXRTb3VyY2U6OnRyaW1CdWZmZXJzQWZ0ZXJNZXRhKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1ldGEpIHsKKyAgICBpZiAobWV0YSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJ0cmltbWluZyB3aXRoIE5VTEwgbWV0YSwgaWdub3JpbmciKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1CdWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEhMU1RpbWUgc3RvcFRpbWUobWV0YSk7CisgICAgQUxPR1YoInRyaW1CdWZmZXJzQWZ0ZXJNZXRhOiBkaXNjb250aW51aXR5U2VxICVkLCB0aW1lVXMgJWxsZCIsCisgICAgICAgICAgICBzdG9wVGltZS5tU2VxLCAobG9uZyBsb25nKXN0b3BUaW1lLm1UaW1lVXMpOworCisgICAgTGlzdDxzcDxBQnVmZmVyPiA+OjppdGVyYXRvciBpdDsKKyAgICBMaXN0PERpc2NvbnRpbnVpdHlTZWdtZW50ID46Oml0ZXJhdG9yIGl0MjsKKyAgICBzcDxBTWVzc2FnZT4gbmV3TGF0ZXN0RW5xdWV1ZWRNZXRhID0gTlVMTDsKKyAgICBpbnQ2NF90IG5ld0xhc3RRdWV1ZWRUaW1lVXMgPSAwOworICAgIGZvciAoaXQgPSBtQnVmZmVycy5iZWdpbigpLCBpdDIgPSBtRGlzY29udGludWl0eVNlZ21lbnRzLmJlZ2luKCk7IGl0ICE9IG1CdWZmZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIgPSAqaXQ7CisgICAgICAgIGludDMyX3QgZGlzY29udGludWl0eTsKKyAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmZGlzY29udGludWl0eSkpIHsKKyAgICAgICAgICAgIC8vIENIRUNLKGl0MiAhPSBtRGlzY29udGludWl0eVNlZ21lbnRzLmVuZCgpKTsKKyAgICAgICAgICAgICsraXQyOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBITFNUaW1lIGN1clRpbWUoYnVmZmVyLT5tZXRhKCkpOworICAgICAgICBpZiAoIShjdXJUaW1lIDwgc3RvcFRpbWUpKSB7CisgICAgICAgICAgICBBTE9HVigidHJpbW1pbmcgZnJvbSAlbGxkIChpbmNsdXNpdmUpIHRvIGVuZCIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpY3VyVGltZS5tVGltZVVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG5ld0xhdGVzdEVucXVldWVkTWV0YSA9IGJ1ZmZlci0+bWV0YSgpOworICAgICAgICBuZXdMYXN0UXVldWVkVGltZVVzID0gY3VyVGltZS5tVGltZVVzOworICAgIH0KKworICAgIG1CdWZmZXJzLmVyYXNlKGl0LCBtQnVmZmVycy5lbmQoKSk7CisgICAgbUxhdGVzdEVucXVldWVkTWV0YSA9IG5ld0xhdGVzdEVucXVldWVkTWV0YTsKKyAgICBtTGFzdFF1ZXVlZFRpbWVVcyA9IG5ld0xhc3RRdWV1ZWRUaW1lVXM7CisKKyAgICBEaXNjb250aW51aXR5U2VnbWVudCAmc2VnID0gKml0MjsKKyAgICBpZiAobmV3TGF0ZXN0RW5xdWV1ZWRNZXRhICE9IE5VTEwpIHsKKyAgICAgICAgc2VnLm1NYXhFbnF1ZVRpbWVVcyA9IG5ld0xhc3RRdWV1ZWRUaW1lVXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2VnLmNsZWFyKCk7CisgICAgfQorICAgIG1EaXNjb250aW51aXR5U2VnbWVudHMuZXJhc2UoKytpdDIsIG1EaXNjb250aW51aXR5U2VnbWVudHMuZW5kKCkpOworfQorCisvKgorICogcmVtb3ZlcyBzYW1wbGVzIHdpdGggdGltZSBlcXVhbCBvciBiZWZvcmUgbWV0YTsKKyAqIHJldHVybnMgZmlyc3Qgc2FtcGxlIGxlZnQgaW4gdGhlIHF1ZXVlLgorICoKKyAqIChmb3IgQVZDLCBpZiB0cmltIGhhcHBlbnMsIHRoZSBzYW1wbGVzIGxlZnQgd2lsbCBhbHdheXMgc3RhcnQKKyAqIGF0IG5leHQgSURSLikKKyAqLworc3A8QU1lc3NhZ2U+IEFub3RoZXJQYWNrZXRTb3VyY2U6OnRyaW1CdWZmZXJzQmVmb3JlTWV0YSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtZXRhKSB7CisgICAgSExTVGltZSBzdGFydFRpbWUobWV0YSk7CisgICAgQUxPR1YoInRyaW1CdWZmZXJzQmVmb3JlTWV0YTogZGlzY29udGludWl0eVNlcSAlZCwgdGltZVVzICVsbGQiLAorICAgICAgICAgICAgc3RhcnRUaW1lLm1TZXEsIChsb25nIGxvbmcpc3RhcnRUaW1lLm1UaW1lVXMpOworCisgICAgc3A8QU1lc3NhZ2U+IGZpcnN0TWV0YTsKKyAgICBpbnQ2NF90IGZpcnN0VGltZVVzID0gLTE7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobUJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxNZXRhRGF0YT4gZm9ybWF0OworICAgIGJvb2wgaXNBdmMgPSBmYWxzZTsKKworICAgIExpc3Q8c3A8QUJ1ZmZlcj4gPjo6aXRlcmF0b3IgaXQ7CisgICAgZm9yIChpdCA9IG1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1CdWZmZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIgPSAqaXQ7CisgICAgICAgIGludDMyX3QgZGlzY29udGludWl0eTsKKyAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImRpc2NvbnRpbnVpdHkiLCAmZGlzY29udGludWl0eSkpIHsKKyAgICAgICAgICAgIG1EaXNjb250aW51aXR5U2VnbWVudHMuZXJhc2UobURpc2NvbnRpbnVpdHlTZWdtZW50cy5iZWdpbigpKTsKKyAgICAgICAgICAgIC8vIENIRUNLKCFtRGlzY29udGludWl0eVNlZ21lbnRzLmVtcHR5KCkpOworICAgICAgICAgICAgZm9ybWF0ID0gTlVMTDsKKyAgICAgICAgICAgIGlzQXZjID0gZmFsc2U7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iamVjdDsKKyAgICAgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZE9iamVjdCgiZm9ybWF0IiwgJm9iamVjdCkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtaW1lOworICAgICAgICAgICAgICAgIGZvcm1hdCA9IHN0YXRpY19jYXN0PE1ldGFEYXRhKj4ob2JqZWN0LmdldCgpKTsKKyAgICAgICAgICAgICAgICBpc0F2YyA9IGZvcm1hdCAhPSBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpc0F2YyAmJiAhSXNJRFIoYnVmZmVyKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBITFNUaW1lIGN1clRpbWUoYnVmZmVyLT5tZXRhKCkpOworICAgICAgICBpZiAoc3RhcnRUaW1lIDwgY3VyVGltZSkgeworICAgICAgICAgICAgQUxPR1YoInRyaW1taW5nIGZyb20gYmVnaW5uaW5nIHRvICVsbGQgKG5vdCBpbmNsdXNpdmUpIiwKKyAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyljdXJUaW1lLm1UaW1lVXMpOworICAgICAgICAgICAgZmlyc3RNZXRhID0gYnVmZmVyLT5tZXRhKCk7CisgICAgICAgICAgICBmaXJzdFRpbWVVcyA9IGN1clRpbWUubVRpbWVVczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIG1CdWZmZXJzLmVyYXNlKG1CdWZmZXJzLmJlZ2luKCksIGl0KTsKKyAgICBtTGF0ZXN0RGVxdWV1ZWRNZXRhID0gTlVMTDsKKworICAgIC8vIENIRUNLKCFtRGlzY29udGludWl0eVNlZ21lbnRzLmVtcHR5KCkpOworICAgIERpc2NvbnRpbnVpdHlTZWdtZW50ICZzZWcgPSAqbURpc2NvbnRpbnVpdHlTZWdtZW50cy5iZWdpbigpOworICAgIGlmIChmaXJzdFRpbWVVcyA+PSAwKSB7CisgICAgICAgIHNlZy5tTWF4RGVxdWVUaW1lVXMgPSBmaXJzdFRpbWVVczsKKyAgICB9IGVsc2UgeworICAgICAgICBzZWcuY2xlYXIoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmlyc3RNZXRhOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaAppbmRleCA4MDlhODU4Li4yOGEwZTg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaApAQCAtNDMsMTQgKzQzLDIwIEBACiAKICAgICB2b2lkIGNsZWFyKCk7CiAKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgd2UgaGF2ZSBhbnkgcGFja2V0cyBpbmNsdWRpbmcgZGlzY29udGludWl0aWVzCiAgICAgYm9vbCBoYXNCdWZmZXJBdmFpbGFibGUoc3RhdHVzX3QgKmZpbmFsUmVzdWx0KTsKIAorICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB3ZSBoYXZlIHBhY2tldHMgdGhhdCdzIG5vdCBkaXNjb250aW51aXRpZXMKKyAgICBib29sIGhhc0RhdGFCdWZmZXJBdmFpbGFibGUoc3RhdHVzX3QgKmZpbmFsUmVzdWx0KTsKKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgYnVmZmVycy4gZmluYWxSZXN1bHQgaXMgYWx3YXlzIE9LCisgICAgLy8gaWYgdGhpcyBtZXRob2QgcmV0dXJucyBub24tMCwgb3IgdGhlIGZpbmFsIHJlc3VsdCBpZiBpdCByZXR1cm5zIDAuCisgICAgc2l6ZV90IGdldEF2YWlsYWJsZUJ1ZmZlckNvdW50KHN0YXR1c190ICpmaW5hbFJlc3VsdCk7CisKICAgICAvLyBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGxhc3QgYW5kIHRoZSBmaXJzdCBxdWV1ZWQKICAgICAvLyBwcmVzZW50YXRpb24gdGltZXN0YW1wcyBzaW5jZSB0aGUgbGFzdCBkaXNjb250aW51aXR5IChpZiBhbnkpLgogICAgIGludDY0X3QgZ2V0QnVmZmVyZWREdXJhdGlvblVzKHN0YXR1c190ICpmaW5hbFJlc3VsdCk7CiAKLSAgICBpbnQ2NF90IGdldEVzdGltYXRlZER1cmF0aW9uVXMoKTsKLQogICAgIHN0YXR1c190IG5leHRCdWZmZXJUaW1lKGludDY0X3QgKnRpbWVVcyk7CiAKICAgICB2b2lkIHF1ZXVlQWNjZXNzVW5pdChjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKQEAgLTYzLDIxICs2OSw0OCBAQAogICAgIHZvaWQgc2lnbmFsRU9TKHN0YXR1c190IHJlc3VsdCk7CiAKICAgICBzdGF0dXNfdCBkZXF1ZXVlQWNjZXNzVW5pdChzcDxBQnVmZmVyPiAqYnVmZmVyKTsKKyAgICB2b2lkIHJlcXVldWVBY2Nlc3NVbml0KGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogCiAgICAgYm9vbCBpc0ZpbmlzaGVkKGludDY0X3QgZHVyYXRpb24pIGNvbnN0OwogCisgICAgdm9pZCBlbmFibGUoYm9vbCBlbmFibGUpOworCiAgICAgc3A8QU1lc3NhZ2U+IGdldExhdGVzdEVucXVldWVkTWV0YSgpOwogICAgIHNwPEFNZXNzYWdlPiBnZXRMYXRlc3REZXF1ZXVlZE1ldGEoKTsKKyAgICBzcDxBTWVzc2FnZT4gZ2V0TWV0YUFmdGVyTGFzdERlcXVldWVkKGludDY0X3QgZGVsYXlVcyk7CisKKyAgICB2b2lkIHRyaW1CdWZmZXJzQWZ0ZXJNZXRhKGNvbnN0IHNwPEFNZXNzYWdlPiAmbWV0YSk7CisgICAgc3A8QU1lc3NhZ2U+IHRyaW1CdWZmZXJzQmVmb3JlTWV0YShjb25zdCBzcDxBTWVzc2FnZT4gJm1ldGEpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QW5vdGhlclBhY2tldFNvdXJjZSgpOwogCiBwcml2YXRlOgorCisgICAgc3RydWN0IERpc2NvbnRpbnVpdHlTZWdtZW50IHsKKyAgICAgICAgaW50NjRfdCBtTWF4RGVxdWVUaW1lVXMsIG1NYXhFbnF1ZVRpbWVVczsKKyAgICAgICAgRGlzY29udGludWl0eVNlZ21lbnQoKQorICAgICAgICAgICAgOiBtTWF4RGVxdWVUaW1lVXMoLTEpLAorICAgICAgICAgICAgICBtTWF4RW5xdWVUaW1lVXMoLTEpIHsKKyAgICAgICAgfTsKKworICAgICAgICB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgbU1heERlcXVlVGltZVVzID0gbU1heEVucXVlVGltZVVzID0gLTE7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gRGlzY29udGludWl0eSBzZWdtZW50cyBhcmUgY29uc2VjdXRpdmUgYWNjZXNzIHVuaXRzIGJldHdlZW4KKyAgICAvLyBkaXNjb250aW51aXR5IG1hcmtlcnMuIFRoZXJlIHNob3VsZCBhbHdheXMgYmUgYXQgbGVhc3QgX09ORV8KKyAgICAvLyBkaXNjb250aW51aXR5IHNlZ21lbnQsIGhlbmNlIHRoZSB2YXJpb3VzIENIRUNLcyBpbgorICAgIC8vIEFub3RoZXJQYWNrZXRTb3VyY2UuY3BwIGZvciBub24tZW1wdHkoKS1uZXNzLgorICAgIExpc3Q8RGlzY29udGludWl0eVNlZ21lbnQ+IG1EaXNjb250aW51aXR5U2VnbWVudHM7CisKICAgICBNdXRleCBtTG9jazsKICAgICBDb25kaXRpb24gbUNvbmRpdGlvbjsKIAogICAgIGJvb2wgbUlzQXVkaW87CiAgICAgYm9vbCBtSXNWaWRlbzsKKyAgICBib29sIG1FbmFibGVkOwogICAgIHNwPE1ldGFEYXRhPiBtRm9ybWF0OwogICAgIGludDY0X3QgbUxhc3RRdWV1ZWRUaW1lVXM7CiAgICAgTGlzdDxzcDxBQnVmZmVyPiA+IG1CdWZmZXJzOwpAQCAtODUsMTAgKzExOCw3IEBACiAgICAgc3A8QU1lc3NhZ2U+IG1MYXRlc3RFbnF1ZXVlZE1ldGE7CiAgICAgc3A8QU1lc3NhZ2U+IG1MYXRlc3REZXF1ZXVlZE1ldGE7CiAKLSAgICBzaXplX3QgIG1RdWV1ZWREaXNjb250aW51aXR5Q291bnQ7Ci0KICAgICBib29sIHdhc0Zvcm1hdENoYW5nZShpbnQzMl90IGRpc2NvbnRpbnVpdHlUeXBlKSBjb25zdDsKLSAgICBpbnQ2NF90IGdldEJ1ZmZlcmVkRHVyYXRpb25Vc19sKHN0YXR1c190ICpmaW5hbFJlc3VsdCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBbm90aGVyUGFja2V0U291cmNlKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcAppbmRleCA1NTI3ZGYwLi4zNmVjMzY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKQEAgLTU2LDYgKzU2LDggQEAKICAgICBpZiAoY2xlYXJGb3JtYXQpIHsKICAgICAgICAgbUZvcm1hdC5jbGVhcigpOwogICAgIH0KKworICAgIG1FT1NSZWFjaGVkID0gZmFsc2U7CiB9CiAKIC8vIFBhcnNlIEFDMyBoZWFkZXIgYXNzdW1pbmcgdGhlIGN1cnJlbnQgcHRyIGlzIHN0YXJ0IHBvc2l0aW9uIG9mIHN5bmNmcmFtZSwKQEAgLTQxNSwxMyArNDE3LDE0IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGNhc2UgUENNX0FVRElPOgorICAgICAgICAgICAgY2FzZSBNRVRBREFUQToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBUUkVTUEFTUygpOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIG1vZGU6ICVkIiwgbU1vZGUpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ5OSw4ICs1MDIsMTMgQEAKICAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdE1QRUc0VmlkZW8oKTsKICAgICAgICAgY2FzZSBQQ01fQVVESU86CiAgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRQQ01BdWRpbygpOworICAgICAgICBjYXNlIE1FVEFEQVRBOgorICAgICAgICAgICAgcmV0dXJuIGRlcXVldWVBY2Nlc3NVbml0TWV0YWRhdGEoKTsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIENIRUNLX0VRKCh1bnNpZ25lZCltTW9kZSwgKHVuc2lnbmVkKU1QRUdfQVVESU8pOworICAgICAgICAgICAgaWYgKG1Nb2RlICE9IE1QRUdfQVVESU8pIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBtb2RlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHQXVkaW8oKTsKICAgICB9CiB9CkBAIC01MzcsOCArNTQ1LDEyIEBACiAgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBzeW5jU3RhcnRQb3MgKyBwYXlsb2FkU2l6ZSk7CiAKICAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKTsKLSAgICBDSEVDS19HRSh0aW1lVXMsIDBsbCk7CisgICAgaWYgKHRpbWVVcyA8IDBsbCkgeworICAgICAgICBBTE9HRSgibmVnYXRpdmUgdGltZVVzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImlzU3luYyIsIDEpOwogCiAgICAgbWVtbW92ZSgKICAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSwKQEAgLTU1NiwxNSArNTY4LDI0IEBACiAgICAgfQogCiAgICAgQUJpdFJlYWRlciBiaXRzKG1CdWZmZXItPmRhdGEoKSwgNCk7Ci0gICAgQ0hFQ0tfRVEoYml0cy5nZXRCaXRzKDgpLCAweGEwKTsKKyAgICBpZiAoYml0cy5nZXRCaXRzKDgpICE9IDB4YTApIHsKKyAgICAgICAgQUxPR0UoIlVuZXhwZWN0ZWQgYml0IHZhbHVlcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAgICAgdW5zaWduZWQgbnVtQVVzID0gYml0cy5nZXRCaXRzKDgpOwogICAgIGJpdHMuc2tpcEJpdHMoOCk7CiAgICAgdW5zaWduZWQgcXVhbnRpemF0aW9uX3dvcmRfbGVuZ3RoIF9fdW51c2VkID0gYml0cy5nZXRCaXRzKDIpOwogICAgIHVuc2lnbmVkIGF1ZGlvX3NhbXBsaW5nX2ZyZXF1ZW5jeSA9IGJpdHMuZ2V0Qml0cygzKTsKICAgICB1bnNpZ25lZCBudW1fY2hhbm5lbHMgPSBiaXRzLmdldEJpdHMoMyk7CiAKLSAgICBDSEVDS19FUShhdWRpb19zYW1wbGluZ19mcmVxdWVuY3ksIDIpOyAgLy8gNDhrSHoKLSAgICBDSEVDS19FUShudW1fY2hhbm5lbHMsIDF1KTsgIC8vIHN0ZXJlbyEKKyAgICBpZiAoYXVkaW9fc2FtcGxpbmdfZnJlcXVlbmN5ICE9IDIpIHsKKyAgICAgICAgQUxPR0UoIldyb25nIHNhbXBsaW5nIGZyZXEiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmIChudW1fY2hhbm5lbHMgIT0gMXUpIHsKKyAgICAgICAgQUxPR0UoIldyb25nIGNoYW5uZWwgIyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7CiAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7CkBAIC01ODYsOCArNjA3LDEyIEBACiAgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpICsgNCwgcGF5bG9hZFNpemUpOwogCiAgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChwYXlsb2FkU2l6ZSArIDQpOwotICAgIENIRUNLX0dFKHRpbWVVcywgMGxsKTsKKyAgICBpZiAodGltZVVzIDwgMGxsKSB7CisgICAgICAgIEFMT0dFKCJOZWdhdGl2ZSB0aW1lVXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiaXNTeW5jIiwgMSk7CiAKICAgICBpbnQxNl90ICpwdHIgPSAoaW50MTZfdCAqKWFjY2Vzc1VuaXQtPmRhdGEoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBheWxvYWRTaXplIC8gc2l6ZW9mKGludDE2X3QpOyArK2kpIHsKQEAgLTYwOSwyMiArNjM0LDI1IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIENIRUNLKCFtUmFuZ2VJbmZvcy5lbXB0eSgpKTsKKyAgICBpZiAobVJhbmdlSW5mb3MuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICAgICBjb25zdCBSYW5nZUluZm8gJmluZm8gPSAqbVJhbmdlSW5mb3MuYmVnaW4oKTsKICAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgaW5mby5tTGVuZ3RoKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIENIRUNLX0dFKGluZm8ubVRpbWVzdGFtcFVzLCAwbGwpOworICAgIGlmIChpbmZvLm1UaW1lc3RhbXBVcyA8IDBsbCkgeworICAgICAgICBBTE9HRSgiTmVnYXRpdmUgaW5mby5tVGltZXN0YW1wVXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCiAgICAgLy8gVGhlIGlkZWEgaGVyZSBpcyBjb25zdW1lIGFsbCBBQUMgZnJhbWVzIHN0YXJ0aW5nIGF0IG9mZnNldHMgYmVmb3JlCiAgICAgLy8gaW5mby5tTGVuZ3RoIHNvIHdlIGNhbiBhc3NpZ24gYSBtZWFuaW5nZnVsIHRpbWVzdGFtcCB3aXRob3V0CiAgICAgLy8gaGF2aW5nIHRvIGludGVycG9sYXRlLgogICAgIC8vIFRoZSBmaW5hbCBBQUMgZnJhbWUgbWF5IHdlbGwgZXh0ZW5kIGludG8gdGhlIG5leHQgUmFuZ2VJbmZvIGJ1dAogICAgIC8vIHRoYXQncyBvay4KLSAgICAvLyBUT0RPOiB0aGUgbG9naWMgY29tbWVudGVkIGFib3ZlIGlzIHNraXBwZWQgYmVjYXVzZSBjb2RlYyBjYW5ub3QgdGFrZQotICAgIC8vIGFyYml0cmFyeSBzaXplZCBpbnB1dCBidWZmZXJzOwogICAgIHNpemVfdCBvZmZzZXQgPSAwOwogICAgIHdoaWxlIChvZmZzZXQgPCBpbmZvLm1MZW5ndGgpIHsKICAgICAgICAgaWYgKG9mZnNldCArIDcgPiBtQnVmZmVyLT5zaXplKCkpIHsKQEAgLTYzNSwxNyArNjYzLDI2IEBACiAKICAgICAgICAgLy8gYWR0c19maXhlZF9oZWFkZXIKIAotICAgICAgICBDSEVDS19FUShiaXRzLmdldEJpdHMoMTIpLCAweGZmZnUpOworICAgICAgICBpZiAoYml0cy5nZXRCaXRzKDEyKSAhPSAweGZmZnUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJXcm9uZyBhdGRzX2ZpeGVkX2hlYWRlciIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICAgICAgICAgYml0cy5za2lwQml0cygzKTsgIC8vIElELCBsYXllcgogICAgICAgICBib29sIHByb3RlY3Rpb25fYWJzZW50IF9fdW51c2VkID0gYml0cy5nZXRCaXRzKDEpICE9IDA7CiAKICAgICAgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgewogICAgICAgICAgICAgdW5zaWduZWQgcHJvZmlsZSA9IGJpdHMuZ2V0Qml0cygyKTsKLSAgICAgICAgICAgIENIRUNLX05FKHByb2ZpbGUsIDN1KTsKKyAgICAgICAgICAgIGlmIChwcm9maWxlID09IDN1KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoInByb2ZpbGUgc2hvdWxkIG5vdCBiZSAzIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4ID0gYml0cy5nZXRCaXRzKDQpOwogICAgICAgICAgICAgYml0cy5nZXRCaXRzKDEpOyAgLy8gcHJpdmF0ZV9iaXQKICAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbiA9IGJpdHMuZ2V0Qml0cygzKTsKLSAgICAgICAgICAgIENIRUNLX05FKGNoYW5uZWxfY29uZmlndXJhdGlvbiwgMHUpOworICAgICAgICAgICAgaWYgKGNoYW5uZWxfY29uZmlndXJhdGlvbiA9PSAwdSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJjaGFubmVsX2NvbmZpZyBzaG91bGQgbm90IGJlIDAiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJpdHMuc2tpcEJpdHMoMik7ICAvLyBvcmlnaW5hbF9jb3B5LCBob21lCiAKICAgICAgICAgICAgIG1Gb3JtYXQgPSBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCkBAIC02NTUsOCArNjkyLDE0IEBACiAKICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKICAgICAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7Ci0gICAgICAgICAgICBDSEVDSyhtRm9ybWF0LT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSk7Ci0gICAgICAgICAgICBDSEVDSyhtRm9ybWF0LT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm51bUNoYW5uZWxzKSk7CisgICAgICAgICAgICBpZiAoIW1Gb3JtYXQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlNhbXBsZVJhdGUgbm90IGZvdW5kIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1Gb3JtYXQtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNoYW5uZWxDb3VudCBub3QgZm91bmQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQUxPR0koImZvdW5kIEFBQyBjb2RlYyBjb25maWcgKCVkIEh6LCAlZCBjaGFubmVscykiLAogICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7CkBAIC02NzksNyArNzIyLDggQEAKIAogICAgICAgICBpZiAobnVtYmVyX29mX3Jhd19kYXRhX2Jsb2Nrc19pbl9mcmFtZSAhPSAwKSB7CiAgICAgICAgICAgICAvLyBUbyBiZSBpbXBsZW1lbnRlZC4KLSAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICBBTE9HRSgiU2hvdWxkIG5vdCByZWFjaCBoZXJlLiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAob2Zmc2V0ICsgYWFjX2ZyYW1lX2xlbmd0aCA+IG1CdWZmZXItPnNpemUoKSkgewpAQCAtNjg5LDEyICs3MzMsOSBAQAogICAgICAgICBzaXplX3QgaGVhZGVyU2l6ZSBfX3VudXNlZCA9IHByb3RlY3Rpb25fYWJzZW50ID8gNyA6IDk7CiAKICAgICAgICAgb2Zmc2V0ICs9IGFhY19mcmFtZV9sZW5ndGg7Ci0gICAgICAgIC8vIFRPRE86IG1vdmUgYmFjayB0byBjb25jYXRlbmF0aW9uIHdoZW4gY29kZWMgY2FuIHN1cHBvcnQgYXJiaXRyYXJ5IGlucHV0IGJ1ZmZlcnMuCi0gICAgICAgIC8vIEZvciBub3cgb25seSBxdWV1ZSBhIHNpbmdsZSBidWZmZXIKLSAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcEFBQyhvZmZzZXQpOworICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAob2Zmc2V0KTsKIAogICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcihvZmZzZXQpOwogICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgb2Zmc2V0KTsKQEAgLTcwNCw2ICs3NDUsNyBAQAogICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSAtIG9mZnNldCk7CiAKICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImlzU3luYyIsIDEpOwogCiAgICAgcmV0dXJuIGFjY2Vzc1VuaXQ7CiB9CkBAIC03MTMsNyArNzU1LDkgQEAKICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKIAogICAgIHdoaWxlIChzaXplID4gMCkgewotICAgICAgICBDSEVDSyghbVJhbmdlSW5mb3MuZW1wdHkoKSk7CisgICAgICAgIGlmIChtUmFuZ2VJbmZvcy5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gdGltZVVzOworICAgICAgICB9CiAKICAgICAgICAgUmFuZ2VJbmZvICppbmZvID0gJiptUmFuZ2VJbmZvcy5iZWdpbigpOwogCkBAIC03NDEsNTAgKzc4NSw2IEBACiAgICAgcmV0dXJuIHRpbWVVczsKIH0KIAotLy8gVE9ETzogYXZvaWQgaW50ZXJwb2xhdGluZyB0aW1lc3RhbXBzIG9uY2UgY29kZWMgc3VwcG9ydHMgYXJiaXRyYXJ5IHNpemVkIGlucHV0IGJ1ZmZlcnMKLWludDY0X3QgRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpmZXRjaFRpbWVzdGFtcEFBQyhzaXplX3Qgc2l6ZSkgewotICAgIGludDY0X3QgdGltZVVzID0gLTE7Ci0gICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0KLSAgICBzaXplX3Qgc2FtcGxlc2l6ZSA9IHNpemU7Ci0gICAgd2hpbGUgKHNpemUgPiAwKSB7Ci0gICAgICAgIENIRUNLKCFtUmFuZ2VJbmZvcy5lbXB0eSgpKTsKLQotICAgICAgICBSYW5nZUluZm8gKmluZm8gPSAmKm1SYW5nZUluZm9zLmJlZ2luKCk7Ci0KLSAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICB0aW1lVXMgPSBpbmZvLT5tVGltZXN0YW1wVXM7Ci0gICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluZm8tPm1MZW5ndGggPiBzaXplKSB7Ci0gICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7Ci0gICAgICAgICAgICBDSEVDSyhtRm9ybWF0LT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSk7Ci0gICAgICAgICAgICBpbmZvLT5tTGVuZ3RoIC09IHNpemU7Ci0gICAgICAgICAgICBzaXplX3QgbnVtU2FtcGxlcyA9IDEwMjQgKiBzaXplIC8gc2FtcGxlc2l6ZTsKLSAgICAgICAgICAgIGluZm8tPm1UaW1lc3RhbXBVcyArPSBudW1TYW1wbGVzICogMTAwMDAwMGxsIC8gc2FtcGxlUmF0ZTsKLSAgICAgICAgICAgIHNpemUgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2l6ZSAtPSBpbmZvLT5tTGVuZ3RoOwotCi0gICAgICAgICAgICBtUmFuZ2VJbmZvcy5lcmFzZShtUmFuZ2VJbmZvcy5iZWdpbigpKTsKLSAgICAgICAgICAgIGluZm8gPSBOVUxMOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBpZiAodGltZVVzID09IDBsbCkgewotICAgICAgICBBTE9HVigiUmV0dXJuaW5nIDAgdGltZXN0YW1wIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRpbWVVczsKLX0KLQotc3RydWN0IE5BTFBvc2l0aW9uIHsKLSAgICBzaXplX3QgbmFsT2Zmc2V0OwotICAgIHNpemVfdCBuYWxTaXplOwotfTsKLQogc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdEgyNjQoKSB7CiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IG1CdWZmZXItPmRhdGEoKTsKIApAQCAtNzkyLDExICs3OTIsMTMgQEAKICAgICBWZWN0b3I8TkFMUG9zaXRpb24+IG5hbHM7CiAKICAgICBzaXplX3QgdG90YWxTaXplID0gMDsKKyAgICBzaXplX3Qgc2VpQ291bnQgPSAwOwogCiAgICAgc3RhdHVzX3QgZXJyOwogICAgIGNvbnN0IHVpbnQ4X3QgKm5hbFN0YXJ0OwogICAgIHNpemVfdCBuYWxTaXplOwogICAgIGJvb2wgZm91bmRTbGljZSA9IGZhbHNlOworICAgIGJvb2wgZm91bmRJRFIgPSBmYWxzZTsKICAgICB3aGlsZSAoKGVyciA9IGdldE5leHROQUxVbml0KCZkYXRhLCAmc2l6ZSwgJm5hbFN0YXJ0LCAmbmFsU2l6ZSkpID09IE9LKSB7CiAgICAgICAgIGlmIChuYWxTaXplID09IDApIGNvbnRpbnVlOwogCkBAIC04MDQsNiArODA2LDkgQEAKICAgICAgICAgYm9vbCBmbHVzaCA9IGZhbHNlOwogCiAgICAgICAgIGlmIChuYWxUeXBlID09IDEgfHwgbmFsVHlwZSA9PSA1KSB7CisgICAgICAgICAgICBpZiAobmFsVHlwZSA9PSA1KSB7CisgICAgICAgICAgICAgICAgZm91bmRJRFIgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGZvdW5kU2xpY2UpIHsKICAgICAgICAgICAgICAgICBBQml0UmVhZGVyIGJyKG5hbFN0YXJ0ICsgMSwgbmFsU2l6ZSk7CiAgICAgICAgICAgICAgICAgdW5zaWduZWQgZmlyc3RfbWJfaW5fc2xpY2UgPSBwYXJzZVVFKCZicik7CkBAIC04MjEsNiArODI2LDkgQEAKICAgICAgICAgICAgIC8vIG5leHQgZnJhbWUuCiAKICAgICAgICAgICAgIGZsdXNoID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChuYWxUeXBlID09IDYgJiYgbmFsU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIC8vIGZvdW5kIG5vbi16ZXJvIHNpemVkIFNFSQorICAgICAgICAgICAgKytzZWlDb3VudDsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChmbHVzaCkgewpAQCAtODI5LDIxICs4MzcsMzIgQEAKIAogICAgICAgICAgICAgc2l6ZV90IGF1U2l6ZSA9IDQgKiBuYWxzLnNpemUoKSArIHRvdGFsU2l6ZTsKICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcihhdVNpemUpOworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gc2VpOworCisgICAgICAgICAgICBpZiAoc2VpQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgc2VpID0gbmV3IEFCdWZmZXIoc2VpQ291bnQgKiBzaXplb2YoTkFMUG9zaXRpb24pKTsKKyAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEJ1ZmZlcigic2VpIiwgc2VpKTsKKyAgICAgICAgICAgIH0KIAogI2lmICFMT0dfTkRFQlVHCiAgICAgICAgICAgICBBU3RyaW5nIG91dDsKICNlbmRpZgogCiAgICAgICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHNpemVfdCBzZWlJbmRleCA9IDA7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5hbHMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgICAgICBjb25zdCBOQUxQb3NpdGlvbiAmcG9zID0gbmFscy5pdGVtQXQoaSk7CiAKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBuYWxUeXBlID0gbUJ1ZmZlci0+ZGF0YSgpW3Bvcy5uYWxPZmZzZXRdICYgMHgxZjsKIAotICAgICAgICAgICAgICAgIGlmIChuYWxUeXBlID09IDYpIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gc2VpID0gbmV3IEFCdWZmZXIocG9zLm5hbFNpemUpOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoc2VpLT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSArIHBvcy5uYWxPZmZzZXQsIHBvcy5uYWxTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRCdWZmZXIoInNlaSIsIHNlaSk7CisgICAgICAgICAgICAgICAgaWYgKG5hbFR5cGUgPT0gNiAmJiBwb3MubmFsU2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlaUluZGV4ID49IHNlaS0+c2l6ZSgpIC8gc2l6ZW9mKE5BTFBvc2l0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIldyb25nIHNlaUluZGV4Iik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBOQUxQb3NpdGlvbiAmc2VpUG9zID0gKChOQUxQb3NpdGlvbiAqKXNlaS0+ZGF0YSgpKVtzZWlJbmRleCsrXTsKKyAgICAgICAgICAgICAgICAgICAgc2VpUG9zLm5hbE9mZnNldCA9IGRzdE9mZnNldCArIDQ7CisgICAgICAgICAgICAgICAgICAgIHNlaVBvcy5uYWxTaXplID0gcG9zLm5hbFNpemU7CiAgICAgICAgICAgICAgICAgfQogCiAjaWYgIUxPR19OREVCVUcKQEAgLTg3OCw5ICs4OTcsMTUgQEAKICAgICAgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSAtIG5leHRTY2FuKTsKIAogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChuZXh0U2Nhbik7Ci0gICAgICAgICAgICBDSEVDS19HRSh0aW1lVXMsIDBsbCk7CisgICAgICAgICAgICBpZiAodGltZVVzIDwgMGxsKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk5lZ2F0aXZlIHRpbWVVcyIpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgICAgICAgICAgaWYgKGZvdW5kSURSKSB7CisgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiaXNTeW5jIiwgMSk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBtRm9ybWF0ID0gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKGFjY2Vzc1VuaXQpOwpAQCAtODk3LDcgKzkyMiwxMCBAQAogCiAgICAgICAgIHRvdGFsU2l6ZSArPSBuYWxTaXplOwogICAgIH0KLSAgICBDSEVDS19FUShlcnIsIChzdGF0dXNfdCktRUFHQUlOKTsKKyAgICBpZiAoZXJyICE9IChzdGF0dXNfdCktRUFHQUlOKSB7CisgICAgICAgIEFMT0dFKCJVbmV4cGV0ZWQgZXJyIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAogICAgIHJldHVybiBOVUxMOwogfQpAQCAtOTE0LDkgKzk0MiwxMiBAQAogCiAgICAgc2l6ZV90IGZyYW1lU2l6ZTsKICAgICBpbnQgc2FtcGxpbmdSYXRlLCBudW1DaGFubmVscywgYml0cmF0ZSwgbnVtU2FtcGxlczsKLSAgICBDSEVDSyhHZXRNUEVHQXVkaW9GcmFtZVNpemUoCisgICAgaWYgKCFHZXRNUEVHQXVkaW9GcmFtZVNpemUoCiAgICAgICAgICAgICAgICAgaGVhZGVyLCAmZnJhbWVTaXplLCAmc2FtcGxpbmdSYXRlLCAmbnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgJmJpdHJhdGUsICZudW1TYW1wbGVzKSk7CisgICAgICAgICAgICAgICAgJmJpdHJhdGUsICZudW1TYW1wbGVzKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBhdWRpbyBmcmFtZSBzaXplIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAogICAgIGlmIChzaXplIDwgZnJhbWVTaXplKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtOTM0LDkgKzk2NSwxMyBAQAogICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSAtIGZyYW1lU2l6ZSk7CiAKICAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKGZyYW1lU2l6ZSk7Ci0gICAgQ0hFQ0tfR0UodGltZVVzLCAwbGwpOworICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKKyAgICAgICAgQUxPR0UoIk5lZ2F0aXZlIHRpbWVVcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImlzU3luYyIsIDEpOwogCiAgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgewogICAgICAgICBtRm9ybWF0ID0gbmV3IE1ldGFEYXRhOwpAQCAtOTU1LDcgKzk5MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBUUkVTUEFTUygpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsaW5nUmF0ZSk7CkBAIC05NjYsNyArMTAwMSwxMCBAQAogfQogCiBzdGF0aWMgdm9pZCBFbmNvZGVTaXplMTQodWludDhfdCAqKl9wdHIsIHNpemVfdCBzaXplKSB7Ci0gICAgQ0hFQ0tfTEUoc2l6ZSwgMHgzZmZmKTsKKyAgICBpZiAoc2l6ZSA+IDB4M2ZmZikgeworICAgICAgICBBTE9HRSgiV3Jvbmcgc2l6ZSIpOworICAgICAgICByZXR1cm47CisgICAgfQogCiAgICAgdWludDhfdCAqcHRyID0gKl9wdHI7CiAKQEAgLTEwMTMsNiArMTA1MSw5IEBACiAgICAgaW50IHBwcmV2U3RhcnRDb2RlID0gLTE7CiAgICAgaW50IHByZXZTdGFydENvZGUgPSAtMTsKICAgICBpbnQgY3VycmVudFN0YXJ0Q29kZSA9IC0xOworICAgIGJvb2wgZ29wRm91bmQgPSBmYWxzZTsKKyAgICBib29sIGlzQ2xvc2VkR29wID0gZmFsc2U7CisgICAgYm9vbCBicm9rZW5MaW5rID0gZmFsc2U7CiAKICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKICAgICB3aGlsZSAob2Zmc2V0ICsgMyA8IHNpemUpIHsKQEAgLTEwMzgsNyArMTA3OSwxMCBAQAogICAgICAgICAgICAgLy8gc2VxSGVhZGVyIHdpdGhvdXQvd2l0aCBleHRlbnNpb24KIAogICAgICAgICAgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIENIRUNLX0dFKHNpemUsIDd1KTsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IDd1KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJTaXplIHRvbyBzbWFsbCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICB1bnNpZ25lZCB3aWR0aCA9CiAgICAgICAgICAgICAgICAgICAgIChkYXRhWzRdIDw8IDQpIHwgZGF0YVs1XSA+PiA0OwpAQCAtMTA3NSw2ICsxMTE5LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobUZvcm1hdCAhPSBOVUxMICYmIGN1cnJlbnRTdGFydENvZGUgPT0gMHhiOCkgeworICAgICAgICAgICAgLy8gR09QIGxheWVyCisgICAgICAgICAgICBnb3BGb3VuZCA9IHRydWU7CisgICAgICAgICAgICBpc0Nsb3NlZEdvcCA9IChkYXRhW29mZnNldCArIDddICYgMHg0MCkgIT0gMDsKKyAgICAgICAgICAgIGJyb2tlbkxpbmsgPSAoZGF0YVtvZmZzZXQgKyA3XSAmIDB4MjApICE9IDA7CisgICAgICAgIH0KKwogICAgICAgICBpZiAobUZvcm1hdCAhPSBOVUxMICYmIGN1cnJlbnRTdGFydENvZGUgPT0gMHgwMCkgewogICAgICAgICAgICAgLy8gUGljdHVyZSBzdGFydAogCkBAIC0xMDkxLDExICsxMTQyLDE3IEBACiAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpIC0gb2Zmc2V0KTsKIAogICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAob2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBDSEVDS19HRSh0aW1lVXMsIDBsbCk7CisgICAgICAgICAgICAgICAgaWYgKHRpbWVVcyA8IDBsbCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTmVnYXRpdmUgdGltZVVzIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7CiAKICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgICAgICAgICAgICAgIGlmIChnb3BGb3VuZCAmJiAoIWJyb2tlbkxpbmsgfHwgaXNDbG9zZWRHb3ApKSB7CisgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImlzU3luYyIsIDEpOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIEFMT0dWKCJyZXR1cm5pbmcgTVBFRyB2aWRlbyBhY2Nlc3MgdW5pdCBhdCB0aW1lICUiIFBSSWQ2NCAiIHVzIiwKICAgICAgICAgICAgICAgICAgICAgICB0aW1lVXMpOwpAQCAtMTEyMSw3ICsxMTc4LDcgQEAKICAgICB9CiAKICAgICBpZiAobWVtY21wKGtTdGFydENvZGUsIGRhdGEsIDMpKSB7Ci0gICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgIHJldHVybiAtRUFHQUlOOwogICAgIH0KIAogICAgIHNpemVfdCBvZmZzZXQgPSAzOwpAQCAtMTE4MSwyNSArMTIzOCwzNyBAQAogCiAgICAgICAgICAgICBjYXNlIEVYUEVDVF9WSVNVQUxfT0JKRUNUX1NUQVJUOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENIRUNLX0VRKGNodW5rVHlwZSwgMHhiNSk7CisgICAgICAgICAgICAgICAgaWYgKGNodW5rVHlwZSAhPSAweGI1KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJVbmV4cGVjdGVkIGNodW5rVHlwZSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc3RhdGUgPSBFWFBFQ1RfVk9fU1RBUlQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGNhc2UgRVhQRUNUX1ZPX1NUQVJUOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENIRUNLX0xFKGNodW5rVHlwZSwgMHgxZik7CisgICAgICAgICAgICAgICAgaWYgKGNodW5rVHlwZSA+IDB4MWYpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlVuZXhwZWN0ZWQgY2h1bmtUeXBlIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBzdGF0ZSA9IEVYUEVDVF9WT0xfU1RBUlQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGNhc2UgRVhQRUNUX1ZPTF9TVEFSVDoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDSEVDSygoY2h1bmtUeXBlICYgMHhmMCkgPT0gMHgyMCk7CisgICAgICAgICAgICAgICAgaWYgKChjaHVua1R5cGUgJiAweGYwKSAhPSAweDIwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJXcm9uZyBjaHVua1R5cGUiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgQ0hFQ0soRXh0cmFjdERpbWVuc2lvbnNGcm9tVk9MSGVhZGVyKAorICAgICAgICAgICAgICAgIGlmICghRXh0cmFjdERpbWVuc2lvbnNGcm9tVk9MSGVhZGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhW29mZnNldF0sIGNodW5rU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsICZoZWlnaHQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsICZoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGRpbWVuc2lvbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBzdGF0ZSA9IFdBSVRfRk9SX1ZPUF9TVEFSVDsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEyNDAsNiArMTMwOSw4IEBACiAgICAgICAgICAgICBjYXNlIFNLSVBfVE9fVk9QX1NUQVJUOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChjaHVua1R5cGUgPT0gMHhiNikgeworICAgICAgICAgICAgICAgICAgICBpbnQgdm9wQ29kaW5nVHlwZSA9IChkYXRhW29mZnNldCArIDRdICYgMHhjMCkgPj4gNjsKKwogICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gY2h1bmtTaXplOwogCiAgICAgICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcihvZmZzZXQpOwpAQCAtMTI1MCwxMSArMTMyMSwxNyBAQAogICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBzaXplKTsKIAogICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLX0dFKHRpbWVVcywgMGxsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVVcyA8IDBsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5lZ2F0aXZlIHRpbWV1cyIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAwOwogCiAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2b3BDb2RpbmdUeXBlID09IDApIHsgIC8vIGludHJhLWNvZGVkIFZPUAorICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiaXNTeW5jIiwgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBBTE9HVigicmV0dXJuaW5nIE1QRUc0IHZpZGVvIGFjY2VzcyB1bml0IGF0IHRpbWUgJSIgUFJJZDY0ICIgdXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVVcyk7CkBAIC0xMjcxLDcgKzEzNDgsOCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIFRSRVNQQVNTKCk7CisgICAgICAgICAgICAgICAgQUxPR0UoIlVua25vd24gc3RhdGU6ICVkIiwgc3RhdGUpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGRpc2NhcmQpIHsKQEAgLTEzMDAsNSArMTM3OCwyNSBAQAogICAgIH0KIH0KIAorc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdE1ldGFkYXRhKCkgeworICAgIHNpemVfdCBzaXplID0gbUJ1ZmZlci0+c2l6ZSgpOworICAgIGlmICghc2l6ZSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIoc2l6ZSk7CisgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChzaXplKTsKKyAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworCisgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBzaXplKTsKKyAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKworICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKKyAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0RBVEFfVElNRURfSUQzKTsKKyAgICB9CisKKyAgICByZXR1cm4gYWNjZXNzVW5pdDsKK30KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmgKaW5kZXggYTZkODEyZi4uZTlmOTZiNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmgKQEAgLTM3LDYgKzM3LDcgQEAKICAgICAgICAgTVBFR19WSURFTywKICAgICAgICAgTVBFRzRfVklERU8sCiAgICAgICAgIFBDTV9BVURJTywKKyAgICAgICAgTUVUQURBVEEsCiAgICAgfTsKIAogICAgIGVudW0gRmxhZ3MgewpAQCAtNzUsMTEgKzc2LDExIEBACiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHVmlkZW8oKTsKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdE1QRUc0VmlkZW8oKTsKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdFBDTUF1ZGlvKCk7CisgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRNZXRhZGF0YSgpOwogCiAgICAgLy8gY29uc3VtZSBhIGxvZ2ljYWwgKGNvbXByZXNzZWQpIGFjY2VzcyB1bml0IG9mIHNpemUgInNpemUiLAogICAgIC8vIHJldHVybnMgaXRzIHRpbWVzdGFtcCBpbiB1cyAob3IgLTEgaWYgbm8gdGltZSBpbmZvcm1hdGlvbikuCiAgICAgaW50NjRfdCBmZXRjaFRpbWVzdGFtcChzaXplX3Qgc2l6ZSk7Ci0gICAgaW50NjRfdCBmZXRjaFRpbWVzdGFtcEFBQyhzaXplX3Qgc2l6ZSk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhFbGVtZW50YXJ5U3RyZWFtUXVldWUpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJQU0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyUFNFeHRyYWN0b3IuY3BwCmluZGV4IDg1ODU5ZjcuLjZkOWZlOWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJQU0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlBTRXh0cmFjdG9yLmNwcApAQCAtMjY1LDcgKzI2NSwxMCBAQAogICAgIH0KIAogICAgIHVuc2lnbmVkIFBFU19wYWNrZXRfbGVuZ3RoID0gVTE2X0FUKG1CdWZmZXItPmRhdGEoKSArIDQpOwotICAgIENIRUNLX05FKFBFU19wYWNrZXRfbGVuZ3RoLCAwdSk7CisgICAgaWYgKFBFU19wYWNrZXRfbGVuZ3RoID09IDB1KSB7CisgICAgICAgIEFMT0dFKCJQRVNfcGFja2V0X2xlbmd0aCBpcyAwIik7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KIAogICAgIHNpemVfdCBuID0gUEVTX3BhY2tldF9sZW5ndGggKyA2OwogCkBAIC0yODYsNyArMjg5LDEwIEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgQ0hFQ0tfRVEocGFja2V0X3N0YXJ0Y29kZV9wcmVmaXgsIDB4MDAwMDAxdSk7CisgICAgaWYgKHBhY2tldF9zdGFydGNvZGVfcHJlZml4ICE9IDB4MDAwMDAxdSkgeworICAgICAgICBBTE9HRSgiV3JvbmcgUEVTIHByZWZpeCIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KIAogICAgIHVuc2lnbmVkIHN0cmVhbV9pZCA9IGJyLmdldEJpdHMoOCk7CiAgICAgQUxPR1YoInN0cmVhbV9pZCA9IDB4JTAyeCIsIHN0cmVhbV9pZCk7CkBAIC0zNjYsOCArMzcyLDcgQEAKICAgICAgICAgICAgICYmIHN0cmVhbV9pZCAhPSAweGZmICAvLyBwcm9ncmFtX3N0cmVhbV9kaXJlY3RvcnkKICAgICAgICAgICAgICYmIHN0cmVhbV9pZCAhPSAweGYyICAvLyBEU01DQwogICAgICAgICAgICAgJiYgc3RyZWFtX2lkICE9IDB4ZjgpIHsgIC8vIEguMjIyLjEgdHlwZSBFCi0gICAgICAgIENIRUNLX0VRKGJyLmdldEJpdHMoMiksIDJ1KTsKLQorICAgICAgICAvKiB1bnNpZ25lZCBQRVNfbWFya2VyX2JpdHMgPSAqL2JyLmdldEJpdHMoMik7ICAvLyBzaG91bGQgYmUgMHgyKGhleCkKICAgICAgICAgLyogdW5zaWduZWQgUEVTX3NjcmFtYmxpbmdfY29udHJvbCA9ICovYnIuZ2V0Qml0cygyKTsKICAgICAgICAgLyogdW5zaWduZWQgUEVTX3ByaW9yaXR5ID0gKi9ici5nZXRCaXRzKDEpOwogICAgICAgICAvKiB1bnNpZ25lZCBkYXRhX2FsaWdubWVudF9pbmRpY2F0b3IgPSAqL2JyLmdldEJpdHMoMSk7CkBAIC00MDAsMTYgKzQwNSwyNiBAQAogICAgICAgICB1aW50NjRfdCBQVFMgPSAwLCBEVFMgPSAwOwogCiAgICAgICAgIGlmIChQVFNfRFRTX2ZsYWdzID09IDIgfHwgUFRTX0RUU19mbGFncyA9PSAzKSB7Ci0gICAgICAgICAgICBDSEVDS19HRShvcHRpb25hbF9ieXRlc19yZW1haW5pbmcsIDV1KTsKKyAgICAgICAgICAgIGlmIChvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgPCA1dSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIENIRUNLX0VRKGJyLmdldEJpdHMoNCksIFBUU19EVFNfZmxhZ3MpOworICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoNCkgIT0gUFRTX0RUU19mbGFncykgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFBUUyA9ICgodWludDY0X3QpYnIuZ2V0Qml0cygzKSkgPDwgMzA7Ci0gICAgICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBQVFMgfD0gKCh1aW50NjRfdClici5nZXRCaXRzKDE1KSkgPDwgMTU7Ci0gICAgICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBQVFMgfD0gYnIuZ2V0Qml0cygxNSk7Ci0gICAgICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEFMT0dWKCJQVFMgPSAlIiBQUkl1NjQsIFBUUyk7CiAgICAgICAgICAgICAvLyBBTE9HSSgiUFRTID0gJS4yZiBzZWNzIiwgUFRTIC8gOTAwMDAuMGYpOwpAQCAtNDE3LDE2ICs0MzIsMjYgQEAKICAgICAgICAgICAgIG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAtPSA1OwogCiAgICAgICAgICAgICBpZiAoUFRTX0RUU19mbGFncyA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfR0Uob3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nLCA1dSk7CisgICAgICAgICAgICAgICAgaWYgKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyA8IDV1KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cyg0KSwgMXUpOworICAgICAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDQpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgRFRTID0gKCh1aW50NjRfdClici5nZXRCaXRzKDMpKSA8PCAzMDsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgRFRTIHw9ICgodWludDY0X3QpYnIuZ2V0Qml0cygxNSkpIDw8IDE1OwotICAgICAgICAgICAgICAgIENIRUNLX0VRKGJyLmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBEVFMgfD0gYnIuZ2V0Qml0cygxNSk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgQUxPR1YoIkRUUyA9ICUiIFBSSXU2NCwgRFRTKTsKIApAQCAtNDM1LDQwICs0NjAsNjIgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChFU0NSX2ZsYWcpIHsKLSAgICAgICAgICAgIENIRUNLX0dFKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZywgNnUpOworICAgICAgICAgICAgaWYgKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyA8IDZ1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnIuZ2V0Qml0cygyKTsKIAogICAgICAgICAgICAgdWludDY0X3QgRVNDUiA9ICgodWludDY0X3QpYnIuZ2V0Qml0cygzKSkgPDwgMzA7Ci0gICAgICAgICAgICBDSEVDS19FUShici5nZXRCaXRzKDEpLCAxdSk7CisgICAgICAgICAgICBpZiAoYnIuZ2V0Qml0cygxKSAhPSAxdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBFU0NSIHw9ICgodWludDY0X3QpYnIuZ2V0Qml0cygxNSkpIDw8IDE1OwotICAgICAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogICAgICAgICAgICAgRVNDUiB8PSBici5nZXRCaXRzKDE1KTsKLSAgICAgICAgICAgIENIRUNLX0VRKGJyLmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQUxPR1YoIkVTQ1IgPSAlIiBQUkl1NjQsIEVTQ1IpOwogICAgICAgICAgICAgLyogdW5zaWduZWQgRVNDUl9leHRlbnNpb24gPSAqL2JyLmdldEJpdHMoOSk7CiAKLSAgICAgICAgICAgIENIRUNLX0VRKGJyLmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nIC09IDY7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoRVNfcmF0ZV9mbGFnKSB7Ci0gICAgICAgICAgICBDSEVDS19HRShvcHRpb25hbF9ieXRlc19yZW1haW5pbmcsIDN1KTsKKyAgICAgICAgICAgIGlmIChvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgPCAzdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIENIRUNLX0VRKGJyLmdldEJpdHMoMSksIDF1KTsKKyAgICAgICAgICAgIGlmIChici5nZXRCaXRzKDEpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8qIHVuc2lnbmVkIEVTX3JhdGUgPSAqL2JyLmdldEJpdHMoMjIpOwotICAgICAgICAgICAgQ0hFQ0tfRVEoYnIuZ2V0Qml0cygxKSwgMXUpOworICAgICAgICAgICAgaWYgKGJyLmdldEJpdHMoMSkgIT0gMXUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBvcHRpb25hbF9ieXRlc19yZW1haW5pbmcgLT0gMzsKICAgICAgICAgfQogCisgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgb3B0aW9uYWxfYnl0ZXNfcmVtYWluaW5nICogOCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCiAgICAgICAgIGJyLnNraXBCaXRzKG9wdGlvbmFsX2J5dGVzX3JlbWFpbmluZyAqIDgpOwogCiAgICAgICAgIC8vIEVTIGRhdGEgZm9sbG93cy4KIAotICAgICAgICBDSEVDS19HRShQRVNfcGFja2V0X2xlbmd0aCwgUEVTX2hlYWRlcl9kYXRhX2xlbmd0aCArIDMpOworICAgICAgICBpZiAoUEVTX3BhY2tldF9sZW5ndGggPCBQRVNfaGVhZGVyX2RhdGFfbGVuZ3RoICsgMykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQogCiAgICAgICAgIHVuc2lnbmVkIGRhdGFMZW5ndGggPQogICAgICAgICAgICAgUEVTX3BhY2tldF9sZW5ndGggLSAzIC0gUEVTX2hlYWRlcl9kYXRhX2xlbmd0aDsKQEAgLTQ4MSw3ICs1MjgsOSBAQAogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogCi0gICAgICAgIENIRUNLX0dFKGJyLm51bUJpdHNMZWZ0KCksIGRhdGFMZW5ndGggKiA4KTsKKyAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCBkYXRhTGVuZ3RoICogOCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQogCiAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtVHJhY2tzLmluZGV4T2ZLZXkoc3RyZWFtX2lkKTsKICAgICAgICAgaWYgKGluZGV4IDwgMCAmJiBtU2Nhbm5pbmcpIHsKQEAgLTUyMSwxMCArNTcwLDE0IEBACiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChzdHJlYW1faWQgPT0gMHhiZSkgeyAgLy8gcGFkZGluZ19zdHJlYW0KLSAgICAgICAgQ0hFQ0tfTkUoUEVTX3BhY2tldF9sZW5ndGgsIDB1KTsKKyAgICAgICAgaWYgKFBFU19wYWNrZXRfbGVuZ3RoID09IDB1KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CiAgICAgICAgIGJyLnNraXBCaXRzKFBFU19wYWNrZXRfbGVuZ3RoICogOCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQ0hFQ0tfTkUoUEVTX3BhY2tldF9sZW5ndGgsIDB1KTsKKyAgICAgICAgaWYgKFBFU19wYWNrZXRfbGVuZ3RoID09IDB1KSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CiAgICAgICAgIGJyLnNraXBCaXRzKFBFU19wYWNrZXRfbGVuZ3RoICogOCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9NUEVHMlRTRXh0cmFjdG9yLmNwcAppbmRleCA3NGNiNWQ4Li5jYmU5NjczIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL01QRUcyVFNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvTVBFRzJUU0V4dHJhY3Rvci5jcHAKQEAgLTE2LDE3ICsxNiwyMiBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk1QRUcyVFNFeHRyYWN0b3IiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiaW5jbHVkZS9NUEVHMlRTRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKIAorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL0lTdHJlYW1Tb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKICNpbmNsdWRlICJBbm90aGVyUGFja2V0U291cmNlLmgiCkBAIC00MCw3ICs0NSw3IEBACiAgICAgTVBFRzJUU1NvdXJjZSgKICAgICAgICAgICAgIGNvbnN0IHNwPE1QRUcyVFNFeHRyYWN0b3I+ICZleHRyYWN0b3IsCiAgICAgICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCwKLSAgICAgICAgICAgIGJvb2wgc2Vla2FibGUpOworICAgICAgICAgICAgYm9vbCBkb2VzU2Vlayk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhICpwYXJhbXMgPSBOVUxMKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKQEAgLTU0LDggKzU5LDggQEAKICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtSW1wbDsKIAogICAgIC8vIElmIHRoZXJlIGFyZSBib3RoIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW1zLCBvbmx5IHRoZSB2aWRlbyBzdHJlYW0KLSAgICAvLyB3aWxsIGJlIHNlZWthYmxlLCBvdGhlcndpc2UgdGhlIHNpbmdsZSBzdHJlYW0gd2lsbCBiZSBzZWVrYWJsZS4KLSAgICBib29sIG1TZWVrYWJsZTsKKyAgICAvLyB3aWxsIHNpZ25hbCBzZWVrIG9uIHRoZSBleHRyYWN0b3I7IG90aGVyd2lzZSB0aGUgc2luZ2xlIHN0cmVhbSB3aWxsIHNlZWsuCisgICAgYm9vbCBtRG9lc1NlZWs7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNUEVHMlRTU291cmNlKTsKIH07CkBAIC02MywxMCArNjgsMTAgQEAKIE1QRUcyVFNTb3VyY2U6Ok1QRUcyVFNTb3VyY2UoCiAgICAgICAgIGNvbnN0IHNwPE1QRUcyVFNFeHRyYWN0b3I+ICZleHRyYWN0b3IsCiAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsLAotICAgICAgICBib29sIHNlZWthYmxlKQorICAgICAgICBib29sIGRvZXNTZWVrKQogICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLAogICAgICAgbUltcGwoaW1wbCksCi0gICAgICBtU2Vla2FibGUoc2Vla2FibGUpIHsKKyAgICAgIG1Eb2VzU2Vlayhkb2VzU2VlaykgewogfQogCiBzdGF0dXNfdCBNUEVHMlRTU291cmNlOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CkBAIC04NSwyNyArOTAsMTggQEAKICAgICAgICAgTWVkaWFCdWZmZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKLSAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKLSAgICB3aGlsZSAoIW1JbXBsLT5oYXNCdWZmZXJBdmFpbGFibGUoJmZpbmFsUmVzdWx0KSkgewotICAgICAgICBpZiAoZmluYWxSZXN1bHQgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+ZmVlZE1vcmUoKTsKKyAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIHNlZWtNb2RlOworICAgIGlmIChtRG9lc1NlZWsgJiYgb3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZzZWVrTW9kZSkpIHsKKyAgICAgICAgLy8gc2VlayBpcyBuZWVkZWQKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+c2VlayhzZWVrVGltZVVzLCBzZWVrTW9kZSk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIG1JbXBsLT5zaWduYWxFT1MoZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIHNlZWtNb2RlOwotICAgIGlmIChtU2Vla2FibGUgJiYgb3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZzZWVrTW9kZSkpIHsKLSAgICAgICAgLy8gQSBzZWVrIHdhcyByZXF1ZXN0ZWQsIGJ1dCB3ZSBkb24ndCBhY3R1YWxseSBzdXBwb3J0IHNlZWtpbmcgYW5kIHNvIGNhbiBvbmx5ICJzZWVrIiB0bwotICAgICAgICAvLyB0aGUgY3VycmVudCBwb3NpdGlvbgotICAgICAgICBpbnQ2NF90IG5leHRCdWZUaW1lVXM7Ci0gICAgICAgIGlmIChtSW1wbC0+bmV4dEJ1ZmZlclRpbWUoJm5leHRCdWZUaW1lVXMpICE9IE9LIHx8IHNlZWtUaW1lVXMgIT0gbmV4dEJ1ZlRpbWVVcykgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgICAgICB9CisgICAgaWYgKG1FeHRyYWN0b3ItPmZlZWRVbnRpbEJ1ZmZlckF2YWlsYWJsZShtSW1wbCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCiAgICAgcmV0dXJuIG1JbXBsLT5yZWFkKG91dCwgb3B0aW9ucyk7CkBAIC0xMjksMjAgKzEyNSwxMCBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBib29sIHNlZWthYmxlID0gdHJ1ZTsKLSAgICBpZiAobVNvdXJjZUltcGxzLnNpemUoKSA+IDEpIHsKLSAgICAgICAgQ0hFQ0tfRVEobVNvdXJjZUltcGxzLnNpemUoKSwgMnUpOwotCi0gICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVNvdXJjZUltcGxzLmVkaXRJdGVtQXQoaW5kZXgpLT5nZXRGb3JtYXQoKTsKLSAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotCi0gICAgICAgIGlmICghc3RybmNhc2VjbXAoImF1ZGlvLyIsIG1pbWUsIDYpKSB7Ci0gICAgICAgICAgICBzZWVrYWJsZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ldyBNUEVHMlRTU291cmNlKHRoaXMsIG1Tb3VyY2VJbXBscy5lZGl0SXRlbUF0KGluZGV4KSwgc2Vla2FibGUpOworICAgIC8vIFRoZSBzZWVrIHJlZmVyZW5jZSB0cmFjayAodmlkZW8gaWYgcHJlc2VudDsgYXVkaW8gb3RoZXJ3aXNlKSBwZXJmb3JtcworICAgIC8vIHNlZWsgcmVxdWVzdHMsIHdoaWxlIG90aGVyIHRyYWNrcyBpZ25vcmUgcmVxdWVzdHMuCisgICAgcmV0dXJuIG5ldyBNUEVHMlRTU291cmNlKHRoaXMsIG1Tb3VyY2VJbXBscy5lZGl0SXRlbUF0KGluZGV4KSwKKyAgICAgICAgICAgIChtU2Vla1N5bmNQb2ludHMgPT0gJm1TeW5jUG9pbnRzLmVkaXRJdGVtQXQoaW5kZXgpKSk7CiB9CiAKIHNwPE1ldGFEYXRhPiBNUEVHMlRTRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKApAQCAtMTYxLDcgKzE0Nyw3IEBACiB2b2lkIE1QRUcyVFNFeHRyYWN0b3I6OmluaXQoKSB7CiAgICAgYm9vbCBoYXZlQXVkaW8gPSBmYWxzZTsKICAgICBib29sIGhhdmVWaWRlbyA9IGZhbHNlOwotICAgIGludCBudW1QYWNrZXRzUGFyc2VkID0gMDsKKyAgICBpbnQ2NF90IHN0YXJ0VGltZSA9IEFMb29wZXI6OkdldE5vd1VzKCk7CiAKICAgICB3aGlsZSAoZmVlZE1vcmUoKSA9PSBPSykgewogICAgICAgICBpZiAoaGF2ZUF1ZGlvICYmIGhhdmVWaWRlbykgewpAQCAtMTc1LDYgKzE2MSw4IEBACiAgICAgICAgICAgICBpZiAoaW1wbCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaGF2ZVZpZGVvID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBtU291cmNlSW1wbHMucHVzaChpbXBsKTsKKyAgICAgICAgICAgICAgICBtU3luY1BvaW50cy5wdXNoKCk7CisgICAgICAgICAgICAgICAgbVNlZWtTeW5jUG9pbnRzID0gJm1TeW5jUG9pbnRzLmVkaXRUb3AoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xODYsMTUgKzE3NCw3NSBAQAogICAgICAgICAgICAgaWYgKGltcGwgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGhhdmVBdWRpbyA9IHRydWU7CiAgICAgICAgICAgICAgICAgbVNvdXJjZUltcGxzLnB1c2goaW1wbCk7CisgICAgICAgICAgICAgICAgbVN5bmNQb2ludHMucHVzaCgpOworICAgICAgICAgICAgICAgIGlmICghaGF2ZVZpZGVvKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZWVrU3luY1BvaW50cyA9ICZtU3luY1BvaW50cy5lZGl0VG9wKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCsrbnVtUGFja2V0c1BhcnNlZCA+IDEwMDAwKSB7CisgICAgICAgIC8vIFdhaXQgb25seSBmb3IgMiBzZWNvbmRzIHRvIGRldGVjdCBhdWRpby92aWRlbyBzdHJlYW1zLgorICAgICAgICBpZiAoQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZSA+IDIwMDAwMDBsbCkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HSSgiaGF2ZUF1ZGlvPSVkLCBoYXZlVmlkZW89JWQiLCBoYXZlQXVkaW8sIGhhdmVWaWRlbyk7CisgICAgb2ZmNjRfdCBzaXplOworICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgPT0gT0sgJiYgKGhhdmVBdWRpbyB8fCBoYXZlVmlkZW8pKSB7CisgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGltcGwgPSBoYXZlVmlkZW8KKyAgICAgICAgICAgICAgICA/IChBbm90aGVyUGFja2V0U291cmNlICopbVBhcnNlci0+Z2V0U291cmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpWSURFTykuZ2V0KCkKKyAgICAgICAgICAgICAgICA6IChBbm90aGVyUGFja2V0U291cmNlICopbVBhcnNlci0+Z2V0U291cmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpBVURJTykuZ2V0KCk7CisgICAgICAgIHNpemVfdCBwcmV2U3luY1NpemUgPSAxOworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSAtMTsKKyAgICAgICAgTGlzdDxpbnQ2NF90PiBkdXJhdGlvbnM7CisgICAgICAgIC8vIEVzdGltYXRlIGR1cmF0aW9uIC0tLSBzdGFiaWxpemUgdW50aWwgeW91IGdldCA8NTAwbXMgZGV2aWF0aW9uLgorICAgICAgICB3aGlsZSAoZmVlZE1vcmUoKSA9PSBPSworICAgICAgICAgICAgICAgICYmIEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWUgPD0gMjAwMDAwMGxsKSB7CisgICAgICAgICAgICBpZiAobVNlZWtTeW5jUG9pbnRzLT5zaXplKCkgPiBwcmV2U3luY1NpemUpIHsKKyAgICAgICAgICAgICAgICBwcmV2U3luY1NpemUgPSBtU2Vla1N5bmNQb2ludHMtPnNpemUoKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGRpZmZVcyA9IG1TZWVrU3luY1BvaW50cy0+a2V5QXQocHJldlN5bmNTaXplIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0gbVNlZWtTeW5jUG9pbnRzLT5rZXlBdCgwKTsKKyAgICAgICAgICAgICAgICBvZmY2NF90IGRpZmZPZmZzZXQgPSBtU2Vla1N5bmNQb2ludHMtPnZhbHVlQXQocHJldlN5bmNTaXplIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0gbVNlZWtTeW5jUG9pbnRzLT52YWx1ZUF0KDApOworICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgPSBzaXplICogZGlmZlVzIC8gZGlmZk9mZnNldDsKKyAgICAgICAgICAgICAgICBkdXJhdGlvbnMucHVzaF9iYWNrKGR1cmF0aW9uVXMpOworICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvbnMuc2l6ZSgpID4gNSkgeworICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbnMuZXJhc2UoZHVyYXRpb25zLmJlZ2luKCkpOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1pbiA9ICpkdXJhdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBtYXggPSAqZHVyYXRpb25zLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoTGlzdDxpbnQ2NF90Pjo6aXRlcmF0b3IgaSA9IGR1cmF0aW9ucy5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgIT0gZHVyYXRpb25zLmVuZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbiA+ICppKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluID0gKmk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4IDwgKmkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggPSAqaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobWF4IC0gbWluIDwgNTAwICogMTAwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICBpbnQ2NF90IGJ1ZmZlcmVkRHVyYXRpb25VczsKKyAgICAgICAgYnVmZmVyZWREdXJhdGlvblVzID0gaW1wbC0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZlcnIpOworICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIGR1cmF0aW9uVXMgPSBidWZmZXJlZER1cmF0aW9uVXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGR1cmF0aW9uVXMgPiAwKSB7CisgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gbWV0YSA9IGltcGwtPmdldEZvcm1hdCgpOworICAgICAgICAgICAgbWV0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgIGltcGwtPnNldEZvcm1hdChtZXRhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dJKCJoYXZlQXVkaW89JWQsIGhhdmVWaWRlbz0lZCwgZWxhc3BlZFRpbWU9JSIgUFJJZDY0LAorICAgICAgICAgICAgaGF2ZUF1ZGlvLCBoYXZlVmlkZW8sIEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWUpOwogfQogCiBzdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpmZWVkTW9yZSgpIHsKQEAgLTIxMCwxMiArMjU4LDIwNiBAQAogICAgICAgICByZXR1cm4gKG4gPCAwKSA/IChzdGF0dXNfdCluIDogRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKKyAgICBBVFNQYXJzZXI6OlN5bmNFdmVudCBldmVudChtT2Zmc2V0KTsKICAgICBtT2Zmc2V0ICs9IG47Ci0gICAgcmV0dXJuIG1QYXJzZXItPmZlZWRUU1BhY2tldChwYWNrZXQsIGtUU1BhY2tldFNpemUpOworICAgIHN0YXR1c190IGVyciA9IG1QYXJzZXItPmZlZWRUU1BhY2tldChwYWNrZXQsIGtUU1BhY2tldFNpemUsICZldmVudCk7CisgICAgaWYgKGV2ZW50LmlzSW5pdCgpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZUltcGxzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAobVNvdXJjZUltcGxzW2ldLmdldCgpID09IGV2ZW50LmdldE1lZGlhU291cmNlKCkuZ2V0KCkpIHsKKyAgICAgICAgICAgICAgICBLZXllZFZlY3RvcjxpbnQ2NF90LCBvZmY2NF90PiAqc3luY1BvaW50cyA9ICZtU3luY1BvaW50cy5lZGl0SXRlbUF0KGkpOworICAgICAgICAgICAgICAgIHN5bmNQb2ludHMtPmFkZChldmVudC5nZXRUaW1lVXMoKSwgZXZlbnQuZ2V0T2Zmc2V0KCkpOworICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGtlZXBpbmcgdGhlIHNpemUgb2YgdGhlIHN5bmMgcG9pbnRzIGF0IG1vc3QgNW1iIHBlciBhIHRyYWNrLgorICAgICAgICAgICAgICAgIHNpemVfdCBzaXplID0gc3luY1BvaW50cy0+c2l6ZSgpOworICAgICAgICAgICAgICAgIGlmIChzaXplID49IDMyNzY4MCkgeworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGZpcnN0VGltZVVzID0gc3luY1BvaW50cy0+a2V5QXQoMCk7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbGFzdFRpbWVVcyA9IHN5bmNQb2ludHMtPmtleUF0KHNpemUgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmdldFRpbWVVcygpIC0gZmlyc3RUaW1lVXMgPiBsYXN0VGltZVVzIC0gZXZlbnQuZ2V0VGltZVVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNQb2ludHMtPnJlbW92ZUl0ZW1zQXQoMCwgNDA5Nik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jUG9pbnRzLT5yZW1vdmVJdGVtc0F0KHNpemUgLSA0MDk2LCA0MDk2KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOwogfQogCiB1aW50MzJfdCBNUEVHMlRTRXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKLSAgICByZXR1cm4gQ0FOX1BBVVNFOworICAgIHJldHVybiBDQU5fUEFVU0UgfCBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQ7Cit9CisKK3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OnNlZWsoaW50NjRfdCBzZWVrVGltZVVzLAorICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlICZzZWVrTW9kZSkgeworICAgIGlmIChtU2Vla1N5bmNQb2ludHMgPT0gTlVMTCB8fCBtU2Vla1N5bmNQb2ludHMtPmlzRW1wdHkoKSkgeworICAgICAgICBBTE9HVygiTm8gc3luYyBwb2ludCB0byBzZWVrIHRvLiIpOworICAgICAgICAvLyAuLi4gYW5kIHRoZXJlZm9yZSB3ZSBoYXZlIG5vdGhpbmcgdXNlZnVsIHRvIGRvIGhlcmUuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAvLyBEZXRlcm1pbmUgd2hldGhlciB3ZSdyZSBzZWVraW5nIGJleW9uZCB0aGUga25vd24gYXJlYS4KKyAgICBib29sIHNob3VsZFNlZWtCZXlvbmQgPQorICAgICAgICAgICAgKHNlZWtUaW1lVXMgPiBtU2Vla1N5bmNQb2ludHMtPmtleUF0KG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpIC0gMSkpOworCisgICAgLy8gRGV0ZXJtaW5lIHRoZSBzeW5jIHBvaW50IHRvIHNlZWsuCisgICAgc2l6ZV90IGluZGV4ID0gMDsKKyAgICBmb3IgKDsgaW5kZXggPCBtU2Vla1N5bmNQb2ludHMtPnNpemUoKTsgKytpbmRleCkgeworICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IG1TZWVrU3luY1BvaW50cy0+a2V5QXQoaW5kZXgpOworICAgICAgICBpZiAodGltZVVzID4gc2Vla1RpbWVVcykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKHNlZWtNb2RlKSB7CisgICAgICAgIGNhc2UgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQzoKKyAgICAgICAgICAgIGlmIChpbmRleCA9PSBtU2Vla1N5bmNQb2ludHMtPnNpemUoKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJOZXh0IHN5bmMgbm90IGZvdW5kOyBzdGFydGluZyBmcm9tIHRoZSBsYXRlc3Qgc3luYy4iKTsKKyAgICAgICAgICAgICAgICAtLWluZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzoKKyAgICAgICAgY2FzZSBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVDoKKyAgICAgICAgICAgIEFMT0dXKCJzZWVrTW9kZSBub3Qgc3VwcG9ydGVkOiAlZDsgZmFsbGluZyBiYWNrIHRvIFBSRVZJT1VTX1NZTkMiLAorICAgICAgICAgICAgICAgICAgICBzZWVrTW9kZSk7CisgICAgICAgICAgICAvLyBmYWxsLXRocm91Z2gKKyAgICAgICAgY2FzZSBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQzoKKyAgICAgICAgICAgIGlmIChpbmRleCA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIlByZXZpb3VzIHN5bmMgbm90IGZvdW5kOyBzdGFydGluZyBmcm9tIHRoZSBlYXJsaWVzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAic3luYy4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLS1pbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIXNob3VsZFNlZWtCZXlvbmQgfHwgbU9mZnNldCA8PSBtU2Vla1N5bmNQb2ludHMtPnZhbHVlQXQoaW5kZXgpKSB7CisgICAgICAgIGludDY0X3QgYWN0dWFsU2Vla1RpbWVVcyA9IG1TZWVrU3luY1BvaW50cy0+a2V5QXQoaW5kZXgpOworICAgICAgICBtT2Zmc2V0ID0gbVNlZWtTeW5jUG9pbnRzLT52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gcXVldWVEaXNjb250aW51aXR5Rm9yU2VlayhhY3R1YWxTZWVrVGltZVVzKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzaG91bGRTZWVrQmV5b25kKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IHNlZWtCZXlvbmQoc2Vla1RpbWVVcyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGYXN0LWZvcndhcmQgdG8gc3luYyBmcmFtZS4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VJbXBscy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCA9IG1Tb3VyY2VJbXBsc1tpXTsKKyAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICBmZWVkVW50aWxCdWZmZXJBdmFpbGFibGUoaW1wbCk7CisgICAgICAgIHdoaWxlIChpbXBsLT5oYXNCdWZmZXJBdmFpbGFibGUoJmVycikpIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtZXRhID0gaW1wbC0+Z2V0TWV0YUFmdGVyTGFzdERlcXVldWVkKDApOworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgICAgICAgICAgaWYgKG1ldGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50MzJfdCBzeW5jOworICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMigiaXNTeW5jIiwgJnN5bmMpICYmIHN5bmMpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IGltcGwtPmRlcXVldWVBY2Nlc3NVbml0KCZidWZmZXIpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmZWVkVW50aWxCdWZmZXJBdmFpbGFibGUoaW1wbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OnF1ZXVlRGlzY29udGludWl0eUZvclNlZWsoaW50NjRfdCBhY3R1YWxTZWVrVGltZVVzKSB7CisgICAgLy8gU2lnbmFsIGRpc2NvbnRpbnVpdHkKKyAgICBzcDxBTWVzc2FnZT4gZXh0cmEobmV3IEFNZXNzYWdlKTsKKyAgICBleHRyYS0+c2V0SW50NjQoSVN0cmVhbUxpc3RlbmVyOjprS2V5TWVkaWFUaW1lVXMsIGFjdHVhbFNlZWtUaW1lVXMpOworICAgIG1QYXJzZXItPnNpZ25hbERpc2NvbnRpbnVpdHkoQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1RJTUUsIGV4dHJhKTsKKworICAgIC8vIEFmdGVyIGRpc2NvbnRpbnVpdHksIGltcGwgc2hvdWxkIG9ubHkgaGF2ZSBkaXNjb250aW51aXRpZXMKKyAgICAvLyB3aXRoIHRoZSBsYXN0IGJlaW5nIHdoYXQgd2UgcXVldWVkLiBEZXF1ZXVlIHRoZW0gYWxsIGhlcmUuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU291cmNlSW1wbHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwgPSBtU291cmNlSW1wbHMuaXRlbUF0KGkpOworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgd2hpbGUgKGltcGwtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZXJyKSkgeworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnIgPSBpbXBsLT5kZXF1ZXVlQWNjZXNzVW5pdCgmYnVmZmVyKTsKKyAgICAgICAgICAgIC8vIElmIHRoZSBzb3VyY2UgY29udGFpbnMgYW55dGhpbmcgYnV0IGRpc2NvbnRpbnVpdHksIHRoYXQncworICAgICAgICAgICAgLy8gYSBwcm9ncmFtbWluZyBtaXN0YWtlLgorICAgICAgICAgICAgQ0hFQ0soZXJyID09IElORk9fRElTQ09OVElOVUlUWSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGZWVkIHVudGlsIHdlIGhhdmUgYSBidWZmZXIgZm9yIGVhY2ggc291cmNlLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZUltcGxzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsID0gbVNvdXJjZUltcGxzLml0ZW1BdChpKTsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBmZWVkVW50aWxCdWZmZXJBdmFpbGFibGUoaW1wbCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OnNlZWtCZXlvbmQoaW50NjRfdCBzZWVrVGltZVVzKSB7CisgICAgLy8gSWYgd2UncmUgc2Vla2luZyBiZXlvbmQgd2hlcmUgd2Uga25vdyAtLS0gcmVhZCB1bnRpbCB3ZSByZWFjaCB0aGVyZS4KKyAgICBzaXplX3Qgc3luY1BvaW50c1NpemUgPSBtU2Vla1N5bmNQb2ludHMtPnNpemUoKTsKKworICAgIHdoaWxlIChzZWVrVGltZVVzID4gbVNlZWtTeW5jUG9pbnRzLT5rZXlBdCgKKyAgICAgICAgICAgIG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpIC0gMSkpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICBpZiAoc3luY1BvaW50c1NpemUgPCBtU2Vla1N5bmNQb2ludHMtPnNpemUoKSkgeworICAgICAgICAgICAgc3luY1BvaW50c1NpemUgPSBtU2Vla1N5bmNQb2ludHMtPnNpemUoKTsKKyAgICAgICAgICAgIGludDY0X3Qgc3luY1RpbWVVcyA9IG1TZWVrU3luY1BvaW50cy0+a2V5QXQoc3luY1BvaW50c1NpemUgLSAxKTsKKyAgICAgICAgICAgIC8vIERlcXVldWUgYnVmZmVycyBiZWZvcmUgc3luYyBwb2ludCBpbiBvcmRlciB0byBhdm9pZCB0b28gbXVjaAorICAgICAgICAgICAgLy8gY2FjaGUgYnVpbGRpbmcgdXAuCisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VJbXBscy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsID0gbVNvdXJjZUltcGxzW2ldOworICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgICAgIHdoaWxlICgoZXJyID0gaW1wbC0+bmV4dEJ1ZmZlclRpbWUoJnRpbWVVcykpID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPCBzeW5jVGltZVVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbXBsLT5kZXF1ZXVlQWNjZXNzVW5pdCgmYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IC1FV09VTERCTE9DSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZmVlZE1vcmUoKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OmZlZWRVbnRpbEJ1ZmZlckF2YWlsYWJsZSgKKyAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwpIHsKKyAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKKyAgICB3aGlsZSAoIWltcGwtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CisgICAgICAgIGlmIChmaW5hbFJlc3VsdCAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGZpbmFsUmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gZmVlZE1vcmUoKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgaW1wbC0+c2lnbmFsRU9TKGVycik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5tawppbmRleCBhYWE4MzM0Li41ZjBmNTY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQW5kcm9pZC5tawpAQCAtMSwxMSArMSw4IEBACiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCi1pZmVxICgkKFRBUkdFVF9ERVZJQ0UpLCBtYW50YSkKLSAgICBMT0NBTF9DRkxBR1MgKz0gLURTVVJGQUNFX0lTX0JHUjMyCi1lbmRpZgotCiBMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRnJhbWVEcm9wcGVyLmNwcCAgICAgICAgICAgICAgXAogICAgICAgICBHcmFwaGljQnVmZmVyU291cmNlLmNwcCAgICAgICBcCiAgICAgICAgIE9NWC5jcHAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgT01YTWFzdGVyLmNwcCAgICAgICAgICAgICAgICAgXApAQCAtMzQsNiArMzEsOCBAQAogICAgICAgICBsaWJkbAogCiBMT0NBTF9NT0RVTEU6PSBsaWJzdGFnZWZyaWdodF9vbXgKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQ5NTJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5jcHAKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRnJhbWVEcm9wcGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRnJhbWVEcm9wcGVyLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhKaXR0ZXJVcyA9IDIwMDA7CisKK0ZyYW1lRHJvcHBlcjo6RnJhbWVEcm9wcGVyKCkKKyAgICA6IG1EZXNpcmVkTWluVGltZVVzKC0xKSwKKyAgICAgIG1NaW5JbnRlcnZhbFVzKDApIHsKK30KKworRnJhbWVEcm9wcGVyOjp+RnJhbWVEcm9wcGVyKCkgeworfQorCitzdGF0dXNfdCBGcmFtZURyb3BwZXI6OnNldE1heEZyYW1lUmF0ZShmbG9hdCBtYXhGcmFtZVJhdGUpIHsKKyAgICBpZiAobWF4RnJhbWVSYXRlIDw9IDApIHsKKyAgICAgICAgQUxPR0UoImZyYW1lcmF0ZSBzaG91bGQgYmUgcG9zaXRpdmUgYnV0IGdvdCAlZi4iLCBtYXhGcmFtZVJhdGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBtTWluSW50ZXJ2YWxVcyA9IChpbnQ2NF90KSAoMTAwMDAwMC4wZiAvIG1heEZyYW1lUmF0ZSk7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIEZyYW1lRHJvcHBlcjo6c2hvdWxkRHJvcChpbnQ2NF90IHRpbWVVcykgeworICAgIGlmIChtTWluSW50ZXJ2YWxVcyA8PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobURlc2lyZWRNaW5UaW1lVXMgPCAwKSB7CisgICAgICAgIG1EZXNpcmVkTWluVGltZVVzID0gdGltZVVzICsgbU1pbkludGVydmFsVXM7CisgICAgICAgIEFMT0dWKCJmaXJzdCBmcmFtZSAlbGxkLCBuZXh0IGRlc2lyZWQgZnJhbWUgJWxsZCIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lVXMsIChsb25nIGxvbmcpbURlc2lyZWRNaW5UaW1lVXMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHRpbWVVcyA8IChtRGVzaXJlZE1pblRpbWVVcyAtIGtNYXhKaXR0ZXJVcykpIHsKKyAgICAgICAgQUxPR1YoImRyb3AgZnJhbWUgJWxsZCwgZGVzaXJlZCBmcmFtZSAlbGxkLCBkaWZmICVsbGQiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZVVzLCAobG9uZyBsb25nKW1EZXNpcmVkTWluVGltZVVzLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKG1EZXNpcmVkTWluVGltZVVzIC0gdGltZVVzKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGludDY0X3QgbiA9ICh0aW1lVXMgLSBtRGVzaXJlZE1pblRpbWVVcyArIGtNYXhKaXR0ZXJVcykgLyBtTWluSW50ZXJ2YWxVczsKKyAgICBtRGVzaXJlZE1pblRpbWVVcyArPSAobiArIDEpICogbU1pbkludGVydmFsVXM7CisgICAgQUxPR1YoImtlZXAgZnJhbWUgJWxsZCwgbmV4dCBkZXNpcmVkIGZyYW1lICVsbGQsIGRpZmYgJWxsZCIsCisgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVVcywgKGxvbmcgbG9uZyltRGVzaXJlZE1pblRpbWVVcywKKyAgICAgICAgICAgIChsb25nIGxvbmcpKG1EZXNpcmVkTWluVGltZVVzIC0gdGltZVVzKSk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0ZyYW1lRHJvcHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YTZkNGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvRnJhbWVEcm9wcGVyLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRlJBTUVfRFJPUFBFUl9IXworCisjZGVmaW5lIEZSQU1FX0RST1BQRVJfSF8KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgRnJhbWVEcm9wcGVyIDogcHVibGljIFJlZkJhc2UgeworICAgIC8vIE5vIGZyYW1lcyB3aWxsIGJlIGRyb3BwZWQgdW50aWwgYSB2YWxpZCBtYXggZnJhbWUgcmF0ZSBpcyBzZXQuCisgICAgRnJhbWVEcm9wcGVyKCk7CisKKyAgICAvLyBtYXhGcmFtZVJhdGUgcmVxdWlyZWQgdG8gYmUgcG9zaXRpdmUuCisgICAgc3RhdHVzX3Qgc2V0TWF4RnJhbWVSYXRlKGZsb2F0IG1heEZyYW1lUmF0ZSk7CisKKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1heCBmcmFtZSByYXRlIGhhcyBub3QgYmVlbiBzZXQgdmlhIHNldE1heEZyYW1lUmF0ZS4KKyAgICBib29sIHNob3VsZERyb3AoaW50NjRfdCB0aW1lVXMpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+RnJhbWVEcm9wcGVyKCk7CisKK3ByaXZhdGU6CisgICAgaW50NjRfdCBtRGVzaXJlZE1pblRpbWVVczsKKyAgICBpbnQ2NF90IG1NaW5JbnRlcnZhbFVzOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRnJhbWVEcm9wcGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gRlJBTUVfRFJPUFBFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCmluZGV4IDI5NDU2NDQuLjFhN2RjOWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKQEAgLTIzLDI4ICsyMywxMDQgQEAKICNpbmNsdWRlICJHcmFwaGljQnVmZmVyU291cmNlLmgiCiAKICNpbmNsdWRlIDxPTVhfQ29yZS5oPgorI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgogI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtLmg+CisjaW5jbHVkZSA8SGFyZHdhcmVBUEkuaD4KIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSAiRnJhbWVEcm9wcGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGNvbnN0IGJvb2wgRVhUUkFfQ0hFQ0sgPSB0cnVlOwogCitHcmFwaGljQnVmZmVyU291cmNlOjpQZXJzaXN0ZW50UHJveHlMaXN0ZW5lcjo6UGVyc2lzdGVudFByb3h5TGlzdGVuZXIoCisgICAgICAgIGNvbnN0IHdwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICZjb25zdW1lciwKKyAgICAgICAgY29uc3Qgd3A8Q29uc3VtZXJMaXN0ZW5lcj4mIGNvbnN1bWVyTGlzdGVuZXIpIDoKKyAgICBtQ29uc3VtZXJMaXN0ZW5lcihjb25zdW1lckxpc3RlbmVyKSwKKyAgICBtQ29uc3VtZXIoY29uc3VtZXIpIHt9CiAKLUdyYXBoaWNCdWZmZXJTb3VyY2U6OkdyYXBoaWNCdWZmZXJTb3VyY2UoT01YTm9kZUluc3RhbmNlKiBub2RlSW5zdGFuY2UsCi0gICAgICAgIHVpbnQzMl90IGJ1ZmZlcldpZHRoLCB1aW50MzJfdCBidWZmZXJIZWlnaHQsIHVpbnQzMl90IGJ1ZmZlckNvdW50LAotICAgICAgICBib29sIHVzZUdyYXBoaWNCdWZmZXJJbk1ldGEpIDoKK0dyYXBoaWNCdWZmZXJTb3VyY2U6OlBlcnNpc3RlbnRQcm94eUxpc3RlbmVyOjp+UGVyc2lzdGVudFByb3h5TGlzdGVuZXIoKSB7fQorCit2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6OlBlcnNpc3RlbnRQcm94eUxpc3RlbmVyOjpvbkZyYW1lQXZhaWxhYmxlKAorICAgICAgICBjb25zdCBCdWZmZXJJdGVtJiBpdGVtKSB7CisgICAgc3A8Q29uc3VtZXJMaXN0ZW5lcj4gbGlzdGVuZXIobUNvbnN1bWVyTGlzdGVuZXIucHJvbW90ZSgpKTsKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBsaXN0ZW5lci0+b25GcmFtZUF2YWlsYWJsZShpdGVtKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcihtQ29uc3VtZXIucHJvbW90ZSgpKTsKKyAgICAgICAgaWYgKGNvbnN1bWVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBCdWZmZXJJdGVtIGJpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb25zdW1lci0+YWNxdWlyZUJ1ZmZlcigmYmksIDApOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiUGVyc2lzdGVudFByb3h5TGlzdGVuZXI6IGFjcXVpcmVCdWZmZXIgZmFpbGVkICglZCkiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gY29uc3VtZXItPmRldGFjaEJ1ZmZlcihiaS5tQnVmKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIlBlcnNpc3RlbnRQcm94eUxpc3RlbmVyOiBkZXRhY2hCdWZmZXIgZmFpbGVkICglZCkiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gY29uc3VtZXItPmF0dGFjaEJ1ZmZlcigmYmkubUJ1ZiwgYmkubUdyYXBoaWNCdWZmZXIpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiUGVyc2lzdGVudFByb3h5TGlzdGVuZXI6IGF0dGFjaEJ1ZmZlciBmYWlsZWQgKCVkKSIsIGVycik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBjb25zdW1lci0+cmVsZWFzZUJ1ZmZlcihiaS5tQnVmLCAwLAorICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1lOQ19LSFIsIGJpLm1GZW5jZSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJQZXJzaXN0ZW50UHJveHlMaXN0ZW5lcjogcmVsZWFzZUJ1ZmZlciBmYWlsZWQgKCVkKSIsIGVycik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6UGVyc2lzdGVudFByb3h5TGlzdGVuZXI6Om9uRnJhbWVSZXBsYWNlZCgKKyAgICAgICAgY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgeworICAgIHNwPENvbnN1bWVyTGlzdGVuZXI+IGxpc3RlbmVyKG1Db25zdW1lckxpc3RlbmVyLnByb21vdGUoKSk7CisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgbGlzdGVuZXItPm9uRnJhbWVSZXBsYWNlZChpdGVtKTsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY0J1ZmZlclNvdXJjZTo6UGVyc2lzdGVudFByb3h5TGlzdGVuZXI6Om9uQnVmZmVyc1JlbGVhc2VkKCkgeworICAgIHNwPENvbnN1bWVyTGlzdGVuZXI+IGxpc3RlbmVyKG1Db25zdW1lckxpc3RlbmVyLnByb21vdGUoKSk7CisgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgbGlzdGVuZXItPm9uQnVmZmVyc1JlbGVhc2VkKCk7CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6OlBlcnNpc3RlbnRQcm94eUxpc3RlbmVyOjpvblNpZGViYW5kU3RyZWFtQ2hhbmdlZCgpIHsKKyAgICBzcDxDb25zdW1lckxpc3RlbmVyPiBsaXN0ZW5lcihtQ29uc3VtZXJMaXN0ZW5lci5wcm9tb3RlKCkpOworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIGxpc3RlbmVyLT5vblNpZGViYW5kU3RyZWFtQ2hhbmdlZCgpOworICAgIH0KK30KKworR3JhcGhpY0J1ZmZlclNvdXJjZTo6R3JhcGhpY0J1ZmZlclNvdXJjZSgKKyAgICAgICAgT01YTm9kZUluc3RhbmNlKiBub2RlSW5zdGFuY2UsCisgICAgICAgIHVpbnQzMl90IGJ1ZmZlcldpZHRoLAorICAgICAgICB1aW50MzJfdCBidWZmZXJIZWlnaHQsCisgICAgICAgIHVpbnQzMl90IGJ1ZmZlckNvdW50LAorICAgICAgICB1aW50MzJfdCBjb25zdW1lclVzYWdlLAorICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAmY29uc3VtZXIpIDoKICAgICBtSW5pdENoZWNrKFVOS05PV05fRVJST1IpLAogICAgIG1Ob2RlSW5zdGFuY2Uobm9kZUluc3RhbmNlKSwKICAgICBtRXhlY3V0aW5nKGZhbHNlKSwKICAgICBtU3VzcGVuZGVkKGZhbHNlKSwKKyAgICBtSXNQZXJzaXN0ZW50KGZhbHNlKSwKKyAgICBtQ29uc3VtZXIoY29uc3VtZXIpLAogICAgIG1OdW1GcmFtZXNBdmFpbGFibGUoMCksCisgICAgbU51bUJ1ZmZlckFjcXVpcmVkKDApLAogICAgIG1FbmRPZlN0cmVhbShmYWxzZSksCiAgICAgbUVuZE9mU3RyZWFtU2VudChmYWxzZSksCiAgICAgbU1heFRpbWVzdGFtcEdhcFVzKC0xbGwpLApAQCAtNTQsMTUgKzEzMCwxNSBAQAogICAgIG1SZXBlYXRBZnRlclVzKC0xbGwpLAogICAgIG1SZXBlYXRMYXN0RnJhbWVHZW5lcmF0aW9uKDApLAogICAgIG1SZXBlYXRMYXN0RnJhbWVUaW1lc3RhbXAoLTFsbCksCi0gICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlcklkKC0xKSwKLSAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVyRnJhbWVOdW0oMCksCi0gICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlclVzZUNvdW50KDApLAorICAgIG1MYXRlc3RCdWZmZXJJZCgtMSksCisgICAgbUxhdGVzdEJ1ZmZlckZyYW1lTnVtKDApLAorICAgIG1MYXRlc3RCdWZmZXJVc2VDb3VudCgwKSwKKyAgICBtTGF0ZXN0QnVmZmVyRmVuY2UoRmVuY2U6Ok5PX0ZFTkNFKSwKICAgICBtUmVwZWF0QnVmZmVyRGVmZXJyZWQoZmFsc2UpLAogICAgIG1UaW1lUGVyQ2FwdHVyZVVzKC0xbGwpLAogICAgIG1UaW1lUGVyRnJhbWVVcygtMWxsKSwKICAgICBtUHJldkNhcHR1cmVVcygtMWxsKSwKLSAgICBtUHJldkZyYW1lVXMoLTFsbCksCi0gICAgbVVzZUdyYXBoaWNCdWZmZXJJbk1ldGEodXNlR3JhcGhpY0J1ZmZlckluTWV0YSkgeworICAgIG1QcmV2RnJhbWVVcygtMWxsKSB7CiAKICAgICBBTE9HVigiR3JhcGhpY0J1ZmZlclNvdXJjZSB3PSV1IGg9JXUgYz0ldSIsCiAgICAgICAgICAgICBidWZmZXJXaWR0aCwgYnVmZmVySGVpZ2h0LCBidWZmZXJDb3VudCk7CkBAIC03MywyNiArMTQ5LDM4IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBTdHJpbmc4IG5hbWUoIkdyYXBoaWNCdWZmZXJTb3VyY2UiKTsKKyAgICBpZiAobUNvbnN1bWVyID09IE5VTEwpIHsKKyAgICAgICAgU3RyaW5nOCBuYW1lKCJHcmFwaGljQnVmZmVyU291cmNlIik7CiAKLSAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJm1Qcm9kdWNlciwgJm1Db25zdW1lcik7Ci0gICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lck5hbWUobmFtZSk7Ci0gICAgbUNvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyU2l6ZShidWZmZXJXaWR0aCwgYnVmZmVySGVpZ2h0KTsKLSAgICBtQ29uc3VtZXItPnNldENvbnN1bWVyVXNhZ2VCaXRzKEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUik7CisgICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmbVByb2R1Y2VyLCAmbUNvbnN1bWVyKTsKKyAgICAgICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lck5hbWUobmFtZSk7CiAKLSAgICBtSW5pdENoZWNrID0gbUNvbnN1bWVyLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KTsKLSAgICBpZiAobUluaXRDaGVjayAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBCUSBtYXggYWNxdWlyZWQgYnVmZmVyIGNvdW50IHRvICV1OiAlZCIsCi0gICAgICAgICAgICAgICAgYnVmZmVyQ291bnQsIG1Jbml0Q2hlY2spOwotICAgICAgICByZXR1cm47CisgICAgICAgIC8vIHVzZSBjb25zdW1lciB1c2FnZSBiaXRzIHF1ZXJpZWQgZnJvbSBlbmNvZGVyLCBidXQgYWx3YXlzIGFkZCBIV19WSURFT19FTkNPREVSCisgICAgICAgIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICAgICAgICBjb25zdW1lclVzYWdlIHw9IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUjsKKyAgICAgICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lclVzYWdlQml0cyhjb25zdW1lclVzYWdlKTsKKworICAgICAgICBtSW5pdENoZWNrID0gbUNvbnN1bWVyLT5zZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50KGJ1ZmZlckNvdW50KTsKKyAgICAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IEJRIG1heCBhY3F1aXJlZCBidWZmZXIgY291bnQgdG8gJXU6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyQ291bnQsIG1Jbml0Q2hlY2spOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUlzUGVyc2lzdGVudCA9IHRydWU7CiAgICAgfQotCisgICAgbUNvbnN1bWVyLT5zZXREZWZhdWx0QnVmZmVyU2l6ZShidWZmZXJXaWR0aCwgYnVmZmVySGVpZ2h0KTsKICAgICAvLyBOb3RlIHRoYXQgd2UgY2FuJ3QgY3JlYXRlIGFuIHNwPC4uLj4odGhpcykgaW4gYSBjdG9yIHRoYXQgd2lsbCBub3Qga2VlcCBhCiAgICAgLy8gcmVmZXJlbmNlIG9uY2UgdGhlIGN0b3IgZW5kcywgYXMgdGhhdCB3b3VsZCBjYXVzZSB0aGUgcmVmY291bnQgb2YgJ3RoaXMnCiAgICAgLy8gZHJvcHBpbmcgdG8gMCBhdCB0aGUgZW5kIG9mIHRoZSBjdG9yLiAgU2luY2UgYWxsIHdlIG5lZWQgaXMgYSB3cDwuLi4+CiAgICAgLy8gdGhhdCdzIHdoYXQgd2UgY3JlYXRlLgogICAgIHdwPEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyKj4odGhpcyk7Ci0gICAgc3A8QnVmZmVyUXVldWU6OlByb3h5Q29uc3VtZXJMaXN0ZW5lcj4gcHJveHkgPSBuZXcgQnVmZmVyUXVldWU6OlByb3h5Q29uc3VtZXJMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgc3A8SUNvbnN1bWVyTGlzdGVuZXI+IHByb3h5OworICAgIGlmICghbUlzUGVyc2lzdGVudCkgeworICAgICAgICBwcm94eSA9IG5ldyBCdWZmZXJRdWV1ZTo6UHJveHlDb25zdW1lckxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcm94eSA9IG5ldyBQZXJzaXN0ZW50UHJveHlMaXN0ZW5lcihtQ29uc3VtZXIsIGxpc3RlbmVyKTsKKyAgICB9CiAKICAgICBtSW5pdENoZWNrID0gbUNvbnN1bWVyLT5jb25zdW1lckNvbm5lY3QocHJveHksIGZhbHNlKTsKICAgICBpZiAobUluaXRDaGVjayAhPSBOT19FUlJPUikgewpAQCAtMTA1LDggKzE5MywxNSBAQAogfQogCiBHcmFwaGljQnVmZmVyU291cmNlOjp+R3JhcGhpY0J1ZmZlclNvdXJjZSgpIHsKLSAgICBBTE9HVigifkdyYXBoaWNCdWZmZXJTb3VyY2UiKTsKLSAgICBpZiAobUNvbnN1bWVyICE9IE5VTEwpIHsKKyAgICBpZiAobUxhdGVzdEJ1ZmZlcklkID49IDApIHsKKyAgICAgICAgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICBtTGF0ZXN0QnVmZmVySWQsIG1MYXRlc3RCdWZmZXJGcmFtZU51bSwKKyAgICAgICAgICAgICAgICBtQnVmZmVyU2xvdFttTGF0ZXN0QnVmZmVySWRdLCBtTGF0ZXN0QnVmZmVyRmVuY2UpOworICAgIH0KKyAgICBpZiAobU51bUJ1ZmZlckFjcXVpcmVkICE9IDApIHsKKyAgICAgICAgQUxPR1coInBvdGVudGlhbCBidWZmZXIgbGVhayAoYWNxdWlyZWQgJWQpIiwgbU51bUJ1ZmZlckFjcXVpcmVkKTsKKyAgICB9CisgICAgaWYgKG1Db25zdW1lciAhPSBOVUxMICYmICFtSXNQZXJzaXN0ZW50KSB7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG1Db25zdW1lci0+Y29uc3VtZXJEaXNjb25uZWN0KCk7CiAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIEFMT0dXKCJjb25zdW1lckRpc2Nvbm5lY3QgZmFpbGVkOiAlZCIsIGVycik7CkBAIC0xNTMsOSArMjQ4LDkgQEAKICAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3IpOwogICAgICAgICBtTG9vcGVyLT5zdGFydCgpOwogCi0gICAgICAgIGlmIChtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQgPj0gMCkgeworICAgICAgICBpZiAobUxhdGVzdEJ1ZmZlcklkID49IDApIHsKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPQotICAgICAgICAgICAgICAgIG5ldyBBTWVzc2FnZShrV2hhdFJlcGVhdExhc3RGcmFtZSwgbVJlZmxlY3Rvci0+aWQoKSk7CisgICAgICAgICAgICAgICAgbmV3IEFNZXNzYWdlKGtXaGF0UmVwZWF0TGFzdEZyYW1lLCBtUmVmbGVjdG9yKTsKIAogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsICsrbVJlcGVhdExhc3RGcmFtZUdlbmVyYXRpb24pOwogICAgICAgICAgICAgbXNnLT5wb3N0KG1SZXBlYXRBZnRlclVzKTsKQEAgLTIxOCw5ICszMTMsOCBAQAogICAgIG1Db2RlY0J1ZmZlcnMuYWRkKGNvZGVjQnVmZmVyKTsKIH0KIAotdm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpjb2RlY0J1ZmZlckVtcHRpZWQoT01YX0JVRkZFUkhFQURFUlRZUEUqIGhlYWRlcikgewordm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpjb2RlY0J1ZmZlckVtcHRpZWQoT01YX0JVRkZFUkhFQURFUlRZUEUqIGhlYWRlciwgaW50IGZlbmNlRmQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKLQogICAgIGlmICghbUV4ZWN1dGluZykgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMjI5LDYgKzMyMyw5IEBACiAgICAgaWYgKGNiaSA8IDApIHsKICAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLgogICAgICAgICBBTE9HRSgiY29kZWNCdWZmZXJFbXB0aWVkOiBidWZmZXIgbm90IHJlY29nbml6ZWQgKGg9JXApIiwgaGVhZGVyKTsKKyAgICAgICAgaWYgKGZlbmNlRmQgPj0gMCkgeworICAgICAgICAgICAgOjpjbG9zZShmZW5jZUZkKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0yNTAsMzAgKzM0NywzMyBAQAogICAgICAgICB9CiAgICAgICAgIC8vIE5vIEdyYXBoaWNCdWZmZXIgdG8gZGVhbCB3aXRoLCBubyBhZGRpdGlvbmFsIGlucHV0IG9yIG91dHB1dCBpcwogICAgICAgICAvLyBleHBlY3RlZCwgc28ganVzdCByZXR1cm4uCisgICAgICAgIGlmIChmZW5jZUZkID49IDApIHsKKyAgICAgICAgICAgIDo6Y2xvc2UoZmVuY2VGZCk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmIChFWFRSQV9DSEVDSykgeworICAgIGlmIChFWFRSQV9DSEVDSyAmJiBoZWFkZXItPm5BbGxvY0xlbiA+PSBzaXplb2YoTWV0YWRhdGFCdWZmZXJUeXBlKSkgewogICAgICAgICAvLyBQdWxsIHRoZSBncmFwaGljIGJ1ZmZlciBoYW5kbGUgYmFjayBvdXQgb2YgdGhlIGJ1ZmZlciwgYW5kIGNvbmZpcm0KICAgICAgICAgLy8gdGhhdCBpdCBtYXRjaGVzIGV4cGVjdGF0aW9ucy4KICAgICAgICAgT01YX1U4KiBkYXRhID0gaGVhZGVyLT5wQnVmZmVyOwogICAgICAgICBNZXRhZGF0YUJ1ZmZlclR5cGUgdHlwZSA9ICooTWV0YWRhdGFCdWZmZXJUeXBlICopZGF0YTsKLSAgICAgICAgaWYgKHR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpIHsKLSAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBidWZmZXJIYW5kbGU7Ci0gICAgICAgICAgICBtZW1jcHkoJmJ1ZmZlckhhbmRsZSwgZGF0YSArIDQsIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKTsKLSAgICAgICAgICAgIGlmIChidWZmZXJIYW5kbGUgIT0gY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXItPmhhbmRsZSkgeworICAgICAgICBpZiAodHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZQorICAgICAgICAgICAgICAgICYmIGhlYWRlci0+bkFsbG9jTGVuID49IHNpemVvZihWaWRlb0dyYWxsb2NNZXRhZGF0YSkpIHsKKyAgICAgICAgICAgIFZpZGVvR3JhbGxvY01ldGFkYXRhICZncmFsbG9jTWV0YSA9ICooVmlkZW9HcmFsbG9jTWV0YWRhdGEgKilkYXRhOworICAgICAgICAgICAgaWYgKGdyYWxsb2NNZXRhLnBIYW5kbGUgIT0gY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXItPmhhbmRsZSkgewogICAgICAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4KICAgICAgICAgICAgICAgICBBTE9HRSgiY29kZWNCdWZmZXJFbXB0aWVkOiBidWZmZXIncyBoYW5kbGUgaXMgJXAsIGV4cGVjdGVkICVwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckhhbmRsZSwgY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXItPmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBncmFsbG9jTWV0YS5wSGFuZGxlLCBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlKTsKICAgICAgICAgICAgICAgICBDSEVDSyghImNvZGVjQnVmZmVyRW1wdGllZDogbWlzbWF0Y2hlZCBidWZmZXIiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFwaGljQnVmZmVyKSB7Ci0gICAgICAgICAgICBHcmFwaGljQnVmZmVyICpidWZmZXI7Ci0gICAgICAgICAgICBtZW1jcHkoJmJ1ZmZlciwgZGF0YSArIDQsIHNpemVvZihidWZmZXIpKTsKLSAgICAgICAgICAgIGlmIChidWZmZXIgIT0gY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXIuZ2V0KCkpIHsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXIKKyAgICAgICAgICAgICAgICAmJiBoZWFkZXItPm5BbGxvY0xlbiA+PSBzaXplb2YoVmlkZW9OYXRpdmVNZXRhZGF0YSkpIHsKKyAgICAgICAgICAgIFZpZGVvTmF0aXZlTWV0YWRhdGEgJm5hdGl2ZU1ldGEgPSAqKFZpZGVvTmF0aXZlTWV0YWRhdGEgKilkYXRhOworICAgICAgICAgICAgaWYgKG5hdGl2ZU1ldGEucEJ1ZmZlciAhPSBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci0+Z2V0TmF0aXZlQnVmZmVyKCkpIHsKICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCiAgICAgICAgICAgICAgICAgQUxPR0UoImNvZGVjQnVmZmVyRW1wdGllZDogYnVmZmVyIGlzICVwLCBleHBlY3RlZCAlcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZU1ldGEucEJ1ZmZlciwgY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXItPmdldE5hdGl2ZUJ1ZmZlcigpKTsKICAgICAgICAgICAgICAgICBDSEVDSyghImNvZGVjQnVmZmVyRW1wdGllZDogbWlzbWF0Y2hlZCBidWZmZXIiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjgzLDIwICszODMsMjEgQEAKICAgICAvLyBJZiB3ZSBmaW5kIGEgbWF0Y2gsIHJlbGVhc2UgdGhhdCBzbG90LiAgSWYgd2UgZG9uJ3QsIHRoZSBCdWZmZXJRdWV1ZQogICAgIC8vIGhhcyBkcm9wcGVkIHRoYXQgR3JhcGhpY0J1ZmZlciwgYW5kIHRoZXJlJ3Mgbm90aGluZyBmb3IgdXMgdG8gcmVsZWFzZS4KICAgICBpbnQgaWQgPSBjb2RlY0J1ZmZlci5tQnVmOworICAgIHNwPEZlbmNlPiBmZW5jZSA9IG5ldyBGZW5jZShmZW5jZUZkKTsKICAgICBpZiAobUJ1ZmZlclNsb3RbaWRdICE9IE5VTEwgJiYKICAgICAgICAgbUJ1ZmZlclNsb3RbaWRdLT5oYW5kbGUgPT0gY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXItPmhhbmRsZSkgewogICAgICAgICBBTE9HVigiY2JpICVkIG1hdGNoZXMgYnEgc2xvdCAlZCwgaGFuZGxlPSVwIiwKICAgICAgICAgICAgICAgICBjYmksIGlkLCBtQnVmZmVyU2xvdFtpZF0tPmhhbmRsZSk7CiAKLSAgICAgICAgaWYgKGlkID09IG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZCkgewotICAgICAgICAgICAgQ0hFQ0tfR1QobUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlclVzZUNvdW50LS0sIDApOworICAgICAgICBpZiAoaWQgPT0gbUxhdGVzdEJ1ZmZlcklkKSB7CisgICAgICAgICAgICBDSEVDS19HVChtTGF0ZXN0QnVmZmVyVXNlQ291bnQtLSwgMCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoaWQsIGNvZGVjQnVmZmVyLm1GcmFtZU51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksIEVHTF9OT19TWU5DX0tIUiwgRmVuY2U6Ok5PX0ZFTkNFKTsKKyAgICAgICAgICAgIHJlbGVhc2VCdWZmZXIoaWQsIGNvZGVjQnVmZmVyLm1GcmFtZU51bWJlciwgbUJ1ZmZlclNsb3RbaWRdLCBmZW5jZSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiY29kZWNCdWZmZXJFbXB0aWVkOiBubyBtYXRjaCBmb3IgZW1wdGllZCBidWZmZXIgaW4gY2JpICVkIiwKICAgICAgICAgICAgICAgICBjYmkpOworICAgICAgICAvLyB3ZSB3aWxsIG5vdCByZXVzZSBjb2RlYyBidWZmZXIsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gd2FpdCBmb3IgZmVuY2UKICAgICB9CiAKICAgICAvLyBNYXJrIHRoZSBjb2RlYyBidWZmZXIgYXMgYXZhaWxhYmxlIGJ5IGNsZWFyaW5nIHRoZSBHcmFwaGljQnVmZmVyIHJlZi4KQEAgLTMxNCwxMSArNDE1LDExIEBACiAgICAgICAgIEFMT0dWKCJidWZmZXIgZnJlZWQsIEVPUyBwZW5kaW5nIik7CiAgICAgICAgIHN1Ym1pdEVuZE9mSW5wdXRTdHJlYW1fbCgpOwogICAgIH0gZWxzZSBpZiAobVJlcGVhdEJ1ZmZlckRlZmVycmVkKSB7Ci0gICAgICAgIGJvb2wgc3VjY2VzcyA9IHJlcGVhdExhdGVzdFN1Ym1pdHRlZEJ1ZmZlcl9sKCk7CisgICAgICAgIGJvb2wgc3VjY2VzcyA9IHJlcGVhdExhdGVzdEJ1ZmZlcl9sKCk7CiAgICAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgICAgICBBTE9HVigiZGVmZXJyZWQgcmVwZWF0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2wgU1VDQ0VTUyIpOworICAgICAgICAgICAgQUxPR1YoImRlZmVycmVkIHJlcGVhdExhdGVzdEJ1ZmZlcl9sIFNVQ0NFU1MiKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJkZWZlcnJlZCByZXBlYXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbCBGQUlMVVJFIik7CisgICAgICAgICAgICBBTE9HVigiZGVmZXJyZWQgcmVwZWF0TGF0ZXN0QnVmZmVyX2wgRkFJTFVSRSIpOwogICAgICAgICB9CiAgICAgICAgIG1SZXBlYXRCdWZmZXJEZWZlcnJlZCA9IGZhbHNlOwogICAgIH0KQEAgLTM3MiwxMCArNDczLDExIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICsrbU51bUJ1ZmZlckFjcXVpcmVkOwogICAgICAgICAgICAgLS1tTnVtRnJhbWVzQXZhaWxhYmxlOwogCi0gICAgICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoaXRlbS5tQnVmLCBpdGVtLm1GcmFtZU51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksIEVHTF9OT19TWU5DX0tIUiwgaXRlbS5tRmVuY2UpOworICAgICAgICAgICAgcmVsZWFzZUJ1ZmZlcihpdGVtLm1CdWYsIGl0ZW0ubUZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICBpdGVtLm1HcmFwaGljQnVmZmVyLCBpdGVtLm1GZW5jZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTM4MywxMiArNDg1LDEyIEBACiAgICAgbVN1c3BlbmRlZCA9IGZhbHNlOwogCiAgICAgaWYgKG1FeGVjdXRpbmcgJiYgbU51bUZyYW1lc0F2YWlsYWJsZSA9PSAwICYmIG1SZXBlYXRCdWZmZXJEZWZlcnJlZCkgewotICAgICAgICBpZiAocmVwZWF0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2woKSkgewotICAgICAgICAgICAgQUxPR1YoInN1c3BlbmQvZGVmZXJyZWQgcmVwZWF0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2wgU1VDQ0VTUyIpOworICAgICAgICBpZiAocmVwZWF0TGF0ZXN0QnVmZmVyX2woKSkgeworICAgICAgICAgICAgQUxPR1YoInN1c3BlbmQvZGVmZXJyZWQgcmVwZWF0TGF0ZXN0QnVmZmVyX2wgU1VDQ0VTUyIpOwogCiAgICAgICAgICAgICBtUmVwZWF0QnVmZmVyRGVmZXJyZWQgPSBmYWxzZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJzdXNwZW5kL2RlZmVycmVkIHJlcGVhdExhdGVzdFN1Ym1pdHRlZEJ1ZmZlcl9sIEZBSUxVUkUiKTsKKyAgICAgICAgICAgIEFMT0dWKCJzdXNwZW5kL2RlZmVycmVkIHJlcGVhdExhdGVzdEJ1ZmZlcl9sIEZBSUxVUkUiKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTQyMiwxNSArNTI0LDkgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIG1OdW1CdWZmZXJBY3F1aXJlZCsrOwogICAgIG1OdW1GcmFtZXNBdmFpbGFibGUtLTsKIAotICAgIC8vIFdhaXQgZm9yIGl0IHRvIGJlY29tZSBhdmFpbGFibGUuCi0gICAgZXJyID0gaXRlbS5tRmVuY2UtPndhaXRGb3JldmVyKCJHcmFwaGljQnVmZmVyU291cmNlOjpmaWxsQ29kZWNCdWZmZXJfbCIpOwotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR1coImZhaWxlZCB0byB3YWl0IGZvciBidWZmZXIgZmVuY2U6ICVkIiwgZXJyKTsKLSAgICAgICAgLy8ga2VlcCBnb2luZwotICAgIH0KLQogICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UncmUgc2VlaW5nIHRoaXMgYnVmZmVyLCBhZGQgaXQgdG8gb3VyCiAgICAgLy8gc2xvdCB0YWJsZS4KICAgICBpZiAoaXRlbS5tR3JhcGhpY0J1ZmZlciAhPSBOVUxMKSB7CkBAIC00NDIsNjEgKzUzOCw3MiBAQAogCiAgICAgLy8gb25seSBzdWJtaXQgc2FtcGxlIGlmIHN0YXJ0IHRpbWUgaXMgdW5zcGVjaWZpZWQsIG9yIHNhbXBsZQogICAgIC8vIGlzIHF1ZXVlZCBhZnRlciB0aGUgc3BlY2lmaWVkIHN0YXJ0IHRpbWUKKyAgICBib29sIGRyb3BwZWQgPSBmYWxzZTsKICAgICBpZiAobVNraXBGcmFtZXNCZWZvcmVOcyA8IDBsbCB8fCBpdGVtLm1UaW1lc3RhbXAgPj0gbVNraXBGcmFtZXNCZWZvcmVOcykgewogICAgICAgICAvLyBpZiBzdGFydCB0aW1lIGlzIHNldCwgb2Zmc2V0IHRpbWUgc3RhbXAgYnkgc3RhcnQgdGltZQogICAgICAgICBpZiAobVNraXBGcmFtZXNCZWZvcmVOcyA+IDApIHsKICAgICAgICAgICAgIGl0ZW0ubVRpbWVzdGFtcCAtPSBtU2tpcEZyYW1lc0JlZm9yZU5zOwogICAgICAgICB9Ci0gICAgICAgIGVyciA9IHN1Ym1pdEJ1ZmZlcl9sKGl0ZW0sIGNiaSk7CisKKyAgICAgICAgaW50NjRfdCB0aW1lVXMgPSBpdGVtLm1UaW1lc3RhbXAgLyAxMDAwOworICAgICAgICBpZiAobUZyYW1lRHJvcHBlciAhPSBOVUxMICYmIG1GcmFtZURyb3BwZXItPnNob3VsZERyb3AodGltZVVzKSkgeworICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nIGZyYW1lICglbGxkKSB0byBtZWV0IG1heCBmcmFtZXJhdGUiLCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHRpbWVVcykpOworICAgICAgICAgICAgLy8gc2V0IGVyciB0byBPSyBzbyB0aGF0IHRoZSBza2lwcGVkIGZyYW1lIGNhbiBzdGlsbCBiZSBzYXZlZCBhcyB0aGUgbGFzdGVzdCBmcmFtZQorICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICBkcm9wcGVkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVyciA9IHN1Ym1pdEJ1ZmZlcl9sKGl0ZW0sIGNiaSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIEFMT0dWKCJzdWJtaXRCdWZmZXJfbCBmYWlsZWQsIHJlbGVhc2luZyBicSBidWYgJWQiLCBpdGVtLm1CdWYpOwotICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoaXRlbS5tQnVmLCBpdGVtLm1GcmFtZU51bWJlciwKLSAgICAgICAgICAgICAgICBFR0xfTk9fRElTUExBWSwgRUdMX05PX1NZTkNfS0hSLCBGZW5jZTo6Tk9fRkVOQ0UpOworICAgICAgICByZWxlYXNlQnVmZmVyKGl0ZW0ubUJ1ZiwgaXRlbS5tRnJhbWVOdW1iZXIsIGl0ZW0ubUdyYXBoaWNCdWZmZXIsIGl0ZW0ubUZlbmNlKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiYnVmZmVyIHN1Ym1pdHRlZCAoYnEgJWQsIGNiaSAlZCkiLCBpdGVtLm1CdWYsIGNiaSk7Ci0gICAgICAgIHNldExhdGVzdFN1Ym1pdHRlZEJ1ZmZlcl9sKGl0ZW0pOworICAgICAgICBzZXRMYXRlc3RCdWZmZXJfbChpdGVtLCBkcm9wcGVkKTsKICAgICB9CiAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBHcmFwaGljQnVmZmVyU291cmNlOjpyZXBlYXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbCgpIHsKK2Jvb2wgR3JhcGhpY0J1ZmZlclNvdXJjZTo6cmVwZWF0TGF0ZXN0QnVmZmVyX2woKSB7CiAgICAgQ0hFQ0sobUV4ZWN1dGluZyAmJiBtTnVtRnJhbWVzQXZhaWxhYmxlID09IDApOwogCi0gICAgaWYgKG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZCA8IDAgfHwgbVN1c3BlbmRlZCkgeworICAgIGlmIChtTGF0ZXN0QnVmZmVySWQgPCAwIHx8IG1TdXNwZW5kZWQpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBpZiAobUJ1ZmZlclNsb3RbbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlcklkXSA9PSBOVUxMKSB7CisgICAgaWYgKG1CdWZmZXJTbG90W21MYXRlc3RCdWZmZXJJZF0gPT0gTlVMTCkgewogICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHJlbW90ZSBzaWRlIGRpc2Nvbm5lY3RzLCBjYXVzaW5nCiAgICAgICAgIC8vIG9uQnVmZmVyc1JlbGVhc2VkKCkgdG8gTlVMTCBvdXQgb3VyIGNvcHkgb2YgdGhlIHNsb3RzLiAgVGhlCiAgICAgICAgIC8vIGJ1ZmZlciBpcyBnb25lLCBzbyB3ZSBoYXZlIG5vdGhpbmcgdG8gc2hvdy4KICAgICAgICAgLy8KICAgICAgICAgLy8gVG8gYmUgb24gdGhlIHNhZmUgc2lkZSB3ZSB0cnkgdG8gcmVsZWFzZSB0aGUgYnVmZmVyLgotICAgICAgICBBTE9HRCgicmVwZWF0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2w6IHNsb3Qgd2FzIE5VTEwiKTsKKyAgICAgICAgQUxPR0QoInJlcGVhdExhdGVzdEJ1ZmZlcl9sOiBzbG90IHdhcyBOVUxMIik7CiAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcigKLSAgICAgICAgICAgICAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQsCi0gICAgICAgICAgICAgICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlckZyYW1lTnVtLAorICAgICAgICAgICAgICAgIG1MYXRlc3RCdWZmZXJJZCwKKyAgICAgICAgICAgICAgICBtTGF0ZXN0QnVmZmVyRnJhbWVOdW0sCiAgICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksCiAgICAgICAgICAgICAgICAgRUdMX05PX1NZTkNfS0hSLAotICAgICAgICAgICAgICAgIEZlbmNlOjpOT19GRU5DRSk7Ci0gICAgICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJJZCA9IC0xOwotICAgICAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVyRnJhbWVOdW0gPSAwOworICAgICAgICAgICAgICAgIG1MYXRlc3RCdWZmZXJGZW5jZSk7CisgICAgICAgIG1MYXRlc3RCdWZmZXJJZCA9IC0xOworICAgICAgICBtTGF0ZXN0QnVmZmVyRnJhbWVOdW0gPSAwOworICAgICAgICBtTGF0ZXN0QnVmZmVyRmVuY2UgPSBGZW5jZTo6Tk9fRkVOQ0U7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBpbnQgY2JpID0gZmluZEF2YWlsYWJsZUNvZGVjQnVmZmVyX2woKTsKICAgICBpZiAoY2JpIDwgMCkgewogICAgICAgICAvLyBObyBidWZmZXJzIGF2YWlsYWJsZSwgYmFpbC4KLSAgICAgICAgQUxPR1YoInJlcGVhdExhdGVzdFN1Ym1pdHRlZEJ1ZmZlcl9sOiBubyBjb2RlYyBidWZmZXJzLiIpOworICAgICAgICBBTE9HVigicmVwZWF0TGF0ZXN0QnVmZmVyX2w6IG5vIGNvZGVjIGJ1ZmZlcnMuIik7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBCdWZmZXJJdGVtIGl0ZW07Ci0gICAgaXRlbS5tQnVmID0gbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlcklkOwotICAgIGl0ZW0ubUZyYW1lTnVtYmVyID0gbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlckZyYW1lTnVtOworICAgIGl0ZW0ubUJ1ZiA9IG1MYXRlc3RCdWZmZXJJZDsKKyAgICBpdGVtLm1GcmFtZU51bWJlciA9IG1MYXRlc3RCdWZmZXJGcmFtZU51bTsKICAgICBpdGVtLm1UaW1lc3RhbXAgPSBtUmVwZWF0TGFzdEZyYW1lVGltZXN0YW1wOworICAgIGl0ZW0ubUZlbmNlID0gbUxhdGVzdEJ1ZmZlckZlbmNlOwogCiAgICAgc3RhdHVzX3QgZXJyID0gc3VibWl0QnVmZmVyX2woaXRlbSwgY2JpKTsKIApAQCAtNTA0LDcgKzYxMSw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICArK21MYXRlc3RTdWJtaXR0ZWRCdWZmZXJVc2VDb3VudDsKKyAgICArK21MYXRlc3RCdWZmZXJVc2VDb3VudDsKIAogICAgIC8qIHJlcGVhdCBsYXN0IGZyYW1lIHVwIHRvIGtSZXBlYXRMYXN0RnJhbWVDb3VudCB0aW1lcy4KICAgICAgKiBpbiBjYXNlIG9mIHN0YXRpYyBzY2VuZSwgYSBzaW5nbGUgcmVwZWF0IG1pZ2h0IG5vdCBnZXQgcmlkIG9mIGVuY29kZXIKQEAgLTUxNCw3ICs2MjEsNyBAQAogICAgICAgICBtUmVwZWF0TGFzdEZyYW1lVGltZXN0YW1wID0gaXRlbS5tVGltZXN0YW1wICsgbVJlcGVhdEFmdGVyVXMgKiAxMDAwOwogCiAgICAgICAgIGlmIChtUmVmbGVjdG9yICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXBlYXRMYXN0RnJhbWUsIG1SZWZsZWN0b3ItPmlkKCkpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlcGVhdExhc3RGcmFtZSwgbVJlZmxlY3Rvcik7CiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgKyttUmVwZWF0TGFzdEZyYW1lR2VuZXJhdGlvbik7CiAgICAgICAgICAgICBtc2ctPnBvc3QobVJlcGVhdEFmdGVyVXMpOwogICAgICAgICB9CkBAIC01MjMsMzEgKzYzMCwyOSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldExhdGVzdFN1Ym1pdHRlZEJ1ZmZlcl9sKAotICAgICAgICBjb25zdCBCdWZmZXJJdGVtICZpdGVtKSB7Ci0gICAgQUxPR1YoInNldExhdGVzdFN1Ym1pdHRlZEJ1ZmZlcl9sIik7Cit2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldExhdGVzdEJ1ZmZlcl9sKAorICAgICAgICBjb25zdCBCdWZmZXJJdGVtICZpdGVtLCBib29sIGRyb3BwZWQpIHsKKyAgICBBTE9HVigic2V0TGF0ZXN0QnVmZmVyX2wiKTsKIAotICAgIGlmIChtTGF0ZXN0U3VibWl0dGVkQnVmZmVySWQgPj0gMCkgewotICAgICAgICBpZiAobUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlclVzZUNvdW50ID09IDApIHsKLSAgICAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlcklkLAotICAgICAgICAgICAgICAgICAgICBtTGF0ZXN0U3VibWl0dGVkQnVmZmVyRnJhbWVOdW0sCi0gICAgICAgICAgICAgICAgICAgIEVHTF9OT19ESVNQTEFZLAotICAgICAgICAgICAgICAgICAgICBFR0xfTk9fU1lOQ19LSFIsCi0gICAgICAgICAgICAgICAgICAgIEZlbmNlOjpOT19GRU5DRSk7CisgICAgaWYgKG1MYXRlc3RCdWZmZXJJZCA+PSAwKSB7CisgICAgICAgIGlmIChtTGF0ZXN0QnVmZmVyVXNlQ291bnQgPT0gMCkgeworICAgICAgICAgICAgcmVsZWFzZUJ1ZmZlcihtTGF0ZXN0QnVmZmVySWQsIG1MYXRlc3RCdWZmZXJGcmFtZU51bSwKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclNsb3RbbUxhdGVzdEJ1ZmZlcklkXSwgbUxhdGVzdEJ1ZmZlckZlbmNlKTsKKyAgICAgICAgICAgIC8vIG1MYXRlc3RCdWZmZXJGZW5jZSB3aWxsIGJlIHNldCB0byBuZXcgZmVuY2UganVzdCBiZWxvdwogICAgICAgICB9CiAgICAgfQogCi0gICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlcklkID0gaXRlbS5tQnVmOwotICAgIG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJGcmFtZU51bSA9IGl0ZW0ubUZyYW1lTnVtYmVyOworICAgIG1MYXRlc3RCdWZmZXJJZCA9IGl0ZW0ubUJ1ZjsKKyAgICBtTGF0ZXN0QnVmZmVyRnJhbWVOdW0gPSBpdGVtLm1GcmFtZU51bWJlcjsKICAgICBtUmVwZWF0TGFzdEZyYW1lVGltZXN0YW1wID0gaXRlbS5tVGltZXN0YW1wICsgbVJlcGVhdEFmdGVyVXMgKiAxMDAwOwogCi0gICAgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlclVzZUNvdW50ID0gMTsKKyAgICBtTGF0ZXN0QnVmZmVyVXNlQ291bnQgPSBkcm9wcGVkID8gMCA6IDE7CiAgICAgbVJlcGVhdEJ1ZmZlckRlZmVycmVkID0gZmFsc2U7CiAgICAgbVJlcGVhdExhc3RGcmFtZUNvdW50ID0ga1JlcGVhdExhc3RGcmFtZUNvdW50OworICAgIG1MYXRlc3RCdWZmZXJGZW5jZSA9IGl0ZW0ubUZlbmNlOwogCiAgICAgaWYgKG1SZWZsZWN0b3IgIT0gTlVMTCkgewotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVwZWF0TGFzdEZyYW1lLCBtUmVmbGVjdG9yLT5pZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlcGVhdExhc3RGcmFtZSwgbVJlZmxlY3Rvcik7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCArK21SZXBlYXRMYXN0RnJhbWVHZW5lcmF0aW9uKTsKICAgICAgICAgbXNnLT5wb3N0KG1SZXBlYXRBZnRlclVzKTsKICAgICB9CkBAIC02NDAsOCArNzQ1LDcgQEAKICAgICByZXR1cm4gdGltZVVzOwogfQogCi1zdGF0dXNfdCBHcmFwaGljQnVmZmVyU291cmNlOjpzdWJtaXRCdWZmZXJfbCgKLSAgICAgICAgY29uc3QgQnVmZmVySXRlbSAmaXRlbSwgaW50IGNiaSkgeworc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c3VibWl0QnVmZmVyX2woY29uc3QgQnVmZmVySXRlbSAmaXRlbSwgaW50IGNiaSkgewogICAgIEFMT0dWKCJzdWJtaXRCdWZmZXJfbCBjYmk9JWQiLCBjYmkpOwogCiAgICAgaW50NjRfdCB0aW1lVXMgPSBnZXRUaW1lc3RhbXAoaXRlbSk7CkBAIC02NTUsMzYgKzc1OSwxOCBAQAogICAgIGNvZGVjQnVmZmVyLm1GcmFtZU51bWJlciA9IGl0ZW0ubUZyYW1lTnVtYmVyOwogCiAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUqIGhlYWRlciA9IGNvZGVjQnVmZmVyLm1IZWFkZXI7Ci0gICAgQ0hFQ0soaGVhZGVyLT5uQWxsb2NMZW4gPj0gNCArIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKTsKLSAgICBPTVhfVTgqIGRhdGEgPSBoZWFkZXItPnBCdWZmZXI7Ci0gICAgYnVmZmVyX2hhbmRsZV90IGhhbmRsZTsKLSAgICBpZiAoIW1Vc2VHcmFwaGljQnVmZmVySW5NZXRhKSB7Ci0gICAgICAgIGNvbnN0IE9NWF9VMzIgdHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlOwotICAgICAgICBoYW5kbGUgPSBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlci0+aGFuZGxlOwotICAgICAgICBtZW1jcHkoZGF0YSwgJnR5cGUsIDQpOwotICAgICAgICBtZW1jcHkoZGF0YSArIDQsICZoYW5kbGUsIHNpemVvZihidWZmZXJfaGFuZGxlX3QpKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBjb2RlY0J1ZmZlciBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgR3JhcGhpY0J1ZmZlciwgc28KLSAgICAgICAgLy8gaXQgaXMgdmFsaWQgd2hpbGUgaXQgaXMgd2l0aCB0aGUgT01YIGNvbXBvbmVudAotICAgICAgICBjb25zdCBPTVhfVTMyIHR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhcGhpY0J1ZmZlcjsKLSAgICAgICAgbWVtY3B5KGRhdGEsICZ0eXBlLCA0KTsKLSAgICAgICAgLy8gcGFzc2luZyBhIG5vbi1yZWZlcmVuY2UtY291bnRlZCBncmFwaGljQnVmZmVyCi0gICAgICAgIEdyYXBoaWNCdWZmZXIgKmJ1ZmZlciA9IGNvZGVjQnVmZmVyLm1HcmFwaGljQnVmZmVyLmdldCgpOwotICAgICAgICBoYW5kbGUgPSBidWZmZXItPmhhbmRsZTsKLSAgICAgICAgbWVtY3B5KGRhdGEgKyA0LCAmYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gbU5vZGVJbnN0YW5jZS0+ZW1wdHlEaXJlY3RCdWZmZXIoaGVhZGVyLCAwLAotICAgICAgICAgICAgNCArIHNpemVvZihidWZmZXJfaGFuZGxlX3QpLCBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FLAotICAgICAgICAgICAgdGltZVVzKTsKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBidWZmZXIgPSBjb2RlY0J1ZmZlci5tR3JhcGhpY0J1ZmZlcjsKKyAgICBzdGF0dXNfdCBlcnIgPSBtTm9kZUluc3RhbmNlLT5lbXB0eUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBoZWFkZXIsIGJ1ZmZlciwgT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRSwgdGltZVVzLAorICAgICAgICAgICAgaXRlbS5tRmVuY2UtPmlzVmFsaWQoKSA/IGl0ZW0ubUZlbmNlLT5kdXAoKSA6IC0xKTsKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dXKCJXQVJOSU5HOiBlbXB0eURpcmVjdEJ1ZmZlciBmYWlsZWQ6IDB4JXgiLCBlcnIpOworICAgICAgICBBTE9HVygiV0FSTklORzogZW1wdHlOYXRpdmVXaW5kb3dCdWZmZXIgZmFpbGVkOiAweCV4IiwgZXJyKTsKICAgICAgICAgY29kZWNCdWZmZXIubUdyYXBoaWNCdWZmZXIgPSBOVUxMOwogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIEFMT0dWKCJlbXB0eURpcmVjdEJ1ZmZlciBzdWNjZWVkZWQsIGg9JXAgcD0lcCBidWZoYW5kbGU9JXAiLAotICAgICAgICAgICAgaGVhZGVyLCBoZWFkZXItPnBCdWZmZXIsIGhhbmRsZSk7CisgICAgQUxPR1YoImVtcHR5TmF0aXZlV2luZG93QnVmZmVyIHN1Y2NlZWRlZCwgaD0lcCBwPSVwIGJ1Zj0lcCBidWZoYW5kbGU9JXAiLAorICAgICAgICAgICAgaGVhZGVyLCBoZWFkZXItPnBCdWZmZXIsIGJ1ZmZlci0+Z2V0TmF0aXZlQnVmZmVyKCksIGJ1ZmZlci0+aGFuZGxlKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTcwNywxOSArNzkzLDkgQEAKICAgICBDb2RlY0J1ZmZlciYgY29kZWNCdWZmZXIobUNvZGVjQnVmZmVycy5lZGl0SXRlbUF0KGNiaSkpOwogCiAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUqIGhlYWRlciA9IGNvZGVjQnVmZmVyLm1IZWFkZXI7Ci0gICAgaWYgKEVYVFJBX0NIRUNLKSB7Ci0gICAgICAgIC8vIEd1YXJkIGFnYWluc3QgaW1wbGVtZW50YXRpb25zIHRoYXQgZG9uJ3QgY2hlY2sgbkZpbGxlZExlbi4KLSAgICAgICAgc2l6ZV90IGZpbGxMZW4gPSA0ICsgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCk7Ci0gICAgICAgIENIRUNLKGhlYWRlci0+bkFsbG9jTGVuID49IGZpbGxMZW4pOwotICAgICAgICBPTVhfVTgqIGRhdGEgPSBoZWFkZXItPnBCdWZmZXI7Ci0gICAgICAgIG1lbXNldChkYXRhLCAweGNkLCBmaWxsTGVuKTsKLSAgICB9Ci0KLSAgICB1aW50NjRfdCB0aW1lc3RhbXAgPSAwOyAvLyBkb2VzIHRoaXMgbWF0dGVyPwotCi0gICAgc3RhdHVzX3QgZXJyID0gbU5vZGVJbnN0YW5jZS0+ZW1wdHlEaXJlY3RCdWZmZXIoaGVhZGVyLCAvKm9mZnNldCovIDAsCi0gICAgICAgICAgICAvKmxlbmd0aCovIDAsIE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUUgfCBPTVhfQlVGRkVSRkxBR19FT1MsCi0gICAgICAgICAgICB0aW1lc3RhbXApOworICAgIHN0YXR1c190IGVyciA9IG1Ob2RlSW5zdGFuY2UtPmVtcHR5R3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIGhlYWRlciwgTlVMTCAvKiBidWZmZXIgKi8sIE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUUgfCBPTVhfQlVGRkVSRkxBR19FT1MsCisgICAgICAgICAgICAwIC8qIHRpbWVzdGFtcCAqLywgLTEgLyogZmVuY2VGZCAqLyk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBBTE9HVygiZW1wdHlEaXJlY3RCdWZmZXIgRU9TIGZhaWxlZDogMHgleCIsIGVycik7CiAgICAgfSBlbHNlIHsKQEAgLTc1MCw2ICs4MjYsMzUgQEAKICAgICByZXR1cm4gLTE7CiB9CiAKKy8qCisgKiBSZWxlYXNlcyBhbiBhY3F1aXJlZCBidWZmZXIgYmFjayB0byB0aGUgY29uc3VtZXIgZm9yIGVpdGhlciBwZXJzaXN0ZW50CisgKiBvciBub24tcGVyc2lzdGVudCBzdXJmYWNlcy4KKyAqCisgKiBpZDogYnVmZmVyIHNsb3QgdG8gcmVsZWFzZSAoaW4gcGVyc2lzdGVudCBjYXNlIHRoZSBpZCBtaWdodCBiZSBjaGFuZ2VkKQorICogZnJhbWVOdW06IGZyYW1lIG51bWJlciBvZiB0aGUgZnJhbWUgYmVpbmcgcmVsZWFzZWQKKyAqIGJ1ZmZlcjogR3JhcGhpY0J1ZmZlciBwb2ludGVyIHRvIHJlbGVhc2UgKG5vdGUgdGhpcyBtdXN0IG5vdCBiZSAmIGFzIHdlCisgKiAgICAgICAgIHdpbGwgY2xlYXIgdGhlIG9yaWdpbmFsIG1CdWZmZXJTbG90IGluIHBlcnNpc3RlbnQgY2FzZSkKKyAqIGZlbmNlOiBmZW5jZSBvZiB0aGUgZnJhbWUgYmVpbmcgcmVsZWFzZWQKKyAqLwordm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpyZWxlYXNlQnVmZmVyKAorICAgICAgICBpbnQgJmlkLCB1aW50NjRfdCBmcmFtZU51bSwKKyAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyLCBjb25zdCBzcDxGZW5jZT4gJmZlbmNlKSB7CisgICAgaWYgKG1Jc1BlcnNpc3RlbnQpIHsKKyAgICAgICAgbUNvbnN1bWVyLT5kZXRhY2hCdWZmZXIoaWQpOworICAgICAgICBtQnVmZmVyU2xvdFtpZF0gPSBOVUxMOworCisgICAgICAgIGlmIChtQ29uc3VtZXItPmF0dGFjaEJ1ZmZlcigmaWQsIGJ1ZmZlcikgPT0gT0spIHsKKyAgICAgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgaWQsIDAsIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1lOQ19LSFIsIGZlbmNlKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1Db25zdW1lci0+cmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICBpZCwgZnJhbWVOdW0sIEVHTF9OT19ESVNQTEFZLCBFR0xfTk9fU1lOQ19LSFIsIGZlbmNlKTsKKyAgICB9CisgICAgaWQgPSAtMTsgLy8gaW52YWxpZGF0ZSBpZAorICAgIG1OdW1CdWZmZXJBY3F1aXJlZC0tOworfQorCiAvLyBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lciBjYWxsYmFjawogdm9pZCBHcmFwaGljQnVmZmVyU291cmNlOjpvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIC8qaXRlbSovKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CkBAIC03NzAsMTQgKzg3NSwxNyBAQAogICAgICAgICBCdWZmZXJJdGVtIGl0ZW07CiAgICAgICAgIHN0YXR1c190IGVyciA9IG1Db25zdW1lci0+YWNxdWlyZUJ1ZmZlcigmaXRlbSwgMCk7CiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIG1OdW1CdWZmZXJBY3F1aXJlZCsrOworCiAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3JlIHNlZWluZyB0aGlzIGJ1ZmZlciwgYWRkIGl0IHRvIG91cgogICAgICAgICAgICAgLy8gc2xvdCB0YWJsZS4KICAgICAgICAgICAgIGlmIChpdGVtLm1HcmFwaGljQnVmZmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBBTE9HVigib25GcmFtZUF2YWlsYWJsZTogc2V0dGluZyBtQnVmZmVyU2xvdCAlZCIsIGl0ZW0ubUJ1Zik7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlclNsb3RbaXRlbS5tQnVmXSA9IGl0ZW0ubUdyYXBoaWNCdWZmZXI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoaXRlbS5tQnVmLCBpdGVtLm1GcmFtZU51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgRUdMX05PX0RJU1BMQVksIEVHTF9OT19TWU5DX0tIUiwgaXRlbS5tRmVuY2UpOworCisgICAgICAgICAgICByZWxlYXNlQnVmZmVyKGl0ZW0ubUJ1ZiwgaXRlbS5tRnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgIGl0ZW0ubUdyYXBoaWNCdWZmZXIsIGl0ZW0ubUZlbmNlKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtODQyLDYgKzk1MCwyMyBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0TWF4RnBzKGZsb2F0IG1heEZwcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOworCisgICAgaWYgKG1FeGVjdXRpbmcpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIG1GcmFtZURyb3BwZXIgPSBuZXcgRnJhbWVEcm9wcGVyKCk7CisgICAgc3RhdHVzX3QgZXJyID0gbUZyYW1lRHJvcHBlci0+c2V0TWF4RnJhbWVSYXRlKG1heEZwcyk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBtRnJhbWVEcm9wcGVyLmNsZWFyKCk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCiB2b2lkIEdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldFNraXBGcmFtZXNCZWZvcmVVcyhpbnQ2NF90IHNraXBGcmFtZXNCZWZvcmVVcykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwogCkBAIC04ODAsMTIgKzEwMDUsMTIgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYm9vbCBzdWNjZXNzID0gcmVwZWF0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2woKTsKKyAgICAgICAgICAgIGJvb2wgc3VjY2VzcyA9IHJlcGVhdExhdGVzdEJ1ZmZlcl9sKCk7CiAKICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInJlcGVhdExhdGVzdFN1Ym1pdHRlZEJ1ZmZlcl9sIFNVQ0NFU1MiKTsKKyAgICAgICAgICAgICAgICBBTE9HVigicmVwZWF0TGF0ZXN0QnVmZmVyX2wgU1VDQ0VTUyIpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigicmVwZWF0TGF0ZXN0U3VibWl0dGVkQnVmZmVyX2wgRkFJTFVSRSIpOworICAgICAgICAgICAgICAgIEFMT0dWKCJyZXBlYXRMYXRlc3RCdWZmZXJfbCBGQUlMVVJFIik7CiAgICAgICAgICAgICAgICAgbVJlcGVhdEJ1ZmZlckRlZmVycmVkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9HcmFwaGljQnVmZmVyU291cmNlLmgKaW5kZXggNDAxYmJjMy4uMmY5MjlkOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0dyYXBoaWNCdWZmZXJTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvR3JhcGhpY0J1ZmZlclNvdXJjZS5oCkBAIC0zMCw2ICszMCw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IEZyYW1lRHJvcHBlcjsKKwogLyoKICAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBmZWVkIE9NWCBjb2RlY3MgZnJvbSBhIFN1cmZhY2UgdmlhIEJ1ZmZlclF1ZXVlLgogICoKQEAgLTQ4LDkgKzUwLDE1IEBACiAgKi8KIGNsYXNzIEdyYXBoaWNCdWZmZXJTb3VyY2UgOiBwdWJsaWMgQnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIgewogcHVibGljOgotICAgIEdyYXBoaWNCdWZmZXJTb3VyY2UoT01YTm9kZUluc3RhbmNlKiBub2RlSW5zdGFuY2UsCi0gICAgICAgICAgICB1aW50MzJfdCBidWZmZXJXaWR0aCwgdWludDMyX3QgYnVmZmVySGVpZ2h0LCB1aW50MzJfdCBidWZmZXJDb3VudCwKLSAgICAgICAgICAgIGJvb2wgdXNlR3JhcGhpY0J1ZmZlckluTWV0YSA9IGZhbHNlKTsKKyAgICBHcmFwaGljQnVmZmVyU291cmNlKAorICAgICAgICAgICAgT01YTm9kZUluc3RhbmNlKiBub2RlSW5zdGFuY2UsCisgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJXaWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlckhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGJ1ZmZlckNvdW50LAorICAgICAgICAgICAgdWludDMyX3QgY29uc3VtZXJVc2FnZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICZjb25zdW1lciA9IE5VTEwKKyAgICApOworCiAgICAgdmlydHVhbCB+R3JhcGhpY0J1ZmZlclNvdXJjZSgpOwogCiAgICAgLy8gV2UgY2FuJ3QgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb25zdHJ1Y3RvciBmYWlscywgc28gd2UganVzdCBzZXQKQEAgLTg2LDcgKzk0LDcgQEAKIAogICAgIC8vIENhbGxlZCBmcm9tIE9uRW1wdHlCdWZmZXJEb25lLiAgSWYgd2UgaGF2ZSBhIEJRIGJ1ZmZlciBhdmFpbGFibGUsCiAgICAgLy8gZmlsbCBpdCB3aXRoIGEgbmV3IGZyYW1lIG9mIGRhdGE7IG90aGVyd2lzZSwganVzdCBtYXJrIGl0IGFzIGF2YWlsYWJsZS4KLSAgICB2b2lkIGNvZGVjQnVmZmVyRW1wdGllZChPTVhfQlVGRkVSSEVBREVSVFlQRSogaGVhZGVyKTsKKyAgICB2b2lkIGNvZGVjQnVmZmVyRW1wdGllZChPTVhfQlVGRkVSSEVBREVSVFlQRSogaGVhZGVyLCBpbnQgZmVuY2VGZCk7CiAKICAgICAvLyBDYWxsZWQgd2hlbiBvbXhfbWVzc2FnZTo6RklMTF9CVUZGRVJfRE9ORSBpcyByZWNlaXZlZC4gKEN1cnJlbnRseSB0aGUKICAgICAvLyBidWZmZXIgc291cmNlIHdpbGwgZml4IHRpbWVzdGFtcCBpbiB0aGUgaGVhZGVyIGlmIG5lZWRlZC4pCkBAIC0xMTksNiArMTI3LDkgQEAKICAgICAvLyBvZiBzdXNwZW5zaW9uIG9uIGlucHV0LgogICAgIHN0YXR1c190IHNldE1heFRpbWVzdGFtcEdhcFVzKGludDY0X3QgbWF4R2FwVXMpOwogCisgICAgLy8gV2hlbiBzZXQsIHRoZSBtYXggZnJhbWUgcmF0ZSBmZWQgdG8gdGhlIGVuY29kZXIgd2lsbCBiZSBjYXBwZWQgYXQgbWF4RnBzLgorICAgIHN0YXR1c190IHNldE1heEZwcyhmbG9hdCBtYXhGcHMpOworCiAgICAgLy8gU2V0cyB0aGUgdGltZSBsYXBzZSAob3Igc2xvdyBtb3Rpb24pIHBhcmFtZXRlcnMuCiAgICAgLy8gZGF0YVswXSBpcyB0aGUgdGltZSAodXMpIGJldHdlZW4gdHdvIGZyYW1lcyBmb3IgcGxheWJhY2sKICAgICAvLyBkYXRhWzFdIGlzIHRoZSB0aW1lICh1cykgYmV0d2VlbiB0d28gZnJhbWVzIGZvciBjYXB0dXJlCkBAIC0xNTAsNiArMTYxLDMxIEBACiAgICAgdmlydHVhbCB2b2lkIG9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCk7CiAKIHByaXZhdGU6CisgICAgLy8gUGVyc2lzdGVudFByb3h5TGlzdGVuZXIgaXMgc2ltaWxhciB0byBCdWZmZXJRdWV1ZTo6UHJveHlDb25zdW1lckxpc3RlbmVyCisgICAgLy8gZXhjZXB0IHRoYXQgaXQgcmV0dXJucyAoYWNxdWlyZS9kZXRhY2gvcmUtYXR0YWNoZS9yZWxlYXNlKSBidWZmZXJzCisgICAgLy8gaW4gb25GcmFtZUF2YWlsYWJsZSgpIGlmIHRoZSBhY3R1YWwgY29uc3VtZXIgb2JqZWN0IGlzIG5vIGxvbmdlciB2YWxpZC4KKyAgICAvLworICAgIC8vIFRoaXMgY2xhc3MgaXMgdXNlZCBpbiBwZXJzaXN0ZW50IGlucHV0IHN1cmZhY2UgY2FzZSB0byBwcmV2ZW50IGJ1ZmZlcgorICAgIC8vIGxvc3Mgd2hlbiBvbkZyYW1lQXZhaWxhYmxlKCkgaXMgcmVjZWl2ZWQgd2hpbGUgd2UgZG9uJ3QgaGF2ZSBhIHZhbGlkCisgICAgLy8gY29uc3VtZXIgYXJvdW5kLgorICAgIGNsYXNzIFBlcnNpc3RlbnRQcm94eUxpc3RlbmVyIDogcHVibGljIEJuQ29uc3VtZXJMaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIFBlcnNpc3RlbnRQcm94eUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAmY29uc3VtZXIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPENvbnN1bWVyTGlzdGVuZXI+JiBjb25zdW1lckxpc3RlbmVyKTsKKyAgICAgICAgICAgIHZpcnR1YWwgflBlcnNpc3RlbnRQcm94eUxpc3RlbmVyKCk7CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKSBvdmVycmlkZTsKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lUmVwbGFjZWQoY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgb3ZlcnJpZGU7CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJzUmVsZWFzZWQoKSBvdmVycmlkZTsKKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBvblNpZGViYW5kU3RyZWFtQ2hhbmdlZCgpIG92ZXJyaWRlOworICAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIC8vIG1Db25zdW1lckxpc3RlbmVyIGlzIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIElDb25zdW1lckxpc3RlbmVyLgorICAgICAgICAgICAgd3A8Q29uc3VtZXJMaXN0ZW5lcj4gbUNvbnN1bWVyTGlzdGVuZXI7CisgICAgICAgICAgICAvLyBtQ29uc3VtZXIgaXMgYSB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgSUdyYXBoaWNCdWZmZXJDb25zdW1lciwgdXNlCisgICAgICAgICAgICAvLyBhIHdlYWsgcmVmIHRvIGF2b2lkIGNpcmN1bGFyIHJlZiBiZXR3ZWVuIG1Db25zdW1lciBhbmQgdGhpcyBjbGFzcworICAgICAgICAgICAgd3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gbUNvbnN1bWVyOworICAgIH07CisKICAgICAvLyBLZWVwIHRyYWNrIG9mIGNvZGVjIGlucHV0IGJ1ZmZlcnMuICBUaGV5IG1heSBlaXRoZXIgYmUgYXZhaWxhYmxlCiAgICAgLy8gKG1HcmFwaGljQnVmZmVyID09IE5VTEwpIG9yIGluIHVzZSBieSB0aGUgY29kZWMuCiAgICAgc3RydWN0IENvZGVjQnVmZmVyIHsKQEAgLTE5Myw4ICsyMjksMTMgQEAKICAgICAvLyBkb2luZyBhbnl0aGluZyBpZiB3ZSBkb24ndCBoYXZlIGEgY29kZWMgYnVmZmVyIGF2YWlsYWJsZS4KICAgICB2b2lkIHN1Ym1pdEVuZE9mSW5wdXRTdHJlYW1fbCgpOwogCi0gICAgdm9pZCBzZXRMYXRlc3RTdWJtaXR0ZWRCdWZmZXJfbChjb25zdCBCdWZmZXJJdGVtICZpdGVtKTsKLSAgICBib29sIHJlcGVhdExhdGVzdFN1Ym1pdHRlZEJ1ZmZlcl9sKCk7CisgICAgLy8gUmVsZWFzZSBidWZmZXIgdG8gdGhlIGNvbnN1bWVyCisgICAgdm9pZCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgaW50ICZpZCwgdWludDY0X3QgZnJhbWVOdW0sCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiBidWZmZXIsIGNvbnN0IHNwPEZlbmNlPiAmZmVuY2UpOworCisgICAgdm9pZCBzZXRMYXRlc3RCdWZmZXJfbChjb25zdCBCdWZmZXJJdGVtICZpdGVtLCBib29sIGRyb3BwZWQpOworICAgIGJvb2wgcmVwZWF0TGF0ZXN0QnVmZmVyX2woKTsKICAgICBpbnQ2NF90IGdldFRpbWVzdGFtcChjb25zdCBCdWZmZXJJdGVtICZpdGVtKTsKIAogICAgIC8vIExvY2ssIGNvdmVycyBhbGwgbWVtYmVyIHZhcmlhYmxlcy4KQEAgLTIxNCw2ICsyNTUsNyBAQAogICAgIC8vIE91ciBCdWZmZXJRdWV1ZSBpbnRlcmZhY2VzLiBtUHJvZHVjZXIgaXMgcGFzc2VkIHRvIHRoZSBwcm9kdWNlciB0aHJvdWdoCiAgICAgLy8gZ2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlciwgYW5kIG1Db25zdW1lciBpcyB1c2VkIGludGVybmFsbHkgdG8gcmV0cmlldmUKICAgICAvLyB0aGUgYnVmZmVycyBxdWV1ZWQgYnkgdGhlIHByb2R1Y2VyLgorICAgIGJvb2wgbUlzUGVyc2lzdGVudDsKICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CiAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gbUNvbnN1bWVyOwogCkBAIC0yMjEsNiArMjYzLDkgQEAKICAgICAvLyBmb3J3YXJkZWQgdG8gdGhlIGNvZGVjLgogICAgIHNpemVfdCBtTnVtRnJhbWVzQXZhaWxhYmxlOwogCisgICAgLy8gTnVtYmVyIG9mIGZyYW1lcyBhY3F1aXJlZCBmcm9tIGNvbnN1bWVyIChkZWJ1ZyBvbmx5KQorICAgIGludDMyX3QgbU51bUJ1ZmZlckFjcXVpcmVkOworCiAgICAgLy8gU2V0IHRvIHRydWUgaWYgd2Ugd2FudCB0byBzZW5kIGVuZC1vZi1zdHJlYW0gYWZ0ZXIgd2UgcnVuIG91dCBvZgogICAgIC8vIGZyYW1lcyBpbiBCdWZmZXJRdWV1ZS4KICAgICBib29sIG1FbmRPZlN0cmVhbTsKQEAgLTIzNSw3ICsyODAsNyBAQAogICAgIFZlY3RvcjxDb2RlY0J1ZmZlcj4gbUNvZGVjQnVmZmVyczsKIAogICAgIC8vLy8KLSAgICBmcmllbmQgY2xhc3MgQUhhbmRsZXJSZWZsZWN0b3I8R3JhcGhpY0J1ZmZlclNvdXJjZT47CisgICAgZnJpZW5kIHN0cnVjdCBBSGFuZGxlclJlZmxlY3RvcjxHcmFwaGljQnVmZmVyU291cmNlPjsKIAogICAgIGVudW0gewogICAgICAgICBrV2hhdFJlcGVhdExhc3RGcmFtZSwKQEAgLTI1MCw2ICsyOTUsOCBAQAogICAgIGludDY0X3QgbVByZXZNb2RpZmllZFRpbWVVczsKICAgICBpbnQ2NF90IG1Ta2lwRnJhbWVzQmVmb3JlTnM7CiAKKyAgICBzcDxGcmFtZURyb3BwZXI+IG1GcmFtZURyb3BwZXI7CisKICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwogICAgIHNwPEFIYW5kbGVyUmVmbGVjdG9yPEdyYXBoaWNCdWZmZXJTb3VyY2U+ID4gbVJlZmxlY3RvcjsKIApAQCAtMjU4LDExICszMDUsMTIgQEAKICAgICBpbnQ2NF90IG1SZXBlYXRMYXN0RnJhbWVUaW1lc3RhbXA7CiAgICAgaW50MzJfdCBtUmVwZWF0TGFzdEZyYW1lQ291bnQ7CiAKLSAgICBpbnQgbUxhdGVzdFN1Ym1pdHRlZEJ1ZmZlcklkOwotICAgIHVpbnQ2NF90IG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJGcmFtZU51bTsKLSAgICBpbnQzMl90IG1MYXRlc3RTdWJtaXR0ZWRCdWZmZXJVc2VDb3VudDsKKyAgICBpbnQgbUxhdGVzdEJ1ZmZlcklkOworICAgIHVpbnQ2NF90IG1MYXRlc3RCdWZmZXJGcmFtZU51bTsKKyAgICBpbnQzMl90IG1MYXRlc3RCdWZmZXJVc2VDb3VudDsKKyAgICBzcDxGZW5jZT4gbUxhdGVzdEJ1ZmZlckZlbmNlOwogCi0gICAgLy8gVGhlIHByZXZpb3VzbHkgc3VibWl0dGVkIGJ1ZmZlciBzaG91bGQndmUgYmVlbiByZXBlYXRlZCBidXQKKyAgICAvLyBUaGUgcHJldmlvdXMgYnVmZmVyIHNob3VsZCd2ZSBiZWVuIHJlcGVhdGVkIGJ1dAogICAgIC8vIG5vIGNvZGVjIGJ1ZmZlciB3YXMgYXZhaWxhYmxlIGF0IHRoZSB0aW1lLgogICAgIGJvb2wgbVJlcGVhdEJ1ZmZlckRlZmVycmVkOwogCkBAIC0yNzIsNyArMzIwLDcgQEAKICAgICBpbnQ2NF90IG1QcmV2Q2FwdHVyZVVzOwogICAgIGludDY0X3QgbVByZXZGcmFtZVVzOwogCi0gICAgYm9vbCBtVXNlR3JhcGhpY0J1ZmZlckluTWV0YTsKKyAgICBNZXRhZGF0YUJ1ZmZlclR5cGUgbU1ldGFkYXRhQnVmZmVyVHlwZTsKIAogICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwCmluZGV4IDAxZGZjOGEuLjU4OThiNGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVguY3BwCkBAIC0zMiw3ICszMiw5IEBACiAKICNpbmNsdWRlICJPTVhNYXN0ZXIuaCIKIAorI2luY2x1ZGUgPE9NWF9Bc1N0cmluZy5oPgogI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC02MCw3ICs2MiwxMSBAQAogc3RydWN0IE9NWDo6Q2FsbGJhY2tEaXNwYXRjaGVyIDogcHVibGljIFJlZkJhc2UgewogICAgIENhbGxiYWNrRGlzcGF0Y2hlcihPTVhOb2RlSW5zdGFuY2UgKm93bmVyKTsKIAotICAgIHZvaWQgcG9zdChjb25zdCBvbXhfbWVzc2FnZSAmbXNnKTsKKyAgICAvLyBQb3N0cyB8bXNnfCB0byB0aGUgbGlzdGVuZXIncyBxdWV1ZS4gSWYgfHJlYWxUaW1lfCBpcyB0cnVlLCB0aGUgbGlzdGVuZXIgdGhyZWFkIGlzIG5vdGlmaWVkCisgICAgLy8gdGhhdCBhIG5ldyBtZXNzYWdlIGlzIGF2YWlsYWJsZSBvbiB0aGUgcXVldWUuIE90aGVyd2lzZSwgdGhlIG1lc3NhZ2Ugc3RheXMgb24gdGhlIHF1ZXVlLCBidXQKKyAgICAvLyB0aGUgbGlzdGVuZXIgaXMgbm90IG5vdGlmaWVkIG9mIGl0LiBJdCB3aWxsIHByb2Nlc3MgdGhpcyBtZXNzYWdlIHdoZW4gYSBzdWJzZXF1ZW50IG1lc3NhZ2UKKyAgICAvLyBpcyBwb3N0ZWQgd2l0aCB8cmVhbFRpbWV8IHNldCB0byB0cnVlLgorICAgIHZvaWQgcG9zdChjb25zdCBvbXhfbWVzc2FnZSAmbXNnLCBib29sIHJlYWxUaW1lID0gdHJ1ZSk7CiAKICAgICBib29sIGxvb3AoKTsKIApAQCAtNzMsMTEgKzc5LDExIEBACiAgICAgT01YTm9kZUluc3RhbmNlICptT3duZXI7CiAgICAgYm9vbCBtRG9uZTsKICAgICBDb25kaXRpb24gbVF1ZXVlQ2hhbmdlZDsKLSAgICBMaXN0PG9teF9tZXNzYWdlPiBtUXVldWU7CisgICAgc3RkOjpsaXN0PG9teF9tZXNzYWdlPiBtUXVldWU7CiAKICAgICBzcDxDYWxsYmFja0Rpc3BhdGNoZXJUaHJlYWQ+IG1UaHJlYWQ7CiAKLSAgICB2b2lkIGRpc3BhdGNoKGNvbnN0IG9teF9tZXNzYWdlICZtc2cpOworICAgIHZvaWQgZGlzcGF0Y2goc3RkOjpsaXN0PG9teF9tZXNzYWdlPiAmbWVzc2FnZXMpOwogCiAgICAgQ2FsbGJhY2tEaXNwYXRjaGVyKGNvbnN0IENhbGxiYWNrRGlzcGF0Y2hlciAmKTsKICAgICBDYWxsYmFja0Rpc3BhdGNoZXIgJm9wZXJhdG9yPShjb25zdCBDYWxsYmFja0Rpc3BhdGNoZXIgJik7CkBAIC0xMDgsMjQgKzExNCwyNiBAQAogICAgIH0KIH0KIAotdm9pZCBPTVg6OkNhbGxiYWNrRGlzcGF0Y2hlcjo6cG9zdChjb25zdCBvbXhfbWVzc2FnZSAmbXNnKSB7Cit2b2lkIE9NWDo6Q2FsbGJhY2tEaXNwYXRjaGVyOjpwb3N0KGNvbnN0IG9teF9tZXNzYWdlICZtc2csIGJvb2wgcmVhbFRpbWUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgbVF1ZXVlLnB1c2hfYmFjayhtc2cpOwotICAgIG1RdWV1ZUNoYW5nZWQuc2lnbmFsKCk7CisgICAgaWYgKHJlYWxUaW1lKSB7CisgICAgICAgIG1RdWV1ZUNoYW5nZWQuc2lnbmFsKCk7CisgICAgfQogfQogCi12b2lkIE9NWDo6Q2FsbGJhY2tEaXNwYXRjaGVyOjpkaXNwYXRjaChjb25zdCBvbXhfbWVzc2FnZSAmbXNnKSB7Cit2b2lkIE9NWDo6Q2FsbGJhY2tEaXNwYXRjaGVyOjpkaXNwYXRjaChzdGQ6Omxpc3Q8b214X21lc3NhZ2U+ICZtZXNzYWdlcykgewogICAgIGlmIChtT3duZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HVigiV291bGQgaGF2ZSBkaXNwYXRjaGVkIGEgbWVzc2FnZSB0byBhIG5vZGUgdGhhdCdzIGFscmVhZHkgZ29uZS4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBtT3duZXItPm9uTWVzc2FnZShtc2cpOworICAgIG1Pd25lci0+b25NZXNzYWdlcyhtZXNzYWdlcyk7CiB9CiAKIGJvb2wgT01YOjpDYWxsYmFja0Rpc3BhdGNoZXI6Omxvb3AoKSB7CiAgICAgZm9yICg7OykgewotICAgICAgICBvbXhfbWVzc2FnZSBtc2c7CisgICAgICAgIHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT4gbWVzc2FnZXM7CiAKICAgICAgICAgewogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKQEAgLTEzNywxMSArMTQ1LDEwIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1zZyA9ICptUXVldWUuYmVnaW4oKTsKLSAgICAgICAgICAgIG1RdWV1ZS5lcmFzZShtUXVldWUuYmVnaW4oKSk7CisgICAgICAgICAgICBtZXNzYWdlcy5zd2FwKG1RdWV1ZSk7CiAgICAgICAgIH0KIAotICAgICAgICBkaXNwYXRjaChtc2cpOworICAgICAgICBkaXNwYXRjaChtZXNzYWdlcyk7CiAgICAgfQogCiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjQzLDExICsyNTAsMTEgQEAKICAgICAgICAgICAgIGluc3RhbmNlLCAmaGFuZGxlKTsKIAogICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICBBTE9HRSgiRkFJTEVEIHRvIGFsbG9jYXRlIG9teCBjb21wb25lbnQgJyVzJyIsIG5hbWUpOworICAgICAgICBBTE9HRSgiRkFJTEVEIHRvIGFsbG9jYXRlIG9teCBjb21wb25lbnQgJyVzJyBlcnI9JXMoJSN4KSIsIG5hbWUsIGFzU3RyaW5nKGVyciksIGVycik7CiAKICAgICAgICAgaW5zdGFuY2UtPm9uR2V0SGFuZGxlRmFpbGVkKCk7CiAKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKICAgICB9CiAKICAgICAqbm9kZSA9IG1ha2VOb2RlSUQoaW5zdGFuY2UpOwpAQCAtMzQxLDggKzM0OCw4IEBACiB9CiAKIHN0YXR1c190IE9NWDo6c3RvcmVNZXRhRGF0YUluQnVmZmVycygKLSAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSkgewotICAgIHJldHVybiBmaW5kSW5zdGFuY2Uobm9kZSktPnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMocG9ydF9pbmRleCwgZW5hYmxlKTsKKyAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIE9NWF9CT09MIGVuYWJsZSwgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKSB7CisgICAgcmV0dXJuIGZpbmRJbnN0YW5jZShub2RlKS0+c3RvcmVNZXRhRGF0YUluQnVmZmVycyhwb3J0X2luZGV4LCBlbmFibGUsIHR5cGUpOwogfQogCiBzdGF0dXNfdCBPTVg6OnByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKApAQCAtMzYxLDkgKzM2OCw5IEBACiAKIHN0YXR1c190IE9NWDo6dXNlQnVmZmVyKAogICAgICAgICBub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgY29uc3Qgc3A8SU1lbW9yeT4gJnBhcmFtcywKLSAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIE9NWF9CT09MIGNyb3NzUHJvY2VzcykgeworICAgICAgICBidWZmZXJfaWQgKmJ1ZmZlciwgT01YX1UzMiBhbGxvdHRlZFNpemUsIE9NWF9CT09MIGNyb3NzUHJvY2VzcykgewogICAgIHJldHVybiBmaW5kSW5zdGFuY2Uobm9kZSktPnVzZUJ1ZmZlcigKLSAgICAgICAgICAgIHBvcnRfaW5kZXgsIHBhcmFtcywgYnVmZmVyLCBjcm9zc1Byb2Nlc3MpOworICAgICAgICAgICAgcG9ydF9pbmRleCwgcGFyYW1zLCBidWZmZXIsIGFsbG90dGVkU2l6ZSwgY3Jvc3NQcm9jZXNzKTsKIH0KIAogc3RhdHVzX3QgT01YOjp1c2VHcmFwaGljQnVmZmVyKApAQCAtMzgyLDExICszODksMjUgQEAKIAogc3RhdHVzX3QgT01YOjpjcmVhdGVJbnB1dFN1cmZhY2UoCiAgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LAotICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIpIHsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyLCBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUpIHsKICAgICByZXR1cm4gZmluZEluc3RhbmNlKG5vZGUpLT5jcmVhdGVJbnB1dFN1cmZhY2UoCi0gICAgICAgICAgICBwb3J0X2luZGV4LCBidWZmZXJQcm9kdWNlcik7CisgICAgICAgICAgICBwb3J0X2luZGV4LCBidWZmZXJQcm9kdWNlciwgdHlwZSk7CiB9CiAKK3N0YXR1c190IE9NWDo6Y3JlYXRlUGVyc2lzdGVudElucHV0U3VyZmFjZSgKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKmJ1ZmZlclByb2R1Y2VyLAorICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAqYnVmZmVyQ29uc3VtZXIpIHsKKyAgICByZXR1cm4gT01YTm9kZUluc3RhbmNlOjpjcmVhdGVQZXJzaXN0ZW50SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgYnVmZmVyUHJvZHVjZXIsIGJ1ZmZlckNvbnN1bWVyKTsKK30KKworc3RhdHVzX3QgT01YOjpzZXRJbnB1dFN1cmZhY2UoCisgICAgICAgIG5vZGVfaWQgbm9kZSwgT01YX1UzMiBwb3J0X2luZGV4LAorICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiAmYnVmZmVyQ29uc3VtZXIsIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSkgeworICAgIHJldHVybiBmaW5kSW5zdGFuY2Uobm9kZSktPnNldElucHV0U3VyZmFjZShwb3J0X2luZGV4LCBidWZmZXJDb25zdW1lciwgdHlwZSk7Cit9CisKKwogc3RhdHVzX3QgT01YOjpzaWduYWxFbmRPZklucHV0U3RyZWFtKG5vZGVfaWQgbm9kZSkgewogICAgIHJldHVybiBmaW5kSW5zdGFuY2Uobm9kZSktPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKIH0KQEAgLTQwMCw5ICs0MjEsOSBAQAogCiBzdGF0dXNfdCBPTVg6OmFsbG9jYXRlQnVmZmVyV2l0aEJhY2t1cCgKICAgICAgICAgbm9kZV9pZCBub2RlLCBPTVhfVTMyIHBvcnRfaW5kZXgsIGNvbnN0IHNwPElNZW1vcnk+ICZwYXJhbXMsCi0gICAgICAgIGJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfQk9PTCBjcm9zc1Byb2Nlc3MpIHsKKyAgICAgICAgYnVmZmVyX2lkICpidWZmZXIsIE9NWF9VMzIgYWxsb3R0ZWRTaXplLCBPTVhfQk9PTCBjcm9zc1Byb2Nlc3MpIHsKICAgICByZXR1cm4gZmluZEluc3RhbmNlKG5vZGUpLT5hbGxvY2F0ZUJ1ZmZlcldpdGhCYWNrdXAoCi0gICAgICAgICAgICBwb3J0X2luZGV4LCBwYXJhbXMsIGJ1ZmZlciwgY3Jvc3NQcm9jZXNzKTsKKyAgICAgICAgICAgIHBvcnRfaW5kZXgsIHBhcmFtcywgYnVmZmVyLCBhbGxvdHRlZFNpemUsIGNyb3NzUHJvY2Vzcyk7CiB9CiAKIHN0YXR1c190IE9NWDo6ZnJlZUJ1ZmZlcihub2RlX2lkIG5vZGUsIE9NWF9VMzIgcG9ydF9pbmRleCwgYnVmZmVyX2lkIGJ1ZmZlcikgewpAQCAtNDEwLDE3ICs0MzEsMTcgQEAKICAgICAgICAgICAgIHBvcnRfaW5kZXgsIGJ1ZmZlcik7CiB9CiAKLXN0YXR1c190IE9NWDo6ZmlsbEJ1ZmZlcihub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIpIHsKLSAgICByZXR1cm4gZmluZEluc3RhbmNlKG5vZGUpLT5maWxsQnVmZmVyKGJ1ZmZlcik7CitzdGF0dXNfdCBPTVg6OmZpbGxCdWZmZXIobm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyLCBpbnQgZmVuY2VGZCkgeworICAgIHJldHVybiBmaW5kSW5zdGFuY2Uobm9kZSktPmZpbGxCdWZmZXIoYnVmZmVyLCBmZW5jZUZkKTsKIH0KIAogc3RhdHVzX3QgT01YOjplbXB0eUJ1ZmZlcigKICAgICAgICAgbm9kZV9pZCBub2RlLAogICAgICAgICBidWZmZXJfaWQgYnVmZmVyLAogICAgICAgICBPTVhfVTMyIHJhbmdlX29mZnNldCwgT01YX1UzMiByYW5nZV9sZW5ndGgsCi0gICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXApIHsKKyAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCwgaW50IGZlbmNlRmQpIHsKICAgICByZXR1cm4gZmluZEluc3RhbmNlKG5vZGUpLT5lbXB0eUJ1ZmZlcigKLSAgICAgICAgICAgIGJ1ZmZlciwgcmFuZ2Vfb2Zmc2V0LCByYW5nZV9sZW5ndGgsIGZsYWdzLCB0aW1lc3RhbXApOworICAgICAgICAgICAgYnVmZmVyLCByYW5nZV9vZmZzZXQsIHJhbmdlX2xlbmd0aCwgZmxhZ3MsIHRpbWVzdGFtcCwgZmVuY2VGZCk7CiB9CiAKIHN0YXR1c190IE9NWDo6Z2V0RXh0ZW5zaW9uSW5kZXgoCkBAIC00NDUsMzEgKzQ2Niw1NiBAQAogICAgICAgICBPTVhfSU4gT01YX0VWRU5UVFlQRSBlRXZlbnQsCiAgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5EYXRhMSwKICAgICAgICAgT01YX0lOIE9NWF9VMzIgbkRhdGEyLAotICAgICAgICBPTVhfSU4gT01YX1BUUiAvKiBwRXZlbnREYXRhICovKSB7CisgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBFdmVudERhdGEpIHsKICAgICBBTE9HVigiT25FdmVudCglZCwgJSIgUFJJdTMyIiwgJSIgUFJJdTMyICIpIiwgZUV2ZW50LCBuRGF0YTEsIG5EYXRhMik7CiAKICAgICAvLyBGb3J3YXJkIHRvIE9NWE5vZGVJbnN0YW5jZS4KICAgICBmaW5kSW5zdGFuY2Uobm9kZSktPm9uRXZlbnQoZUV2ZW50LCBuRGF0YTEsIG5EYXRhMik7CiAKKyAgICBzcDxPTVg6OkNhbGxiYWNrRGlzcGF0Y2hlcj4gZGlzcGF0Y2hlciA9IGZpbmREaXNwYXRjaGVyKG5vZGUpOworCisgICAgLy8gb3V0cHV0IHJlbmRlcmVkIGV2ZW50cyBhcmUgbm90IHByb2Nlc3NlZCBhcyByZWd1bGFyIGV2ZW50cyB1bnRpbCB0aGV5IGhpdCB0aGUgb2JzZXJ2ZXIKKyAgICBpZiAoZUV2ZW50ID09IE9NWF9FdmVudE91dHB1dFJlbmRlcmVkKSB7CisgICAgICAgIGlmIChwRXZlbnREYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9jZXNzIGRhdGEgZnJvbSBhcnJheQorICAgICAgICBPTVhfVklERU9fUkVOREVSRVZFTlRUWVBFICpyZW5kZXJEYXRhID0gKE9NWF9WSURFT19SRU5ERVJFVkVOVFRZUEUgKilwRXZlbnREYXRhOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5EYXRhMTsgKytpKSB7CisgICAgICAgICAgICBvbXhfbWVzc2FnZSBtc2c7CisgICAgICAgICAgICBtc2cudHlwZSA9IG9teF9tZXNzYWdlOjpGUkFNRV9SRU5ERVJFRDsKKyAgICAgICAgICAgIG1zZy5ub2RlID0gbm9kZTsKKyAgICAgICAgICAgIG1zZy5mZW5jZUZkID0gLTE7CisgICAgICAgICAgICBtc2cudS5yZW5kZXJfZGF0YS50aW1lc3RhbXAgPSByZW5kZXJEYXRhW2ldLm5NZWRpYVRpbWVVczsKKyAgICAgICAgICAgIG1zZy51LnJlbmRlcl9kYXRhLm5hbm9UaW1lID0gcmVuZGVyRGF0YVtpXS5uU3lzdGVtVGltZU5zOworCisgICAgICAgICAgICBkaXNwYXRjaGVyLT5wb3N0KG1zZywgZmFsc2UgLyogcmVhbFRpbWUgKi8pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgIH0KKwogICAgIG9teF9tZXNzYWdlIG1zZzsKICAgICBtc2cudHlwZSA9IG9teF9tZXNzYWdlOjpFVkVOVDsKICAgICBtc2cubm9kZSA9IG5vZGU7CisgICAgbXNnLmZlbmNlRmQgPSAtMTsKICAgICBtc2cudS5ldmVudF9kYXRhLmV2ZW50ID0gZUV2ZW50OwogICAgIG1zZy51LmV2ZW50X2RhdGEuZGF0YTEgPSBuRGF0YTE7CiAgICAgbXNnLnUuZXZlbnRfZGF0YS5kYXRhMiA9IG5EYXRhMjsKIAotICAgIGZpbmREaXNwYXRjaGVyKG5vZGUpLT5wb3N0KG1zZyk7CisgICAgZGlzcGF0Y2hlci0+cG9zdChtc2csIHRydWUgLyogcmVhbFRpbWUgKi8pOwogCiAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiB9CiAKIE9NWF9FUlJPUlRZUEUgT01YOjpPbkVtcHR5QnVmZmVyRG9uZSgKLSAgICAgICAgbm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyLCBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXIpIHsKKyAgICAgICAgbm9kZV9pZCBub2RlLCBidWZmZXJfaWQgYnVmZmVyLCBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXIsIGludCBmZW5jZUZkKSB7CiAgICAgQUxPR1YoIk9uRW1wdHlCdWZmZXJEb25lIGJ1ZmZlcj0lcCIsIHBCdWZmZXIpOwogCiAgICAgb214X21lc3NhZ2UgbXNnOwogICAgIG1zZy50eXBlID0gb214X21lc3NhZ2U6OkVNUFRZX0JVRkZFUl9ET05FOwogICAgIG1zZy5ub2RlID0gbm9kZTsKKyAgICBtc2cuZmVuY2VGZCA9IGZlbmNlRmQ7CiAgICAgbXNnLnUuYnVmZmVyX2RhdGEuYnVmZmVyID0gYnVmZmVyOwogCiAgICAgZmluZERpc3BhdGNoZXIobm9kZSktPnBvc3QobXNnKTsKQEAgLTQ3OCwxMiArNTI0LDEzIEBACiB9CiAKIE9NWF9FUlJPUlRZUEUgT01YOjpPbkZpbGxCdWZmZXJEb25lKAotICAgICAgICBub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIsIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlcikgeworICAgICAgICBub2RlX2lkIG5vZGUsIGJ1ZmZlcl9pZCBidWZmZXIsIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlciwgaW50IGZlbmNlRmQpIHsKICAgICBBTE9HVigiT25GaWxsQnVmZmVyRG9uZSBidWZmZXI9JXAiLCBwQnVmZmVyKTsKIAogICAgIG9teF9tZXNzYWdlIG1zZzsKICAgICBtc2cudHlwZSA9IG9teF9tZXNzYWdlOjpGSUxMX0JVRkZFUl9ET05FOwogICAgIG1zZy5ub2RlID0gbm9kZTsKKyAgICBtc2cuZmVuY2VGZCA9IGZlbmNlRmQ7CiAgICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuYnVmZmVyID0gYnVmZmVyOwogICAgIG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnJhbmdlX29mZnNldCA9IHBCdWZmZXItPm5PZmZzZXQ7CiAgICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEucmFuZ2VfbGVuZ3RoID0gcEJ1ZmZlci0+bkZpbGxlZExlbjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKaW5kZXggNTFhYmM3Ni4uMWU3NmUwMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxndWkvQnVmZmVyUXVldWUuaD4KICNpbmNsdWRlIDxIYXJkd2FyZUFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KIAogI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KQEAgLTc1LDExICs3NiwxMSBAQAogI2RlZmluZSBTSU1QTEVfTkVXX0JVRkZFUihidWZmZXJfaWQsIHBvcnQsIHNpemUsIGRhdGEpIFwKICAgICBORVdfQlVGRkVSX0ZNVChidWZmZXJfaWQsIHBvcnQsICIlenVAJXAiLCAoc2l6ZSksIChkYXRhKSkKIAotI2RlZmluZSBFTVBUWV9CVUZGRVIoYWRkciwgaGVhZGVyKSAiJSN4IFsldUAlcF0iLCBcCi0gICAgKGFkZHIpLCAoaGVhZGVyKS0+bkFsbG9jTGVuLCAoaGVhZGVyKS0+cEJ1ZmZlcgotI2RlZmluZSBGVUxMX0JVRkZFUihhZGRyLCBoZWFkZXIpICIlIyIgUFJJeFBUUiAiIFsldUAlcCAoJXUuLisldSkgZj0leCB0cz0lbGxkXSIsIFwKKyNkZWZpbmUgRU1QVFlfQlVGRkVSKGFkZHIsIGhlYWRlciwgZmVuY2VGZCkgIiUjeCBbJXVAJXAgZmM9JWRdIiwgXAorICAgIChhZGRyKSwgKGhlYWRlciktPm5BbGxvY0xlbiwgKGhlYWRlciktPnBCdWZmZXIsIChmZW5jZUZkKQorI2RlZmluZSBGVUxMX0JVRkZFUihhZGRyLCBoZWFkZXIsIGZlbmNlRmQpICIlIyIgUFJJeFBUUiAiIFsldUAlcCAoJXUuLisldSkgZj0leCB0cz0lbGxkIGZjPSVkXSIsIFwKICAgICAoaW50cHRyX3QpKGFkZHIpLCAoaGVhZGVyKS0+bkFsbG9jTGVuLCAoaGVhZGVyKS0+cEJ1ZmZlciwgXAotICAgIChoZWFkZXIpLT5uT2Zmc2V0LCAoaGVhZGVyKS0+bkZpbGxlZExlbiwgKGhlYWRlciktPm5GbGFncywgKGhlYWRlciktPm5UaW1lU3RhbXAKKyAgICAoaGVhZGVyKS0+bk9mZnNldCwgKGhlYWRlciktPm5GaWxsZWRMZW4sIChoZWFkZXIpLT5uRmxhZ3MsIChoZWFkZXIpLT5uVGltZVN0YW1wLCAoZmVuY2VGZCkKIAogI2RlZmluZSBXSVRIX1NUQVRTX1dSQVBQRVIoZm10LCAuLi4pIGZtdCAiIHsgSU49JXp1LyV6dSBPVVQ9JXp1LyV6dSB9IiwgIyNfX1ZBX0FSR1NfXywgXAogICAgIG1JbnB1dEJ1ZmZlcnNXaXRoQ29kZWMuc2l6ZSgpLCBtTnVtUG9ydEJ1ZmZlcnNba1BvcnRJbmRleElucHV0XSwgXApAQCAtMTMxLDkgKzEzMiwxMCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgbWVtY3B5KChPTVhfVTggKiltTWVtLT5wb2ludGVyKCkgKyBoZWFkZXItPm5PZmZzZXQsCi0gICAgICAgICAgICAgICAgaGVhZGVyLT5wQnVmZmVyICsgaGVhZGVyLT5uT2Zmc2V0LAotICAgICAgICAgICAgICAgIGhlYWRlci0+bkZpbGxlZExlbik7CisgICAgICAgIC8vIGNoZWNrIGNvbXBvbmVudCByZXR1cm5zIHByb3BlciByYW5nZQorICAgICAgICBzcDxBQnVmZmVyPiBjb2RlYyA9IGdldEJ1ZmZlcihoZWFkZXIsIGZhbHNlIC8qIGJhY2t1cCAqLywgdHJ1ZSAvKiBsaW1pdCAqLyk7CisKKyAgICAgICAgbWVtY3B5KChPTVhfVTggKiltTWVtLT5wb2ludGVyKCkgKyBoZWFkZXItPm5PZmZzZXQsIGNvZGVjLT5kYXRhKCksIGNvZGVjLT5zaXplKCkpOwogICAgIH0KIAogICAgIHZvaWQgQ29weVRvT01YKGNvbnN0IE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIpIHsKQEAgLTE0Niw2ICsxNDgsMjkgQEAKICAgICAgICAgICAgICAgICBoZWFkZXItPm5GaWxsZWRMZW4pOwogICAgIH0KIAorICAgIC8vIHJldHVybiBlaXRoZXIgdGhlIGNvZGVjIG9yIHRoZSBiYWNrdXAgYnVmZmVyCisgICAgc3A8QUJ1ZmZlcj4gZ2V0QnVmZmVyKGNvbnN0IE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIsIGJvb2wgYmFja3VwLCBib29sIGxpbWl0KSB7CisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZjsKKyAgICAgICAgaWYgKGJhY2t1cCAmJiBtTWVtICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGJ1ZiA9IG5ldyBBQnVmZmVyKG1NZW0tPnBvaW50ZXIoKSwgbU1lbS0+c2l6ZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZiA9IG5ldyBBQnVmZmVyKGhlYWRlci0+cEJ1ZmZlciwgaGVhZGVyLT5uQWxsb2NMZW4pOworICAgICAgICB9CisgICAgICAgIGlmIChsaW1pdCkgeworICAgICAgICAgICAgaWYgKGhlYWRlci0+bk9mZnNldCArIGhlYWRlci0+bkZpbGxlZExlbiA+IGhlYWRlci0+bk9mZnNldAorICAgICAgICAgICAgICAgICAgICAmJiBoZWFkZXItPm5PZmZzZXQgKyBoZWFkZXItPm5GaWxsZWRMZW4gPD0gaGVhZGVyLT5uQWxsb2NMZW4pIHsKKyAgICAgICAgICAgICAgICBidWYtPnNldFJhbmdlKGhlYWRlci0+bk9mZnNldCwgaGVhZGVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmLT5zZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIGJvb2wgY29weVRvT214KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNvcHlUb09teDsKKyAgICB9CisKICAgICB2b2lkIHNldEdyYXBoaWNCdWZmZXIoY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmdyYXBoaWNCdWZmZXIpIHsKICAgICAgICAgbUdyYXBoaWNCdWZmZXIgPSBncmFwaGljQnVmZmVyOwogICAgIH0KQEAgLTIwNCw4ICsyMjksOCBAQAogICAgIG1OdW1Qb3J0QnVmZmVyc1sxXSA9IDA7CiAgICAgbURlYnVnTGV2ZWxCdW1wUGVuZGluZ0J1ZmZlcnNbMF0gPSAwOwogICAgIG1EZWJ1Z0xldmVsQnVtcFBlbmRpbmdCdWZmZXJzWzFdID0gMDsKLSAgICBtVXNpbmdNZXRhZGF0YVswXSA9IGZhbHNlOwotICAgIG1Vc2luZ01ldGFkYXRhWzFdID0gZmFsc2U7CisgICAgbU1ldGFkYXRhVHlwZVswXSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVJbnZhbGlkOworICAgIG1NZXRhZGF0YVR5cGVbMV0gPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZDsKICAgICBtSXNTZWN1cmUgPSBBU3RyaW5nKG5hbWUpLmVuZHNXaXRoKCIuc2VjdXJlIik7CiB9CiAKQEAgLTI0NSwxMyArMjcwLDE1IEBACiAgICAgcmV0dXJuIG1Ob2RlSUQ7CiB9CiAKLXN0YXRpYyBzdGF0dXNfdCBTdGF0dXNGcm9tT01YRXJyb3IoT01YX0VSUk9SVFlQRSBlcnIpIHsKK3N0YXR1c190IFN0YXR1c0Zyb21PTVhFcnJvcihPTVhfRVJST1JUWVBFIGVycikgewogICAgIHN3aXRjaCAoZXJyKSB7CiAgICAgICAgIGNhc2UgT01YX0Vycm9yTm9uZToKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgY2FzZSBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmc6CiAgICAgICAgIGNhc2UgT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDoKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgY2FzZSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM6CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQpAQCAtMzYzLDkgKzM5MCw4IEBACiAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6c2VuZENvbW1hbmQoCiAgICAgICAgIE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9TMzIgcGFyYW0pIHsKLSAgICBpZiAoY21kID09IE9NWF9Db21tYW5kU3RhdGVTZXQgJiYgcGFyYW0gIT0gT01YX1N0YXRlSWRsZSkgewotICAgICAgICAvLyBOb3JtYWxseSB0aGVyZSBhcmUgbm8gY29uZmlndXJhdGlvbnMgcGFzdCBmaXJzdCBTdGF0ZVNldDsgaG93ZXZlciwgT01YQ29kZWMgc3VwcG9ydHMKLSAgICAgICAgLy8gbWV0YSBjb25maWd1cmF0aW9uIHBhc3QgU3RhdGVzZXQ6SWRsZS4KKyAgICBpZiAoY21kID09IE9NWF9Db21tYW5kU3RhdGVTZXQpIHsKKyAgICAgICAgLy8gVGhlcmUgYXJlIG5vIGNvbmZpZ3VyYXRpb25zIHBhc3QgZmlyc3QgU3RhdGVTZXQgY29tbWFuZC4KICAgICAgICAgbVNhaWxlZCA9IHRydWU7CiAgICAgfQogICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IGJ1ZmZlclNvdXJjZShnZXRHcmFwaGljQnVmZmVyU291cmNlKCkpOwpAQCAtNDA1LDExICs0MzEsMTMgQEAKICAgICAvLyB0aGVzZSBleHRlbnNpb25zIGNhbiBvbmx5IGJlIHVzZWQgZnJvbSBPTVhOb2RlSW5zdGFuY2UsIG5vdCBieSBjbGllbnRzIGRpcmVjdGx5LgogICAgIHN0YXRpYyBjb25zdCBjaGFyICpyZXN0cmljdGVkX2V4dGVuc2lvbnNbXSA9IHsKICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzIiwKKyAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZUFOV0J1ZmZlckluTWV0YWRhdGEiLAogICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrIiwKICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5jb25maWd1cmVWaWRlb1R1bm5lbE1vZGUiLAogICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnVzZUFuZHJvaWROYXRpdmVCdWZmZXIyIiwKICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC51c2VBbmRyb2lkTmF0aXZlQnVmZmVyIiwKICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5lbmFibGVBbmRyb2lkTmF0aXZlQnVmZmVycyIsCisgICAgICAgICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguYWxsb2NhdGVOYXRpdmVIYW5kbGUiLAogICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmdldEFuZHJvaWROYXRpdmVCdWZmZXJVc2FnZSIsCiAgICAgfTsKIApAQCAtNDI0LDcgKzQ1Miw3IEBACiAgICAgICAgICAgICB8fCAoaW5kZXggPiAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhFeHRWaWRlb1N0YXJ0VW51c2VkCiAgICAgICAgICAgICAgICAgICAgICYmIGluZGV4IDw9IChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtU2xpY2VTZWdtZW50cykKICAgICAgICAgICAgIHx8IChpbmRleCA+IChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleEV4dE90aGVyU3RhcnRVbnVzZWQKLSAgICAgICAgICAgICAgICAgICAgJiYgaW5kZXggPD0gKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4Q29uZmlnQXV0b0ZyYW1lcmF0ZUNvbnZlcnNpb24pKSB7CisgICAgICAgICAgICAgICAgICAgICYmIGluZGV4IDw9IChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQ29uc3VtZXJVc2FnZUJpdHMpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTU3NiwyMCArNjA0LDE0IEBACiB9CiAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6c3RvcmVNZXRhRGF0YUluQnVmZmVycygKLSAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCi0gICAgICAgIE9NWF9CT09MIGVuYWJsZSkgeworICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLCBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwogICAgIENMT0dfQ09ORklHKHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMsICIlczoldSBlbjolZCIsIHBvcnRTdHJpbmcocG9ydEluZGV4KSwgcG9ydEluZGV4LCBlbmFibGUpOwotICAgIHJldHVybiBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzX2woCi0gICAgICAgICAgICBwb3J0SW5kZXgsIGVuYWJsZSwKLSAgICAgICAgICAgIE9NWF9GQUxTRSAvKiB1c2VHcmFwaGljQnVmZmVyICovLCBOVUxMIC8qIHVzaW5nR3JhcGhpY0J1ZmZlckluTWV0YWRhdGEgKi8pOworICAgIHJldHVybiBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzX2wocG9ydEluZGV4LCBlbmFibGUsIHR5cGUpOwogfQogCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNfbCgKLSAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsCi0gICAgICAgIE9NWF9CT09MIGVuYWJsZSwKLSAgICAgICAgT01YX0JPT0wgdXNlR3JhcGhpY0J1ZmZlciwKLSAgICAgICAgT01YX0JPT0wgKnVzaW5nR3JhcGhpY0J1ZmZlckluTWV0YWRhdGEpIHsKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIGVuYWJsZSwgTWV0YWRhdGFCdWZmZXJUeXBlICp0eXBlKSB7CiAgICAgaWYgKG1TYWlsZWQpIHsKICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyOTQyMjAyMCIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC02MDMsNTAgKzYyNSw1NyBAQAogICAgIE9NWF9TVFJJTkcgbmFtZSA9IGNvbnN0X2Nhc3Q8T01YX1NUUklORz4oCiAgICAgICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMiKTsKIAotICAgIE9NWF9TVFJJTkcgZ3JhcGhpY0J1ZmZlck5hbWUgPSBjb25zdF9jYXN0PE9NWF9TVFJJTkc+KAotICAgICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZUdyYXBoaWNCdWZmZXJJbk1ldGFEYXRhIik7Ci0gICAgaWYgKHVzaW5nR3JhcGhpY0J1ZmZlckluTWV0YWRhdGEgPT0gTlVMTCkgewotICAgICAgICB1c2luZ0dyYXBoaWNCdWZmZXJJbk1ldGFkYXRhID0gJnVzZUdyYXBoaWNCdWZmZXI7Ci0gICAgfQorICAgIE9NWF9TVFJJTkcgbmF0aXZlQnVmZmVyTmFtZSA9IGNvbnN0X2Nhc3Q8T01YX1NUUklORz4oCisgICAgICAgICAgICAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlQU5XQnVmZmVySW5NZXRhZGF0YSIpOworICAgIE1ldGFkYXRhQnVmZmVyVHlwZSBuZWdvdGlhdGVkVHlwZTsKIAotICAgIE9NWF9FUlJPUlRZUEUgZXJyID0KLSAgICAgICAgKHVzZUdyYXBoaWNCdWZmZXIgJiYgcG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCkKLSAgICAgICAgICAgICAgICA/IE9NWF9HZXRFeHRlbnNpb25JbmRleChtSGFuZGxlLCBncmFwaGljQnVmZmVyTmFtZSwgJmluZGV4KQotICAgICAgICAgICAgICAgIDogT01YX0Vycm9yQmFkUGFyYW1ldGVyOwotICAgIGlmIChlcnIgPT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICAqdXNpbmdHcmFwaGljQnVmZmVySW5NZXRhZGF0YSA9IE9NWF9UUlVFOwotICAgICAgICBuYW1lID0gZ3JhcGhpY0J1ZmZlck5hbWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gT01YX0dldEV4dGVuc2lvbkluZGV4KG1IYW5kbGUsIG5hbWUsICZpbmRleCk7Ci0gICAgfQorICAgIFN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNQYXJhbXMgcGFyYW1zOworICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CisgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CisgICAgcGFyYW1zLmJTdG9yZU1ldGFEYXRhID0gZW5hYmxlOwogCisgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfR2V0RXh0ZW5zaW9uSW5kZXgobUhhbmRsZSwgbmF0aXZlQnVmZmVyTmFtZSwgJmluZGV4KTsKICAgICBPTVhfRVJST1JUWVBFIHhlcnIgPSBlcnI7CiAgICAgaWYgKGVyciA9PSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgIFN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNQYXJhbXMgcGFyYW1zOwotICAgICAgICBJbml0T01YUGFyYW1zKCZwYXJhbXMpOwotICAgICAgICBwYXJhbXMublBvcnRJbmRleCA9IHBvcnRJbmRleDsKLSAgICAgICAgcGFyYW1zLmJTdG9yZU1ldGFEYXRhID0gZW5hYmxlOwotCiAgICAgICAgIGVyciA9IE9NWF9TZXRQYXJhbWV0ZXIobUhhbmRsZSwgaW5kZXgsICZwYXJhbXMpOworICAgICAgICBpZiAoZXJyID09IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIG5hbWUgPSBuYXRpdmVCdWZmZXJOYW1lOyAvLyBzZXQgbmFtZSBmb3IgZGVidWdnaW5nCisgICAgICAgICAgICBuZWdvdGlhdGVkVHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXI7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGVyciA9IE9NWF9HZXRFeHRlbnNpb25JbmRleChtSGFuZGxlLCBuYW1lLCAmaW5kZXgpOworICAgICAgICB4ZXJyID0gZXJyOworICAgICAgICBpZiAoZXJyID09IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIG5lZ290aWF0ZWRUeXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2U7CisgICAgICAgICAgICBlcnIgPSBPTVhfU2V0UGFyYW1ldGVyKG1IYW5kbGUsIGluZGV4LCAmcGFyYW1zKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIGRvbid0IGxvZyBsb3VkIGVycm9yIGlmIGNvbXBvbmVudCBkb2VzIG5vdCBzdXBwb3J0IG1ldGFkYXRhIG1vZGUgb24gdGhlIG91dHB1dAogICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICAqdXNpbmdHcmFwaGljQnVmZmVySW5NZXRhZGF0YSA9IE9NWF9GQUxTRTsKLSAgICAgICAgaWYgKGVuYWJsZSkgewotICAgICAgICAgICAgbVVzaW5nTWV0YWRhdGFbcG9ydEluZGV4XSA9IGZhbHNlOwotICAgICAgICB9CiAgICAgICAgIGlmIChlcnIgPT0gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleCAmJiBwb3J0SW5kZXggPT0ga1BvcnRJbmRleE91dHB1dCkgewogICAgICAgICAgICAgQ0xPR1coImNvbXBvbmVudCBkb2VzIG5vdCBzdXBwb3J0IG1ldGFkYXRhIG1vZGU7IHVzaW5nIGZhbGxiYWNrIik7CiAgICAgICAgIH0gZWxzZSBpZiAoeGVyciAhPSBPTVhfRXJyb3JOb25lKSB7CiAgICAgICAgICAgICBDTE9HX0VSUk9SKGdldEV4dGVuc2lvbkluZGV4LCB4ZXJyLCAiJXMiLCBuYW1lKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENMT0dfRVJST1Ioc2V0UGFyYW1ldGVyLCBlcnIsICIlcyglI3gpOiAlczoldSBlbj0lZCBHQj0lZCIsIG5hbWUsIGluZGV4LAotICAgICAgICAgICAgICAgICAgICBwb3J0U3RyaW5nKHBvcnRJbmRleCksIHBvcnRJbmRleCwgZW5hYmxlLCB1c2VHcmFwaGljQnVmZmVyKTsKKyAgICAgICAgICAgIENMT0dfRVJST1Ioc2V0UGFyYW1ldGVyLCBlcnIsICIlcyglI3gpOiAlczoldSBlbj0lZCB0eXBlPSVkIiwgbmFtZSwgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgIHBvcnRTdHJpbmcocG9ydEluZGV4KSwgcG9ydEluZGV4LCBlbmFibGUsIG5lZ290aWF0ZWRUeXBlKTsKICAgICAgICAgfQorICAgICAgICBuZWdvdGlhdGVkVHlwZSA9IG1NZXRhZGF0YVR5cGVbcG9ydEluZGV4XTsKICAgICB9IGVsc2UgewotICAgICAgICBtVXNpbmdNZXRhZGF0YVtwb3J0SW5kZXhdID0gZW5hYmxlOworICAgICAgICBpZiAoIWVuYWJsZSkgeworICAgICAgICAgICAgbmVnb3RpYXRlZFR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZDsKKyAgICAgICAgfQorICAgICAgICBtTWV0YWRhdGFUeXBlW3BvcnRJbmRleF0gPSBuZWdvdGlhdGVkVHlwZTsKICAgICB9CisgICAgQ0xPR19DT05GSUcoc3RvcmVNZXRhRGF0YUluQnVmZmVycywgIiVzOiV1IG5lZ290aWF0ZWQgJXM6JWQiLAorICAgICAgICAgICAgcG9ydFN0cmluZyhwb3J0SW5kZXgpLCBwb3J0SW5kZXgsIGFzU3RyaW5nKG5lZ290aWF0ZWRUeXBlKSwgbmVnb3RpYXRlZFR5cGUpOworCisgICAgaWYgKHR5cGUgIT0gTlVMTCkgeworICAgICAgICAqdHlwZSA9IG5lZ290aWF0ZWRUeXBlOworICAgIH0KKwogICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKIH0KIApAQCAtNzMyLDI2ICs3NjEsMzEgQEAKIAogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjp1c2VCdWZmZXIoCiAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAotICAgICAgICBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfQk9PTCBjcm9zc1Byb2Nlc3MpIHsKKyAgICAgICAgT01YOjpidWZmZXJfaWQgKmJ1ZmZlciwgT01YX1UzMiBhbGxvdHRlZFNpemUsIE9NWF9CT09MIGNyb3NzUHJvY2VzcykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKHBvcnRJbmRleCA+PSBORUxFTShtVXNpbmdNZXRhZGF0YSkpIHsKKyAgICBpZiAoYWxsb3R0ZWRTaXplID4gcGFyYW1zLT5zaXplKCkgfHwgcG9ydEluZGV4ID49IE5FTEVNKG1OdW1Qb3J0QnVmZmVycykpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgLy8gV2UgZG8gbm90IHN1cHBvcnQgbWV0YWRhdGEgbW9kZSBjaGFuZ2VzIHBhc3QgYnVmZmVyIGFsbG9jYXRpb24KLSAgICBtU2FpbGVkID0gdHJ1ZTsKIAogICAgIC8vIG1ldGFkYXRhIGJ1ZmZlcnMgYXJlIG5vdCBjb25uZWN0ZWQgY3Jvc3MgcHJvY2VzcwogICAgIEJ1ZmZlck1ldGEgKmJ1ZmZlcl9tZXRhOwotICAgIGJvb2wgaXNNZXRhID0gbVVzaW5nTWV0YWRhdGFbcG9ydEluZGV4XTsKKyAgICBib29sIGlzTWV0YSA9IG1NZXRhZGF0YVR5cGVbcG9ydEluZGV4XSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZDsKICAgICBib29sIHVzZUJhY2t1cCA9IGNyb3NzUHJvY2VzcyAmJiBpc01ldGE7IC8vIHVzZSBhIGJhY2t1cCBidWZmZXIgaW5zdGVhZCBvZiB0aGUgYWN0dWFsIGJ1ZmZlcgogICAgIE9NWF9VOCAqZGF0YSA9IHN0YXRpY19jYXN0PE9NWF9VOCAqPihwYXJhbXMtPnBvaW50ZXIoKSk7CiAgICAgLy8gYWxsb2NhdGUgYmFja3VwIGJ1ZmZlcgogICAgIGlmICh1c2VCYWNrdXApIHsKLSAgICAgICAgZGF0YSA9IG5ldyAoc3RkOjpub3Rocm93KSBPTVhfVThbcGFyYW1zLT5zaXplKCldOworICAgICAgICBkYXRhID0gbmV3IChzdGQ6Om5vdGhyb3cpIE9NWF9VOFthbGxvdHRlZFNpemVdOwogICAgICAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICB9Ci0gICAgICAgIG1lbXNldChkYXRhLCAwLCBwYXJhbXMtPnNpemUoKSk7CisgICAgICAgIG1lbXNldChkYXRhLCAwLCBhbGxvdHRlZFNpemUpOworCisgICAgICAgIC8vIGlmIHdlIGFyZSBub3QgY29ubmVjdGluZyB0aGUgYnVmZmVycywgdGhlIHNpemVzIG11c3QgbWF0Y2gKKyAgICAgICAgaWYgKGFsbG90dGVkU2l6ZSAhPSBwYXJhbXMtPnNpemUoKSkgeworICAgICAgICAgICAgQ0xPR19FUlJPUih1c2VCdWZmZXIsIEJBRF9WQUxVRSwgU0lNUExFX0JVRkZFUihwb3J0SW5kZXgsIChzaXplX3QpYWxsb3R0ZWRTaXplLCBkYXRhKSk7CisgICAgICAgICAgICBkZWxldGVbXSBkYXRhOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQogCiAgICAgICAgIGJ1ZmZlcl9tZXRhID0gbmV3IEJ1ZmZlck1ldGEoCiAgICAgICAgICAgICAgICAgcGFyYW1zLCBwb3J0SW5kZXgsIGZhbHNlIC8qIGNvcHlUb09teCAqLywgZmFsc2UgLyogY29weUZyb21PbXggKi8sIGRhdGEpOwpAQCAtNzY0LDEwICs3OTgsMTEgQEAKIAogICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gT01YX1VzZUJ1ZmZlcigKICAgICAgICAgICAgIG1IYW5kbGUsICZoZWFkZXIsIHBvcnRJbmRleCwgYnVmZmVyX21ldGEsCi0gICAgICAgICAgICBwYXJhbXMtPnNpemUoKSwgZGF0YSk7CisgICAgICAgICAgICBhbGxvdHRlZFNpemUsIGRhdGEpOwogCiAgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7Ci0gICAgICAgIENMT0dfRVJST1IodXNlQnVmZmVyLCBlcnIsIFNJTVBMRV9CVUZGRVIocG9ydEluZGV4LCBwYXJhbXMtPnNpemUoKSwgcGFyYW1zLT5wb2ludGVyKCkpKTsKKyAgICAgICAgQ0xPR19FUlJPUih1c2VCdWZmZXIsIGVyciwgU0lNUExFX0JVRkZFUigKKyAgICAgICAgICAgICAgICBwb3J0SW5kZXgsIChzaXplX3QpYWxsb3R0ZWRTaXplLCBkYXRhKSk7CiAKICAgICAgICAgZGVsZXRlIGJ1ZmZlcl9tZXRhOwogICAgICAgICBidWZmZXJfbWV0YSA9IE5VTEw7CkBAIC03ODksNyArODI0LDcgQEAKICAgICB9CiAKICAgICBDTE9HX0JVRkZFUih1c2VCdWZmZXIsIE5FV19CVUZGRVJfRk1UKAotICAgICAgICAgICAgKmJ1ZmZlciwgcG9ydEluZGV4LCAiJXp1QCVwIiwgcGFyYW1zLT5zaXplKCksIHBhcmFtcy0+cG9pbnRlcigpKSk7CisgICAgICAgICAgICAqYnVmZmVyLCBwb3J0SW5kZXgsICIldSglenUpQCVwIiwgYWxsb3R0ZWRTaXplLCBwYXJhbXMtPnNpemUoKSwgcGFyYW1zLT5wb2ludGVyKCkpKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTkwNSwyOSArOTQwLDUxIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnVwZGF0ZUdyYXBoaWNCdWZmZXJJbk1ldGFfbCgKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBncmFwaGljQnVmZmVyLAorICAgICAgICBPTVg6OmJ1ZmZlcl9pZCBidWZmZXIsIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIpIHsKKyAgICBpZiAoaGVhZGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKHBvcnRJbmRleCAhPSBrUG9ydEluZGV4SW5wdXQgJiYgcG9ydEluZGV4ICE9IGtQb3J0SW5kZXhPdXRwdXQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBCdWZmZXJNZXRhICpidWZmZXJNZXRhID0gKEJ1ZmZlck1ldGEgKikoaGVhZGVyLT5wQXBwUHJpdmF0ZSk7CisgICAgYnVmZmVyTWV0YS0+c2V0R3JhcGhpY0J1ZmZlcihncmFwaGljQnVmZmVyKTsKKyAgICBpZiAobU1ldGFkYXRhVHlwZVtwb3J0SW5kZXhdID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlCisgICAgICAgICAgICAmJiBoZWFkZXItPm5BbGxvY0xlbiA+PSBzaXplb2YoVmlkZW9HcmFsbG9jTWV0YWRhdGEpKSB7CisgICAgICAgIFZpZGVvR3JhbGxvY01ldGFkYXRhICZtZXRhZGF0YSA9ICooVmlkZW9HcmFsbG9jTWV0YWRhdGEgKikoaGVhZGVyLT5wQnVmZmVyKTsKKyAgICAgICAgbWV0YWRhdGEuZVR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZTsKKyAgICAgICAgbWV0YWRhdGEucEhhbmRsZSA9IGdyYXBoaWNCdWZmZXIgPT0gTlVMTCA/IE5VTEwgOiBncmFwaGljQnVmZmVyLT5oYW5kbGU7CisgICAgfSBlbHNlIGlmIChtTWV0YWRhdGFUeXBlW3BvcnRJbmRleF0gPT0ga01ldGFkYXRhQnVmZmVyVHlwZUFOV0J1ZmZlcgorICAgICAgICAgICAgJiYgaGVhZGVyLT5uQWxsb2NMZW4gPj0gc2l6ZW9mKFZpZGVvTmF0aXZlTWV0YWRhdGEpKSB7CisgICAgICAgIFZpZGVvTmF0aXZlTWV0YWRhdGEgJm1ldGFkYXRhID0gKihWaWRlb05hdGl2ZU1ldGFkYXRhICopKGhlYWRlci0+cEJ1ZmZlcik7CisgICAgICAgIG1ldGFkYXRhLmVUeXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUFOV0J1ZmZlcjsKKyAgICAgICAgbWV0YWRhdGEucEJ1ZmZlciA9IGdyYXBoaWNCdWZmZXIgPT0gTlVMTCA/IE5VTEwgOiBncmFwaGljQnVmZmVyLT5nZXROYXRpdmVCdWZmZXIoKTsKKyAgICAgICAgbWV0YWRhdGEubkZlbmNlRmQgPSAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICBDTE9HX0JVRkZFUih1cGRhdGVHcmFwaGljQnVmZmVySW5NZXRhLCAiJXM6JXUsICUjeCBiYWQgdHlwZSAoJWQpIG9yIHNpemUgKCV1KSIsCisgICAgICAgICAgICBwb3J0U3RyaW5nKHBvcnRJbmRleCksIHBvcnRJbmRleCwgYnVmZmVyLCBtTWV0YWRhdGFUeXBlW3BvcnRJbmRleF0sIGhlYWRlci0+bkFsbG9jTGVuKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBDTE9HX0JVRkZFUih1cGRhdGVHcmFwaGljQnVmZmVySW5NZXRhLCAiJXM6JXUsICUjeCA6PSAlcCIsCisgICAgICAgICAgICBwb3J0U3RyaW5nKHBvcnRJbmRleCksIHBvcnRJbmRleCwgYnVmZmVyLAorICAgICAgICAgICAgZ3JhcGhpY0J1ZmZlciA9PSBOVUxMID8gTlVMTCA6IGdyYXBoaWNCdWZmZXItPmhhbmRsZSk7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnVwZGF0ZUdyYXBoaWNCdWZmZXJJbk1ldGEoCiAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiYgZ3JhcGhpY0J1ZmZlciwKICAgICAgICAgT01YOjpidWZmZXJfaWQgYnVmZmVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQogICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBmaW5kQnVmZmVySGVhZGVyKGJ1ZmZlciwgcG9ydEluZGV4KTsKLSAgICBpZiAoaGVhZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgVmlkZW9EZWNvZGVyT3V0cHV0TWV0YURhdGEgKm1ldGFkYXRhID0KLSAgICAgICAgKFZpZGVvRGVjb2Rlck91dHB1dE1ldGFEYXRhICopKGhlYWRlci0+cEJ1ZmZlcik7Ci0gICAgQnVmZmVyTWV0YSAqYnVmZmVyTWV0YSA9IChCdWZmZXJNZXRhICopKGhlYWRlci0+cEFwcFByaXZhdGUpOwotICAgIGJ1ZmZlck1ldGEtPnNldEdyYXBoaWNCdWZmZXIoZ3JhcGhpY0J1ZmZlcik7Ci0gICAgbWV0YWRhdGEtPmVUeXBlID0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2U7Ci0gICAgbWV0YWRhdGEtPnBIYW5kbGUgPSBncmFwaGljQnVmZmVyLT5oYW5kbGU7Ci0gICAgQ0xPR19CVUZGRVIodXBkYXRlR3JhcGhpY0J1ZmZlckluTWV0YSwgIiVzOiV1LCAlI3ggOj0gJXAiLAotICAgICAgICAgICAgcG9ydFN0cmluZyhwb3J0SW5kZXgpLCBwb3J0SW5kZXgsIGJ1ZmZlciwgZ3JhcGhpY0J1ZmZlci0+aGFuZGxlKTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIHVwZGF0ZUdyYXBoaWNCdWZmZXJJbk1ldGFfbChwb3J0SW5kZXgsIGdyYXBoaWNCdWZmZXIsIGJ1ZmZlciwgaGVhZGVyKTsKIH0KIAotc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpjcmVhdGVJbnB1dFN1cmZhY2UoCi0gICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpjcmVhdGVHcmFwaGljQnVmZmVyU291cmNlKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gYnVmZmVyQ29uc3VtZXIsIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSkgewogICAgIHN0YXR1c190IGVycjsKIAogICAgIC8vIG9ubHkgYWxsb3cgZ3JhcGhpYyBzb3VyY2Ugb24gaW5wdXQgcG9ydCwgd2hlbiB0aGVyZSBhcmUgbm8gYWxsb2NhdGVkIGJ1ZmZlcnMgeWV0CkBAIC05NDEsMTQgKzk5OCwxNCBAQAogCiAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gc3VyZmFjZUNoZWNrID0gZ2V0R3JhcGhpY0J1ZmZlclNvdXJjZSgpOwogICAgIGlmIChzdXJmYWNlQ2hlY2sgIT0gTlVMTCkgeworICAgICAgICBpZiAocG9ydEluZGV4IDwgTkVMRU0obU1ldGFkYXRhVHlwZSkgJiYgdHlwZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAqdHlwZSA9IG1NZXRhZGF0YVR5cGVbcG9ydEluZGV4XTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CiAgICAgfQogCi0gICAgLy8gSW5wdXQgYnVmZmVycyB3aWxsIGhvbGQgbWV0YS1kYXRhIChncmFsbG9jIHJlZmVyZW5jZXMpLgotICAgIE9NWF9CT09MIHVzaW5nR3JhcGhpY0J1ZmZlciA9IE9NWF9GQUxTRTsKLSAgICBlcnIgPSBzdG9yZU1ldGFEYXRhSW5CdWZmZXJzX2woCi0gICAgICAgICAgICBwb3J0SW5kZXgsIE9NWF9UUlVFLAotICAgICAgICAgICAgT01YX1RSVUUgLyogdXNlR3JhcGhpY0J1ZmZlciAqLywgJnVzaW5nR3JhcGhpY0J1ZmZlcik7CisgICAgLy8gSW5wdXQgYnVmZmVycyB3aWxsIGhvbGQgbWV0YS1kYXRhIChBTmF0aXZlV2luZG93QnVmZmVyIHJlZmVyZW5jZXMpLgorICAgIGVyciA9IHN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNfbChwb3J0SW5kZXgsIE9NWF9UUlVFLCB0eXBlKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQpAQCAtOTc0LDE5ICsxMDMxLDc1IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBHcmFwaGljQnVmZmVyU291cmNlKiBidWZmZXJTb3VyY2UgPSBuZXcgR3JhcGhpY0J1ZmZlclNvdXJjZSgKLSAgICAgICAgICAgIHRoaXMsIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0LAotICAgICAgICAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCwgdXNpbmdHcmFwaGljQnVmZmVyKTsKKyAgICB1aW50MzJfdCB1c2FnZUJpdHM7CisgICAgb2VyciA9IE9NWF9HZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICBtSGFuZGxlLCAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUNvbnN1bWVyVXNhZ2VCaXRzLCAmdXNhZ2VCaXRzKTsKKyAgICBpZiAob2VyciAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIHVzYWdlQml0cyA9IDA7CisgICAgfQorCisgICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gYnVmZmVyU291cmNlID0gbmV3IEdyYXBoaWNCdWZmZXJTb3VyY2UodGhpcywKKyAgICAgICAgICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCisgICAgICAgICAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCwKKyAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwsCisgICAgICAgICAgICB1c2FnZUJpdHMsCisgICAgICAgICAgICBidWZmZXJDb25zdW1lcik7CisKICAgICBpZiAoKGVyciA9IGJ1ZmZlclNvdXJjZS0+aW5pdENoZWNrKCkpICE9IE9LKSB7Ci0gICAgICAgIGRlbGV0ZSBidWZmZXJTb3VyY2U7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogICAgIHNldEdyYXBoaWNCdWZmZXJTb3VyY2UoYnVmZmVyU291cmNlKTsKIAotICAgICpidWZmZXJQcm9kdWNlciA9IGJ1ZmZlclNvdXJjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOwogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpjcmVhdGVJbnB1dFN1cmZhY2UoCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIsIE1ldGFkYXRhQnVmZmVyVHlwZSAqdHlwZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CisgICAgc3RhdHVzX3QgZXJyID0gY3JlYXRlR3JhcGhpY0J1ZmZlclNvdXJjZShwb3J0SW5kZXgsIE5VTEwgLyogYnVmZmVyQ29uc3VtZXIgKi8sIHR5cGUpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgICpidWZmZXJQcm9kdWNlciA9IG1HcmFwaGljQnVmZmVyU291cmNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisgICAgcmV0dXJuIE9LOworfQorCisvL3N0YXRpYworc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpjcmVhdGVQZXJzaXN0ZW50SW5wdXRTdXJmYWNlKAorICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIsCisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICpidWZmZXJDb25zdW1lcikgeworICAgIFN0cmluZzggbmFtZSgiR3JhcGhpY0J1ZmZlclNvdXJjZSIpOworCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICBjb25zdW1lci0+c2V0Q29uc3VtZXJOYW1lKG5hbWUpOworICAgIGNvbnN1bWVyLT5zZXRDb25zdW1lclVzYWdlQml0cyhHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIpOworCisgICAgc3A8QnVmZmVyUXVldWU6OlByb3h5Q29uc3VtZXJMaXN0ZW5lcj4gcHJveHkgPQorICAgICAgICBuZXcgQnVmZmVyUXVldWU6OlByb3h5Q29uc3VtZXJMaXN0ZW5lcihOVUxMKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBjb25zdW1lci0+Y29uc3VtZXJDb25uZWN0KHByb3h5LCBmYWxzZSk7CisgICAgaWYgKGVyciAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiRXJyb3IgY29ubmVjdGluZyB0byBCdWZmZXJRdWV1ZTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgKmJ1ZmZlclByb2R1Y2VyID0gcHJvZHVjZXI7CisgICAgKmJ1ZmZlckNvbnN1bWVyID0gY29uc3VtZXI7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6c2V0SW5wdXRTdXJmYWNlKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gJmJ1ZmZlckNvbnN1bWVyLAorICAgICAgICBNZXRhZGF0YUJ1ZmZlclR5cGUgKnR5cGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworICAgIHJldHVybiBjcmVhdGVHcmFwaGljQnVmZmVyU291cmNlKHBvcnRJbmRleCwgYnVmZmVyQ29uc3VtZXIsIHR5cGUpOworfQorCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSB7CiAgICAgLy8gRm9yIG5vbi1TdXJmYWNlIGlucHV0LCB0aGUgTWVkaWFDb2RlYyBzaG91bGQgY29udmVydCB0aGUgY2FsbCB0byBhCiAgICAgLy8gcGFpciBvZiByZXF1ZXN0cyAoZGVxdWV1ZSBpbnB1dCBidWZmZXIsIHF1ZXVlIGlucHV0IGJ1ZmZlciB3aXRoIEVPUwpAQCAtMTAwMyw4ICsxMTE2LDYgQEAKICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIHNpemVfdCBzaXplLCBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyLAogICAgICAgICB2b2lkICoqYnVmZmVyX2RhdGEpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIC8vIFdlIGRvIG5vdCBzdXBwb3J0IG1ldGFkYXRhIG1vZGUgY2hhbmdlcyBwYXN0IGJ1ZmZlciBhbGxvY2F0aW9uCi0gICAgbVNhaWxlZCA9IHRydWU7CiAKICAgICBCdWZmZXJNZXRhICpidWZmZXJfbWV0YSA9IG5ldyBCdWZmZXJNZXRhKHNpemUsIHBvcnRJbmRleCk7CiAKQEAgLTEwNDEsMTYgKzExNTIsMTQgQEAKIAogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjphbGxvY2F0ZUJ1ZmZlcldpdGhCYWNrdXAoCiAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBjb25zdCBzcDxJTWVtb3J5PiAmcGFyYW1zLAotICAgICAgICBPTVg6OmJ1ZmZlcl9pZCAqYnVmZmVyLCBPTVhfQk9PTCBjcm9zc1Byb2Nlc3MpIHsKKyAgICAgICAgT01YOjpidWZmZXJfaWQgKmJ1ZmZlciwgT01YX1UzMiBhbGxvdHRlZFNpemUsIE9NWF9CT09MIGNyb3NzUHJvY2VzcykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKHBvcnRJbmRleCA+PSBORUxFTShtVXNpbmdNZXRhZGF0YSkpIHsKKyAgICBpZiAoYWxsb3R0ZWRTaXplID4gcGFyYW1zLT5zaXplKCkgfHwgcG9ydEluZGV4ID49IE5FTEVNKG1OdW1Qb3J0QnVmZmVycykpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgLy8gV2UgZG8gbm90IHN1cHBvcnQgbWV0YWRhdGEgbW9kZSBjaGFuZ2VzIHBhc3QgYnVmZmVyIGFsbG9jYXRpb24KLSAgICBtU2FpbGVkID0gdHJ1ZTsKIAogICAgIC8vIG1ldGFkYXRhIGJ1ZmZlcnMgYXJlIG5vdCBjb25uZWN0ZWQgY3Jvc3MgcHJvY2VzcwotICAgIGJvb2wgaXNNZXRhID0gbVVzaW5nTWV0YWRhdGFbcG9ydEluZGV4XTsKKyAgICBib29sIGlzTWV0YSA9IG1NZXRhZGF0YVR5cGVbcG9ydEluZGV4XSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZDsKICAgICBib29sIGNvcHkgPSAhKGNyb3NzUHJvY2VzcyAmJiBpc01ldGEpOwogCiAgICAgQnVmZmVyTWV0YSAqYnVmZmVyX21ldGEgPSBuZXcgQnVmZmVyTWV0YSgKQEAgLTEwNjIsMTEgKzExNzEsMTAgQEAKICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyOwogCiAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfQWxsb2NhdGVCdWZmZXIoCi0gICAgICAgICAgICBtSGFuZGxlLCAmaGVhZGVyLCBwb3J0SW5kZXgsIGJ1ZmZlcl9tZXRhLCBwYXJhbXMtPnNpemUoKSk7Ci0KKyAgICAgICAgICAgIG1IYW5kbGUsICZoZWFkZXIsIHBvcnRJbmRleCwgYnVmZmVyX21ldGEsIGFsbG90dGVkU2l6ZSk7CiAgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7CiAgICAgICAgIENMT0dfRVJST1IoYWxsb2NhdGVCdWZmZXJXaXRoQmFja3VwLCBlcnIsCi0gICAgICAgICAgICAgICAgU0lNUExFX0JVRkZFUihwb3J0SW5kZXgsIHBhcmFtcy0+c2l6ZSgpLCBwYXJhbXMtPnBvaW50ZXIoKSkpOworICAgICAgICAgICAgICAgIFNJTVBMRV9CVUZGRVIocG9ydEluZGV4LCAoc2l6ZV90KWFsbG90dGVkU2l6ZSwgcGFyYW1zLT5wb2ludGVyKCkpKTsKICAgICAgICAgZGVsZXRlIGJ1ZmZlcl9tZXRhOwogICAgICAgICBidWZmZXJfbWV0YSA9IE5VTEw7CiAKQEAgLTEwODYsOCArMTE5NCw4IEBACiAgICAgICAgIGJ1ZmZlclNvdXJjZS0+YWRkQ29kZWNCdWZmZXIoaGVhZGVyKTsKICAgICB9CiAKLSAgICBDTE9HX0JVRkZFUihhbGxvY2F0ZUJ1ZmZlcldpdGhCYWNrdXAsIE5FV19CVUZGRVJfRk1UKCpidWZmZXIsIHBvcnRJbmRleCwgIiV6dUAlcCA6PiAlcCIsCi0gICAgICAgICAgICBwYXJhbXMtPnNpemUoKSwgcGFyYW1zLT5wb2ludGVyKCksIGhlYWRlci0+cEJ1ZmZlcikpOworICAgIENMT0dfQlVGRkVSKGFsbG9jYXRlQnVmZmVyV2l0aEJhY2t1cCwgTkVXX0JVRkZFUl9GTVQoKmJ1ZmZlciwgcG9ydEluZGV4LCAiJXp1QCVwIDo+ICV1QCVwIiwKKyAgICAgICAgICAgIHBhcmFtcy0+c2l6ZSgpLCBwYXJhbXMtPnBvaW50ZXIoKSwgYWxsb3R0ZWRTaXplLCBoZWFkZXItPnBCdWZmZXIpKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTExMTUsNyArMTIyMyw3IEBACiAgICAgcmV0dXJuIFN0YXR1c0Zyb21PTVhFcnJvcihlcnIpOwogfQogCi1zdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmZpbGxCdWZmZXIoT01YOjpidWZmZXJfaWQgYnVmZmVyKSB7CitzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmZpbGxCdWZmZXIoT01YOjpidWZmZXJfaWQgYnVmZmVyLCBpbnQgZmVuY2VGZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gZmluZEJ1ZmZlckhlYWRlcihidWZmZXIsIGtQb3J0SW5kZXhPdXRwdXQpOwpAQCAtMTEyNiwxNSArMTIzNCwyMiBAQAogICAgIGhlYWRlci0+bk9mZnNldCA9IDA7CiAgICAgaGVhZGVyLT5uRmxhZ3MgPSAwOwogCisgICAgLy8gbWV0YSBub3cgb3ducyBmZW5jZUZkCisgICAgc3RhdHVzX3QgcmVzID0gc3RvcmVGZW5jZUluTWV0YV9sKGhlYWRlciwgZmVuY2VGZCwga1BvcnRJbmRleE91dHB1dCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBDTE9HX0VSUk9SKGZpbGxCdWZmZXI6OnN0b3JlRmVuY2VJbk1ldGEsIHJlcywgRU1QVFlfQlVGRkVSKGJ1ZmZlciwgaGVhZGVyLCBmZW5jZUZkKSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlYnVnTG9jayk7CiAgICAgICAgIG1PdXRwdXRCdWZmZXJzV2l0aENvZGVjLmFkZChoZWFkZXIpOwotICAgICAgICBDTE9HX0JVTVBFRF9CVUZGRVIoZmlsbEJ1ZmZlciwgV0lUSF9TVEFUUyhFTVBUWV9CVUZGRVIoYnVmZmVyLCBoZWFkZXIpKSk7CisgICAgICAgIENMT0dfQlVNUEVEX0JVRkZFUihmaWxsQnVmZmVyLCBXSVRIX1NUQVRTKEVNUFRZX0JVRkZFUihidWZmZXIsIGhlYWRlciwgZmVuY2VGZCkpKTsKICAgICB9CiAKICAgICBPTVhfRVJST1JUWVBFIGVyciA9IE9NWF9GaWxsVGhpc0J1ZmZlcihtSGFuZGxlLCBoZWFkZXIpOwogICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgewotICAgICAgICBDTE9HX0VSUk9SKGZpbGxCdWZmZXIsIGVyciwgRU1QVFlfQlVGRkVSKGJ1ZmZlciwgaGVhZGVyKSk7CisgICAgICAgIENMT0dfRVJST1IoZmlsbEJ1ZmZlciwgZXJyLCBFTVBUWV9CVUZGRVIoYnVmZmVyLCBoZWFkZXIsIGZlbmNlRmQpKTsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWJ1Z0xvY2spOwogICAgICAgICBtT3V0cHV0QnVmZmVyc1dpdGhDb2RlYy5yZW1vdmUoaGVhZGVyKTsKICAgICB9CkBAIC0xMTQ0LDcgKzEyNTksNyBAQAogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjplbXB0eUJ1ZmZlcigKICAgICAgICAgT01YOjpidWZmZXJfaWQgYnVmZmVyLAogICAgICAgICBPTVhfVTMyIHJhbmdlT2Zmc2V0LCBPTVhfVTMyIHJhbmdlTGVuZ3RoLAotICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wKSB7CisgICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXAsIGludCBmZW5jZUZkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIC8vIG5vIGVtcHR5YnVmZmVyIGlmIHVzaW5nIGlucHV0IHN1cmZhY2UKQEAgLTExNTQsMjEgKzEyNjksNDggQEAKICAgICB9CiAKICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyID0gZmluZEJ1ZmZlckhlYWRlcihidWZmZXIsIGtQb3J0SW5kZXhJbnB1dCk7Ci0gICAgLy8gcmFuZ2VMZW5ndGggYW5kIHJhbmdlT2Zmc2V0IG11c3QgYmUgYSBzdWJzZXQgb2YgdGhlIGFsbG9jYXRlZCBkYXRhIGluIHRoZSBidWZmZXIuCi0gICAgLy8gY29ybmVyIGNhc2U6IHdlIHBlcm1pdCByYW5nZU9mZnNldCA9PSBlbmQtb2YtYnVmZmVyIHdpdGggcmFuZ2VMZW5ndGggPT0gMC4KLSAgICBpZiAoaGVhZGVyID09IE5VTEwKLSAgICAgICAgICAgIHx8IHJhbmdlT2Zmc2V0ID4gaGVhZGVyLT5uQWxsb2NMZW4KLSAgICAgICAgICAgIHx8IHJhbmdlTGVuZ3RoID4gaGVhZGVyLT5uQWxsb2NMZW4gLSByYW5nZU9mZnNldCkgeworICAgIGlmIChoZWFkZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBoZWFkZXItPm5GaWxsZWRMZW4gPSByYW5nZUxlbmd0aDsKLSAgICBoZWFkZXItPm5PZmZzZXQgPSByYW5nZU9mZnNldDsKLQogICAgIEJ1ZmZlck1ldGEgKmJ1ZmZlcl9tZXRhID0KICAgICAgICAgc3RhdGljX2Nhc3Q8QnVmZmVyTWV0YSAqPihoZWFkZXItPnBBcHBQcml2YXRlKTsKLSAgICBidWZmZXJfbWV0YS0+Q29weVRvT01YKGhlYWRlcik7CisgICAgc3A8QUJ1ZmZlcj4gYmFja3VwID0gYnVmZmVyX21ldGEtPmdldEJ1ZmZlcihoZWFkZXIsIHRydWUgLyogYmFja3VwICovLCBmYWxzZSAvKiBsaW1pdCAqLyk7CisgICAgc3A8QUJ1ZmZlcj4gY29kZWMgPSBidWZmZXJfbWV0YS0+Z2V0QnVmZmVyKGhlYWRlciwgZmFsc2UgLyogYmFja3VwICovLCBmYWxzZSAvKiBsaW1pdCAqLyk7CiAKLSAgICByZXR1cm4gZW1wdHlCdWZmZXJfbChoZWFkZXIsIGZsYWdzLCB0aW1lc3RhbXAsIChpbnRwdHJfdClidWZmZXIpOworICAgIC8vIGNvbnZlcnQgaW5jb21pbmcgQU5XIG1ldGEgYnVmZmVycyBpZiBjb21wb25lbnQgaXMgY29uZmlndXJlZCBmb3IgZ3JhbGxvYyBtZXRhZGF0YSBtb2RlCisgICAgLy8gaWdub3JlIHJhbmdlT2Zmc2V0IGluIHRoaXMgY2FzZQorICAgIGlmIChidWZmZXJfbWV0YS0+Y29weVRvT214KCkKKyAgICAgICAgICAgICYmIG1NZXRhZGF0YVR5cGVba1BvcnRJbmRleElucHV0XSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZQorICAgICAgICAgICAgJiYgYmFja3VwLT5jYXBhY2l0eSgpID49IHNpemVvZihWaWRlb05hdGl2ZU1ldGFkYXRhKQorICAgICAgICAgICAgJiYgY29kZWMtPmNhcGFjaXR5KCkgPj0gc2l6ZW9mKFZpZGVvR3JhbGxvY01ldGFkYXRhKQorICAgICAgICAgICAgJiYgKChWaWRlb05hdGl2ZU1ldGFkYXRhICopYmFja3VwLT5iYXNlKCkpLT5lVHlwZQorICAgICAgICAgICAgICAgICAgICA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyKSB7CisgICAgICAgIFZpZGVvTmF0aXZlTWV0YWRhdGEgJmJhY2t1cE1ldGEgPSAqKFZpZGVvTmF0aXZlTWV0YWRhdGEgKiliYWNrdXAtPmJhc2UoKTsKKyAgICAgICAgVmlkZW9HcmFsbG9jTWV0YWRhdGEgJmNvZGVjTWV0YSA9ICooVmlkZW9HcmFsbG9jTWV0YWRhdGEgKiljb2RlYy0+YmFzZSgpOworICAgICAgICBDTE9HX0JVRkZFUihlbXB0eUJ1ZmZlciwgImNvbnZlcnRpbmcgQU5XQiAlcCB0byBoYW5kbGUgJXAiLAorICAgICAgICAgICAgICAgIGJhY2t1cE1ldGEucEJ1ZmZlciwgYmFja3VwTWV0YS5wQnVmZmVyLT5oYW5kbGUpOworICAgICAgICBjb2RlY01ldGEucEhhbmRsZSA9IGJhY2t1cE1ldGEucEJ1ZmZlciAhPSBOVUxMID8gYmFja3VwTWV0YS5wQnVmZmVyLT5oYW5kbGUgOiBOVUxMOworICAgICAgICBjb2RlY01ldGEuZVR5cGUgPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZTsKKyAgICAgICAgaGVhZGVyLT5uRmlsbGVkTGVuID0gcmFuZ2VMZW5ndGggPyBzaXplb2YoY29kZWNNZXRhKSA6IDA7CisgICAgICAgIGhlYWRlci0+bk9mZnNldCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gcmFuZ2VMZW5ndGggYW5kIHJhbmdlT2Zmc2V0IG11c3QgYmUgYSBzdWJzZXQgb2YgdGhlIGFsbG9jYXRlZCBkYXRhIGluIHRoZSBidWZmZXIuCisgICAgICAgIC8vIGNvcm5lciBjYXNlOiB3ZSBwZXJtaXQgcmFuZ2VPZmZzZXQgPT0gZW5kLW9mLWJ1ZmZlciB3aXRoIHJhbmdlTGVuZ3RoID09IDAuCisgICAgICAgIGlmIChyYW5nZU9mZnNldCA+IGhlYWRlci0+bkFsbG9jTGVuCisgICAgICAgICAgICAgICAgfHwgcmFuZ2VMZW5ndGggPiBoZWFkZXItPm5BbGxvY0xlbiAtIHJhbmdlT2Zmc2V0KSB7CisgICAgICAgICAgICBDTE9HX0VSUk9SKGVtcHR5QnVmZmVyLCBPTVhfRXJyb3JCYWRQYXJhbWV0ZXIsIEZVTExfQlVGRkVSKE5VTEwsIGhlYWRlciwgZmVuY2VGZCkpOworICAgICAgICAgICAgaWYgKGZlbmNlRmQgPj0gMCkgeworICAgICAgICAgICAgICAgIDo6Y2xvc2UoZmVuY2VGZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGhlYWRlci0+bkZpbGxlZExlbiA9IHJhbmdlTGVuZ3RoOworICAgICAgICBoZWFkZXItPm5PZmZzZXQgPSByYW5nZU9mZnNldDsKKworICAgICAgICBidWZmZXJfbWV0YS0+Q29weVRvT01YKGhlYWRlcik7CisgICAgfQorCisgICAgcmV0dXJuIGVtcHR5QnVmZmVyX2woaGVhZGVyLCBmbGFncywgdGltZXN0YW1wLCAoaW50cHRyX3QpYnVmZmVyLCBmZW5jZUZkKTsKIH0KIAogLy8gbG9nIHF1ZXVlZCBidWZmZXIgYWN0aXZpdHkgZm9yIHRoZSBuZXh0IGZldyBpbnB1dCBhbmQvb3Igb3V0cHV0IGZyYW1lcwpAQCAtMTE5NSwxMSArMTMzNyw2MiBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpzdG9yZUZlbmNlSW5NZXRhX2woCisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIsIGludCBmZW5jZUZkLCBPTVhfVTMyIHBvcnRJbmRleCkgeworICAgIC8vIHByb3BhZ2F0ZSBmZW5jZSBpZiBjb21wb25lbnQgc3VwcG9ydHMgaXQ7IHdhaXQgZm9yIGl0IG90aGVyd2lzZQorICAgIE9NWF9VMzIgbWV0YVNpemUgPSBwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0ID8gaGVhZGVyLT5uRmlsbGVkTGVuIDogaGVhZGVyLT5uQWxsb2NMZW47CisgICAgaWYgKG1NZXRhZGF0YVR5cGVbcG9ydEluZGV4XSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyCisgICAgICAgICAgICAmJiBtZXRhU2l6ZSA+PSBzaXplb2YoVmlkZW9OYXRpdmVNZXRhZGF0YSkpIHsKKyAgICAgICAgVmlkZW9OYXRpdmVNZXRhZGF0YSAmbmF0aXZlTWV0YSA9ICooVmlkZW9OYXRpdmVNZXRhZGF0YSAqKShoZWFkZXItPnBCdWZmZXIpOworICAgICAgICBpZiAobmF0aXZlTWV0YS5uRmVuY2VGZCA+PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiZmVuY2UgKCVkKSBhbHJlYWR5IGV4aXN0cyBpbiBtZXRhIiwgbmF0aXZlTWV0YS5uRmVuY2VGZCk7CisgICAgICAgICAgICBpZiAoZmVuY2VGZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgOjpjbG9zZShmZW5jZUZkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICAgICAgfQorICAgICAgICBuYXRpdmVNZXRhLm5GZW5jZUZkID0gZmVuY2VGZDsKKyAgICB9IGVsc2UgaWYgKGZlbmNlRmQgPj0gMCkgeworICAgICAgICBDTE9HX0JVRkZFUihzdG9yZUZlbmNlSW5NZXRhLCAid2FpdGluZyBmb3IgZmVuY2UgJWQiLCBmZW5jZUZkKTsKKyAgICAgICAgc3A8RmVuY2U+IGZlbmNlID0gbmV3IEZlbmNlKGZlbmNlRmQpOworICAgICAgICByZXR1cm4gZmVuY2UtPndhaXQoSU9NWDo6a0ZlbmNlVGltZW91dE1zKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitpbnQgT01YTm9kZUluc3RhbmNlOjpyZXRyaWV2ZUZlbmNlRnJvbU1ldGFfbCgKKyAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciwgT01YX1UzMiBwb3J0SW5kZXgpIHsKKyAgICBPTVhfVTMyIG1ldGFTaXplID0gcG9ydEluZGV4ID09IGtQb3J0SW5kZXhJbnB1dCA/IGhlYWRlci0+bkFsbG9jTGVuIDogaGVhZGVyLT5uRmlsbGVkTGVuOworICAgIGludCBmZW5jZUZkID0gLTE7CisgICAgaWYgKG1NZXRhZGF0YVR5cGVbcG9ydEluZGV4XSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyCisgICAgICAgICAgICAmJiBoZWFkZXItPm5BbGxvY0xlbiA+PSBzaXplb2YoVmlkZW9OYXRpdmVNZXRhZGF0YSkpIHsKKyAgICAgICAgVmlkZW9OYXRpdmVNZXRhZGF0YSAmbmF0aXZlTWV0YSA9ICooVmlkZW9OYXRpdmVNZXRhZGF0YSAqKShoZWFkZXItPnBCdWZmZXIpOworICAgICAgICBpZiAobmF0aXZlTWV0YS5lVHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyKSB7CisgICAgICAgICAgICBmZW5jZUZkID0gbmF0aXZlTWV0YS5uRmVuY2VGZDsKKyAgICAgICAgICAgIG5hdGl2ZU1ldGEubkZlbmNlRmQgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWV0YVNpemUgPCBzaXplb2YobmF0aXZlTWV0YSkgJiYgZmVuY2VGZCA+PSAwKSB7CisgICAgICAgICAgICBDTE9HX0VSUk9SKGZvdW5kRmVuY2VJbkVtcHR5TWV0YSwgQkFEX1ZBTFVFLCBGVUxMX0JVRkZFUigKKyAgICAgICAgICAgICAgICAgICAgTlVMTCwgaGVhZGVyLCBuYXRpdmVNZXRhLm5GZW5jZUZkKSk7CisgICAgICAgICAgICBmZW5jZUZkID0gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZlbmNlRmQ7Cit9CisKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6ZW1wdHlCdWZmZXJfbCgKLSAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciwgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCwgaW50cHRyX3QgZGVidWdBZGRyKSB7CisgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIsIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXAsCisgICAgICAgIGludHB0cl90IGRlYnVnQWRkciwgaW50IGZlbmNlRmQpIHsKICAgICBoZWFkZXItPm5GbGFncyA9IGZsYWdzOwogICAgIGhlYWRlci0+blRpbWVTdGFtcCA9IHRpbWVzdGFtcDsKIAorICAgIHN0YXR1c190IHJlcyA9IHN0b3JlRmVuY2VJbk1ldGFfbChoZWFkZXIsIGZlbmNlRmQsIGtQb3J0SW5kZXhJbnB1dCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBDTE9HX0VSUk9SKGVtcHR5QnVmZmVyOjpzdG9yZUZlbmNlSW5NZXRhLCByZXMsIFdJVEhfU1RBVFMoCisgICAgICAgICAgICAgICAgRlVMTF9CVUZGRVIoZGVidWdBZGRyLCBoZWFkZXIsIGZlbmNlRmQpKSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlYnVnTG9jayk7CiAgICAgICAgIG1JbnB1dEJ1ZmZlcnNXaXRoQ29kZWMuYWRkKGhlYWRlcik7CkBAIC0xMjA5LDExICsxNDAyLDExIEBACiAgICAgICAgICAgICBidW1wRGVidWdMZXZlbF9sKDIgLyogbnVtSW5wdXRCdWZmZXJzICovLCAwIC8qIG51bU91dHB1dEJ1ZmZlcnMgKi8pOwogICAgICAgICB9CiAKLSAgICAgICAgQ0xPR19CVU1QRURfQlVGRkVSKGVtcHR5QnVmZmVyLCBXSVRIX1NUQVRTKEZVTExfQlVGRkVSKGRlYnVnQWRkciwgaGVhZGVyKSkpOworICAgICAgICBDTE9HX0JVTVBFRF9CVUZGRVIoZW1wdHlCdWZmZXIsIFdJVEhfU1RBVFMoRlVMTF9CVUZGRVIoZGVidWdBZGRyLCBoZWFkZXIsIGZlbmNlRmQpKSk7CiAgICAgfQogCiAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfRW1wdHlUaGlzQnVmZmVyKG1IYW5kbGUsIGhlYWRlcik7Ci0gICAgQ0xPR19JRl9FUlJPUihlbXB0eUJ1ZmZlciwgZXJyLCBGVUxMX0JVRkZFUihkZWJ1Z0FkZHIsIGhlYWRlcikpOworICAgIENMT0dfSUZfRVJST1IoZW1wdHlCdWZmZXIsIGVyciwgRlVMTF9CVUZGRVIoZGVidWdBZGRyLCBoZWFkZXIsIGZlbmNlRmQpKTsKIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWJ1Z0xvY2spOwpAQCAtMTIyOCwxNiArMTQyMSwyMSBAQAogfQogCiAvLyBsaWtlIGVtcHR5QnVmZmVyLCBidXQgdGhlIGRhdGEgaXMgYWxyZWFkeSBpbiBoZWFkZXItPnBCdWZmZXIKLXN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6ZW1wdHlEaXJlY3RCdWZmZXIoCi0gICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIsCi0gICAgICAgIE9NWF9VMzIgcmFuZ2VPZmZzZXQsIE9NWF9VMzIgcmFuZ2VMZW5ndGgsCi0gICAgICAgIE9NWF9VMzIgZmxhZ3MsIE9NWF9USUNLUyB0aW1lc3RhbXApIHsKK3N0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6ZW1wdHlHcmFwaGljQnVmZmVyKAorICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqaGVhZGVyLCBjb25zdCBzcDxHcmFwaGljQnVmZmVyPiAmZ3JhcGhpY0J1ZmZlciwKKyAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCwgaW50IGZlbmNlRmQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIE9NWDo6YnVmZmVyX2lkIGJ1ZmZlciA9IGZpbmRCdWZmZXJJRChoZWFkZXIpOworICAgIHN0YXR1c190IGVyciA9IHVwZGF0ZUdyYXBoaWNCdWZmZXJJbk1ldGFfbChrUG9ydEluZGV4SW5wdXQsIGdyYXBoaWNCdWZmZXIsIGJ1ZmZlciwgaGVhZGVyKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIENMT0dfRVJST1IoZW1wdHlHcmFwaGljQnVmZmVyLCBlcnIsIEZVTExfQlVGRkVSKAorICAgICAgICAgICAgICAgIChpbnRwdHJfdCloZWFkZXItPnBCdWZmZXIsIGhlYWRlciwgZmVuY2VGZCkpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KIAotICAgIGhlYWRlci0+bkZpbGxlZExlbiA9IHJhbmdlTGVuZ3RoOwotICAgIGhlYWRlci0+bk9mZnNldCA9IHJhbmdlT2Zmc2V0OwotCi0gICAgcmV0dXJuIGVtcHR5QnVmZmVyX2woaGVhZGVyLCBmbGFncywgdGltZXN0YW1wLCAoaW50cHRyX3QpaGVhZGVyLT5wQnVmZmVyKTsKKyAgICBoZWFkZXItPm5PZmZzZXQgPSAwOworICAgIGhlYWRlci0+bkZpbGxlZExlbiA9IGdyYXBoaWNCdWZmZXIgPT0gTlVMTCA/IDAgOiBoZWFkZXItPm5BbGxvY0xlbjsKKyAgICByZXR1cm4gZW1wdHlCdWZmZXJfbChoZWFkZXIsIGZsYWdzLCB0aW1lc3RhbXAsIChpbnRwdHJfdCloZWFkZXItPnBCdWZmZXIsIGZlbmNlRmQpOwogfQogCiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmdldEV4dGVuc2lvbkluZGV4KApAQCAtMTI1Niw2ICsxNDU0LDcgQEAKICAgICAgICAgY2FzZSBJT01YOjpJTlRFUk5BTF9PUFRJT05fUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0RFTEFZOgogICAgICAgICAgICAgcmV0dXJuICJSRVBFQVRfUFJFVklPVVNfRlJBTUVfREVMQVkiOwogICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9NQVhfVElNRVNUQU1QX0dBUDogcmV0dXJuICJNQVhfVElNRVNUQU1QX0dBUCI7CisgICAgICAgIGNhc2UgSU9NWDo6SU5URVJOQUxfT1BUSU9OX01BWF9GUFM6ICAgICAgICAgICByZXR1cm4gIk1BWF9GUFMiOwogICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9TVEFSVF9USU1FOiAgICAgICAgcmV0dXJuICJTVEFSVF9USU1FIjsKICAgICAgICAgY2FzZSBJT01YOjpJTlRFUk5BTF9PUFRJT05fVElNRV9MQVBTRTogICAgICAgIHJldHVybiAiVElNRV9MQVBTRSI7CiAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOwpAQCAtMTI3Myw2ICsxNDcyLDcgQEAKICAgICAgICAgY2FzZSBJT01YOjpJTlRFUk5BTF9PUFRJT05fU1VTUEVORDoKICAgICAgICAgY2FzZSBJT01YOjpJTlRFUk5BTF9PUFRJT05fUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0RFTEFZOgogICAgICAgICBjYXNlIElPTVg6OklOVEVSTkFMX09QVElPTl9NQVhfVElNRVNUQU1QX0dBUDoKKyAgICAgICAgY2FzZSBJT01YOjpJTlRFUk5BTF9PUFRJT05fTUFYX0ZQUzoKICAgICAgICAgY2FzZSBJT01YOjpJTlRFUk5BTF9PUFRJT05fU1RBUlRfVElNRToKICAgICAgICAgY2FzZSBJT01YOjpJTlRFUk5BTF9PUFRJT05fVElNRV9MQVBTRToKICAgICAgICAgewpAQCAtMTMxMCw2ICsxNTEwLDE0IEBACiAgICAgICAgICAgICAgICAgaW50NjRfdCBtYXhHYXBVcyA9ICooaW50NjRfdCAqKWRhdGE7CiAgICAgICAgICAgICAgICAgQ0xPR19DT05GSUcoc2V0SW50ZXJuYWxPcHRpb24sICJnYXBVcz0lbGxkIiwgKGxvbmcgbG9uZyltYXhHYXBVcyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlclNvdXJjZS0+c2V0TWF4VGltZXN0YW1wR2FwVXMobWF4R2FwVXMpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IElPTVg6OklOVEVSTkFMX09QVElPTl9NQVhfRlBTKSB7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgIT0gc2l6ZW9mKGZsb2F0KSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZmxvYXQgbWF4RnBzID0gKihmbG9hdCAqKWRhdGE7CisgICAgICAgICAgICAgICAgQ0xPR19DT05GSUcoc2V0SW50ZXJuYWxPcHRpb24sICJtYXhGcHM9JWYiLCBtYXhGcHMpOworICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXJTb3VyY2UtPnNldE1heEZwcyhtYXhGcHMpOwogICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IElPTVg6OklOVEVSTkFMX09QVElPTl9TVEFSVF9USU1FKSB7CiAgICAgICAgICAgICAgICAgaWYgKHNpemUgIT0gc2l6ZW9mKGludDY0X3QpKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTEzMzksMTQgKzE1NDcsMTQgQEAKICAgICB9CiB9CiAKLXZvaWQgT01YTm9kZUluc3RhbmNlOjpvbk1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UgJm1zZykgeworYm9vbCBPTVhOb2RlSW5zdGFuY2U6OmhhbmRsZU1lc3NhZ2Uob214X21lc3NhZ2UgJm1zZykgewogICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBidWZmZXJTb3VyY2UoZ2V0R3JhcGhpY0J1ZmZlclNvdXJjZSgpKTsKIAogICAgIGlmIChtc2cudHlwZSA9PSBvbXhfbWVzc2FnZTo6RklMTF9CVUZGRVJfRE9ORSkgewogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyID0KICAgICAgICAgICAgIGZpbmRCdWZmZXJIZWFkZXIobXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuYnVmZmVyLCBrUG9ydEluZGV4T3V0cHV0KTsKICAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAogICAgICAgICB7CkBAIC0xMzU0LDcgKzE1NjIsOCBAQAogICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcnNXaXRoQ29kZWMucmVtb3ZlKGJ1ZmZlcik7CiAKICAgICAgICAgICAgIENMT0dfQlVNUEVEX0JVRkZFUigKLSAgICAgICAgICAgICAgICAgICAgRkJELCBXSVRIX1NUQVRTKEZVTExfQlVGRkVSKG1zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLmJ1ZmZlciwgYnVmZmVyKSkpOworICAgICAgICAgICAgICAgICAgICBGQkQsIFdJVEhfU1RBVFMoRlVMTF9CVUZGRVIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnUuZXh0ZW5kZWRfYnVmZmVyX2RhdGEuYnVmZmVyLCBidWZmZXIsIG1zZy5mZW5jZUZkKSkpOwogCiAgICAgICAgICAgICB1bmJ1bXBEZWJ1Z0xldmVsX2woa1BvcnRJbmRleE91dHB1dCk7CiAgICAgICAgIH0KQEAgLTEzNjIsMjIgKzE1NzEsMjQgQEAKICAgICAgICAgQnVmZmVyTWV0YSAqYnVmZmVyX21ldGEgPQogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QnVmZmVyTWV0YSAqPihidWZmZXItPnBBcHBQcml2YXRlKTsKIAorICAgICAgICBpZiAoYnVmZmVyLT5uT2Zmc2V0ICsgYnVmZmVyLT5uRmlsbGVkTGVuIDwgYnVmZmVyLT5uT2Zmc2V0CisgICAgICAgICAgICAgICAgfHwgYnVmZmVyLT5uT2Zmc2V0ICsgYnVmZmVyLT5uRmlsbGVkTGVuID4gYnVmZmVyLT5uQWxsb2NMZW4pIHsKKyAgICAgICAgICAgIENMT0dfRVJST1Iob25GaWxsQnVmZmVyRG9uZSwgT01YX0Vycm9yQmFkUGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICBGVUxMX0JVRkZFUihOVUxMLCBidWZmZXIsIG1zZy5mZW5jZUZkKSk7CisgICAgICAgIH0KICAgICAgICAgYnVmZmVyX21ldGEtPkNvcHlGcm9tT01YKGJ1ZmZlcik7CiAKICAgICAgICAgaWYgKGJ1ZmZlclNvdXJjZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAvLyBmaXggdXAgdGhlIGJ1ZmZlciBpbmZvIChlc3BlY2lhbGx5IHRpbWVzdGFtcCkgaWYgbmVlZGVkCiAgICAgICAgICAgICBidWZmZXJTb3VyY2UtPmNvZGVjQnVmZmVyRmlsbGVkKGJ1ZmZlcik7CiAKLSAgICAgICAgICAgIG9teF9tZXNzYWdlIG5ld01zZyA9IG1zZzsKLSAgICAgICAgICAgIG5ld01zZy51LmV4dGVuZGVkX2J1ZmZlcl9kYXRhLnRpbWVzdGFtcCA9IGJ1ZmZlci0+blRpbWVTdGFtcDsKLSAgICAgICAgICAgIG1PYnNlcnZlci0+b25NZXNzYWdlKG5ld01zZyk7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBtc2cudS5leHRlbmRlZF9idWZmZXJfZGF0YS50aW1lc3RhbXAgPSBidWZmZXItPm5UaW1lU3RhbXA7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1zZy50eXBlID09IG9teF9tZXNzYWdlOjpFTVBUWV9CVUZGRVJfRE9ORSkgewogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyID0KICAgICAgICAgICAgIGZpbmRCdWZmZXJIZWFkZXIobXNnLnUuYnVmZmVyX2RhdGEuYnVmZmVyLCBrUG9ydEluZGV4SW5wdXQpOwogICAgICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIHsKQEAgLTEzODUsNyArMTU5Niw3IEBACiAgICAgICAgICAgICBtSW5wdXRCdWZmZXJzV2l0aENvZGVjLnJlbW92ZShidWZmZXIpOwogCiAgICAgICAgICAgICBDTE9HX0JVTVBFRF9CVUZGRVIoCi0gICAgICAgICAgICAgICAgICAgIEVCRCwgV0lUSF9TVEFUUyhFTVBUWV9CVUZGRVIobXNnLnUuYnVmZmVyX2RhdGEuYnVmZmVyLCBidWZmZXIpKSk7CisgICAgICAgICAgICAgICAgICAgIEVCRCwgV0lUSF9TVEFUUyhFTVBUWV9CVUZGRVIobXNnLnUuYnVmZmVyX2RhdGEuYnVmZmVyLCBidWZmZXIsIG1zZy5mZW5jZUZkKSkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGJ1ZmZlclNvdXJjZSAhPSBOVUxMKSB7CkBAIC0xMzk0LDEyICsxNjA1LDI2IEBACiAgICAgICAgICAgICAvLyBEb24ndCBkaXNwYXRjaCBhIG1lc3NhZ2UgYmFjayB0byBBQ29kZWMsIHNpbmNlIGl0IGRvZXNuJ3QKICAgICAgICAgICAgIC8vIGtub3cgdGhhdCBhbnlvbmUgYXNrZWQgdG8gaGF2ZSB0aGUgYnVmZmVyIGVtcHRpZWQgYW5kIHdpbGwKICAgICAgICAgICAgIC8vIGJlIHZlcnkgY29uZnVzZWQuCi0gICAgICAgICAgICBidWZmZXJTb3VyY2UtPmNvZGVjQnVmZmVyRW1wdGllZChidWZmZXIpOwotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgYnVmZmVyU291cmNlLT5jb2RlY0J1ZmZlckVtcHRpZWQoYnVmZmVyLCBtc2cuZmVuY2VGZCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIG1PYnNlcnZlci0+b25NZXNzYWdlKG1zZyk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIE9NWE5vZGVJbnN0YW5jZTo6b25NZXNzYWdlcyhzdGQ6Omxpc3Q8b214X21lc3NhZ2U+ICZtZXNzYWdlcykgeworICAgIGZvciAoc3RkOjpsaXN0PG9teF9tZXNzYWdlPjo6aXRlcmF0b3IgaXQgPSBtZXNzYWdlcy5iZWdpbigpOyBpdCAhPSBtZXNzYWdlcy5lbmQoKTsgKSB7CisgICAgICAgIGlmIChoYW5kbGVNZXNzYWdlKCppdCkpIHsKKyAgICAgICAgICAgIG1lc3NhZ2VzLmVyYXNlKGl0KyspOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghbWVzc2FnZXMuZW1wdHkoKSkgeworICAgICAgICBtT2JzZXJ2ZXItPm9uTWVzc2FnZXMobWVzc2FnZXMpOworICAgIH0KIH0KIAogdm9pZCBPTVhOb2RlSW5zdGFuY2U6Om9uT2JzZXJ2ZXJEaWVkKE9NWE1hc3RlciAqbWFzdGVyKSB7CkBAIC0xNDk2LDggKzE3MjEsOSBAQAogICAgIGlmIChpbnN0YW5jZS0+bUR5aW5nKSB7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgIH0KKyAgICBpbnQgZmVuY2VGZCA9IGluc3RhbmNlLT5yZXRyaWV2ZUZlbmNlRnJvbU1ldGFfbChwQnVmZmVyLCBrUG9ydEluZGV4T3V0cHV0KTsKICAgICByZXR1cm4gaW5zdGFuY2UtPm93bmVyKCktPk9uRW1wdHlCdWZmZXJEb25lKGluc3RhbmNlLT5ub2RlSUQoKSwKLSAgICAgICAgICAgIGluc3RhbmNlLT5maW5kQnVmZmVySUQocEJ1ZmZlciksIHBCdWZmZXIpOworICAgICAgICAgICAgaW5zdGFuY2UtPmZpbmRCdWZmZXJJRChwQnVmZmVyKSwgcEJ1ZmZlciwgZmVuY2VGZCk7CiB9CiAKIC8vIHN0YXRpYwpAQCAtMTUwOSw4ICsxNzM1LDkgQEAKICAgICBpZiAoaW5zdGFuY2UtPm1EeWluZykgewogICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICB9CisgICAgaW50IGZlbmNlRmQgPSBpbnN0YW5jZS0+cmV0cmlldmVGZW5jZUZyb21NZXRhX2wocEJ1ZmZlciwga1BvcnRJbmRleE91dHB1dCk7CiAgICAgcmV0dXJuIGluc3RhbmNlLT5vd25lcigpLT5PbkZpbGxCdWZmZXJEb25lKGluc3RhbmNlLT5ub2RlSUQoKSwKLSAgICAgICAgICAgIGluc3RhbmNlLT5maW5kQnVmZmVySUQocEJ1ZmZlciksIHBCdWZmZXIpOworICAgICAgICAgICAgaW5zdGFuY2UtPmZpbmRCdWZmZXJJRChwQnVmZmVyKSwgcEJ1ZmZlciwgZmVuY2VGZCk7CiB9CiAKIHZvaWQgT01YTm9kZUluc3RhbmNlOjphZGRBY3RpdmVCdWZmZXIoT01YX1UzMiBwb3J0SW5kZXgsIE9NWDo6YnVmZmVyX2lkIGlkKSB7CkBAIC0xNTc0LDE0ICsxODAxLDE0IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1CdWZmZXJJRExvY2spOwogICAgIHNzaXplX3QgaW5kZXggPSBtQnVmZmVySURUb0J1ZmZlckhlYWRlci5pbmRleE9mS2V5KGJ1ZmZlcik7CiAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygiZmluZEJ1ZmZlckhlYWRlcjogYnVmZmVyICV1IG5vdCBmb3VuZCIsIGJ1ZmZlcik7CisgICAgICAgIENMT0dXKCJmaW5kQnVmZmVySGVhZGVyOiBidWZmZXIgJXUgbm90IGZvdW5kIiwgYnVmZmVyKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpoZWFkZXIgPSBtQnVmZmVySURUb0J1ZmZlckhlYWRlci52YWx1ZUF0KGluZGV4KTsKICAgICBCdWZmZXJNZXRhICpidWZmZXJfbWV0YSA9CiAgICAgICAgIHN0YXRpY19jYXN0PEJ1ZmZlck1ldGEgKj4oaGVhZGVyLT5wQXBwUHJpdmF0ZSk7CiAgICAgaWYgKGJ1ZmZlcl9tZXRhLT5nZXRQb3J0SW5kZXgoKSAhPSBwb3J0SW5kZXgpIHsKLSAgICAgICAgQUxPR1coImZpbmRCdWZmZXJIZWFkZXI6IGJ1ZmZlciAldSBmb3VuZCBidXQgd2l0aCBpbmNvcnJlY3QgcG9ydCBpbmRleC4iLCBidWZmZXIpOworICAgICAgICBDTE9HVygiZmluZEJ1ZmZlckhlYWRlcjogYnVmZmVyICV1IGZvdW5kIGJ1dCB3aXRoIGluY29ycmVjdCBwb3J0IGluZGV4LiIsIGJ1ZmZlcik7CiAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjg4MTY4MjciKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTU5Myw3ICsxODIwLDEyIEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUJ1ZmZlcklETG9jayk7Ci0gICAgcmV0dXJuIG1CdWZmZXJIZWFkZXJUb0J1ZmZlcklELnZhbHVlRm9yKGJ1ZmZlckhlYWRlcik7CisgICAgc3NpemVfdCBpbmRleCA9IG1CdWZmZXJIZWFkZXJUb0J1ZmZlcklELmluZGV4T2ZLZXkoYnVmZmVySGVhZGVyKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIENMT0dXKCJmaW5kQnVmZmVySUQ6IGJ1ZmZlckhlYWRlciAlcCBub3QgZm91bmQiLCBidWZmZXJIZWFkZXIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIG1CdWZmZXJIZWFkZXJUb0J1ZmZlcklELnZhbHVlQXQoaW5kZXgpOwogfQogCiB2b2lkIE9NWE5vZGVJbnN0YW5jZTo6aW52YWxpZGF0ZUJ1ZmZlcklEKE9NWDo6YnVmZmVyX2lkIGJ1ZmZlcikgewpAQCAtMTYwMSw4ICsxODMzLDEzIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1CdWZmZXJJRExvY2spOwotICAgIG1CdWZmZXJIZWFkZXJUb0J1ZmZlcklELnJlbW92ZUl0ZW0obUJ1ZmZlcklEVG9CdWZmZXJIZWFkZXIudmFsdWVGb3IoYnVmZmVyKSk7Ci0gICAgbUJ1ZmZlcklEVG9CdWZmZXJIZWFkZXIucmVtb3ZlSXRlbShidWZmZXIpOworICAgIHNzaXplX3QgaW5kZXggPSBtQnVmZmVySURUb0J1ZmZlckhlYWRlci5pbmRleE9mS2V5KGJ1ZmZlcik7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBDTE9HVygiaW52YWxpZGF0ZUJ1ZmZlcklEOiBidWZmZXIgJXUgbm90IGZvdW5kIiwgYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQnVmZmVySGVhZGVyVG9CdWZmZXJJRC5yZW1vdmVJdGVtKG1CdWZmZXJJRFRvQnVmZmVySGVhZGVyLnZhbHVlQXQoaW5kZXgpKTsKKyAgICBtQnVmZmVySURUb0J1ZmZlckhlYWRlci5yZW1vdmVJdGVtc0F0KGluZGV4KTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcAppbmRleCBjMTA3MDAxLi4xM2FmZDQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwCkBAIC01OCw3ICs1OCw3IEBACiAgICAgICAgIE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9VMzIgcGFyYW0sIE9NWF9QVFIgZGF0YSkgewogICAgIENIRUNLKGRhdGEgPT0gTlVMTCk7CiAKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZENvbW1hbmQsIG1IYW5kbGVyLT5pZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZENvbW1hbmQsIG1IYW5kbGVyKTsKICAgICBtc2ctPnNldEludDMyKCJjbWQiLCBjbWQpOwogICAgIG1zZy0+c2V0SW50MzIoInBhcmFtIiwgcGFyYW0pOwogICAgIG1zZy0+cG9zdCgpOwpAQCAtMzE1LDcgKzMxNSw3IEBACiAKIE9NWF9FUlJPUlRZUEUgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6ZW1wdHlUaGlzQnVmZmVyKAogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEVtcHR5VGhpc0J1ZmZlciwgbUhhbmRsZXItPmlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRFbXB0eVRoaXNCdWZmZXIsIG1IYW5kbGVyKTsKICAgICBtc2ctPnNldFBvaW50ZXIoImhlYWRlciIsIGJ1ZmZlcik7CiAgICAgbXNnLT5wb3N0KCk7CiAKQEAgLTMyNCw3ICszMjQsNyBAQAogCiBPTVhfRVJST1JUWVBFIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmZpbGxUaGlzQnVmZmVyKAogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZpbGxUaGlzQnVmZmVyLCBtSGFuZGxlci0+aWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZpbGxUaGlzQnVmZmVyLCBtSGFuZGxlcik7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJoZWFkZXIiLCBidWZmZXIpOwogICAgIG1zZy0+cG9zdCgpOwogCkBAIC01MjAsNyArNTIwLDE1IEBACiAgICAgQ0hFQ0tfTFQocG9ydEluZGV4LCBtUG9ydHMuc2l6ZSgpKTsKIAogICAgIFBvcnRJbmZvICpwb3J0ID0gJm1Qb3J0cy5lZGl0SXRlbUF0KHBvcnRJbmRleCk7Ci0gICAgQ0hFQ0tfRVEoKGludClwb3J0LT5tVHJhbnNpdGlvbiwgKGludClQb3J0SW5mbzo6Tk9ORSk7CisgICAgLy8gSWRlYWxseSwgdGhlIHBvcnQgc2hvdWxkIG5vdCBpbiB0cmFuc2l0aW9uaW5nIHN0YXRlIHdoZW4gZmx1c2hpbmcuCisgICAgLy8gSG93ZXZlciwgaW4gZXJyb3IgaGFuZGxpbmcgY2FzZSwgZS5nLiwgdGhlIGNsaWVudCBjYW4ndCBhbGxvY2F0ZSBidWZmZXJzCisgICAgLy8gd2hlbiBpdCB0cmllcyB0byByZS1lbmFibGUgdGhlIHBvcnQsIHRoZSBwb3J0IHdpbGwgYmUgc3R1Y2sgaW4gRU5BQkxJTkcuCisgICAgLy8gVGhlIGNsaWVudCB3aWxsIHRoZW4gdHJhbnNpdGlvbiB0aGUgY29tcG9uZW50IGZyb20gRXhlY3V0aW5nIHRvIElkbGUsCisgICAgLy8gd2hpY2ggbGVhZHMgdG8gZmx1c2hpbmcgcG9ydHMuIEF0IHRoaXMgdGltZSwgaXQgc2hvdWxkIGJlIG9rIHRvIG5vdGlmeQorICAgIC8vIHRoZSBjbGllbnQgb2YgdGhlIGVycm9yIGFuZCBzdGlsbCBjbGVhciBhbGwgYnVmZmVycyBvbiB0aGUgcG9ydC4KKyAgICBpZiAocG9ydC0+bVRyYW5zaXRpb24gIT0gUG9ydEluZm86Ok5PTkUpIHsKKyAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIDApOworICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcG9ydC0+bUJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgQnVmZmVySW5mbyAqYnVmZmVyID0gJnBvcnQtPm1CdWZmZXJzLmVkaXRJdGVtQXQoaSk7CkBAIC02MTMsNyArNjIxLDcgQEAKIAogICAgICAgICBpZiAocG9ydC0+bVRyYW5zaXRpb24gPT0gUG9ydEluZm86OkRJU0FCTElORykgewogICAgICAgICAgICAgaWYgKHBvcnQtPm1CdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiUG9ydCAlZCBub3cgZGlzYWJsZWQuIiwgaSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIlBvcnQgJXp1IG5vdyBkaXNhYmxlZC4iLCBpKTsKIAogICAgICAgICAgICAgICAgIHBvcnQtPm1UcmFuc2l0aW9uID0gUG9ydEluZm86Ok5PTkU7CiAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudENtZENvbXBsZXRlLCBPTVhfQ29tbWFuZFBvcnREaXNhYmxlLCBpLCBOVUxMKTsKQEAgLTYyMiw3ICs2MzAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKHBvcnQtPm1UcmFuc2l0aW9uID09IFBvcnRJbmZvOjpFTkFCTElORykgewogICAgICAgICAgICAgaWYgKHBvcnQtPm1EZWYuYlBvcHVsYXRlZCA9PSBPTVhfVFJVRSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJQb3J0ICVkIG5vdyBlbmFibGVkLiIsIGkpOworICAgICAgICAgICAgICAgIEFMT0dWKCJQb3J0ICV6dSBub3cgZW5hYmxlZC4iLCBpKTsKIAogICAgICAgICAgICAgICAgIHBvcnQtPm1UcmFuc2l0aW9uID0gUG9ydEluZm86Ok5PTkU7CiAgICAgICAgICAgICAgICAgcG9ydC0+bURlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOwpAQCAtNjQzLDE0ICs2NTEsMTQgQEAKICAgICBpbmZvLT5tVHJhbnNpdGlvbiA9IFBvcnRJbmZvOjpOT05FOwogfQogCi12b2lkIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6Om9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpIHsKK3ZvaWQgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6b25RdWV1ZUZpbGxlZChPTVhfVTMyIHBvcnRJbmRleCBfX3VudXNlZCkgewogfQogCi12b2lkIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KSB7Cit2b2lkIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6Om9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4IF9fdW51c2VkKSB7CiB9CiAKIHZvaWQgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6b25Qb3J0RW5hYmxlQ29tcGxldGVkKAotICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgYm9vbCBlbmFibGVkKSB7CisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4IF9fdW51c2VkLCBib29sIGVuYWJsZWQgX191bnVzZWQpIHsKIH0KIAogTGlzdDxTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpCdWZmZXJJbmZvICo+ICYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcAppbmRleCA5YTEwZWJjLi41MjM5YmM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwCkBAIC0zNCw2ICszNCw4IEBACiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXJNYXBwZXIuaD4KIAorI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNvbnN0IHN0YXRpYyBPTVhfQ09MT1JfRk9STUFUVFlQRSBrU3VwcG9ydGVkQ29sb3JGb3JtYXRzW10gPSB7CkBAIC0xNTUsNyArMTU3LDcgQEAKICAgICB1aW50MzJfdCByYXdCdWZmZXJTaXplID0KICAgICAgICAgaW5EZWYtPmZvcm1hdC52aWRlby5uU3RyaWRlICogaW5EZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgKiAzIC8gMjsKICAgICBpZiAoaW5EZWYtPmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWUpIHsKLSAgICAgICAgaW5EZWYtPm5CdWZmZXJTaXplID0gNCArIG1heChzaXplb2YoYnVmZmVyX2hhbmRsZV90KSwgc2l6ZW9mKEdyYXBoaWNCdWZmZXIgKikpOworICAgICAgICBpbkRlZi0+bkJ1ZmZlclNpemUgPSBtYXgoc2l6ZW9mKFZpZGVvTmF0aXZlTWV0YWRhdGEpLCBzaXplb2YoVmlkZW9HcmFsbG9jTWV0YWRhdGEpKTsKICAgICB9IGVsc2UgewogICAgICAgICBpbkRlZi0+bkJ1ZmZlclNpemUgPSByYXdCdWZmZXJTaXplOwogICAgIH0KQEAgLTMxMCw3ICszMTIsNyBAQAogCiBPTVhfRVJST1JUWVBFIFNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQ6OmludGVybmFsR2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtKSB7Ci0gICAgc3dpdGNoIChpbmRleCkgeworICAgIHN3aXRjaCAoKGludClpbmRleCkgewogICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9FcnJvckNvcnJlY3Rpb246CiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb3RJbXBsZW1lbnRlZDsKQEAgLTM2OCw2ICszNzAsMTMgQEAKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUNvbnN1bWVyVXNhZ2VCaXRzOgorICAgICAgICB7CisgICAgICAgICAgICBPTVhfVTMyICp1c2FnZUJpdHMgPSAoT01YX1UzMiAqKXBhcmFtOworICAgICAgICAgICAgKnVzYWdlQml0cyA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTjsKKyAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjppbnRlcm5hbEdldFBhcmFtZXRlcihpbmRleCwgcGFyYW0pOwogICAgIH0KQEAgLTUwNyw4ICs1MTYsOCBAQAogICAgIHNpemVfdCBkc3RWU3RyaWRlID0gaGVpZ2h0OwogCiAgICAgTWV0YWRhdGFCdWZmZXJUeXBlIGJ1ZmZlclR5cGUgPSAqKE1ldGFkYXRhQnVmZmVyVHlwZSAqKXNyYzsKLSAgICBib29sIHVzaW5nR3JhcGhpY0J1ZmZlciA9IGJ1ZmZlclR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYXBoaWNCdWZmZXI7Ci0gICAgaWYgKCF1c2luZ0dyYXBoaWNCdWZmZXIgJiYgYnVmZmVyVHlwZSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgeworICAgIGJvb2wgdXNpbmdBTldCdWZmZXIgPSBidWZmZXJUeXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXI7CisgICAgaWYgKCF1c2luZ0FOV0J1ZmZlciAmJiBidWZmZXJUeXBlICE9IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKSB7CiAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBtZXRhZGF0YSB0eXBlICglZCkiLCBidWZmZXJUeXBlKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtNTI0LDEzICs1MzMsMTQgQEAKICAgICBpbnQgZm9ybWF0OwogICAgIHNpemVfdCBzcmNTdHJpZGU7CiAgICAgc2l6ZV90IHNyY1ZTdHJpZGU7Ci0gICAgaWYgKHVzaW5nR3JhcGhpY0J1ZmZlcikgewotICAgICAgICBpZiAoc3JjU2l6ZSA8IHNpemVvZihPTVhfVTMyKSArIHNpemVvZihHcmFwaGljQnVmZmVyICopKSB7Ci0gICAgICAgICAgICBBTE9HRSgiTWV0YWRhdGEgaXMgdG9vIHNtYWxsICglenUgdnMgJXp1KSIsIHNyY1NpemUsIHNpemVvZihPTVhfVTMyKSArIHNpemVvZihHcmFwaGljQnVmZmVyICopKTsKKyAgICBpZiAodXNpbmdBTldCdWZmZXIpIHsKKyAgICAgICAgaWYgKHNyY1NpemUgPCBzaXplb2YoVmlkZW9OYXRpdmVNZXRhZGF0YSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNZXRhZGF0YSBpcyB0b28gc21hbGwgKCV6dSB2cyAlenUpIiwgc3JjU2l6ZSwgc2l6ZW9mKFZpZGVvTmF0aXZlTWV0YWRhdGEpKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKLSAgICAgICAgR3JhcGhpY0J1ZmZlciAqYnVmZmVyID0gKihHcmFwaGljQnVmZmVyICoqKShzcmMgKyBzaXplb2YoT01YX1UzMikpOworICAgICAgICBWaWRlb05hdGl2ZU1ldGFkYXRhICZuYXRpdmVNZXRhID0gKihWaWRlb05hdGl2ZU1ldGFkYXRhICopc3JjOworICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyICpidWZmZXIgPSBuYXRpdmVNZXRhLnBCdWZmZXI7CiAgICAgICAgIGhhbmRsZSA9IGJ1ZmZlci0+aGFuZGxlOwogICAgICAgICBmb3JtYXQgPSBidWZmZXItPmZvcm1hdDsKICAgICAgICAgc3JjU3RyaWRlID0gYnVmZmVyLT5zdHJpZGU7CkBAIC01NDEsMTUgKzU1MSwyNiBAQAogICAgICAgICAgICAgLy8gVE9ETyBkbyB3ZSBuZWVkIHRvIHN1cHBvcnQgb3RoZXIgZm9ybWF0cz8KICAgICAgICAgICAgIHNyY1N0cmlkZSAqPSA0OwogICAgICAgICB9CisKKyAgICAgICAgaWYgKG5hdGl2ZU1ldGEubkZlbmNlRmQgPj0gMCkgeworICAgICAgICAgICAgc3A8RmVuY2U+IGZlbmNlID0gbmV3IEZlbmNlKG5hdGl2ZU1ldGEubkZlbmNlRmQpOworICAgICAgICAgICAgbmF0aXZlTWV0YS5uRmVuY2VGZCA9IC0xOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZmVuY2UtPndhaXQoSU9NWDo6a0ZlbmNlVGltZW91dE1zKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiVGltZWQgb3V0IHdhaXRpbmcgb24gaW5wdXQgZmVuY2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIHBhcnQuICBDaGVjayBpZiBhbnlvbmUgdXNlcyB0aGlzLgogCi0gICAgICAgIGlmIChzcmNTaXplIDwgc2l6ZW9mKE9NWF9VMzIpICsgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJNZXRhZGF0YSBpcyB0b28gc21hbGwgKCV6dSB2cyAlenUpIiwgc3JjU2l6ZSwgc2l6ZW9mKE9NWF9VMzIpICsgc2l6ZW9mKGJ1ZmZlcl9oYW5kbGVfdCkpOworICAgICAgICBpZiAoc3JjU2l6ZSA8IHNpemVvZihWaWRlb0dyYWxsb2NNZXRhZGF0YSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNZXRhZGF0YSBpcyB0b28gc21hbGwgKCV6dSB2cyAlenUpIiwgc3JjU2l6ZSwgc2l6ZW9mKFZpZGVvR3JhbGxvY01ldGFkYXRhKSk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCi0gICAgICAgIGhhbmRsZSA9ICooYnVmZmVyX2hhbmRsZV90ICopKHNyYyArIHNpemVvZihPTVhfVTMyKSk7CisgICAgICAgIFZpZGVvR3JhbGxvY01ldGFkYXRhICZncmFsbG9jTWV0YSA9ICooVmlkZW9HcmFsbG9jTWV0YWRhdGEgKikoc3JjKTsKKyAgICAgICAgaGFuZGxlID0gZ3JhbGxvY01ldGEucEhhbmRsZTsKICAgICAgICAgLy8gYXNzdW1lIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV84ODg4CiAgICAgICAgIC8vIHRoZXJlIGlzIG5vIHdheSB0byBnZXQgdGhlIHNyYyBzdHJpZGUgd2l0aG91dCB0aGUgZ3JhcGhpYyBidWZmZXIKICAgICAgICAgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzg4ODg7CkBAIC02MzEsNyArNjUyLDcgQEAKIE9NWF9FUlJPUlRZUEUgU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudDo6Z2V0RXh0ZW5zaW9uSW5kZXgoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KSB7CiAgICAgaWYgKCFzdHJjbXAobmFtZSwgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzIikgfHwKLSAgICAgICAgIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LnN0b3JlR3JhcGhpY0J1ZmZlckluTWV0YURhdGEiKSkgeworICAgICAgICAhc3RyY21wKG5hbWUsICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguc3RvcmVBTldCdWZmZXJJbk1ldGFkYXRhIikpIHsKICAgICAgICAgKihpbnQzMl90KilpbmRleCA9IGtTdG9yZU1ldGFEYXRhRXh0ZW5zaW9uSW5kZXg7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggNDQ3YjI5ZS4uMDJlOTdmMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL0FuZHJvaWQubWsKQEAgLTExLDcgKzExLDggQEAKIAkkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCiAJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heAogCi1MT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKIAogTE9DQUxfTU9EVUxFIDo9IG9teF90ZXN0cwogCkBAIC0yMCwzICsyMSwyNCBAQAogTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBGcmFtZURyb3BwZXJfdGVzdAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCUZyYW1lRHJvcHBlcl90ZXN0LmNwcCBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorCWxpYnN0YWdlZnJpZ2h0X29teCBcCisJbGlidXRpbHMgXAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKwlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teCBcCisKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCisKK2luY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9GcmFtZURyb3BwZXJfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvRnJhbWVEcm9wcGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NjZiNWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvRnJhbWVEcm9wcGVyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJGcmFtZURyb3BwZXJfdGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJGcmFtZURyb3BwZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBUZXN0RnJhbWUgeworICBpbnQ2NF90IHRpbWVVczsKKyAgYm9vbCBzaG91bGREcm9wOworfTsKKworc3RhdGljIGNvbnN0IFRlc3RGcmFtZSB0ZXN0RnJhbWVzMjBGcHNbXSA9IHsKKyAgICB7MTAwMDAwMCwgZmFsc2V9LCB7MTA1MDAwMCwgZmFsc2V9LCB7MTEwMDAwMCwgZmFsc2V9LCB7MTE1MDAwMCwgZmFsc2V9LAorICAgIHsxMjAwMDAwLCBmYWxzZX0sIHsxMjUwMDAwLCBmYWxzZX0sIHsxMzAwMDAwLCBmYWxzZX0sIHsxMzUwMDAwLCBmYWxzZX0sCisgICAgezE0MDAwMDAsIGZhbHNlfSwgezE0NTAwMDAsIGZhbHNlfSwgezE1MDAwMDAsIGZhbHNlfSwgezE1NTAwMDAsIGZhbHNlfSwKKyAgICB7MTYwMDAwMCwgZmFsc2V9LCB7MTY1MDAwMCwgZmFsc2V9LCB7MTcwMDAwMCwgZmFsc2V9LCB7MTc1MDAwMCwgZmFsc2V9LAorICAgIHsxODAwMDAwLCBmYWxzZX0sIHsxODUwMDAwLCBmYWxzZX0sIHsxOTAwMDAwLCBmYWxzZX0sIHsxOTUwMDAwLCBmYWxzZX0sCit9OworCitzdGF0aWMgY29uc3QgVGVzdEZyYW1lIHRlc3RGcmFtZXMzMEZwc1tdID0geworICAgIHsxMDAwMDAwLCBmYWxzZX0sIHsxMDMzMzMzLCBmYWxzZX0sIHsxMDY2NjY3LCBmYWxzZX0sIHsxMTAwMDAwLCBmYWxzZX0sCisgICAgezExMzMzMzMsIGZhbHNlfSwgezExNjY2NjcsIGZhbHNlfSwgezEyMDAwMDAsIGZhbHNlfSwgezEyMzMzMzMsIGZhbHNlfSwKKyAgICB7MTI2NjY2NywgZmFsc2V9LCB7MTMwMDAwMCwgZmFsc2V9LCB7MTMzMzMzMywgZmFsc2V9LCB7MTM2NjY2NywgZmFsc2V9LAorICAgIHsxNDAwMDAwLCBmYWxzZX0sIHsxNDMzMzMzLCBmYWxzZX0sIHsxNDY2NjY3LCBmYWxzZX0sIHsxNTAwMDAwLCBmYWxzZX0sCisgICAgezE1MzMzMzMsIGZhbHNlfSwgezE1NjY2NjcsIGZhbHNlfSwgezE2MDAwMDAsIGZhbHNlfSwgezE2MzMzMzMsIGZhbHNlfSwKK307CisKK3N0YXRpYyBjb25zdCBUZXN0RnJhbWUgdGVzdEZyYW1lczQwRnBzW10gPSB7CisgICAgezEwMDAwMDAsIGZhbHNlfSwgezEwMjUwMDAsIHRydWV9LCB7MTA1MDAwMCwgZmFsc2V9LCB7MTA3NTAwMCwgZmFsc2V9LAorICAgIHsxMTAwMDAwLCBmYWxzZX0sIHsxMTI1MDAwLCB0cnVlfSwgezExNTAwMDAsIGZhbHNlfSwgezExNzUwMDAsIGZhbHNlfSwKKyAgICB7MTIwMDAwMCwgZmFsc2V9LCB7MTIyNTAwMCwgdHJ1ZX0sIHsxMjUwMDAwLCBmYWxzZX0sIHsxMjc1MDAwLCBmYWxzZX0sCisgICAgezEzMDAwMDAsIGZhbHNlfSwgezEzMjUwMDAsIHRydWV9LCB7MTM1MDAwMCwgZmFsc2V9LCB7MTM3NTAwMCwgZmFsc2V9LAorICAgIHsxNDAwMDAwLCBmYWxzZX0sIHsxNDI1MDAwLCB0cnVlfSwgezE0NTAwMDAsIGZhbHNlfSwgezE0NzUwMDAsIGZhbHNlfSwKK307CisKK3N0YXRpYyBjb25zdCBUZXN0RnJhbWUgdGVzdEZyYW1lczYwRnBzW10gPSB7CisgICAgezEwMDAwMDAsIGZhbHNlfSwgezEwMTY2NjcsIHRydWV9LCB7MTAzMzMzMywgZmFsc2V9LCB7MTA1MDAwMCwgdHJ1ZX0sCisgICAgezEwNjY2NjcsIGZhbHNlfSwgezEwODMzMzMsIHRydWV9LCB7MTEwMDAwMCwgZmFsc2V9LCB7MTExNjY2NywgdHJ1ZX0sCisgICAgezExMzMzMzMsIGZhbHNlfSwgezExNTAwMDAsIHRydWV9LCB7MTE2NjY2NywgZmFsc2V9LCB7MTE4MzMzMywgdHJ1ZX0sCisgICAgezEyMDAwMDAsIGZhbHNlfSwgezEyMTY2NjcsIHRydWV9LCB7MTIzMzMzMywgZmFsc2V9LCB7MTI1MDAwMCwgdHJ1ZX0sCisgICAgezEyNjY2NjcsIGZhbHNlfSwgezEyODMzMzMsIHRydWV9LCB7MTMwMDAwMCwgZmFsc2V9LCB7MTMxNjY2NywgdHJ1ZX0sCit9OworCitzdGF0aWMgY29uc3QgVGVzdEZyYW1lIHRlc3RGcmFtZXNWYXJpYWJsZUZwc1tdID0geworICAgIC8vIDQwZnBzCisgICAgezEwMDAwMDAsIGZhbHNlfSwgezEwMjUwMDAsIHRydWV9LCB7MTA1MDAwMCwgZmFsc2V9LCB7MTA3NTAwMCwgZmFsc2V9LAorICAgIHsxMTAwMDAwLCBmYWxzZX0sIHsxMTI1MDAwLCB0cnVlfSwgezExNTAwMDAsIGZhbHNlfSwgezExNzUwMDAsIGZhbHNlfSwKKyAgICB7MTIwMDAwMCwgZmFsc2V9LCB7MTIyNTAwMCwgdHJ1ZX0sIHsxMjUwMDAwLCBmYWxzZX0sIHsxMjc1MDAwLCBmYWxzZX0sCisgICAgezEzMDAwMDAsIGZhbHNlfSwgezEzMjUwMDAsIHRydWV9LCB7MTM1MDAwMCwgZmFsc2V9LCB7MTM3NTAwMCwgZmFsc2V9LAorICAgIHsxNDAwMDAwLCBmYWxzZX0sIHsxNDI1MDAwLCB0cnVlfSwgezE0NTAwMDAsIGZhbHNlfSwgezE0NzUwMDAsIGZhbHNlfSwKKyAgICAvLyBhIHRpbWVzdGFtcCBqdW1wIHBsdXMgc3dpdGNoIHRvIDIwZnBzCisgICAgezIwMDAwMDAsIGZhbHNlfSwgezIwNTAwMDAsIGZhbHNlfSwgezIxMDAwMDAsIGZhbHNlfSwgezIxNTAwMDAsIGZhbHNlfSwKKyAgICB7MjIwMDAwMCwgZmFsc2V9LCB7MjI1MDAwMCwgZmFsc2V9LCB7MjMwMDAwMCwgZmFsc2V9LCB7MjM1MDAwMCwgZmFsc2V9LAorICAgIHsyNDAwMDAwLCBmYWxzZX0sIHsyNDUwMDAwLCBmYWxzZX0sIHsyNTAwMDAwLCBmYWxzZX0sIHsyNTUwMDAwLCBmYWxzZX0sCisgICAgezI2MDAwMDAsIGZhbHNlfSwgezI2NTAwMDAsIGZhbHNlfSwgezI3MDAwMDAsIGZhbHNlfSwgezI3NTAwMDAsIGZhbHNlfSwKKyAgICB7MjgwMDAwMCwgZmFsc2V9LCB7Mjg1MDAwMCwgZmFsc2V9LCB7MjkwMDAwMCwgZmFsc2V9LCB7Mjk1MDAwMCwgZmFsc2V9LAorICAgIC8vIDYwZnBzCisgICAgezI5NjY2NjcsIGZhbHNlfSwgezI5ODMzMzMsIHRydWV9LCB7MzAwMDAwMCwgZmFsc2V9LCB7MzAxNjY2NywgdHJ1ZX0sCisgICAgezMwMzMzMzMsIGZhbHNlfSwgezMwNTAwMDAsIHRydWV9LCB7MzA2NjY2NywgZmFsc2V9LCB7MzA4MzMzMywgdHJ1ZX0sCisgICAgezMxMDAwMDAsIGZhbHNlfSwgezMxMTY2NjcsIHRydWV9LCB7MzEzMzMzMywgZmFsc2V9LCB7MzE1MDAwMCwgdHJ1ZX0sCisgICAgezMxNjY2NjcsIGZhbHNlfSwgezMxODMzMzMsIHRydWV9LCB7MzIwMDAwMCwgZmFsc2V9LCB7MzIxNjY2NywgdHJ1ZX0sCisgICAgezMyMzMzMzMsIGZhbHNlfSwgezMyNTAwMDAsIHRydWV9LCB7MzI2NjY2NywgZmFsc2V9LCB7MzI4MzMzMywgdHJ1ZX0sCit9OworCitzdGF0aWMgY29uc3QgaW50IGtNYXhUZXN0Sml0dGVyVXMgPSAyMDAwOworLy8gcmV0dXJuIG9uZSBvZiAxMDAwLCAwLCAtMTAwMCBhcyBqaXR0ZXIuCitzdGF0aWMgaW50IEdldEppdHRlcihzaXplX3QgaSkgeworICAgIHJldHVybiAoMSAtIChpICUgMykpICogKGtNYXhUZXN0Sml0dGVyVXMgLyAyKTsKK30KKworY2xhc3MgRnJhbWVEcm9wcGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIEZyYW1lRHJvcHBlclRlc3QoKSA6IG1GcmFtZURyb3BwZXIobmV3IEZyYW1lRHJvcHBlcigpKSB7CisgICAgICAgIEVYUEVDVF9FUShPSywgbUZyYW1lRHJvcHBlci0+c2V0TWF4RnJhbWVSYXRlKDMwLjApKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIFJ1blRlc3QoY29uc3QgVGVzdEZyYW1lKiBmcmFtZXMsIHNpemVfdCBzaXplKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgICAgICBpbnQgaml0dGVyID0gR2V0Sml0dGVyKGkpOworICAgICAgICAgICAgaW50NjRfdCB0ZXN0VGltZVVzID0gZnJhbWVzW2ldLnRpbWVVcyArIGppdHRlcjsKKyAgICAgICAgICAgIHByaW50ZigidGltZSAlbGxkLCB0ZXN0VGltZSAlbGxkLCBqaXR0ZXIgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZnJhbWVzW2ldLnRpbWVVcywgKGxvbmcgbG9uZyl0ZXN0VGltZVVzLCBqaXR0ZXIpOworICAgICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc1tpXS5zaG91bGREcm9wLCBtRnJhbWVEcm9wcGVyLT5zaG91bGREcm9wKHRlc3RUaW1lVXMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPEZyYW1lRHJvcHBlcj4gbUZyYW1lRHJvcHBlcjsKK307CisKK1RFU1RfRihGcmFtZURyb3BwZXJUZXN0LCBUZXN0SW52YWxpZE1heEZyYW1lUmF0ZSkgeworICAgIEVYUEVDVF9ORShPSywgbUZyYW1lRHJvcHBlci0+c2V0TWF4RnJhbWVSYXRlKC0xLjApKTsKKyAgICBFWFBFQ1RfTkUoT0ssIG1GcmFtZURyb3BwZXItPnNldE1heEZyYW1lUmF0ZSgwKSk7Cit9CisKK1RFU1RfRihGcmFtZURyb3BwZXJUZXN0LCBUZXN0MjBGcHMpIHsKKyAgICBSdW5UZXN0KHRlc3RGcmFtZXMyMEZwcywgQVJSQVlfU0laRSh0ZXN0RnJhbWVzMjBGcHMpKTsKK30KKworVEVTVF9GKEZyYW1lRHJvcHBlclRlc3QsIFRlc3QzMEZwcykgeworICAgIFJ1blRlc3QodGVzdEZyYW1lczMwRnBzLCBBUlJBWV9TSVpFKHRlc3RGcmFtZXMzMEZwcykpOworfQorCitURVNUX0YoRnJhbWVEcm9wcGVyVGVzdCwgVGVzdDQwRnBzKSB7CisgICAgUnVuVGVzdCh0ZXN0RnJhbWVzNDBGcHMsIEFSUkFZX1NJWkUodGVzdEZyYW1lczQwRnBzKSk7Cit9CisKK1RFU1RfRihGcmFtZURyb3BwZXJUZXN0LCBUZXN0NjBGcHMpIHsKKyAgICBSdW5UZXN0KHRlc3RGcmFtZXM2MEZwcywgQVJSQVlfU0laRSh0ZXN0RnJhbWVzNjBGcHMpKTsKK30KKworVEVTVF9GKEZyYW1lRHJvcHBlclRlc3QsIFRlc3RWYXJpYWJsZUZwcykgeworICAgIFJ1blRlc3QodGVzdEZyYW1lc1ZhcmlhYmxlRnBzLCBBUlJBWV9TSVpFKHRlc3RGcmFtZXNWYXJpYWJsZUZwcykpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKaW5kZXggNjdmZjE0NS4uNjQ0YjZlZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcApAQCAtNjQsOSArNjQsMTEgQEAKICAgICByZXR1cm4gbU9NWCAhPSAwID8gT0sgOiBOT19JTklUOwogfQogCi12b2lkIEhhcm5lc3M6Om9uTWVzc2FnZShjb25zdCBvbXhfbWVzc2FnZSAmbXNnKSB7Cit2b2lkIEhhcm5lc3M6Om9uTWVzc2FnZXMoY29uc3Qgc3RkOjpsaXN0PG9teF9tZXNzYWdlPiAmbWVzc2FnZXMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1NZXNzYWdlUXVldWUucHVzaF9iYWNrKG1zZyk7CisgICAgZm9yIChzdGQ6Omxpc3Q8b214X21lc3NhZ2U+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1lc3NhZ2VzLmNiZWdpbigpOyBpdCAhPSBtZXNzYWdlcy5jZW5kKCk7ICkgeworICAgICAgICBtTWVzc2FnZVF1ZXVlLnB1c2hfYmFjaygqaXQrKyk7CisgICAgfQogICAgIG1NZXNzYWdlQWRkZWRDb25kaXRpb24uc2lnbmFsKCk7CiB9CiAKQEAgLTE5Myw3ICsxOTUsNyBAQAogICAgICAgICBDSEVDSyhidWZmZXIubU1lbW9yeSAhPSBOVUxMKTsKIAogICAgICAgICBlcnIgPSBtT01YLT5hbGxvY2F0ZUJ1ZmZlcldpdGhCYWNrdXAoCi0gICAgICAgICAgICAgICAgbm9kZSwgcG9ydEluZGV4LCBidWZmZXIubU1lbW9yeSwgJmJ1ZmZlci5tSUQpOworICAgICAgICAgICAgICAgIG5vZGUsIHBvcnRJbmRleCwgYnVmZmVyLm1NZW1vcnksICZidWZmZXIubUlELCBidWZmZXIubU1lbW9yeS0+c2l6ZSgpKTsKICAgICAgICAgRVhQRUNUX1NVQ0NFU1MoZXJyLCAiYWxsb2NhdGVCdWZmZXIiKTsKIAogICAgICAgICBidWZmZXJzLT5wdXNoKGJ1ZmZlcik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuaAppbmRleCBiYjhmZDBjLi4xZWJmM2FhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmgKQEAgLTc0LDcgKzc0LDcgQEAKIAogICAgIHN0YXR1c190IHRlc3RBbGwoKTsKIAotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UgJm1zZyk7CisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZXMoY29uc3Qgc3RkOjpsaXN0PG9teF9tZXNzYWdlPiAmbWVzc2FnZXMpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+SGFybmVzcygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmNwcAppbmRleCBhNmJkODI0Li5hODZhYjc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmNwcApAQCAtODIsNyArODIsNyBAQAogICAgICAgICBzaXplX3QgaW5kZXgsCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAogICAgICAgICBib29sIGluamVjdGVkKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEFkZFN0cmVhbSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEFkZFN0cmVhbSwgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQzMigicnRwLXNvY2tldCIsIHJ0cFNvY2tldCk7CiAgICAgbXNnLT5zZXRJbnQzMigicnRjcC1zb2NrZXQiLCBydGNwU29ja2V0KTsKICAgICBtc2ctPnNldE9iamVjdCgic2Vzc2lvbi1kZXNjIiwgc2Vzc2lvbkRlc2MpOwpAQCAtOTMsNyArOTMsNyBAQAogfQogCiB2b2lkIEFSVFBDb25uZWN0aW9uOjpyZW1vdmVTdHJlYW0oaW50IHJ0cFNvY2tldCwgaW50IHJ0Y3BTb2NrZXQpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVtb3ZlU3RyZWFtLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVtb3ZlU3RyZWFtLCB0aGlzKTsKICAgICBtc2ctPnNldEludDMyKCJydHAtc29ja2V0IiwgcnRwU29ja2V0KTsKICAgICBtc2ctPnNldEludDMyKCJydGNwLXNvY2tldCIsIHJ0Y3BTb2NrZXQpOwogICAgIG1zZy0+cG9zdCgpOwpAQCAtMjMzLDcgKzIzMyw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbFN0cmVhbXMsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQb2xsU3RyZWFtcywgdGhpcyk7CiAgICAgbXNnLT5wb3N0KCk7CiAKICAgICBtUG9sbEV2ZW50UGVuZGluZyA9IHRydWU7CkBAIC02MzksNyArNjM5LDcgQEAKIH0KIAogdm9pZCBBUlRQQ29ubmVjdGlvbjo6aW5qZWN0UGFja2V0KGludCBpbmRleCwgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRJbmplY3RQYWNrZXQsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRJbmplY3RQYWNrZXQsIHRoaXMpOwogICAgIG1zZy0+c2V0SW50MzIoImluZGV4IiwgaW5kZXgpOwogICAgIG1zZy0+c2V0QnVmZmVyKCJidWZmZXIiLCBidWZmZXIpOwogICAgIG1zZy0+cG9zdCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU2Vzc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTZXNzaW9uLmNwcAppbmRleCBiYTRlMzNjLi5lNWFjYjA2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTZXNzaW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTZXNzaW9uLmNwcApAQCAtODIsNyArODIsNyBAQAogICAgICAgICBpbmZvLT5tUlRQU29ja2V0ID0gcnRwU29ja2V0OwogICAgICAgICBpbmZvLT5tUlRDUFNvY2tldCA9IHJ0Y3BTb2NrZXQ7CiAKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEFjY2Vzc1VuaXRDb21wbGV0ZSwgaWQoKSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBY2Nlc3NVbml0Q29tcGxldGUsIHRoaXMpOwogICAgICAgICBub3RpZnktPnNldFNpemUoInRyYWNrLWluZGV4IiwgbVRyYWNrcy5zaXplKCkgLSAxKTsKIAogICAgICAgICBtUlRQQ29ubi0+YWRkU3RyZWFtKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAKaW5kZXggZTE2MDdiZi4uNTZjNGFhNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwCkBAIC0xNDYsNyArMTQ2LDcgQEAKICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CiAKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIG1SZWZsZWN0b3ItPmlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgbVJlZmxlY3RvcikpLT5wb3N0KCk7CiAKICAgICB3aGlsZSAoIShtRmxhZ3MgJiBrRmxhZ1N0YXJ0ZWQpKSB7CiAgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CkBAIC0xNjEsNyArMTYxLDcgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCBtUmVmbGVjdG9yLT5pZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RvcCwgbVJlZmxlY3RvcikpLT5wb3N0KCk7CiAKICAgICB3aGlsZSAobUZsYWdzICYga0ZsYWdTdGFydGVkKSB7CiAgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CkBAIC0yMTMsOCArMjEzLDggQEAKICAgICAgICAgICAgICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVhZCwgbVJlZmxlY3Rvci0+aWQoKSkpLT5wb3N0KCk7Ci0gICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0U2VuZFNSLCBtUmVmbGVjdG9yLT5pZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkLCBtUmVmbGVjdG9yKSktPnBvc3QoKTsKKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTZW5kU1IsIG1SZWZsZWN0b3IpKS0+cG9zdCgpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuaAppbmRleCBmZGM4ZDIzLi5iZThiYzEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuaApAQCAtMzIsNyArMzIsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKLXN0cnVjdCBNZWRpYUJ1ZmZlcjsKK2NsYXNzIE1lZGlhQnVmZmVyOwogCiBzdHJ1Y3QgQVJUUFdyaXRlciA6IHB1YmxpYyBNZWRpYVdyaXRlciB7CiAgICAgQVJUUFdyaXRlcihpbnQgZmQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCmluZGV4IDYwYjNhYWYuLjg1NWZmZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKQEAgLTY4LDI4ICs2OCwyOCBAQAogfQogCiB2b2lkIEFSVFNQQ29ubmVjdGlvbjo6Y29ubmVjdChjb25zdCBjaGFyICp1cmwsIGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29ubmVjdCwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbm5lY3QsIHRoaXMpOwogICAgIG1zZy0+c2V0U3RyaW5nKCJ1cmwiLCB1cmwpOwogICAgIG1zZy0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKIHZvaWQgQVJUU1BDb25uZWN0aW9uOjpkaXNjb25uZWN0KGNvbnN0IHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RGlzY29ubmVjdCwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERpc2Nvbm5lY3QsIHRoaXMpOwogICAgIG1zZy0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKIHZvaWQgQVJUU1BDb25uZWN0aW9uOjpzZW5kUmVxdWVzdCgKICAgICAgICAgY29uc3QgY2hhciAqcmVxdWVzdCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZW5kUmVxdWVzdCwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRSZXF1ZXN0LCB0aGlzKTsKICAgICBtc2ctPnNldFN0cmluZygicmVxdWVzdCIsIHJlcXVlc3QpOwogICAgIG1zZy0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CiAKIHZvaWQgQVJUU1BDb25uZWN0aW9uOjpvYnNlcnZlQmluYXJ5RGF0YShjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdE9ic2VydmVCaW5hcnlEYXRhLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0T2JzZXJ2ZUJpbmFyeURhdGEsIHRoaXMpOwogICAgIG1zZy0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CiAgICAgbXNnLT5wb3N0KCk7CiB9CkBAIC0yODYsNyArMjg2LDcgQEAKIAogICAgIGlmIChlcnIgPCAwKSB7CiAgICAgICAgIGlmIChlcnJubyA9PSBFSU5QUk9HUkVTUykgewotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbXBsZXRlQ29ubmVjdGlvbiwgaWQoKSk7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29tcGxldGVDb25uZWN0aW9uLCB0aGlzKTsKICAgICAgICAgICAgIG1zZy0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJjb25uZWN0aW9uLWlkIiwgbUNvbm5lY3Rpb25JRCk7CiAgICAgICAgICAgICBtc2ctPnBvc3QoKTsKQEAgLTUyMyw3ICs1MjMsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlY2VpdmVSZXNwb25zZSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlY2VpdmVSZXNwb25zZSwgdGhpcyk7CiAgICAgbXNnLT5wb3N0KCk7CiAKICAgICBtUmVjZWl2ZVJlc3BvbnNlRXZlbnRQZW5kaW5nID0gdHJ1ZTsKQEAgLTc0Niw3ICs3NDYsNyBAQAogICAgICAgICAgICAgQVN0cmluZyByZXF1ZXN0OwogICAgICAgICAgICAgQ0hFQ0socmVwbHktPmZpbmRTdHJpbmcoIm9yaWdpbmFsLXJlcXVlc3QiLCAmcmVxdWVzdCkpOwogCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZFJlcXVlc3QsIGlkKCkpOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRSZXF1ZXN0LCB0aGlzKTsKICAgICAgICAgICAgIG1zZy0+c2V0TWVzc2FnZSgicmVwbHkiLCByZXBseSk7CiAgICAgICAgICAgICBtc2ctPnNldFN0cmluZygicmVxdWVzdCIsIHJlcXVlc3QuY19zdHIoKSwgcmVxdWVzdC5zaXplKCkpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQubWsKaW5kZXggOWZlZGI3MS4uYzVlOGMzNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5tawpAQCAtMzEsNyArMzEsOCBAQAogICAgIExPQ0FMX0NGTEFHUyArPSAtV25vLXBzYWJpCiBlbmRpZgogCi1MT0NBTF9DRkxBR1MgKz0gLVdlcnJvcgorTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKIAogTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gJChMT0NBTF9QQVRIKS9BbmRyb2lkLm1rCiAKQEAgLTU0LDcgKzU1LDggQEAKIAlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKIAkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4CiAKLUxPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhcgorTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKaW5kZXggM2JmNDg5Yi4uMGQwYmFmMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCkBAIC05OCw2ICs5OCw3IEBACiAgICAgZW51bSB7CiAgICAgICAgIGtXaGF0Q29ubmVjdGVkICAgICAgICAgICAgICAgICAgPSAnY29ubicsCiAgICAgICAgIGtXaGF0RGlzY29ubmVjdGVkICAgICAgICAgICAgICAgPSAnZGlzYycsCisgICAgICAgIGtXaGF0U2Vla1BhdXNlZCAgICAgICAgICAgICAgICAgPSAnc3BhdScsCiAgICAgICAgIGtXaGF0U2Vla0RvbmUgICAgICAgICAgICAgICAgICAgPSAnc2RvbicsCiAKICAgICAgICAga1doYXRBY2Nlc3NVbml0ICAgICAgICAgICAgICAgICA9ICdhY2NVJywKQEAgLTE2OSwxMCArMTcwLDEwIEBACiAgICAgICAgIGxvb3BlcigpLT5yZWdpc3RlckhhbmRsZXIobUNvbm4pOwogICAgICAgICAoMSA/IG1OZXRMb29wZXIgOiBsb29wZXIoKSktPnJlZ2lzdGVySGFuZGxlcihtUlRQQ29ubik7CiAKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZSgnYmlueScsIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKCdiaW55JywgdGhpcyk7CiAgICAgICAgIG1Db25uLT5vYnNlcnZlQmluYXJ5RGF0YShub3RpZnkpOwogCi0gICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnY29ubicsIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Nvbm4nLCB0aGlzKTsKICAgICAgICAgbUNvbm4tPmNvbm5lY3QobU9yaWdpbmFsU2Vzc2lvblVSTC5jX3N0cigpLCByZXBseSk7CiAgICAgfQogCkBAIC0xODAsMTAgKzE4MSwxMCBAQAogICAgICAgICBsb29wZXIoKS0+cmVnaXN0ZXJIYW5kbGVyKG1Db25uKTsKICAgICAgICAgKDEgPyBtTmV0TG9vcGVyIDogbG9vcGVyKCkpLT5yZWdpc3RlckhhbmRsZXIobVJUUENvbm4pOwogCi0gICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2UoJ2JpbnknLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZSgnYmlueScsIHRoaXMpOwogICAgICAgICBtQ29ubi0+b2JzZXJ2ZUJpbmFyeURhdGEobm90aWZ5KTsKIAotICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3NkcGwnLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdzZHBsJywgdGhpcyk7CiAgICAgICAgIHJlcGx5LT5zZXRPYmplY3QoImRlc2NyaXB0aW9uIiwgZGVzYyk7CiAgICAgICAgIG1Db25uLT5jb25uZWN0KG1PcmlnaW5hbFNlc3Npb25VUkwuY19zdHIoKSwgcmVwbHkpOwogICAgIH0KQEAgLTIxMCwyOSArMjExLDM1IEBACiAgICAgfQogCiAgICAgdm9pZCBkaXNjb25uZWN0KCkgewotICAgICAgICAobmV3IEFNZXNzYWdlKCdhYm9yJywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgIChuZXcgQU1lc3NhZ2UoJ2Fib3InLCB0aGlzKSktPnBvc3QoKTsKICAgICB9CiAKICAgICB2b2lkIHNlZWsoaW50NjRfdCB0aW1lVXMpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgnc2VlaycsIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCdzZWVrJywgdGhpcyk7CiAgICAgICAgIG1zZy0+c2V0SW50NjQoInRpbWUiLCB0aW1lVXMpOwogICAgICAgICBtUGF1c2VHZW5lcmF0aW9uKys7CiAgICAgICAgIG1zZy0+cG9zdCgpOwogICAgIH0KIAorICAgIHZvaWQgY29udGludWVTZWVrQWZ0ZXJQYXVzZShpbnQ2NF90IHRpbWVVcykgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCdzZWUxJywgdGhpcyk7CisgICAgICAgIG1zZy0+c2V0SW50NjQoInRpbWUiLCB0aW1lVXMpOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9CisKICAgICBib29sIGlzU2Vla2FibGUoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtU2Vla2FibGU7CiAgICAgfQogCiAgICAgdm9pZCBwYXVzZSgpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgncGF1cycsIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCdwYXVzJywgdGhpcyk7CiAgICAgICAgIG1QYXVzZUdlbmVyYXRpb24rKzsKICAgICAgICAgbXNnLT5zZXRJbnQzMigicGF1c2VjaGVjayIsIG1QYXVzZUdlbmVyYXRpb24pOwogICAgICAgICBtc2ctPnBvc3Qoa1BhdXNlRGVsYXlVcyk7CiAgICAgfQogCiAgICAgdm9pZCByZXN1bWUoKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoJ3Jlc3UnLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgncmVzdScsIHRoaXMpOwogICAgICAgICBtUGF1c2VHZW5lcmF0aW9uKys7CiAgICAgICAgIG1zZy0+cG9zdCgpOwogICAgIH0KQEAgLTQ1NCwxMCArNDYxLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJBY2NlcHQ6IGFwcGxpY2F0aW9uL3NkcFxyXG4iKTsKICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKIAotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Rlc2MnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdkZXNjJywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdkaXNjJywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ2Rpc2MnLCB0aGlzKSktPnBvc3QoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC00NjgsMTAgKzQ3NSwxMCBAQAogCiAgICAgICAgICAgICAgICAgaW50MzJfdCByZWNvbm5lY3Q7CiAgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJyZWNvbm5lY3QiLCAmcmVjb25uZWN0KSAmJiByZWNvbm5lY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdjb25uJywgaWQoKSk7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnY29ubicsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICBtQ29ubi0+Y29ubmVjdChtT3JpZ2luYWxTZXNzaW9uVVJMLmNfc3RyKCksIHJlcGx5KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCB0aGlzKSktPnBvc3QoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC01MTQsNyArNTIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgicmV3cml0dGVuIHNlc3Npb24gdXJsOiAnJXMnIiwgbVNlc3Npb25VUkwuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnY29ubicsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdjb25uJywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubi0+Y29ubmVjdChtT3JpZ2luYWxTZXNzaW9uVVJMLmNfc3RyKCksIHJlcGx5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC01ODYsNyArNTkzLDcgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnZGlzYycsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Rpc2MnLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgbUNvbm4tPmRpc2Nvbm5lY3QocmVwbHkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTYzMSw3ICs2MzgsNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdkaXNjJywgaWQoKSk7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnZGlzYycsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICBtQ29ubi0+ZGlzY29ubmVjdChyZXBseSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjUxLDcgKzY1OCw3IEBACiAgICAgICAgICAgICAgICAgaW50MzJfdCByZXN1bHQ7CiAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInJlc3VsdCIsICZyZXN1bHQpKTsKIAotICAgICAgICAgICAgICAgIEFMT0dJKCJTRVRVUCglZCkgY29tcGxldGVkIHdpdGggcmVzdWx0ICVkICglcykiLAorICAgICAgICAgICAgICAgIEFMT0dJKCJTRVRVUCglenUpIGNvbXBsZXRlZCB3aXRoIHJlc3VsdCAlZCAoJXMpIiwKICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCByZXN1bHQsIHN0cmVycm9yKC1yZXN1bHQpKTsKIAogICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gT0spIHsKQEAgLTcwMyw3ICs3MTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSUQuZXJhc2UoaSwgbVNlc3Npb25JRC5zaXplKCkgLSBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZSgnYWNjdScsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZSgnYWNjdScsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTaXplKCJ0cmFjay1pbmRleCIsIHRyYWNrSW5kZXgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBpID0gcmVzcG9uc2UtPm1IZWFkZXJzLmluZGV4T2ZLZXkoInRyYW5zcG9ydCIpOwpAQCAtNzY5LDEwICs3NzYsMTAgQEAKIAogICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwogCi0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgncGxheScsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3BsYXknLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnZGlzYycsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Rpc2MnLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgbUNvbm4tPmRpc2Nvbm5lY3QocmVwbHkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTc5Nyw3ICs4MDQsNyBAQAogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VQbGF5UmVzcG9uc2UocmVzcG9uc2UpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gdGltZW91dCA9IG5ldyBBTWVzc2FnZSgndGlvdScsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHRpbWVvdXQgPSBuZXcgQU1lc3NhZ2UoJ3Rpb3UnLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGVja1RpbWVvdXRHZW5lcmF0aW9uKys7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LT5zZXRJbnQzMigidGlvdWNoZWNrIiwgbUNoZWNrVGltZW91dEdlbmVyYXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dC0+cG9zdChrU3RhcnR1cFRpbWVvdXRVcyk7CkBAIC04MDUsNyArODEyLDcgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnZGlzYycsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Rpc2MnLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgbUNvbm4tPmRpc2Nvbm5lY3QocmVwbHkpOwogICAgICAgICAgICAgICAgIH0KIApAQCAtODMxLDcgKzgzOCw3IEBACiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwogCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdvcHRzJywgaWQoKSk7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdvcHRzJywgdGhpcyk7CiAgICAgICAgICAgICAgICAgcmVwbHktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUtlZXBBbGl2ZUdlbmVyYXRpb24pOwogICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTg5NCw3ICs5MDEsNyBAQAogICAgICAgICAgICAgICAgIG1QYXVzaW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgbVNlZWthYmxlID0gdHJ1ZTsKIAotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgndGVhcicsIGlkKCkpOworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgndGVhcicsIHRoaXMpOwogCiAgICAgICAgICAgICAgICAgaW50MzJfdCByZWNvbm5lY3Q7CiAgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJyZWNvbm5lY3QiLCAmcmVjb25uZWN0KSAmJiByZWNvbm5lY3QpIHsKQEAgLTkyNiw3ICs5MzMsNyBAQAogICAgICAgICAgICAgICAgIEFMT0dJKCJURUFSRE9XTiBjb21wbGV0ZWQgd2l0aCByZXN1bHQgJWQgKCVzKSIsCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQsIHN0cmVycm9yKC1yZXN1bHQpKTsKIAotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnZGlzYycsIGlkKCkpOworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnZGlzYycsIHRoaXMpOwogCiAgICAgICAgICAgICAgICAgaW50MzJfdCByZWNvbm5lY3Q7CiAgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJyZWNvbm5lY3QiLCAmcmVjb25uZWN0KSAmJiByZWNvbm5lY3QpIHsKQEAgLTk1OCw3ICs5NjUsNyBAQAogICAgICAgICAgICAgICAgIGlmIChtTnVtQWNjZXNzVW5pdHNSZWNlaXZlZCA9PSAwKSB7CiAjaWYgMQogICAgICAgICAgICAgICAgICAgICBBTE9HSSgic3RyZWFtIGVuZGVkPyBhYm9ydGluZy4iKTsKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnYWJvcicsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdhYm9yJywgdGhpcykpLT5wb3N0KCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogI2Vsc2UKICAgICAgICAgICAgICAgICAgICAgQUxPR0koImhhdmVuJ3Qgc2VlbiBhbiBBVSBpbiBhIGxvb29uZyB0aW1lLiIpOwpAQCAtMTAxMiw3ICsxMDE5LDcgQEAKIAogICAgICAgICAgICAgICAgIGludDMyX3QgZW9zOwogICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZW9zIiwgJmVvcykpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koInJlY2VpdmVkIEJZRSBvbiB0cmFjayBpbmRleCAlZCIsIHRyYWNrSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBBTE9HSSgicmVjZWl2ZWQgQllFIG9uIHRyYWNrIGluZGV4ICV6dSIsIHRyYWNrSW5kZXgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIW1BbGxUcmFja3NIYXZlVGltZSAmJiBkYXRhUmVjZWl2ZWRPbkFsbENoYW5uZWxzKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJObyB0aW1lIGVzdGFibGlzaGVkID0+IGZha2UgZXhpc3RpbmcgZGF0YSIpOwogCkBAIC0xMDc3LDcgKzEwODQsNyBAQAogCiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKIAotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgncGF1MicsIGlkKCkpOworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgncGF1MicsIHRoaXMpOwogICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTExMTQsNyArMTEyMSw3IEBACiAKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwogCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdyZXMyJywgaWQoKSk7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdyZXMyJywgdGhpcyk7CiAgICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTE0Myw3ICsxMTUwLDcgQEAKIAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gUG9zdCBuZXcgdGltZW91dCBpbiBvcmRlciB0byBtYWtlIHN1cmUgdG8gdXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWtlIHRpbWVzdGFtcHMgaWYgbm8gbmV3IFNlbmRlciBSZXBvcnRzIGFycml2ZQotICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHRpbWVvdXQgPSBuZXcgQU1lc3NhZ2UoJ3Rpb3UnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiB0aW1lb3V0ID0gbmV3IEFNZXNzYWdlKCd0aW91JywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hlY2tUaW1lb3V0R2VuZXJhdGlvbisrOwogICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dC0+c2V0SW50MzIoInRpb3VjaGVjayIsIG1DaGVja1RpbWVvdXRHZW5lcmF0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQtPnBvc3Qoa1N0YXJ0dXBUaW1lb3V0VXMpOwpAQCAtMTE1Miw3ICsxMTU5LDcgQEAKIAogICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInJlc3VtZSBmYWlsZWQsIGFib3J0aW5nLiIpOwotICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdhYm9yJywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ2Fib3InLCB0aGlzKSktPnBvc3QoKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBtUGF1c2luZyA9IGZhbHNlOwpAQCAtMTE4MCw3ICsxMTg3LDcgQEAKICAgICAgICAgICAgICAgICBtQ2hlY2tQZW5kaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICArK21DaGVja0dlbmVyYXRpb247CiAKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3NlZTEnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3NlZTAnLCB0aGlzKTsKICAgICAgICAgICAgICAgICByZXBseS0+c2V0SW50NjQoInRpbWUiLCB0aW1lVXMpOwogCiAgICAgICAgICAgICAgICAgaWYgKG1QYXVzaW5nKSB7CkBAIC0xMjAzLDkgKzEyMTAsMjYgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY2FzZSAnc2VlMSc6CisgICAgICAgICAgICBjYXNlICdzZWUwJzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBTZXNzaW9uIGlzIHBhdXNlZCBub3cuCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoInJlc3VsdCIsICZlcnIpOworCisgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWUiLCAmdGltZVVzKSk7CisKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0U2Vla1BhdXNlZCk7CisgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDY0KCJ0aW1lIiwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICdzZWUxJzoKKyAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdChpKTsKIApAQCAtMTIyMSw3ICsxMjQ1LDcgQEAKIAogICAgICAgICAgICAgICAgIC8vIFN0YXJ0IG5ldyB0aW1lb3V0Z2VuZXJhdGlvbiB0byBhdm9pZCBnZXR0aW5nIHRpbWVvdXQKICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgUExBWSByZXNwb25zZSBhcnJpdmUKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gdGltZW91dCA9IG5ldyBBTWVzc2FnZSgndGlvdScsIGlkKCkpOworICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiB0aW1lb3V0ID0gbmV3IEFNZXNzYWdlKCd0aW91JywgdGhpcyk7CiAgICAgICAgICAgICAgICAgbUNoZWNrVGltZW91dEdlbmVyYXRpb24rKzsKICAgICAgICAgICAgICAgICB0aW1lb3V0LT5zZXRJbnQzMigidGlvdWNoZWNrIiwgbUNoZWNrVGltZW91dEdlbmVyYXRpb24pOwogICAgICAgICAgICAgICAgIHRpbWVvdXQtPnBvc3Qoa1N0YXJ0dXBUaW1lb3V0VXMpOwpAQCAtMTI0Myw3ICsxMjY3LDcgQEAKIAogICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CiAKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3NlZTInLCBpZCgpKTsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3NlZTInLCB0aGlzKTsKICAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xMjc3LDcgKzEzMDEsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQb3N0IG5ldyB0aW1lb3V0IGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0byB1c2UKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZha2UgdGltZXN0YW1wcyBpZiBubyBuZXcgU2VuZGVyIFJlcG9ydHMgYXJyaXZlCi0gICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gdGltZW91dCA9IG5ldyBBTWVzc2FnZSgndGlvdScsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHRpbWVvdXQgPSBuZXcgQU1lc3NhZ2UoJ3Rpb3UnLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGVja1RpbWVvdXRHZW5lcmF0aW9uKys7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0LT5zZXRJbnQzMigidGlvdWNoZWNrIiwgbUNoZWNrVGltZW91dEdlbmVyYXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dC0+cG9zdChrU3RhcnR1cFRpbWVvdXRVcyk7CkBAIC0xMjkzLDcgKzEzMTcsNyBAQAogCiAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSykgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgic2VlayBmYWlsZWQsIGFib3J0aW5nLiIpOwotICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdhYm9yJywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ2Fib3InLCB0aGlzKSktPnBvc3QoKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBtUGF1c2luZyA9IGZhbHNlOwpAQCAtMTM0MywxMiArMTM2NywxMiBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICBtVHJ5VENQSW50ZXJsZWF2aW5nID0gdHJ1ZTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgnYWJvcicsIGlkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgnYWJvcicsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigicmVjb25uZWN0IiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJOZXZlciByZWNlaXZlZCBhbnkgZGF0YSwgZGlzY29ubmVjdGluZy4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ2Fib3InLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ2Fib3InLCB0aGlzKSktPnBvc3QoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbUFsbFRyYWNrc0hhdmVUaW1lKSB7CkBAIC0xMzY5LDcgKzEzOTMsNyBAQAogICAgIH0KIAogICAgIHZvaWQgcG9zdEtlZXBBbGl2ZSgpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgnYWxpdicsIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCdhbGl2JywgdGhpcyk7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtS2VlcEFsaXZlR2VuZXJhdGlvbik7CiAgICAgICAgIG1zZy0+cG9zdCgobUtlZXBBbGl2ZVRpbWVvdXRVcyAqIDkpIC8gMTApOwogICAgIH0KQEAgLTEzODAsNyArMTQwNCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBtQ2hlY2tQZW5kaW5nID0gdHJ1ZTsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IGNoZWNrID0gbmV3IEFNZXNzYWdlKCdjaGVrJywgaWQoKSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBjaGVjayA9IG5ldyBBTWVzc2FnZSgnY2hlaycsIHRoaXMpOwogICAgICAgICBjaGVjay0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQ2hlY2tHZW5lcmF0aW9uKTsKICAgICAgICAgY2hlY2stPnBvc3Qoa0FjY2Vzc1VuaXRUaW1lb3V0VXMpOwogICAgIH0KQEAgLTE1NjQsOSArMTU4OCw5IEBACiAgICAgICAgICAgICBuZXcgQVBhY2tldFNvdXJjZShtU2Vzc2lvbkRlc2MsIGluZGV4KTsKIAogICAgICAgICBpZiAoc291cmNlLT5pbml0Q2hlY2soKSAhPSBPSykgewotICAgICAgICAgICAgQUxPR1coIlVuc3VwcG9ydGVkIGZvcm1hdC4gSWdub3JpbmcgdHJhY2sgIyVkLiIsIGluZGV4KTsKKyAgICAgICAgICAgIEFMT0dXKCJVbnN1cHBvcnRlZCBmb3JtYXQuIElnbm9yaW5nIHRyYWNrICMlenUuIiwgaW5kZXgpOwogCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3NldHUnLCBpZCgpKTsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnc2V0dScsIHRoaXMpOwogICAgICAgICAgICAgcmVwbHktPnNldFNpemUoImluZGV4IiwgaW5kZXgpOwogICAgICAgICAgICAgcmVwbHktPnNldEludDMyKCJyZXN1bHQiLCBFUlJPUl9VTlNVUFBPUlRFRCk7CiAgICAgICAgICAgICByZXBseS0+cG9zdCgpOwpAQCAtMTYwNiw3ICsxNjMwLDcgQEAKICAgICAgICAgaW5mby0+bVRpbWVTY2FsZSA9IHRpbWVzY2FsZTsKICAgICAgICAgaW5mby0+bUVPU1JlY2VpdmVkID0gZmFsc2U7CiAKLSAgICAgICAgQUxPR1YoInRyYWNrICMlZCBVUkw9JXMiLCBtVHJhY2tzLnNpemUoKSwgdHJhY2tVUkwuY19zdHIoKSk7CisgICAgICAgIEFMT0dWKCJ0cmFjayAjJXp1IFVSTD0lcyIsIG1UcmFja3Muc2l6ZSgpLCB0cmFja1VSTC5jX3N0cigpKTsKIAogICAgICAgICBBU3RyaW5nIHJlcXVlc3QgPSAiU0VUVVAgIjsKICAgICAgICAgcmVxdWVzdC5hcHBlbmQodHJhY2tVUkwpOwpAQCAtMTY1Miw3ICsxNjc2LDcgQEAKIAogICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwogCi0gICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnc2V0dScsIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3NldHUnLCB0aGlzKTsKICAgICAgICAgcmVwbHktPnNldFNpemUoImluZGV4IiwgaW5kZXgpOwogICAgICAgICByZXBseS0+c2V0U2l6ZSgidHJhY2staW5kZXgiLCBtVHJhY2tzLnNpemUoKSAtIDEpOwogICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CkBAIC0xNjczLDIxICsxNjk3LDExIEBACiAgICAgICAgIH0KIAogICAgICAgICBzaXplX3QgbiA9IHN0cmxlbihiYXNlVVJMKTsKLSAgICAgICAgaWYgKGJhc2VVUkxbbiAtIDFdID09ICcvJykgewotICAgICAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMKTsKLSAgICAgICAgICAgIG91dC0+YXBwZW5kKHVybCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpzbGFzaFBvcyA9IHN0cnJjaHIoYmFzZVVSTCwgJy8nKTsKLQotICAgICAgICAgICAgaWYgKHNsYXNoUG9zID4gJmJhc2VVUkxbNl0pIHsKLSAgICAgICAgICAgICAgICBvdXQtPnNldFRvKGJhc2VVUkwsIHNsYXNoUG9zIC0gYmFzZVVSTCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG91dC0+c2V0VG8oYmFzZVVSTCk7Ci0gICAgICAgICAgICB9Ci0KKyAgICAgICAgb3V0LT5zZXRUbyhiYXNlVVJMKTsKKyAgICAgICAgaWYgKGJhc2VVUkxbbiAtIDFdICE9ICcvJykgewogICAgICAgICAgICAgb3V0LT5hcHBlbmQoIi8iKTsKLSAgICAgICAgICAgIG91dC0+YXBwZW5kKHVybCk7CiAgICAgICAgIH0KKyAgICAgICAgb3V0LT5hcHBlbmQodXJsKTsKIAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0xNzMxLDggKzE3NDUsOCBAQAogICAgIH0KIAogICAgIHZvaWQgb25UaW1lVXBkYXRlKGludDMyX3QgdHJhY2tJbmRleCwgdWludDMyX3QgcnRwVGltZSwgdWludDY0X3QgbnRwVGltZSkgewotICAgICAgICBBTE9HVigib25UaW1lVXBkYXRlIHRyYWNrICVkLCBydHBUaW1lID0gMHglMDh4LCBudHBUaW1lID0gMHglMDE2bGx4IiwKLSAgICAgICAgICAgICB0cmFja0luZGV4LCBydHBUaW1lLCBudHBUaW1lKTsKKyAgICAgICAgQUxPR1YoIm9uVGltZVVwZGF0ZSB0cmFjayAlZCwgcnRwVGltZSA9IDB4JTA4eCwgbnRwVGltZSA9ICUjMDE2bGx4IiwKKyAgICAgICAgICAgICB0cmFja0luZGV4LCBydHBUaW1lLCAobG9uZyBsb25nKW50cFRpbWUpOwogCiAgICAgICAgIGludDY0X3QgbnRwVGltZVVzID0gKGludDY0X3QpKG50cFRpbWUgKiAxRTYgLyAoMWxsIDw8IDMyKSk7CiAKQEAgLTE3NDcsNyArMTc2MSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIW1BbGxUcmFja3NIYXZlVGltZSkgewotICAgICAgICAgICAgYm9vbCBhbGxUcmFja3NIYXZlVGltZSA9IHRydWU7CisgICAgICAgICAgICBib29sIGFsbFRyYWNrc0hhdmVUaW1lID0gKG1UcmFja3Muc2l6ZSgpID4gMCk7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgICAgICBUcmFja0luZm8gKnRyYWNrID0gJm1UcmFja3MuZWRpdEl0ZW1BdChpKTsKICAgICAgICAgICAgICAgICBpZiAodHJhY2stPm1OVFBBbmNob3JVcyA8IDApIHsKQEAgLTE4NTEsOCArMTg2NSw4IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KIAotICAgICAgICBBTE9HVigidHJhY2sgJWQgcnRwVGltZT0lZCBtZWRpYVRpbWVVcyA9ICVsbGQgdXMgKCUuMmYgc2VjcykiLAotICAgICAgICAgICAgIHRyYWNrSW5kZXgsIHJ0cFRpbWUsIG1lZGlhVGltZVVzLCBtZWRpYVRpbWVVcyAvIDFFNik7CisgICAgICAgIEFMT0dWKCJ0cmFjayAlZCBydHBUaW1lPSV1IG1lZGlhVGltZVVzID0gJWxsZCB1cyAoJS4yZiBzZWNzKSIsCisgICAgICAgICAgICAgdHJhY2tJbmRleCwgcnRwVGltZSwgKGxvbmcgbG9uZyltZWRpYVRpbWVVcywgbWVkaWFUaW1lVXMgLyAxRTYpOwogCiAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIG1lZGlhVGltZVVzKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeVRyYW5zbWl0dGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015VHJhbnNtaXR0ZXIuaAppbmRleCAwMDlhM2IxLi4zNjlmMjc2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015VHJhbnNtaXR0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015VHJhbnNtaXR0ZXIuaApAQCAtMTAwLDcgKzEwMCw3IEBACiAgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKICAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1Db25uKTsKIAotICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ2Nvbm4nLCBpZCgpKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdjb25uJywgdGhpcyk7CiAgICAgICAgIG1Db25uLT5jb25uZWN0KG1TZXJ2ZXJVUkwuY19zdHIoKSwgcmVwbHkpOwogCiAjaWZkZWYgQU5EUk9JRApAQCAtMjI5LDcgKzIyOSw3IEBACiAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CiAgICAgICAgIHJlcXVlc3QuYXBwZW5kKHNkcCk7CiAKLSAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdhbm5vJywgaWQoKSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnYW5ubycsIHRoaXMpOwogICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CiAgICAgfQogCkBAIC0zNTAsNyArMzUwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgIDw8IHJlc3VsdCA8PCAiICgiIDw8IHN0cmVycm9yKC1yZXN1bHQpIDw8ICIpIjsKIAogICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgdGhpcykpLT5wb3N0KCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMzgxLDcgKzM4MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS0+bVN0YXR1c0NvZGUgPT0gNDAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1dGhUeXBlICE9IE5PTkUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIkZBSUxFRCB0byBhdXRoZW50aWNhdGUiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgdGhpcykpLT5wb3N0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKQEAgLTM5MSwxNCArMzkxLDE0IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBPSyB8fCByZXNwb25zZS0+bVN0YXR1c0NvZGUgIT0gMjAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIHRoaXMpKS0+cG9zdCgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBydHBQb3J0OwogICAgICAgICAgICAgICAgIEFSVFBDb25uZWN0aW9uOjpNYWtlUG9ydFBhaXIoJm1SVFBTb2NrZXQsICZtUlRDUFNvY2tldCwgJnJ0cFBvcnQpOwogCi0gICAgICAgICAgICAgICAgLy8gKG5ldyBBTWVzc2FnZSgncG9sbCcsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgIC8vIChuZXcgQU1lc3NhZ2UoJ3BvbGwnLCB0aGlzKSktPnBvc3QoKTsKIAogICAgICAgICAgICAgICAgIEFTdHJpbmcgcmVxdWVzdDsKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiU0VUVVAgIik7CkBAIC00MTQsNyArNDE0LDcgQEAKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiO21vZGU9cmVjb3JkXHJcbiIpOwogICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CiAKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3NldHUnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3NldHUnLCB0aGlzKTsKICAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC00NjgsNyArNDY4LDcgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9LIHx8IHJlc3BvbnNlLT5tU3RhdHVzQ29kZSAhPSAyMDApIHsKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgdGhpcykpLT5wb3N0KCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIApAQCAtNTM1LDcgKzUzNSw3IEBACiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwogCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdyZWNvJywgaWQoKSk7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdyZWNvJywgdGhpcyk7CiAgICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNTU4LDEzICs1NTgsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCBpZCgpKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIHRoaXMpKS0+cG9zdCgpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdtb3JlJywgaWQoKSkpLT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnc3IgICcsIGlkKCkpKS0+cG9zdCgpOwotICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ2FsaXYnLCBpZCgpKSktPnBvc3QoMzAwMDAwMDBsbCk7CisgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnbW9yZScsIHRoaXMpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3NyICAnLCB0aGlzKSktPnBvc3QoKTsKKyAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdhbGl2JywgdGhpcykpLT5wb3N0KDMwMDAwMDAwbGwpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC01ODYsNyArNTg2LDcgQEAKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwogICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CiAKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ29wdHMnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ29wdHMnLCB0aGlzKTsKICAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC02MDMsNyArNjAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgnYWxpdicsIGlkKCkpKS0+cG9zdCgzMDAwMDAwMGxsKTsKKyAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdhbGl2JywgdGhpcykpLT5wb3N0KDMwMDAwMDAwbGwpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC03MDIsNyArNzAyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKIAotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3BhdXMnLCBpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdwYXVzJywgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC03NTMsNyArNzUzLDcgQEAKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwogICAgICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJcclxuIik7CiAKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3RlYXInLCBpZCgpKTsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2UoJ3RlYXInLCB0aGlzKTsKICAgICAgICAgICAgICAgICBtQ29ubi0+c2VuZFJlcXVlc3QocmVxdWVzdC5jX3N0cigpLCByZXBseSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC03NzUsNyArNzc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0socmVzcG9uc2UgIT0gTlVMTCk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIGlkKCkpKS0+cG9zdCgpOworICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UoJ3F1aXQnLCB0aGlzKSktPnBvc3QoKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtNzg0LDE0ICs3ODQsMTQgQEAKICAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgImRpc2Nvbm5lY3QgY29tcGxldGVkIjsKIAogICAgICAgICAgICAgICAgIG1Db25uZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKCdxdWl0JywgaWQoKSkpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSgncXVpdCcsIHRoaXMpKS0+cG9zdCgpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBjYXNlICdxdWl0JzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3RlZCkgewotICAgICAgICAgICAgICAgICAgICBtQ29ubi0+ZGlzY29ubmVjdChuZXcgQU1lc3NhZ2UoJ2Rpc2MnLCBpZCgpKSk7CisgICAgICAgICAgICAgICAgICAgIG1Db25uLT5kaXNjb25uZWN0KG5ldyBBTWVzc2FnZSgnZGlzYycsIHRoaXMpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKaW5kZXggYTI0ZWI2OS4uMGY0NmM4MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcApAQCAtNTEsNyArNTEsNyBAQAogdm9pZCBTRFBMb2FkZXI6OmxvYWQoY29uc3QgY2hhciAqdXJsLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgewogICAgIG1OZXRMb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRMb2FkLCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0TG9hZCwgdGhpcyk7CiAgICAgbXNnLT5zZXRTdHJpbmcoInVybCIsIHVybCk7CiAKICAgICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1VEUFB1c2hlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1VEUFB1c2hlci5jcHAKaW5kZXggNDdlYTZmMS4uNWM2ODVhMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9VRFBQdXNoZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvVURQUHVzaGVyLmNwcApAQCAtNjUsNyArNjUsNyBAQAogICAgIG1GaXJzdFRpbWVNcyA9IGZyb21sZWwodGltZU1zKTsKICAgICBtRmlyc3RUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwogCi0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFB1c2gsIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRQdXNoLCB0aGlzKSktPnBvc3QoKTsKIH0KIAogYm9vbCBVRFBQdXNoZXI6Om9uUHVzaCgpIHsKQEAgLTEwMyw3ICsxMDMsNyBAQAogICAgIHRpbWVNcyAtPSBtRmlyc3RUaW1lTXM7CiAgICAgaW50NjRfdCB3aGVuVXMgPSBtRmlyc3RUaW1lVXMgKyB0aW1lTXMgKiAxMDAwbGw7CiAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFB1c2gsIGlkKCkpKS0+cG9zdCh3aGVuVXMgLSBub3dVcyk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFB1c2gsIHRoaXMpKS0+cG9zdCh3aGVuVXMgLSBub3dVcyk7CiAKICAgICByZXR1cm4gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDhkNmZmNWIuLjExMWU2YzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5tawpAQCAtMzEsNiArMzEsOSBAQAogCWZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSBcCiAJJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCisKIExPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKIAogaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQpAQCAtNjAsNiArNjMsMzkgQEAKIAlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAogCSQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQorCitpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gJChMT0NBTF9QQVRIKS9BbmRyb2lkLm1rCisKK0xPQ0FMX01PRFVMRSA6PSBNZWRpYUNvZGVjTGlzdE92ZXJyaWRlc190ZXN0CisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNfdGVzdC5jcHAgXAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKwlsaWJtZWRpYSBcCisJbGlic3RhZ2VmcmlnaHQgXAorCWxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAorCWxpYnN0YWdlZnJpZ2h0X29teCBcCisJbGlidXRpbHMgXAorCWxpYmxvZworCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKwlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKKwlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAorCWZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCisKK0xPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKKworTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKKwogaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQogCiAjIEluY2x1ZGUgc3ViZGlyZWN0b3J5IG1ha2VmaWxlcwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRHVtbXlSZWNvcmRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRHVtbXlSZWNvcmRlci5oCmluZGV4IDFjYmVhMWIuLmNkNGQwZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0R1bW15UmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9EdW1teVJlY29yZGVyLmgKQEAgLTI0LDcgKzI0LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBNZWRpYVNvdXJjZTsKK3N0cnVjdCBNZWRpYVNvdXJjZTsKIGNsYXNzIE1lZGlhQnVmZmVyOwogCiBjbGFzcyBEdW1teVJlY29yZGVyIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI1NDdiZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYUNvZGVjTGlzdE92ZXJyaWRlc190ZXN0IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgIk1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBjaGFyIGtUZXN0T3ZlcnJpZGVzU3RyW10gPQorIjxNZWRpYUNvZGVjcz5cbiIKKyIgICAgPFNldHRpbmdzPlxuIgorIiAgICAgICAgPFNldHRpbmcgbmFtZT1cInN1cHBvcnRzLW11bHRpcGxlLXNlY3VyZS1jb2RlY3NcIiB2YWx1ZT1cImZhbHNlXCIgLz5cbiIKKyIgICAgICAgIDxTZXR0aW5nIG5hbWU9XCJzdXBwb3J0cy1zZWN1cmUtd2l0aC1ub24tc2VjdXJlLWNvZGVjXCIgdmFsdWU9XCJ0cnVlXCIgLz5cbiIKKyIgICAgPC9TZXR0aW5ncz5cbiIKKyIgICAgPEVuY29kZXJzPlxuIgorIiAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT1cIk9NWC5xY29tLnZpZGVvLmVuY29kZXIuYXZjXCIgdHlwZT1cInZpZGVvL2F2Y1wiIHVwZGF0ZT1cInRydWVcIiA+XG4iCisiICAgICAgICAgICAgPExpbWl0IG5hbWU9XCJtYXgtc3VwcG9ydGVkLWluc3RhbmNlc1wiIHZhbHVlPVwiNFwiIC8+XG4iCisiICAgICAgICA8L01lZGlhQ29kZWM+XG4iCisiICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPVwiT01YLnFjb20udmlkZW8uZW5jb2Rlci5tcGVnNFwiIHR5cGU9XCJ2aWRlby9tcDR2LWVzXCIgdXBkYXRlPVwidHJ1ZVwiID5cbiIKKyIgICAgICAgICAgICA8TGltaXQgbmFtZT1cIm1heC1zdXBwb3J0ZWQtaW5zdGFuY2VzXCIgdmFsdWU9XCI0XCIgLz5cbiIKKyIgICAgICAgIDwvTWVkaWFDb2RlYz5cbiIKKyIgICAgPC9FbmNvZGVycz5cbiIKKyIgICAgPERlY29kZXJzPlxuIgorIiAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT1cIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuYXZjLnNlY3VyZVwiIHR5cGU9XCJ2aWRlby9hdmNcIiB1cGRhdGU9XCJ0cnVlXCIgPlxuIgorIiAgICAgICAgICAgIDxMaW1pdCBuYW1lPVwibWF4LXN1cHBvcnRlZC1pbnN0YW5jZXNcIiB2YWx1ZT1cIjFcIiAvPlxuIgorIiAgICAgICAgPC9NZWRpYUNvZGVjPlxuIgorIiAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT1cIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuaDI2M1wiIHR5cGU9XCJ2aWRlby8zZ3BwXCIgdXBkYXRlPVwidHJ1ZVwiID5cbiIKKyIgICAgICAgICAgICA8TGltaXQgbmFtZT1cIm1heC1zdXBwb3J0ZWQtaW5zdGFuY2VzXCIgdmFsdWU9XCI0XCIgLz5cbiIKKyIgICAgICAgIDwvTWVkaWFDb2RlYz5cbiIKKyIgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9XCJPTVgucWNvbS52aWRlby5kZWNvZGVyLm1wZWcyXCIgdHlwZT1cInZpZGVvL21wZWcyXCIgdXBkYXRlPVwidHJ1ZVwiID5cbiIKKyIgICAgICAgICAgICA8TGltaXQgbmFtZT1cIm1heC1zdXBwb3J0ZWQtaW5zdGFuY2VzXCIgdmFsdWU9XCIzXCIgLz5cbiIKKyIgICAgICAgIDwvTWVkaWFDb2RlYz5cbiIKKyIgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9XCJPTVgucWNvbS52aWRlby5kZWNvZGVyLm1wZWc0XCIgdHlwZT1cInZpZGVvL21wNHYtZXNcIiB1cGRhdGU9XCJ0cnVlXCIgPlxuIgorIiAgICAgICAgICAgIDxMaW1pdCBuYW1lPVwibWF4LXN1cHBvcnRlZC1pbnN0YW5jZXNcIiB2YWx1ZT1cIjNcIiAvPlxuIgorIiAgICAgICAgPC9NZWRpYUNvZGVjPlxuIgorIiAgICA8L0RlY29kZXJzPlxuIgorIjwvTWVkaWFDb2RlY3M+XG4iOworCitjbGFzcyBNZWRpYUNvZGVjTGlzdE92ZXJyaWRlc1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBNZWRpYUNvZGVjTGlzdE92ZXJyaWRlc1Rlc3QoKSB7fQorCisgICAgdm9pZCBhZGRNYXhJbnN0YW5jZXNTZXR0aW5nKAorICAgICAgICAgICAgY29uc3QgQVN0cmluZyAma2V5LAorICAgICAgICAgICAgY29uc3QgQVN0cmluZyAmdmFsdWUsCisgICAgICAgICAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBDb2RlY1NldHRpbmdzPiAqcmVzdWx0cykgeworICAgICAgICBDb2RlY1NldHRpbmdzIHNldHRpbmdzOworICAgICAgICBzZXR0aW5ncy5hZGQoIm1heC1zdXBwb3J0ZWQtaW5zdGFuY2VzIiwgdmFsdWUpOworICAgICAgICByZXN1bHRzLT5hZGQoa2V5LCBzZXR0aW5ncyk7CisgICAgfQorCisgICAgdm9pZCB2ZXJpZnlQcm9maWxlUmVzdWx0cyhjb25zdCBLZXllZFZlY3RvcjxBU3RyaW5nLCBDb2RlY1NldHRpbmdzPiAmcmVzdWx0cykgeworICAgICAgICBFWFBFQ1RfTFQoMHUsIHJlc3VsdHMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXN1bHRzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBBU3RyaW5nIGtleSA9IHJlc3VsdHMua2V5QXQoaSk7CisgICAgICAgICAgICBDb2RlY1NldHRpbmdzIHNldHRpbmdzID0gcmVzdWx0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDF1LCBzZXR0aW5ncy5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUoc2V0dGluZ3Mua2V5QXQoMCkgPT0gIm1heC1zdXBwb3J0ZWQtaW5zdGFuY2VzIik7CisgICAgICAgICAgICBBU3RyaW5nIHZhbHVlUyA9IHNldHRpbmdzLnZhbHVlQXQoMCk7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlID0gc3RydG9sKHZhbHVlUy5jX3N0cigpLCBOVUxMLCAxMCk7CisgICAgICAgICAgICBFWFBFQ1RfTFQoMCwgdmFsdWUpOworICAgICAgICAgICAgQUxPR1YoInByb2ZpbGVDb2RlY3MgcmVzdWx0cyAlcyAlcyIsIGtleS5jX3N0cigpLCB2YWx1ZVMuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGV4cG9ydFRlc3RSZXN1bHRzVG9YTUwoY29uc3QgY2hhciAqZmlsZU5hbWUpIHsKKyAgICAgICAgQ29kZWNTZXR0aW5ncyBnUjsKKyAgICAgICAgZ1IuYWRkKCJzdXBwb3J0cy1tdWx0aXBsZS1zZWN1cmUtY29kZWNzIiwgImZhbHNlIik7CisgICAgICAgIGdSLmFkZCgic3VwcG9ydHMtc2VjdXJlLXdpdGgtbm9uLXNlY3VyZS1jb2RlYyIsICJ0cnVlIik7CisgICAgICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIENvZGVjU2V0dGluZ3M+IGVSOworICAgICAgICBhZGRNYXhJbnN0YW5jZXNTZXR0aW5nKCJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2YyB2aWRlby9hdmMiLCAiNCIsICZlUik7CisgICAgICAgIGFkZE1heEluc3RhbmNlc1NldHRpbmcoIk9NWC5xY29tLnZpZGVvLmVuY29kZXIubXBlZzQgdmlkZW8vbXA0di1lcyIsICI0IiwgJmVSKTsKKyAgICAgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgQ29kZWNTZXR0aW5ncz4gZFI7CisgICAgICAgIGFkZE1heEluc3RhbmNlc1NldHRpbmcoIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuYXZjLnNlY3VyZSB2aWRlby9hdmMiLCAiMSIsICZkUik7CisgICAgICAgIGFkZE1heEluc3RhbmNlc1NldHRpbmcoIk9NWC5xY29tLnZpZGVvLmRlY29kZXIuaDI2MyB2aWRlby8zZ3BwIiwgIjQiLCAmZFIpOworICAgICAgICBhZGRNYXhJbnN0YW5jZXNTZXR0aW5nKCJPTVgucWNvbS52aWRlby5kZWNvZGVyLm1wZWcyIHZpZGVvL21wZWcyIiwgIjMiLCAmZFIpOworICAgICAgICBhZGRNYXhJbnN0YW5jZXNTZXR0aW5nKCJPTVgucWNvbS52aWRlby5kZWNvZGVyLm1wZWc0IHZpZGVvL21wNHYtZXMiLCAiMyIsICZkUik7CisKKyAgICAgICAgZXhwb3J0UmVzdWx0c1RvWE1MKGZpbGVOYW1lLCBnUiwgZVIsIGRSKTsKKyAgICB9Cit9OworCitURVNUX0YoTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNUZXN0LCBzcGxpdFN0cmluZykgeworICAgIEFTdHJpbmcgcyA9ICJhYmMxMjMiOworICAgIEFTdHJpbmcgZGVsaW1pdGVyID0gIiAiOworICAgIEFTdHJpbmcgczE7CisgICAgQVN0cmluZyBzMjsKKyAgICBFWFBFQ1RfRkFMU0Uoc3BsaXRTdHJpbmcocywgZGVsaW1pdGVyLCAmczEsICZzMikpOworICAgIHMgPSAiYWJjIDEyMyI7CisgICAgRVhQRUNUX1RSVUUoc3BsaXRTdHJpbmcocywgZGVsaW1pdGVyLCAmczEsICZzMikpOworICAgIEVYUEVDVF9UUlVFKHMxID09ICJhYmMiKTsKKyAgICBFWFBFQ1RfVFJVRShzMiA9PSAiMTIzIik7Cit9CisKKy8vIFRPRE86IHRoZSBjb2RlYyBjb21wb25lbnQgbmV2ZXIgcmV0dXJucyBPTVhfRXZlbnRDbWRDb21wbGV0ZSBpbiB1bml0IHRlc3QuCitURVNUX0YoTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNUZXN0LCBESVNBQkxFRF9wcm9maWxlQ29kZWNzKSB7CisgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBsaXN0ID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7CisgICAgVmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4gaW5mb3M7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0LT5jb3VudENvZGVjcygpOyArK2kpIHsKKyAgICAgICAgaW5mb3MucHVzaF9iYWNrKGxpc3QtPmdldENvZGVjSW5mbyhpKSk7CisgICAgfQorICAgIENvZGVjU2V0dGluZ3MgZ2xvYmFsX3Jlc3VsdHM7CisgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgQ29kZWNTZXR0aW5ncz4gZW5jb2Rlcl9yZXN1bHRzOworICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIENvZGVjU2V0dGluZ3M+IGRlY29kZXJfcmVzdWx0czsKKyAgICBwcm9maWxlQ29kZWNzKAorICAgICAgICAgICAgaW5mb3MsICZnbG9iYWxfcmVzdWx0cywgJmVuY29kZXJfcmVzdWx0cywgJmRlY29kZXJfcmVzdWx0cywgdHJ1ZSAvKiBmb3JjZVRvTWVhc3VyZSAqLyk7CisgICAgdmVyaWZ5UHJvZmlsZVJlc3VsdHMoZW5jb2Rlcl9yZXN1bHRzKTsKKyAgICB2ZXJpZnlQcm9maWxlUmVzdWx0cyhkZWNvZGVyX3Jlc3VsdHMpOworfQorCitURVNUX0YoTWVkaWFDb2RlY0xpc3RPdmVycmlkZXNUZXN0LCBleHBvcnRUZXN0UmVzdWx0c1RvWE1MKSB7CisgICAgY29uc3QgY2hhciAqZmlsZU5hbWUgPSAiL3NkY2FyZC9tZWRpYWNvZGVjX2xpc3Rfb3ZlcnJpZGVzX3Rlc3QueG1sIjsKKyAgICByZW1vdmUoZmlsZU5hbWUpOworCisgICAgZXhwb3J0VGVzdFJlc3VsdHNUb1hNTChmaWxlTmFtZSk7CisKKyAgICAvLyB2ZXJpZnkKKyAgICBBU3RyaW5nIG92ZXJyaWRlczsKKyAgICBGSUxFICpmID0gZm9wZW4oZmlsZU5hbWUsICJyYiIpOworICAgIEFTU0VSVF9UUlVFKGYgIT0gTlVMTCk7CisgICAgZnNlZWsoZiwgMCwgU0VFS19FTkQpOworICAgIGxvbmcgc2l6ZSA9IGZ0ZWxsKGYpOworICAgIHJld2luZChmKTsKKworICAgIGNoYXIgKmJ1ZiA9IChjaGFyICopbWFsbG9jKHNpemUpOworICAgIEVYUEVDVF9FUSgoc2l6ZV90KTEsIGZyZWFkKGJ1Ziwgc2l6ZSwgMSwgZikpOworICAgIG92ZXJyaWRlcy5zZXRUbyhidWYsIHNpemUpOworICAgIGZjbG9zZShmKTsKKyAgICBmcmVlKGJ1Zik7CisKKyAgICBBU3RyaW5nIGV4cGVjdGVkOworICAgIGV4cGVjdGVkLmFwcGVuZChnZXRQcm9maWxpbmdWZXJzaW9uU3RyaW5nKCkpOworICAgIGV4cGVjdGVkLmFwcGVuZCgiXG4iKTsKKyAgICBleHBlY3RlZC5hcHBlbmQoa1Rlc3RPdmVycmlkZXNTdHIpOworICAgIEVYUEVDVF9UUlVFKG92ZXJyaWRlcyA9PSBleHBlY3RlZCk7CisKKyAgICByZW1vdmUoZmlsZU5hbWUpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9TdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9TdXJmYWNlTWVkaWFTb3VyY2VfdGVzdC5jcHAKaW5kZXggZmQ4ODlmOS4uMzg2MGU5YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvU3VyZmFjZU1lZGlhU291cmNlX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL1N1cmZhY2VNZWRpYVNvdXJjZV90ZXN0LmNwcApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgpAQCAtNDY2LDcgKzQ2Nyw3IEBACiAvLyBTZXQgdXAgdGhlIE1lZGlhUmVjb3JkZXIgd2hpY2ggcnVucyBpbiB0aGUgc2FtZSBwcm9jZXNzIGFzIG1lZGlhc2VydmVyCiBzcDxNZWRpYVJlY29yZGVyPiBTdXJmYWNlTWVkaWFTb3VyY2VHTFRlc3Q6OnNldFVwTWVkaWFSZWNvcmRlcihpbnQgZmQsIGludCB2aWRlb1NvdXJjZSwKICAgICAgICAgaW50IG91dHB1dEZvcm1hdCwgaW50IHZpZGVvRW5jb2RlciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZnBzKSB7Ci0gICAgc3A8TWVkaWFSZWNvcmRlcj4gbXIgPSBuZXcgTWVkaWFSZWNvcmRlcigpOworICAgIHNwPE1lZGlhUmVjb3JkZXI+IG1yID0gbmV3IE1lZGlhUmVjb3JkZXIoU3RyaW5nMTYoKSk7CiAgICAgbXItPnNldFZpZGVvU291cmNlKHZpZGVvU291cmNlKTsKICAgICBtci0+c2V0T3V0cHV0Rm9ybWF0KG91dHB1dEZvcm1hdCk7CiAgICAgbXItPnNldFZpZGVvRW5jb2Rlcih2aWRlb0VuY29kZXIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvVXRpbHNfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9VdGlsc190ZXN0LmNwcAppbmRleCBjMWU2NjNjLi5kNzM2NTAxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9VdGlsc190ZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9VdGlsc190ZXN0LmNwcApAQCAtMTA5LDIxICsxMDksMjEgQEAKIAogVEVTVF9GKFV0aWxzVGVzdCwgVGVzdERlYnVnKSB7CiAjZGVmaW5lIExWTCh4KSAoQURlYnVnOjpMZXZlbCkoeCkKLSAgICBBU1NFUlRfRVEoQURlYnVnOjpHZXREZWJ1Z0xldmVsRnJvbVN0cmluZygidmlkZW8iLCAiIiwgTFZMKDUpKSwgTFZMKDUpKTsKLSAgICBBU1NFUlRfRVEoQURlYnVnOjpHZXREZWJ1Z0xldmVsRnJvbVN0cmluZygidmlkZW8iLCAiICAgXHQgIFxuICIsIExWTCgyKSksIExWTCgyKSk7Ci0gICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0RGVidWdMZXZlbEZyb21TdHJpbmcoInZpZGVvIiwgIjMiLCBMVkwoNSkpLCBMVkwoMykpOwotICAgIEFTU0VSVF9FUShBRGVidWc6OkdldERlYnVnTGV2ZWxGcm9tU3RyaW5nKCJ2aWRlbyIsICIzOipkZW8iLCBMVkwoNSkpLCBMVkwoMykpOwotICAgIEFTU0VSVF9FUShBRGVidWc6OkdldERlYnVnTGV2ZWxGcm9tU3RyaW5nKAorICAgIEFTU0VSVF9FUShBRGVidWc6OkdldExldmVsRnJvbVNldHRpbmdzU3RyaW5nKCJ2aWRlbyIsICIiLCBMVkwoNSkpLCBMVkwoNSkpOworICAgIEFTU0VSVF9FUShBRGVidWc6OkdldExldmVsRnJvbVNldHRpbmdzU3RyaW5nKCJ2aWRlbyIsICIgICBcdCAgXG4gIiwgTFZMKDIpKSwgTFZMKDIpKTsKKyAgICBBU1NFUlRfRVEoQURlYnVnOjpHZXRMZXZlbEZyb21TZXR0aW5nc1N0cmluZygidmlkZW8iLCAiMyIsIExWTCg1KSksIExWTCgzKSk7CisgICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0TGV2ZWxGcm9tU2V0dGluZ3NTdHJpbmcoInZpZGVvIiwgIjM6KmRlbyIsIExWTCg1KSksIExWTCgzKSk7CisgICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0TGV2ZWxGcm9tU2V0dGluZ3NTdHJpbmcoCiAgICAgICAgICAgICAidmlkZW8iLCAiXHRcbiAzIFx0XG46XHRcbiB2aWRlbyBcdFxuIiwgTFZMKDUpKSwgTFZMKDMpKTsKLSAgICBBU1NFUlRfRVEoQURlYnVnOjpHZXREZWJ1Z0xldmVsRnJvbVN0cmluZygidmlkZW8iLCAiMzoqZGVvLDI6dmlkKiIsIExWTCg1KSksIExWTCgyKSk7Ci0gICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0RGVidWdMZXZlbEZyb21TdHJpbmcoCisgICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0TGV2ZWxGcm9tU2V0dGluZ3NTdHJpbmcoInZpZGVvIiwgIjM6KmRlbywyOnZpZCoiLCBMVkwoNSkpLCBMVkwoMikpOworICAgIEFTU0VSVF9FUShBRGVidWc6OkdldExldmVsRnJvbVNldHRpbmdzU3RyaW5nKAogICAgICAgICAgICAgImF2aWRlbyIsICJcdFxuIDMgXHRcbjpcdFxuIGF2aWRlbyBcdFxuLFx0XG4gMiBcdFxuOlx0XG4gdmlkZW8gXHRcbiIsIExWTCg1KSksIExWTCgzKSk7Ci0gICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0RGVidWdMZXZlbEZyb21TdHJpbmcoCisgICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0TGV2ZWxGcm9tU2V0dGluZ3NTdHJpbmcoCiAgICAgICAgICAgICAiYXVkaW8ub214IiwgIjQ6Km9teCwzOipkKm8qLDI6YXVkaW8qIiwgTFZMKDUpKSwgTFZMKDIpKTsKLSAgICBBU1NFUlRfRVEoQURlYnVnOjpHZXREZWJ1Z0xldmVsRnJvbVN0cmluZygKKyAgICBBU1NFUlRfRVEoQURlYnVnOjpHZXRMZXZlbEZyb21TZXR0aW5nc1N0cmluZygKICAgICAgICAgICAgICJ2aWRlby5vbXgiLCAiNDoqb214LDM6KmQqbyosMjphdWRpbyoiLCBMVkwoNSkpLCBMVkwoMykpOwotICAgIEFTU0VSVF9FUShBRGVidWc6OkdldERlYnVnTGV2ZWxGcm9tU3RyaW5nKCJ2aWRlbyIsICI0OipvbXgsMzoqZCpvKiwyOmF1ZGlvKiIsIExWTCg1KSksIExWTCgzKSk7Ci0gICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0RGVidWdMZXZlbEZyb21TdHJpbmcoIm9teCIsICI0OipvbXgsMzoqZCpvKiwyOmF1ZGlvKiIsIExWTCg1KSksIExWTCg0KSk7CisgICAgQVNTRVJUX0VRKEFEZWJ1Zzo6R2V0TGV2ZWxGcm9tU2V0dGluZ3NTdHJpbmcoInZpZGVvIiwgIjQ6Km9teCwzOipkKm8qLDI6YXVkaW8qIiwgTFZMKDUpKSwgTFZMKDMpKTsKKyAgICBBU1NFUlRfRVEoQURlYnVnOjpHZXRMZXZlbEZyb21TZXR0aW5nc1N0cmluZygib214IiwgIjQ6Km9teCwzOipkKm8qLDI6YXVkaW8qIiwgTFZMKDUpKSwgTFZMKDQpKTsKICN1bmRlZiBMVkwKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5tawppbmRleCA2YThiOWZjLi41OGZiMTJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5tawpAQCAtOSw3ICs5LDggQEAKICAgICAgICAgVGltZWRUZXh0U1JUU291cmNlLmNwcCAgICBcCiAgICAgICAgIFRpbWVkVGV4dFBsYXllci5jcHAKIAotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyIC1XZXJyb3IKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAgICAgICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvdGltZWR0ZXh0IFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UaW1lZFRleHRQbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBsYXllci5jcHAKaW5kZXggYTA3MDQ4Ny4uYWVjZjY2NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RpbWVkVGV4dFBsYXllci5jcHAKQEAgLTU2LDI1ICs1NiwyNSBAQAogfQogCiB2b2lkIFRpbWVkVGV4dFBsYXllcjo6c3RhcnQoKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIHRoaXMpKS0+cG9zdCgpOwogfQogCiB2b2lkIFRpbWVkVGV4dFBsYXllcjo6cGF1c2UoKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCBpZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UGF1c2UsIHRoaXMpKS0+cG9zdCgpOwogfQogCiB2b2lkIFRpbWVkVGV4dFBsYXllcjo6cmVzdW1lKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bWUsIGlkKCkpKS0+cG9zdCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bWUsIHRoaXMpKS0+cG9zdCgpOwogfQogCiB2b2lkIFRpbWVkVGV4dFBsYXllcjo6c2Vla1RvQXN5bmMoaW50NjRfdCB0aW1lVXMpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VlaywgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlZWssIHRoaXMpOwogICAgIG1zZy0+c2V0SW50NjQoInNlZWtUaW1lVXMiLCB0aW1lVXMpOwogICAgIG1zZy0+cG9zdCgpOwogfQogCiB2b2lkIFRpbWVkVGV4dFBsYXllcjo6c2V0RGF0YVNvdXJjZShzcDxUaW1lZFRleHRTb3VyY2U+IHNvdXJjZSkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRTb3VyY2UsIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRTb3VyY2UsIHRoaXMpOwogICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBzb3VyY2UpOwogICAgIG1zZy0+cG9zdCgpOwogfQpAQCAtMjMxLDcgKzIzMSw3IEBACiAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+cmVhZCgmc3RhcnRUaW1lVXMsICZlbmRUaW1lVXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHBhcmNlbEV2ZW50LT5wYXJjZWwpLCBvcHRpb25zKTsKICAgICBpZiAoZXJyID09IFdPVUxEX0JMT0NLKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXRyeVJlYWQsIGlkKCkpOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmV0cnlSZWFkLCB0aGlzKTsKICAgICAgICAgaWYgKG9wdGlvbnMgIT0gTlVMTCkgewogICAgICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzID0ga0ludmFsaWRUaW1lVXM7CiAgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIHNlZWtNb2RlID0KQEAgLTI1OSw3ICsyNTksNyBAQAogCiB2b2lkIFRpbWVkVGV4dFBsYXllcjo6cG9zdFRleHRFdmVudChjb25zdCBzcDxQYXJjZWxFdmVudD4mIHBhcmNlbCwgaW50NjRfdCB0aW1lVXMpIHsKICAgICBpbnQ2NF90IGRlbGF5VXMgPSBkZWxheVVzRnJvbUN1cnJlbnRUaW1lKHRpbWVVcyk7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRTdWJ0aXRsZSwgaWQoKSk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRTdWJ0aXRsZSwgdGhpcyk7CiAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1TZW5kU3VidGl0bGVHZW5lcmF0aW9uKTsKICAgICBpZiAocGFyY2VsICE9IE5VTEwpIHsKICAgICAgICAgbXNnLT5zZXRPYmplY3QoInN1YnRpdGxlIiwgcGFyY2VsKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkLm1rCmluZGV4IDlhOWZkZTIuLmUwZTBlMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5tawpAQCAtMjYsNCArMjYsNyBAQAogICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAogICAgIGxpYnV0aWxzCiAKK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCisKIGluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFNSVFNvdXJjZV90ZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFNSVFNvdXJjZV90ZXN0LmNwcAppbmRleCAzYTA2ZDYxLi4yMTFlNzMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9UaW1lZFRleHRTUlRTb3VyY2VfdGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0U1JUU291cmNlX3Rlc3QuY3BwCkBAIC02MywxMCArNjMsMTAgQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgICAgICBpZiAob2Zmc2V0ID49IG1TaXplKSByZXR1cm4gMDsKKyAgICAgICAgaWYgKChzaXplX3Qpb2Zmc2V0ID49IG1TaXplKSByZXR1cm4gMDsKIAogICAgICAgICBzc2l6ZV90IGF2YWlsID0gbVNpemUgLSBvZmZzZXQ7Ci0gICAgICAgIGlmIChhdmFpbCA+IHNpemUpIHsKKyAgICAgICAgaWYgKChzaXplX3QpYXZhaWwgPiBzaXplKSB7CiAgICAgICAgICAgICBhdmFpbCA9IHNpemU7CiAgICAgICAgIH0KICAgICAgICAgbWVtY3B5KGRhdGEsIG1EYXRhICsgb2Zmc2V0LCBhdmFpbCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQubWsKaW5kZXggNzA4MTQ2My4uYmM1M2M1NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5tawpAQCAtMSw4ICsxLDEwIEBACiBMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCi1MT0NBTF9DUFBGTEFHUyArPSAtRF9fU1RESU5UX0xJTUlUUyBcCi0gICAgICAgICAgICAgICAgICAtV2Vycm9yCitMT0NBTF9DUFBGTEFHUyArPSAtRF9fU1RESU5UX0xJTUlUUworCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQogCiBMT0NBTF9TUkNfRklMRVM6PSBFYm1sVXRpbC5jcHAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgIFdlYm1FbGVtZW50LmNwcCAgICAgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAKaW5kZXggMDY5OTYxYi4uNzM3ZjE0NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwCkBAIC04MCwzOCArODAsNiBAQAogICAgICAgICAgICAgbUN1ZVBvaW50cyk7CiB9CiAKLVdlYm1Xcml0ZXI6OldlYm1Xcml0ZXIoY29uc3QgY2hhciAqZmlsZW5hbWUpCi0gICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAotICAgICAgbVRpbWVDb2RlU2NhbGUoMTAwMDAwMCksCi0gICAgICBtU3RhcnRUaW1lc3RhbXBVcygwKSwKLSAgICAgIG1TdGFydFRpbWVPZmZzZXRNcygwKSwKLSAgICAgIG1TZWdtZW50T2Zmc2V0KDApLAotICAgICAgbVNlZ21lbnREYXRhU3RhcnQoMCksCi0gICAgICBtSW5mb09mZnNldCgwKSwKLSAgICAgIG1JbmZvU2l6ZSgwKSwKLSAgICAgIG1UcmFja3NPZmZzZXQoMCksCi0gICAgICBtQ3Vlc09mZnNldCgwKSwKLSAgICAgIG1QYXVzZWQoZmFsc2UpLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUlzRmlsZVNpemVMaW1pdEV4cGxpY2l0bHlSZXF1ZXN0ZWQoZmFsc2UpLAotICAgICAgbUlzUmVhbFRpbWVSZWNvcmRpbmcoZmFsc2UpLAotICAgICAgbVN0cmVhbWFibGVGaWxlKHRydWUpLAotICAgICAgbUVzdGltYXRlZEN1ZXNTaXplKDApIHsKLSAgICBtRmQgPSBvcGVuKGZpbGVuYW1lLCBPX0NSRUFUIHwgT19MQVJHRUZJTEUgfCBPX1RSVU5DIHwgT19SRFdSLCBTX0lSVVNSIHwgU19JV1VTUik7Ci0gICAgaWYgKG1GZCA+PSAwKSB7Ci0gICAgICAgIEFMT0dWKCJmZCAlZDsgZmxhZ3M6ICVvIiwgbUZkLCBmY250bChtRmQsIEZfR0VURkwsIDApKTsKLSAgICAgICAgbUluaXRDaGVjayA9IE9LOwotICAgIH0KLSAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0gPSBXZWJtU3RyZWFtKGtBdWRpb1R5cGUsICJBdWRpbyIsICZXZWJtV3JpdGVyOjphdWRpb1RyYWNrKTsKLSAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0gPSBXZWJtU3RyZWFtKGtWaWRlb1R5cGUsICJWaWRlbyIsICZXZWJtV3JpdGVyOjp2aWRlb1RyYWNrKTsKLSAgICBtU2lua1RocmVhZCA9IG5ldyBXZWJtRnJhbWVTaW5rVGhyZWFkKAotICAgICAgICAgICAgbUZkLAotICAgICAgICAgICAgbVNlZ21lbnREYXRhU3RhcnQsCi0gICAgICAgICAgICBtU3RyZWFtc1trVmlkZW9JbmRleF0ubVNpbmssCi0gICAgICAgICAgICBtU3RyZWFtc1trQXVkaW9JbmRleF0ubVNpbmssCi0gICAgICAgICAgICBtQ3VlUG9pbnRzKTsKLX0KLQogLy8gc3RhdGljCiBzcDxXZWJtRWxlbWVudD4gV2VibVdyaXRlcjo6dmlkZW9UcmFjayhjb25zdCBzcDxNZXRhRGF0YT4mIG1kKSB7CiAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuaAppbmRleCAzNmI2OTY1Li40YWQ3NzBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuaApAQCAtMzcsNyArMzcsNiBAQAogY2xhc3MgV2VibVdyaXRlciA6IHB1YmxpYyBNZWRpYVdyaXRlciB7CiBwdWJsaWM6CiAgICAgV2VibVdyaXRlcihpbnQgZmQpOwotICAgIFdlYm1Xcml0ZXIoY29uc3QgY2hhciAqZmlsZW5hbWUpOwogICAgIH5XZWJtV3JpdGVyKCkgeyByZXNldCgpOyB9CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvQW5kcm9pZC5tawppbmRleCBmNzA0NTRhLi5mYjI4NjI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvQW5kcm9pZC5tawpAQCAtMzAsNiArMzAsOSBAQAogICAgICAgICBsaWJ1aSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgbGlidXRpbHMgICAgICAgICAgICAgICAgICAgICAgICBcCiAKK0xPQ0FMX0NGTEFHUyArPSAtV25vLW11bHRpY2hhciAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCisKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X3dmZAogCiBMT0NBTF9NT0RVTEVfVEFHUzo9IG9wdGlvbmFsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvTWVkaWFTZW5kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L01lZGlhU2VuZGVyLmNwcAppbmRleCBiMWNkZWMwLi42ZjAwODdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvTWVkaWFTZW5kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9NZWRpYVNlbmRlci5jcHAKQEAgLTEyMSw3ICsxMjEsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRlck5vdGlmeSwgaWQoKSk7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZGVyTm90aWZ5LCB0aGlzKTsKICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtR2VuZXJhdGlvbik7CiAgICAgICAgICAgICBtVFNTZW5kZXIgPSBuZXcgUlRQU2VuZGVyKG1OZXRTZXNzaW9uLCBub3RpZnkpOwogICAgICAgICAgICAgbG9vcGVyKCktPnJlZ2lzdGVySGFuZGxlcihtVFNTZW5kZXIpOwpAQCAtMTcwLDcgKzE3MCw3IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZGVyTm90aWZ5LCBpZCgpKTsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZGVyTm90aWZ5LCB0aGlzKTsKICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUdlbmVyYXRpb24pOwogICAgIG5vdGlmeS0+c2V0U2l6ZSgidHJhY2tJbmRleCIsIHRyYWNrSW5kZXgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvVmlkZW9Gb3JtYXRzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9WaWRlb0Zvcm1hdHMuY3BwCmluZGV4IDJmNGFmNWIuLmRiYzUxMWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9WaWRlb0Zvcm1hdHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9WaWRlb0Zvcm1hdHMuY3BwCkBAIC0yNDgsOCArMjQ4LDggQEAKICAgICB9CiAKICAgICBpZiAoYmVzdFByb2ZpbGUgPT0gLTEgfHwgYmVzdExldmVsID09IC0xKSB7Ci0gICAgICAgIEFMT0dFKCJQcm9maWxlIG9yIGxldmVsIG5vdCBzZXQgZm9yIHJlc29sdXRpb24gdHlwZSAlZCwgaW5kZXggJWQiLAotICAgICAgICAgICAgICB0eXBlLCBpbmRleCk7CisgICAgICAgIEFMT0dFKCJQcm9maWxlIG9yIGxldmVsIG5vdCBzZXQgZm9yIHJlc29sdXRpb24gdHlwZSAlZCwgaW5kZXggJXp1IiwKKyAgICAgICAgICAgICAgICB0eXBlLCBpbmRleCk7CiAgICAgICAgIGJlc3RQcm9maWxlID0gUFJPRklMRV9DQlA7CiAgICAgICAgIGJlc3RMZXZlbCA9IExFVkVMXzMxOwogICAgIH0KQEAgLTM4Miw3ICszODIsNiBAQAogICAgIGRpc2FibGVBbGwoKTsKIAogICAgIHVuc2lnbmVkIG5hdGl2ZSwgZHVtbXk7Ci0gICAgdW5zaWduZWQgcmVzWzNdOwogICAgIHNpemVfdCBzaXplID0gc3RybGVuKHNwZWMpOwogICAgIHNpemVfdCBvZmZzZXQgPSAwOwogCkBAIC01MDcsNyArNTA2LDcgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQUxPR1YoInR5cGUgJXUsIGluZGV4ICV1LCAldSB4ICV1ICVjJXUgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgIEFMT0dWKCJ0eXBlICV6dSwgaW5kZXggJXp1LCAlenUgeCAlenUgJWMlenUgc3VwcG9ydGVkIiwKICAgICAgICAgICAgICAgICAgIGksIGosIHdpZHRoLCBoZWlnaHQsIGludGVybGFjZWQgPyAnaScgOiAncCcsIGZyYW1lc1BlclNlY29uZCk7CiAKICAgICAgICAgICAgIHVpbnQzMl90IHNjb3JlID0gd2lkdGggKiBoZWlnaHQgKiBmcmFtZXNQZXJTZWNvbmQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvcnRwL1JUUFNlbmRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvcnRwL1JUUFNlbmRlci5jcHAKaW5kZXggZTg4YTNiZDUuLmM2NmE4OTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9ydHAvUlRQU2VuZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvcnRwL1JUUFNlbmRlci5jcHAKQEAgLTk1LDExICs5NSwxMSBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+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+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdEhEQ1BOb3RpZnksIGlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRIRENQTm90aWZ5LCB0aGlzKTsKICAgICBtSERDUE9ic2VydmVyID0gbmV3IEhEQ1BPYnNlcnZlcihub3RpZnkpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gbUhEQ1AtPnNldE9ic2VydmVyKG1IRENQT2JzZXJ2ZXIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5L3NvdXJjZS9XaWZpRGlzcGxheVNvdXJjZS5oCmluZGV4IDc1MDI2NWYuLmMyNWE2NzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dpZmktZGlzcGxheS9zb3VyY2UvV2lmaURpc3BsYXlTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93aWZpLWRpc3BsYXkvc291cmNlL1dpZmlEaXNwbGF5U291cmNlLmgKQEAgLTI1LDEwICsyNSwxMyBAQAogCiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgogCisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgQVJlcGx5VG9rZW47CiBzdHJ1Y3QgSUhEQ1A7Ci1zdHJ1Y3QgSVJlbW90ZURpc3BsYXlDbGllbnQ7CitjbGFzcyBJUmVtb3RlRGlzcGxheUNsaWVudDsKIHN0cnVjdCBQYXJzZWRNZXNzYWdlOwogCiAvLyBSZXByZXNlbnRzIHRoZSBSVFNQIHNlcnZlciBhY3RpbmcgYXMgYSB3aWZpIGRpc3BsYXkgc291cmNlLgpAQCAtMzcsNiArNDAsNyBAQAogICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBrV2lmaURpc3BsYXlEZWZhdWx0UG9ydCA9IDcyMzY7CiAKICAgICBXaWZpRGlzcGxheVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgY29uc3Qgc3A8QU5ldHdvcmtTZXNzaW9uPiAmbmV0U2Vzc2lvbiwKICAgICAgICAgICAgIGNvbnN0IHNwPElSZW1vdGVEaXNwbGF5Q2xpZW50PiAmY2xpZW50LAogICAgICAgICAgICAgY29uc3QgY2hhciAqcGF0aCA9IE5VTEwpOwpAQCAtMTEzLDYgKzExNyw4IEBACiAKICAgICBzdGF0aWMgY29uc3QgQVN0cmluZyBzVXNlckFnZW50OwogCisgICAgU3RyaW5nMTYgbU9wUGFja2FnZU5hbWU7CisKICAgICBTdGF0ZSBtU3RhdGU7CiAgICAgVmlkZW9Gb3JtYXRzIG1TdXBwb3J0ZWRTb3VyY2VWaWRlb0Zvcm1hdHM7CiAgICAgc3A8QU5ldHdvcmtTZXNzaW9uPiBtTmV0U2Vzc2lvbjsKQEAgLTEyMSw3ICsxMjcsNyBAQAogICAgIHN0cnVjdCBpbl9hZGRyIG1JbnRlcmZhY2VBZGRyOwogICAgIGludDMyX3QgbVNlc3Npb25JRDsKIAotICAgIHVpbnQzMl90IG1TdG9wUmVwbHlJRDsKKyAgICBzcDxBUmVwbHlUb2tlbj4gbVN0b3BSZXBseUlEOwogCiAgICAgQVN0cmluZyBtV2ZkQ2xpZW50UnRwUG9ydHM7CiAgICAgaW50MzJfdCBtQ2hvc2VuUlRQUG9ydDsgIC8vIGV4dHJhY3RlZCBmcm9tICJ3ZmRfY2xpZW50X3J0cF9wb3J0cyIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L0FuZHJvaWQubWsKaW5kZXggYmI4NmRmYy4uZGM2NzI4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L0FuZHJvaWQubWsKQEAgLTEyLDcgKzEyLDcgQEAKIExPQ0FMX01PRFVMRTo9IGxpYnN0YWdlZnJpZ2h0X3l1dgogCiAKLUxPQ0FMX0NGTEFHUyArPSAtV2Vycm9yCi0KK0xPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCitMT0NBTF9DTEFORyA6PSB0cnVlCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZJbWFnZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC95dXYvWVVWSW1hZ2UuY3BwCmluZGV4IGJiM2UyZmQuLmMwOTgxMzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3l1di9ZVVZJbWFnZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveXV2L1lVVkltYWdlLmNwcApAQCAtMzc0LDEzICszNzQsMTMgQEAKIAogdm9pZCBZVVZJbWFnZTo6eXV2MnJnYih1aW50OF90IHlWYWx1ZSwgdWludDhfdCB1VmFsdWUsIHVpbnQ4X3QgdlZhbHVlLAogICAgICAgICB1aW50OF90ICpyLCB1aW50OF90ICpnLCB1aW50OF90ICpiKSBjb25zdCB7Ci0gICAgKnIgPSB5VmFsdWUgKyAoMS4zNzA3MDUgKiAodlZhbHVlLTEyOCkpOwotICAgICpnID0geVZhbHVlIC0gKDAuNjk4MDAxICogKHZWYWx1ZS0xMjgpKSAtICgwLjMzNzYzMyAqICh1VmFsdWUtMTI4KSk7Ci0gICAgKmIgPSB5VmFsdWUgKyAoMS43MzI0NDYgKiAodVZhbHVlLTEyOCkpOworICAgIGludCByVG1wID0geVZhbHVlICsgKDEuMzcwNzA1ICogKHZWYWx1ZS0xMjgpKTsKKyAgICBpbnQgZ1RtcCA9IHlWYWx1ZSAtICgwLjY5ODAwMSAqICh2VmFsdWUtMTI4KSkgLSAoMC4zMzc2MzMgKiAodVZhbHVlLTEyOCkpOworICAgIGludCBiVG1wID0geVZhbHVlICsgKDEuNzMyNDQ2ICogKHVWYWx1ZS0xMjgpKTsKIAotICAgICpyID0gY2xhbXAoKnIsIDAsIDI1NSk7Ci0gICAgKmcgPSBjbGFtcCgqZywgMCwgMjU1KTsKLSAgICAqYiA9IGNsYW1wKCpiLCAwLCAyNTUpOworICAgICpyID0gY2xhbXAoclRtcCwgMCwgMjU1KTsKKyAgICAqZyA9IGNsYW1wKGdUbXAsIDAsIDI1NSk7CisgICAgKmIgPSBjbGFtcChiVG1wLCAwLCAyNTUpOwogfQogCiBib29sIFlVVkltYWdlOjp3cml0ZVRvUFBNKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSBjb25zdCB7CmRpZmYgLS1naXQgYS9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLm1rIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5tawppbmRleCBiMDIwYzk4Li43ZTAxN2I5IDEwMDY0NAotLS0gYS9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQubWsKQEAgLTExLDE0ICsxMSwxNiBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKLQltYWluX21lZGlhc2VydmVyLmNwcCAKKwltYWluX21lZGlhc2VydmVyLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJhdWRpb2ZsaW5nZXIgXAogCWxpYmF1ZGlvcG9saWN5c2VydmljZSBcCiAJbGliY2FtZXJhX21ldGFkYXRhXAogCWxpYmNhbWVyYXNlcnZpY2UgXAorCWxpYmljdXVjIFwKIAlsaWJtZWRpYWxvZ3NlcnZpY2UgXAorCWxpYnJlc291cmNlbWFuYWdlcnNlcnZpY2UgXAogCWxpYmN1dGlscyBcCiAJbGlibmJhaW8gXAogCWxpYm1lZGlhIFwKQEAgLTI2LDEwICsyOCwxMiBAQAogCWxpYnV0aWxzIFwKIAlsaWJsb2cgXAogCWxpYmJpbmRlciBcCi0JbGlic291bmR0cmlnZ2Vyc2VydmljZQorCWxpYnNvdW5kdHJpZ2dlcnNlcnZpY2UgXAorCWxpYnJhZGlvc2VydmljZQogCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLQlsaWJyZWdpc3Rlcm1zZXh0CisgICAgICAgIGxpYmljdWFuZHJvaWRfdXRpbHMgXAorICAgICAgICBsaWJyZWdpc3Rlcm1zZXh0CiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlIFwKQEAgLTM3LDkgKzQxLDE1IEBACiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYWxvZyBcCiAgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIgXAogICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlIFwKKyAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKKyAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UgXAogICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UgXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIgXAogICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvc291bmR0cmlnZ2VyCisgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIgXAorICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvcmFkaW8gXAorICAgIGV4dGVybmFsL3NvbmljCiAKIExPQ0FMX01PRFVMRTo9IG1lZGlhc2VydmVyCiBMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCmRpZmYgLS1naXQgYS9tZWRpYS9tZWRpYXNlcnZlci9tYWluX21lZGlhc2VydmVyLmNwcCBiL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwCmluZGV4IGEyODlmYzcuLjhjYzk1MDggMTAwNjQ0Ci0tLSBhL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwCisrKyBiL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwCkBAIC0zMSwxMSArMzEsMTQgQEAKIC8vIGZyb20gTE9DQUxfQ19JTkNMVURFUwogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKKyNpbmNsdWRlICJJY3VVdGlscy5oIgogI2luY2x1ZGUgIk1lZGlhTG9nU2VydmljZS5oIgogI2luY2x1ZGUgIk1lZGlhUGxheWVyU2VydmljZS5oIgorI2luY2x1ZGUgIlJlc291cmNlTWFuYWdlclNlcnZpY2UuaCIKKyNpbmNsdWRlICJzZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oIgogI2luY2x1ZGUgIk1lZGlhVXRpbHMuaCIKLSNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKICNpbmNsdWRlICJTb3VuZFRyaWdnZXJId1NlcnZpY2UuaCIKKyNpbmNsdWRlICJSYWRpb1NlcnZpY2UuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKQEAgLTEyOCwxNCArMTMxLDE3IEBACiAgICAgICAgICAgICBwcmN0bChQUl9TRVRfUERFQVRIU0lHLCBTSUdLSUxMKTsgICAvLyBpZiBwYXJlbnQgbWVkaWEubG9nIGRpZXMgYmVmb3JlIG1lLCBraWxsIG1lIGFsc28KICAgICAgICAgICAgIHNldHBnaWQoMCwgMCk7ICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBpZiBJIGRpZSBmaXJzdCwgZG9uJ3Qga2lsbCBteSBwYXJlbnQKICAgICAgICAgfQorICAgICAgICBJbml0aWFsaXplSWN1T3JEaWUoKTsKICAgICAgICAgc3A8UHJvY2Vzc1N0YXRlPiBwcm9jKFByb2Nlc3NTdGF0ZTo6c2VsZigpKTsKICAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwogICAgICAgICBBTE9HSSgiU2VydmljZU1hbmFnZXI6ICVwIiwgc20uZ2V0KCkpOwogICAgICAgICBBdWRpb0ZsaW5nZXI6Omluc3RhbnRpYXRlKCk7CiAgICAgICAgIE1lZGlhUGxheWVyU2VydmljZTo6aW5zdGFudGlhdGUoKTsKKyAgICAgICAgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICAgICAgQ2FtZXJhU2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwogICAgICAgICBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisgICAgICAgIFJhZGlvU2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICAgICAgcmVnaXN0ZXJFeHRlbnNpb25zKCk7CiAgICAgICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcAppbmRleCBlZDAwYjcyLi5jZDBjNDYyIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCkBAIC0xMTYsNyArMTE2LDcgQEAKIAogICAgICAgICBjYXNlIGtXaGF0U3RvcEFjdGl2aXR5Tm90aWZpY2F0aW9uczoKICAgICAgICAgewotICAgICAgICAgICAgdWludDMyX3QgcmVwbHlJRDsKKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwogICAgICAgICAgICAgbXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCk7CiAKICAgICAgICAgICAgIG1Db2RlYy0+bUdlbmVyYXRpb24rKzsKQEAgLTEzNiw3ICsxMzYsNyBAQAogCiAKIHN0YXRpYyB2b2lkIHJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbihBTWVkaWFDb2RlYyAqY29kZWMpIHsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9ucywgY29kZWMtPm1IYW5kbGVyLT5pZCgpKSktPnBvc3QoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0UmVxdWVzdEFjdGl2aXR5Tm90aWZpY2F0aW9ucywgY29kZWMtPm1IYW5kbGVyKSktPnBvc3QoKTsKIH0KIAogZXh0ZXJuICJDIiB7CkBAIC0xNTQsNiArMTU0LDEwIEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbURhdGEtPm1Db2RlYyA9IGFuZHJvaWQ6Ok1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZShtRGF0YS0+bUxvb3BlciwgbmFtZSk7CiAgICAgfQorICAgIGlmIChtRGF0YS0+bUNvZGVjID09IE5VTEwpIHsgIC8vIGZhaWxlZCB0byBjcmVhdGUgY29kZWMKKyAgICAgICAgQU1lZGlhQ29kZWNfZGVsZXRlKG1EYXRhKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIG1EYXRhLT5tSGFuZGxlciA9IG5ldyBDb2RlY0hhbmRsZXIobURhdGEpOwogICAgIG1EYXRhLT5tTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobURhdGEtPm1IYW5kbGVyKTsKICAgICBtRGF0YS0+bUdlbmVyYXRpb24gPSAxOwpAQCAtMTgwLDE3ICsxODQsMjEgQEAKIAogRVhQT1JUCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19kZWxldGUoQU1lZGlhQ29kZWMgKm1EYXRhKSB7Ci0gICAgaWYgKG1EYXRhLT5tQ29kZWMgIT0gTlVMTCkgewotICAgICAgICBtRGF0YS0+bUNvZGVjLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1EYXRhLT5tQ29kZWMuY2xlYXIoKTsKLSAgICB9CisgICAgaWYgKG1EYXRhICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG1EYXRhLT5tQ29kZWMgIT0gTlVMTCkgeworICAgICAgICAgICAgbURhdGEtPm1Db2RlYy0+cmVsZWFzZSgpOworICAgICAgICAgICAgbURhdGEtPm1Db2RlYy5jbGVhcigpOworICAgICAgICB9CiAKLSAgICBpZiAobURhdGEtPm1Mb29wZXIgIT0gTlVMTCkgewotICAgICAgICBtRGF0YS0+bUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobURhdGEtPm1IYW5kbGVyLT5pZCgpKTsKLSAgICAgICAgbURhdGEtPm1Mb29wZXItPnN0b3AoKTsKLSAgICAgICAgbURhdGEtPm1Mb29wZXIuY2xlYXIoKTsKKyAgICAgICAgaWYgKG1EYXRhLT5tTG9vcGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChtRGF0YS0+bUhhbmRsZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1EYXRhLT5tTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtRGF0YS0+bUhhbmRsZXItPmlkKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURhdGEtPm1Mb29wZXItPnN0b3AoKTsKKyAgICAgICAgICAgIG1EYXRhLT5tTG9vcGVyLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIG1EYXRhOwogICAgIH0KLSAgICBkZWxldGUgbURhdGE7CiAgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIApAQCAtMjE5LDcgKzIyNyw3IEBACiAgICAgaWYgKHJldCAhPSBPSykgewogICAgICAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKHJldCk7CiAgICAgfQotICAgIG1EYXRhLT5tQWN0aXZpdHlOb3RpZmljYXRpb24gPSBuZXcgQU1lc3NhZ2Uoa1doYXRBY3Rpdml0eU5vdGlmeSwgbURhdGEtPm1IYW5kbGVyLT5pZCgpKTsKKyAgICBtRGF0YS0+bUFjdGl2aXR5Tm90aWZpY2F0aW9uID0gbmV3IEFNZXNzYWdlKGtXaGF0QWN0aXZpdHlOb3RpZnksIG1EYXRhLT5tSGFuZGxlcik7CiAgICAgbURhdGEtPm1BY3Rpdml0eU5vdGlmaWNhdGlvbi0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtRGF0YS0+bUdlbmVyYXRpb24pOwogICAgIHJlcXVlc3RBY3Rpdml0eU5vdGlmaWNhdGlvbihtRGF0YSk7CiAgICAgcmV0dXJuIEFNRURJQV9PSzsKQEAgLTIyOSw3ICsyMzcsNyBAQAogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc3RvcChBTWVkaWFDb2RlYyAqbURhdGEpIHsKICAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1Db2RlYy0+c3RvcCgpKTsKIAotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wQWN0aXZpdHlOb3RpZmljYXRpb25zLCBtRGF0YS0+bUhhbmRsZXItPmlkKCkpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wQWN0aXZpdHlOb3RpZmljYXRpb25zLCBtRGF0YS0+bUhhbmRsZXIpOwogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKICAgICBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7CiAgICAgbURhdGEtPm1BY3Rpdml0eU5vdGlmaWNhdGlvbi5jbGVhcigpOwpAQCAtMzUyLDcgKzM2MCw4IEBACiB9CiAKIC8vRVhQT1JUCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zZXROb3RpZmljYXRpb25DYWxsYmFjayhBTWVkaWFDb2RlYyAqbURhdGEsIE9uQ29kZWNFdmVudCBjYWxsYmFjaywgdm9pZCAqdXNlcmRhdGEpIHsKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3NldE5vdGlmaWNhdGlvbkNhbGxiYWNrKEFNZWRpYUNvZGVjICptRGF0YSwgT25Db2RlY0V2ZW50IGNhbGxiYWNrLAorICAgICAgICB2b2lkICp1c2VyZGF0YSkgewogICAgIG1EYXRhLT5tQ2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICBtRGF0YS0+bUNhbGxiYWNrVXNlckRhdGEgPSB1c2VyZGF0YTsKICAgICByZXR1cm4gQU1FRElBX09LOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKaW5kZXggN2ExMDQ4Yy4uODNhNWJhMSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCkBAIC0zMTIsOCArMzEyLDEwIEBACiAgICAgICAgICAgICAgICAgU3RyaW5nOChvcHRpb25hbFBhcmFtZXRlcnNbaV0ubVZhbHVlKSk7CiAgICAgfQogICAgIFN0cmluZzggZGVmYXVsdFVybDsKKyAgICBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlIGtleVJlcXVlc3RUeXBlOwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1PYmotPm1Ecm0tPmdldEtleVJlcXVlc3QoKml0ZXIsIG1kSW5pdCwgU3RyaW5nOChtaW1lVHlwZSksCi0gICAgICAgICAgICBtZEtleVR5cGUsIG1kT3B0aW9uYWxQYXJhbWV0ZXJzLCBtT2JqLT5tS2V5UmVxdWVzdCwgZGVmYXVsdFVybCk7CisgICAgICAgICAgICBtZEtleVR5cGUsIG1kT3B0aW9uYWxQYXJhbWV0ZXJzLCBtT2JqLT5tS2V5UmVxdWVzdCwgZGVmYXVsdFVybCwKKyAgICAgICAgICAgICZrZXlSZXF1ZXN0VHlwZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKQEAgLTcyNSw0ICs3MjcsMyBAQAogfQogCiB9IC8vIGV4dGVybiAiQyIKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggZGI1N2QwYi4uMGVjZDY0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC03MCw3ICs3MCw4IEBACiB9CiAKIEVYUE9SVAotbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VGZChBTWVkaWFFeHRyYWN0b3IgKm1EYXRhLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCkgeworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VGZChBTWVkaWFFeHRyYWN0b3IgKm1EYXRhLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LAorICAgICAgICBvZmY2NF90IGxlbmd0aCkgewogICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVkLCAlbGxkLCAlbGxkKSIsIGZkLCBvZmZzZXQsIGxlbmd0aCk7CiAgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihtRGF0YS0+bUltcGwtPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKSk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9BbmRyb2lkLm1rIGIvbWVkaWEvdXRpbHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmFkYmM4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM5IEBACisjIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgIEJhdHRlcnlOb3RpZmllci5jcHAgXAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgbGliYmluZGVyIFwKKyAgbGliY3V0aWxzIFwKKyAgbGlibG9nIFwKKyAgbGlidXRpbHMgXAorCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvaW5jbHVkZQorCitMT0NBTF9DRkxBR1MgKz0gXAorICAtV2FsbCBcCisgIC1XZXh0cmEgXAorICAtV2Vycm9yIFwKKworTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9ICQoTE9DQUxfUEFUSCkvaW5jbHVkZQorCitMT0NBTF9NT0RVTEUgOj0gbGlibWVkaWF1dGlscworCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9CYXR0ZXJ5Tm90aWZpZXIuY3BwIGIvbWVkaWEvdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjljZDdhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmNwcApAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImluY2x1ZGUvbWVkaWF1dGlscy9CYXR0ZXJ5Tm90aWZpZXIuaCIKKworI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIEJhdHRlcnlOb3RpZmllcjo6RGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgLyp3aG8qLykgeworICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5vbkJhdHRlcnlTdGF0U2VydmljZURpZWQoKTsKK30KKworQmF0dGVyeU5vdGlmaWVyOjpCYXR0ZXJ5Tm90aWZpZXIoKSA6IG1WaWRlb1JlZkNvdW50KDApLCBtQXVkaW9SZWZDb3VudCgwKSB7fQorCitCYXR0ZXJ5Tm90aWZpZXI6On5CYXR0ZXJ5Tm90aWZpZXIoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobURlYXRoTm90aWZpZXIgIT0gbnVsbHB0cikgeworICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQmF0dGVyeVN0YXRTZXJ2aWNlKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcik7CisgICAgfQorfQorCit2b2lkIEJhdHRlcnlOb3RpZmllcjo6bm90ZVN0YXJ0VmlkZW8oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzcDxJQmF0dGVyeVN0YXRzPiBiYXR0ZXJ5U2VydmljZSA9IGdldEJhdHRlcnlTZXJ2aWNlX2woKTsKKyAgICBpZiAobVZpZGVvUmVmQ291bnQgPT0gMCAmJiBiYXR0ZXJ5U2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIGJhdHRlcnlTZXJ2aWNlLT5ub3RlU3RhcnRWaWRlbyhBSURfTUVESUEpOworICAgIH0KKyAgICBtVmlkZW9SZWZDb3VudCsrOworfQorCit2b2lkIEJhdHRlcnlOb3RpZmllcjo6bm90ZVN0b3BWaWRlbygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtVmlkZW9SZWZDb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogdmlkZW8gcmVmY291bnQgaXMgYnJva2VuLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxJQmF0dGVyeVN0YXRzPiBiYXR0ZXJ5U2VydmljZSA9IGdldEJhdHRlcnlTZXJ2aWNlX2woKTsKKworICAgIG1WaWRlb1JlZkNvdW50LS07CisgICAgaWYgKG1WaWRlb1JlZkNvdW50ID09IDAgJiYgYmF0dGVyeVNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBiYXR0ZXJ5U2VydmljZS0+bm90ZVN0b3BWaWRlbyhBSURfTUVESUEpOworICAgIH0KK30KKwordm9pZCBCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVSZXNldFZpZGVvKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3A8SUJhdHRlcnlTdGF0cz4gYmF0dGVyeVNlcnZpY2UgPSBnZXRCYXR0ZXJ5U2VydmljZV9sKCk7CisgICAgbVZpZGVvUmVmQ291bnQgPSAwOworICAgIGlmIChiYXR0ZXJ5U2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIGJhdHRlcnlTZXJ2aWNlLT5ub3RlUmVzZXRBdWRpbygpOworICAgIH0KK30KKwordm9pZCBCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVTdGFydEF1ZGlvKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3A8SUJhdHRlcnlTdGF0cz4gYmF0dGVyeVNlcnZpY2UgPSBnZXRCYXR0ZXJ5U2VydmljZV9sKCk7CisgICAgaWYgKG1BdWRpb1JlZkNvdW50ID09IDAgJiYgYmF0dGVyeVNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBiYXR0ZXJ5U2VydmljZS0+bm90ZVN0YXJ0QXVkaW8oQUlEX01FRElBKTsKKyAgICB9CisgICAgbUF1ZGlvUmVmQ291bnQrKzsKK30KKwordm9pZCBCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVTdG9wQXVkaW8oKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUF1ZGlvUmVmQ291bnQgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IGF1ZGlvIHJlZmNvdW50IGlzIGJyb2tlbi4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8SUJhdHRlcnlTdGF0cz4gYmF0dGVyeVNlcnZpY2UgPSBnZXRCYXR0ZXJ5U2VydmljZV9sKCk7CisKKyAgICBtQXVkaW9SZWZDb3VudC0tOworICAgIGlmIChtQXVkaW9SZWZDb3VudCA9PSAwICYmIGJhdHRlcnlTZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgYmF0dGVyeVNlcnZpY2UtPm5vdGVTdG9wQXVkaW8oQUlEX01FRElBKTsKKyAgICB9Cit9CisKK3ZvaWQgQmF0dGVyeU5vdGlmaWVyOjpub3RlUmVzZXRBdWRpbygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IGJhdHRlcnlTZXJ2aWNlID0gZ2V0QmF0dGVyeVNlcnZpY2VfbCgpOworICAgIG1BdWRpb1JlZkNvdW50ID0gMDsKKyAgICBpZiAoYmF0dGVyeVNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBiYXR0ZXJ5U2VydmljZS0+bm90ZVJlc2V0QXVkaW8oKTsKKyAgICB9Cit9CisKK3ZvaWQgQmF0dGVyeU5vdGlmaWVyOjpub3RlRmxhc2hsaWdodE9uKGNvbnN0IFN0cmluZzgmIGlkLCBpbnQgdWlkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzcDxJQmF0dGVyeVN0YXRzPiBiYXR0ZXJ5U2VydmljZSA9IGdldEJhdHRlcnlTZXJ2aWNlX2woKTsKKworICAgIHN0ZDo6cGFpcjxTdHJpbmc4LCBpbnQ+IGsgPSBzdGQ6Om1ha2VfcGFpcihpZCwgdWlkKTsKKyAgICBpZiAoIW1GbGFzaGxpZ2h0U3RhdGVba10pIHsKKyAgICAgICAgbUZsYXNobGlnaHRTdGF0ZVtrXSA9IHRydWU7CisgICAgICAgIGlmIChiYXR0ZXJ5U2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBiYXR0ZXJ5U2VydmljZS0+bm90ZUZsYXNobGlnaHRPbih1aWQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEJhdHRlcnlOb3RpZmllcjo6bm90ZUZsYXNobGlnaHRPZmYoY29uc3QgU3RyaW5nOCYgaWQsIGludCB1aWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IGJhdHRlcnlTZXJ2aWNlID0gZ2V0QmF0dGVyeVNlcnZpY2VfbCgpOworCisgICAgc3RkOjpwYWlyPFN0cmluZzgsIGludD4gayA9IHN0ZDo6bWFrZV9wYWlyKGlkLCB1aWQpOworICAgIGlmIChtRmxhc2hsaWdodFN0YXRlW2tdKSB7CisgICAgICAgIG1GbGFzaGxpZ2h0U3RhdGVba10gPSBmYWxzZTsKKyAgICAgICAgaWYgKGJhdHRlcnlTZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGJhdHRlcnlTZXJ2aWNlLT5ub3RlRmxhc2hsaWdodE9mZih1aWQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEJhdHRlcnlOb3RpZmllcjo6bm90ZVJlc2V0Rmxhc2hsaWdodCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IGJhdHRlcnlTZXJ2aWNlID0gZ2V0QmF0dGVyeVNlcnZpY2VfbCgpOworICAgIG1GbGFzaGxpZ2h0U3RhdGUuY2xlYXIoKTsKKyAgICBpZiAoYmF0dGVyeVNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBiYXR0ZXJ5U2VydmljZS0+bm90ZVJlc2V0Rmxhc2hsaWdodCgpOworICAgIH0KK30KKwordm9pZCBCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVTdGFydENhbWVyYShjb25zdCBTdHJpbmc4JiBpZCwgaW50IHVpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3A8SUJhdHRlcnlTdGF0cz4gYmF0dGVyeVNlcnZpY2UgPSBnZXRCYXR0ZXJ5U2VydmljZV9sKCk7CisgICAgc3RkOjpwYWlyPFN0cmluZzgsIGludD4gayA9IHN0ZDo6bWFrZV9wYWlyKGlkLCB1aWQpOworICAgIGlmICghbUNhbWVyYVN0YXRlW2tdKSB7CisgICAgICAgIG1DYW1lcmFTdGF0ZVtrXSA9IHRydWU7CisgICAgICAgIGlmIChiYXR0ZXJ5U2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBiYXR0ZXJ5U2VydmljZS0+bm90ZVN0YXJ0Q2FtZXJhKHVpZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQmF0dGVyeU5vdGlmaWVyOjpub3RlU3RvcENhbWVyYShjb25zdCBTdHJpbmc4JiBpZCwgaW50IHVpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3A8SUJhdHRlcnlTdGF0cz4gYmF0dGVyeVNlcnZpY2UgPSBnZXRCYXR0ZXJ5U2VydmljZV9sKCk7CisgICAgc3RkOjpwYWlyPFN0cmluZzgsIGludD4gayA9IHN0ZDo6bWFrZV9wYWlyKGlkLCB1aWQpOworICAgIGlmIChtQ2FtZXJhU3RhdGVba10pIHsKKyAgICAgICAgbUNhbWVyYVN0YXRlW2tdID0gZmFsc2U7CisgICAgICAgIGlmIChiYXR0ZXJ5U2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBiYXR0ZXJ5U2VydmljZS0+bm90ZVN0b3BDYW1lcmEodWlkKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBCYXR0ZXJ5Tm90aWZpZXI6Om5vdGVSZXNldENhbWVyYSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IGJhdHRlcnlTZXJ2aWNlID0gZ2V0QmF0dGVyeVNlcnZpY2VfbCgpOworICAgIG1DYW1lcmFTdGF0ZS5jbGVhcigpOworICAgIGlmIChiYXR0ZXJ5U2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIGJhdHRlcnlTZXJ2aWNlLT5ub3RlUmVzZXRDYW1lcmEoKTsKKyAgICB9Cit9CisKK3ZvaWQgQmF0dGVyeU5vdGlmaWVyOjpvbkJhdHRlcnlTdGF0U2VydmljZURpZWQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQmF0dGVyeVN0YXRTZXJ2aWNlLmNsZWFyKCk7CisgICAgbURlYXRoTm90aWZpZXIuY2xlYXIoKTsKKyAgICAvLyBEbyBub3QgcmVzZXQgbVZpZGVvUmVmQ291bnQgYW5kIG1BdWRpb1JlZkNvdW50IGhlcmUuIFRoZSByZWYKKyAgICAvLyBjb3VudGluZyBpcyBpbmRlcGVuZGVudCBvZiB0aGUgYmF0dGVyeSBzZXJ2aWNlIGF2YWlsYWJpbGl0eS4KKyAgICAvLyBXZSBuZWVkIHRoaXMgaWYgYmF0dGVyeSBzZXJ2aWNlIGJlY29tZXMgYXZhaWxhYmxlIGFmdGVyIG1lZGlhCisgICAgLy8gc3RhcnRlZC4KKworfQorCitzcDxJQmF0dGVyeVN0YXRzPiBCYXR0ZXJ5Tm90aWZpZXI6OmdldEJhdHRlcnlTZXJ2aWNlX2woKSB7CisgICAgaWYgKG1CYXR0ZXJ5U3RhdFNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbUJhdHRlcnlTdGF0U2VydmljZTsKKyAgICB9CisgICAgLy8gR2V0IGJhdHRlcnkgc2VydmljZSBmcm9tIHNlcnZpY2UgbWFuYWdlcgorICAgIGNvbnN0IHNwPElTZXJ2aWNlTWFuYWdlcj4gc20oZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCkpOworICAgIGlmIChzbSAhPSBudWxscHRyKSB7CisgICAgICAgIGNvbnN0IFN0cmluZzE2IG5hbWUoImJhdHRlcnlzdGF0cyIpOworICAgICAgICBtQmF0dGVyeVN0YXRTZXJ2aWNlID0gaW50ZXJmYWNlX2Nhc3Q8SUJhdHRlcnlTdGF0cz4oc20tPmNoZWNrU2VydmljZShuYW1lKSk7CisgICAgICAgIGlmIChtQmF0dGVyeVN0YXRTZXJ2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJiYXR0ZXJ5c3RhdHMgc2VydmljZSB1bmF2YWlsYWJsZSEiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisKKyAgICAgICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcigpOworICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQmF0dGVyeVN0YXRTZXJ2aWNlKS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIpOworCisgICAgICAgIC8vIE5vdGlmeSBzdGFydCBub3cgaWYgbWVkaWEgYWxyZWFkeSBzdGFydGVkCisgICAgICAgIGlmIChtVmlkZW9SZWZDb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1CYXR0ZXJ5U3RhdFNlcnZpY2UtPm5vdGVTdGFydFZpZGVvKEFJRF9NRURJQSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1BdWRpb1JlZkNvdW50ID4gMCkgeworICAgICAgICAgICAgbUJhdHRlcnlTdGF0U2VydmljZS0+bm90ZVN0YXJ0QXVkaW8oQUlEX01FRElBKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbUJhdHRlcnlTdGF0U2VydmljZTsKK30KKworQU5EUk9JRF9TSU5HTEVUT05fU1RBVElDX0lOU1RBTkNFKEJhdHRlcnlOb3RpZmllcik7CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9SRUFETUUgYi9tZWRpYS91dGlscy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVhYjBiOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL1JFQURNRQpAQCAtMCwwICsxLDQgQEAKK1RoaXMgaXMgYSBjb21tb24gc2hhcmVkIGxpYnJhcnkgZm9yIG1lZGlhIHV0aWxpdHkgY2xhc3Nlcy4KKworQ29uc2lkZXIgYWRkaW5nIHlvdXIgdXRpbGl0eSBjbGFzcy9mdW5jdGlvbiBoZXJlIGlmIGl0IHdpbGwKK2JlIHVzZWQgYWNyb3NzIHNldmVyYWwgb2YgdGhlIG1lZGlhIGxpYnJhcmllcy4KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9CYXR0ZXJ5Tm90aWZpZXIuaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9CYXR0ZXJ5Tm90aWZpZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTA0ODA0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9CYXR0ZXJ5Tm90aWZpZXIuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0JBVFRFUllfTk9USUZJRVJfSAorI2RlZmluZSBNRURJQV9CQVRURVJZX05PVElGSUVSX0gKKworI2luY2x1ZGUgPGJpbmRlci9JQmF0dGVyeVN0YXRzLmg+CisjaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBDbGFzcyB1c2VkIGZvciBsb2dnaW5nIGJhdHRlcnkgbGlmZSBldmVudHMgaW4gbWVkaWFzZXJ2ZXIuCisgKi8KK2NsYXNzIEJhdHRlcnlOb3RpZmllciA6IHB1YmxpYyBTaW5nbGV0b248QmF0dGVyeU5vdGlmaWVyPiB7CisKKyAgICBmcmllbmQgY2xhc3MgU2luZ2xldG9uPEJhdHRlcnlOb3RpZmllcj47CisgICAgQmF0dGVyeU5vdGlmaWVyKCk7CisKK3B1YmxpYzoKKyAgICB+QmF0dGVyeU5vdGlmaWVyKCk7CisKKyAgICB2b2lkIG5vdGVTdGFydFZpZGVvKCk7CisgICAgdm9pZCBub3RlU3RvcFZpZGVvKCk7CisgICAgdm9pZCBub3RlUmVzZXRWaWRlbygpOworICAgIHZvaWQgbm90ZVN0YXJ0QXVkaW8oKTsKKyAgICB2b2lkIG5vdGVTdG9wQXVkaW8oKTsKKyAgICB2b2lkIG5vdGVSZXNldEF1ZGlvKCk7CisgICAgdm9pZCBub3RlRmxhc2hsaWdodE9uKGNvbnN0IFN0cmluZzgmIGlkLCBpbnQgdWlkKTsKKyAgICB2b2lkIG5vdGVGbGFzaGxpZ2h0T2ZmKGNvbnN0IFN0cmluZzgmIGlkLCBpbnQgdWlkKTsKKyAgICB2b2lkIG5vdGVSZXNldEZsYXNobGlnaHQoKTsKKyAgICB2b2lkIG5vdGVTdGFydENhbWVyYShjb25zdCBTdHJpbmc4JiBpZCwgaW50IHVpZCk7CisgICAgdm9pZCBub3RlU3RvcENhbWVyYShjb25zdCBTdHJpbmc4JiBpZCwgaW50IHVpZCk7CisgICAgdm9pZCBub3RlUmVzZXRDYW1lcmEoKTsKKworcHJpdmF0ZToKKyAgICB2b2lkIG9uQmF0dGVyeVN0YXRTZXJ2aWNlRGllZCgpOworCisgICAgY2xhc3MgRGVhdGhOb3RpZmllciA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CisgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiAvKndobyovKTsKKyAgICB9OworCisgICAgTXV0ZXggbUxvY2s7CisgICAgaW50IG1WaWRlb1JlZkNvdW50OworICAgIGludCBtQXVkaW9SZWZDb3VudDsKKyAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8U3RyaW5nOCwgaW50PiwgYm9vbD4gbUZsYXNobGlnaHRTdGF0ZTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnBhaXI8U3RyaW5nOCwgaW50PiwgYm9vbD4gbUNhbWVyYVN0YXRlOworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IG1CYXR0ZXJ5U3RhdFNlcnZpY2U7CisgICAgc3A8RGVhdGhOb3RpZmllcj4gbURlYXRoTm90aWZpZXI7CisKKyAgICBzcDxJQmF0dGVyeVN0YXRzPiBnZXRCYXR0ZXJ5U2VydmljZV9sKCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gTUVESUFfQkFUVEVSWV9OT1RJRklFUl9ICmRpZmYgLS1naXQgYS9yYWRpby9BbmRyb2lkLm1rIGIvcmFkaW8vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2JiOGZkCi0tLSAvZGV2L251bGwKKysrIGIvcmFkaW8vQW5kcm9pZC5tawpAQCAtMCwwICsxLDM5IEBACisjIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorCVJhZGlvLmNwcCBcCisJSVJhZGlvLmNwcCBcCisJSVJhZGlvQ2xpZW50LmNwcCBcCisJSVJhZGlvU2VydmljZS5jcHAKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisJbGliY3V0aWxzIFwKKwlsaWJ1dGlscyBcCisJbGlibG9nIFwKKwlsaWJiaW5kZXIgXAorCWxpYmhhcmR3YXJlIFwKKwlsaWJyYWRpb19tZXRhZGF0YQorCisjTE9DQUxfQ19JTkNMVURFUyArPSBcCisJc3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlIFwKKwlzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZQorCitMT0NBTF9NT0RVTEU6PSBsaWJyYWRpbworCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9yYWRpby9JUmFkaW8uY3BwIGIvcmFkaW8vSVJhZGlvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDJkZjc3Ci0tLSAvZGV2L251bGwKKysrIGIvcmFkaW8vSVJhZGlvLmNwcApAQCAtMCwwICsxLDM0NCBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2RlZmluZSBMT0dfVEFHICJJUmFkaW8iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxyYWRpby9JUmFkaW8uaD4KKyNpbmNsdWRlIDxyYWRpby9JUmFkaW9TZXJ2aWNlLmg+CisjaW5jbHVkZSA8cmFkaW8vSVJhZGlvQ2xpZW50Lmg+CisjaW5jbHVkZSA8c3lzdGVtL3JhZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL3JhZGlvX21ldGFkYXRhLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSB7CisgICAgREVUQUNIID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKKyAgICBTRVRfQ09ORklHVVJBVElPTiwKKyAgICBHRVRfQ09ORklHVVJBVElPTiwKKyAgICBTRVRfTVVURSwKKyAgICBHRVRfTVVURSwKKyAgICBTQ0FOLAorICAgIFNURVAsCisgICAgVFVORSwKKyAgICBDQU5DRUwsCisgICAgR0VUX1BST0dSQU1fSU5GT1JNQVRJT04sCisgICAgSEFTX0NPTlRST0wKK307CisKK2NsYXNzIEJwUmFkaW86IHB1YmxpYyBCcEludGVyZmFjZTxJUmFkaW8+Cit7CitwdWJsaWM6CisgICAgQnBSYWRpbyhjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKKyAgICAgICAgOiBCcEludGVyZmFjZTxJUmFkaW8+KGltcGwpCisgICAgeworICAgIH0KKworICAgIHZvaWQgZGV0YWNoKCkKKyAgICB7CisgICAgICAgIEFMT0dWKCJkZXRhY2giKTsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoREVUQUNILCBkYXRhLCAmcmVwbHkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q29uZmlndXJhdGlvbihjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZykKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoY29uZmlnLCBzaXplb2Yoc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQ09ORklHVVJBVElPTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDb25maWd1cmF0aW9uKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9DT05GSUdVUkFUSU9OLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHkucmVhZChjb25maWcsIHNpemVvZihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TXV0ZShib29sIG11dGUpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihtdXRlID8gMSA6IDApOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX01VVEUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TXV0ZShib29sICptdXRlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBpZiAobXV0ZSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTVVURSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGludCBtdXRlcmVhZCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgICAgICptdXRlID0gbXV0ZXJlYWQgIT0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihkaXJlY3Rpb24pOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc2tpcFN1YkNoYW5uZWwgPyAxIDogMCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTQ0FOLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJDaGFubmVsKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoZGlyZWN0aW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHNraXBTdWJDaGFubmVsID8gMSA6IDApOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU1RFUCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCB0dW5lKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3ViQ2hhbm5lbCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGNoYW5uZWwpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc3ViQ2hhbm5lbCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChUVU5FLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNhbmNlbCgpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmFkaW86OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChDQU5DRUwsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvZ3JhbUluZm9ybWF0aW9uKHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8gKmluZm8pCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGlmIChpbmZvID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgcmFkaW9fbWV0YWRhdGFfdCAqbWV0YWRhdGEgPSBpbmZvLT5tZXRhZGF0YTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpbzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QUk9HUkFNX0lORk9STUFUSU9OLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHkucmVhZChpbmZvLCBzaXplb2Yoc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbykpOworICAgICAgICAgICAgICAgIGluZm8tPm1ldGFkYXRhID0gbWV0YWRhdGE7CisgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUgPSAoc2l6ZV90KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWV0YWRhdGEgPQorICAgICAgICAgICAgICAgICAgICAocmFkaW9fbWV0YWRhdGFfdCAqKWNhbGxvYyhzaXplIC8gc2l6ZW9mKHVuc2lnbmVkIGludCksIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKyAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBseS5yZWFkKG1ldGFkYXRhLCBzaXplKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSByYWRpb19tZXRhZGF0YV9hZGRfbWV0YWRhdGEoJmluZm8tPm1ldGFkYXRhLCBtZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgZnJlZShtZXRhZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGhhc0NvbnRyb2woYm9vbCAqaGFzQ29udHJvbCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgaWYgKGhhc0NvbnRyb2wgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoSEFTX0NPTlRST0wsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAqaGFzQ29udHJvbCA9IHJlcGx5LnJlYWRJbnQzMigpICE9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9Cit9OworCitJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoUmFkaW8sICJhbmRyb2lkLmhhcmR3YXJlLklSYWRpbyIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEJuUmFkaW86Om9uVHJhbnNhY3QoCisgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykKK3sKKyAgICBzd2l0Y2goY29kZSkgeworICAgICAgICBjYXNlIERFVEFDSDogeworICAgICAgICAgICAgQUxPR1YoIkRFVEFDSCIpOworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgZGV0YWNoKCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgU0VUX0NPTkZJR1VSQVRJT046IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyBjb25maWc7CisgICAgICAgICAgICBkYXRhLnJlYWQoJmNvbmZpZywgc2l6ZW9mKHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZykpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0Q29uZmlndXJhdGlvbigmY29uZmlnKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBHRVRfQ09ORklHVVJBVElPTjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnIGNvbmZpZzsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldENvbmZpZ3VyYXRpb24oJmNvbmZpZyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmY29uZmlnLCBzaXplb2Yoc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTRVRfTVVURTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYm9vbCBtdXRlID0gZGF0YS5yZWFkSW50MzIoKSAhPSAwOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0TXV0ZShtdXRlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBHRVRfTVVURTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYm9vbCBtdXRlOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0TXV0ZSgmbXV0ZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG11dGUgPyAxIDogMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTQ0FOOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSAocmFkaW9fZGlyZWN0aW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGJvb2wgc2tpcFN1YkNoYW5uZWwgPSBkYXRhLnJlYWRJbnQzMigpID09IDE7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzY2FuKGRpcmVjdGlvbiwgc2tpcFN1YkNoYW5uZWwpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNURVA6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW8sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IChyYWRpb19kaXJlY3Rpb25fdClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYm9vbCBza2lwU3ViQ2hhbm5lbCA9IGRhdGEucmVhZEludDMyKCkgPT0gMTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0ZXAoZGlyZWN0aW9uLCBza2lwU3ViQ2hhbm5lbCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgVFVORTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWwgPSAodW5zaWduZWQgaW50KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3ViQ2hhbm5lbCA9ICh1bnNpZ25lZCBpbnQpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHR1bmUoY2hhbm5lbCwgc3ViQ2hhbm5lbCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgQ0FOQ0VMOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVJhZGlvLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjYW5jZWwoKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBHRVRfUFJPR1JBTV9JTkZPUk1BVElPTjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RydWN0IHJhZGlvX3Byb2dyYW1faW5mbyBpbmZvOworCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByYWRpb19tZXRhZGF0YV9hbGxvY2F0ZSgmaW5mby5tZXRhZGF0YSwgMCwgMCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IGdldFByb2dyYW1JbmZvcm1hdGlvbigmaW5mbyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmaW5mbywgc2l6ZW9mKHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8pKTsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSByYWRpb19tZXRhZGF0YV9nZXRfY291bnQoaW5mby5tZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IHJhZGlvX21ldGFkYXRhX2dldF9zaXplKGluZm8ubWV0YWRhdGEpOworICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKGluZm8ubWV0YWRhdGEsIHNpemUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJhZGlvX21ldGFkYXRhX2RlYWxsb2NhdGUoaW5mby5tZXRhZGF0YSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIQVNfQ09OVFJPTDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpbywgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYm9vbCBjb250cm9sOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaGFzQ29udHJvbCgmY29udHJvbCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGNvbnRyb2wgPyAxIDogMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9yYWRpby9JUmFkaW9DbGllbnQuY3BwIGIvcmFkaW8vSVJhZGlvQ2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzNjYTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcmFkaW8vSVJhZGlvQ2xpZW50LmNwcApAQCAtMCwwICsxLDc1IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPHJhZGlvL0lSYWRpb0NsaWVudC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0geworICAgIE9OX0VWRU5UID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKK307CisKK2NsYXNzIEJwUmFkaW9DbGllbnQ6IHB1YmxpYyBCcEludGVyZmFjZTxJUmFkaW9DbGllbnQ+Cit7CisKK3B1YmxpYzoKKyAgICBCcFJhZGlvQ2xpZW50KGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQorICAgICAgICA6IEJwSW50ZXJmYWNlPElSYWRpb0NsaWVudD4oaW1wbCkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJhZGlvQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGV2ZW50TWVtb3J5KSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPTl9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOworICAgIH0KK307CisKK0lNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShSYWRpb0NsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5JUmFkaW9DbGllbnQiKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0dXNfdCBCblJhZGlvQ2xpZW50OjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCit7CisgICAgc3dpdGNoKGNvZGUpIHsKKyAgICAgICAgY2FzZSBPTl9FVkVOVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSYWRpb0NsaWVudCwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnkgPSBpbnRlcmZhY2VfY2FzdDxJTWVtb3J5PigKKyAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CisgICAgICAgICAgICBvbkV2ZW50KGV2ZW50TWVtb3J5KTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgfSAgIHJldHVybiBOT19FUlJPUjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvcmFkaW8vSVJhZGlvU2VydmljZS5jcHAgYi9yYWRpby9JUmFkaW9TZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzJiM2VmCi0tLSAvZGV2L251bGwKKysrIGIvcmFkaW8vSVJhZGlvU2VydmljZS5jcHAKQEAgLTAsMCArMSwxODEgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTUsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnBSYWRpb1NlcnZpY2UiCisvLworI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorCisjaW5jbHVkZSA8cmFkaW8vSVJhZGlvU2VydmljZS5oPgorI2luY2x1ZGUgPHJhZGlvL0lSYWRpby5oPgorI2luY2x1ZGUgPHJhZGlvL0lSYWRpb0NsaWVudC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2VudW0geworICAgIExJU1RfTU9EVUxFUyA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCisgICAgQVRUQUNILAorfTsKKworI2RlZmluZSBNQVhfSVRFTVNfUEVSX0xJU1QgMTAyNAorCitjbGFzcyBCcFJhZGlvU2VydmljZTogcHVibGljIEJwSW50ZXJmYWNlPElSYWRpb1NlcnZpY2U+Cit7CitwdWJsaWM6CisgICAgQnBSYWRpb1NlcnZpY2UoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCisgICAgICAgIDogQnBJbnRlcmZhY2U8SVJhZGlvU2VydmljZT4oaW1wbCkKKyAgICB7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKQorICAgIHsKKyAgICAgICAgaWYgKG51bU1vZHVsZXMgPT0gTlVMTCB8fCAoKm51bU1vZHVsZXMgIT0gMCAmJiBwcm9wZXJ0aWVzID09IE5VTEwpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpb1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHVuc2lnbmVkIGludCBudW1Nb2R1bGVzUmVxID0gKHByb3BlcnRpZXMgPT0gTlVMTCkgPyAwIDogKm51bU1vZHVsZXM7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihudW1Nb2R1bGVzUmVxKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KExJU1RfTU9EVUxFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgKm51bU1vZHVsZXMgPSAodW5zaWduZWQgaW50KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJsaXN0TW9kdWxlcygpIHN0YXR1cyAlZCBnb3QgKm51bU1vZHVsZXMgJWQiLCBzdGF0dXMsICpudW1Nb2R1bGVzKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgaWYgKG51bU1vZHVsZXNSZXEgPiAqbnVtTW9kdWxlcykgeworICAgICAgICAgICAgICAgIG51bU1vZHVsZXNSZXEgPSAqbnVtTW9kdWxlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW1Nb2R1bGVzUmVxID4gMCkgeworICAgICAgICAgICAgICAgIHJlcGx5LnJlYWQocHJvcGVydGllcywgbnVtTW9kdWxlc1JlcSAqIHNpemVvZihzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBhdHRhY2gocmFkaW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdpdGhBdWRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJUmFkaW8+JiByYWRpbykKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSYWRpb1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihoYW5kbGUpOworICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCkpOworICAgICAgICBBTE9HVigiYXR0YWNoKCkgY29uZmlnICVwIHdpdGhBdWRpbyAlZCByZWdpb24gJWQgdHlwZSAlZCIsIGNvbmZpZywgd2l0aEF1ZGlvLCBjb25maWctPnJlZ2lvbiwgY29uZmlnLT5iYW5kLnR5cGUpOworICAgICAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigxKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGUoY29uZmlnLCBzaXplb2Yoc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnKSk7CisgICAgICAgIH0KKyAgICAgICAgZGF0YS53cml0ZUludDMyKHdpdGhBdWRpbyA/IDEgOiAwKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEFUVEFDSCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKHJlcGx5LnJlYWRJbnQzMigpICE9IDApIHsKKyAgICAgICAgICAgIHJhZGlvID0gaW50ZXJmYWNlX2Nhc3Q8SVJhZGlvPihyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorfTsKKworSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFJhZGlvU2VydmljZSwgImFuZHJvaWQuaGFyZHdhcmUuSVJhZGlvU2VydmljZSIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEJuUmFkaW9TZXJ2aWNlOjpvblRyYW5zYWN0KAorICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpCit7CisgICAgc3dpdGNoKGNvZGUpIHsKKyAgICAgICAgY2FzZSBMSVNUX01PRFVMRVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW9TZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTW9kdWxlc1JlcSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpZiAobnVtTW9kdWxlc1JlcSA+IE1BWF9JVEVNU19QRVJfTElTVCkgeworICAgICAgICAgICAgICAgIG51bU1vZHVsZXNSZXEgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTW9kdWxlcyA9IG51bU1vZHVsZXNSZXE7CisgICAgICAgICAgICBzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcyA9CisgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqKWNhbGxvYyhudW1Nb2R1bGVzUmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzKSk7CisgICAgICAgICAgICBpZiAocHJvcGVydGllcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoTk9fTUVNT1JZKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxpc3RNb2R1bGVzKHByb3BlcnRpZXMsICZudW1Nb2R1bGVzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihudW1Nb2R1bGVzKTsKKyAgICAgICAgICAgIEFMT0dWKCJMSVNUX01PRFVMRVMgc3RhdHVzICVkIGdvdCBudW1Nb2R1bGVzICVkIiwgc3RhdHVzLCBudW1Nb2R1bGVzKTsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGlmIChudW1Nb2R1bGVzUmVxID4gbnVtTW9kdWxlcykgeworICAgICAgICAgICAgICAgICAgICBudW1Nb2R1bGVzUmVxID0gbnVtTW9kdWxlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlKHByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bU1vZHVsZXNSZXEgKiBzaXplb2Yoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUocHJvcGVydGllcyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBBVFRBQ0g6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmFkaW9TZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByYWRpb19oYW5kbGVfdCBoYW5kbGUgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc3A8SVJhZGlvQ2xpZW50PiBjbGllbnQgPQorICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJUmFkaW9DbGllbnQ+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyBjb25maWc7CisgICAgICAgICAgICBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZ1B0ciA9IE5VTEw7CisgICAgICAgICAgICBpZiAoZGF0YS5yZWFkSW50MzIoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZGF0YS5yZWFkKCZjb25maWcsIHNpemVvZihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcpKTsKKyAgICAgICAgICAgICAgICBjb25maWdQdHIgPSAmY29uZmlnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8gPSBkYXRhLnJlYWRJbnQzMigpICE9IDA7CisgICAgICAgICAgICBBTE9HVigiQVRUQUNIIGNvbmZpZ1B0ciAlcCB3aXRoQXVkaW8gJWQiLCBjb25maWdQdHIsIHdpdGhBdWRpbyk7CisgICAgICAgICAgICBzcDxJUmFkaW8+IHJhZGlvOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXR0YWNoKGhhbmRsZSwgY2xpZW50LCBjb25maWdQdHIsIHdpdGhBdWRpbywgcmFkaW8pOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChyYWRpbyAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKHJhZGlvKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKKyAgICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3JhZGlvL1JhZGlvLmNwcCBiL3JhZGlvL1JhZGlvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzA0ZmIwCi0tLSAvZGV2L251bGwKKysrIGIvcmFkaW8vUmFkaW8uY3BwCkBAIC0wLDAgKzEsMjgzIEBACisvKgorKioKKyoqIENvcHlyaWdodCAoQykgMjAxNSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2RlZmluZSBMT0dfVEFHICJSYWRpbyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKworI2luY2x1ZGUgPHJhZGlvL1JhZGlvLmg+CisjaW5jbHVkZSA8cmFkaW8vSVJhZGlvLmg+CisjaW5jbHVkZSA8cmFkaW8vSVJhZGlvU2VydmljZS5oPgorI2luY2x1ZGUgPHJhZGlvL0lSYWRpb0NsaWVudC5oPgorI2luY2x1ZGUgPHJhZGlvL1JhZGlvQ2FsbGJhY2suaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworICAgIHNwPElSYWRpb1NlcnZpY2U+ICAgICAgICAgIGdSYWRpb1NlcnZpY2U7CisgICAgY29uc3QgaW50ICAgICAgICAgICAgICAgICAga1JhZGlvU2VydmljZVBvbGxEZWxheSA9IDUwMDAwMDsgLy8gMC41cworICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgIGtSYWRpb1NlcnZpY2VOYW1lICAgICAgPSAibWVkaWEucmFkaW8iOworICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgIGdMb2NrOworCisgICAgY2xhc3MgRGVhdGhOb3RpZmllciA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIERlYXRoTm90aWZpZXIoKSB7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvIF9fdW51c2VkKSB7CisgICAgICAgICAgICBBTE9HVigiYmluZGVyRGllZCIpOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKKyAgICAgICAgICAgIGdSYWRpb1NlcnZpY2UuY2xlYXIoKTsKKyAgICAgICAgICAgIEFMT0dXKCJSYWRpbyBzZXJ2aWNlIGRpZWQhIik7CisgICAgICAgIH0KKyAgICB9OworCisgICAgc3A8RGVhdGhOb3RpZmllcj4gICAgICAgICBnRGVhdGhOb3RpZmllcjsKK307IC8vIG5hbWVzcGFjZSBhbm9ueW1vdXMKKworY29uc3Qgc3A8SVJhZGlvU2VydmljZT4gUmFkaW86OmdldFJhZGlvU2VydmljZSgpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrKTsKKyAgICBpZiAoZ1JhZGlvU2VydmljZS5nZXQoKSA9PSAwKSB7CisgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyOworICAgICAgICBkbyB7CisgICAgICAgICAgICBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNihrUmFkaW9TZXJ2aWNlTmFtZSkpOworICAgICAgICAgICAgaWYgKGJpbmRlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVygiUmFkaW9TZXJ2aWNlIG5vdCBwdWJsaXNoZWQsIHdhaXRpbmcuLi4iKTsKKyAgICAgICAgICAgIHVzbGVlcChrUmFkaW9TZXJ2aWNlUG9sbERlbGF5KTsKKyAgICAgICAgfSB3aGlsZSh0cnVlKTsKKyAgICAgICAgaWYgKGdEZWF0aE5vdGlmaWVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGdEZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIoKTsKKyAgICAgICAgfQorICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKGdEZWF0aE5vdGlmaWVyKTsKKyAgICAgICAgZ1JhZGlvU2VydmljZSA9IGludGVyZmFjZV9jYXN0PElSYWRpb1NlcnZpY2U+KGJpbmRlcik7CisgICAgfQorICAgIEFMT0dFX0lGKGdSYWRpb1NlcnZpY2UgPT0gMCwgIm5vIFJhZGlvU2VydmljZSE/Iik7CisgICAgcmV0dXJuIGdSYWRpb1NlcnZpY2U7Cit9CisKKy8vIFN0YXRpYyBtZXRob2RzCitzdGF0dXNfdCBSYWRpbzo6bGlzdE1vZHVsZXMoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpCit7CisgICAgQUxPR1YoImxpc3RNb2R1bGVzKCkiKTsKKyAgICBjb25zdCBzcDxJUmFkaW9TZXJ2aWNlPiBzZXJ2aWNlID0gZ2V0UmFkaW9TZXJ2aWNlKCk7CisgICAgaWYgKHNlcnZpY2UgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIHNlcnZpY2UtPmxpc3RNb2R1bGVzKHByb3BlcnRpZXMsIG51bU1vZHVsZXMpOworfQorCitzcDxSYWRpbz4gUmFkaW86OmF0dGFjaChyYWRpb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2l0aEF1ZGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8UmFkaW9DYWxsYmFjaz4mIGNhbGxiYWNrKQoreworICAgIEFMT0dWKCJhdHRhY2goKSIpOworICAgIHNwPFJhZGlvPiByYWRpbzsKKyAgICBjb25zdCBzcDxJUmFkaW9TZXJ2aWNlPiBzZXJ2aWNlID0gZ2V0UmFkaW9TZXJ2aWNlKCk7CisgICAgaWYgKHNlcnZpY2UgPT0gMCkgeworICAgICAgICByZXR1cm4gcmFkaW87CisgICAgfQorICAgIHJhZGlvID0gbmV3IFJhZGlvKGhhbmRsZSwgY2FsbGJhY2spOworICAgIHN0YXR1c190IHN0YXR1cyA9IHNlcnZpY2UtPmF0dGFjaChoYW5kbGUsIHJhZGlvLCBjb25maWcsIHdpdGhBdWRpbywgcmFkaW8tPm1JUmFkaW8pOworCisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiByYWRpby0+bUlSYWRpbyAhPSAwKSB7CisgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKHJhZGlvLT5tSVJhZGlvKS0+bGlua1RvRGVhdGgocmFkaW8pOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCJFcnJvciAlZCBjb25uZWN0aW5nIHRvIHJhZGlvIHNlcnZpY2UiLCBzdGF0dXMpOworICAgICAgICByYWRpby5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gcmFkaW87Cit9CisKKworCisvLyBSYWRpbworUmFkaW86OlJhZGlvKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwgY29uc3Qgc3A8UmFkaW9DYWxsYmFjaz4mIGNhbGxiYWNrKQorICAgIDogbUhhbmRsZShoYW5kbGUpLCBtQ2FsbGJhY2soY2FsbGJhY2spCit7Cit9CisKK1JhZGlvOjp+UmFkaW8oKQoreworICAgIGlmIChtSVJhZGlvICE9IDApIHsKKyAgICAgICAgbUlSYWRpby0+ZGV0YWNoKCk7CisgICAgfQorfQorCisKK3ZvaWQgUmFkaW86OmRldGFjaCgpIHsKKyAgICBBTE9HVigiZGV0YWNoKCkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1DYWxsYmFjay5jbGVhcigpOworICAgIGlmIChtSVJhZGlvICE9IDApIHsKKyAgICAgICAgbUlSYWRpby0+ZGV0YWNoKCk7CisgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1JUmFkaW8pLT51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgICAgICBtSVJhZGlvID0gMDsKKyAgICB9Cit9CisKK3N0YXR1c190IFJhZGlvOjpzZXRDb25maWd1cmF0aW9uKGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1JUmFkaW8gPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1JUmFkaW8tPnNldENvbmZpZ3VyYXRpb24oY29uZmlnKTsKK30KKworc3RhdHVzX3QgUmFkaW86OmdldENvbmZpZ3VyYXRpb24oc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUlSYWRpbyA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUlSYWRpby0+Z2V0Q29uZmlndXJhdGlvbihjb25maWcpOworfQorCitzdGF0dXNfdCBSYWRpbzo6c2V0TXV0ZShib29sIG11dGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUlSYWRpbyA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUlSYWRpby0+c2V0TXV0ZShtdXRlKTsKK30KKworc3RhdHVzX3QgUmFkaW86OmdldE11dGUoYm9vbCAqbXV0ZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtSVJhZGlvID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtSVJhZGlvLT5nZXRNdXRlKG11dGUpOworfQorCitzdGF0dXNfdCBSYWRpbzo6c2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YmNoYW5uZWwpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUlSYWRpbyA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbUlSYWRpby0+c2NhbihkaXJlY3Rpb24sIHNraXBTdWJjaGFubmVsKTsKK30KKworc3RhdHVzX3QgUmFkaW86OnN0ZXAocmFkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLCBib29sIHNraXBTdWJjaGFubmVsKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1JUmFkaW8gPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1JUmFkaW8tPnN0ZXAoZGlyZWN0aW9uLCBza2lwU3ViY2hhbm5lbCk7Cit9CisKK3N0YXR1c190IFJhZGlvOjp0dW5lKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3ViQ2hhbm5lbCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtSVJhZGlvID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtSVJhZGlvLT50dW5lKGNoYW5uZWwsIHN1YkNoYW5uZWwpOworfQorCitzdGF0dXNfdCBSYWRpbzo6Y2FuY2VsKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtSVJhZGlvID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtSVJhZGlvLT5jYW5jZWwoKTsKK30KKworc3RhdHVzX3QgUmFkaW86OmdldFByb2dyYW1JbmZvcm1hdGlvbihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvICppbmZvKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1JUmFkaW8gPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1JUmFkaW8tPmdldFByb2dyYW1JbmZvcm1hdGlvbihpbmZvKTsKK30KKworc3RhdHVzX3QgUmFkaW86Omhhc0NvbnRyb2woYm9vbCAqaGFzQ29udHJvbCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtSVJhZGlvID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtSVJhZGlvLT5oYXNDb250cm9sKGhhc0NvbnRyb2wpOworfQorCisKKy8vIEJwUmFkaW9DbGllbnQKK3ZvaWQgUmFkaW86Om9uRXZlbnQoY29uc3Qgc3A8SU1lbW9yeT4mIGV2ZW50TWVtb3J5KQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKGV2ZW50TWVtb3J5ID09IDAgfHwgZXZlbnRNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdHJ1Y3QgcmFkaW9fZXZlbnQgKmV2ZW50ID0gKHN0cnVjdCByYWRpb19ldmVudCAqKWV2ZW50TWVtb3J5LT5wb2ludGVyKCk7CisgICAgLy8gcmVzdG9yZSBsb2NhbCBtZXRhZGF0YSBwb2ludGVyIGZyb20gb2Zmc2V0CisgICAgc3dpdGNoIChldmVudC0+dHlwZSkgeworICAgIGNhc2UgUkFESU9fRVZFTlRfVFVORUQ6CisgICAgY2FzZSBSQURJT19FVkVOVF9BRl9TV0lUQ0g6CisgICAgICAgIGlmIChldmVudC0+aW5mby5tZXRhZGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICBldmVudC0+aW5mby5tZXRhZGF0YSA9CisgICAgICAgICAgICAgICAgICAgIChyYWRpb19tZXRhZGF0YV90ICopKChjaGFyICopZXZlbnQgKyAoc2l6ZV90KWV2ZW50LT5pbmZvLm1ldGFkYXRhKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFJBRElPX0VWRU5UX01FVEFEQVRBOgorICAgICAgICBpZiAoZXZlbnQtPm1ldGFkYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGV2ZW50LT5tZXRhZGF0YSA9CisgICAgICAgICAgICAgICAgICAgIChyYWRpb19tZXRhZGF0YV90ICopKChjaGFyICopZXZlbnQgKyAoc2l6ZV90KWV2ZW50LT5tZXRhZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKG1DYWxsYmFjayAhPSAwKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25FdmVudChldmVudCk7CisgICAgfQorfQorCisKKy8vSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKK3ZvaWQgUmFkaW86OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQUxPR1coIlJhZGlvIHNlcnZlciBiaW5kZXIgRGllZCAiKTsKKyAgICBtSVJhZGlvID0gMDsKKyAgICBzdHJ1Y3QgcmFkaW9fZXZlbnQgZXZlbnQ7CisgICAgbWVtc2V0KCZldmVudCwgMCwgc2l6ZW9mKHN0cnVjdCByYWRpb19ldmVudCkpOworICAgIGV2ZW50LnR5cGUgPSBSQURJT19FVkVOVF9TRVJWRVJfRElFRDsKKyAgICBldmVudC5zdGF0dXMgPSBERUFEX09CSkVDVDsKKyAgICBpZiAobUNhbGxiYWNrICE9IDApIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vbkV2ZW50KCZldmVudCk7CisgICAgfQorfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tawppbmRleCA0NGQyNTUzLi5kZWJjZGY5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tawpAQCAtMjksMjkgKzI5LDI4IEBACiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCi0jIENsYW5nKysgYWJvcnRzIG9uIEF1ZGlvTWl4ZXIuY3BwLAotIyBiLzE4MzczODY2LCAiZG8gbm90IGtub3cgaG93IHRvIHNwbGl0IHRoaXMgb3BlcmF0b3IuIgotaWZlcSAoJChmaWx0ZXIgJChUQVJHRVRfQVJDSCksYXJtIGFybTY0KSwkKFRBUkdFVF9BUkNIKSkKLSAgICBMT0NBTF9DTEFORyA6PSBmYWxzZQotZW5kaWYKLQogTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICBcCiAgICAgQXVkaW9GbGluZ2VyLmNwcCAgICAgICAgICAgIFwKICAgICBUaHJlYWRzLmNwcCAgICAgICAgICAgICAgICAgXAogICAgIFRyYWNrcy5jcHAgICAgICAgICAgICAgICAgICBcCisgICAgQXVkaW9Id0RldmljZS5jcHAgICAgICAgICAgIFwKKyAgICBBdWRpb1N0cmVhbU91dC5jcHAgICAgICAgICAgXAorICAgIFNwZGlmU3RyZWFtT3V0LmNwcCAgICAgICAgICBcCiAgICAgRWZmZWN0cy5jcHAgICAgICAgICAgICAgICAgIFwKICAgICBBdWRpb01peGVyLmNwcC5hcm0gICAgICAgICAgXAotICAgIFBhdGNoUGFuZWwuY3BwCi0KLUxPQ0FMX1NSQ19GSUxFUyArPSBTdGF0ZVF1ZXVlLmNwcAorICAgIEJ1ZmZlclByb3ZpZGVycy5jcHAgICAgICAgICBcCisgICAgUGF0Y2hQYW5lbC5jcHAgICAgICAgICAgICAgIFwKKyAgICBTdGF0ZVF1ZXVlLmNwcAogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKICAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IFwKKyAgICAkKFRPUERJUilleHRlcm5hbC9zb25pYyBcCiAgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKICAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYmF1ZGlvcmVzYW1wbGVyIFwKKyAgICBsaWJhdWRpb3NwZGlmIFwKICAgICBsaWJhdWRpb3V0aWxzIFwKICAgICBsaWJjb21tb25fdGltZV9jbGllbnQgXAogICAgIGxpYmN1dGlscyBcCkBAIC02NCw3ICs2Myw4IEBACiAgICAgbGliaGFyZHdhcmVfbGVnYWN5IFwKICAgICBsaWJlZmZlY3RzIFwKICAgICBsaWJwb3dlcm1hbmFnZXIgXAotICAgIGxpYnNlcnZpY2V1dGlsaXR5CisgICAgbGlic2VydmljZXV0aWxpdHkgXAorICAgIGxpYnNvbmljCiAKIExPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAogICAgIGxpYnNjaGVkdWxpbmdfcG9saWN5IFwKQEAgLTc0LDkgKzc0LDE3IEBACiBMT0NBTF9NT0RVTEU6PSBsaWJhdWRpb2ZsaW5nZXIKIExPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKIAotTE9DQUxfU1JDX0ZJTEVTICs9IEZhc3RNaXhlci5jcHAgRmFzdE1peGVyU3RhdGUuY3BwIEF1ZGlvV2F0Y2hkb2cuY3BwCi1MT0NBTF9TUkNfRklMRVMgKz0gRmFzdFRocmVhZC5jcHAgRmFzdFRocmVhZFN0YXRlLmNwcAotTE9DQUxfU1JDX0ZJTEVTICs9IEZhc3RDYXB0dXJlLmNwcCBGYXN0Q2FwdHVyZVN0YXRlLmNwcAorTE9DQUxfU1JDX0ZJTEVTICs9IFwKKyAgICBBdWRpb1dhdGNoZG9nLmNwcCAgICAgICAgXAorICAgIEZhc3RDYXB0dXJlLmNwcCAgICAgICAgICBcCisgICAgRmFzdENhcHR1cmVEdW1wU3RhdGUuY3BwIFwKKyAgICBGYXN0Q2FwdHVyZVN0YXRlLmNwcCAgICAgXAorICAgIEZhc3RNaXhlci5jcHAgICAgICAgICAgICBcCisgICAgRmFzdE1peGVyRHVtcFN0YXRlLmNwcCAgIFwKKyAgICBGYXN0TWl4ZXJTdGF0ZS5jcHAgICAgICAgXAorICAgIEZhc3RUaHJlYWQuY3BwICAgICAgICAgICBcCisgICAgRmFzdFRocmVhZER1bXBTdGF0ZS5jcHAgIFwKKyAgICBGYXN0VGhyZWFkU3RhdGUuY3BwCiAKIExPQ0FMX0NGTEFHUyArPSAtRFNUQVRFX1FVRVVFX0lOU1RBTlRJQVRJT05TPSciU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLmNwcCInCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKaW5kZXggMThiYTFhZS4uOWVjNTgwMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKQEAgLTQ1LDYgKzQ1LDggQEAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKICNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgorCiAjaW5jbHVkZSA8bWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaD4KICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF92aXN1YWxpemVyLmg+CiAjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfbnMuaD4KQEAgLTE3OSwxMyArMTgxLDE0IEBACiAgICAgICBtSXNMb3dSYW1EZXZpY2UodHJ1ZSksCiAgICAgICBtSXNEZXZpY2VUeXBlS25vd24oZmFsc2UpLAogICAgICAgbUdsb2JhbEVmZmVjdEVuYWJsZVRpbWUoMCksCi0gICAgICBtUHJpbWFyeU91dHB1dFNhbXBsZVJhdGUoMCkKKyAgICAgIG1TeXN0ZW1SZWFkeShmYWxzZSkKIHsKICAgICBnZXRwaWRfY2FjaGVkID0gZ2V0cGlkKCk7CiAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgIGJvb2wgZG9Mb2cgPSAocHJvcGVydHlfZ2V0KCJyby50ZXN0X2hhcm5lc3MiLCB2YWx1ZSwgIjAiKSA+IDApICYmIChhdG9pKHZhbHVlKSA9PSAxKTsKICAgICBpZiAoZG9Mb2cpIHsKLSAgICAgICAgbUxvZ01lbW9yeURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIoa0xvZ01lbW9yeVNpemUsICJMb2dXcml0ZXJzIiwgTWVtb3J5SGVhcEJhc2U6OlJFQURfT05MWSk7CisgICAgICAgIG1Mb2dNZW1vcnlEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKGtMb2dNZW1vcnlTaXplLCAiTG9nV3JpdGVycyIsCisgICAgICAgICAgICAgICAgTWVtb3J5SGVhcEJhc2U6OlJFQURfT05MWSk7CiAgICAgfQogCiAjaWZkZWYgVEVFX1NJTksKQEAgLTI3MSw3ICsyNzQsNyBAQAogfTsKICNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKCh4KSkvc2l6ZW9mKCgoeClbMF0pKSkKIAotQXVkaW9GbGluZ2VyOjpBdWRpb0h3RGV2aWNlKiBBdWRpb0ZsaW5nZXI6OmZpbmRTdWl0YWJsZUh3RGV2X2woCitBdWRpb0h3RGV2aWNlKiBBdWRpb0ZsaW5nZXI6OmZpbmRTdWl0YWJsZUh3RGV2X2woCiAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCiAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQogewpAQCAtNDAxLDYgKzQwNCw5IEBACiAgICAgICAgICAgICBTdHJpbmc4IHJlc3VsdChrQ2xpZW50TG9ja2VkU3RyaW5nKTsKICAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgICAgICB9CisKKyAgICAgICAgRWZmZWN0RHVtcEVmZmVjdHMoZmQpOworCiAgICAgICAgIGR1bXBDbGllbnRzKGZkLCBhcmdzKTsKICAgICAgICAgaWYgKGNsaWVudExvY2tlZCkgewogICAgICAgICAgICAgbUNsaWVudExvY2sudW5sb2NrKCk7CkBAIC04MjYsMTQgKzgzMiwyMCBAQAogICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLQorICAgIGJvb2wgbXV0ZSA9IHRydWU7CiAgICAgYm9vbCBzdGF0ZSA9IEFVRElPX01PREVfSU5WQUxJRDsKICAgICBBdXRvTXV0ZXggbG9jayhtSGFyZHdhcmVMb2NrKTsKLSAgICBhdWRpb19od19kZXZpY2VfdCAqZGV2ID0gbVByaW1hcnlIYXJkd2FyZURldi0+aHdEZXZpY2UoKTsKICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19HRVRfTUlDX01VVEU7Ci0gICAgZGV2LT5nZXRfbWljX211dGUoZGV2LCAmc3RhdGUpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvSHdEZXZzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpkZXYgPSBtQXVkaW9Id0RldnMudmFsdWVBdChpKS0+aHdEZXZpY2UoKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZGV2LT5nZXRfbWljX211dGUoZGV2LCAmc3RhdGUpOworICAgICAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBtdXRlID0gbXV0ZSAmJiBzdGF0ZTsKKyAgICAgICAgfQorICAgIH0KICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOwotICAgIHJldHVybiBzdGF0ZTsKKworICAgIHJldHVybiBtdXRlOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldE1hc3Rlck11dGUoYm9vbCBtdXRlZCkKQEAgLTEwMDksNiArMTAyMSwxNCBAQAogICAgIHJldHVybiBzdHJlYW1NdXRlX2woc3RyZWFtKTsKIH0KIAorCit2b2lkIEF1ZGlvRmxpbmdlcjo6YnJvYWNhc3RQYXJhbWV0ZXJzVG9SZWNvcmRUaHJlYWRzX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1SZWNvcmRUaHJlYWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1SZWNvcmRUaHJlYWRzLnZhbHVlQXQoaSktPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7CisgICAgfQorfQorCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCiB7CiAgICAgQUxPR1YoInNldFBhcmFtZXRlcnMoKTogaW8gJWQsIGtleXZhbHVlICVzLCBjYWxsaW5nIHBpZCAlZCIsCkBAIC0xMDgzLDkgKzExMDMsNyBAQAogICAgICAgICAgICAgaW50IHZhbHVlOwogICAgICAgICAgICAgaWYgKChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIHZhbHVlKSA9PSBOT19FUlJPUikgJiYKICAgICAgICAgICAgICAgICAgICAgKHZhbHVlICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVjb3JkVGhyZWFkcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicm9hY2FzdFBhcmFtZXRlcnNUb1JlY29yZFRocmVhZHNfbChrZXlWYWx1ZVBhaXJzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTExMzgsMTkgKzExNTYsNDYgQEAKICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KKyAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpIHx8ICFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCiAgICAgQXV0b011dGV4IGxvY2sobUhhcmR3YXJlTG9jayk7CiAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfR0VUX0lOUFVUX0JVRkZFUl9TSVpFOwotICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZzsKLSAgICBtZW1zZXQoJmNvbmZpZywgMCwgc2l6ZW9mKGNvbmZpZykpOwotICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IHNhbXBsZVJhdGU7Ci0gICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOwotICAgIGNvbmZpZy5mb3JtYXQgPSBmb3JtYXQ7CisgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnLCBwcm9wb3NlZDsKKyAgICBtZW1zZXQoJnByb3Bvc2VkLCAwLCBzaXplb2YocHJvcG9zZWQpKTsKKyAgICBwcm9wb3NlZC5zYW1wbGVfcmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgcHJvcG9zZWQuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7CisgICAgcHJvcG9zZWQuZm9ybWF0ID0gZm9ybWF0OwogCiAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmRldiA9IG1QcmltYXJ5SGFyZHdhcmVEZXYtPmh3RGV2aWNlKCk7Ci0gICAgc2l6ZV90IHNpemUgPSBkZXYtPmdldF9pbnB1dF9idWZmZXJfc2l6ZShkZXYsICZjb25maWcpOworICAgIHNpemVfdCBmcmFtZXM7CisgICAgZm9yICg7OykgeworICAgICAgICAvLyBOb3RlOiBjb25maWcgaXMgY3VycmVudGx5IGEgY29uc3QgcGFyYW1ldGVyIGZvciBnZXRfaW5wdXRfYnVmZmVyX3NpemUoKQorICAgICAgICAvLyBidXQgd2UgdXNlIGEgY29weSBmcm9tIHByb3Bvc2VkIGluIGNhc2UgY29uZmlnIGNoYW5nZXMgZnJvbSB0aGUgY2FsbC4KKyAgICAgICAgY29uZmlnID0gcHJvcG9zZWQ7CisgICAgICAgIGZyYW1lcyA9IGRldi0+Z2V0X2lucHV0X2J1ZmZlcl9zaXplKGRldiwgJmNvbmZpZyk7CisgICAgICAgIGlmIChmcmFtZXMgIT0gMCkgeworICAgICAgICAgICAgYnJlYWs7IC8vIGhhbCBzdWNjZXNzLCBjb25maWcgaXMgdGhlIHJlc3VsdAorICAgICAgICB9CisgICAgICAgIC8vIGNoYW5nZSBvbmUgcGFyYW1ldGVyIG9mIHRoZSBjb25maWd1cmF0aW9uIGVhY2ggaXRlcmF0aW9uIHRvIGEgbW9yZSAiY29tbW9uIiB2YWx1ZQorICAgICAgICAvLyB0byBzZWUgaWYgdGhlIGRldmljZSB3aWxsIHN1cHBvcnQgaXQuCisgICAgICAgIGlmIChwcm9wb3NlZC5mb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKKyAgICAgICAgICAgIHByb3Bvc2VkLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICB9IGVsc2UgaWYgKHByb3Bvc2VkLnNhbXBsZV9yYXRlICE9IDQ0MTAwKSB7IC8vIDQ0LjEgaXMgY2xhaW1lZCBhcyBtdXN0IGluIENERCBhcyB3ZWxsIGFzCisgICAgICAgICAgICBwcm9wb3NlZC5zYW1wbGVfcmF0ZSA9IDQ0MTAwOyAgICAgICAgICAgLy8gbGVnYWN5IEF1ZGlvUmVjb3JkLmphdmEuIFRPRE86IFF1ZXJ5IGh3PworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coImdldElucHV0QnVmZmVyU2l6ZSBmYWlsZWQgd2l0aCBtaW5pbXVtIGJ1ZmZlciBzaXplIHNhbXBsZVJhdGUgJXUsICIKKyAgICAgICAgICAgICAgICAgICAgImZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrIDB4JVgiLAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgIGJyZWFrOyAvLyByZXRyaWVzIGZhaWxlZCwgYnJlYWsgb3V0IG9mIGxvb3Agd2l0aCBmcmFtZXMgPT0gMC4KKyAgICAgICAgfQorICAgIH0KICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOwotICAgIHJldHVybiBzaXplOworICAgIGlmIChmcmFtZXMgPiAwICYmIGNvbmZpZy5zYW1wbGVfcmF0ZSAhPSBzYW1wbGVSYXRlKSB7CisgICAgICAgIGZyYW1lcyA9IGRlc3RpbmF0aW9uRnJhbWVzUG9zc2libGUoZnJhbWVzLCBzYW1wbGVSYXRlLCBjb25maWcuc2FtcGxlX3JhdGUpOworICAgIH0KKyAgICByZXR1cm4gZnJhbWVzOyAvLyBtYXkgYmUgY29udmVydGVkIHRvIGJ5dGVzIGF0IHRoZSBKYXZhIGxldmVsLgogfQogCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OmdldElucHV0RnJhbWVzTG9zdChhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkgY29uc3QKQEAgLTEyMDYsMTEgKzEyNTEsOSBAQAogICAgIGlmIChjbGllbnQgPT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGJvb2wgY2xpZW50QWRkZWQgPSBmYWxzZTsKKyAgICBwaWRfdCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2NsKG1DbGllbnRMb2NrKTsKLQotICAgICAgICBwaWRfdCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHBpZCkgPCAwKSB7CiAgICAgICAgICAgICBzcDxOb3RpZmljYXRpb25DbGllbnQ+IG5vdGlmaWNhdGlvbkNsaWVudCA9IG5ldyBOb3RpZmljYXRpb25DbGllbnQodGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LApAQCAtMTIyMSwyMiArMTI2NCwxOSBAQAogCiAgICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihjbGllbnQpOwogICAgICAgICAgICAgYmluZGVyLT5saW5rVG9EZWF0aChub3RpZmljYXRpb25DbGllbnQpOwotICAgICAgICAgICAgY2xpZW50QWRkZWQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gbUNsaWVudExvY2sgc2hvdWxkIG5vdCBiZSBoZWxkIGhlcmUgYmVjYXVzZSBUaHJlYWRCYXNlOjpzZW5kSW9Db25maWdFdmVudCgpIHdpbGwgbG9jayB0aGUKICAgICAvLyBUaHJlYWRCYXNlIG11dGV4IGFuZCB0aGUgbG9ja2luZyBvcmRlciBpcyBUaHJlYWRCYXNlOjptTG9jayB0aGVuIEF1ZGlvRmxpbmdlcjo6bUNsaWVudExvY2suCi0gICAgaWYgKGNsaWVudEFkZGVkKSB7Ci0gICAgICAgIC8vIHRoZSBjb25maWcgY2hhbmdlIGlzIGFsd2F5cyBzZW50IGZyb20gcGxheWJhY2sgb3IgcmVjb3JkIHRocmVhZHMgdG8gYXZvaWQgZGVhZGxvY2sKLSAgICAgICAgLy8gd2l0aCBBdWRpb1N5c3RlbTo6Z0xvY2sKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPnNlbmRJb0NvbmZpZ0V2ZW50KEF1ZGlvU3lzdGVtOjpPVVRQVVRfT1BFTkVEKTsKLSAgICAgICAgfQorICAgIC8vIHRoZSBjb25maWcgY2hhbmdlIGlzIGFsd2F5cyBzZW50IGZyb20gcGxheWJhY2sgb3IgcmVjb3JkIHRocmVhZHMgdG8gYXZvaWQgZGVhZGxvY2sKKyAgICAvLyB3aXRoIEF1ZGlvU3lzdGVtOjpnTG9jaworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgeworICAgICAgICBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPnNlbmRJb0NvbmZpZ0V2ZW50KEFVRElPX09VVFBVVF9PUEVORUQsIHBpZCk7CisgICAgfQogCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVJlY29yZFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG1SZWNvcmRUaHJlYWRzLnZhbHVlQXQoaSktPnNlbmRJb0NvbmZpZ0V2ZW50KEF1ZGlvU3lzdGVtOjpJTlBVVF9PUEVORUQpOwotICAgICAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVjb3JkVGhyZWFkcy5zaXplKCk7IGkrKykgeworICAgICAgICBtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpLT5zZW5kSW9Db25maWdFdmVudChBVURJT19JTlBVVF9PUEVORUQsIHBpZCk7CiAgICAgfQogfQogCkBAIC0xMjY5LDE0ICsxMzA5LDE2IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6YXVkaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IHZvaWQgKnBhcmFtMikKK3ZvaWQgQXVkaW9GbGluZ2VyOjppb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4mIGlvRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2xpZW50TG9jayk7CiAgICAgc2l6ZV90IHNpemUgPSBtTm90aWZpY2F0aW9uQ2xpZW50cy5zaXplKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+YXVkaW9GbGluZ2VyQ2xpZW50KCktPmlvQ29uZmlnQ2hhbmdlZChldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0yKTsKKyAgICAgICAgaWYgKChwaWQgPT0gMCkgfHwgKG1Ob3RpZmljYXRpb25DbGllbnRzLmtleUF0KGkpID09IHBpZCkpIHsKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPmF1ZGlvRmxpbmdlckNsaWVudCgpLT5pb0NvbmZpZ0NoYW5nZWQoZXZlbnQsIGlvRGVzYyk7CisgICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTEzODUsOSArMTQyNywxMSBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgc2l6ZV90ICpmcmFtZUNvdW50LAogICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgcGlkX3QgdGlkLAorICAgICAgICBpbnQgY2xpZW50VWlkLAogICAgICAgICBpbnQgKnNlc3Npb25JZCwKICAgICAgICAgc2l6ZV90ICpub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgIHNwPElNZW1vcnk+JiBjYmxrLApAQCAtMTQwNCw3ICsxNDQ4LDcgQEAKICAgICBidWZmZXJzLmNsZWFyKCk7CiAKICAgICAvLyBjaGVjayBjYWxsaW5nIHBlcm1pc3Npb25zCi0gICAgaWYgKCFyZWNvcmRpbmdBbGxvd2VkKCkpIHsKKyAgICBpZiAoIXJlY29yZGluZ0FsbG93ZWQob3BQYWNrYWdlTmFtZSkpIHsKICAgICAgICAgQUxPR0UoIm9wZW5SZWNvcmQoKSBwZXJtaXNzaW9uIGRlbmllZDogcmVjb3JkaW5nIG5vdCBhbGxvd2VkIik7CiAgICAgICAgIGxTdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgZ290byBFeGl0OwpAQCAtMTQxNyw5ICsxNDYxLDggQEAKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAotICAgIC8vIHdlIGRvbid0IHlldCBzdXBwb3J0IGFueXRoaW5nIG90aGVyIHRoYW4gMTYtYml0IFBDTQotICAgIGlmICghKGF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpICYmCi0gICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYgZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSkgeworICAgIC8vIHdlIGRvbid0IHlldCBzdXBwb3J0IGFueXRoaW5nIG90aGVyIHRoYW4gbGluZWFyIFBDTQorICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkgfHwgIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewogICAgICAgICBBTE9HRSgib3BlblJlY29yZCgpIGludmFsaWQgZm9ybWF0ICUjeCIsIGZvcm1hdCk7CiAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gRXhpdDsKQEAgLTE0NTgsOCArMTUwMSw3IEBACiAgICAgICAgIC8vIFRPRE86IHRoZSB1aWQgc2hvdWxkIGJlIHBhc3NlZCBpbiBhcyBhIHBhcmFtZXRlciB0byBvcGVuUmVjb3JkCiAgICAgICAgIHJlY29yZFRyYWNrID0gdGhyZWFkLT5jcmVhdGVSZWNvcmRUcmFja19sKGNsaWVudCwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgbFNlc3Npb25JZCwgbm90aWZpY2F0aW9uRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCB0aWQsICZsU3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50VWlkLCBmbGFncywgdGlkLCAmbFN0YXR1cyk7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKGxTdGF0dXMgPT0gTk9fRVJST1IpICYmIChyZWNvcmRUcmFjayA9PSAwKSk7CiAKICAgICAgICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IpIHsKQEAgLTE2NzgsNiArMTcyMCwyNiBAQAogICAgIHJldHVybiAoYXVkaW9faHdfc3luY190KXZhbHVlOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnN5c3RlbVJlYWR5KCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEFMT0dJKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgaWYgKG1TeXN0ZW1SZWFkeSkgeworICAgICAgICBBTE9HVygiJXMgY2FsbGVkIHR3aWNlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBtU3lzdGVtUmVhZHkgPSB0cnVlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgeworICAgICAgICBUaHJlYWRCYXNlICp0aHJlYWQgPSAoVGhyZWFkQmFzZSAqKW1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS5nZXQoKTsKKyAgICAgICAgdGhyZWFkLT5zeXN0ZW1SZWFkeSgpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1SZWNvcmRUaHJlYWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIFRocmVhZEJhc2UgKnRocmVhZCA9IChUaHJlYWRCYXNlICopbVJlY29yZFRocmVhZHMudmFsdWVBdChpKS5nZXQoKTsKKyAgICAgICAgdGhyZWFkLT5zeXN0ZW1SZWFkeSgpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIC8vIHNldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbl9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKIHZvaWQgQXVkaW9GbGluZ2VyOjpzZXRBdWRpb0h3U3luY0ZvclNlc3Npb25fbChQbGF5YmFja1RocmVhZCAqdGhyZWFkLCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKQogewpAQCAtMTcxNCw4ICsxNzc2LDYgQEAKIAogICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX09VVFBVVF9PUEVOOwogCi0gICAgYXVkaW9fc3RyZWFtX291dF90ICpvdXRTdHJlYW0gPSBOVUxMOwotCiAgICAgLy8gRk9SIFRFU1RJTkcgT05MWToKICAgICAvLyBUaGlzIGlmIHN0YXRlbWVudCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgYXVkaW8gcG9saWN5IHNldHRpbmdzCiAgICAgLy8gYW5kIGZvcmNpbmcgYSBzcGVjaWZpYyBmb3JtYXQgb3IgY2hhbm5lbCBtYXNrIHRvIHRoZSBIQUwvU2luayBkZXZpY2UgZm9yIHRlc3RpbmcuCkBAIC0xNzM3LDM3ICsxNzk3LDMwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBod0RldkhhbC0+b3Blbl9vdXRwdXRfc3RyZWFtKGh3RGV2SGFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpKTsKKyAgICBBdWRpb1N0cmVhbU91dCAqb3V0cHV0U3RyZWFtID0gTlVMTDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBvdXRId0Rldi0+b3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgICZvdXRwdXRTdHJlYW0sCisgICAgICAgICAgICAqb3V0cHV0LAorICAgICAgICAgICAgZGV2aWNlcywKKyAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgY29uZmlnLAorICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSk7CiAKICAgICBtSGFyZHdhcmVTdGF0dXMgPSBBVURJT19IV19JRExFOwotICAgIEFMT0dWKCJvcGVuT3V0cHV0X2woKSBvcGVuT3V0cHV0U3RyZWFtIHJldHVybmVkIG91dHB1dCAlcCwgc2FtcGxlUmF0ZSAlZCwgRm9ybWF0ICUjeCwgIgotICAgICAgICAgICAgImNoYW5uZWxNYXNrICUjeCwgc3RhdHVzICVkIiwKLSAgICAgICAgICAgIG91dFN0cmVhbSwKLSAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsCi0gICAgICAgICAgICBjb25maWctPmZvcm1hdCwKLSAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgc3RhdHVzKTsKIAotICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgb3V0U3RyZWFtICE9IE5VTEwpIHsKLSAgICAgICAgQXVkaW9TdHJlYW1PdXQgKm91dHB1dFN0cmVhbSA9IG5ldyBBdWRpb1N0cmVhbU91dChvdXRId0Rldiwgb3V0U3RyZWFtLCBmbGFncyk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogCiAgICAgICAgIFBsYXliYWNrVGhyZWFkICp0aHJlYWQ7CiAgICAgICAgIGlmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpIHsKLSAgICAgICAgICAgIHRocmVhZCA9IG5ldyBPZmZsb2FkVGhyZWFkKHRoaXMsIG91dHB1dFN0cmVhbSwgKm91dHB1dCwgZGV2aWNlcyk7CisgICAgICAgICAgICB0aHJlYWQgPSBuZXcgT2ZmbG9hZFRocmVhZCh0aGlzLCBvdXRwdXRTdHJlYW0sICpvdXRwdXQsIGRldmljZXMsIG1TeXN0ZW1SZWFkeSk7CiAgICAgICAgICAgICBBTE9HVigib3Blbk91dHB1dF9sKCkgY3JlYXRlZCBvZmZsb2FkIG91dHB1dDogSUQgJWQgdGhyZWFkICVwIiwgKm91dHB1dCwgdGhyZWFkKTsKICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpCiAgICAgICAgICAgICAgICAgfHwgIWlzVmFsaWRQY21TaW5rRm9ybWF0KGNvbmZpZy0+Zm9ybWF0KQogICAgICAgICAgICAgICAgIHx8ICFpc1ZhbGlkUGNtU2lua0NoYW5uZWxNYXNrKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKSkgewotICAgICAgICAgICAgdGhyZWFkID0gbmV3IERpcmVjdE91dHB1dFRocmVhZCh0aGlzLCBvdXRwdXRTdHJlYW0sICpvdXRwdXQsIGRldmljZXMpOworICAgICAgICAgICAgdGhyZWFkID0gbmV3IERpcmVjdE91dHB1dFRocmVhZCh0aGlzLCBvdXRwdXRTdHJlYW0sICpvdXRwdXQsIGRldmljZXMsIG1TeXN0ZW1SZWFkeSk7CiAgICAgICAgICAgICBBTE9HVigib3Blbk91dHB1dF9sKCkgY3JlYXRlZCBkaXJlY3Qgb3V0cHV0OiBJRCAlZCB0aHJlYWQgJXAiLCAqb3V0cHV0LCB0aHJlYWQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyZWFkID0gbmV3IE1peGVyVGhyZWFkKHRoaXMsIG91dHB1dFN0cmVhbSwgKm91dHB1dCwgZGV2aWNlcyk7CisgICAgICAgICAgICB0aHJlYWQgPSBuZXcgTWl4ZXJUaHJlYWQodGhpcywgb3V0cHV0U3RyZWFtLCAqb3V0cHV0LCBkZXZpY2VzLCBtU3lzdGVtUmVhZHkpOwogICAgICAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXRfbCgpIGNyZWF0ZWQgbWl4ZXIgb3V0cHV0OiBJRCAlZCB0aHJlYWQgJXAiLCAqb3V0cHV0LCB0aHJlYWQpOwogICAgICAgICB9CiAgICAgICAgIG1QbGF5YmFja1RocmVhZHMuYWRkKCpvdXRwdXQsIHRocmVhZCk7CkBAIC0xNzg1LDcgKzE4MzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpsYXRlbmN5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCiB7Ci0gICAgQUxPR1YoIm9wZW5PdXRwdXQoKSwgbW9kdWxlICVkIERldmljZSAleCwgU2FtcGxpbmdSYXRlICVkLCBGb3JtYXQgJSMwOHgsIENoYW5uZWxzICV4LCBmbGFncyAleCIsCisgICAgQUxPR0koIm9wZW5PdXRwdXQoKSwgbW9kdWxlICVkIERldmljZSAleCwgU2FtcGxpbmdSYXRlICVkLCBGb3JtYXQgJSMwOHgsIENoYW5uZWxzICV4LCBmbGFncyAleCIsCiAgICAgICAgICAgICAgIG1vZHVsZSwKICAgICAgICAgICAgICAgKGRldmljZXMgIT0gTlVMTCkgPyAqZGV2aWNlcyA6IDAsCiAgICAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsCkBAIC0xODA0LDcgKzE4NTcsNyBAQAogICAgICAgICAqbGF0ZW5jeU1zID0gdGhyZWFkLT5sYXRlbmN5KCk7CiAKICAgICAgICAgLy8gbm90aWZ5IGNsaWVudCBwcm9jZXNzZXMgb2YgdGhlIG5ldyBvdXRwdXQgY3JlYXRpb24KLSAgICAgICAgdGhyZWFkLT5hdWRpb0NvbmZpZ0NoYW5nZWQoQXVkaW9TeXN0ZW06Ok9VVFBVVF9PUEVORUQpOworICAgICAgICB0aHJlYWQtPmlvQ29uZmlnQ2hhbmdlZChBVURJT19PVVRQVVRfT1BFTkVEKTsKIAogICAgICAgICAvLyB0aGUgZmlyc3QgcHJpbWFyeSBvdXRwdXQgb3BlbmVkIGRlc2lnbmF0ZXMgdGhlIHByaW1hcnkgaHcgZGV2aWNlCiAgICAgICAgIGlmICgobVByaW1hcnlIYXJkd2FyZURldiA9PSBOVUxMKSAmJiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSkgewpAQCAtMTgxNSw4ICsxODY4LDYgQEAKICAgICAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX1NFVF9NT0RFOwogICAgICAgICAgICAgbVByaW1hcnlIYXJkd2FyZURldi0+aHdEZXZpY2UoKS0+c2V0X21vZGUobVByaW1hcnlIYXJkd2FyZURldi0+aHdEZXZpY2UoKSwgbU1vZGUpOwogICAgICAgICAgICAgbUhhcmR3YXJlU3RhdHVzID0gQVVESU9fSFdfSURMRTsKLQotICAgICAgICAgICAgbVByaW1hcnlPdXRwdXRTYW1wbGVSYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQpAQCAtMTgzOCwxMSArMTg4OSwxMSBAQAogICAgIH0KIAogICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkID0gbmV4dFVuaXF1ZUlkKCk7Ci0gICAgRHVwbGljYXRpbmdUaHJlYWQgKnRocmVhZCA9IG5ldyBEdXBsaWNhdGluZ1RocmVhZCh0aGlzLCB0aHJlYWQxLCBpZCk7CisgICAgRHVwbGljYXRpbmdUaHJlYWQgKnRocmVhZCA9IG5ldyBEdXBsaWNhdGluZ1RocmVhZCh0aGlzLCB0aHJlYWQxLCBpZCwgbVN5c3RlbVJlYWR5KTsKICAgICB0aHJlYWQtPmFkZE91dHB1dFRyYWNrKHRocmVhZDIpOwogICAgIG1QbGF5YmFja1RocmVhZHMuYWRkKGlkLCB0aHJlYWQpOwogICAgIC8vIG5vdGlmeSBjbGllbnQgcHJvY2Vzc2VzIG9mIHRoZSBuZXcgb3V0cHV0IGNyZWF0aW9uCi0gICAgdGhyZWFkLT5hdWRpb0NvbmZpZ0NoYW5nZWQoQXVkaW9TeXN0ZW06Ok9VVFBVVF9PUEVORUQpOworICAgIHRocmVhZC0+aW9Db25maWdDaGFuZ2VkKEFVRElPX09VVFBVVF9PUEVORUQpOwogICAgIHJldHVybiBpZDsKIH0KIApAQCAtMTg5MSw3ICsxOTQyLDkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkKEF1ZGlvU3lzdGVtOjpPVVRQVVRfQ0xPU0VELCBvdXRwdXQsIE5VTEwpOworICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gaW9EZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7CisgICAgICAgIGlvRGVzYy0+bUlvSGFuZGxlID0gb3V0cHV0OworICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoQVVESU9fT1VUUFVUX0NMT1NFRCwgaW9EZXNjKTsKICAgICB9CiAgICAgdGhyZWFkLT5leGl0KCk7CiAgICAgLy8gVGhlIHRocmVhZCBlbnRpdHkgKGFjdGl2ZSB1bml0IG9mIGV4ZWN1dGlvbikgaXMgbm8gbG9uZ2VyIHJ1bm5pbmcgaGVyZSwKQEAgLTE5NTQsMjIgKzIwMDcsMjIgQEAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6b3BlbklucHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgaWYgKCpkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICBpZiAoKmRldmljZXMgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzcDxSZWNvcmRUaHJlYWQ+IHRocmVhZCA9IG9wZW5JbnB1dF9sKG1vZHVsZSwgaW5wdXQsIGNvbmZpZywgKmRldmljZSwgYWRkcmVzcywgc291cmNlLCBmbGFncyk7CisgICAgc3A8UmVjb3JkVGhyZWFkPiB0aHJlYWQgPSBvcGVuSW5wdXRfbChtb2R1bGUsIGlucHV0LCBjb25maWcsICpkZXZpY2VzLCBhZGRyZXNzLCBzb3VyY2UsIGZsYWdzKTsKIAogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICAvLyBub3RpZnkgY2xpZW50IHByb2Nlc3NlcyBvZiB0aGUgbmV3IGlucHV0IGNyZWF0aW9uCi0gICAgICAgIHRocmVhZC0+YXVkaW9Db25maWdDaGFuZ2VkKEF1ZGlvU3lzdGVtOjpJTlBVVF9PUEVORUQpOworICAgICAgICB0aHJlYWQtPmlvQ29uZmlnQ2hhbmdlZChBVURJT19JTlBVVF9PUEVORUQpOwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogICAgIHJldHVybiBOT19JTklUOwpAQCAtMTk3OCwxMiArMjAzMSwxMiBAQAogc3A8QXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ+IEF1ZGlvRmxpbmdlcjo6b3BlbklucHV0X2woYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKIHsKLSAgICBBdWRpb0h3RGV2aWNlICppbkh3RGV2ID0gZmluZFN1aXRhYmxlSHdEZXZfbChtb2R1bGUsIGRldmljZSk7CisgICAgQXVkaW9Id0RldmljZSAqaW5Id0RldiA9IGZpbmRTdWl0YWJsZUh3RGV2X2wobW9kdWxlLCBkZXZpY2VzKTsKICAgICBpZiAoaW5Id0RldiA9PSBOVUxMKSB7CiAgICAgICAgICppbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICByZXR1cm4gMDsKQEAgLTE5OTYsNyArMjA0OSw3IEBACiAgICAgYXVkaW9fY29uZmlnX3QgaGFsY29uZmlnID0gKmNvbmZpZzsKICAgICBhdWRpb19od19kZXZpY2VfdCAqaW5Id0hhbCA9IGluSHdEZXYtPmh3RGV2aWNlKCk7CiAgICAgYXVkaW9fc3RyZWFtX2luX3QgKmluU3RyZWFtID0gTlVMTDsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbkh3SGFsLT5vcGVuX2lucHV0X3N0cmVhbShpbkh3SGFsLCAqaW5wdXQsIGRldmljZSwgJmhhbGNvbmZpZywKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbkh3SGFsLT5vcGVuX2lucHV0X3N0cmVhbShpbkh3SGFsLCAqaW5wdXQsIGRldmljZXMsICZoYWxjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluU3RyZWFtLCBmbGFncywgYWRkcmVzcy5zdHJpbmcoKSwgc291cmNlKTsKICAgICBBTE9HVigib3BlbklucHV0X2woKSBvcGVuSW5wdXRTdHJlYW0gcmV0dXJuZWQgaW5wdXQgJXAsIFNhbXBsaW5nUmF0ZSAlZCIKICAgICAgICAgICAgIiwgRm9ybWF0ICUjeCwgQ2hhbm5lbHMgJXgsIGZsYWdzICUjeCwgc3RhdHVzICVkIGFkZHIgJXMiLApAQCAtMjAwOCwxNyArMjA2MSwxNyBAQAogICAgICAgICAgICAgc3RhdHVzLCBhZGRyZXNzLnN0cmluZygpKTsKIAogICAgIC8vIElmIHRoZSBpbnB1dCBjb3VsZCBub3QgYmUgb3BlbmVkIHdpdGggdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXJzIGFuZCB3ZSBjYW4gaGFuZGxlIHRoZQotICAgIC8vIGNvbnZlcnNpb24gaW50ZXJuYWxseSwgdHJ5IHRvIG9wZW4gYWdhaW4gd2l0aCB0aGUgcHJvcG9zZWQgcGFyYW1ldGVycy4gVGhlIEF1ZGlvRmxpbmdlciBjYW4KLSAgICAvLyByZXNhbXBsZSB0aGUgaW5wdXQgYW5kIGRvIG1vbm8gdG8gc3RlcmVvIG9yIHN0ZXJlbyB0byBtb25vIGNvbnZlcnNpb25zIG9uIDE2IGJpdCBQQ00gaW5wdXRzLgorICAgIC8vIGNvbnZlcnNpb24gaW50ZXJuYWxseSwgdHJ5IHRvIG9wZW4gYWdhaW4gd2l0aCB0aGUgcHJvcG9zZWQgcGFyYW1ldGVycy4KICAgICBpZiAoc3RhdHVzID09IEJBRF9WQUxVRSAmJgotICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQgPT0gaGFsY29uZmlnLmZvcm1hdCAmJiBoYWxjb25maWcuZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUICYmCi0gICAgICAgIChoYWxjb25maWcuc2FtcGxlX3JhdGUgPD0gMiAqIGNvbmZpZy0+c2FtcGxlX3JhdGUpICYmCisgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpICYmCisgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oaGFsY29uZmlnLmZvcm1hdCkgJiYKKyAgICAgICAgKGhhbGNvbmZpZy5zYW1wbGVfcmF0ZSA8PSBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVggKiBjb25maWctPnNhbXBsZV9yYXRlKSAmJgogICAgICAgICAoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soaGFsY29uZmlnLmNoYW5uZWxfbWFzaykgPD0gRkNDXzIpICYmCiAgICAgICAgIChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWctPmNoYW5uZWxfbWFzaykgPD0gRkNDXzIpKSB7CiAgICAgICAgIC8vIEZJWE1FIGRlc2NyaWJlIHRoZSBjaGFuZ2UgcHJvcG9zZWQgYnkgSEFMIChzYXZlIG9sZCB2YWx1ZXMgc28gd2UgY2FuIGxvZyB0aGVtIGhlcmUpCiAgICAgICAgIEFMT0dWKCJvcGVuSW5wdXRfbCgpIHJlb3BlbmluZyB3aXRoIHByb3Bvc2VkIHNhbXBsaW5nIHJhdGUgYW5kIGNoYW5uZWwgbWFzayIpOwogICAgICAgICBpblN0cmVhbSA9IE5VTEw7Ci0gICAgICAgIHN0YXR1cyA9IGluSHdIYWwtPm9wZW5faW5wdXRfc3RyZWFtKGluSHdIYWwsICppbnB1dCwgZGV2aWNlLCAmaGFsY29uZmlnLAorICAgICAgICBzdGF0dXMgPSBpbkh3SGFsLT5vcGVuX2lucHV0X3N0cmVhbShpbkh3SGFsLCAqaW5wdXQsIGRldmljZXMsICZoYWxjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpblN0cmVhbSwgZmxhZ3MsIGFkZHJlc3Muc3RyaW5nKCksIHNvdXJjZSk7CiAgICAgICAgIC8vIEZJWE1FIGxvZyB0aGlzIG5ldyBzdGF0dXM7IEhBTCBzaG91bGQgbm90IHByb3Bvc2UgYW55IGZ1cnRoZXIgY2hhbmdlcwogICAgIH0KQEAgLTIwODMsNyArMjEzNiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlPdXRwdXREZXZpY2VfbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVJlYWR5CiAjaWZkZWYgVEVFX1NJTksKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHRlZVNpbmsKICNlbmRpZgpAQCAtMjE1Miw3ICsyMjA2LDkgQEAKICAgICAgICAgICAgICAgICBwdXRPcnBoYW5FZmZlY3RDaGFpbl9sKGNoYWluKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWQoQXVkaW9TeXN0ZW06OklOUFVUX0NMT1NFRCwgaW5wdXQsIE5VTEwpOworICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gaW9EZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7CisgICAgICAgIGlvRGVzYy0+bUlvSGFuZGxlID0gaW5wdXQ7CisgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChBVURJT19JTlBVVF9DTE9TRUQsIGlvRGVzYyk7CiAgICAgICAgIG1SZWNvcmRUaHJlYWRzLnJlbW92ZUl0ZW0oaW5wdXQpOwogICAgIH0KICAgICAvLyBGSVhNRTogY2FsbGluZyB0aHJlYWQtPmV4aXQoKSB3aXRob3V0IG1Mb2NrIGhlbGQgc2hvdWxkIG5vdCBiZSBuZWVkZWQgYW55bW9yZSBub3cgdGhhdApAQCAtMjQyOCw2ICsyNDg0LDcgQEAKICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCiAgICAgICAgIGludCBzZXNzaW9uSWQsCisgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAogICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLAogICAgICAgICBpbnQgKmlkLAogICAgICAgICBpbnQgKmVuYWJsZWQpCkBAIC0yNTI0LDcgKzI1ODEsNyBAQAogCiAgICAgICAgIC8vIGNoZWNrIHJlY29yZGluZyBwZXJtaXNzaW9uIGZvciB2aXN1YWxpemVyCiAgICAgICAgIGlmICgobWVtY21wKCZkZXNjLnR5cGUsIFNMX0lJRF9WSVNVQUxJWkFUSU9OLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApICYmCi0gICAgICAgICAgICAhcmVjb3JkaW5nQWxsb3dlZCgpKSB7CisgICAgICAgICAgICAhcmVjb3JkaW5nQWxsb3dlZChvcFBhY2thZ2VOYW1lKSkgewogICAgICAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICB9CkBAIC0yODA5LDEzICsyODY2LDEzIEBACiAKIAogc3RydWN0IEVudHJ5IHsKLSNkZWZpbmUgTUFYX05BTUUgMzIgICAgIC8vICVZJW0lZCVIJU0lU18lZC53YXYKLSAgICBjaGFyIG1OYW1lW01BWF9OQU1FXTsKKyNkZWZpbmUgVEVFX01BWF9GSUxFTkFNRSAzMiAvLyAlWSVtJWQlSCVNJVNfJWQud2F2ID0gNCsyKzIrMisyKzIrMSsxKzQrMSA9IDIxCisgICAgY2hhciBtRmlsZU5hbWVbVEVFX01BWF9GSUxFTkFNRV07CiB9OwogCiBpbnQgY29tcGFyRW50cnkoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQogewotICAgIHJldHVybiBzdHJjbXAoKChjb25zdCBFbnRyeSAqKSBwMSktPm1OYW1lLCAoKGNvbnN0IEVudHJ5ICopIHAyKS0+bU5hbWUpOworICAgIHJldHVybiBzdHJjbXAoKChjb25zdCBFbnRyeSAqKSBwMSktPm1GaWxlTmFtZSwgKChjb25zdCBFbnRyeSAqKSBwMiktPm1GaWxlTmFtZSk7CiB9CiAKICNpZmRlZiBURUVfU0lOSwpAQCAtMjgzNCwxMSArMjg5MSwxMSBAQAogICAgICAgICBESVIgKmRpciA9IG9wZW5kaXIodGVlUGF0aCk7CiAgICAgICAgIHRlZVBhdGhbdGVlUGF0aExlbisrXSA9ICcvJzsKICAgICAgICAgaWYgKGRpciAhPSBOVUxMKSB7Ci0jZGVmaW5lIE1BWF9TT1JUIDIwIC8vIG51bWJlciBvZiBlbnRyaWVzIHRvIHNvcnQKLSNkZWZpbmUgTUFYX0tFRVAgMTAgLy8gbnVtYmVyIG9mIGVudHJpZXMgdG8ga2VlcAotICAgICAgICAgICAgc3RydWN0IEVudHJ5IGVudHJpZXNbTUFYX1NPUlRdOworI2RlZmluZSBURUVfTUFYX1NPUlQgMjAgLy8gbnVtYmVyIG9mIGVudHJpZXMgdG8gc29ydAorI2RlZmluZSBURUVfTUFYX0tFRVAgMTAgLy8gbnVtYmVyIG9mIGVudHJpZXMgdG8ga2VlcAorICAgICAgICAgICAgc3RydWN0IEVudHJ5IGVudHJpZXNbVEVFX01BWF9TT1JUXTsKICAgICAgICAgICAgIHNpemVfdCBlbnRyeUNvdW50ID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChlbnRyeUNvdW50IDwgTUFYX1NPUlQpIHsKKyAgICAgICAgICAgIHdoaWxlIChlbnRyeUNvdW50IDwgVEVFX01BWF9TT1JUKSB7CiAgICAgICAgICAgICAgICAgc3RydWN0IGRpcmVudCBkZTsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGlyZW50ICpyZXN1bHQgPSBOVUxMOwogICAgICAgICAgICAgICAgIGludCByYyA9IHJlYWRkaXJfcihkaXIsICZkZSwgJnJlc3VsdCk7CkBAIC0yODU1LDE3ICsyOTEyLDE3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBub24gLndhdiBmaWxlIGVudHJpZXMKICAgICAgICAgICAgICAgICBzaXplX3QgbmFtZUxlbiA9IHN0cmxlbihkZS5kX25hbWUpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lTGVuIDw9IDQgfHwgbmFtZUxlbiA+PSBNQVhfTkFNRSB8fAorICAgICAgICAgICAgICAgIGlmIChuYW1lTGVuIDw9IDQgfHwgbmFtZUxlbiA+PSBURUVfTUFYX0ZJTEVOQU1FIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoJmRlLmRfbmFtZVtuYW1lTGVuIC0gNF0sICIud2F2IikpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0cmNweShlbnRyaWVzW2VudHJ5Q291bnQrK10ubU5hbWUsIGRlLmRfbmFtZSk7CisgICAgICAgICAgICAgICAgc3RyY3B5KGVudHJpZXNbZW50cnlDb3VudCsrXS5tRmlsZU5hbWUsIGRlLmRfbmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAodm9pZCkgY2xvc2VkaXIoZGlyKTsKLSAgICAgICAgICAgIGlmIChlbnRyeUNvdW50ID4gTUFYX0tFRVApIHsKKyAgICAgICAgICAgIGlmIChlbnRyeUNvdW50ID4gVEVFX01BWF9LRUVQKSB7CiAgICAgICAgICAgICAgICAgcXNvcnQoZW50cmllcywgZW50cnlDb3VudCwgc2l6ZW9mKEVudHJ5KSwgY29tcGFyRW50cnkpOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnlDb3VudCAtIE1BWF9LRUVQOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyY3B5KCZ0ZWVQYXRoW3RlZVBhdGhMZW5dLCBlbnRyaWVzW2ldLm1OYW1lKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5Q291bnQgLSBURUVfTUFYX0tFRVA7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBzdHJjcHkoJnRlZVBhdGhbdGVlUGF0aExlbl0sIGVudHJpZXNbaV0ubUZpbGVOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIHVubGluayh0ZWVQYXRoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yOTQ5LDQgKzMwMDYsNCBAQAogICAgIHJldHVybiBCbkF1ZGlvRmxpbmdlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCmluZGV4IGFhMGFmMWYuLjIwYzM0ZWYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKQEAgLTU2LDYgKzU2LDkgQEAKICNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgogI2luY2x1ZGUgIkF1ZGlvV2F0Y2hkb2cuaCIKICNpbmNsdWRlICJBdWRpb01peGVyLmgiCisjaW5jbHVkZSAiQXVkaW9TdHJlYW1PdXQuaCIKKyNpbmNsdWRlICJTcGRpZlN0cmVhbU91dC5oIgorI2luY2x1ZGUgIkF1ZGlvSHdEZXZpY2UuaCIKIAogI2luY2x1ZGUgPHBvd2VybWFuYWdlci9JUG93ZXJNYW5hZ2VyLmg+CiAKQEAgLTcwLDE4ICs3MywxOCBAQAogY2xhc3MgQXVkaW9CdWZmZXI7CiBjbGFzcyBBdWRpb1Jlc2FtcGxlcjsKIGNsYXNzIEZhc3RNaXhlcjsKK2NsYXNzIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI7CiBjbGFzcyBTZXJ2ZXJQcm94eTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0vLyBBdWRpb0ZsaW5nZXIgaGFzIGEgaGFyZC1jb2RlZCB1cHBlciBsaW1pdCBvZiAyIGNoYW5uZWxzIGZvciBjYXB0dXJlIGFuZCBwbGF5YmFjay4KLS8vIFRoZXJlIGlzIHN1cHBvcnQgZm9yID4gMiBjaGFubmVsIHRyYWNrcyBkb3duLW1peGVkIHRvIDIgY2hhbm5lbCBvdXRwdXQgdmlhIGEgZG93bi1taXggZWZmZWN0LgotLy8gQWRkaW5nIGZ1bGwgc3VwcG9ydCBmb3IgPiAyIGNoYW5uZWwgY2FwdHVyZSBvciBwbGF5YmFjayB3b3VsZCByZXF1aXJlIG1vcmUgdGhhbiBzaW1wbHkgY2hhbmdpbmcKLS8vIHRoaXMgI2RlZmluZS4gIFRoZXJlIGlzIGFuIGluZGVwZW5kZW50IGhhcmQtY29kZWQgdXBwZXIgbGltaXQgaW4gQXVkaW9NaXhlcjsKLS8vIHJlbW92aW5nIHRoYXQgQXVkaW9NaXhlciBsaW1pdCB3b3VsZCBiZSBuZWNlc3NhcnkgYnV0IGluc3VmZmljaWVudCB0byBzdXBwb3J0ID4gMiBjaGFubmVscy4KLS8vIFRoZSBtYWNybyBGQ0NfMiBoaWdobGlnaHRzIHNvbWUgKGJ1dCBub3QgYWxsKSBwbGFjZXMgd2hlcmUgdGhlcmUgaXMgYXJlIDItY2hhbm5lbCBhc3N1bXB0aW9ucy4KKy8vIFRoZSBtYWNybyBGQ0NfMiBoaWdobGlnaHRzIHNvbWUgKGJ1dCBub3QgYWxsKSBwbGFjZXMgd2hlcmUgdGhlcmUgYXJlIGFyZSAyLWNoYW5uZWwgYXNzdW1wdGlvbnMuCisvLyBUaGlzIGlzIHR5cGljYWxseSBkdWUgdG8gbGVnYWN5IGltcGxlbWVudGF0aW9uIG9mIHN0ZXJlbyBpbnB1dCBvciBvdXRwdXQuCiAvLyBTZWFyY2ggYWxzbyBmb3IgIjIiLCAibGVmdCIsICJyaWdodCIsICJbMF0iLCAiWzFdIiwgIj4+IDE2IiwgIjw8IDE2IiwgZXRjLgogI2RlZmluZSBGQ0NfMiAyICAgICAvLyBGQ0NfMiA9IEZpeGVkIENoYW5uZWwgQ291bnQgMgorLy8gVGhlIG1hY3JvIEZDQ184IGhpZ2hsaWdodHMgcGxhY2VzIHdoZXJlIHRoZXJlIGFyZSA4LWNoYW5uZWwgYXNzdW1wdGlvbnMuCisvLyBUaGlzIGlzIHR5cGljYWxseSBkdWUgdG8gYXVkaW8gbWl4ZXIgYW5kIHJlc2FtcGxlciBsaW1pdGF0aW9ucy4KKyNkZWZpbmUgRkNDXzggOCAgICAgLy8gRkNDXzggPSBGaXhlZCBDaGFubmVsIENvdW50IDgKIAogc3RhdGljIGNvbnN0IG5zZWNzX3Qga0RlZmF1bHRTdGFuZGJ5VGltZUluTnNlY3MgPSBzZWNvbmRzKDMpOwogCkBAIC0xMTcsOSArMTIwLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQXVkaW9GbGluZ2VyOjp0cmFja19mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50VWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpub3RpZmljYXRpb25GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+JiBjYmxrLApAQCAtMjEzLDYgKzIxOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzIC8qbm9uLU5VTEwqLywKICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmVuYWJsZWQpOwpAQCAtMjUxLDYgKzI1Nyw5IEBACiAgICAgLyogR2V0IHRoZSBIVyBzeW5jaHJvbml6YXRpb24gc291cmNlIHVzZWQgZm9yIGFuIGF1ZGlvIHNlc3Npb24gKi8KICAgICB2aXJ0dWFsIGF1ZGlvX2h3X3N5bmNfdCBnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7CiAKKyAgICAvKiBJbmRpY2F0ZSBKQVZBIHNlcnZpY2VzIGFyZSByZWFkeSAoc2NoZWR1bGluZywgcG93ZXIgbWFuYWdlbWVudCAuLi4pICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzeXN0ZW1SZWFkeSgpOworCiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgb25UcmFuc2FjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLApAQCAtMzExLDcgKzMyMCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3A8UmVmQmFzZT4gY29va2llKTsKIAogcHJpdmF0ZToKLSAgICBjbGFzcyBBdWRpb0h3RGV2aWNlOyAgICAvLyBmd2QgZGVjbGFyYXRpb24gZm9yIGZpbmRTdWl0YWJsZUh3RGV2X2wKIAogICAgICAgICAgICAgICAgYXVkaW9fbW9kZV90IGdldE1vZGUoKSBjb25zdCB7IHJldHVybiBtTW9kZTsgfQogCkBAIC0zNTEsNiArMzU5LDE1IEBACiAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGNoYW5uZWxNYXNrIGlzIHRoZSAiY2Fub25pY2FsIiBvbmUgd2UgZXhwZWN0IGZvciB0aGUgY2hhbm5lbENvdW50LgogICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWxNYXNrID09IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpOwogICAgICAgICAgICAgfQorICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fSU5ERVg6CisgICAgICAgICAgICBpZiAoa0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIGlmIChjaGFubmVsQ291bnQgPj0gRkNDXzIgLy8gbW9ubyBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgY2hhbm5lbENvdW50IDw9IEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fQ0hBTk5FTFMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC00NDksNyArNDY2LDcgQEAKICAgICBjbGFzcyBFZmZlY3RNb2R1bGU7CiAgICAgY2xhc3MgRWZmZWN0SGFuZGxlOwogICAgIGNsYXNzIEVmZmVjdENoYWluOwotICAgIHN0cnVjdCBBdWRpb1N0cmVhbU91dDsKKwogICAgIHN0cnVjdCBBdWRpb1N0cmVhbUluOwogCiAgICAgc3RydWN0ICBzdHJlYW1fdHlwZV90IHsKQEAgLTU0MSw3ICs1NTgsOSBAQAogICAgICAgICAgICAgICAvLyBubyByYW5nZSBjaGVjaywgZG9lc24ndCBjaGVjayBwZXItdGhyZWFkIHN0cmVhbSB2b2x1bWUsIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAogICAgICAgICAgICAgICBmbG9hdCBzdHJlYW1Wb2x1bWVfbChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbVN0cmVhbVR5cGVzW3N0cmVhbV0udm9sdW1lOyB9Ci0gICAgICAgICAgICAgIHZvaWQgYXVkaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IHZvaWQgKnBhcmFtMik7CisgICAgICAgICAgICAgIHZvaWQgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+JiBpb0Rlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IDApOwogCiAgICAgICAgICAgICAgIC8vIEFsbG9jYXRlIGFuIGF1ZGlvX2lvX2hhbmRsZV90LCBzZXNzaW9uIElELCBlZmZlY3QgSUQsIG9yIGF1ZGlvX21vZHVsZV9oYW5kbGVfdC4KICAgICAgICAgICAgICAgLy8gVGhleSBhbGwgc2hhcmUgdGhlIHNhbWUgSUQgc3BhY2UsIGJ1dCB0aGUgbmFtZXNwYWNlcyBhcmUgYWN0dWFsbHkgaW5kZXBlbmRlbnQKQEAgLTU4Niw1NyArNjA1LDEyIEBACiAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGVmZmVjdCB3YXMgZm91bmQgaW4gbU9ycGhhbkVmZmVjdENoYWlucywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICB1cGRhdGVPcnBoYW5FZmZlY3RDaGFpbnMoY29uc3Qgc3A8RWZmZWN0TW9kdWxlPiYgZWZmZWN0KTsKIAotICAgIGNsYXNzIEF1ZGlvSHdEZXZpY2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgZW51bSBGbGFncyB7Ci0gICAgICAgICAgICBBSFdEX0NBTl9TRVRfTUFTVEVSX1ZPTFVNRSAgPSAweDEsCi0gICAgICAgICAgICBBSFdEX0NBTl9TRVRfTUFTVEVSX01VVEUgICAgPSAweDIsCi0gICAgICAgIH07CisgICAgICAgICAgICAgICAgdm9pZCBicm9hY2FzdFBhcmFtZXRlcnNUb1JlY29yZFRocmVhZHNfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKIAotICAgICAgICBBdWRpb0h3RGV2aWNlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW9kdWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRmxhZ3MgZmxhZ3MpCi0gICAgICAgICAgICA6IG1IYW5kbGUoaGFuZGxlKSwgbU1vZHVsZU5hbWUoc3RyZHVwKG1vZHVsZU5hbWUpKQotICAgICAgICAgICAgLCBtSHdEZXZpY2UoaHdEZXZpY2UpCi0gICAgICAgICAgICAsIG1GbGFncyhmbGFncykgeyB9Ci0gICAgICAgIC8qdmlydHVhbCovIH5BdWRpb0h3RGV2aWNlKCkgeyBmcmVlKCh2b2lkICopbU1vZHVsZU5hbWUpOyB9Ci0KLSAgICAgICAgYm9vbCBjYW5TZXRNYXN0ZXJWb2x1bWUoKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gKDAgIT0gKG1GbGFncyAmIEFIV0RfQ0FOX1NFVF9NQVNURVJfVk9MVU1FKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sIGNhblNldE1hc3Rlck11dGUoKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gKDAgIT0gKG1GbGFncyAmIEFIV0RfQ0FOX1NFVF9NQVNURVJfTVVURSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1IYW5kbGU7IH0KLSAgICAgICAgY29uc3QgY2hhciAqbW9kdWxlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1Nb2R1bGVOYW1lOyB9Ci0gICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Id0RldmljZTsgfQotICAgICAgICB1aW50MzJfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbUh3RGV2aWNlLT5jb21tb24udmVyc2lvbjsgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgY29uc3QgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1IYW5kbGU7Ci0gICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCBtTW9kdWxlTmFtZTsKLSAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKiBjb25zdCBtSHdEZXZpY2U7Ci0gICAgICAgIGNvbnN0IEZsYWdzIG1GbGFnczsKLSAgICB9OwotCi0gICAgLy8gQXVkaW9TdHJlYW1PdXQgYW5kIEF1ZGlvU3RyZWFtSW4gYXJlIGltbXV0YWJsZSwgc28gdGhlaXIgZmllbGRzIGFyZSBjb25zdC4KKyAgICAvLyBBdWRpb1N0cmVhbUluIGlzIGltbXV0YWJsZSwgc28gdGhlaXIgZmllbGRzIGFyZSBjb25zdC4KICAgICAvLyBGb3IgZW1waGFzaXMsIHdlIGNvdWxkIGFsc28gbWFrZSBhbGwgcG9pbnRlcnMgdG8gdGhlbSBiZSAiY29uc3QgKiIsCiAgICAgLy8gYnV0IHRoYXQgd291bGQgY2x1dHRlciB0aGUgY29kZSB1bm5lY2Vzc2FyaWx5LgogCi0gICAgc3RydWN0IEF1ZGlvU3RyZWFtT3V0IHsKLSAgICAgICAgQXVkaW9Id0RldmljZSogY29uc3QgYXVkaW9Id0RldjsKLSAgICAgICAgYXVkaW9fc3RyZWFtX291dF90KiBjb25zdCBzdHJlYW07Ci0gICAgICAgIGNvbnN0IGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzOwotCi0gICAgICAgIGF1ZGlvX2h3X2RldmljZV90KiBod0RldigpIGNvbnN0IHsgcmV0dXJuIGF1ZGlvSHdEZXYtPmh3RGV2aWNlKCk7IH0KLQotICAgICAgICBBdWRpb1N0cmVhbU91dChBdWRpb0h3RGV2aWNlICpkZXYsIGF1ZGlvX3N0cmVhbV9vdXRfdCAqb3V0LCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykgOgotICAgICAgICAgICAgYXVkaW9Id0RldihkZXYpLCBzdHJlYW0ob3V0KSwgZmxhZ3MoZmxhZ3MpIHt9Ci0gICAgfTsKLQogICAgIHN0cnVjdCBBdWRpb1N0cmVhbUluIHsKICAgICAgICAgQXVkaW9Id0RldmljZSogY29uc3QgYXVkaW9Id0RldjsKICAgICAgICAgYXVkaW9fc3RyZWFtX2luX3QqIGNvbnN0IHN0cmVhbTsKQEAgLTc4OSwxNiArNzYzLDE5IEBACiAKICAgICBzcDxQYXRjaFBhbmVsPiBtUGF0Y2hQYW5lbDsKIAotICAgIHVpbnQzMl90ICAgIG1QcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZTsgICAvLyBzYW1wbGUgcmF0ZSBvZiB0aGUgcHJpbWFyeSBvdXRwdXQsIG9yIHplcm8gaWYgbm9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm90ZWN0ZWQgYnkgbUhhcmR3YXJlTG9jaworICAgIGJvb2wgICAgICAgIG1TeXN0ZW1SZWFkeTsKIH07CiAKICN1bmRlZiBJTkNMVURJTkdfRlJPTV9BVURJT0ZMSU5HRVJfSAogCiBjb25zdCBjaGFyICpmb3JtYXRUb1N0cmluZyhhdWRpb19mb3JtYXRfdCBmb3JtYXQpOworU3RyaW5nOCBpbnB1dEZsYWdzVG9TdHJpbmcoYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyk7CitTdHJpbmc4IG91dHB1dEZsYWdzVG9TdHJpbmcoYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOworU3RyaW5nOCBkZXZpY2VzVG9TdHJpbmcoYXVkaW9fZGV2aWNlc190IGRldmljZXMpOworY29uc3QgY2hhciAqc291cmNlVG9TdHJpbmcoYXVkaW9fc291cmNlX3Qgc291cmNlKTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLy8gQU5EUk9JRF9BVURJT19GTElOR0VSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTkxNTk4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuY3BwCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Id0RldmljZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9zcGRpZi9TUERJRkVuY29kZXIuaD4KKworI2luY2x1ZGUgIkF1ZGlvSHdEZXZpY2UuaCIKKyNpbmNsdWRlICJBdWRpb1N0cmVhbU91dC5oIgorI2luY2x1ZGUgIlNwZGlmU3RyZWFtT3V0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0dXNfdCBBdWRpb0h3RGV2aWNlOjpvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICBBdWRpb1N0cmVhbU91dCAqKnBwU3RyZWFtT3V0LAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzKQoreworCisgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyBvcmlnaW5hbENvbmZpZyA9ICpjb25maWc7CisgICAgQXVkaW9TdHJlYW1PdXQgKm91dHB1dFN0cmVhbSA9IG5ldyBBdWRpb1N0cmVhbU91dCh0aGlzLCBmbGFncyk7CisKKyAgICAvLyBUcnkgdG8gb3BlbiB0aGUgSEFMIGZpcnN0IHVzaW5nIHRoZSBjdXJyZW50IGZvcm1hdC4KKyAgICBBTE9HVigib3Blbk91dHB1dFN0cmVhbSgpLCB0cnkgIgorICAgICAgICAgICAgIiBzYW1wbGVSYXRlICVkLCBGb3JtYXQgJSN4LCAiCisgICAgICAgICAgICAiY2hhbm5lbE1hc2sgJSN4IiwKKyAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICBjb25maWctPmZvcm1hdCwKKyAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBvdXRwdXRTdHJlYW0tPm9wZW4oaGFuZGxlLCBkZXZpY2VzLCBjb25maWcsIGFkZHJlc3MpOworCisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBkZWxldGUgb3V0cHV0U3RyZWFtOworICAgICAgICBvdXRwdXRTdHJlYW0gPSBOVUxMOworCisgICAgICAgIC8vIEZJWE1FIExvb2sgYXQgYW55IG1vZGlmaWNhdGlvbiB0byB0aGUgY29uZmlnLgorICAgICAgICAvLyBUaGUgSEFMIG1pZ2h0IG1vZGlmeSB0aGUgY29uZmlnIHRvIHN1Z2dlc3QgYSB3cmFwcGVkIGZvcm1hdC4KKyAgICAgICAgLy8gTG9nIHRoaXMgc28gd2UgY2FuIHNlZSB3aGF0IHRoZSBIQUxzIGFyZSBkb2luZy4KKyAgICAgICAgQUxPR0koIm9wZW5PdXRwdXRTdHJlYW0oKSwgSEFMIHJldHVybmVkIgorICAgICAgICAgICAgIiBzYW1wbGVSYXRlICVkLCBGb3JtYXQgJSN4LCAiCisgICAgICAgICAgICAiY2hhbm5lbE1hc2sgJSN4LCBzdGF0dXMgJWQiLAorICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAorICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssCisgICAgICAgICAgICBzdGF0dXMpOworCisgICAgICAgIC8vIElmIHRoZSBkYXRhIGlzIGVuY29kZWQgdGhlbiB0cnkgYWdhaW4gdXNpbmcgd3JhcHBlZCBQQ00uCisgICAgICAgIGJvb2wgd3JhcHBlck5lZWRlZCA9ICFhdWRpb19pc19saW5lYXJfcGNtKG9yaWdpbmFsQ29uZmlnLmZvcm1hdCkKKyAgICAgICAgICAgICAgICAmJiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKQorICAgICAgICAgICAgICAgICYmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSA9PSAwKTsKKworICAgICAgICBpZiAod3JhcHBlck5lZWRlZCkgeworICAgICAgICAgICAgaWYgKFNQRElGRW5jb2Rlcjo6aXNGb3JtYXRTdXBwb3J0ZWQob3JpZ2luYWxDb25maWcuZm9ybWF0KSkgeworICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IG5ldyBTcGRpZlN0cmVhbU91dCh0aGlzLCBmbGFncywgb3JpZ2luYWxDb25maWcuZm9ybWF0KTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBvdXRwdXRTdHJlYW0tPm9wZW4oaGFuZGxlLCBkZXZpY2VzLCAmb3JpZ2luYWxDb25maWcsIGFkZHJlc3MpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkVSUk9SIC0gb3Blbk91dHB1dFN0cmVhbSgpLCBTUERJRiBvcGVuIHJldHVybmVkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvdXRwdXRTdHJlYW07CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbSA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRVJST1IgLSBvcGVuT3V0cHV0U3RyZWFtKCksIFNQRElGRW5jb2RlciBkb2VzIG5vdCBzdXBwb3J0IGZvcm1hdCAweCUwOHgiLAorICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbENvbmZpZy5mb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgKnBwU3RyZWFtT3V0ID0gb3V0cHV0U3RyZWFtOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZjY1YzEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMDcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT19IV19ERVZJQ0VfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX0hXX0RFVklDRV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBdWRpb1N0cmVhbU91dDsKKworY2xhc3MgQXVkaW9Id0RldmljZSB7CitwdWJsaWM6CisgICAgZW51bSBGbGFncyB7CisgICAgICAgIEFIV0RfQ0FOX1NFVF9NQVNURVJfVk9MVU1FICA9IDB4MSwKKyAgICAgICAgQUhXRF9DQU5fU0VUX01BU1RFUl9NVVRFICAgID0gMHgyLAorICAgIH07CisKKyAgICBBdWRpb0h3RGV2aWNlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2R1bGVOYW1lLAorICAgICAgICAgICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlLAorICAgICAgICAgICAgICAgICAgRmxhZ3MgZmxhZ3MpCisgICAgICAgIDogbUhhbmRsZShoYW5kbGUpCisgICAgICAgICwgbU1vZHVsZU5hbWUoc3RyZHVwKG1vZHVsZU5hbWUpKQorICAgICAgICAsIG1Id0RldmljZShod0RldmljZSkKKyAgICAgICAgLCBtRmxhZ3MoZmxhZ3MpIHsgfQorICAgIHZpcnR1YWwgfkF1ZGlvSHdEZXZpY2UoKSB7IGZyZWUoKHZvaWQgKiltTW9kdWxlTmFtZSk7IH0KKworICAgIGJvb2wgY2FuU2V0TWFzdGVyVm9sdW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKDAgIT0gKG1GbGFncyAmIEFIV0RfQ0FOX1NFVF9NQVNURVJfVk9MVU1FKSk7CisgICAgfQorCisgICAgYm9vbCBjYW5TZXRNYXN0ZXJNdXRlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKDAgIT0gKG1GbGFncyAmIEFIV0RfQ0FOX1NFVF9NQVNURVJfTVVURSkpOworICAgIH0KKworICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUoKSBjb25zdCB7IHJldHVybiBtSGFuZGxlOyB9CisgICAgY29uc3QgY2hhciAqbW9kdWxlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1Nb2R1bGVOYW1lOyB9CisgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbUh3RGV2aWNlOyB9CisgICAgdWludDMyX3QgdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1Id0RldmljZS0+Y29tbW9uLnZlcnNpb247IH0KKworICAgIC8qKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4KKyAgICAgKiBUaGUgImFkZHJlc3MiIHBhcmFtZXRlciBxdWFsaWZpZXMgdGhlICJkZXZpY2VzIiBhdWRpbyBkZXZpY2UgdHlwZSBpZiBuZWVkZWQuCisgICAgICogVGhlIGZvcm1hdCBmb3JtYXQgZGVwZW5kcyBvbiB0aGUgZGV2aWNlIHR5cGU6CisgICAgICogLSBCbHVldG9vdGggZGV2aWNlcyB1c2UgdGhlIE1BQyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgaW4gdGhlIGZvcm0gIjAwOjExOjIyOkFBOkJCOkNDIgorICAgICAqIC0gVVNCIGRldmljZXMgdXNlIHRoZSBBTFNBIGNhcmQgYW5kIGRldmljZSBudW1iZXJzIGluIHRoZSBmb3JtICAiY2FyZD1YO2RldmljZT1ZIgorICAgICAqIC0gT3RoZXIgZGV2aWNlcyBtYXkgdXNlIGEgbnVtYmVyIG9yIGFueSBvdGhlciBzdHJpbmcuCisgICAgICovCisgICAgc3RhdHVzX3Qgb3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgIEF1ZGlvU3RyZWFtT3V0ICoqcHBTdHJlYW1PdXQsCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcyk7CisKK3ByaXZhdGU6CisgICAgY29uc3QgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1IYW5kbGU7CisgICAgY29uc3QgY2hhciAqIGNvbnN0ICAgICAgICAgIG1Nb2R1bGVOYW1lOworICAgIGF1ZGlvX2h3X2RldmljZV90ICogY29uc3QgICBtSHdEZXZpY2U7CisgICAgY29uc3QgRmxhZ3MgICAgICAgICAgICAgICAgIG1GbGFnczsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfQVVESU9fSFdfREVWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmNwcAppbmRleCBmZDI4ZWExLi44YTlhODM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuY3BwCkBAIC0zOSw5ICszOSw2IEBACiAjaW5jbHVkZSA8Y29tbW9uX3RpbWUvbG9jYWxfY2xvY2suaD4KICNpbmNsdWRlIDxjb21tb25fdGltZS9jY19oZWxwZXIuaD4KIAotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+Ci0jaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfZG93bm1peC5oPgotCiAjaW5jbHVkZSAiQXVkaW9NaXhlck9wcy5oIgogI2luY2x1ZGUgIkF1ZGlvTWl4ZXIuaCIKIApAQCAtNjksOSArNjYsMTYgQEAKICNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpL3NpemVvZigoeClbMF0pKQogI2VuZGlmCiAKLS8vIFNldCBrVXNlTmV3TWl4ZXIgdG8gdHJ1ZSB0byB1c2UgdGhlIG5ldyBtaXhlciBlbmdpbmUuIE90aGVyd2lzZSB0aGUKLS8vIG9yaWdpbmFsIGNvZGUgd2lsbCBiZSB1c2VkLiAgVGhpcyBpcyBmYWxzZSBmb3Igbm93Lgotc3RhdGljIGNvbnN0IGJvb2wga1VzZU5ld01peGVyID0gZmFsc2U7CisvLyBUT0RPOiBNb3ZlIHRoZXNlIG1hY3JvL2lubGluZXMgdG8gYSBoZWFkZXIgZmlsZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIGlubGluZQorVCBtYXgoY29uc3QgVCYgeCwgY29uc3QgVCYgeSkgeworICAgIHJldHVybiB4ID4geSA/IHggOiB5OworfQorCisvLyBTZXQga1VzZU5ld01peGVyIHRvIHRydWUgdG8gdXNlIHRoZSBuZXcgbWl4ZXIgZW5naW5lIGFsd2F5cy4gT3RoZXJ3aXNlIHRoZQorLy8gb3JpZ2luYWwgY29kZSB3aWxsIGJlIHVzZWQgZm9yIHN0ZXJlbyBzaW5rcywgdGhlIG5ldyBtaXhlciBmb3IgbXVsdGljaGFubmVsLgorc3RhdGljIGNvbnN0IGJvb2wga1VzZU5ld01peGVyID0gdHJ1ZTsKIAogLy8gU2V0IGtVc2VGbG9hdCB0byB0cnVlIHRvIGFsbG93IGZsb2F0aW5nIGlucHV0IGludG8gdGhlIG1peGVyIGVuZ2luZS4KIC8vIElmIGtVc2VOZXdNaXhlciBpcyBmYWxzZSwgdGhpcyBpcyBpZ25vcmVkIG9yIG1heSBiZSBvdmVycmlkZGVuIGludGVybmFsbHkKQEAgLTkxLDI4OCArOTUsNiBAQAogICAgIHJldHVybiBhIDwgYiA/IGEgOiBiOwogfQogCi1BdWRpb01peGVyOjpDb3B5QnVmZmVyUHJvdmlkZXI6OkNvcHlCdWZmZXJQcm92aWRlcihzaXplX3QgaW5wdXRGcmFtZVNpemUsCi0gICAgICAgIHNpemVfdCBvdXRwdXRGcmFtZVNpemUsIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KSA6Ci0gICAgICAgIG1JbnB1dEZyYW1lU2l6ZShpbnB1dEZyYW1lU2l6ZSksCi0gICAgICAgIG1PdXRwdXRGcmFtZVNpemUob3V0cHV0RnJhbWVTaXplKSwKLSAgICAgICAgbUxvY2FsQnVmZmVyRnJhbWVDb3VudChidWZmZXJGcmFtZUNvdW50KSwKLSAgICAgICAgbUxvY2FsQnVmZmVyRGF0YShOVUxMKSwKLSAgICAgICAgbUNvbnN1bWVkKDApCi17Ci0gICAgQUxPR1YoIkNvcHlCdWZmZXJQcm92aWRlciglcCkoJXp1LCAlenUsICV6dSkiLCB0aGlzLAotICAgICAgICAgICAgaW5wdXRGcmFtZVNpemUsIG91dHB1dEZyYW1lU2l6ZSwgYnVmZmVyRnJhbWVDb3VudCk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihpbnB1dEZyYW1lU2l6ZSA8IG91dHB1dEZyYW1lU2l6ZSAmJiBidWZmZXJGcmFtZUNvdW50ID09IDAsCi0gICAgICAgICAgICAiUmVxdWlyZXMgbG9jYWwgYnVmZmVyIGlmIGlucHV0RnJhbWVTaXplKCV6dSkgPCBvdXRwdXRGcmFtZVNpemUoJXp1KSIsCi0gICAgICAgICAgICBpbnB1dEZyYW1lU2l6ZSwgb3V0cHV0RnJhbWVTaXplKTsKLSAgICBpZiAobUxvY2FsQnVmZmVyRnJhbWVDb3VudCkgewotICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbUxvY2FsQnVmZmVyRGF0YSwgMzIsIG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQgKiBtT3V0cHV0RnJhbWVTaXplKTsKLSAgICB9Ci0gICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKLX0KLQotQXVkaW9NaXhlcjo6Q29weUJ1ZmZlclByb3ZpZGVyOjp+Q29weUJ1ZmZlclByb3ZpZGVyKCkKLXsKLSAgICBBTE9HVigifkNvcHlCdWZmZXJQcm92aWRlciglcCkiLCB0aGlzKTsKLSAgICBpZiAobUJ1ZmZlci5mcmFtZUNvdW50ICE9IDApIHsKLSAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOwotICAgIH0KLSAgICBmcmVlKG1Mb2NhbEJ1ZmZlckRhdGEpOwotfQotCi1zdGF0dXNfdCBBdWRpb01peGVyOjpDb3B5QnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyICpwQnVmZmVyLAotICAgICAgICBpbnQ2NF90IHB0cykKLXsKLSAgICAvL0FMT0dWKCJDb3B5QnVmZmVyUHJvdmlkZXIoJXApOjpnZXROZXh0QnVmZmVyKCVwICglenUpLCAlbGxkKSIsCi0gICAgLy8gICAgICAgIHRoaXMsIHBCdWZmZXIsIHBCdWZmZXItPmZyYW1lQ291bnQsIHB0cyk7Ci0gICAgaWYgKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQgPT0gMCkgewotICAgICAgICBzdGF0dXNfdCByZXMgPSBtVHJhY2tCdWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcihwQnVmZmVyLCBwdHMpOwotICAgICAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgICAgICBjb3B5RnJhbWVzKHBCdWZmZXItPnJhdywgcEJ1ZmZlci0+cmF3LCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLSAgICBpZiAobUJ1ZmZlci5mcmFtZUNvdW50ID09IDApIHsKLSAgICAgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gcEJ1ZmZlci0+ZnJhbWVDb3VudDsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gbVRyYWNrQnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJm1CdWZmZXIsIHB0cyk7Ci0gICAgICAgIC8vIEF0IG9uZSB0aW1lIGFuIHVwc3RyZWFtIGJ1ZmZlciBwcm92aWRlciBoYWQKLSAgICAgICAgLy8gcmVzID09IE9LIGFuZCBtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCwgZG9lc24ndCBzZWVtIHRvIGhhcHBlbiBub3cgNy8xOC8yMDE0LgotICAgICAgICAvLwotICAgICAgICAvLyBCeSBBUEkgc3BlYywgaWYgcmVzICE9IE9LLCB0aGVuIG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwLgotICAgICAgICAvLyBidXQgdGhlcmUgbWF5IGJlIGltcHJvcGVyIGltcGxlbWVudGF0aW9ucy4KLSAgICAgICAgQUxPR19BU1NFUlQocmVzID09IE9LIHx8IG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSyB8fCBtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCkgeyAvLyBub3QgbmVlZGVkIGJ5IEFQSSBzcGVjLCBidXQgdG8gYmUgc2FmZS4KLSAgICAgICAgICAgIHBCdWZmZXItPnJhdyA9IE5VTEw7Ci0gICAgICAgICAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKLSAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KLSAgICAgICAgbUNvbnN1bWVkID0gMDsKLSAgICB9Ci0gICAgQUxPR19BU1NFUlQobUNvbnN1bWVkIDwgbUJ1ZmZlci5mcmFtZUNvdW50KTsKLSAgICBzaXplX3QgY291bnQgPSBtaW4obUxvY2FsQnVmZmVyRnJhbWVDb3VudCwgbUJ1ZmZlci5mcmFtZUNvdW50IC0gbUNvbnN1bWVkKTsKLSAgICBjb3VudCA9IG1pbihjb3VudCwgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7Ci0gICAgcEJ1ZmZlci0+cmF3ID0gbUxvY2FsQnVmZmVyRGF0YTsKLSAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gY291bnQ7Ci0gICAgY29weUZyYW1lcyhwQnVmZmVyLT5yYXcsICh1aW50OF90KiltQnVmZmVyLnJhdyArIG1Db25zdW1lZCAqIG1JbnB1dEZyYW1lU2l6ZSwKLSAgICAgICAgICAgIHBCdWZmZXItPmZyYW1lQ291bnQpOwotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBBdWRpb01peGVyOjpDb3B5QnVmZmVyUHJvdmlkZXI6OnJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyICpwQnVmZmVyKQotewotICAgIC8vQUxPR1YoIkNvcHlCdWZmZXJQcm92aWRlciglcCk6OnJlbGVhc2VCdWZmZXIoJXAoJXp1KSkiLAotICAgIC8vICAgICAgICB0aGlzLCBwQnVmZmVyLCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKLSAgICBpZiAobUxvY2FsQnVmZmVyRnJhbWVDb3VudCA9PSAwKSB7Ci0gICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKHBCdWZmZXIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8vIExPR19BTFdBWVNfRkFUQUxfSUYocEJ1ZmZlci0+ZnJhbWVDb3VudCA9PSAwLCAiSW52YWxpZCBmcmFtZWNvdW50Iik7Ci0gICAgbUNvbnN1bWVkICs9IHBCdWZmZXItPmZyYW1lQ291bnQ7IC8vIFRPRE86IHVwZGF0ZSBmb3IgZWZmaWNpZW5jeSB0byByZXVzZSBleGlzdGluZyBjb250ZW50Ci0gICAgaWYgKG1Db25zdW1lZCAhPSAwICYmIG1Db25zdW1lZCA+PSBtQnVmZmVyLmZyYW1lQ291bnQpIHsKLSAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOwotICAgICAgICBBTE9HX0FTU0VSVChtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCk7Ci0gICAgfQotICAgIHBCdWZmZXItPnJhdyA9IE5VTEw7Ci0gICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7Ci19Ci0KLXZvaWQgQXVkaW9NaXhlcjo6Q29weUJ1ZmZlclByb3ZpZGVyOjpyZXNldCgpCi17Ci0gICAgaWYgKG1CdWZmZXIuZnJhbWVDb3VudCAhPSAwKSB7Ci0gICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZtQnVmZmVyKTsKLSAgICB9Ci0gICAgbUNvbnN1bWVkID0gMDsKLX0KLQotQXVkaW9NaXhlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKAotICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBpbnB1dENoYW5uZWxNYXNrLAotICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRwdXRDaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IHNlc3Npb25JZCwgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpIDoKLSAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKAotICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpICogYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGlucHV0Q2hhbm5lbE1hc2spLAotICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpICogYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG91dHB1dENoYW5uZWxNYXNrKSwKLSAgICAgICAgICAgIGJ1ZmZlckZyYW1lQ291bnQpICAvLyBzZXQgYnVmZmVyRnJhbWVDb3VudCB0byAwIHRvIGRvIGluLXBsYWNlCi17Ci0gICAgQUxPR1YoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCVwKSglI3gsICUjeCwgJSN4ICV1ICVkKSIsCi0gICAgICAgICAgICB0aGlzLCBpbnB1dENoYW5uZWxNYXNrLCBvdXRwdXRDaGFubmVsTWFzaywgZm9ybWF0LAotICAgICAgICAgICAgc2FtcGxlUmF0ZSwgc2Vzc2lvbklkKTsKLSAgICBpZiAoIXNJc011bHRpY2hhbm5lbENhcGFibGUKLSAgICAgICAgICAgIHx8IEVmZmVjdENyZWF0ZSgmc0R3bm1GeERlc2MudXVpZCwKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICBTRVNTSU9OX0lEX0lOVkFMSURfQU5EX0lHTk9SRUQsCi0gICAgICAgICAgICAgICAgICAgICZtRG93bm1peEhhbmRsZSkgIT0gMCkgewotICAgICAgICAgQUxPR0UoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkgZXJyb3IgY3JlYXRpbmcgZG93bm1peGVyIGVmZmVjdCIpOwotICAgICAgICAgbURvd25taXhIYW5kbGUgPSBOVUxMOwotICAgICAgICAgcmV0dXJuOwotICAgICB9Ci0gICAgIC8vIGNoYW5uZWwgaW5wdXQgY29uZmlndXJhdGlvbiB3aWxsIGJlIG92ZXJyaWRkZW4gcGVyLXRyYWNrCi0gICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gaW5wdXRDaGFubmVsTWFzazsgICAvLyBGSVhNRTogU2hvdWxkIGJlIGJpdHMKLSAgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gb3V0cHV0Q2hhbm5lbE1hc2s7IC8vIEZJWE1FOiBzaG91bGQgYmUgYml0cwotICAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBmb3JtYXQ7Ci0gICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBmb3JtYXQ7Ci0gICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHNhbXBsZVJhdGU7Ci0gICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSBzYW1wbGVSYXRlOwotICAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKLSAgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURTsKLSAgICAgLy8gaW5wdXQgYW5kIG91dHB1dCBidWZmZXIgcHJvdmlkZXIsIGFuZCBmcmFtZSBjb3VudCB3aWxsIG5vdCBiZSB1c2VkIGFzIHRoZSBkb3dubWl4IGVmZmVjdAotICAgICAvLyBwcm9jZXNzKCkgZnVuY3Rpb24gaXMgY2FsbGVkIGRpcmVjdGx5IChzZWUgRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoKSkKLSAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfU01QX1JBVEUgfCBFRkZFQ1RfQ09ORklHX0NIQU5ORUxTIHwKLSAgICAgICAgICAgICBFRkZFQ1RfQ09ORklHX0ZPUk1BVCB8IEVGRkVDVF9DT05GSUdfQUNDX01PREU7Ci0gICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5tYXNrID0gbURvd25taXhDb25maWcuaW5wdXRDZmcubWFzazsKLQotICAgICBpbnQgY21kU3RhdHVzOwotICAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YoaW50KTsKLQotICAgICAvLyBDb25maWd1cmUgZG93bm1peGVyCi0gICAgIHN0YXR1c190IHN0YXR1cyA9ICgqbURvd25taXhIYW5kbGUpLT5jb21tYW5kKG1Eb3dubWl4SGFuZGxlLAotICAgICAgICAgICAgIEVGRkVDVF9DTURfU0VUX0NPTkZJRyAvKmNtZENvZGUqLywgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgLypjbWRTaXplKi8sCi0gICAgICAgICAgICAgJm1Eb3dubWl4Q29uZmlnIC8qcENtZERhdGEqLywKLSAgICAgICAgICAgICAmcmVwbHlTaXplLCAmY21kU3RhdHVzIC8qcFJlcGx5RGF0YSovKTsKLSAgICAgaWYgKHN0YXR1cyAhPSAwIHx8IGNtZFN0YXR1cyAhPSAwKSB7Ci0gICAgICAgICBBTE9HRSgiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKSBlcnJvciAlZCBjbWRTdGF0dXMgJWQgd2hpbGUgY29uZmlndXJpbmcgZG93bm1peGVyIiwKLSAgICAgICAgICAgICAgICAgc3RhdHVzLCBjbWRTdGF0dXMpOwotICAgICAgICAgRWZmZWN0UmVsZWFzZShtRG93bm1peEhhbmRsZSk7Ci0gICAgICAgICBtRG93bm1peEhhbmRsZSA9IE5VTEw7Ci0gICAgICAgICByZXR1cm47Ci0gICAgIH0KLQotICAgICAvLyBFbmFibGUgZG93bm1peGVyCi0gICAgIHJlcGx5U2l6ZSA9IHNpemVvZihpbnQpOwotICAgICBzdGF0dXMgPSAoKm1Eb3dubWl4SGFuZGxlKS0+Y29tbWFuZChtRG93bm1peEhhbmRsZSwKLSAgICAgICAgICAgICBFRkZFQ1RfQ01EX0VOQUJMRSAvKmNtZENvZGUqLywgMCAvKmNtZFNpemUqLywgTlVMTCAvKnBDbWREYXRhKi8sCi0gICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJmNtZFN0YXR1cyAvKnBSZXBseURhdGEqLyk7Ci0gICAgIGlmIChzdGF0dXMgIT0gMCB8fCBjbWRTdGF0dXMgIT0gMCkgewotICAgICAgICAgQUxPR0UoIkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkgZXJyb3IgJWQgY21kU3RhdHVzICVkIHdoaWxlIGVuYWJsaW5nIGRvd25taXhlciIsCi0gICAgICAgICAgICAgICAgIHN0YXR1cywgY21kU3RhdHVzKTsKLSAgICAgICAgIEVmZmVjdFJlbGVhc2UobURvd25taXhIYW5kbGUpOwotICAgICAgICAgbURvd25taXhIYW5kbGUgPSBOVUxMOwotICAgICAgICAgcmV0dXJuOwotICAgICB9Ci0KLSAgICAgLy8gU2V0IGRvd25taXggdHlwZQotICAgICAvLyBwYXJhbWV0ZXIgc2l6ZSByb3VuZGVkIGZvciBwYWRkaW5nIG9uIDMyYml0IGJvdW5kYXJ5Ci0gICAgIGNvbnN0IGludCBwc2l6ZVBhZGRlZCA9ICgoc2l6ZW9mKGRvd25taXhfcGFyYW1zX3QpIC0gMSkvc2l6ZW9mKGludCkgKyAxKSAqIHNpemVvZihpbnQpOwotICAgICBjb25zdCBpbnQgZG93bm1peFBhcmFtU2l6ZSA9Ci0gICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSArIHBzaXplUGFkZGVkICsgc2l6ZW9mKGRvd25taXhfdHlwZV90KTsKLSAgICAgZWZmZWN0X3BhcmFtX3QgKiBjb25zdCBwYXJhbSA9IChlZmZlY3RfcGFyYW1fdCAqKSBtYWxsb2MoZG93bm1peFBhcmFtU2l6ZSk7Ci0gICAgIHBhcmFtLT5wc2l6ZSA9IHNpemVvZihkb3dubWl4X3BhcmFtc190KTsKLSAgICAgY29uc3QgZG93bm1peF9wYXJhbXNfdCBkb3dubWl4UGFyYW0gPSBET1dOTUlYX1BBUkFNX1RZUEU7Ci0gICAgIG1lbWNweShwYXJhbS0+ZGF0YSwgJmRvd25taXhQYXJhbSwgcGFyYW0tPnBzaXplKTsKLSAgICAgY29uc3QgZG93bm1peF90eXBlX3QgZG93bm1peFR5cGUgPSBET1dOTUlYX1RZUEVfRk9MRDsKLSAgICAgcGFyYW0tPnZzaXplID0gc2l6ZW9mKGRvd25taXhfdHlwZV90KTsKLSAgICAgbWVtY3B5KHBhcmFtLT5kYXRhICsgcHNpemVQYWRkZWQsICZkb3dubWl4VHlwZSwgcGFyYW0tPnZzaXplKTsKLSAgICAgcmVwbHlTaXplID0gc2l6ZW9mKGludCk7Ci0gICAgIHN0YXR1cyA9ICgqbURvd25taXhIYW5kbGUpLT5jb21tYW5kKG1Eb3dubWl4SGFuZGxlLAotICAgICAgICAgICAgIEVGRkVDVF9DTURfU0VUX1BBUkFNIC8qIGNtZENvZGUgKi8sIGRvd25taXhQYXJhbVNpemUgLyogY21kU2l6ZSAqLywKLSAgICAgICAgICAgICBwYXJhbSAvKnBDbWREYXRhKi8sICZyZXBseVNpemUsICZjbWRTdGF0dXMgLypwUmVwbHlEYXRhKi8pOwotICAgICBmcmVlKHBhcmFtKTsKLSAgICAgaWYgKHN0YXR1cyAhPSAwIHx8IGNtZFN0YXR1cyAhPSAwKSB7Ci0gICAgICAgICBBTE9HRSgiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKSBlcnJvciAlZCBjbWRTdGF0dXMgJWQgd2hpbGUgc2V0dGluZyBkb3dubWl4IHR5cGUiLAotICAgICAgICAgICAgICAgICBzdGF0dXMsIGNtZFN0YXR1cyk7Ci0gICAgICAgICBFZmZlY3RSZWxlYXNlKG1Eb3dubWl4SGFuZGxlKTsKLSAgICAgICAgIG1Eb3dubWl4SGFuZGxlID0gTlVMTDsKLSAgICAgICAgIHJldHVybjsKLSAgICAgfQotICAgICBBTE9HVigiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKSBkb3dubWl4IHR5cGUgc2V0IHRvICVkIiwgKGludCkgZG93bm1peFR5cGUpOwotfQotCi1BdWRpb01peGVyOjpEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6fkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCkKLXsKLSAgICBBTE9HVigifkRvd25taXhlckJ1ZmZlclByb3ZpZGVyICglcCkiLCB0aGlzKTsKLSAgICBFZmZlY3RSZWxlYXNlKG1Eb3dubWl4SGFuZGxlKTsKLSAgICBtRG93bm1peEhhbmRsZSA9IE5VTEw7Ci19Ci0KLXZvaWQgQXVkaW9NaXhlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpCi17Ci0gICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZXM7Ci0gICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuYnVmZmVyLnJhdyA9IGNvbnN0X2Nhc3Q8dm9pZCAqPihzcmMpOwotICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5idWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lczsKLSAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdyA9IGRzdDsKLSAgICAvLyBtYXkgYmUgaW4tcGxhY2UgaWYgc3JjID09IGRzdC4KLSAgICBzdGF0dXNfdCByZXMgPSAoKm1Eb3dubWl4SGFuZGxlKS0+cHJvY2VzcyhtRG93bm1peEhhbmRsZSwKLSAgICAgICAgICAgICZtRG93bm1peENvbmZpZy5pbnB1dENmZy5idWZmZXIsICZtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYnVmZmVyKTsKLSAgICBBTE9HRV9JRihyZXMgIT0gT0ssICJEb3dubWl4QnVmZmVyUHJvdmlkZXIgZXJyb3IgJWQiLCByZXMpOwotfQotCi0vKiBjYWxsIG9uY2UgaW4gYSBwdGhyZWFkX29uY2UgaGFuZGxlci4gKi8KLS8qc3RhdGljKi8gc3RhdHVzX3QgQXVkaW9NaXhlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OmluaXQoKQotewotICAgIC8vIGZpbmQgbXVsdGljaGFubmVsIGRvd25taXggZWZmZWN0IGlmIHdlIGhhdmUgdG8gcGxheSBtdWx0aWNoYW5uZWwgY29udGVudAotICAgIHVpbnQzMl90IG51bUVmZmVjdHMgPSAwOwotICAgIGludCByZXQgPSBFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMoJm51bUVmZmVjdHMpOwotICAgIGlmIChyZXQgIT0gMCkgewotICAgICAgICBBTE9HRSgiQXVkaW9NaXhlcigpIGVycm9yICVkIHF1ZXJ5aW5nIG51bWJlciBvZiBlZmZlY3RzIiwgcmV0KTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIEFMT0dWKCJFZmZlY3RRdWVyeU51bWJlckVmZmVjdHMoKSBudW1FZmZlY3RzPSVkIiwgbnVtRWZmZWN0cyk7Ci0KLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwIDsgaSA8IG51bUVmZmVjdHMgOyBpKyspIHsKLSAgICAgICAgaWYgKEVmZmVjdFF1ZXJ5RWZmZWN0KGksICZzRHdubUZ4RGVzYykgPT0gMCkgewotICAgICAgICAgICAgQUxPR1YoImVmZmVjdCAlZCBpcyBjYWxsZWQgJXMiLCBpLCBzRHdubUZ4RGVzYy5uYW1lKTsKLSAgICAgICAgICAgIGlmIChtZW1jbXAoJnNEd25tRnhEZXNjLnR5cGUsIEVGRkVDVF9VSUlEX0RPV05NSVgsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBlZmZlY3QgXCIlc1wiIGZyb20gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgc0R3bm1GeERlc2MubmFtZSwgc0R3bm1GeERlc2MuaW1wbGVtZW50b3IpOwotICAgICAgICAgICAgICAgIHNJc011bHRpY2hhbm5lbENhcGFibGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dXX0lGKCFzSXNNdWx0aWNoYW5uZWxDYXBhYmxlLCAidW5hYmxlIHRvIGZpbmQgZG93bm1peCBlZmZlY3QiKTsKLSAgICByZXR1cm4gTk9fSU5JVDsKLX0KLQotLypzdGF0aWMqLyBib29sIEF1ZGlvTWl4ZXI6OkRvd25taXhlckJ1ZmZlclByb3ZpZGVyOjpzSXNNdWx0aWNoYW5uZWxDYXBhYmxlID0gZmFsc2U7Ci0vKnN0YXRpYyovIGVmZmVjdF9kZXNjcmlwdG9yX3QgQXVkaW9NaXhlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OnNEd25tRnhEZXNjOwotCi1BdWRpb01peGVyOjpSZW1peEJ1ZmZlclByb3ZpZGVyOjpSZW1peEJ1ZmZlclByb3ZpZGVyKGF1ZGlvX2NoYW5uZWxfbWFza190IGlucHV0Q2hhbm5lbE1hc2ssCi0gICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dHB1dENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KSA6Ci0gICAgICAgIENvcHlCdWZmZXJQcm92aWRlcigKLSAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkKLSAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soaW5wdXRDaGFubmVsTWFzayksCi0gICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpCi0gICAgICAgICAgICAgICAgICAgICogYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG91dHB1dENoYW5uZWxNYXNrKSwKLSAgICAgICAgICAgICAgICBidWZmZXJGcmFtZUNvdW50KSwKLSAgICAgICAgbUZvcm1hdChmb3JtYXQpLAotICAgICAgICBtU2FtcGxlU2l6ZShhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkpLAotICAgICAgICBtSW5wdXRDaGFubmVscyhhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soaW5wdXRDaGFubmVsTWFzaykpLAotICAgICAgICBtT3V0cHV0Q2hhbm5lbHMoYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG91dHB1dENoYW5uZWxNYXNrKSkKLXsKLSAgICBBTE9HVigiUmVtaXhCdWZmZXJQcm92aWRlciglcCkoJSN4LCAlI3gsICUjeCkgJXp1ICV6dSIsCi0gICAgICAgICAgICB0aGlzLCBmb3JtYXQsIGlucHV0Q2hhbm5lbE1hc2ssIG91dHB1dENoYW5uZWxNYXNrLAotICAgICAgICAgICAgbUlucHV0Q2hhbm5lbHMsIG1PdXRwdXRDaGFubmVscyk7Ci0gICAgLy8gVE9ETzogY29uc2lkZXIgY2hhbm5lbCByZXByZXNlbnRhdGlvbiBpbiBpbmRleCBhcnJheSBmb3JtdWxhdGlvbgotICAgIC8vIFdlIGlnbm9yZSBjaGFubmVsIHJlcHJlc2VudGF0aW9uLCBhbmQganVzdCB1c2UgdGhlIGJpdHMuCi0gICAgbWVtY3B5X2J5X2luZGV4X2FycmF5X2luaXRpYWxpemF0aW9uKG1JZHhBcnksIEFSUkFZX1NJWkUobUlkeEFyeSksCi0gICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMob3V0cHV0Q2hhbm5lbE1hc2spLAotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGlucHV0Q2hhbm5lbE1hc2spKTsKLX0KLQotdm9pZCBBdWRpb01peGVyOjpSZW1peEJ1ZmZlclByb3ZpZGVyOjpjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKQotewotICAgIG1lbWNweV9ieV9pbmRleF9hcnJheShkc3QsIG1PdXRwdXRDaGFubmVscywKLSAgICAgICAgICAgIHNyYywgbUlucHV0Q2hhbm5lbHMsIG1JZHhBcnksIG1TYW1wbGVTaXplLCBmcmFtZXMpOwotfQotCi1BdWRpb01peGVyOjpSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOjpSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKGludDMyX3QgY2hhbm5lbHMsCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGlucHV0Rm9ybWF0LCBhdWRpb19mb3JtYXRfdCBvdXRwdXRGb3JtYXQsCi0gICAgICAgIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KSA6Ci0gICAgICAgIENvcHlCdWZmZXJQcm92aWRlcigKLSAgICAgICAgICAgIGNoYW5uZWxzICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShpbnB1dEZvcm1hdCksCi0gICAgICAgICAgICBjaGFubmVscyAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUob3V0cHV0Rm9ybWF0KSwKLSAgICAgICAgICAgIGJ1ZmZlckZyYW1lQ291bnQpLAotICAgICAgICBtQ2hhbm5lbHMoY2hhbm5lbHMpLAotICAgICAgICBtSW5wdXRGb3JtYXQoaW5wdXRGb3JtYXQpLAotICAgICAgICBtT3V0cHV0Rm9ybWF0KG91dHB1dEZvcm1hdCkKLXsKLSAgICBBTE9HVigiUmVmb3JtYXRCdWZmZXJQcm92aWRlciglcCkoJWQsICUjeCwgJSN4KSIsIHRoaXMsIGNoYW5uZWxzLCBpbnB1dEZvcm1hdCwgb3V0cHV0Rm9ybWF0KTsKLX0KLQotdm9pZCBBdWRpb01peGVyOjpSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOjpjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKQotewotICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoZHN0LCBtT3V0cHV0Rm9ybWF0LCBzcmMsIG1JbnB1dEZvcm1hdCwgZnJhbWVzICogbUNoYW5uZWxzKTsKLX0KLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBFbnN1cmUgbUNvbmZpZ3VyZWROYW1lcyBiaXRtYXNrIGlzIGluaXRpYWxpemVkIHByb3Blcmx5IG9uIGFsbCBhcmNoaXRlY3R1cmVzLgpAQCAtNDA3LDYgKzEyOSw3IEBACiAgICAgICAgIHQtPnJlc2FtcGxlciA9IE5VTEw7CiAgICAgICAgIHQtPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKICAgICAgICAgdC0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgPSBOVUxMOworICAgICAgICB0LT5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlciA9IE5VTEw7CiAgICAgICAgIHQrKzsKICAgICB9CiAKQEAgLTQxOSw2ICsxNDIsNyBAQAogICAgICAgICBkZWxldGUgdC0+cmVzYW1wbGVyOwogICAgICAgICBkZWxldGUgdC0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXI7CiAgICAgICAgIGRlbGV0ZSB0LT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlcjsKKyAgICAgICAgZGVsZXRlIHQtPm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOwogICAgICAgICB0Kys7CiAgICAgfQogICAgIGRlbGV0ZSBbXSBtU3RhdGUub3V0cHV0VGVtcDsKQEAgLTQzMCw2ICsxNTQsMTAgQEAKICAgICBtU3RhdGUubUxvZyA9IGxvZzsKIH0KIAorc3RhdGljIGlubGluZSBhdWRpb19mb3JtYXRfdCBzZWxlY3RNaXhlckluRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGlucHV0Rm9ybWF0IF9fdW51c2VkKSB7CisgICAgcmV0dXJuIGtVc2VGbG9hdCAmJiBrVXNlTmV3TWl4ZXIgPyBBVURJT19GT1JNQVRfUENNX0ZMT0FUIDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Cit9CisKIGludCBBdWRpb01peGVyOjpnZXRUcmFja05hbWUoYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IHNlc3Npb25JZCkKIHsKQEAgLTQ5MiwyNCArMjIwLDI1IEBACiAgICAgICAgIHQtPm1JbnB1dEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKICAgICAgICAgdC0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgPSBOVUxMOwogICAgICAgICB0LT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IE5VTEw7CisgICAgICAgIHQtPm1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgPSBOVUxMOworICAgICAgICB0LT5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlciA9IE5VTEw7CiAgICAgICAgIHQtPm1NaXhlckZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgICAgICB0LT5tRm9ybWF0ID0gZm9ybWF0OwotICAgICAgICB0LT5tTWl4ZXJJbkZvcm1hdCA9IGtVc2VGbG9hdCAmJiBrVXNlTmV3TWl4ZXIKLSAgICAgICAgICAgICAgICA/IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQgOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICAgICAgdC0+bU1peGVySW5Gb3JtYXQgPSBzZWxlY3RNaXhlckluRm9ybWF0KGZvcm1hdCk7CisgICAgICAgIHQtPm1Eb3dubWl4UmVxdWlyZXNGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsgLy8gbm8gZm9ybWF0IHJlcXVpcmVkCiAgICAgICAgIHQtPm1NaXhlckNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9tYXNrX2Zyb21fcmVwcmVzZW50YXRpb25fYW5kX2JpdHMoCiAgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9QT1NJVElPTiwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKICAgICAgICAgdC0+bU1peGVyQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHQtPm1NaXhlckNoYW5uZWxNYXNrKTsKKyAgICAgICAgdC0+bVBsYXliYWNrUmF0ZSA9IEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVDsKICAgICAgICAgLy8gQ2hlY2sgdGhlIGRvd25taXhpbmcgKG9yIHVwbWl4aW5nKSByZXF1aXJlbWVudHMuCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGluaXRUcmFja0Rvd25taXgodCwgbik7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHQtPnByZXBhcmVGb3JEb3dubWl4KCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJBdWRpb01peGVyOjpnZXRUcmFja05hbWUgaW52YWxpZCBjaGFubmVsTWFzayAoJSN4KSIsIGNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotICAgICAgICAvLyBpbml0VHJhY2tEb3dubWl4KCkgbWF5IGNoYW5nZSB0aGUgaW5wdXQgZm9ybWF0IHJlcXVpcmVtZW50LgotICAgICAgICAvLyBJZiB5b3UgZGVzaXJlIGZsb2F0aW5nIHBvaW50IGlucHV0IHRvIHRoZSBtaXhlciwgaXQgbWF5IGNoYW5nZQotICAgICAgICAvLyB0byBpbnRlZ2VyIGJlY2F1c2UgdGhlIGRvd25taXhlciByZXF1aXJlcyBpbnRlZ2VyIHRvIHByb2Nlc3MuCisgICAgICAgIC8vIHByZXBhcmVGb3JEb3dubWl4KCkgbWF5IGNoYW5nZSBtRG93bm1peFJlcXVpcmVzRm9ybWF0CiAgICAgICAgIEFMT0dWVigibU1peGVyRm9ybWF0OiUjeCAgbU1peGVySW5Gb3JtYXQ6JSN4XG4iLCB0LT5tTWl4ZXJGb3JtYXQsIHQtPm1NaXhlckluRm9ybWF0KTsKLSAgICAgICAgcHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQodCwgbik7CisgICAgICAgIHQtPnByZXBhcmVGb3JSZWZvcm1hdCgpOwogICAgICAgICBtVHJhY2tOYW1lcyB8PSAxIDw8IG47CiAgICAgICAgIHJldHVybiBUUkFDSzAgKyBuOwogICAgIH0KQEAgLTUyNiw3ICsyNTUsNyBAQAogIH0KIAogLy8gQ2FsbGVkIHdoZW4gY2hhbm5lbCBtYXNrcyBoYXZlIGNoYW5nZWQgZm9yIGEgdHJhY2sgbmFtZQotLy8gVE9ETzogRml4IERvd25taXhidWZmZXJwcm9maWRlciBub3QgdG8gKHBvc3NpYmx5KSBjaGFuZ2UgbWl4ZXIgaW5wdXQgZm9ybWF0LAorLy8gVE9ETzogRml4IERvd25taXhlckJ1ZmZlclByb3ZpZGVyIG5vdCB0byAocG9zc2libHkpIGNoYW5nZSBtaXhlciBpbnB1dCBmb3JtYXQsCiAvLyB3aGljaCB3aWxsIHNpbXBsaWZ5IHRoaXMgbG9naWMuCiBib29sIEF1ZGlvTWl4ZXI6OnNldENoYW5uZWxNYXNrcyhpbnQgbmFtZSwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdHJhY2tDaGFubmVsTWFzaywgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWl4ZXJDaGFubmVsTWFzaykgewpAQCAtNTUxLDIxICsyODAsMTggQEAKIAogICAgIC8vIGNoYW5uZWwgbWFza3MgaGF2ZSBjaGFuZ2VkLCBkb2VzIHRoaXMgdHJhY2sgbmVlZCBhIGRvd25taXhlcj8KICAgICAvLyB1cGRhdGUgdG8gdHJ5IHVzaW5nIG91ciBkZXNpcmVkIGZvcm1hdCAoaWYgd2UgYXJlbid0IGFscmVhZHkgdXNpbmcgaXQpCi0gICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgcHJldk1peGVySW5Gb3JtYXQgPSB0cmFjay5tTWl4ZXJJbkZvcm1hdDsKLSAgICB0cmFjay5tTWl4ZXJJbkZvcm1hdCA9IGtVc2VGbG9hdCAmJiBrVXNlTmV3TWl4ZXIKLSAgICAgICAgICAgID8gQVVESU9fRk9STUFUX1BDTV9GTE9BVCA6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwotICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IGluaXRUcmFja0Rvd25taXgoJm1TdGF0ZS50cmFja3NbbmFtZV0sIG5hbWUpOworICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IHByZXZEb3dubWl4ZXJGb3JtYXQgPSB0cmFjay5tRG93bm1peFJlcXVpcmVzRm9ybWF0OworICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IG1TdGF0ZS50cmFja3NbbmFtZV0ucHJlcGFyZUZvckRvd25taXgoKTsKICAgICBBTE9HRV9JRihzdGF0dXMgIT0gT0ssCi0gICAgICAgICAgICAiaW5pdFRyYWNrRG93bm1peCBlcnJvciAlZCwgdHJhY2sgY2hhbm5lbCBtYXNrICUjeCwgbWl4ZXIgY2hhbm5lbCBtYXNrICUjeCIsCisgICAgICAgICAgICAicHJlcGFyZUZvckRvd25taXggZXJyb3IgJWQsIHRyYWNrIGNoYW5uZWwgbWFzayAlI3gsIG1peGVyIGNoYW5uZWwgbWFzayAlI3giLAogICAgICAgICAgICAgc3RhdHVzLCB0cmFjay5jaGFubmVsTWFzaywgdHJhY2subU1peGVyQ2hhbm5lbE1hc2spOwogCi0gICAgY29uc3QgYm9vbCBtaXhlckluRm9ybWF0Q2hhbmdlZCA9IHByZXZNaXhlckluRm9ybWF0ICE9IHRyYWNrLm1NaXhlckluRm9ybWF0OwotICAgIGlmIChtaXhlckluRm9ybWF0Q2hhbmdlZCkgewotICAgICAgICBwcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCgmdHJhY2ssIG5hbWUpOyAvLyBiZWNhdXNlIG9mIGRvd25taXhlciwgdHJhY2sgZm9ybWF0IG1heSBjaGFuZ2UhCisgICAgaWYgKHByZXZEb3dubWl4ZXJGb3JtYXQgIT0gdHJhY2subURvd25taXhSZXF1aXJlc0Zvcm1hdCkgeworICAgICAgICB0cmFjay5wcmVwYXJlRm9yUmVmb3JtYXQoKTsgLy8gYmVjYXVzZSBvZiBkb3dubWl4ZXIsIHRyYWNrIGZvcm1hdCBtYXkgY2hhbmdlIQogICAgIH0KIAotICAgIGlmICh0cmFjay5yZXNhbXBsZXIgJiYgKG1peGVySW5Gb3JtYXRDaGFuZ2VkIHx8IG1peGVyQ2hhbm5lbENvdW50Q2hhbmdlZCkpIHsKLSAgICAgICAgLy8gcmVzYW1wbGVyIGlucHV0IGZvcm1hdCBvciBjaGFubmVscyBtYXkgaGF2ZSBjaGFuZ2VkLgorICAgIGlmICh0cmFjay5yZXNhbXBsZXIgJiYgbWl4ZXJDaGFubmVsQ291bnRDaGFuZ2VkKSB7CisgICAgICAgIC8vIHJlc2FtcGxlciBjaGFubmVscyBtYXkgaGF2ZSBjaGFuZ2VkLgogICAgICAgICBjb25zdCB1aW50MzJfdCByZXNldFRvU2FtcGxlUmF0ZSA9IHRyYWNrLnNhbXBsZVJhdGU7CiAgICAgICAgIGRlbGV0ZSB0cmFjay5yZXNhbXBsZXI7CiAgICAgICAgIHRyYWNrLnJlc2FtcGxlciA9IE5VTEw7CkBAIC01NzYsOTkgKzMwMiwxMjkgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdHVzX3QgQXVkaW9NaXhlcjo6aW5pdFRyYWNrRG93bm1peCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUpCi17Ci0gICAgLy8gT25seSByZW1peCAodXBtaXggb3IgZG93bm1peCkgaWYgdGhlIHRyYWNrIGFuZCBtaXhlci9kZXZpY2UgY2hhbm5lbCBtYXNrcwotICAgIC8vIGFyZSBub3QgdGhlIHNhbWUgYW5kIG5vdCBoYW5kbGVkIGludGVybmFsbHksIGFzIG1vbm8gLT4gc3RlcmVvIGN1cnJlbnRseSBpcy4KLSAgICBpZiAocFRyYWNrLT5jaGFubmVsTWFzayAhPSBwVHJhY2stPm1NaXhlckNoYW5uZWxNYXNrCi0gICAgICAgICAgICAmJiAhKHBUcmFjay0+Y2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTwotICAgICAgICAgICAgICAgICAgICAmJiBwVHJhY2stPm1NaXhlckNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykpIHsKLSAgICAgICAgcmV0dXJuIHByZXBhcmVUcmFja0ZvckRvd25taXgocFRyYWNrLCB0cmFja05hbWUpOwotICAgIH0KLSAgICAvLyBubyByZW1peCBuZWNlc3NhcnkKLSAgICB1bnByZXBhcmVUcmFja0ZvckRvd25taXgocFRyYWNrLCB0cmFja05hbWUpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KK3ZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfdDo6dW5wcmVwYXJlRm9yRG93bm1peCgpIHsKKyAgICBBTE9HVigiQXVkaW9NaXhlcjo6dW5wcmVwYXJlRm9yRG93bm1peCglcCkiLCB0aGlzKTsKIAotdm9pZCBBdWRpb01peGVyOjp1bnByZXBhcmVUcmFja0ZvckRvd25taXgodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOYW1lIF9fdW51c2VkKSB7Ci0gICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnVucHJlcGFyZVRyYWNrRm9yRG93bm1peCglZCkiLCB0cmFja05hbWUpOwotCi0gICAgaWYgKHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgeworICAgIG1Eb3dubWl4UmVxdWlyZXNGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICBpZiAoZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgewogICAgICAgICAvLyB0aGlzIHRyYWNrIGhhZCBwcmV2aW91c2x5IGJlZW4gY29uZmlndXJlZCB3aXRoIGEgZG93bm1peGVyLCBkZWxldGUgaXQKICAgICAgICAgQUxPR1YoIiBkZWxldGluZyBvbGQgZG93bm1peGVyIik7Ci0gICAgICAgIGRlbGV0ZSBwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyOwotICAgICAgICBwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKLSAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMocFRyYWNrKTsKKyAgICAgICAgZGVsZXRlIGRvd25taXhlckJ1ZmZlclByb3ZpZGVyOworICAgICAgICBkb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IE5VTEw7CisgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoIiBub3RoaW5nIHRvIGRvLCBubyBkb3dubWl4ZXIgdG8gZGVsZXRlIik7CiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb01peGVyOjpwcmVwYXJlVHJhY2tGb3JEb3dubWl4KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTmFtZSkKK3N0YXR1c190IEF1ZGlvTWl4ZXI6OnRyYWNrX3Q6OnByZXBhcmVGb3JEb3dubWl4KCkKIHsKLSAgICBBTE9HVigiQXVkaW9NaXhlcjo6cHJlcGFyZVRyYWNrRm9yRG93bm1peCglZCkgd2l0aCBtYXNrIDB4JXgiLCB0cmFja05hbWUsIHBUcmFjay0+Y2hhbm5lbE1hc2spOworICAgIEFMT0dWKCJBdWRpb01peGVyOjpwcmVwYXJlRm9yRG93bm1peCglcCkgd2l0aCBtYXNrIDB4JXgiLAorICAgICAgICAgICAgdGhpcywgY2hhbm5lbE1hc2spOwogCiAgICAgLy8gZGlzY2FyZCB0aGUgcHJldmlvdXMgZG93bm1peGVyIGlmIHRoZXJlIHdhcyBvbmUKLSAgICB1bnByZXBhcmVUcmFja0ZvckRvd25taXgocFRyYWNrLCB0cmFja05hbWUpOwotICAgIGlmIChEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6aXNNdWx0aWNoYW5uZWxDYXBhYmxlKCkpIHsKLSAgICAgICAgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIqIHBEYnAgPSBuZXcgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIocFRyYWNrLT5jaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBwVHJhY2stPm1NaXhlckNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIC8qIFRPRE86IHVzZSBwVHJhY2stPm1NaXhlckluRm9ybWF0LCBub3cgb25seSBQQ00gMTYgKi8sCi0gICAgICAgICAgICAgICAgcFRyYWNrLT5zYW1wbGVSYXRlLCBwVHJhY2stPnNlc3Npb25JZCwga0NvcHlCdWZmZXJGcmFtZUNvdW50KTsKKyAgICB1bnByZXBhcmVGb3JEb3dubWl4KCk7CisgICAgLy8gTU9OT19IQUNLIE9ubHkgcmVtaXggKHVwbWl4IG9yIGRvd25taXgpIGlmIHRoZSB0cmFjayBhbmQgbWl4ZXIvZGV2aWNlIGNoYW5uZWwgbWFza3MKKyAgICAvLyBhcmUgbm90IHRoZSBzYW1lIGFuZCBub3QgaGFuZGxlZCBpbnRlcm5hbGx5LCBhcyBtb25vIC0+IHN0ZXJlbyBjdXJyZW50bHkgaXMuCisgICAgaWYgKGNoYW5uZWxNYXNrID09IG1NaXhlckNoYW5uZWxNYXNrCisgICAgICAgICAgICB8fCAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTworICAgICAgICAgICAgICAgICAgICAmJiBtTWl4ZXJDaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pKSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgLy8gRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgaXMgb25seSB1c2VkIGZvciBwb3NpdGlvbiBtYXNrcy4KKyAgICBpZiAoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihjaGFubmVsTWFzaykKKyAgICAgICAgICAgICAgICA9PSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX1BPU0lUSU9OCisgICAgICAgICAgICAmJiBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6aXNNdWx0aWNoYW5uZWxDYXBhYmxlKCkpIHsKKyAgICAgICAgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIqIHBEYnAgPSBuZXcgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgbU1peGVyQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgLyogVE9ETzogdXNlIG1NaXhlckluRm9ybWF0LCBub3cgb25seSBQQ00gMTYgKi8sCisgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgc2Vzc2lvbklkLCBrQ29weUJ1ZmZlckZyYW1lQ291bnQpOwogCiAgICAgICAgIGlmIChwRGJwLT5pc1ZhbGlkKCkpIHsgLy8gaWYgY29uc3RydWN0b3IgY29tcGxldGVkIHByb3Blcmx5Ci0gICAgICAgICAgICBwVHJhY2stPm1NaXhlckluRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7IC8vIFBDTSAxNiBiaXQgcmVxdWlyZWQgZm9yIGRvd25taXgKLSAgICAgICAgICAgIHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgPSBwRGJwOwotICAgICAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMocFRyYWNrKTsKKyAgICAgICAgICAgIG1Eb3dubWl4UmVxdWlyZXNGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsgLy8gUENNIDE2IGJpdCByZXF1aXJlZCBmb3IgZG93bm1peAorICAgICAgICAgICAgZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgPSBwRGJwOworICAgICAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogICAgICAgICBkZWxldGUgcERicDsKICAgICB9CiAKICAgICAvLyBFZmZlY3QgZG93bm1peGVyIGRvZXMgbm90IGFjY2VwdCB0aGUgY2hhbm5lbCBjb252ZXJzaW9uLiAgTGV0J3MgdXNlIG91ciByZW1peGVyLgotICAgIFJlbWl4QnVmZmVyUHJvdmlkZXIqIHBSYnAgPSBuZXcgUmVtaXhCdWZmZXJQcm92aWRlcihwVHJhY2stPmNoYW5uZWxNYXNrLAotICAgICAgICAgICAgcFRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzaywgcFRyYWNrLT5tTWl4ZXJJbkZvcm1hdCwga0NvcHlCdWZmZXJGcmFtZUNvdW50KTsKKyAgICBSZW1peEJ1ZmZlclByb3ZpZGVyKiBwUmJwID0gbmV3IFJlbWl4QnVmZmVyUHJvdmlkZXIoY2hhbm5lbE1hc2ssCisgICAgICAgICAgICBtTWl4ZXJDaGFubmVsTWFzaywgbU1peGVySW5Gb3JtYXQsIGtDb3B5QnVmZmVyRnJhbWVDb3VudCk7CiAgICAgLy8gUmVtaXggYWx3YXlzIGZpbmRzIGEgY29udmVyc2lvbiB3aGVyZWFzIERvd25taXhlciBlZmZlY3QgYWJvdmUgbWF5IGZhaWwuCi0gICAgcFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IHBSYnA7Ci0gICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMocFRyYWNrKTsKKyAgICBkb3dubWl4ZXJCdWZmZXJQcm92aWRlciA9IHBSYnA7CisgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXZvaWQgQXVkaW9NaXhlcjo6dW5wcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUgX191bnVzZWQpIHsKLSAgICBBTE9HVigiQXVkaW9NaXhlcjo6dW5wcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCglZCkiLCB0cmFja05hbWUpOwotICAgIGlmIChwVHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIHBUcmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7Ci0gICAgICAgIHBUcmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgPSBOVUxMOwotICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycyhwVHJhY2spOwordm9pZCBBdWRpb01peGVyOjp0cmFja190Ojp1bnByZXBhcmVGb3JSZWZvcm1hdCgpIHsKKyAgICBBTE9HVigiQXVkaW9NaXhlcjo6dW5wcmVwYXJlRm9yUmVmb3JtYXQoJXApIiwgdGhpcyk7CisgICAgYm9vbCByZXF1aXJlc1JlY29uZmlndXJlID0gZmFsc2U7CisgICAgaWYgKG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOworICAgICAgICBtUmVmb3JtYXRCdWZmZXJQcm92aWRlciA9IE5VTEw7CisgICAgICAgIHJlcXVpcmVzUmVjb25maWd1cmUgPSB0cnVlOworICAgIH0KKyAgICBpZiAobVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOworICAgICAgICBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKKyAgICAgICAgcmVxdWlyZXNSZWNvbmZpZ3VyZSA9IHRydWU7CisgICAgfQorICAgIGlmIChyZXF1aXJlc1JlY29uZmlndXJlKSB7CisgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb01peGVyOjpwcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUpCitzdGF0dXNfdCBBdWRpb01peGVyOjp0cmFja190OjpwcmVwYXJlRm9yUmVmb3JtYXQoKQogewotICAgIEFMT0dWKCJBdWRpb01peGVyOjpwcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCglZCkgd2l0aCBmb3JtYXQgJSN4IiwgdHJhY2tOYW1lLCBwVHJhY2stPm1Gb3JtYXQpOwotICAgIC8vIGRpc2NhcmQgdGhlIHByZXZpb3VzIHJlZm9ybWF0dGVyIGlmIHRoZXJlIHdhcyBvbmUKLSAgICB1bnByZXBhcmVUcmFja0ZvclJlZm9ybWF0KHBUcmFjaywgdHJhY2tOYW1lKTsKLSAgICAvLyBvbmx5IGNvbmZpZ3VyZSByZWZvcm1hdHRlciBpZiBuZWVkZWQKLSAgICBpZiAocFRyYWNrLT5tRm9ybWF0ICE9IHBUcmFjay0+bU1peGVySW5Gb3JtYXQpIHsKLSAgICAgICAgcFRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlciA9IG5ldyBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKAotICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwVHJhY2stPmNoYW5uZWxNYXNrKSwKLSAgICAgICAgICAgICAgICBwVHJhY2stPm1Gb3JtYXQsIHBUcmFjay0+bU1peGVySW5Gb3JtYXQsCisgICAgQUxPR1YoIkF1ZGlvTWl4ZXI6OnByZXBhcmVGb3JSZWZvcm1hdCglcCkgd2l0aCBmb3JtYXQgJSN4IiwgdGhpcywgbUZvcm1hdCk7CisgICAgLy8gZGlzY2FyZCBwcmV2aW91cyByZWZvcm1hdHRlcnMKKyAgICB1bnByZXBhcmVGb3JSZWZvcm1hdCgpOworICAgIC8vIG9ubHkgY29uZmlndXJlIHJlZm9ybWF0dGVycyBhcyBuZWVkZWQKKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCB0YXJnZXRGb3JtYXQgPSBtRG93bm1peFJlcXVpcmVzRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElECisgICAgICAgICAgICA/IG1Eb3dubWl4UmVxdWlyZXNGb3JtYXQgOiBtTWl4ZXJJbkZvcm1hdDsKKyAgICBib29sIHJlcXVpcmVzUmVjb25maWd1cmUgPSBmYWxzZTsKKyAgICBpZiAobUZvcm1hdCAhPSB0YXJnZXRGb3JtYXQpIHsKKyAgICAgICAgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgPSBuZXcgUmVmb3JtYXRCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spLAorICAgICAgICAgICAgICAgIG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgdGFyZ2V0Rm9ybWF0LAogICAgICAgICAgICAgICAgIGtDb3B5QnVmZmVyRnJhbWVDb3VudCk7Ci0gICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKHBUcmFjayk7CisgICAgICAgIHJlcXVpcmVzUmVjb25maWd1cmUgPSB0cnVlOworICAgIH0KKyAgICBpZiAodGFyZ2V0Rm9ybWF0ICE9IG1NaXhlckluRm9ybWF0KSB7CisgICAgICAgIG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgPSBuZXcgUmVmb3JtYXRCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobU1peGVyQ2hhbm5lbE1hc2spLAorICAgICAgICAgICAgICAgIHRhcmdldEZvcm1hdCwKKyAgICAgICAgICAgICAgICBtTWl4ZXJJbkZvcm1hdCwKKyAgICAgICAgICAgICAgICBrQ29weUJ1ZmZlckZyYW1lQ291bnQpOworICAgICAgICByZXF1aXJlc1JlY29uZmlndXJlID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHJlcXVpcmVzUmVjb25maWd1cmUpIHsKKyAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi12b2lkIEF1ZGlvTWl4ZXI6OnJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKHRyYWNrX3QqIHBUcmFjaykKK3ZvaWQgQXVkaW9NaXhlcjo6dHJhY2tfdDo6cmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKQogewotICAgIHBUcmFjay0+YnVmZmVyUHJvdmlkZXIgPSBwVHJhY2stPm1JbnB1dEJ1ZmZlclByb3ZpZGVyOwotICAgIGlmIChwVHJhY2stPm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKSB7Ci0gICAgICAgIHBUcmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKHBUcmFjay0+YnVmZmVyUHJvdmlkZXIpOwotICAgICAgICBwVHJhY2stPmJ1ZmZlclByb3ZpZGVyID0gcFRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlcjsKKyAgICBidWZmZXJQcm92aWRlciA9IG1JbnB1dEJ1ZmZlclByb3ZpZGVyOworICAgIGlmIChtUmVmb3JtYXRCdWZmZXJQcm92aWRlcikgeworICAgICAgICBtUmVmb3JtYXRCdWZmZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIoYnVmZmVyUHJvdmlkZXIpOworICAgICAgICBidWZmZXJQcm92aWRlciA9IG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOwogICAgIH0KLSAgICBpZiAocFRyYWNrLT5kb3dubWl4ZXJCdWZmZXJQcm92aWRlcikgewotICAgICAgICBwVHJhY2stPmRvd25taXhlckJ1ZmZlclByb3ZpZGVyLT5zZXRCdWZmZXJQcm92aWRlcihwVHJhY2stPmJ1ZmZlclByb3ZpZGVyKTsKLSAgICAgICAgcFRyYWNrLT5idWZmZXJQcm92aWRlciA9IHBUcmFjay0+ZG93bm1peGVyQnVmZmVyUHJvdmlkZXI7CisgICAgaWYgKGRvd25taXhlckJ1ZmZlclByb3ZpZGVyKSB7CisgICAgICAgIGRvd25taXhlckJ1ZmZlclByb3ZpZGVyLT5zZXRCdWZmZXJQcm92aWRlcihidWZmZXJQcm92aWRlcik7CisgICAgICAgIGJ1ZmZlclByb3ZpZGVyID0gZG93bm1peGVyQnVmZmVyUHJvdmlkZXI7CisgICAgfQorICAgIGlmIChtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyKSB7CisgICAgICAgIG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKGJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgYnVmZmVyUHJvdmlkZXIgPSBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOworICAgIH0KKyAgICBpZiAobVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIpIHsKKyAgICAgICAgbVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKGJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgYnVmZmVyUHJvdmlkZXIgPSBtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjsKICAgICB9CiB9CiAKQEAgLTY4NywxMCArNDQzLDEyIEBACiAgICAgZGVsZXRlIHRyYWNrLnJlc2FtcGxlcjsKICAgICB0cmFjay5yZXNhbXBsZXIgPSBOVUxMOwogICAgIC8vIGRlbGV0ZSB0aGUgZG93bm1peGVyCi0gICAgdW5wcmVwYXJlVHJhY2tGb3JEb3dubWl4KCZtU3RhdGUudHJhY2tzW25hbWVdLCBuYW1lKTsKKyAgICBtU3RhdGUudHJhY2tzW25hbWVdLnVucHJlcGFyZUZvckRvd25taXgoKTsKICAgICAvLyBkZWxldGUgdGhlIHJlZm9ybWF0dGVyCi0gICAgdW5wcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCgmbVN0YXRlLnRyYWNrc1tuYW1lXSwgbmFtZSk7Ci0KKyAgICBtU3RhdGUudHJhY2tzW25hbWVdLnVucHJlcGFyZUZvclJlZm9ybWF0KCk7CisgICAgLy8gZGVsZXRlIHRoZSB0aW1lc3RyZXRjaCBwcm92aWRlcgorICAgIGRlbGV0ZSB0cmFjay5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjsKKyAgICB0cmFjay5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlciA9IE5VTEw7CiAgICAgbVRyYWNrTmFtZXMgJj0gfigxPDxuYW1lKTsKIH0KIApAQCAtNzQ4LDQxICs1MDYsOTkgQEAKIHN0YXRpYyBpbmxpbmUgYm9vbCBzZXRWb2x1bWVSYW1wVmFyaWFibGVzKGZsb2F0IG5ld1ZvbHVtZSwgaW50MzJfdCByYW1wLAogICAgICAgICBpbnQxNl90ICpwSW50U2V0Vm9sdW1lLCBpbnQzMl90ICpwSW50UHJldlZvbHVtZSwgaW50MzJfdCAqcEludFZvbHVtZUluYywKICAgICAgICAgZmxvYXQgKnBTZXRWb2x1bWUsIGZsb2F0ICpwUHJldlZvbHVtZSwgZmxvYXQgKnBWb2x1bWVJbmMpIHsKKyAgICAvLyBjaGVjayBmbG9hdGluZyBwb2ludCB2b2x1bWUgdG8gc2VlIGlmIGl0IGlzIGlkZW50aWNhbCB0byB0aGUgcHJldmlvdXNseQorICAgIC8vIHNldCB2b2x1bWUuCisgICAgLy8gV2UgZG8gbm90IHVzZSBhIHRvbGVyYW5jZSBoZXJlIChhbmQgcmVqZWN0IGNoYW5nZXMgdG9vIHNtYWxsKQorICAgIC8vIGFzIGl0IG1heSBiZSBjb25mdXNpbmcgdG8gdXNlIGEgZGlmZmVyZW50IHZhbHVlIHRoYW4gdGhlIG9uZSBzZXQuCisgICAgLy8gSWYgdGhlIHJlc3VsdGluZyB2b2x1bWUgaXMgdG9vIHNtYWxsIHRvIHJhbXAsIGl0IGlzIGEgZGlyZWN0IHNldCBvZiB0aGUgdm9sdW1lLgogICAgIGlmIChuZXdWb2x1bWUgPT0gKnBTZXRWb2x1bWUpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICAvKiBzZXQgdGhlIGZsb2F0aW5nIHBvaW50IHZvbHVtZSB2YXJpYWJsZXMgKi8KLSAgICBpZiAocmFtcCAhPSAwKSB7Ci0gICAgICAgICpwVm9sdW1lSW5jID0gKG5ld1ZvbHVtZSAtICpwU2V0Vm9sdW1lKSAvIHJhbXA7Ci0gICAgICAgICpwUHJldlZvbHVtZSA9ICpwU2V0Vm9sdW1lOworICAgIGlmIChuZXdWb2x1bWUgPCAwKSB7CisgICAgICAgIG5ld1ZvbHVtZSA9IDA7IC8vIHNob3VsZCBub3QgaGF2ZSBuZWdhdGl2ZSB2b2x1bWVzCiAgICAgfSBlbHNlIHsKLSAgICAgICAgKnBWb2x1bWVJbmMgPSAwOwotICAgICAgICAqcFByZXZWb2x1bWUgPSBuZXdWb2x1bWU7CisgICAgICAgIHN3aXRjaCAoZnBjbGFzc2lmeShuZXdWb2x1bWUpKSB7CisgICAgICAgIGNhc2UgRlBfU1VCTk9STUFMOgorICAgICAgICBjYXNlIEZQX05BTjoKKyAgICAgICAgICAgIG5ld1ZvbHVtZSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGUF9aRVJPOgorICAgICAgICAgICAgYnJlYWs7IC8vIHplcm8gdm9sdW1lIGlzIGZpbmUKKyAgICAgICAgY2FzZSBGUF9JTkZJTklURToKKyAgICAgICAgICAgIC8vIEluZmluaXRlIHZvbHVtZSBjb3VsZCBiZSBoYW5kbGVkIGNvbnNpc3RlbnRseSBzaW5jZQorICAgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgbWF0aCBzYXR1cmF0ZXMgYXQgaW5maW5pdGllcywKKyAgICAgICAgICAgIC8vIGJ1dCB3ZSBsaW1pdCB2b2x1bWUgdG8gdW5pdHkgZ2FpbiBmbG9hdC4KKyAgICAgICAgICAgIC8vIHJhbXAgPSAwOyBicmVhazsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBuZXdWb2x1bWUgPSBBdWRpb01peGVyOjpVTklUWV9HQUlOX0ZMT0FUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRlBfTk9STUFMOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gRmxvYXRpbmcgcG9pbnQgZG9lcyBub3QgaGF2ZSBwcm9ibGVtcyB3aXRoIG92ZXJmbG93IHdyYXAKKyAgICAgICAgICAgIC8vIHRoYXQgaW50ZWdlciBoYXMuICBIb3dldmVyLCB3ZSBsaW1pdCB0aGUgdm9sdW1lIHRvCisgICAgICAgICAgICAvLyB1bml0eSBnYWluIGhlcmUuCisgICAgICAgICAgICAvLyBUT0RPOiBSZXZpc2l0IHRoZSB2b2x1bWUgbGltaXRhdGlvbiBhbmQgcGVyaGFwcyBwYXJhbWV0ZXJpemUuCisgICAgICAgICAgICBpZiAobmV3Vm9sdW1lID4gQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9GTE9BVCkgeworICAgICAgICAgICAgICAgIG5ld1ZvbHVtZSA9IEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgIH0KLSAgICAqcFNldFZvbHVtZSA9IG5ld1ZvbHVtZTsKIAotICAgIC8qIHNldCB0aGUgbGVnYWN5IGludGVnZXIgdm9sdW1lIHZhcmlhYmxlcyAqLwotICAgIGludDMyX3QgaW50Vm9sdW1lID0gbmV3Vm9sdW1lICogQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9JTlQ7Ci0gICAgaWYgKGludFZvbHVtZSA+IEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fSU5UKSB7Ci0gICAgICAgIGludFZvbHVtZSA9IEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fSU5UOwotICAgIH0gZWxzZSBpZiAoaW50Vm9sdW1lIDwgMCkgewotICAgICAgICBBTE9HRSgibmVnYXRpdmUgdm9sdW1lICUuN2ciLCBuZXdWb2x1bWUpOwotICAgICAgICBpbnRWb2x1bWUgPSAwOyAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgZm9yIHNhZmV0eSBjaGVjay4KKyAgICAvLyBzZXQgZmxvYXRpbmcgcG9pbnQgdm9sdW1lIHJhbXAKKyAgICBpZiAocmFtcCAhPSAwKSB7CisgICAgICAgIC8vIHdoZW4gdGhlIHJhbXAgY29tcGxldGVzLCAqcFByZXZWb2x1bWUgaXMgc2V0IHRvICpwU2V0Vm9sdW1lLCBzbyB0aGVyZQorICAgICAgICAvLyBpcyBubyBjb21wdXRhdGlvbmFsIG1pc21hdGNoOyBoZW5jZSBlcXVhbGl0eSBpcyBjaGVja2VkIGhlcmUuCisgICAgICAgIEFMT0dEX0lGKCpwUHJldlZvbHVtZSAhPSAqcFNldFZvbHVtZSwgInByZXZpb3VzIGZsb2F0IHJhbXAgaGFzbid0IGZpbmlzaGVkLCIKKyAgICAgICAgICAgICAgICAiIHByZXY6JWYgIHNldF90bzolZiIsICpwUHJldlZvbHVtZSwgKnBTZXRWb2x1bWUpOworICAgICAgICBjb25zdCBmbG9hdCBpbmMgPSAobmV3Vm9sdW1lIC0gKnBQcmV2Vm9sdW1lKSAvIHJhbXA7IC8vIGNvdWxkIGJlIGluZiwgbmFuLCBzdWJub3JtYWwKKyAgICAgICAgY29uc3QgZmxvYXQgbWF4diA9IG1heChuZXdWb2x1bWUsICpwUHJldlZvbHVtZSk7IC8vIGNvdWxkIGJlIGluZiwgY2Fubm90IGJlIG5hbiwgc3Vibm9ybWFsCisKKyAgICAgICAgaWYgKGlzbm9ybWFsKGluYykgLy8gaW5jIG11c3QgYmUgYSBub3JtYWwgbnVtYmVyIChubyBzdWJub3JtYWxzLCBpbmZpbml0ZSwgbmFuKQorICAgICAgICAgICAgICAgICYmIG1heHYgKyBpbmMgIT0gbWF4dikgeyAvLyBpbmMgbXVzdCBtYWtlIGZvcndhcmQgcHJvZ3Jlc3MKKyAgICAgICAgICAgICpwVm9sdW1lSW5jID0gaW5jOworICAgICAgICAgICAgLy8gcmFtcCBpcyBzZXQgbm93LgorICAgICAgICAgICAgLy8gTm90ZTogaWYgbmV3Vm9sdW1lIGlzIDAsIHRoZW4gbmVhciB0aGUgZW5kIG9mIHRoZSByYW1wLAorICAgICAgICAgICAgLy8gaXQgbWF5IGJlIHBvc3NpYmxlIHRoYXQgdGhlIHJhbXBlZCB2b2x1bWUgbWF5IGJlIHN1Ym5vcm1hbCBvcgorICAgICAgICAgICAgLy8gdGVtcG9yYXJpbHkgbmVnYXRpdmUgYnkgYSBzbWFsbCBhbW91bnQgb3Igc3Vibm9ybWFsIGR1ZSB0byBmbG9hdGluZworICAgICAgICAgICAgLy8gcG9pbnQgaW5hY2N1cmFjaWVzLgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmFtcCA9IDA7IC8vIHJhbXAgbm90IGFsbG93ZWQKKyAgICAgICAgfQogICAgIH0KLSAgICBpZiAoaW50Vm9sdW1lID09ICpwSW50U2V0Vm9sdW1lKSB7Ci0gICAgICAgICpwSW50Vm9sdW1lSW5jID0gMDsKLSAgICAgICAgLyogVE9ETzogaW50ZWdlci9mbG9hdCB3b3JrYXJvdW5kOiBpZ25vcmUgZmxvYXRpbmcgdm9sdW1lIHJhbXAgKi8KKworICAgIC8vIGNvbXB1dGUgYW5kIGNoZWNrIGludGVnZXIgdm9sdW1lLCBubyBuZWVkIHRvIGNoZWNrIG5lZ2F0aXZlIHZhbHVlcworICAgIC8vIFRoZSBpbnRlZ2VyIHZvbHVtZSBpcyBsaW1pdGVkIHRvICJ1bml0eV9nYWluIiB0byBhdm9pZCB3cmFwcGluZyBhbmQgb3RoZXIKKyAgICAvLyBhdWRpbyBhcnRpZmFjdHMsIHNvIGl0IG5ldmVyIHJlYWNoZXMgdGhlIHJhbmdlIGxpbWl0IG9mIFU0LjI4LgorICAgIC8vIFdlIHNhZmVseSB1c2Ugc2lnbmVkIDE2IGFuZCAzMiBiaXQgaW50ZWdlcnMgaGVyZS4KKyAgICBjb25zdCBmbG9hdCBzY2FsZWRWb2x1bWUgPSBuZXdWb2x1bWUgKiBBdWRpb01peGVyOjpVTklUWV9HQUlOX0lOVDsgLy8gbm90IG5lZywgc3Vibm9ybWFsLCBuYW4KKyAgICBjb25zdCBpbnQzMl90IGludFZvbHVtZSA9IChzY2FsZWRWb2x1bWUgPj0gKGZsb2F0KUF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fSU5UKSA/CisgICAgICAgICAgICBBdWRpb01peGVyOjpVTklUWV9HQUlOX0lOVCA6IChpbnQzMl90KXNjYWxlZFZvbHVtZTsKKworICAgIC8vIHNldCBpbnRlZ2VyIHZvbHVtZSByYW1wCisgICAgaWYgKHJhbXAgIT0gMCkgeworICAgICAgICAvLyBpbnRlZ2VyIHZvbHVtZSBpcyBVNC4xMiAodG8gdXNlIDE2IGJpdCBtdWx0aXBsaWVzKSwgYnV0IHJhbXBpbmcgdXNlcyBVNC4yOC4KKyAgICAgICAgLy8gd2hlbiB0aGUgcmFtcCBjb21wbGV0ZXMsICpwSW50UHJldlZvbHVtZSBpcyBzZXQgdG8gKnBJbnRTZXRWb2x1bWUgPDwgMTYsIHNvIHRoZXJlCisgICAgICAgIC8vIGlzIG5vIGNvbXB1dGF0aW9uYWwgbWlzbWF0Y2g7IGhlbmNlIGVxdWFsaXR5IGlzIGNoZWNrZWQgaGVyZS4KKyAgICAgICAgQUxPR0RfSUYoKnBJbnRQcmV2Vm9sdW1lICE9ICpwSW50U2V0Vm9sdW1lIDw8IDE2LCAicHJldmlvdXMgaW50IHJhbXAgaGFzbid0IGZpbmlzaGVkLCIKKyAgICAgICAgICAgICAgICAiIHByZXY6JWQgIHNldF90bzolZCIsICpwSW50UHJldlZvbHVtZSwgKnBJbnRTZXRWb2x1bWUgPDwgMTYpOworICAgICAgICBjb25zdCBpbnQzMl90IGluYyA9ICgoaW50Vm9sdW1lIDw8IDE2KSAtICpwSW50UHJldlZvbHVtZSkgLyByYW1wOworCisgICAgICAgIGlmIChpbmMgIT0gMCkgeyAvLyBpbmMgbXVzdCBtYWtlIGZvcndhcmQgcHJvZ3Jlc3MKKyAgICAgICAgICAgICpwSW50Vm9sdW1lSW5jID0gaW5jOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmFtcCA9IDA7IC8vIHJhbXAgbm90IGFsbG93ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGlmIG5vIHJhbXAsIG9yIHJhbXAgbm90IGFsbG93ZWQsIHRoZW4gY2xlYXIgZmxvYXQgYW5kIGludGVnZXIgaW5jcmVtZW50cworICAgIGlmIChyYW1wID09IDApIHsKICAgICAgICAgKnBWb2x1bWVJbmMgPSAwOwogICAgICAgICAqcFByZXZWb2x1bWUgPSBuZXdWb2x1bWU7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAocmFtcCAhPSAwKSB7Ci0gICAgICAgICpwSW50Vm9sdW1lSW5jID0gKChpbnRWb2x1bWUgLSAqcEludFNldFZvbHVtZSkgPDwgMTYpIC8gcmFtcDsKLSAgICAgICAgKnBJbnRQcmV2Vm9sdW1lID0gKCpwSW50Vm9sdW1lSW5jID09IDAgPyBpbnRWb2x1bWUgOiAqcEludFNldFZvbHVtZSkgPDwgMTY7Ci0gICAgfSBlbHNlIHsKICAgICAgICAgKnBJbnRWb2x1bWVJbmMgPSAwOwogICAgICAgICAqcEludFByZXZWb2x1bWUgPSBpbnRWb2x1bWUgPDwgMTY7CiAgICAgfQorICAgICpwU2V0Vm9sdW1lID0gbmV3Vm9sdW1lOwogICAgICpwSW50U2V0Vm9sdW1lID0gaW50Vm9sdW1lOwogICAgIHJldHVybiB0cnVlOwogfQpAQCAtODI4LDcgKzY0NCw3IEBACiAgICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpLCAiSW52YWxpZCBmb3JtYXQgJSN4IiwgZm9ybWF0KTsKICAgICAgICAgICAgICAgICB0cmFjay5tRm9ybWF0ID0gZm9ybWF0OwogICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIEZPUk1BVCwgJSN4KSIsIGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgcHJlcGFyZVRyYWNrRm9yUmVmb3JtYXQoJnRyYWNrLCBuYW1lKTsKKyAgICAgICAgICAgICAgICB0cmFjay5wcmVwYXJlRm9yUmVmb3JtYXQoKTsKICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlU3RhdGUoMSA8PCBuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gYnJlYWs7CkBAIC05MTIsNiArNzI4LDI4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVElNRVNUUkVUQ0g6CisgICAgICAgICAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1JBVEU6IHsKKyAgICAgICAgICAgICAgICBjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAqcGxheWJhY2tSYXRlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXVkaW9QbGF5YmFja1JhdGUqPih2YWx1ZSk7CisgICAgICAgICAgICAgICAgQUxPR1dfSUYoIWlzQXVkaW9QbGF5YmFja1JhdGVWYWxpZCgqcGxheWJhY2tSYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJiYWQgcGFyYW1ldGVycyBzcGVlZCAlZiwgcGl0Y2ggJWYiLHBsYXliYWNrUmF0ZS0+bVNwZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tSYXRlLT5tUGl0Y2gpOworICAgICAgICAgICAgICAgIGlmICh0cmFjay5zZXRQbGF5YmFja1JhdGUoKnBsYXliYWNrUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUSU1FU1RSRVRDSCwgUExBWUJBQ0tfUkFURSwgU1RSRVRDSF9NT0RFLCBGQUxMQkFDS19NT0RFICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWYgJWYgJWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS0+bVNwZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS0+bVBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS0+bVN0cmV0Y2hNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS0+bUZhbGxiYWNrTW9kZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIGludmFsaWRhdGVTdGF0ZSgxIDw8IG5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInNldFBhcmFtZXRlciB0aW1lc3RyZXRjaDogYmFkIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAKICAgICBkZWZhdWx0OgogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJzZXRQYXJhbWV0ZXI6IGJhZCB0YXJnZXQgJWQiLCB0YXJnZXQpOwpAQCAtOTMxLDExICs3NjksMTAgQEAKICAgICAgICAgICAgICAgICAvLyBGSVhNRSB0aGlzIGlzIGZsYXdlZCBmb3IgZHluYW1pYyBzYW1wbGUgcmF0ZXMsIGFzIHdlIGNob29zZSB0aGUgcmVzYW1wbGVyCiAgICAgICAgICAgICAgICAgLy8gcXVhbGl0eSBsZXZlbCBiYXNlZCBvbiB0aGUgaW5pdGlhbCByYXRpbywgYnV0IHRoYXQgY291bGQgY2hhbmdlIGxhdGVyLgogICAgICAgICAgICAgICAgIC8vIFNob3VsZCBoYXZlIGEgd2F5IHRvIGRpc3Rpbmd1aXNoIHRyYWNrcyB3aXRoIHN0YXRpYyByYXRpb3MgdnMuIGR5bmFtaWMgcmF0aW9zLgotICAgICAgICAgICAgICAgIGlmICghKCh0cmFja1NhbXBsZVJhdGUgPT0gNDQxMDAgJiYgZGV2U2FtcGxlUmF0ZSA9PSA0ODAwMCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAodHJhY2tTYW1wbGVSYXRlID09IDQ4MDAwICYmIGRldlNhbXBsZVJhdGUgPT0gNDQxMDApKSkgewotICAgICAgICAgICAgICAgICAgICBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChpc011c2ljUmF0ZSh0cmFja1NhbXBsZVJhdGUpKSB7CiAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkgPSBBdWRpb1Jlc2FtcGxlcjo6REVGQVVMVF9RVUFMSVRZOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkgPSBBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSBNT05PX0hBQ0suIFJlc2FtcGxlciBzZWVzICNjaGFubmVscyBhZnRlciB0aGUgZG93bm1peGVyCkBAIC05NTcsNiArNzk0LDMwIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIEF1ZGlvTWl4ZXI6OnRyYWNrX3Q6OnNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKQoreworICAgIGlmICgobVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIgPT0gTlVMTCAmJgorICAgICAgICAgICAgZmFicyhwbGF5YmFja1JhdGUubVNwZWVkIC0gbVBsYXliYWNrUmF0ZS5tU3BlZWQpIDwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOX0RFTFRBICYmCisgICAgICAgICAgICBmYWJzKHBsYXliYWNrUmF0ZS5tUGl0Y2ggLSBtUGxheWJhY2tSYXRlLm1QaXRjaCkgPCBBVURJT19USU1FU1RSRVRDSF9QSVRDSF9NSU5fREVMVEEpIHx8CisgICAgICAgICAgICBpc0F1ZGlvUGxheWJhY2tSYXRlRXF1YWwocGxheWJhY2tSYXRlLCBtUGxheWJhY2tSYXRlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1QbGF5YmFja1JhdGUgPSBwbGF5YmFja1JhdGU7CisgICAgaWYgKG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyID09IE5VTEwpIHsKKyAgICAgICAgLy8gVE9ETzogUmVtb3ZlIE1PTk9fSEFDSy4gUmVzYW1wbGVyIHNlZXMgI2NoYW5uZWxzIGFmdGVyIHRoZSBkb3dubWl4ZXIKKyAgICAgICAgLy8gYnV0IGlmIG5vbmUgZXhpc3RzLCBpdCBpcyB0aGUgY2hhbm5lbCBjb3VudCAoMSBmb3IgbW9ubykuCisgICAgICAgIGNvbnN0IGludCB0aW1lc3RyZXRjaENoYW5uZWxDb3VudCA9IGRvd25taXhlckJ1ZmZlclByb3ZpZGVyICE9IE5VTEwKKyAgICAgICAgICAgICAgICA/IG1NaXhlckNoYW5uZWxDb3VudCA6IGNoYW5uZWxDb3VudDsKKyAgICAgICAgbVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIgPSBuZXcgVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcih0aW1lc3RyZXRjaENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICBtTWl4ZXJJbkZvcm1hdCwgc2FtcGxlUmF0ZSwgcGxheWJhY2tSYXRlKTsKKyAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZWludGVycHJldF9jYXN0PFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIqPihtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcikKKyAgICAgICAgICAgICAgICAtPnNldFBsYXliYWNrUmF0ZShwbGF5YmFja1JhdGUpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogLyogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgdm9sdW1lIHJhbXAgaGFzIGNvbXBsZXRlZCBhbmQgY2xlYXJzIHRoZSBpbmNyZW1lbnQKICAqIHZhcmlhYmxlcyBhcHByb3ByaWF0ZWx5LgogICoKQEAgLTk3NCw3ICs4MzUsOCBAQAogewogICAgIGlmICh1c2VGbG9hdCkgewogICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgTUFYX05VTV9WT0xVTUVTOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtVm9sdW1lSW5jW2ldICE9IDAgJiYgZmFicyhtVm9sdW1lW2ldIC0gbVByZXZWb2x1bWVbaV0pIDw9IGZhYnMobVZvbHVtZUluY1tpXSkpIHsKKyAgICAgICAgICAgIGlmICgobVZvbHVtZUluY1tpXSA+IDAgJiYgbVByZXZWb2x1bWVbaV0gKyBtVm9sdW1lSW5jW2ldID49IG1Wb2x1bWVbaV0pIHx8CisgICAgICAgICAgICAgICAgICAgICAobVZvbHVtZUluY1tpXSA8IDAgJiYgbVByZXZWb2x1bWVbaV0gKyBtVm9sdW1lSW5jW2ldIDw9IG1Wb2x1bWVbaV0pKSB7CiAgICAgICAgICAgICAgICAgdm9sdW1lSW5jW2ldID0gMDsKICAgICAgICAgICAgICAgICBwcmV2Vm9sdW1lW2ldID0gdm9sdW1lW2ldIDw8IDE2OwogICAgICAgICAgICAgICAgIG1Wb2x1bWVJbmNbaV0gPSAwLjsKQEAgLTEwMzIsMTAgKzg5NCwxNSBAQAogICAgIGlmIChtU3RhdGUudHJhY2tzW25hbWVdLm1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKICAgICAgICAgbVN0YXRlLnRyYWNrc1tuYW1lXS5tUmVmb3JtYXRCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKICAgICB9IGVsc2UgaWYgKG1TdGF0ZS50cmFja3NbbmFtZV0uZG93bm1peGVyQnVmZmVyUHJvdmlkZXIgIT0gTlVMTCkgeworICAgICAgICBtU3RhdGUudHJhY2tzW25hbWVdLmRvd25taXhlckJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOworICAgIH0gZWxzZSBpZiAobVN0YXRlLnRyYWNrc1tuYW1lXS5tUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyICE9IE5VTEwpIHsKKyAgICAgICAgbVN0YXRlLnRyYWNrc1tuYW1lXS5tUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOworICAgIH0gZWxzZSBpZiAobVN0YXRlLnRyYWNrc1tuYW1lXS5tVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlciAhPSBOVUxMKSB7CisgICAgICAgIG1TdGF0ZS50cmFja3NbbmFtZV0ubVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CiAgICAgfQogCiAgICAgbVN0YXRlLnRyYWNrc1tuYW1lXS5tSW5wdXRCdWZmZXJQcm92aWRlciA9IGJ1ZmZlclByb3ZpZGVyOwotICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCZtU3RhdGUudHJhY2tzW25hbWVdKTsKKyAgICBtU3RhdGUudHJhY2tzW25hbWVdLnJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CiB9CiAKIApAQCAtMTExNCw3ICs5ODEsOCBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoKG4gJiBORUVEU19DSEFOTkVMX0NPVU5UX19NQVNLKSA9PSBORUVEU19DSEFOTkVMXzEpewogICAgICAgICAgICAgICAgICAgICB0Lmhvb2sgPSBnZXRUcmFja0hvb2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5tTWl4ZXJDaGFubmVsQ291bnQgPT0gMiAvLyBUT0RPOiBNT05PX0hBQ0suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQubU1peGVyQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPICAvLyBUT0RPOiBNT05PX0hBQ0sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHQuY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBUUkFDS1RZUEVfTk9SRVNBTVBMRU1PTk8gOiBUUkFDS1RZUEVfTk9SRVNBTVBMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm1NaXhlckNoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm1NaXhlckluRm9ybWF0LCB0Lm1NaXhlckZvcm1hdCk7CkBAIC0yMjM2LDQgKzIxMDQsNCBAQAogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyLmgKaW5kZXggZjRmMTQyYi4uNzE2NWM2YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlci5oCkBAIC0yMywxMiArMjMsMTQgQEAKIAogI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CTG9nLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvQ29tcGF0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogCiAjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXIuaCIKKyNpbmNsdWRlICJCdWZmZXJQcm92aWRlcnMuaCIKIAogLy8gRklYTUUgVGhpcyBpcyBhY3R1YWxseSB1bml0eSBnYWluLCB3aGljaCBtaWdodCBub3QgYmUgbWF4IGluIGZ1dHVyZSwgZXhwcmVzc2VkIGluIFUuMTIKICNkZWZpbmUgTUFYX0dBSU5fSU5UIEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fSU5UCkBAIC03Miw2ICs3NCw3IEBACiAgICAgICAgIFJFU0FNUExFICAgICAgICA9IDB4MzAwMSwKICAgICAgICAgUkFNUF9WT0xVTUUgICAgID0gMHgzMDAyLCAvLyByYW1wIHRvIG5ldyB2b2x1bWUKICAgICAgICAgVk9MVU1FICAgICAgICAgID0gMHgzMDAzLCAvLyBkb24ndCByYW1wCisgICAgICAgIFRJTUVTVFJFVENIICAgICA9IDB4MzAwNCwKIAogICAgICAgICAvLyBzZXQgUGFyYW1ldGVyIG5hbWVzCiAgICAgICAgIC8vIGZvciB0YXJnZXQgVFJBQ0sKQEAgLTk5LDYgKzEwMiw5IEBACiAgICAgICAgIFZPTFVNRTAgICAgICAgICA9IDB4NDIwMCwKICAgICAgICAgVk9MVU1FMSAgICAgICAgID0gMHg0MjAxLAogICAgICAgICBBVVhMRVZFTCAgICAgICAgPSAweDQyMTAsCisgICAgICAgIC8vIGZvciB0YXJnZXQgVElNRVNUUkVUQ0gKKyAgICAgICAgUExBWUJBQ0tfUkFURSAgID0gMHg0MzAwLCAvLyBDb25maWd1cmUgdGltZXN0cmV0Y2ggb24gdGhpcyB0cmFjayBuYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlciAndmFsdWUnIGlzIGEgcG9pbnRlciB0byB0aGUgbmV3IHBsYXliYWNrIHJhdGUuCiAgICAgfTsKIAogCkBAIC0xMjcsMTAgKzEzMywxNiBAQAogICAgIHNpemVfdCAgICAgIGdldFVucmVsZWFzZWRGcmFtZXMoaW50IG5hbWUpIGNvbnN0OwogCiAgICAgc3RhdGljIGlubGluZSBib29sIGlzVmFsaWRQY21UcmFja0Zvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKLSAgICAgICAgcmV0dXJuIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCB8fAotICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQgfHwKLSAgICAgICAgICAgICAgICBmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8zMl9CSVQgfHwKLSAgICAgICAgICAgICAgICBmb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKyAgICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzhfQklUOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDoKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDoKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KICAgICB9CiAKIHByaXZhdGU6CkBAIC0xNTMsNyArMTY1LDYgQEAKIAogICAgIHN0cnVjdCBzdGF0ZV90OwogICAgIHN0cnVjdCB0cmFja190OwotICAgIGNsYXNzIENvcHlCdWZmZXJQcm92aWRlcjsKIAogICAgIHR5cGVkZWYgdm9pZCAoKmhvb2tfdCkodHJhY2tfdCogdCwgaW50MzJfdCogb3V0cHV0LCBzaXplX3QgbnVtT3V0RnJhbWVzLCBpbnQzMl90KiB0ZW1wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYXV4KTsKQEAgLTIwNSwxNyArMjE2LDM4IEBACiAgICAgICAgIGludDMyX3QqICAgICAgICAgICBhdXhCdWZmZXI7CiAKICAgICAgICAgLy8gMTYtYnl0ZSBib3VuZGFyeQorCisgICAgICAgIC8qIEJ1ZmZlciBwcm92aWRlcnMgYXJlIGNvbnN0cnVjdGVkIHRvIHRyYW5zbGF0ZSB0aGUgdHJhY2sgaW5wdXQgZGF0YSBhcyBuZWVkZWQuCisgICAgICAgICAqCisgICAgICAgICAqIFRPRE86IHBlcmhhcHMgbWFrZSBhIHNpbmdsZSBQbGF5YmFja0NvbnZlcnRlclByb3ZpZGVyIGNsYXNzIHRvIG1vdmUKKyAgICAgICAgICogYWxsIHByZS1taXhlciB0cmFjayBidWZmZXIgY29udmVyc2lvbnMgb3V0c2lkZSB0aGUgQXVkaW9NaXhlciBjbGFzcy4KKyAgICAgICAgICoKKyAgICAgICAgICogMSkgbUlucHV0QnVmZmVyUHJvdmlkZXI6IFRoZSBBdWRpb1RyYWNrIGJ1ZmZlciBwcm92aWRlci4KKyAgICAgICAgICogMikgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgYXVkaW8gcmVmb3JtYXQgdG8KKyAgICAgICAgICogICAgbWF0Y2ggZWl0aGVyIG1NaXhlckluRm9ybWF0IG9yIG1Eb3dubWl4UmVxdWlyZXNGb3JtYXQsIGlmIHRoZSBkb3dubWl4ZXIKKyAgICAgICAgICogICAgcmVxdWlyZXMgcmVmb3JtYXQuIEZvciBleGFtcGxlLCBpdCBtYXkgY29udmVydCBmbG9hdGluZyBwb2ludCBpbnB1dCB0bworICAgICAgICAgKiAgICBQQ01fMTZfYml0IGlmIHRoYXQncyByZXF1aXJlZCBieSB0aGUgZG93bm1peGVyLgorICAgICAgICAgKiAzKSBkb3dubWl4ZXJCdWZmZXJQcm92aWRlcjogSWYgbm90IE5VTEwsIHBlcmZvcm1zIHRoZSBjaGFubmVsIHJlbWl4aW5nIHRvIG1hdGNoCisgICAgICAgICAqICAgIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgcmVxdWlyZWQgYnkgdGhlIG1peGVyIHNpbmsuCisgICAgICAgICAqIDQpIG1Qb3N0RG93bm1peFJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyByZWZvcm1hdHRpbmcgZnJvbQorICAgICAgICAgKiAgICB0aGUgZG93bm1peGVyIHJlcXVpcmVtZW50cyB0byB0aGUgbWl4ZXIgZW5naW5lIGlucHV0IHJlcXVpcmVtZW50cy4KKyAgICAgICAgICogNSkgbVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI6IEFkZHMgdGltZXN0cmV0Y2hpbmcgZm9yIHBsYXliYWNrIHJhdGUKKyAgICAgICAgICovCiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqICAgICBtSW5wdXRCdWZmZXJQcm92aWRlcjsgICAgLy8gZXh0ZXJuYWxseSBwcm92aWRlZCBidWZmZXIgcHJvdmlkZXIuCi0gICAgICAgIENvcHlCdWZmZXJQcm92aWRlciogICAgICBtUmVmb3JtYXRCdWZmZXJQcm92aWRlcjsgLy8gcHJvdmlkZXIgd3JhcHBlciBmb3IgcmVmb3JtYXR0aW5nLgotICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIqICAgICAgZG93bm1peGVyQnVmZmVyUHJvdmlkZXI7IC8vIHdyYXBwZXIgZm9yIGNoYW5uZWwgY29udmVyc2lvbi4KKyAgICAgICAgUGFzc3RocnVCdWZmZXJQcm92aWRlciogIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOyAvLyBwcm92aWRlciB3cmFwcGVyIGZvciByZWZvcm1hdHRpbmcuCisgICAgICAgIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIqICBkb3dubWl4ZXJCdWZmZXJQcm92aWRlcjsgLy8gd3JhcHBlciBmb3IgY2hhbm5lbCBjb252ZXJzaW9uLgorICAgICAgICBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyKiAgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlcjsKKyAgICAgICAgUGFzc3RocnVCdWZmZXJQcm92aWRlciogIG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOwogCiAgICAgICAgIGludDMyX3QgICAgIHNlc3Npb25JZDsKIAotICAgICAgICAvLyAxNi1ieXRlIGJvdW5kYXJ5CiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1NaXhlckZvcm1hdDsgICAgIC8vIG91dHB1dCBtaXggZm9ybWF0OiBBVURJT19GT1JNQVRfUENNXyhGTE9BVHwxNl9CSVQpCiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7ICAgICAgICAgIC8vIGlucHV0IHRyYWNrIGZvcm1hdAogICAgICAgICBhdWRpb19mb3JtYXRfdCBtTWl4ZXJJbkZvcm1hdDsgICAvLyBtaXggaW50ZXJuYWwgZm9ybWF0IEFVRElPX0ZPUk1BVF9QQ01fKEZMT0FUfDE2X0JJVCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWFjaCB0cmFjayBtdXN0IGJlIGNvbnZlcnRlZCB0byB0aGlzIGZvcm1hdC4KKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgbURvd25taXhSZXF1aXJlc0Zvcm1hdDsgIC8vIHJlcXVpcmVkIGRvd25taXhlciBmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIGlmIDE2IGJpdCBuZWNlc3NhcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFVRElPX0ZPUk1BVF9JTlZBTElEIGlmIG5vIHJlcXVpcmVkIGZvcm1hdAogCiAgICAgICAgIGZsb2F0ICAgICAgICAgIG1Wb2x1bWVbTUFYX05VTV9WT0xVTUVTXTsgICAgIC8vIGZsb2F0aW5nIHBvaW50IHNldCB2b2x1bWUKICAgICAgICAgZmxvYXQgICAgICAgICAgbVByZXZWb2x1bWVbTUFYX05VTV9WT0xVTUVTXTsgLy8gZmxvYXRpbmcgcG9pbnQgcHJldmlvdXMgdm9sdW1lCkBAIC0yMjUsMTAgKzI1NywxMSBAQAogICAgICAgICBmbG9hdCAgICAgICAgICBtUHJldkF1eExldmVsOyAgICAgICAgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgcHJldiBhdXggbGV2ZWwKICAgICAgICAgZmxvYXQgICAgICAgICAgbUF1eEluYzsgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsb2F0aW5nIHBvaW50IGF1eCBpbmNyZW1lbnQKIAotICAgICAgICAvLyAxNi1ieXRlIGJvdW5kYXJ5CiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1NaXhlckNoYW5uZWxNYXNrOwogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtTWl4ZXJDaGFubmVsQ291bnQ7CiAKKyAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgICAgbVBsYXliYWNrUmF0ZTsKKwogICAgICAgICBib29sICAgICAgICBuZWVkc1JhbXAoKSB7IHJldHVybiAodm9sdW1lSW5jWzBdIHwgdm9sdW1lSW5jWzFdIHwgYXV4SW5jKSAhPSAwOyB9CiAgICAgICAgIGJvb2wgICAgICAgIHNldFJlc2FtcGxlcih1aW50MzJfdCB0cmFja1NhbXBsZVJhdGUsIHVpbnQzMl90IGRldlNhbXBsZVJhdGUpOwogICAgICAgICBib29sICAgICAgICBkb2VzUmVzYW1wbGUoKSBjb25zdCB7IHJldHVybiByZXNhbXBsZXIgIT0gTlVMTDsgfQpAQCAtMjM2LDYgKzI2OSwxMyBAQAogICAgICAgICB2b2lkICAgICAgICBhZGp1c3RWb2x1bWVSYW1wKGJvb2wgYXV4LCBib29sIHVzZUZsb2F0ID0gZmFsc2UpOwogICAgICAgICBzaXplX3QgICAgICBnZXRVbnJlbGVhc2VkRnJhbWVzKCkgY29uc3QgeyByZXR1cm4gcmVzYW1wbGVyICE9IE5VTEwgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2FtcGxlci0+Z2V0VW5yZWxlYXNlZEZyYW1lcygpIDogMDsgfTsKKworICAgICAgICBzdGF0dXNfdCAgICBwcmVwYXJlRm9yRG93bm1peCgpOworICAgICAgICB2b2lkICAgICAgICB1bnByZXBhcmVGb3JEb3dubWl4KCk7CisgICAgICAgIHN0YXR1c190ICAgIHByZXBhcmVGb3JSZWZvcm1hdCgpOworICAgICAgICB2b2lkICAgICAgICB1bnByZXBhcmVGb3JSZWZvcm1hdCgpOworICAgICAgICBib29sICAgICAgICBzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSk7CisgICAgICAgIHZvaWQgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CiAgICAgfTsKIAogICAgIHR5cGVkZWYgdm9pZCAoKnByb2Nlc3NfaG9va190KShzdGF0ZV90KiBzdGF0ZSwgaW50NjRfdCBwdHMpOwpAQCAtMjU0LDExMiArMjk0LDYgQEAKICAgICAgICAgdHJhY2tfdCAgICAgICAgIHRyYWNrc1tNQVhfTlVNX1RSQUNLU10gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgzMikpKTsKICAgICB9OwogCi0gICAgLy8gQmFzZSBBdWRpb0J1ZmZlclByb3ZpZGVyIGNsYXNzIHVzZWQgZm9yIERvd25NaXhlckJ1ZmZlclByb3ZpZGVyLCBSZW1peEJ1ZmZlclByb3ZpZGVyLAotICAgIC8vIGFuZCBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLgotICAgIC8vIEl0IGhhbmRsZXMgYSBwcml2YXRlIGJ1ZmZlciBmb3IgdXNlIGluIGNvbnZlcnRpbmcgZm9ybWF0IG9yIGNoYW5uZWwgbWFza3MgZnJvbSB0aGUKLSAgICAvLyBpbnB1dCBkYXRhIHRvIGEgZm9ybSBhY2NlcHRhYmxlIGJ5IHRoZSBtaXhlci4KLSAgICAvLyBUT0RPOiBNYWtlIGEgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIgd2hlbiBpbnRlZ2VycyBhcmUgZW50aXJlbHkgcmVtb3ZlZCBmcm9tIHRoZQotICAgIC8vIHByb2Nlc3NpbmcgcGlwZWxpbmUuCi0gICAgY2xhc3MgQ29weUJ1ZmZlclByb3ZpZGVyIDogcHVibGljIEF1ZGlvQnVmZmVyUHJvdmlkZXIgewotICAgIHB1YmxpYzoKLSAgICAgICAgLy8gVXNlIGEgcHJpdmF0ZSBidWZmZXIgb2YgYnVmZmVyRnJhbWVDb3VudCBmcmFtZXMgKGVhY2ggZnJhbWUgaXMgb3V0cHV0RnJhbWVTaXplIGJ5dGVzKS4KLSAgICAgICAgLy8gSWYgYnVmZmVyRnJhbWVDb3VudCBpcyAwLCBubyBwcml2YXRlIGJ1ZmZlciBpcyBjcmVhdGVkIGFuZCBpbi1wbGFjZSBtb2RpZmljYXRpb24gb2YKLSAgICAgICAgLy8gdGhlIHVwc3RyZWFtIGJ1ZmZlciBwcm92aWRlcidzIGJ1ZmZlcnMgaXMgcGVyZm9ybWVkIGJ5IGNvcHlGcmFtZXMoKS4KLSAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKHNpemVfdCBpbnB1dEZyYW1lU2l6ZSwgc2l6ZV90IG91dHB1dEZyYW1lU2l6ZSwKLSAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCk7Ci0gICAgICAgIHZpcnR1YWwgfkNvcHlCdWZmZXJQcm92aWRlcigpOwotCi0gICAgICAgIC8vIE92ZXJyaWRlcyBBdWRpb0J1ZmZlclByb3ZpZGVyIG1ldGhvZHMKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cyk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYnVmZmVyKTsKLQotICAgICAgICAvLyBPdGhlciBwdWJsaWMgbWV0aG9kcwotCi0gICAgICAgIC8vIGNhbGwgdGhpcyB0byByZWxlYXNlIHRoZSBidWZmZXIgdG8gdGhlIHVwc3RyZWFtIHByb3ZpZGVyLgotICAgICAgICAvLyB0cmVhdCBpdCBhcyBhbiBhdWRpbyBkaXNjb250aW51aXR5IGZvciBmdXR1cmUgc2FtcGxlcy4KLSAgICAgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7Ci0KLSAgICAgICAgLy8gdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgc3VwcGxpZWQgYnkgdGhlIGRlcml2ZWQgY2xhc3MuICBJdCBjb252ZXJ0cwotICAgICAgICAvLyAjZnJhbWVzIGluIHRoZSAqc3JjIHBvaW50ZXIgdG8gdGhlICpkc3QgcG9pbnRlci4gIEl0IGlzIHB1YmxpYyBiZWNhdXNlCi0gICAgICAgIC8vIHNvbWUgcHJvdmlkZXJzIHdpbGwgYWxsb3cgdGhpcyB0byB3b3JrIG9uIGFyYml0cmFyeSBidWZmZXJzIG91dHNpZGUKLSAgICAgICAgLy8gb2YgdGhlIGludGVybmFsIGJ1ZmZlcnMuCi0gICAgICAgIHZpcnR1YWwgdm9pZCBjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKSA9IDA7Ci0KLSAgICAgICAgLy8gc2V0IHRoZSB1cHN0cmVhbSBidWZmZXIgcHJvdmlkZXIuIENvbnNpZGVyIGNhbGxpbmcgInJlc2V0IiBiZWZvcmUgdGhpcyBmdW5jdGlvbi4KLSAgICAgICAgdm9pZCBzZXRCdWZmZXJQcm92aWRlcihBdWRpb0J1ZmZlclByb3ZpZGVyICpwKSB7Ci0gICAgICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlciA9IHA7Ci0gICAgICAgIH0KLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogbVRyYWNrQnVmZmVyUHJvdmlkZXI7Ci0gICAgICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1JbnB1dEZyYW1lU2l6ZTsKLSAgICAgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbU91dHB1dEZyYW1lU2l6ZTsKLSAgICBwcml2YXRlOgotICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgbUJ1ZmZlcjsKLSAgICAgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUxvY2FsQnVmZmVyRnJhbWVDb3VudDsKLSAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgbUxvY2FsQnVmZmVyRGF0YTsKLSAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgbUNvbnN1bWVkOwotICAgIH07Ci0KLSAgICAvLyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlciB3cmFwcyBhIHRyYWNrIEF1ZGlvQnVmZmVyUHJvdmlkZXIgdG8gcHJvdmlkZQotICAgIC8vIHBvc2l0aW9uIGRlcGVuZGVudCBkb3dubWl4aW5nIGJ5IGFuIEF1ZGlvIEVmZmVjdC4KLSAgICBjbGFzcyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBDb3B5QnVmZmVyUHJvdmlkZXIgewotICAgIHB1YmxpYzoKLSAgICAgICAgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5wdXRDaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRwdXRDaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3Qgc2Vzc2lvbklkLCBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCk7Ci0gICAgICAgIHZpcnR1YWwgfkRvd25taXhlckJ1ZmZlclByb3ZpZGVyKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKTsKLSAgICAgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbURvd25taXhIYW5kbGUgIT0gTlVMTDsgfQotCi0gICAgICAgIHN0YXRpYyBzdGF0dXNfdCBpbml0KCk7Ci0gICAgICAgIHN0YXRpYyBib29sIGlzTXVsdGljaGFubmVsQ2FwYWJsZSgpIHsgcmV0dXJuIHNJc011bHRpY2hhbm5lbENhcGFibGU7IH0KLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgZWZmZWN0X2hhbmRsZV90ICAgIG1Eb3dubWl4SGFuZGxlOwotICAgICAgICBlZmZlY3RfY29uZmlnX3QgICAgbURvd25taXhDb25maWc7Ci0KLSAgICAgICAgLy8gZWZmZWN0IGRlc2NyaXB0b3IgZm9yIHRoZSBkb3dubWl4ZXIgdXNlZCBieSB0aGUgbWl4ZXIKLSAgICAgICAgc3RhdGljIGVmZmVjdF9kZXNjcmlwdG9yX3Qgc0R3bm1GeERlc2M7Ci0gICAgICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIGEgZG93bm1peCBlZmZlY3QgaGFzIGJlZW4gZm91bmQgYW5kIGlzIHVzYWJsZSBieSB0aGlzIG1peGVyCi0gICAgICAgIHN0YXRpYyBib29sICAgICAgICAgICAgICAgIHNJc011bHRpY2hhbm5lbENhcGFibGU7Ci0gICAgICAgIC8vIEZJWE1FOiBzaG91bGQgd2UgYWxsb3cgZWZmZWN0cyBvdXRzaWRlIG9mIHRoZSBmcmFtZXdvcms/Ci0gICAgICAgIC8vIFdlIG5lZWQgdG8gaGVyZS4gQSBzcGVjaWFsIGlvSWQgdGhhdCBtdXN0IGJlIDw9IC0yIHNvIGl0IGRvZXMgbm90IG1hcCB0byBhIHNlc3Npb24uCi0gICAgICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IFNFU1NJT05fSURfSU5WQUxJRF9BTkRfSUdOT1JFRCA9IC0yOwotICAgIH07Ci0KLSAgICAvLyBSZW1peEJ1ZmZlclByb3ZpZGVyIHdyYXBzIGEgdHJhY2sgQXVkaW9CdWZmZXJQcm92aWRlciB0byBwZXJmb3JtIGFuCi0gICAgLy8gdXBtaXggb3IgZG93bm1peCB0byB0aGUgcHJvcGVyIGNoYW5uZWwgY291bnQgYW5kIG1hc2suCi0gICAgY2xhc3MgUmVtaXhCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBDb3B5QnVmZmVyUHJvdmlkZXIgewotICAgIHB1YmxpYzoKLSAgICAgICAgUmVtaXhCdWZmZXJQcm92aWRlcihhdWRpb19jaGFubmVsX21hc2tfdCBpbnB1dENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dHB1dENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgY29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcyk7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7Ci0gICAgICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1TYW1wbGVTaXplOwotICAgICAgICBjb25zdCBzaXplX3QgICAgICAgICBtSW5wdXRDaGFubmVsczsKLSAgICAgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbU91dHB1dENoYW5uZWxzOwotICAgICAgICBpbnQ4X3QgICAgICAgICAgICAgICBtSWR4QXJ5W3NpemVvZih1aW50MzJfdCkqOF07IC8vIDMyIGJpdHMgPT4gY2hhbm5lbCBpbmRpY2VzCi0gICAgfTsKLQotICAgIC8vIFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgd3JhcHMgYSB0cmFjayBBdWRpb0J1ZmZlclByb3ZpZGVyIHRvIGNvbnZlcnQgdGhlIGlucHV0IGRhdGEKLSAgICAvLyB0byBhbiBhY2NlcHRhYmxlIG1peGVyIGlucHV0IGZvcm1hdCB0eXBlLgotICAgIGNsYXNzIFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIoaW50MzJfdCBjaGFubmVscywKLSAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBpbnB1dEZvcm1hdCwgYXVkaW9fZm9ybWF0X3Qgb3V0cHV0Rm9ybWF0LAotICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpOwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICBjb25zdCBpbnQzMl90ICAgICAgICBtQ2hhbm5lbHM7Ci0gICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IG1JbnB1dEZvcm1hdDsKLSAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgbU91dHB1dEZvcm1hdDsKLSAgICB9OwotCiAgICAgLy8gYml0bWFzayBvZiBhbGxvY2F0ZWQgdHJhY2sgbmFtZXMsIHdoZXJlIGJpdCAwIGNvcnJlc3BvbmRzIHRvIFRSQUNLMCBldGMuCiAgICAgdWludDMyX3QgICAgICAgIG1UcmFja05hbWVzOwogCkBAIC0zODIsMTQgKzMxNiw2IEBACiAgICAgYm9vbCBzZXRDaGFubmVsTWFza3MoaW50IG5hbWUsCiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCB0cmFja0NoYW5uZWxNYXNrLCBhdWRpb19jaGFubmVsX21hc2tfdCBtaXhlckNoYW5uZWxNYXNrKTsKIAotICAgIC8vIFRPRE86IHJlbW92ZSB1bnVzZWQgdHJhY2tOYW1lL3RyYWNrTnVtIGZyb20gZnVuY3Rpb25zIGJlbG93LgotICAgIHN0YXRpYyBzdGF0dXNfdCBpbml0VHJhY2tEb3dubWl4KHRyYWNrX3QqIHBUcmFjaywgaW50IHRyYWNrTmFtZSk7Ci0gICAgc3RhdGljIHN0YXR1c190IHByZXBhcmVUcmFja0ZvckRvd25taXgodHJhY2tfdCogcFRyYWNrLCBpbnQgdHJhY2tOdW0pOwotICAgIHN0YXRpYyB2b2lkIHVucHJlcGFyZVRyYWNrRm9yRG93bm1peCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBwcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja051bSk7Ci0gICAgc3RhdGljIHZvaWQgdW5wcmVwYXJlVHJhY2tGb3JSZWZvcm1hdCh0cmFja190KiBwVHJhY2ssIGludCB0cmFja05hbWUpOwotICAgIHN0YXRpYyB2b2lkIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKHRyYWNrX3QqIHBUcmFjayk7Ci0KICAgICBzdGF0aWMgdm9pZCB0cmFja19fZ2VuZXJpY1Jlc2FtcGxlKHRyYWNrX3QqIHQsIGludDMyX3QqIG91dCwgc2l6ZV90IG51bUZyYW1lcywgaW50MzJfdCogdGVtcCwKICAgICAgICAgICAgIGludDMyX3QqIGF1eCk7CiAgICAgc3RhdGljIHZvaWQgdHJhY2tfX25vcCh0cmFja190KiB0LCBpbnQzMl90KiBvdXQsIHNpemVfdCBudW1GcmFtZXMsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCk7CkBAIC00NjUsNiArMzkxLDYgQEAKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBBTkRST0lEX0FVRElPX01JWEVSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyT3BzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9NaXhlck9wcy5oCmluZGV4IDI2Nzg4NTcuLjhkNzQwMjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb01peGVyT3BzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvTWl4ZXJPcHMuaApAQCAtMTY0LDEzICsxNjQsMTIgQEAKIHRlbXBsYXRlIDw+CiBpbmxpbmUgaW50MTZfdCBNaXhNdWw8aW50MTZfdCwgaW50MTZfdCwgZmxvYXQ+KGludDE2X3QgdmFsdWUsIGZsb2F0IHZvbHVtZSkgewogICAgIExPR19BTFdBWVNfRkFUQUwoIk1peE11bDxpbnQxNl90LCBpbnQxNl90LCBmbG9hdD4gUnVudGltZSBTaG91bGQgbm90IGJlIGhlcmUiKTsKLSAgICByZXR1cm4gdmFsdWUgKiB2b2x1bWU7CisgICAgcmV0dXJuIGNsYW1wMTZfZnJvbV9mbG9hdChNaXhNdWw8ZmxvYXQsIGludDE2X3QsIGZsb2F0Pih2YWx1ZSwgdm9sdW1lKSk7CiB9CiAKIHRlbXBsYXRlIDw+CiBpbmxpbmUgaW50MTZfdCBNaXhNdWw8aW50MTZfdCwgZmxvYXQsIGZsb2F0PihmbG9hdCB2YWx1ZSwgZmxvYXQgdm9sdW1lKSB7Ci0gICAgc3RhdGljIGNvbnN0IGZsb2F0IHFfMTVfZnJvbV9mbG9hdCA9ICgxIDw8IDE1KTsKLSAgICByZXR1cm4gdmFsdWUgKiB2b2x1bWUgKiBxXzE1X2Zyb21fZmxvYXQ7CisgICAgcmV0dXJuIGNsYW1wMTZfZnJvbV9mbG9hdCh2YWx1ZSAqIHZvbHVtZSk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyLmNwcAppbmRleCA0NmUzZDZjLi5lNDliN2IxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5jcHAKQEAgLTQxLDcgKzQxLDcgQEAKICAgICBBdWRpb1Jlc2FtcGxlck9yZGVyMShpbnQgaW5DaGFubmVsQ291bnQsIGludDMyX3Qgc2FtcGxlUmF0ZSkgOgogICAgICAgICBBdWRpb1Jlc2FtcGxlcihpbkNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSwgTE9XX1FVQUxJVFkpLCBtWDBMKDApLCBtWDBSKDApIHsKICAgICB9Ci0gICAgdmlydHVhbCB2b2lkIHJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCisgICAgdmlydHVhbCBzaXplX3QgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKIHByaXZhdGU6CiAgICAgLy8gbnVtYmVyIG9mIGJpdHMgdXNlZCBpbiBpbnRlcnBvbGF0aW9uIG11bHRpcGx5IC0gMTUgYml0cyBhdm9pZHMgb3ZlcmZsb3cKQEAgLTUxLDkgKzUxLDkgQEAKICAgICBzdGF0aWMgY29uc3QgaW50IGtQcmVJbnRlcnBTaGlmdCA9IGtOdW1QaGFzZUJpdHMgLSBrTnVtSW50ZXJwQml0czsKIAogICAgIHZvaWQgaW5pdCgpIHt9Ci0gICAgdm9pZCByZXNhbXBsZU1vbm8xNihpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorICAgIHNpemVfdCByZXNhbXBsZU1vbm8xNihpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOwotICAgIHZvaWQgcmVzYW1wbGVTdGVyZW8xNihpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorICAgIHNpemVfdCByZXNhbXBsZVN0ZXJlbzE2KGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CiAjaWZkZWYgQVNNX0FSTV9SRVNBTVAxICAvLyBhc20gb3B0aW1pc2F0aW9uIGZvciBSZXNhbXBsZXJPcmRlcjEKICAgICB2b2lkIEFzbU1vbm8xNkxvb3AoaW50MTZfdCAqaW4sIGludDMyX3QqIG1heE91dFB0LCBpbnQzMl90IG1heEluSWR4LApAQCAtMzI5LDcgKzMyOSw3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotdm9pZCBBdWRpb1Jlc2FtcGxlck9yZGVyMTo6cmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKK3NpemVfdCBBdWRpb1Jlc2FtcGxlck9yZGVyMTo6cmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpIHsKIAogICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCB3ZSBvdmVyZmxvdyBpZiBpdCBkb2VzCkBAIC0zMzgsMTUgKzMzOCwxNiBAQAogICAgIC8vIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgcmVzYW1wbGVyCiAgICAgc3dpdGNoIChtQ2hhbm5lbENvdW50KSB7CiAgICAgY2FzZSAxOgotICAgICAgICByZXNhbXBsZU1vbm8xNihvdXQsIG91dEZyYW1lQ291bnQsIHByb3ZpZGVyKTsKLSAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiByZXNhbXBsZU1vbm8xNihvdXQsIG91dEZyYW1lQ291bnQsIHByb3ZpZGVyKTsKICAgICBjYXNlIDI6Ci0gICAgICAgIHJlc2FtcGxlU3RlcmVvMTYob3V0LCBvdXRGcmFtZUNvdW50LCBwcm92aWRlcik7Ci0gICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gcmVzYW1wbGVTdGVyZW8xNihvdXQsIG91dEZyYW1lQ291bnQsIHByb3ZpZGVyKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJpbnZhbGlkIGNoYW5uZWwgY291bnQ6ICVkIiwgbUNoYW5uZWxDb3VudCk7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KIH0KIAotdm9pZCBBdWRpb1Jlc2FtcGxlck9yZGVyMTo6cmVzYW1wbGVTdGVyZW8xNihpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorc2l6ZV90IEF1ZGlvUmVzYW1wbGVyT3JkZXIxOjpyZXNhbXBsZVN0ZXJlbzE2KGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKSB7CiAKICAgICBpbnQzMl90IHZsID0gbVZvbHVtZVswXTsKQEAgLTQ0Miw5ICs0NDMsMTAgQEAKICAgICAvLyBzYXZlIHN0YXRlCiAgICAgbUlucHV0SW5kZXggPSBpbnB1dEluZGV4OwogICAgIG1QaGFzZUZyYWN0aW9uID0gcGhhc2VGcmFjdGlvbjsKKyAgICByZXR1cm4gb3V0cHV0SW5kZXggLyAyIC8qIGNoYW5uZWxzIGZvciBzdGVyZW8gKi87CiB9CiAKLXZvaWQgQXVkaW9SZXNhbXBsZXJPcmRlcjE6OnJlc2FtcGxlTW9ubzE2KGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCitzaXplX3QgQXVkaW9SZXNhbXBsZXJPcmRlcjE6OnJlc2FtcGxlTW9ubzE2KGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKSB7CiAKICAgICBpbnQzMl90IHZsID0gbVZvbHVtZVswXTsKQEAgLTUzOCw2ICs1NDAsNyBAQAogICAgIC8vIHNhdmUgc3RhdGUKICAgICBtSW5wdXRJbmRleCA9IGlucHV0SW5kZXg7CiAgICAgbVBoYXNlRnJhY3Rpb24gPSBwaGFzZUZyYWN0aW9uOworICAgIHJldHVybiBvdXRwdXRJbmRleDsKIH0KIAogI2lmZGVmIEFTTV9BUk1fUkVTQU1QMSAgLy8gYXNtIG9wdGltaXNhdGlvbiBmb3IgUmVzYW1wbGVyT3JkZXIxCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5oCmluZGV4IDA2OWQ5NDYuLmE4ZTNlNmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlci5oCkBAIC02NywxMiArNjcsMTggQEAKICAgICAvLyBSZXNhbXBsZSBpbnQxNl90IHNhbXBsZXMgZnJvbSBwcm92aWRlciBhbmQgYWNjdW11bGF0ZSBpbnRvICdvdXQnLgogICAgIC8vIEEgbW9ubyBwcm92aWRlciBkZWxpdmVycyBhIHNlcXVlbmNlIG9mIHNhbXBsZXMuCiAgICAgLy8gQSBzdGVyZW8gcHJvdmlkZXIgZGVsaXZlcnMgYSBzZXF1ZW5jZSBvZiBpbnRlcmxlYXZlZCBwYWlycyBvZiBzYW1wbGVzLgotICAgIC8vIE11bHRpLWNoYW5uZWwgcHJvdmlkZXJzIGFyZSBub3Qgc3VwcG9ydGVkLgorICAgIC8vCiAgICAgLy8gSW4gZWl0aGVyIGNhc2UsICdvdXQnIGhvbGRzIGludGVybGVhdmVkIHBhaXJzIG9mIGZpeGVkLXBvaW50IFE0LjI3LgogICAgIC8vIFRoYXQgaXMsIGZvciBhIG1vbm8gcHJvdmlkZXIsIHRoZXJlIGlzIGFuIGltcGxpY2l0IHVwLWNoYW5uZWxpbmcuCiAgICAgLy8gU2luY2UgdGhpcyBtZXRob2QgYWNjdW11bGF0ZXMsIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNsZWFyaW5nICdvdXQnIGluaXRpYWxseS4KLSAgICAvLyBGSVhNRSBhc3N1bWVzIHByb3ZpZGVyIGlzIGFsd2F5cyBzdWNjZXNzZnVsOyBpdCBzaG91bGQgcmV0dXJuIHRoZSBhY3R1YWwgZnJhbWUgY291bnQuCi0gICAgdmlydHVhbCB2b2lkIHJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCisgICAgLy8KKyAgICAvLyBGb3IgYSBmbG9hdCByZXNhbXBsZXIsICdvdXQnIGhvbGRzIGludGVybGVhdmVkIHBhaXJzIG9mIGZsb2F0IHNhbXBsZXMuCisgICAgLy8KKyAgICAvLyBNdWx0aWNoYW5uZWwgaW50ZXJsZWF2ZWQgZnJhbWVzIGZvciBuID4gMiBpcyBzdXBwb3J0ZWQgZm9yIHF1YWxpdHkgRFlOX0xPV19RVUFMSVRZLAorICAgIC8vIERZTl9NRURfUVVBTElUWSwgYW5kIERZTl9ISUdIX1FVQUxJVFkuCisgICAgLy8KKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJhbWVzIHJlc2FtcGxlZCBpbnRvIHRoZSBvdXQgYnVmZmVyLgorICAgIHZpcnR1YWwgc2l6ZV90IHJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcikgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CkBAIC0xNzAsNyArMTc2LDYgQEAKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX0KLTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIEFORFJPSURfQVVESU9fUkVTQU1QTEVSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmNwcAppbmRleCA4ZjE0ZmY5Li4xNzJjMmE1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jZGVmaW5lIExPR19UQUcgIkF1ZGlvU1JDIgorI2RlZmluZSBMT0dfVEFHICJBdWRpb1Jlc2FtcGxlckN1YmljIgogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC0zMiw3ICszMiw3IEBACiAgICAgbWVtc2V0KCZyaWdodCwgMCwgc2l6ZW9mKHN0YXRlKSk7CiB9CiAKLXZvaWQgQXVkaW9SZXNhbXBsZXJDdWJpYzo6cmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKK3NpemVfdCBBdWRpb1Jlc2FtcGxlckN1YmljOjpyZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcikgewogCiAgICAgLy8gc2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IHdlIG92ZXJmbG93IGlmIGl0IGRvZXMKQEAgLTQxLDE1ICs0MSwxNiBAQAogICAgIC8vIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgcmVzYW1wbGVyCiAgICAgc3dpdGNoIChtQ2hhbm5lbENvdW50KSB7CiAgICAgY2FzZSAxOgotICAgICAgICByZXNhbXBsZU1vbm8xNihvdXQsIG91dEZyYW1lQ291bnQsIHByb3ZpZGVyKTsKLSAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiByZXNhbXBsZU1vbm8xNihvdXQsIG91dEZyYW1lQ291bnQsIHByb3ZpZGVyKTsKICAgICBjYXNlIDI6Ci0gICAgICAgIHJlc2FtcGxlU3RlcmVvMTYob3V0LCBvdXRGcmFtZUNvdW50LCBwcm92aWRlcik7Ci0gICAgICAgIGJyZWFrOworICAgICAgICByZXR1cm4gcmVzYW1wbGVTdGVyZW8xNihvdXQsIG91dEZyYW1lQ291bnQsIHByb3ZpZGVyKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJpbnZhbGlkIGNoYW5uZWwgY291bnQ6ICVkIiwgbUNoYW5uZWxDb3VudCk7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KIH0KIAotdm9pZCBBdWRpb1Jlc2FtcGxlckN1YmljOjpyZXNhbXBsZVN0ZXJlbzE2KGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCitzaXplX3QgQXVkaW9SZXNhbXBsZXJDdWJpYzo6cmVzYW1wbGVTdGVyZW8xNihpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcikgewogCiAgICAgaW50MzJfdCB2bCA9IG1Wb2x1bWVbMF07CkBAIC02Nyw3ICs2OCw3IEBACiAgICAgICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IGluRnJhbWVDb3VudDsKICAgICAgICAgcHJvdmlkZXItPmdldE5leHRCdWZmZXIoJm1CdWZmZXIsIG1QVFMpOwogICAgICAgICBpZiAobUJ1ZmZlci5yYXcgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICAgICAgLy8gQUxPR1coIk5ldyBidWZmZXI6IG9mZnNldD0lcCwgZnJhbWVzPSVkbiIsIG1CdWZmZXIucmF3LCBtQnVmZmVyLmZyYW1lQ291bnQpOwogICAgIH0KQEAgLTExNSw5ICsxMTYsMTAgQEAKICAgICAvLyBBTE9HVygiRG9uZTogaW5kZXg9JWQsIGZyYWN0aW9uPSV1IiwgaW5wdXRJbmRleCwgcGhhc2VGcmFjdGlvbik7CiAgICAgbUlucHV0SW5kZXggPSBpbnB1dEluZGV4OwogICAgIG1QaGFzZUZyYWN0aW9uID0gcGhhc2VGcmFjdGlvbjsKKyAgICByZXR1cm4gb3V0cHV0SW5kZXggLyAyIC8qIGNoYW5uZWxzIGZvciBzdGVyZW8gKi87CiB9CiAKLXZvaWQgQXVkaW9SZXNhbXBsZXJDdWJpYzo6cmVzYW1wbGVNb25vMTYoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKK3NpemVfdCBBdWRpb1Jlc2FtcGxlckN1YmljOjpyZXNhbXBsZU1vbm8xNihpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcikgewogCiAgICAgaW50MzJfdCB2bCA9IG1Wb2x1bWVbMF07CkBAIC0xMzUsNyArMTM3LDcgQEAKICAgICAgICAgbUJ1ZmZlci5mcmFtZUNvdW50ID0gaW5GcmFtZUNvdW50OwogICAgICAgICBwcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmbUJ1ZmZlciwgbVBUUyk7CiAgICAgICAgIGlmIChtQnVmZmVyLnJhdyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogICAgICAgICAvLyBBTE9HVygiTmV3IGJ1ZmZlcjogb2Zmc2V0PSVwLCBmcmFtZXM9JWQiLCBtQnVmZmVyLnJhdywgbUJ1ZmZlci5mcmFtZUNvdW50KTsKICAgICB9CkBAIC0xODIsOCArMTg0LDggQEAKICAgICAvLyBBTE9HVygiRG9uZTogaW5kZXg9JWQsIGZyYWN0aW9uPSV1IiwgaW5wdXRJbmRleCwgcGhhc2VGcmFjdGlvbik7CiAgICAgbUlucHV0SW5kZXggPSBpbnB1dEluZGV4OwogICAgIG1QaGFzZUZyYWN0aW9uID0gcGhhc2VGcmFjdGlvbjsKKyAgICByZXR1cm4gb3V0cHV0SW5kZXg7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX0KLTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJDdWJpYy5oCmluZGV4IGIzMTVkYTUuLjRiNDViMGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckN1YmljLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyQ3ViaWMuaApAQCAtMzEsNyArMzEsNyBAQAogICAgIEF1ZGlvUmVzYW1wbGVyQ3ViaWMoaW50IGluQ2hhbm5lbENvdW50LCBpbnQzMl90IHNhbXBsZVJhdGUpIDoKICAgICAgICAgQXVkaW9SZXNhbXBsZXIoaW5DaGFubmVsQ291bnQsIHNhbXBsZVJhdGUsIE1FRF9RVUFMSVRZKSB7CiAgICAgfQotICAgIHZpcnR1YWwgdm9pZCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorICAgIHZpcnR1YWwgc2l6ZV90IHJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CiBwcml2YXRlOgogICAgIC8vIG51bWJlciBvZiBiaXRzIHVzZWQgaW4gaW50ZXJwb2xhdGlvbiBtdWx0aXBseSAtIDE0IGJpdHMgYXZvaWRzIG92ZXJmbG93CkBAIC00Myw5ICs0Myw5IEBACiAgICAgICAgIGludDMyX3QgYSwgYiwgYywgeTAsIHkxLCB5MiwgeTM7CiAgICAgfSBzdGF0ZTsKICAgICB2b2lkIGluaXQoKTsKLSAgICB2b2lkIHJlc2FtcGxlTW9ubzE2KGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCisgICAgc2l6ZV90IHJlc2FtcGxlTW9ubzE2KGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7Ci0gICAgdm9pZCByZXNhbXBsZVN0ZXJlbzE2KGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCisgICAgc2l6ZV90IHJlc2FtcGxlU3RlcmVvMTYoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKICAgICBzdGF0aWMgaW5saW5lIGludDMyX3QgaW50ZXJwKHN0YXRlKiBwLCBpbnQzMl90IHgpIHsKICAgICAgICAgcmV0dXJuICgoKCgocC0+YSAqIHggPj4gMTQpICsgcC0+YikgKiB4ID4+IDE0KSArIHAtPmMpICogeCA+PiAxNCkgKyBwLT55MTsKQEAgLTYzLDYgKzYzLDYgQEAKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvKkFORFJPSURfQVVESU9fUkVTQU1QTEVSX0NVQklDX0gqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRHluLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckR5bi5jcHAKaW5kZXggMGVlYjIwMS4uNjQ4MWI4NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRHluLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJEeW4uY3BwCkBAIC00NzcsMTUgKzQ3NywxNSBAQAogfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgotdm9pZCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKK3NpemVfdCBBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6cmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKQogewotICAgICh0aGlzLT4qbVJlc2FtcGxlRnVuYykocmVpbnRlcnByZXRfY2FzdDxUTyo+KG91dCksIG91dEZyYW1lQ291bnQsIHByb3ZpZGVyKTsKKyAgICByZXR1cm4gKHRoaXMtPiptUmVzYW1wbGVGdW5jKShyZWludGVycHJldF9jYXN0PFRPKj4ob3V0KSwgb3V0RnJhbWVDb3VudCwgcHJvdmlkZXIpOwogfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPPgogdGVtcGxhdGU8aW50IENIQU5ORUxTLCBib29sIExPQ0tFRCwgaW50IFNUUklERT4KLXZvaWQgQXVkaW9SZXNhbXBsZXJEeW48VEMsIFRJLCBUTz46OnJlc2FtcGxlKFRPKiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorc2l6ZV90IEF1ZGlvUmVzYW1wbGVyRHluPFRDLCBUSSwgVE8+OjpyZXNhbXBsZShUTyogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpCiB7CiAgICAgLy8gVE9ETyBNb25vIC0+IE1vbm8gaXMgbm90IHN1cHBvcnRlZC4gT1VUUFVUX0NIQU5ORUxTIHJlZmxlY3RzIG1pbmltdW0gb2Ygc3RlcmVvIG91dC4KQEAgLTYxMCw2ICs2MTAsNyBAQAogICAgIEFMT0dfQVNTRVJUKG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKTsgLy8gdGhlcmUgbXVzdCBiZSBubyBmcmFtZXMgaW4gdGhlIGJ1ZmZlcgogICAgIG1JbkJ1ZmZlci5zZXRJbXB1bHNlKGltcHVsc2UpOwogICAgIG1QaGFzZUZyYWN0aW9uID0gcGhhc2VGcmFjdGlvbjsKKyAgICByZXR1cm4gb3V0cHV0SW5kZXggLyBPVVRQVVRfQ0hBTk5FTFM7CiB9CiAKIC8qIGluc3RhbnRpYXRlIHRlbXBsYXRlcyB1c2VkIGJ5IEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUgKi8KQEAgLTYxOCw0ICs2MTksNCBAQAogdGVtcGxhdGUgY2xhc3MgQXVkaW9SZXNhbXBsZXJEeW48aW50MzJfdCwgaW50MTZfdCwgaW50MzJfdD47CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJEeW4uaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckR5bi5oCmluZGV4IGU4ODZhNjguLjNiMWMzODEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckR5bi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckR5bi5oCkBAIC01Miw3ICs1Miw3IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKIAotICAgIHZpcnR1YWwgdm9pZCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorICAgIHZpcnR1YWwgc2l6ZV90IHJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBwcm92aWRlcik7CiAKIHByaXZhdGU6CkBAIC0xMTEsMTAgKzExMSwxMCBAQAogICAgICAgICAgICAgaW50IGluU2FtcGxlUmF0ZSwgaW50IG91dFNhbXBsZVJhdGUsIGRvdWJsZSB0YndDaGVhdCk7CiAKICAgICB0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFMsIGJvb2wgTE9DS0VELCBpbnQgU1RSSURFPgotICAgIHZvaWQgcmVzYW1wbGUoVE8qIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKKyAgICBzaXplX3QgcmVzYW1wbGUoVE8qIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKIAogICAgIC8vIGRlZmluZSBhIHBvaW50ZXIgdG8gbWVtYmVyIGZ1bmN0aW9uIHR5cGUgZm9yIHJlc2FtcGxlCi0gICAgdHlwZWRlZiB2b2lkIChBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6KnJlc2FtcGxlX0FCUF90KShUTyogb3V0LAorICAgIHR5cGVkZWYgc2l6ZV90IChBdWRpb1Jlc2FtcGxlckR5bjxUQywgVEksIFRPPjo6KnJlc2FtcGxlX0FCUF90KShUTyogb3V0LAogICAgICAgICAgICAgc2l6ZV90IG91dEZyYW1lQ291bnQsIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKIAogICAgIC8vIGRhdGEgLSB0aGUgY29udGlndW91cyBzdG9yYWdlIGFuZCBsYXlvdXQgb2YgdGhlc2UgaXMgaW1wb3J0YW50LgpAQCAtMTI3LDYgKzEyNyw2IEBACiAgICAgICAgICAgICAgIHZvaWQqIG1Db2VmQnVmZmVyOyAgICAgICAvLyBpZiBhIGZpbHRlciBpcyBjcmVhdGVkLCB0aGlzIGlzIG5vdCBudWxsCiB9OwogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgLypBTkRST0lEX0FVRElPX1JFU0FNUExFUl9EWU5fSCovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJHZW4uaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpckdlbi5oCmluZGV4IGYzNzE4YjYuLmFkMTg5NjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpckdlbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpckdlbi5oCkBAIC0yMDQsNyArMjA0LDggQEAKIAogdGVtcGxhdGUgPD4KIHN0cnVjdCBJMEFUZXJtPDA+IHsgLy8gMS9zcXJ0KDIqUEkpOwotICAgIHN0YXRpYyBjb25zdCBDT05TVEVYUFIgZG91YmxlIHZhbHVlID0gMC4zOTg5NDIyODA0MDE0MzI2Nzc5Mzk5NDYwNTk5MzQzODE4Njg0NzU4NTg2MzExNjQ5MzQ2NTc2NjU5MjU7CisgICAgc3RhdGljIGNvbnN0IENPTlNURVhQUiBkb3VibGUgdmFsdWUgPQorICAgICAgICAgICAgMC4zOTg5NDIyODA0MDE0MzI2Nzc5Mzk5NDYwNTk5MzQzODE4Njg0NzU4NTg2MzExNjQ5MzQ2NTc2NjU5MjU7CiB9OwogCiAjaWYgVVNFX0hPUk5FUlNfTUVUSE9ECkBAIC03MDYsNiArNzA3LDYgQEAKICAgICB9CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvKkFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9HRU5fSCovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJPcHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpck9wcy5oCmluZGV4IGJmMjE2M2YuLjY1ODI4NWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpck9wcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpck9wcy5oCkBAIC0yNSw3ICsyNSw3IEBACiAjZGVmaW5lIFVTRV9JTkxJTkVfQVNTRU1CTFkgKGZhbHNlKQogI2VuZGlmCiAKLSNpZiBVU0VfSU5MSU5FX0FTU0VNQkxZICYmIGRlZmluZWQoX19BUk1fTkVPTl9fKQorI2lmIGRlZmluZWQoX19hYXJjaDY0X18pIHx8IGRlZmluZWQoX19BUk1fTkVPTl9fKQogI2RlZmluZSBVU0VfTkVPTiAodHJ1ZSkKICNpbmNsdWRlIDxhcm1fbmVvbi5oPgogI2Vsc2UKQEAgLTE1OCw2ICsxNTgsNiBAQAogI2VuZGlmCiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvKkFORFJPSURfQVVESU9fUkVTQU1QTEVSX0ZJUl9PUFNfSCovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKaW5kZXggZWZjODA1NS4uMTc2MjAyZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaApAQCAtMTc0LDcgKzE3NCw4IEBACiAgKiBQcm9jZXNzKCkgY2FsbHMgUHJvY2Vzc0Jhc2UoKSB3aXRoIFRGVU5DID0gSW50ZXJwQ29tcHV0ZSwgZm9yIGludGVycG9sYXRlZCBwaGFzZS4KICAqLwogCi10ZW1wbGF0ZSA8aW50IENIQU5ORUxTLCBpbnQgU1RSSURFLCB0eXBlbmFtZSBURlVOQywgdHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVElOVEVSUD4KK3RlbXBsYXRlIDxpbnQgQ0hBTk5FTFMsIGludCBTVFJJREUsIHR5cGVuYW1lIFRGVU5DLCB0eXBlbmFtZSBUQywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRPLAorICAgICAgICB0eXBlbmFtZSBUSU5URVJQPgogc3RhdGljIGlubGluZQogdm9pZCBQcm9jZXNzQmFzZShUTyogY29uc3Qgb3V0LAogICAgICAgICBzaXplX3QgY291bnQsCkBAIC0yNDIsNiArMjQzLDkgQEAKICAgICB9CiB9CiAKKy8qIENhbGN1bGF0ZXMgYSBzaW5nbGUgb3V0cHV0IGZyYW1lIGZyb20gYSBwb2x5cGhhc2UgcmVzYW1wbGluZyBmaWx0ZXIuCisgKiBTZWUgUHJvY2VzcygpIGZvciBwYXJhbWV0ZXIgZGV0YWlscy4KKyAqLwogdGVtcGxhdGUgPGludCBDSEFOTkVMUywgaW50IFNUUklERSwgdHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KIHN0YXRpYyBpbmxpbmUKIHZvaWQgUHJvY2Vzc0woVE8qIGNvbnN0IG91dCwKQEAgLTI1NSw2ICsyNTksMzkgQEAKICAgICBQcm9jZXNzQmFzZTxDSEFOTkVMUywgU1RSSURFLCBJbnRlcnBOdWxsPihvdXQsIGNvdW50LCBjb2Vmc1AsIGNvZWZzTiwgc1AsIHNOLCAwLCB2b2x1bWVMUik7CiB9CiAKKy8qCisgKiBDYWxjdWxhdGVzIGEgc2luZ2xlIG91dHB1dCBmcmFtZSBmcm9tIGEgcG9seXBoYXNlIHJlc2FtcGxpbmcgZmlsdGVyLAorICogd2l0aCBmaWx0ZXIgcGhhc2UgaW50ZXJwb2xhdGlvbi4KKyAqCisgKiBAcGFyYW0gb3V0IHNob3VsZCBwb2ludCB0byB0aGUgb3V0cHV0IGJ1ZmZlciB3aXRoIHNwYWNlIGZvciBhdCBsZWFzdCBvbmUgb3V0cHV0IGZyYW1lLgorICoKKyAqIEBwYXJhbSBjb3VudCBzaG91bGQgYmUgaGFsZiB0aGUgc2l6ZSBvZiB0aGUgdG90YWwgZmlsdGVyIGxlbmd0aCAoaGFsZk51bUNvZWZzKSwgYXMgd2UKKyAqIHVzZSBzeW1tZXRyeSBpbiBmaWx0ZXIgY29lZmZpY2llbnRzIHRvIGV2YWx1YXRlIHR3byBkb3QgcHJvZHVjdHMuCisgKgorICogQHBhcmFtIGNvZWZzUCBpcyBvbmUgcGhhc2Ugb2YgdGhlIHBvbHlwaGFzZSBmaWx0ZXIgYmFuayBvZiBzaXplIGhhbGZOdW1Db2VmcywgY29ycmVzcG9uZGluZworICogdG8gdGhlIHBvc2l0aXZlIHNQLgorICoKKyAqIEBwYXJhbSBjb2Vmc04gaXMgb25lIHBoYXNlIG9mIHRoZSBwb2x5cGhhc2UgZmlsdGVyIGJhbmsgb2Ygc2l6ZSBoYWxmTnVtQ29lZnMsIGNvcnJlc3BvbmRpbmcKKyAqIHRvIHRoZSBuZWdhdGl2ZSBzTi4KKyAqCisgKiBAcGFyYW0gY29lZnNQMSBpcyB0aGUgbmV4dCBwaGFzZSBvZiBjb2Vmc1AgKHVzZWQgZm9yIGludGVycG9sYXRpb24pLgorICoKKyAqIEBwYXJhbSBjb2Vmc04xIGlzIHRoZSBuZXh0IHBoYXNlIG9mIGNvZWZzTiAodXNlZCBmb3IgaW50ZXJwb2xhdGlvbikuCisgKgorICogQHBhcmFtIHNQIGlzIHRoZSBwb3NpdGl2ZSBoYWxmIG9mIHRoZSBjb2VmZmljaWVudHMgKGFzIHZpZXdlZCBieSBhIGNvbnZvbHV0aW9uKSwKKyAqIHN0YXJ0aW5nIGF0IHRoZSBvcmlnaW5hbCBzYW1wbGVzIHBvaW50ZXIgYW5kIGRlY3JlbWVudGluZyAoYnkgQ0hBTk5FTFMpLgorICoKKyAqIEBwYXJhbSBzTiBpcyB0aGUgbmVnYXRpdmUgaGFsZiBvZiB0aGUgc2FtcGxlcyAoYXMgdmlld2VkIGJ5IGEgY29udm9sdXRpb24pLAorICogc3RhcnRpbmcgYXQgdGhlIG9yaWdpbmFsIHNhbXBsZXMgcG9pbnRlciArIENIQU5ORUxTIGFuZCBpbmNyZW1lbnRpbmcgKGJ5IENIQU5ORUxTKS4KKyAqCisgKiBAcGFyYW0gbGVycFAgVGhlIGZyYWN0aW9uYWwgc2l0aW5nIGJldHdlZW4gdGhlIHBvbHlwaGFzZSBpbmRpY2VzIGlzIGdpdmVuIGJ5IHRoZSBiaXRzCisgKiBiZWxvdyBjb2VmU2hpZnQuIFNlZSBmaXIoKSBmb3IgZGV0YWlscy4KKyAqCisgKiBAcGFyYW0gdm9sdW1lTFIgaXMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHR3byAzMiBiaXQgdm9sdW1lIHZhbHVlcywgb25lIHBlciBzdGVyZW8gY2hhbm5lbCwKKyAqIGV4cHJlc3NlZCBhcyBhIFMzMiBpbnRlZ2VyIG9yIGZsb2F0LiAgQSBuZWdhdGl2ZSB2YWx1ZSBpbnZlcnRzIHRoZSBjaGFubmVsIDE4MCBkZWdyZWVzLgorICogVGhlIHBvaW50ZXIgdm9sdW1lTFIgc2hvdWxkIGJlIGFsaWduZWQgdG8gYSBtaW5pbXVtIG9mIDggYnl0ZXMuCisgKiBBIHR5cGljYWwgdmFsdWUgZm9yIHZvbHVtZSBpcyAweDEwMDAgdG8gYWxpZ24gdG8gYSB1bml0eSBnYWluIG91dHB1dCBvZiAyMC4xMi4KKyAqLwogdGVtcGxhdGUgPGludCBDSEFOTkVMUywgaW50IFNUUklERSwgdHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVElOVEVSUD4KIHN0YXRpYyBpbmxpbmUKIHZvaWQgUHJvY2VzcyhUTyogY29uc3Qgb3V0LApAQCAtMjY4LDExICszMDUsMTIgQEAKICAgICAgICAgVElOVEVSUCBsZXJwUCwKICAgICAgICAgY29uc3QgVE8qIGNvbnN0IHZvbHVtZUxSKQogewotICAgIFByb2Nlc3NCYXNlPENIQU5ORUxTLCBTVFJJREUsIEludGVycENvbXB1dGU+KG91dCwgY291bnQsIGNvZWZzUCwgY29lZnNOLCBzUCwgc04sIGxlcnBQLCB2b2x1bWVMUik7CisgICAgUHJvY2Vzc0Jhc2U8Q0hBTk5FTFMsIFNUUklERSwgSW50ZXJwQ29tcHV0ZT4ob3V0LCBjb3VudCwgY29lZnNQLCBjb2Vmc04sIHNQLCBzTiwgbGVycFAsCisgICAgICAgICAgICB2b2x1bWVMUik7CiB9CiAKIC8qCi0gKiBDYWxjdWxhdGVzIGEgc2luZ2xlIG91dHB1dCBmcmFtZSAodHdvIHNhbXBsZXMpIGZyb20gaW5wdXQgc2FtcGxlIHBvaW50ZXIuCisgKiBDYWxjdWxhdGVzIGEgc2luZ2xlIG91dHB1dCBmcmFtZSBmcm9tIGlucHV0IHNhbXBsZSBwb2ludGVyLgogICoKICAqIFRoaXMgc2V0cyB1cCB0aGUgcGFyYW1zIGZvciB0aGUgYWNjZWxlcmF0ZWQgUHJvY2VzcygpIGFuZCBQcm9jZXNzTCgpCiAgKiBmdW5jdGlvbnMgdG8gZG8gdGhlIGFwcHJvcHJpYXRlIGRvdCBwcm9kdWN0cy4KQEAgLTMwNyw3ICszNDUsNyBAQAogICogdGhlIHBvc2l0aXZlIGhhbGYgb2YgdGhlIGZpbHRlciBpcyBkb3QgcHJvZHVjdCBmcm9tIHNhbXBsZXMgdG8gc2FtcGxlcy1oYWxmTnVtQ29lZnMrMS4KICAqCiAgKiBAcGFyYW0gdm9sdW1lTFIgaXMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHR3byAzMiBiaXQgdm9sdW1lIHZhbHVlcywgb25lIHBlciBzdGVyZW8gY2hhbm5lbCwKLSAqIGV4cHJlc3NlZCBhcyBhIFMzMiBpbnRlZ2VyLiAgQSBuZWdhdGl2ZSB2YWx1ZSBpbnZlcnRzIHRoZSBjaGFubmVsIDE4MCBkZWdyZWVzLgorICogZXhwcmVzc2VkIGFzIGEgUzMyIGludGVnZXIgb3IgZmxvYXQuICBBIG5lZ2F0aXZlIHZhbHVlIGludmVydHMgdGhlIGNoYW5uZWwgMTgwIGRlZ3JlZXMuCiAgKiBUaGUgcG9pbnRlciB2b2x1bWVMUiBzaG91bGQgYmUgYWxpZ25lZCB0byBhIG1pbmltdW0gb2YgOCBieXRlcy4KICAqIEEgdHlwaWNhbCB2YWx1ZSBmb3Igdm9sdW1lIGlzIDB4MTAwMCB0byBhbGlnbiB0byBhIHVuaXR5IGdhaW4gb3V0cHV0IG9mIDIwLjEyLgogICoKQEAgLTM5Niw2ICs0MzQsNiBAQAogICAgIH0KIH0KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8qQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX1BST0NFU1NfSCovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzTmVvbi5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzc05lb24uaAppbmRleCBmMzExY2VmLi4zZGU5ZWRkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzTmVvbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3NOZW9uLmgKQEAgLTIyLDE0ICsyMiwzNSBAQAogLy8gZGVwZW5kcyBvbiBBdWRpb1Jlc2FtcGxlckZpck9wcy5oLCBBdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaAogCiAjaWYgVVNFX05FT04KKworLy8gdXNlIGludHJpbnNpY3MgaWYgaW5saW5lIGFybTMyIGFzc2VtYmx5IGlzIG5vdCBwb3NzaWJsZQorI2lmICFVU0VfSU5MSU5FX0FTU0VNQkxZCisjZGVmaW5lIFVTRV9JTlRSSU5TSUMKKyNlbmRpZgorCisvLyBmb2xsb3dpbmcgaW50cmluc2ljcyBhdmFpbGFibGUgb25seSBvbiBBUk0gNjQgYml0IEFDTEUKKyNpZm5kZWYgX19hYXJjaDY0X18KKyN1bmRlZiB2bGQxcV9mMzJfeDIKKyN1bmRlZiB2bGQxcV9zMzJfeDIKKyNlbmRpZgorCisjZGVmaW5lIFRPX1NUUklORzIoeCkgI3gKKyNkZWZpbmUgVE9fU1RSSU5HKHgpIFRPX1NUUklORzIoeCkKKy8vIHVuY29tbWVudCB0byBwcmludCBHQ0MgdmVyc2lvbiwgbWF5IGJlIHJlbGV2YW50IGZvciBpbnRyaW5zaWMgb3B0aW1pemF0aW9ucworLyogI3ByYWdtYSBtZXNzYWdlICgiR0NDIHZlcnNpb246ICIgVE9fU1RSSU5HKF9fR05VQ19fKSBcCisgICAgICAgICIuIiBUT19TVFJJTkcoX19HTlVDX01JTk9SX18pIFwKKyAgICAgICAgIi4iIFRPX1NUUklORyhfX0dOVUNfUEFUQ0hMRVZFTF9fKSkgKi8KKwogLy8KLS8vIE5FT04gc3BlY2lhbGl6YXRpb25zIGFyZSBlbmFibGVkIGZvciBQcm9jZXNzKCkgYW5kIFByb2Nlc3NMKCkKKy8vIE5FT04gc3BlY2lhbGl6YXRpb25zIGFyZSBlbmFibGVkIGZvciBQcm9jZXNzKCkgYW5kIFByb2Nlc3NMKCkgaW4gQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKIC8vCi0vLyBUT0RPOiBTdHJpZGUgMTYgYW5kIFN0cmlkZSA4IGNhbiBiZSBjb21iaW5lZCB3aXRoIG9uZSBwYXNzIHN0cmlkZSA4IChpZiBuZWNlc3NhcnkpCi0vLyBhbmQgbG9vcGluZyBzdHJpZGUgMTYgKG9yIHZpY2UgdmVyc2EpLiBUaGlzIGhhcyBzb21lIHBvbHlwaGFzZSBjb2VmIGRhdGEgYWxpZ25tZW50Ci0vLyBpc3N1ZXMgd2l0aCBTMTYgY29lZnMuIENvbnNpZGVyIHRoaXMgbGF0ZXIuCisvLyBUd28gdmFyaWFudHMgYXJlIHByZXNlbnRlZCBoZXJlOgorLy8gQVJNIE5FT04gaW5saW5lIGFzc2VtYmx5IHdoaWNoIGFwcGVhcnMgdXAgdG8gMTAtMTUlIGZhc3RlciB0aGFuIGludHJpbnNpY3MgKGdjYyA0LjkpIGZvciBhcm0zMi4KKy8vIEFSTSBORU9OIGludHJpbnNpY3Mgd2hpY2ggY2FuIGFsc28gYmUgdXNlZCBieSBhcm02NCBhbmQgeDg2LzY0IHdpdGggTkVPTiBoZWFkZXIuCisvLwogCiAvLyBNYWNyb3MgdG8gc2F2ZSBhIG1vbm8vc3RlcmVvIGFjY3VtdWxhdG9yIHNhbXBsZSBpbiBxMCAoYW5kIHE0KSBhcyBzdGVyZW8gb3V0LgorLy8gVGhlc2UgYXJlIG9ubHkgdXNlZCBmb3IgaW5saW5lIGFzc2VtYmx5LgogI2RlZmluZSBBU1NFTUJMWV9BQ0NVTVVMQVRFX01PTk8gXAogICAgICAgICAidmxkMS5zMzIgICAgICAge2QyfSwgWyVbdkxSXTo2NF0gICAgICAgIFxuIi8qICgxKSBsb2FkIHZvbHVtZXMgKi9cCiAgICAgICAgICJ2bGQxLnMzMiAgICAgICB7ZDN9LCAlW291dF0gICAgICAgICAgICAgXG4iLyogKDIpIHVuYWxpZ25lZCBsb2FkIHRoZSBvdXRwdXQgKi9cCkBAIC00OSw2ICs3MCw0NTggQEAKICAgICAgICAgInZxYWRkLnMzMiAgICAgIGQzLCBkMywgZDAgICAgICAgICAgICAgICBcbiIvKiAoMSs0ZCkgYWNjdW11bGF0ZSByZXN1bHQgKHNhdHVyYXRpbmcpKi9cCiAgICAgICAgICJ2c3QxLnMzMiAgICAgICB7ZDN9LCAlW291dF0gICAgICAgICAgICAgXG4iLyogKDIrMmQpc3RvcmUgcmVzdWx0Ki8KIAordGVtcGxhdGUgPGludCBDSEFOTkVMUywgaW50IFNUUklERSwgYm9vbCBGSVhFRD4KK3N0YXRpYyBpbmxpbmUgdm9pZCBQcm9jZXNzTmVvbkludHJpbnNpYyhpbnQzMl90KiBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgY29uc3QgaW50MzJfdCogdm9sdW1lTFIsCisgICAgICAgIHVpbnQzMl90IGxlcnBQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AxLAorICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04xKQoreworICAgIEFMT0dfQVNTRVJUKGNvdW50ID4gMCAmJiAoY291bnQgJiA3KSA9PSAwKTsgLy8gbXVsdGlwbGUgb2YgOAorICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoQ0hBTk5FTFMgPT0gMSB8fCBDSEFOTkVMUyA9PSAyKTsKKworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBjb2Vmc1AgPSAoY29uc3QgaW50MTZfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzUCwgMTYpOworICAgIGNvZWZzTiA9IChjb25zdCBpbnQxNl90KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNOLCAxNik7CisKKyAgICBpbnQxNng0X3QgaW50ZXJwOworICAgIGlmICghRklYRUQpIHsKKyAgICAgICAgaW50ZXJwID0gdmR1cF9uX3MxNihsZXJwUCk7CisgICAgICAgIC8vaW50ZXJwID0gKGludDE2eDRfdCl2c2V0X2xhbmVfczMyICgoaW50MzJ4Ml90KWxlcnBQLCBpbnRlcnAsIDApOworICAgICAgICBjb2Vmc1AxID0gKGNvbnN0IGludDE2X3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc1AxLCAxNik7CisgICAgICAgIGNvZWZzTjEgPSAoY29uc3QgaW50MTZfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzTjEsIDE2KTsKKyAgICB9CisgICAgaW50MzJ4NF90IGFjY3VtLCBhY2N1bTI7CisgICAgLy8gd2FybmluZyB1bmluaXRpYWxpemVkIGlmIHdlIHVzZSB2ZW9ycV9zMzIKKyAgICAvLyAoYWx0ZXJuYXRpdmUgdG8gYmVsb3cpIGFjY3VtID0gdmVvcnFfczMyKGFjY3VtLCBhY2N1bSk7CisgICAgYWNjdW0gPSB2ZHVwcV9uX3MzMigwKTsKKyAgICBpZiAoQ0hBTk5FTFMgPT0gMikgeworICAgICAgICAvLyAoYWx0ZXJuYXRpdmUgdG8gYmVsb3cpIGFjY3VtMiA9IHZlb3JxX3MzMihhY2N1bTIsIGFjY3VtMik7CisgICAgICAgIGFjY3VtMiA9IHZkdXBxX25fczMyKDApOworICAgIH0KKyAgICBkbyB7CisgICAgICAgIGludDE2eDhfdCBwb3NDb2VmID0gdmxkMXFfczE2KGNvZWZzUCk7CisgICAgICAgIGNvZWZzUCArPSA4OworICAgICAgICBpbnQxNng4X3QgbmVnQ29lZiA9IHZsZDFxX3MxNihjb2Vmc04pOworICAgICAgICBjb2Vmc04gKz0gODsKKyAgICAgICAgaWYgKCFGSVhFRCkgeyAvLyBpbnRlcnBvbGF0ZQorICAgICAgICAgICAgaW50MTZ4OF90IHBvc0NvZWYxID0gdmxkMXFfczE2KGNvZWZzUDEpOworICAgICAgICAgICAgY29lZnNQMSArPSA4OworICAgICAgICAgICAgaW50MTZ4OF90IG5lZ0NvZWYxID0gdmxkMXFfczE2KGNvZWZzTjEpOworICAgICAgICAgICAgY29lZnNOMSArPSA4OworCisgICAgICAgICAgICBwb3NDb2VmMSA9IHZzdWJxX3MxNihwb3NDb2VmMSwgcG9zQ29lZik7CisgICAgICAgICAgICBuZWdDb2VmID0gdnN1YnFfczE2KG5lZ0NvZWYsIG5lZ0NvZWYxKTsKKworICAgICAgICAgICAgcG9zQ29lZjEgPSB2cXJkbXVsaHFfbGFuZV9zMTYocG9zQ29lZjEsIGludGVycCwgMCk7CisgICAgICAgICAgICBuZWdDb2VmID0gdnFyZG11bGhxX2xhbmVfczE2KG5lZ0NvZWYsIGludGVycCwgMCk7CisKKyAgICAgICAgICAgIHBvc0NvZWYgPSB2YWRkcV9zMTYocG9zQ29lZiwgcG9zQ29lZjEpOworICAgICAgICAgICAgbmVnQ29lZiA9IHZhZGRxX3MxNihuZWdDb2VmLCBuZWdDb2VmMSk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChDSEFOTkVMUykgeworICAgICAgICBjYXNlIDE6IHsKKyAgICAgICAgICAgIGludDE2eDhfdCBwb3NTYW1wID0gdmxkMXFfczE2KHNQKTsKKyAgICAgICAgICAgIGludDE2eDhfdCBuZWdTYW1wID0gdmxkMXFfczE2KHNOKTsKKyAgICAgICAgICAgIHNOICs9IDg7CisgICAgICAgICAgICBwb3NTYW1wID0gdnJldjY0cV9zMTYocG9zU2FtcCk7CisKKyAgICAgICAgICAgIC8vIGRvdCBwcm9kdWN0CisgICAgICAgICAgICBhY2N1bSA9IHZtbGFsX3MxNihhY2N1bSwgdmdldF9sb3dfczE2KHBvc1NhbXApLCB2Z2V0X2hpZ2hfczE2KHBvc0NvZWYpKTsgLy8gcmV2ZXJzZWQKKyAgICAgICAgICAgIGFjY3VtID0gdm1sYWxfczE2KGFjY3VtLCB2Z2V0X2hpZ2hfczE2KHBvc1NhbXApLCB2Z2V0X2xvd19zMTYocG9zQ29lZikpOyAvLyByZXZlcnNlZAorICAgICAgICAgICAgYWNjdW0gPSB2bWxhbF9zMTYoYWNjdW0sIHZnZXRfbG93X3MxNihuZWdTYW1wKSwgdmdldF9sb3dfczE2KG5lZ0NvZWYpKTsKKyAgICAgICAgICAgIGFjY3VtID0gdm1sYWxfczE2KGFjY3VtLCB2Z2V0X2hpZ2hfczE2KG5lZ1NhbXApLCB2Z2V0X2hpZ2hfczE2KG5lZ0NvZWYpKTsKKyAgICAgICAgICAgIHNQIC09IDg7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgMjogeworICAgICAgICAgICAgaW50MTZ4OHgyX3QgcG9zU2FtcCA9IHZsZDJxX3MxNihzUCk7CisgICAgICAgICAgICBpbnQxNng4eDJfdCBuZWdTYW1wID0gdmxkMnFfczE2KHNOKTsKKyAgICAgICAgICAgIHNOICs9IDE2OworICAgICAgICAgICAgcG9zU2FtcC52YWxbMF0gPSB2cmV2NjRxX3MxNihwb3NTYW1wLnZhbFswXSk7CisgICAgICAgICAgICBwb3NTYW1wLnZhbFsxXSA9IHZyZXY2NHFfczE2KHBvc1NhbXAudmFsWzFdKTsKKworICAgICAgICAgICAgLy8gZG90IHByb2R1Y3QKKyAgICAgICAgICAgIGFjY3VtID0gdm1sYWxfczE2KGFjY3VtLCB2Z2V0X2xvd19zMTYocG9zU2FtcC52YWxbMF0pLCB2Z2V0X2hpZ2hfczE2KHBvc0NvZWYpKTsgLy8gcgorICAgICAgICAgICAgYWNjdW0gPSB2bWxhbF9zMTYoYWNjdW0sIHZnZXRfaGlnaF9zMTYocG9zU2FtcC52YWxbMF0pLCB2Z2V0X2xvd19zMTYocG9zQ29lZikpOyAvLyByCisgICAgICAgICAgICBhY2N1bTIgPSB2bWxhbF9zMTYoYWNjdW0yLCB2Z2V0X2xvd19zMTYocG9zU2FtcC52YWxbMV0pLCB2Z2V0X2hpZ2hfczE2KHBvc0NvZWYpKTsgLy8gcgorICAgICAgICAgICAgYWNjdW0yID0gdm1sYWxfczE2KGFjY3VtMiwgdmdldF9oaWdoX3MxNihwb3NTYW1wLnZhbFsxXSksIHZnZXRfbG93X3MxNihwb3NDb2VmKSk7IC8vIHIKKyAgICAgICAgICAgIGFjY3VtID0gdm1sYWxfczE2KGFjY3VtLCB2Z2V0X2xvd19zMTYobmVnU2FtcC52YWxbMF0pLCB2Z2V0X2xvd19zMTYobmVnQ29lZikpOworICAgICAgICAgICAgYWNjdW0gPSB2bWxhbF9zMTYoYWNjdW0sIHZnZXRfaGlnaF9zMTYobmVnU2FtcC52YWxbMF0pLCB2Z2V0X2hpZ2hfczE2KG5lZ0NvZWYpKTsKKyAgICAgICAgICAgIGFjY3VtMiA9IHZtbGFsX3MxNihhY2N1bTIsIHZnZXRfbG93X3MxNihuZWdTYW1wLnZhbFsxXSksIHZnZXRfbG93X3MxNihuZWdDb2VmKSk7CisgICAgICAgICAgICBhY2N1bTIgPSB2bWxhbF9zMTYoYWNjdW0yLCB2Z2V0X2hpZ2hfczE2KG5lZ1NhbXAudmFsWzFdKSwgdmdldF9oaWdoX3MxNihuZWdDb2VmKSk7CisgICAgICAgICAgICBzUCAtPSAxNjsKKyAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgIH0gd2hpbGUgKGNvdW50IC09IDgpOworCisgICAgLy8gbXVsdGlwbHkgYnkgdm9sdW1lIGFuZCBzYXZlCisgICAgdm9sdW1lTFIgPSAoY29uc3QgaW50MzJfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKHZvbHVtZUxSLCA4KTsKKyAgICBpbnQzMngyX3QgdkxSID0gdmxkMV9zMzIodm9sdW1lTFIpOworICAgIGludDMyeDJfdCBvdXRTYW1wID0gdmxkMV9zMzIob3V0KTsKKyAgICAvLyBjb21iaW5lIGFuZCBmdW5uZWwgZG93biBhY2N1bXVsYXRvcgorICAgIGludDMyeDJfdCBvdXRBY2N1bSA9IHZwYWRkX3MzMih2Z2V0X2xvd19zMzIoYWNjdW0pLCB2Z2V0X2hpZ2hfczMyKGFjY3VtKSk7CisgICAgaWYgKENIQU5ORUxTID09IDEpIHsKKyAgICAgICAgLy8gZHVwbGljYXRlIGFjY3VtIHRvIGJvdGggTCBhbmQgUgorICAgICAgICBvdXRBY2N1bSA9IHZwYWRkX3MzMihvdXRBY2N1bSwgb3V0QWNjdW0pOworICAgIH0gZWxzZSBpZiAoQ0hBTk5FTFMgPT0gMikgeworICAgICAgICAvLyBhY2N1bTIgY29udGFpbnMgUiwgZm9sZCBpbgorICAgICAgICBpbnQzMngyX3Qgb3V0QWNjdW0yID0gdnBhZGRfczMyKHZnZXRfbG93X3MzMihhY2N1bTIpLCB2Z2V0X2hpZ2hfczMyKGFjY3VtMikpOworICAgICAgICBvdXRBY2N1bSA9IHZwYWRkX3MzMihvdXRBY2N1bSwgb3V0QWNjdW0yKTsKKyAgICB9CisgICAgb3V0QWNjdW0gPSB2cXJkbXVsaF9zMzIob3V0QWNjdW0sIHZMUik7CisgICAgb3V0U2FtcCA9IHZxYWRkX3MzMihvdXRTYW1wLCBvdXRBY2N1bSk7CisgICAgdnN0MV9zMzIob3V0LCBvdXRTYW1wKTsKK30KKwordGVtcGxhdGUgPGludCBDSEFOTkVMUywgaW50IFNUUklERSwgYm9vbCBGSVhFRD4KK3N0YXRpYyBpbmxpbmUgdm9pZCBQcm9jZXNzTmVvbkludHJpbnNpYyhpbnQzMl90KiBvdXQsCisgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAorICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKKyAgICAgICAgY29uc3QgaW50MzJfdCogdm9sdW1lTFIsCisgICAgICAgIHVpbnQzMl90IGxlcnBQLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AxLAorICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04xKQoreworICAgIEFMT0dfQVNTRVJUKGNvdW50ID4gMCAmJiAoY291bnQgJiA3KSA9PSAwKTsgLy8gbXVsdGlwbGUgb2YgOAorICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoQ0hBTk5FTFMgPT0gMSB8fCBDSEFOTkVMUyA9PSAyKTsKKworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBjb2Vmc1AgPSAoY29uc3QgaW50MzJfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzUCwgMTYpOworICAgIGNvZWZzTiA9IChjb25zdCBpbnQzMl90KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNOLCAxNik7CisKKyAgICBpbnQzMngyX3QgaW50ZXJwOworICAgIGlmICghRklYRUQpIHsKKyAgICAgICAgaW50ZXJwID0gdmR1cF9uX3MzMihsZXJwUCk7CisgICAgICAgIGNvZWZzUDEgPSAoY29uc3QgaW50MzJfdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKGNvZWZzUDEsIDE2KTsKKyAgICAgICAgY29lZnNOMSA9IChjb25zdCBpbnQzMl90KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNOMSwgMTYpOworICAgIH0KKyAgICBpbnQzMng0X3QgYWNjdW0sIGFjY3VtMjsKKyAgICAvLyB3YXJuaW5nIHVuaW5pdGlhbGl6ZWQgaWYgd2UgdXNlIHZlb3JxX3MzMgorICAgIC8vIChhbHRlcm5hdGl2ZSB0byBiZWxvdykgYWNjdW0gPSB2ZW9ycV9zMzIoYWNjdW0sIGFjY3VtKTsKKyAgICBhY2N1bSA9IHZkdXBxX25fczMyKDApOworICAgIGlmIChDSEFOTkVMUyA9PSAyKSB7CisgICAgICAgIC8vIChhbHRlcm5hdGl2ZSB0byBiZWxvdykgYWNjdW0yID0gdmVvcnFfczMyKGFjY3VtMiwgYWNjdW0yKTsKKyAgICAgICAgYWNjdW0yID0gdmR1cHFfbl9zMzIoMCk7CisgICAgfQorICAgIGRvIHsKKyNpZmRlZiB2bGQxcV9zMzJfeDIKKyAgICAgICAgaW50MzJ4NHgyX3QgcG9zQ29lZiA9IHZsZDFxX3MzMl94Mihjb2Vmc1ApOworICAgICAgICBjb2Vmc1AgKz0gODsKKyAgICAgICAgaW50MzJ4NHgyX3QgbmVnQ29lZiA9IHZsZDFxX3MzMl94Mihjb2Vmc04pOworICAgICAgICBjb2Vmc04gKz0gODsKKyNlbHNlCisgICAgICAgIGludDMyeDR4Ml90IHBvc0NvZWY7CisgICAgICAgIHBvc0NvZWYudmFsWzBdID0gdmxkMXFfczMyKGNvZWZzUCk7CisgICAgICAgIGNvZWZzUCArPSA0OworICAgICAgICBwb3NDb2VmLnZhbFsxXSA9IHZsZDFxX3MzMihjb2Vmc1ApOworICAgICAgICBjb2Vmc1AgKz0gNDsKKyAgICAgICAgaW50MzJ4NHgyX3QgbmVnQ29lZjsKKyAgICAgICAgbmVnQ29lZi52YWxbMF0gPSB2bGQxcV9zMzIoY29lZnNOKTsKKyAgICAgICAgY29lZnNOICs9IDQ7CisgICAgICAgIG5lZ0NvZWYudmFsWzFdID0gdmxkMXFfczMyKGNvZWZzTik7CisgICAgICAgIGNvZWZzTiArPSA0OworI2VuZGlmCisgICAgICAgIGlmICghRklYRUQpIHsgLy8gaW50ZXJwb2xhdGUKKyNpZmRlZiB2bGQxcV9zMzJfeDIKKyAgICAgICAgICAgIGludDMyeDR4Ml90IHBvc0NvZWYxID0gdmxkMXFfczMyX3gyKGNvZWZzUDEpOworICAgICAgICAgICAgY29lZnNQMSArPSA4OworICAgICAgICAgICAgaW50MzJ4NHgyX3QgbmVnQ29lZjEgPSB2bGQxcV9zMzJfeDIoY29lZnNOMSk7CisgICAgICAgICAgICBjb2Vmc04xICs9IDg7CisjZWxzZQorICAgICAgICAgICAgaW50MzJ4NHgyX3QgcG9zQ29lZjE7CisgICAgICAgICAgICBwb3NDb2VmMS52YWxbMF0gPSB2bGQxcV9zMzIoY29lZnNQMSk7CisgICAgICAgICAgICBjb2Vmc1AxICs9IDQ7CisgICAgICAgICAgICBwb3NDb2VmMS52YWxbMV0gPSB2bGQxcV9zMzIoY29lZnNQMSk7CisgICAgICAgICAgICBjb2Vmc1AxICs9IDQ7CisgICAgICAgICAgICBpbnQzMng0eDJfdCBuZWdDb2VmMTsKKyAgICAgICAgICAgIG5lZ0NvZWYxLnZhbFswXSA9IHZsZDFxX3MzMihjb2Vmc04xKTsKKyAgICAgICAgICAgIGNvZWZzTjEgKz0gNDsKKyAgICAgICAgICAgIG5lZ0NvZWYxLnZhbFsxXSA9IHZsZDFxX3MzMihjb2Vmc04xKTsKKyAgICAgICAgICAgIGNvZWZzTjEgKz0gNDsKKyNlbmRpZgorCisgICAgICAgICAgICBwb3NDb2VmMS52YWxbMF0gPSB2c3VicV9zMzIocG9zQ29lZjEudmFsWzBdLCBwb3NDb2VmLnZhbFswXSk7CisgICAgICAgICAgICBwb3NDb2VmMS52YWxbMV0gPSB2c3VicV9zMzIocG9zQ29lZjEudmFsWzFdLCBwb3NDb2VmLnZhbFsxXSk7CisgICAgICAgICAgICBuZWdDb2VmLnZhbFswXSA9IHZzdWJxX3MzMihuZWdDb2VmLnZhbFswXSwgbmVnQ29lZjEudmFsWzBdKTsKKyAgICAgICAgICAgIG5lZ0NvZWYudmFsWzFdID0gdnN1YnFfczMyKG5lZ0NvZWYudmFsWzFdLCBuZWdDb2VmMS52YWxbMV0pOworCisgICAgICAgICAgICBwb3NDb2VmMS52YWxbMF0gPSB2cXJkbXVsaHFfbGFuZV9zMzIocG9zQ29lZjEudmFsWzBdLCBpbnRlcnAsIDApOworICAgICAgICAgICAgcG9zQ29lZjEudmFsWzFdID0gdnFyZG11bGhxX2xhbmVfczMyKHBvc0NvZWYxLnZhbFsxXSwgaW50ZXJwLCAwKTsKKyAgICAgICAgICAgIG5lZ0NvZWYudmFsWzBdID0gdnFyZG11bGhxX2xhbmVfczMyKG5lZ0NvZWYudmFsWzBdLCBpbnRlcnAsIDApOworICAgICAgICAgICAgbmVnQ29lZi52YWxbMV0gPSB2cXJkbXVsaHFfbGFuZV9zMzIobmVnQ29lZi52YWxbMV0sIGludGVycCwgMCk7CisKKyAgICAgICAgICAgIHBvc0NvZWYudmFsWzBdID0gdmFkZHFfczMyKHBvc0NvZWYudmFsWzBdLCBwb3NDb2VmMS52YWxbMF0pOworICAgICAgICAgICAgcG9zQ29lZi52YWxbMV0gPSB2YWRkcV9zMzIocG9zQ29lZi52YWxbMV0sIHBvc0NvZWYxLnZhbFsxXSk7CisgICAgICAgICAgICBuZWdDb2VmLnZhbFswXSA9IHZhZGRxX3MzMihuZWdDb2VmLnZhbFswXSwgbmVnQ29lZjEudmFsWzBdKTsKKyAgICAgICAgICAgIG5lZ0NvZWYudmFsWzFdID0gdmFkZHFfczMyKG5lZ0NvZWYudmFsWzFdLCBuZWdDb2VmMS52YWxbMV0pOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoQ0hBTk5FTFMpIHsKKyAgICAgICAgY2FzZSAxOiB7CisgICAgICAgICAgICBpbnQxNng4X3QgcG9zU2FtcCA9IHZsZDFxX3MxNihzUCk7CisgICAgICAgICAgICBpbnQxNng4X3QgbmVnU2FtcCA9IHZsZDFxX3MxNihzTik7CisgICAgICAgICAgICBzTiArPSA4OworICAgICAgICAgICAgcG9zU2FtcCA9IHZyZXY2NHFfczE2KHBvc1NhbXApOworCisgICAgICAgICAgICBpbnQzMng0X3QgcG9zU2FtcDAgPSB2c2hsbF9uX3MxNih2Z2V0X2xvd19zMTYocG9zU2FtcCksIDE1KTsKKyAgICAgICAgICAgIGludDMyeDRfdCBwb3NTYW1wMSA9IHZzaGxsX25fczE2KHZnZXRfaGlnaF9zMTYocG9zU2FtcCksIDE1KTsKKyAgICAgICAgICAgIGludDMyeDRfdCBuZWdTYW1wMCA9IHZzaGxsX25fczE2KHZnZXRfbG93X3MxNihuZWdTYW1wKSwgMTUpOworICAgICAgICAgICAgaW50MzJ4NF90IG5lZ1NhbXAxID0gdnNobGxfbl9zMTYodmdldF9oaWdoX3MxNihuZWdTYW1wKSwgMTUpOworCisgICAgICAgICAgICAvLyBkb3QgcHJvZHVjdAorICAgICAgICAgICAgcG9zU2FtcDAgPSB2cXJkbXVsaHFfczMyKHBvc1NhbXAwLCBwb3NDb2VmLnZhbFsxXSk7IC8vIHJldmVyc2VkCisgICAgICAgICAgICBwb3NTYW1wMSA9IHZxcmRtdWxocV9zMzIocG9zU2FtcDEsIHBvc0NvZWYudmFsWzBdKTsgLy8gcmV2ZXJzZWQKKyAgICAgICAgICAgIG5lZ1NhbXAwID0gdnFyZG11bGhxX3MzMihuZWdTYW1wMCwgbmVnQ29lZi52YWxbMF0pOworICAgICAgICAgICAgbmVnU2FtcDEgPSB2cXJkbXVsaHFfczMyKG5lZ1NhbXAxLCBuZWdDb2VmLnZhbFsxXSk7CisKKyAgICAgICAgICAgIGFjY3VtID0gdmFkZHFfczMyKGFjY3VtLCBwb3NTYW1wMCk7CisgICAgICAgICAgICBuZWdTYW1wMCA9IHZhZGRxX3MzMihuZWdTYW1wMCwgbmVnU2FtcDEpOworICAgICAgICAgICAgYWNjdW0gPSB2YWRkcV9zMzIoYWNjdW0sIHBvc1NhbXAxKTsKKyAgICAgICAgICAgIGFjY3VtID0gdmFkZHFfczMyKGFjY3VtLCBuZWdTYW1wMCk7CisKKyAgICAgICAgICAgIHNQIC09IDg7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgMjogeworICAgICAgICAgICAgaW50MTZ4OHgyX3QgcG9zU2FtcCA9IHZsZDJxX3MxNihzUCk7CisgICAgICAgICAgICBpbnQxNng4eDJfdCBuZWdTYW1wID0gdmxkMnFfczE2KHNOKTsKKyAgICAgICAgICAgIHNOICs9IDE2OworICAgICAgICAgICAgcG9zU2FtcC52YWxbMF0gPSB2cmV2NjRxX3MxNihwb3NTYW1wLnZhbFswXSk7CisgICAgICAgICAgICBwb3NTYW1wLnZhbFsxXSA9IHZyZXY2NHFfczE2KHBvc1NhbXAudmFsWzFdKTsKKworICAgICAgICAgICAgLy8gbGVmdAorICAgICAgICAgICAgaW50MzJ4NF90IHBvc1NhbXAwID0gdnNobGxfbl9zMTYodmdldF9sb3dfczE2KHBvc1NhbXAudmFsWzBdKSwgMTUpOworICAgICAgICAgICAgaW50MzJ4NF90IHBvc1NhbXAxID0gdnNobGxfbl9zMTYodmdldF9oaWdoX3MxNihwb3NTYW1wLnZhbFswXSksIDE1KTsKKyAgICAgICAgICAgIGludDMyeDRfdCBuZWdTYW1wMCA9IHZzaGxsX25fczE2KHZnZXRfbG93X3MxNihuZWdTYW1wLnZhbFswXSksIDE1KTsKKyAgICAgICAgICAgIGludDMyeDRfdCBuZWdTYW1wMSA9IHZzaGxsX25fczE2KHZnZXRfaGlnaF9zMTYobmVnU2FtcC52YWxbMF0pLCAxNSk7CisKKyAgICAgICAgICAgIC8vIGRvdCBwcm9kdWN0CisgICAgICAgICAgICBwb3NTYW1wMCA9IHZxcmRtdWxocV9zMzIocG9zU2FtcDAsIHBvc0NvZWYudmFsWzFdKTsgLy8gcmV2ZXJzZWQKKyAgICAgICAgICAgIHBvc1NhbXAxID0gdnFyZG11bGhxX3MzMihwb3NTYW1wMSwgcG9zQ29lZi52YWxbMF0pOyAvLyByZXZlcnNlZAorICAgICAgICAgICAgbmVnU2FtcDAgPSB2cXJkbXVsaHFfczMyKG5lZ1NhbXAwLCBuZWdDb2VmLnZhbFswXSk7CisgICAgICAgICAgICBuZWdTYW1wMSA9IHZxcmRtdWxocV9zMzIobmVnU2FtcDEsIG5lZ0NvZWYudmFsWzFdKTsKKworICAgICAgICAgICAgYWNjdW0gPSB2YWRkcV9zMzIoYWNjdW0sIHBvc1NhbXAwKTsKKyAgICAgICAgICAgIG5lZ1NhbXAwID0gdmFkZHFfczMyKG5lZ1NhbXAwLCBuZWdTYW1wMSk7CisgICAgICAgICAgICBhY2N1bSA9IHZhZGRxX3MzMihhY2N1bSwgcG9zU2FtcDEpOworICAgICAgICAgICAgYWNjdW0gPSB2YWRkcV9zMzIoYWNjdW0sIG5lZ1NhbXAwKTsKKworICAgICAgICAgICAgLy8gcmlnaHQKKyAgICAgICAgICAgIHBvc1NhbXAwID0gdnNobGxfbl9zMTYodmdldF9sb3dfczE2KHBvc1NhbXAudmFsWzFdKSwgMTUpOworICAgICAgICAgICAgcG9zU2FtcDEgPSB2c2hsbF9uX3MxNih2Z2V0X2hpZ2hfczE2KHBvc1NhbXAudmFsWzFdKSwgMTUpOworICAgICAgICAgICAgbmVnU2FtcDAgPSB2c2hsbF9uX3MxNih2Z2V0X2xvd19zMTYobmVnU2FtcC52YWxbMV0pLCAxNSk7CisgICAgICAgICAgICBuZWdTYW1wMSA9IHZzaGxsX25fczE2KHZnZXRfaGlnaF9zMTYobmVnU2FtcC52YWxbMV0pLCAxNSk7CisKKyAgICAgICAgICAgIC8vIGRvdCBwcm9kdWN0CisgICAgICAgICAgICBwb3NTYW1wMCA9IHZxcmRtdWxocV9zMzIocG9zU2FtcDAsIHBvc0NvZWYudmFsWzFdKTsgLy8gcmV2ZXJzZWQKKyAgICAgICAgICAgIHBvc1NhbXAxID0gdnFyZG11bGhxX3MzMihwb3NTYW1wMSwgcG9zQ29lZi52YWxbMF0pOyAvLyByZXZlcnNlZAorICAgICAgICAgICAgbmVnU2FtcDAgPSB2cXJkbXVsaHFfczMyKG5lZ1NhbXAwLCBuZWdDb2VmLnZhbFswXSk7CisgICAgICAgICAgICBuZWdTYW1wMSA9IHZxcmRtdWxocV9zMzIobmVnU2FtcDEsIG5lZ0NvZWYudmFsWzFdKTsKKworICAgICAgICAgICAgYWNjdW0yID0gdmFkZHFfczMyKGFjY3VtMiwgcG9zU2FtcDApOworICAgICAgICAgICAgbmVnU2FtcDAgPSB2YWRkcV9zMzIobmVnU2FtcDAsIG5lZ1NhbXAxKTsKKyAgICAgICAgICAgIGFjY3VtMiA9IHZhZGRxX3MzMihhY2N1bTIsIHBvc1NhbXAxKTsKKyAgICAgICAgICAgIGFjY3VtMiA9IHZhZGRxX3MzMihhY2N1bTIsIG5lZ1NhbXAwKTsKKworICAgICAgICAgICAgc1AgLT0gMTY7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChjb3VudCAtPSA4KTsKKworICAgIC8vIG11bHRpcGx5IGJ5IHZvbHVtZSBhbmQgc2F2ZQorICAgIHZvbHVtZUxSID0gKGNvbnN0IGludDMyX3QqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZCh2b2x1bWVMUiwgOCk7CisgICAgaW50MzJ4Ml90IHZMUiA9IHZsZDFfczMyKHZvbHVtZUxSKTsKKyAgICBpbnQzMngyX3Qgb3V0U2FtcCA9IHZsZDFfczMyKG91dCk7CisgICAgLy8gY29tYmluZSBhbmQgZnVubmVsIGRvd24gYWNjdW11bGF0b3IKKyAgICBpbnQzMngyX3Qgb3V0QWNjdW0gPSB2cGFkZF9zMzIodmdldF9sb3dfczMyKGFjY3VtKSwgdmdldF9oaWdoX3MzMihhY2N1bSkpOworICAgIGlmIChDSEFOTkVMUyA9PSAxKSB7CisgICAgICAgIC8vIGR1cGxpY2F0ZSBhY2N1bSB0byBib3RoIEwgYW5kIFIKKyAgICAgICAgb3V0QWNjdW0gPSB2cGFkZF9zMzIob3V0QWNjdW0sIG91dEFjY3VtKTsKKyAgICB9IGVsc2UgaWYgKENIQU5ORUxTID09IDIpIHsKKyAgICAgICAgLy8gYWNjdW0yIGNvbnRhaW5zIFIsIGZvbGQgaW4KKyAgICAgICAgaW50MzJ4Ml90IG91dEFjY3VtMiA9IHZwYWRkX3MzMih2Z2V0X2xvd19zMzIoYWNjdW0yKSwgdmdldF9oaWdoX3MzMihhY2N1bTIpKTsKKyAgICAgICAgb3V0QWNjdW0gPSB2cGFkZF9zMzIob3V0QWNjdW0sIG91dEFjY3VtMik7CisgICAgfQorICAgIG91dEFjY3VtID0gdnFyZG11bGhfczMyKG91dEFjY3VtLCB2TFIpOworICAgIG91dFNhbXAgPSB2cWFkZF9zMzIob3V0U2FtcCwgb3V0QWNjdW0pOworICAgIHZzdDFfczMyKG91dCwgb3V0U2FtcCk7Cit9CisKK3RlbXBsYXRlIDxpbnQgQ0hBTk5FTFMsIGludCBTVFJJREUsIGJvb2wgRklYRUQ+CitzdGF0aWMgaW5saW5lIHZvaWQgUHJvY2Vzc05lb25JbnRyaW5zaWMoZmxvYXQqIG91dCwKKyAgICAgICAgaW50IGNvdW50LAorICAgICAgICBjb25zdCBmbG9hdCogY29lZnNQLAorICAgICAgICBjb25zdCBmbG9hdCogY29lZnNOLAorICAgICAgICBjb25zdCBmbG9hdCogc1AsCisgICAgICAgIGNvbnN0IGZsb2F0KiBzTiwKKyAgICAgICAgY29uc3QgZmxvYXQqIHZvbHVtZUxSLAorICAgICAgICBmbG9hdCBsZXJwUCwKKyAgICAgICAgY29uc3QgZmxvYXQqIGNvZWZzUDEsCisgICAgICAgIGNvbnN0IGZsb2F0KiBjb2Vmc04xKQoreworICAgIEFMT0dfQVNTRVJUKGNvdW50ID4gMCAmJiAoY291bnQgJiA3KSA9PSAwKTsgLy8gbXVsdGlwbGUgb2YgOAorICAgIENPTVBJTEVfVElNRV9BU1NFUlRfRlVOQ1RJT05fU0NPUEUoQ0hBTk5FTFMgPT0gMSB8fCBDSEFOTkVMUyA9PSAyKTsKKworICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKKyAgICBjb2Vmc1AgPSAoY29uc3QgZmxvYXQqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc1AsIDE2KTsKKyAgICBjb2Vmc04gPSAoY29uc3QgZmxvYXQqKV9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChjb2Vmc04sIDE2KTsKKworICAgIGZsb2F0MzJ4Ml90IGludGVycDsKKyAgICBpZiAoIUZJWEVEKSB7CisgICAgICAgIGludGVycCA9IHZkdXBfbl9mMzIobGVycFApOworICAgICAgICBjb2Vmc1AxID0gKGNvbnN0IGZsb2F0KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNQMSwgMTYpOworICAgICAgICBjb2Vmc04xID0gKGNvbnN0IGZsb2F0KilfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQoY29lZnNOMSwgMTYpOworICAgIH0KKyAgICBmbG9hdDMyeDRfdCBhY2N1bSwgYWNjdW0yOworICAgIC8vIHdhcm5pbmcgdW5pbml0aWFsaXplZCBpZiB3ZSB1c2UgdmVvcnFfczMyCisgICAgLy8gKGFsdGVybmF0aXZlIHRvIGJlbG93KSBhY2N1bSA9IHZlb3JxX3MzMihhY2N1bSwgYWNjdW0pOworICAgIGFjY3VtID0gdmR1cHFfbl9mMzIoMCk7CisgICAgaWYgKENIQU5ORUxTID09IDIpIHsKKyAgICAgICAgLy8gKGFsdGVybmF0aXZlIHRvIGJlbG93KSBhY2N1bTIgPSB2ZW9ycV9zMzIoYWNjdW0yLCBhY2N1bTIpOworICAgICAgICBhY2N1bTIgPSB2ZHVwcV9uX2YzMigwKTsKKyAgICB9CisgICAgZG8geworI2lmZGVmIHZsZDFxX2YzMl94MgorICAgICAgICBmbG9hdDMyeDR4Ml90IHBvc0NvZWYgPSB2bGQxcV9mMzJfeDIoY29lZnNQKTsKKyAgICAgICAgY29lZnNQICs9IDg7CisgICAgICAgIGZsb2F0MzJ4NHgyX3QgbmVnQ29lZiA9IHZsZDFxX2YzMl94Mihjb2Vmc04pOworICAgICAgICBjb2Vmc04gKz0gODsKKyNlbHNlCisgICAgICAgIGZsb2F0MzJ4NHgyX3QgcG9zQ29lZjsKKyAgICAgICAgcG9zQ29lZi52YWxbMF0gPSB2bGQxcV9mMzIoY29lZnNQKTsKKyAgICAgICAgY29lZnNQICs9IDQ7CisgICAgICAgIHBvc0NvZWYudmFsWzFdID0gdmxkMXFfZjMyKGNvZWZzUCk7CisgICAgICAgIGNvZWZzUCArPSA0OworICAgICAgICBmbG9hdDMyeDR4Ml90IG5lZ0NvZWY7CisgICAgICAgIG5lZ0NvZWYudmFsWzBdID0gdmxkMXFfZjMyKGNvZWZzTik7CisgICAgICAgIGNvZWZzTiArPSA0OworICAgICAgICBuZWdDb2VmLnZhbFsxXSA9IHZsZDFxX2YzMihjb2Vmc04pOworICAgICAgICBjb2Vmc04gKz0gNDsKKyNlbmRpZgorICAgICAgICBpZiAoIUZJWEVEKSB7IC8vIGludGVycG9sYXRlCisjaWZkZWYgdmxkMXFfZjMyX3gyCisgICAgICAgICAgICBmbG9hdDMyeDR4Ml90IHBvc0NvZWYxID0gdmxkMXFfZjMyX3gyKGNvZWZzUDEpOworICAgICAgICAgICAgY29lZnNQMSArPSA4OworICAgICAgICAgICAgZmxvYXQzMng0eDJfdCBuZWdDb2VmMSA9IHZsZDFxX2YzMl94Mihjb2Vmc04xKTsKKyAgICAgICAgICAgIGNvZWZzTjEgKz0gODsKKyNlbHNlCisgICAgICAgICAgICBmbG9hdDMyeDR4Ml90IHBvc0NvZWYxOworICAgICAgICAgICAgcG9zQ29lZjEudmFsWzBdID0gdmxkMXFfZjMyKGNvZWZzUDEpOworICAgICAgICAgICAgY29lZnNQMSArPSA0OworICAgICAgICAgICAgcG9zQ29lZjEudmFsWzFdID0gdmxkMXFfZjMyKGNvZWZzUDEpOworICAgICAgICAgICAgY29lZnNQMSArPSA0OworICAgICAgICAgICAgZmxvYXQzMng0eDJfdCBuZWdDb2VmMTsKKyAgICAgICAgICAgIG5lZ0NvZWYxLnZhbFswXSA9IHZsZDFxX2YzMihjb2Vmc04xKTsKKyAgICAgICAgICAgIGNvZWZzTjEgKz0gNDsKKyAgICAgICAgICAgIG5lZ0NvZWYxLnZhbFsxXSA9IHZsZDFxX2YzMihjb2Vmc04xKTsKKyAgICAgICAgICAgIGNvZWZzTjEgKz0gNDsKKyNlbmRpZgorICAgICAgICAgICAgcG9zQ29lZjEudmFsWzBdID0gdnN1YnFfZjMyKHBvc0NvZWYxLnZhbFswXSwgcG9zQ29lZi52YWxbMF0pOworICAgICAgICAgICAgcG9zQ29lZjEudmFsWzFdID0gdnN1YnFfZjMyKHBvc0NvZWYxLnZhbFsxXSwgcG9zQ29lZi52YWxbMV0pOworICAgICAgICAgICAgbmVnQ29lZi52YWxbMF0gPSB2c3VicV9mMzIobmVnQ29lZi52YWxbMF0sIG5lZ0NvZWYxLnZhbFswXSk7CisgICAgICAgICAgICBuZWdDb2VmLnZhbFsxXSA9IHZzdWJxX2YzMihuZWdDb2VmLnZhbFsxXSwgbmVnQ29lZjEudmFsWzFdKTsKKworICAgICAgICAgICAgcG9zQ29lZi52YWxbMF0gPSB2bWxhcV9sYW5lX2YzMihwb3NDb2VmLnZhbFswXSwgcG9zQ29lZjEudmFsWzBdLCBpbnRlcnAsIDApOworICAgICAgICAgICAgcG9zQ29lZi52YWxbMV0gPSB2bWxhcV9sYW5lX2YzMihwb3NDb2VmLnZhbFsxXSwgcG9zQ29lZjEudmFsWzFdLCBpbnRlcnAsIDApOworICAgICAgICAgICAgbmVnQ29lZi52YWxbMF0gPSB2bWxhcV9sYW5lX2YzMihuZWdDb2VmMS52YWxbMF0sIG5lZ0NvZWYudmFsWzBdLCBpbnRlcnAsIDApOyAvLyByZXYKKyAgICAgICAgICAgIG5lZ0NvZWYudmFsWzFdID0gdm1sYXFfbGFuZV9mMzIobmVnQ29lZjEudmFsWzFdLCBuZWdDb2VmLnZhbFsxXSwgaW50ZXJwLCAwKTsgLy8gcmV2CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChDSEFOTkVMUykgeworICAgICAgICBjYXNlIDE6IHsKKyNpZmRlZiB2bGQxcV9mMzJfeDIKKyAgICAgICAgICAgIGZsb2F0MzJ4NHgyX3QgcG9zU2FtcCA9IHZsZDFxX2YzMl94MihzUCk7CisgICAgICAgICAgICBmbG9hdDMyeDR4Ml90IG5lZ1NhbXAgPSB2bGQxcV9mMzJfeDIoc04pOworICAgICAgICAgICAgc04gKz0gODsKKyAgICAgICAgICAgIHNQIC09IDg7CisjZWxzZQorICAgICAgICAgICAgZmxvYXQzMng0eDJfdCBwb3NTYW1wOworICAgICAgICAgICAgcG9zU2FtcC52YWxbMF0gPSB2bGQxcV9mMzIoc1ApOworICAgICAgICAgICAgc1AgKz0gNDsKKyAgICAgICAgICAgIHBvc1NhbXAudmFsWzFdID0gdmxkMXFfZjMyKHNQKTsKKyAgICAgICAgICAgIHNQIC09IDEyOworICAgICAgICAgICAgZmxvYXQzMng0eDJfdCBuZWdTYW1wOworICAgICAgICAgICAgbmVnU2FtcC52YWxbMF0gPSB2bGQxcV9mMzIoc04pOworICAgICAgICAgICAgc04gKz0gNDsKKyAgICAgICAgICAgIG5lZ1NhbXAudmFsWzFdID0gdmxkMXFfZjMyKHNOKTsKKyAgICAgICAgICAgIHNOICs9IDQ7CisjZW5kaWYKKyAgICAgICAgICAgIC8vIGVmZmVjdGl2ZWx5IHdlIHdhbnQgYSB2cmV2MTI4cV9mMzIoKQorICAgICAgICAgICAgcG9zU2FtcC52YWxbMF0gPSB2cmV2NjRxX2YzMihwb3NTYW1wLnZhbFswXSk7CisgICAgICAgICAgICBwb3NTYW1wLnZhbFsxXSA9IHZyZXY2NHFfZjMyKHBvc1NhbXAudmFsWzFdKTsKKyAgICAgICAgICAgIHBvc1NhbXAudmFsWzBdID0gdmNvbWJpbmVfZjMyKAorICAgICAgICAgICAgICAgICAgICB2Z2V0X2hpZ2hfZjMyKHBvc1NhbXAudmFsWzBdKSwgdmdldF9sb3dfZjMyKHBvc1NhbXAudmFsWzBdKSk7CisgICAgICAgICAgICBwb3NTYW1wLnZhbFsxXSA9IHZjb21iaW5lX2YzMigKKyAgICAgICAgICAgICAgICAgICAgdmdldF9oaWdoX2YzMihwb3NTYW1wLnZhbFsxXSksIHZnZXRfbG93X2YzMihwb3NTYW1wLnZhbFsxXSkpOworCisgICAgICAgICAgICBhY2N1bSA9IHZtbGFxX2YzMihhY2N1bSwgcG9zU2FtcC52YWxbMF0sIHBvc0NvZWYudmFsWzFdKTsKKyAgICAgICAgICAgIGFjY3VtID0gdm1sYXFfZjMyKGFjY3VtLCBwb3NTYW1wLnZhbFsxXSwgcG9zQ29lZi52YWxbMF0pOworICAgICAgICAgICAgYWNjdW0gPSB2bWxhcV9mMzIoYWNjdW0sIG5lZ1NhbXAudmFsWzBdLCBuZWdDb2VmLnZhbFswXSk7CisgICAgICAgICAgICBhY2N1bSA9IHZtbGFxX2YzMihhY2N1bSwgbmVnU2FtcC52YWxbMV0sIG5lZ0NvZWYudmFsWzFdKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSAyOiB7CisgICAgICAgICAgICBmbG9hdDMyeDR4Ml90IHBvc1NhbXAwID0gdmxkMnFfZjMyKHNQKTsKKyAgICAgICAgICAgIHNQICs9IDg7CisgICAgICAgICAgICBmbG9hdDMyeDR4Ml90IG5lZ1NhbXAwID0gdmxkMnFfZjMyKHNOKTsKKyAgICAgICAgICAgIHNOICs9IDg7CisgICAgICAgICAgICBwb3NTYW1wMC52YWxbMF0gPSB2cmV2NjRxX2YzMihwb3NTYW1wMC52YWxbMF0pOworICAgICAgICAgICAgcG9zU2FtcDAudmFsWzFdID0gdnJldjY0cV9mMzIocG9zU2FtcDAudmFsWzFdKTsKKyAgICAgICAgICAgIHBvc1NhbXAwLnZhbFswXSA9IHZjb21iaW5lX2YzMigKKyAgICAgICAgICAgICAgICAgICAgdmdldF9oaWdoX2YzMihwb3NTYW1wMC52YWxbMF0pLCB2Z2V0X2xvd19mMzIocG9zU2FtcDAudmFsWzBdKSk7CisgICAgICAgICAgICBwb3NTYW1wMC52YWxbMV0gPSB2Y29tYmluZV9mMzIoCisgICAgICAgICAgICAgICAgICAgIHZnZXRfaGlnaF9mMzIocG9zU2FtcDAudmFsWzFdKSwgdmdldF9sb3dfZjMyKHBvc1NhbXAwLnZhbFsxXSkpOworCisgICAgICAgICAgICBmbG9hdDMyeDR4Ml90IHBvc1NhbXAxID0gdmxkMnFfZjMyKHNQKTsKKyAgICAgICAgICAgIHNQIC09IDI0OworICAgICAgICAgICAgZmxvYXQzMng0eDJfdCBuZWdTYW1wMSA9IHZsZDJxX2YzMihzTik7CisgICAgICAgICAgICBzTiArPSA4OworICAgICAgICAgICAgcG9zU2FtcDEudmFsWzBdID0gdnJldjY0cV9mMzIocG9zU2FtcDEudmFsWzBdKTsKKyAgICAgICAgICAgIHBvc1NhbXAxLnZhbFsxXSA9IHZyZXY2NHFfZjMyKHBvc1NhbXAxLnZhbFsxXSk7CisgICAgICAgICAgICBwb3NTYW1wMS52YWxbMF0gPSB2Y29tYmluZV9mMzIoCisgICAgICAgICAgICAgICAgICAgIHZnZXRfaGlnaF9mMzIocG9zU2FtcDEudmFsWzBdKSwgdmdldF9sb3dfZjMyKHBvc1NhbXAxLnZhbFswXSkpOworICAgICAgICAgICAgcG9zU2FtcDEudmFsWzFdID0gdmNvbWJpbmVfZjMyKAorICAgICAgICAgICAgICAgICAgICB2Z2V0X2hpZ2hfZjMyKHBvc1NhbXAxLnZhbFsxXSksIHZnZXRfbG93X2YzMihwb3NTYW1wMS52YWxbMV0pKTsKKworICAgICAgICAgICAgLy8gTm90ZTogc3BlZWQgaXMgYWZmZWN0ZWQgYnkgYWNjdW11bGF0aW9uIG9yZGVyLgorICAgICAgICAgICAgLy8gQWxzbywgc3BlZWQgYXBwZWFycyBzbG93ZXIgdXNpbmcgdm11bC92YWRkIGluc3RlYWQgb2Ygdm1sYSBmb3IKKyAgICAgICAgICAgIC8vIHN0ZXJlbyBjYXNlLCBjb21wYXJhYmxlIGZvciBtb25vLgorCisgICAgICAgICAgICBhY2N1bSA9IHZtbGFxX2YzMihhY2N1bSwgbmVnU2FtcDAudmFsWzBdLCBuZWdDb2VmLnZhbFswXSk7CisgICAgICAgICAgICBhY2N1bSA9IHZtbGFxX2YzMihhY2N1bSwgbmVnU2FtcDEudmFsWzBdLCBuZWdDb2VmLnZhbFsxXSk7CisgICAgICAgICAgICBhY2N1bTIgPSB2bWxhcV9mMzIoYWNjdW0yLCBuZWdTYW1wMC52YWxbMV0sIG5lZ0NvZWYudmFsWzBdKTsKKyAgICAgICAgICAgIGFjY3VtMiA9IHZtbGFxX2YzMihhY2N1bTIsIG5lZ1NhbXAxLnZhbFsxXSwgbmVnQ29lZi52YWxbMV0pOworCisgICAgICAgICAgICBhY2N1bSA9IHZtbGFxX2YzMihhY2N1bSwgcG9zU2FtcDAudmFsWzBdLCBwb3NDb2VmLnZhbFsxXSk7IC8vIHJldmVyc2VkCisgICAgICAgICAgICBhY2N1bSA9IHZtbGFxX2YzMihhY2N1bSwgcG9zU2FtcDEudmFsWzBdLCBwb3NDb2VmLnZhbFswXSk7IC8vIHJldmVyc2VkCisgICAgICAgICAgICBhY2N1bTIgPSB2bWxhcV9mMzIoYWNjdW0yLCBwb3NTYW1wMC52YWxbMV0sIHBvc0NvZWYudmFsWzFdKTsgLy8gcmV2ZXJzZWQKKyAgICAgICAgICAgIGFjY3VtMiA9IHZtbGFxX2YzMihhY2N1bTIsIHBvc1NhbXAxLnZhbFsxXSwgcG9zQ29lZi52YWxbMF0pOyAvLyByZXZlcnNlZAorICAgICAgICB9IGJyZWFrOworICAgICAgICB9CisgICAgfSB3aGlsZSAoY291bnQgLT0gOCk7CisKKyAgICAvLyBtdWx0aXBseSBieSB2b2x1bWUgYW5kIHNhdmUKKyAgICB2b2x1bWVMUiA9IChjb25zdCBmbG9hdCopX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKHZvbHVtZUxSLCA4KTsKKyAgICBmbG9hdDMyeDJfdCB2TFIgPSB2bGQxX2YzMih2b2x1bWVMUik7CisgICAgZmxvYXQzMngyX3Qgb3V0U2FtcCA9IHZsZDFfZjMyKG91dCk7CisgICAgLy8gY29tYmluZSBhbmQgZnVubmVsIGRvd24gYWNjdW11bGF0b3IKKyAgICBmbG9hdDMyeDJfdCBvdXRBY2N1bSA9IHZwYWRkX2YzMih2Z2V0X2xvd19mMzIoYWNjdW0pLCB2Z2V0X2hpZ2hfZjMyKGFjY3VtKSk7CisgICAgaWYgKENIQU5ORUxTID09IDEpIHsKKyAgICAgICAgLy8gZHVwbGljYXRlIGFjY3VtIHRvIGJvdGggTCBhbmQgUgorICAgICAgICBvdXRBY2N1bSA9IHZwYWRkX2YzMihvdXRBY2N1bSwgb3V0QWNjdW0pOworICAgIH0gZWxzZSBpZiAoQ0hBTk5FTFMgPT0gMikgeworICAgICAgICAvLyBhY2N1bTIgY29udGFpbnMgUiwgZm9sZCBpbgorICAgICAgICBmbG9hdDMyeDJfdCBvdXRBY2N1bTIgPSB2cGFkZF9mMzIodmdldF9sb3dfZjMyKGFjY3VtMiksIHZnZXRfaGlnaF9mMzIoYWNjdW0yKSk7CisgICAgICAgIG91dEFjY3VtID0gdnBhZGRfZjMyKG91dEFjY3VtLCBvdXRBY2N1bTIpOworICAgIH0KKyAgICBvdXRTYW1wID0gdm1sYV9mMzIob3V0U2FtcCwgb3V0QWNjdW0sIHZMUik7CisgICAgdnN0MV9mMzIob3V0LCBvdXRTYW1wKTsKK30KKwogdGVtcGxhdGUgPD4KIGlubGluZSB2b2lkIFByb2Nlc3NMPDEsIDE2PihpbnQzMl90KiBjb25zdCBvdXQsCiAgICAgICAgIGludCBjb3VudCwKQEAgLTU4LDYgKzUzMSwxMCBAQAogICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKICAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCiB7CisjaWZkZWYgVVNFX0lOVFJJTlNJQworICAgIFByb2Nlc3NOZW9uSW50cmluc2ljPDEsIDE2LCB0cnVlPihvdXQsIGNvdW50LCBjb2Vmc1AsIGNvZWZzTiwgc1AsIHNOLCB2b2x1bWVMUiwKKyAgICAgICAgICAgIDAgLypsZXJwUCovLCBOVUxMIC8qY29lZnNQMSovLCBOVUxMIC8qY29lZnNOMSovKTsKKyNlbHNlCiAgICAgY29uc3QgaW50IENIQU5ORUxTID0gMTsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCiAgICAgY29uc3QgaW50IFNUUklERSA9IDE2OwogICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKQEAgLTk5LDYgKzU3Niw3IEBACiAgICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKICAgICAgICAgICAicTgiLCAicTEwIgogICAgICk7CisjZW5kaWYKIH0KIAogdGVtcGxhdGUgPD4KQEAgLTExMCw2ICs1ODgsMTAgQEAKICAgICAgICAgY29uc3QgaW50MTZfdCogc04sCiAgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQogeworI2lmZGVmIFVTRV9JTlRSSU5TSUMKKyAgICBQcm9jZXNzTmVvbkludHJpbnNpYzwyLCAxNiwgdHJ1ZT4ob3V0LCBjb3VudCwgY29lZnNQLCBjb2Vmc04sIHNQLCBzTiwgdm9sdW1lTFIsCisgICAgICAgICAgICAwIC8qbGVycFAqLywgTlVMTCAvKmNvZWZzUDEqLywgTlVMTCAvKmNvZWZzTjEqLyk7CisjZWxzZQogICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDI7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcwogICAgIGNvbnN0IGludCBTVFJJREUgPSAxNjsKICAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CkBAIC0xMTksMTMgKzYwMSwxMyBAQAogCiAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCiAKLSAgICAgICAgInZsZDIuMTYgICAgICAgIHtxMiwgcTN9LCBbJVtzUF1dICAgICAgICBcbiIvLyAoMyswZCkgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKLSAgICAgICAgInZsZDIuMTYgICAgICAgIHtxNSwgcTZ9LCBbJVtzTl1dISAgICAgICBcbiIvLyAoMykgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtxMiwgcTN9LCBbJVtzUF1dICAgICAgICBcbiIvLyAoMyswZCkgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIGZyYW1lcworICAgICAgICAidmxkMi4xNiAgICAgICAge3E1LCBxNn0sIFslW3NOXV0hICAgICAgIFxuIi8vICgzKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gZnJhbWVzCiAgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTh9LCBbJVtjb2Vmc1AwXToxMjhdISAgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCiAgICAgICAgICJ2bGQxLjE2ICAgICAgICB7cTEwfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gKDEpIGxvYWQgOCAxNi1iaXRzIGNvZWZzCiAKLSAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgbGVmdCBwb3NpdGl2ZQotICAgICAgICAidnJldjY0LjE2ICAgICAgcTMsIHEzICAgICAgICAgICAgICAgICAgIFxuIi8vICgwIGNvbWJpbmVzKykgcmV2ZXJzZSByaWdodCBwb3NpdGl2ZQorICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgIFxuIi8vICgxKSByZXZlcnNlIDggc2FtcGxlcyBvZiBwb3NpdGl2ZSBsZWZ0CisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMywgcTMgICAgICAgICAgICAgICAgICAgXG4iLy8gKDAgY29tYmluZXMrKSByZXZlcnNlIHBvc2l0aXZlIHJpZ2h0CiAKICAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNCwgZDE3ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgKHJldmVyc2VkKSBzYW1wbGVzIGxlZnQKICAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNSwgZDE2ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgKHJldmVyc2VkKSBzYW1wbGVzIGxlZnQKQEAgLTE1Nyw2ICs2MzksNyBAQAogICAgICAgICAgICJxNCIsICJxNSIsICJxNiIsCiAgICAgICAgICAgInE4IiwgInExMCIKICAgICAgKTsKKyNlbmRpZgogfQogCiB0ZW1wbGF0ZSA8PgpAQCAtMTcxLDYgKzY1NCwxMSBAQAogICAgICAgICB1aW50MzJfdCBsZXJwUCwKICAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCiB7CisjaWZkZWYgVVNFX0lOVFJJTlNJQworICAgIFByb2Nlc3NOZW9uSW50cmluc2ljPDEsIDE2LCBmYWxzZT4ob3V0LCBjb3VudCwgY29lZnNQLCBjb2Vmc04sIHNQLCBzTiwgdm9sdW1lTFIsCisgICAgICAgICAgICBsZXJwUCwgY29lZnNQMSwgY29lZnNOMSk7CisjZWxzZQorCiAgICAgY29uc3QgaW50IENIQU5ORUxTID0gMTsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCiAgICAgY29uc3QgaW50IFNUUklERSA9IDE2OwogICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKQEAgLTIyNyw2ICs3MTUsNyBAQAogICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCiAgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiCiAgICAgKTsKKyNlbmRpZgogfQogCiB0ZW1wbGF0ZSA8PgpAQCAtMjQxLDYgKzczMCwxMCBAQAogICAgICAgICB1aW50MzJfdCBsZXJwUCwKICAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCiB7CisjaWZkZWYgVVNFX0lOVFJJTlNJQworICAgIFByb2Nlc3NOZW9uSW50cmluc2ljPDIsIDE2LCBmYWxzZT4ob3V0LCBjb3VudCwgY29lZnNQLCBjb2Vmc04sIHNQLCBzTiwgdm9sdW1lTFIsCisgICAgICAgICAgICBsZXJwUCwgY29lZnNQMSwgY29lZnNOMSk7CisjZWxzZQogICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDI7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcwogICAgIGNvbnN0IGludCBTVFJJREUgPSAxNjsKICAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CkBAIC0yNTEsOCArNzQ0LDggQEAKIAogICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgogCi0gICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTIsIHEzfSwgWyVbc1BdXSAgICAgICAgXG4iLy8gKDMrMGQpIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCi0gICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTUsIHE2fSwgWyVbc05dXSEgICAgICAgXG4iLy8gKDMpIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBzYW1wbGVzCisgICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTIsIHEzfSwgWyVbc1BdXSAgICAgICAgXG4iLy8gKDMrMGQpIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBmcmFtZXMKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtxNSwgcTZ9LCBbJVtzTl1dISAgICAgICBcbiIvLyAoMykgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIGZyYW1lcwogICAgICAgICAidmxkMS4xNiAgICAgICAge3E4fSwgWyVbY29lZnNQMF06MTI4XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcwogICAgICAgICAidmxkMS4xNiAgICAgICAge3E5fSwgWyVbY29lZnNQMV06MTI4XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgogICAgICAgICAidmxkMS4xNiAgICAgICAge3ExMH0sIFslW2NvZWZzTjFdOjEyOF0hIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcwpAQCAtMjY0LDggKzc1Nyw4IEBACiAgICAgICAgICJ2cXJkbXVsaC5zMTYgICBxOSwgcTksIGQyWzBdICAgICAgICAgICAgXG4iLy8gKDIpIGludGVycG9sYXRlIChzdGVwMikgMXN0IHNldCBvZiBjb2VmcwogICAgICAgICAidnFyZG11bGguczE2ICAgcTExLCBxMTEsIGQyWzBdICAgICAgICAgIFxuIi8vICgyKSBpbnRlcnBvbGF0ZSAoc3RlcDIpIDJuZCBzZXQgb2YgY29lZnMKIAotICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgIFxuIi8vICgxKSByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBsZWZ0IHBvc2l0aXZlCi0gICAgICAgICJ2cmV2NjQuMTYgICAgICBxMywgcTMgICAgICAgICAgICAgICAgICAgXG4iLy8gKDEpIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIHJpZ2h0IHBvc2l0aXZlCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgXG4iLy8gKDEpIHJldmVyc2UgOCBzYW1wbGVzIG9mIHBvc2l0aXZlIGxlZnQKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEzLCBxMyAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZSA4IHNhbXBsZXMgb2YgcG9zaXRpdmUgcmlnaHQKIAogICAgICAgICAidmFkZC5zMTYgICAgICAgcTgsIHE4LCBxOSAgICAgICAgICAgICAgIFxuIi8vICgxKzFkKSBpbnRlcnBvbGF0ZSAoc3RlcDMpIDFzdCBzZXQKICAgICAgICAgInZhZGQuczE2ICAgICAgIHExMCwgcTEwLCBxMTEgICAgICAgICAgICBcbiIvLyAoMSsxZCkgaW50ZXJwb2xhdGUgKHN0ZXAzKSAybmQgc2V0CkBAIC0zMDMsNiArNzk2LDcgQEAKICAgICAgICAgICAicTQiLCAicTUiLCAicTYiLAogICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIgogICAgICk7CisjZW5kaWYKIH0KIAogdGVtcGxhdGUgPD4KQEAgLTMxNCw2ICs4MDgsMTAgQEAKICAgICAgICAgY29uc3QgaW50MTZfdCogc04sCiAgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQogeworI2lmZGVmIFVTRV9JTlRSSU5TSUMKKyAgICBQcm9jZXNzTmVvbkludHJpbnNpYzwxLCAxNiwgdHJ1ZT4ob3V0LCBjb3VudCwgY29lZnNQLCBjb2Vmc04sIHNQLCBzTiwgdm9sdW1lTFIsCisgICAgICAgICAgICAwIC8qbGVycFAqLywgTlVMTCAvKmNvZWZzUDEqLywgTlVMTCAvKmNvZWZzTjEqLyk7CisjZWxzZQogICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDE7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcwogICAgIGNvbnN0IGludCBTVFJJREUgPSAxNjsKICAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CkBAIC0zMjcsNyArODI1LDcgQEAKICAgICAgICAgInZsZDEuMzIgICAgICAgIHtxOCwgcTl9LCBbJVtjb2Vmc1AwXToxMjhdISAgIFxuIi8vIGxvYWQgOCAzMi1iaXRzIGNvZWZzCiAgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEwLCBxMTF9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyBsb2FkIDggMzItYml0cyBjb2VmcwogCi0gICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCisgICAgICAgICJ2cmV2NjQuMTYgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDggc2FtcGxlcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQogCiAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsIGQ0LCAjMTUgICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCiAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTMsIGQ1LCAjMTUgICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCkBAIC0zMzUsMTAgKzgzMywxMCBAQAogICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCBkNiwgIzE1ICAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwogICAgICAgICAidnNobGwuczE2ICAgICAgcTE1LCBkNywgIzE1ICAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwogCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTkgICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTExICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTkgICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTExICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzCiAKICAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CiAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTMsIHExMywgcTE0ICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdApAQCAtMzY0LDYgKzg2Miw3IEBACiAgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAogICAgICAgICAgICJxMTIiLCAicTEzIiwgInExNCIsICJxMTUiCiAgICAgKTsKKyNlbmRpZgogfQogCiB0ZW1wbGF0ZSA8PgpAQCAtMzc1LDYgKzg3NCwxMCBAQAogICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKICAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCiB7CisjaWZkZWYgVVNFX0lOVFJJTlNJQworICAgIFByb2Nlc3NOZW9uSW50cmluc2ljPDIsIDE2LCB0cnVlPihvdXQsIGNvdW50LCBjb2Vmc1AsIGNvZWZzTiwgc1AsIHNOLCB2b2x1bWVMUiwKKyAgICAgICAgICAgIDAgLypsZXJwUCovLCBOVUxMIC8qY29lZnNQMSovLCBOVUxMIC8qY29lZnNOMSovKTsKKyNlbHNlCiAgICAgY29uc3QgaW50IENIQU5ORUxTID0gMjsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCiAgICAgY29uc3QgaW50IFNUUklERSA9IDE2OwogICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKQEAgLTM4NCwxMyArODg3LDEzIEBACiAKICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgogCi0gICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTIsIHEzfSwgWyVbc1BdXSAgICAgICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcwotICAgICAgICAidmxkMi4xNiAgICAgICAge3E1LCBxNn0sIFslW3NOXV0hICAgICAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKLSAgICAgICAgInZsZDEuMzIgICAgICAgIHtxOCwgcTl9LCBbJVtjb2Vmc1AwXToxMjhdISAgIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCi0gICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEwLCBxMTF9LCBbJVtjb2Vmc04wXToxMjhdISBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcworICAgICAgICAidmxkMi4xNiAgICAgICAge3EyLCBxM30sIFslW3NQXV0gICAgICAgICAgICAgXG4iLy8gbG9hZCA4IDE2LWJpdHMgc3RlcmVvIGZyYW1lcworICAgICAgICAidmxkMi4xNiAgICAgICAge3E1LCBxNn0sIFslW3NOXV0hICAgICAgICAgICAgXG4iLy8gbG9hZCA4IDE2LWJpdHMgc3RlcmVvIGZyYW1lcworICAgICAgICAidmxkMS4zMiAgICAgICAge3E4LCBxOX0sIFslW2NvZWZzUDBdOjEyOF0hICAgXG4iLy8gbG9hZCA4IDMyLWJpdHMgY29lZnMKKyAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTAsIHExMX0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vIGxvYWQgOCAzMi1iaXRzIGNvZWZzCiAKLSAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKLSAgICAgICAgInZyZXY2NC4xNiAgICAgIHEzLCBxMyAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgOCBzYW1wbGVzIG9mIHBvc2l0aXZlIGxlZnQKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEzLCBxMyAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgOCBzYW1wbGVzIG9mIHBvc2l0aXZlIHJpZ2h0CiAKICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgIGQ0LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMywgIGQ1LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKQEAgLTM5OCwxNSArOTAxLDE1IEBACiAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsICBkMTAsICMxNSAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCiAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTUsICBkMTEsICMxNSAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCiAKLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOSAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBxOCAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBxMTEgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOSAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTEzLCBxMTMsIHE4ICAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNSwgcTE1LCBxMTEgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgY29lZgogCiAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMiAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAogICAgICAgICAidmFkZC5zMzIgICAgICAgcTEzLCBxMTMsIHExNCAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTE1ICAgICAgICAgICAgICAgICAgIFxuIi8vICgrMSkgYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEzICAgICAgICAgICAgICAgICAgIFxuIi8vICgrMSkgYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTE1ICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMyAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAogCiAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsICBkNiwgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCiAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTMsICBkNywgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCkBAIC00MTQsMTUgKzkxNywxNSBAQAogICAgICAgICAidnNobGwuczE2ICAgICAgcTE0LCAgZDEyLCAjMTUgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwogICAgICAgICAidnNobGwuczE2ICAgICAgcTE1LCAgZDEzLCAjMTUgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwogCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTkgICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTExICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTkgICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGNvZWYKKyAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMywgcTEzLCBxOCAgICAgICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgY29lZgorICAgICAgICAidnFyZG11bGguczMyICAgcTE0LCBxMTQsIHExMCAgICAgICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBjb2VmCisgICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTExICAgICAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGNvZWYKIAogICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTIgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKICAgICAgICAgInZhZGQuczMyICAgICAgIHExMywgcTEzLCBxMTQgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExNSAgICAgICAgICAgICAgICAgICBcbiIvLyAoKzEpIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExMyAgICAgICAgICAgICAgICAgICBcbiIvLyAoKzEpIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExNSAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTMgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKIAogICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjOCAgICAgICAgXG4iLy8gdXBkYXRlIGxvb3AgY291bnRlcgogICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMzIgICAgICAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKQEAgLTQ0NCw2ICs5NDcsNyBAQAogICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwKICAgICAgICAgICAicTEyIiwgInExMyIsICJxMTQiLCAicTE1IgogICAgICk7CisjZW5kaWYKIH0KIAogdGVtcGxhdGUgPD4KQEAgLTQ1OCw2ICs5NjIsMTAgQEAKICAgICAgICAgdWludDMyX3QgbGVycFAsCiAgICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQogeworI2lmZGVmIFVTRV9JTlRSSU5TSUMKKyAgICBQcm9jZXNzTmVvbkludHJpbnNpYzwxLCAxNiwgZmFsc2U+KG91dCwgY291bnQsIGNvZWZzUCwgY29lZnNOLCBzUCwgc04sIHZvbHVtZUxSLAorICAgICAgICAgICAgbGVycFAsIGNvZWZzUDEsIGNvZWZzTjEpOworI2Vsc2UKICAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAxOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKICAgICBjb25zdCBpbnQgU1RSSURFID0gMTY7CiAgICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOwpAQCAtNDg5LDcgKzk5Nyw3IEBACiAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTAsIHExMCwgcTE0ICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpCiAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTEsIHExMSwgcTE1ICAgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpCiAKLSAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgOCBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKKyAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgOCBzYW1wbGVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCiAKICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgIGQ0LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKICAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMywgIGQ1LCAjMTUgICAgICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKQEAgLTUyOSw2ICsxMDM3LDcgQEAKICAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIsCiAgICAgICAgICAgInExMiIsICJxMTMiLCAicTE0IiwgInExNSIKICAgICApOworI2VuZGlmCiB9CiAKIHRlbXBsYXRlIDw+CkBAIC01NDMsNiArMTA1MiwxMCBAQAogICAgICAgICB1aW50MzJfdCBsZXJwUCwKICAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCiB7CisjaWZkZWYgVVNFX0lOVFJJTlNJQworICAgIFByb2Nlc3NOZW9uSW50cmluc2ljPDIsIDE2LCBmYWxzZT4ob3V0LCBjb3VudCwgY29lZnNQLCBjb2Vmc04sIHNQLCBzTiwgdm9sdW1lTFIsCisgICAgICAgICAgICBsZXJwUCwgY29lZnNQMSwgY29lZnNOMSk7CisjZWxzZQogICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDI7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcwogICAgIGNvbnN0IGludCBTVFJJREUgPSAxNjsKICAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7CkBAIC01NTMsOCArMTA2Niw4IEBACiAKICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgogCi0gICAgICAgICJ2bGQyLjE2ICAgICAgICB7cTIsIHEzfSwgWyVbc1BdXSAgICAgICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcwotICAgICAgICAidmxkMi4xNiAgICAgICAge3E1LCBxNn0sIFslW3NOXV0hICAgICAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtxMiwgcTN9LCBbJVtzUF1dICAgICAgICAgICAgIFxuIi8vIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBmcmFtZXMKKyAgICAgICAgInZsZDIuMTYgICAgICAgIHtxNSwgcTZ9LCBbJVtzTl1dISAgICAgICAgICAgIFxuIi8vIGxvYWQgOCAxNi1iaXRzIHN0ZXJlbyBmcmFtZXMKICAgICAgICAgInZsZDEuMzIgICAgICAgIHtxOCwgcTl9LCBbJVtjb2Vmc1AwXToxMjhdISAgIFxuIi8vIGxvYWQgOCAzMi1iaXRzIGNvZWZzCiAgICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEyLCBxMTN9LCBbJVtjb2Vmc1AxXToxMjhdISBcbiIvLyBsb2FkIDggMzItYml0cyBjb2VmcwogICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMCwgcTExfSwgWyVbY29lZnNOMV06MTI4XSEgXG4iLy8gbG9hZCA4IDMyLWJpdHMgY29lZnMKQEAgLTU3NSw4ICsxMDg4LDggQEAKICAgICAgICAgInZhZGQuczMyICAgICAgIHExMCwgcTEwLCBxMTQgICAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMykKICAgICAgICAgInZhZGQuczMyICAgICAgIHExMSwgcTExLCBxMTUgICAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMykKIAotICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQotICAgICAgICAidnJldjY0LjE2ICAgICAgcTMsIHEzICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgcG9zaXRpdmUgc2lkZQorICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSA4IHNhbXBsZXMgb2YgcG9zaXRpdmUgbGVmdAorICAgICAgICAidnJldjY0LjE2ICAgICAgcTMsIHEzICAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gcmV2ZXJzZSA4IHNhbXBsZXMgb2YgcG9zaXRpdmUgcmlnaHQKIAogICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCAgZDQsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwogICAgICAgICAidnNobGwuczE2ICAgICAgcTEzLCAgZDUsICMxNSAgICAgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwpAQCAtNTkxLDggKzExMDQsOCBAQAogCiAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMiAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAogICAgICAgICAidmFkZC5zMzIgICAgICAgcTEzLCBxMTMsIHExNCAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTE1ICAgICAgICAgICAgICAgICAgIFxuIi8vICgrMSkgYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEzICAgICAgICAgICAgICAgICAgIFxuIi8vICgrMSkgYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTE1ICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CisgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMyAgICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAogCiAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTIsICBkNiwgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCiAgICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTMsICBkNywgIzE1ICAgICAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCkBAIC02MDcsOCArMTEyMCw4IEBACiAKICAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTEyICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CiAgICAgICAgICJ2YWRkLnMzMiAgICAgICBxMTMsIHExMywgcTE0ICAgICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTUgICAgICAgICAgICAgICAgICAgXG4iLy8gKCsxKSBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTMgICAgICAgICAgICAgICAgICAgXG4iLy8gKCsxKSBhY2N1bXVsYXRlIHJlc3VsdAorICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTUgICAgICAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKKyAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTEzICAgICAgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0CiAKICAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzggICAgICAgIFxuIi8vIHVwZGF0ZSBsb29wIGNvdW50ZXIKICAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzMyICAgICAgICAgICAgIFxuIi8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCkBAIC02MzMsNTE3ICsxMTQ2LDY5IEBACiAgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAogICAgICAgICAgICJxMTIiLCAicTEzIiwgInExNCIsICJxMTUiCiAgICAgKTsKKyNlbmRpZgogfQogCi10ZW1wbGF0ZSA8PgotaW5saW5lIHZvaWQgUHJvY2Vzc0w8MSwgOD4oaW50MzJfdCogY29uc3Qgb3V0LAordGVtcGxhdGU8PgoraW5saW5lIHZvaWQgUHJvY2Vzc0w8MSwgMTY+KGZsb2F0KiBjb25zdCBvdXQsCiAgICAgICAgIGludCBjb3VudCwKLSAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQLAotICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04sCi0gICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAotICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKLSAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCisgICAgICAgIGNvbnN0IGZsb2F0KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGZsb2F0KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGZsb2F0KiBzUCwKKyAgICAgICAgY29uc3QgZmxvYXQqIHNOLAorICAgICAgICBjb25zdCBmbG9hdCogY29uc3Qgdm9sdW1lTFIpCiB7Ci0gICAgY29uc3QgaW50IENIQU5ORUxTID0gMTsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCi0gICAgY29uc3QgaW50IFNUUklERSA9IDg7Ci0gICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOwotICAgIGFzbSAoCi0gICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gKDAgLSBjb21iaW5lcyspIGFjY3VtdWxhdG9yID0gMAotCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAgICAgInZsZDEuMTYgICAgICAgIHtkNH0sIFslW3NQXV0gICAgICAgICAgICBcbiIvLyAoMiswZCkgbG9hZCA0IDE2LWJpdHMgbW9ubyBzYW1wbGVzCi0gICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDZ9LCBbJVtzTl1dISAgICAgICAgICAgXG4iLy8gKDIpIGxvYWQgNCAxNi1iaXRzIG1vbm8gc2FtcGxlcwotICAgICAgICAidmxkMS4xNiAgICAgICAge2QxNn0sIFslW2NvZWZzUDBdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDQgMTYtYml0cyBjb2VmcwotICAgICAgICAidmxkMS4xNiAgICAgICAge2QyMH0sIFslW2NvZWZzTjBdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDQgMTYtYml0cyBjb2VmcwotCi0gICAgICAgICJ2cmV2NjQuMTYgICAgICBkNCwgZDQgICAgICAgICAgICAgICAgICAgXG4iLy8gKDEpIHJldmVyc2VkIHMzLCBzMiwgczEsIHMwLCBzNywgczYsIHM1LCBzNAotCi0gICAgICAgIC8vIHJlb3JkZXJpbmcgdGhlIHZtYWwgdG8gZG8gZDYsIGQ3IGJlZm9yZSBkNCwgZDUgaXMgc2xvd2VyKD8pCi0gICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDQsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IChyZXZlcnNlZClzYW1wbGVzIGJ5IGNvZWYKLSAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNiwgZDIwICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgbmVnIHNhbXBsZXMKLQotICAgICAgICAvLyBtb3ZpbmcgdGhlc2UgQVJNIGluc3RydWN0aW9ucyBiZWZvcmUgbmVvbiBhYm92ZSBzZWVtcyB0byBiZSBzbG93ZXIKLSAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzQgICBcbiIvLyAoMSkgdXBkYXRlIGxvb3AgY291bnRlcgotICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjOCAgICAgICAgIFxuIi8vICgwKSBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcwotCi0gICAgICAgIC8vIHNQIHVzZWQgYWZ0ZXIgYnJhbmNoICh3YXJuaW5nKQotICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKLQotICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX01PTk8KLQotICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKLSAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAotICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAotICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAotICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCi0gICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQotICAgICAgICA6IFt2TFJdICAgICAiciIgKHZvbHVtZUxSKQotICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAotICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCi0gICAgICAgICAgInE4IiwgInExMCIKLSAgICApOworICAgIFByb2Nlc3NOZW9uSW50cmluc2ljPDEsIDE2LCB0cnVlPihvdXQsIGNvdW50LCBjb2Vmc1AsIGNvZWZzTiwgc1AsIHNOLCB2b2x1bWVMUiwKKyAgICAgICAgICAgIDAgLypsZXJwUCovLCBOVUxMIC8qY29lZnNQMSovLCBOVUxMIC8qY29lZnNOMSovKTsKIH0KIAotdGVtcGxhdGUgPD4KLWlubGluZSB2b2lkIFByb2Nlc3NMPDIsIDg+KGludDMyX3QqIGNvbnN0IG91dCwKK3RlbXBsYXRlPD4KK2lubGluZSB2b2lkIFByb2Nlc3NMPDIsIDE2PihmbG9hdCogY29uc3Qgb3V0LAogICAgICAgICBpbnQgY291bnQsCi0gICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUCwKLSAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOLAotICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKLSAgICAgICAgY29uc3QgaW50MTZfdCogc04sCi0gICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQorICAgICAgICBjb25zdCBmbG9hdCogY29lZnNQLAorICAgICAgICBjb25zdCBmbG9hdCogY29lZnNOLAorICAgICAgICBjb25zdCBmbG9hdCogc1AsCisgICAgICAgIGNvbnN0IGZsb2F0KiBzTiwKKyAgICAgICAgY29uc3QgZmxvYXQqIGNvbnN0IHZvbHVtZUxSKQogewotICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDI7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcwotICAgIGNvbnN0IGludCBTVFJJREUgPSA4OwotICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKLSAgICBhc20gKAotICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vICgxKSBhY2NfTCA9IDAKLSAgICAgICAgInZlb3IgICAgICAgICAgIHE0LCBxNCwgcTQgICAgICAgICAgICAgICBcbiIvLyAoMCBjb21iaW5lcyspIGFjY19SID0gMAotCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNCwgZDV9LCBbJVtzUF1dICAgICAgICBcbiIvLyAoMiswZCkgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKLSAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNiwgZDd9LCBbJVtzTl1dISAgICAgICBcbiIvLyAoMikgbG9hZCA4IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKLSAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMTZ9LCBbJVtjb2Vmc1AwXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKLSAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMjB9LCBbJVtjb2Vmc04wXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA4IDE2LWJpdHMgY29lZnMKLQotICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgIFxuIi8vICgxKSByZXZlcnNlIDggZnJhbWVzIG9mIHRoZSBsZWZ0IHBvc2l0aXZlCi0KLSAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNCwgZDE2ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgKHJldmVyc2VkKSBzYW1wbGVzIGxlZnQKLSAgICAgICAgInZtbGFsLnMxNiAgICAgIHE0LCBkNSwgZDE2ICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgKHJldmVyc2VkKSBzYW1wbGVzIHJpZ2h0Ci0gICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDYsIGQyMCAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHNhbXBsZXMgbGVmdAotICAgICAgICAidm1sYWwuczE2ICAgICAgcTQsIGQ3LCBkMjAgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSBzYW1wbGVzIHJpZ2h0Ci0KLSAgICAgICAgLy8gbW92aW5nIHRoZXNlIEFSTSBiZWZvcmUgbmVvbiBzZWVtcyB0byBiZSBzbG93ZXIKLSAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzQgICBcbiIvLyAoMSkgdXBkYXRlIGxvb3AgY291bnRlcgotICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMTYgICAgICAgIFxuIi8vICgwKSBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcwotCi0gICAgICAgIC8vIHNQIHVzZWQgYWZ0ZXIgYnJhbmNoICh3YXJuaW5nKQotICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKLQotICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX1NURVJFTwotCi0gICAgICAgIDogW291dF0gIj1VdiIgKG91dFswXSksCi0gICAgICAgICAgW2NvdW50XSAiK3IiIChjb3VudCksCi0gICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCi0gICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCi0gICAgICAgICAgW3NQXSAiK3IiIChzUCksCi0gICAgICAgICAgW3NOXSAiK3IiIChzTikKLSAgICAgICAgOiBbdkxSXSAiciIgKHZvbHVtZUxSKQotICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAotICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCi0gICAgICAgICAgInE0IiwgInE1IiwgInE2IiwKLSAgICAgICAgICAicTgiLCAicTEwIgotICAgICApOworICAgIFByb2Nlc3NOZW9uSW50cmluc2ljPDIsIDE2LCB0cnVlPihvdXQsIGNvdW50LCBjb2Vmc1AsIGNvZWZzTiwgc1AsIHNOLCB2b2x1bWVMUiwKKyAgICAgICAgICAgIDAgLypsZXJwUCovLCBOVUxMIC8qY29lZnNQMSovLCBOVUxMIC8qY29lZnNOMSovKTsKIH0KIAotdGVtcGxhdGUgPD4KLWlubGluZSB2b2lkIFByb2Nlc3M8MSwgOD4oaW50MzJfdCogY29uc3Qgb3V0LAordGVtcGxhdGU8PgoraW5saW5lIHZvaWQgUHJvY2VzczwxLCAxNj4oZmxvYXQqIGNvbnN0IG91dCwKICAgICAgICAgaW50IGNvdW50LAotICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc1AsCi0gICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTiwKLSAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQMSwKLSAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNOMSwKLSAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCi0gICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAotICAgICAgICB1aW50MzJfdCBsZXJwUCwKLSAgICAgICAgY29uc3QgaW50MzJfdCogY29uc3Qgdm9sdW1lTFIpCisgICAgICAgIGNvbnN0IGZsb2F0KiBjb2Vmc1AsCisgICAgICAgIGNvbnN0IGZsb2F0KiBjb2Vmc04sCisgICAgICAgIGNvbnN0IGZsb2F0KiBjb2Vmc1AxLAorICAgICAgICBjb25zdCBmbG9hdCogY29lZnNOMSwKKyAgICAgICAgY29uc3QgZmxvYXQqIHNQLAorICAgICAgICBjb25zdCBmbG9hdCogc04sCisgICAgICAgIGZsb2F0IGxlcnBQLAorICAgICAgICBjb25zdCBmbG9hdCogY29uc3Qgdm9sdW1lTFIpCiB7Ci0gICAgY29uc3QgaW50IENIQU5ORUxTID0gMTsgLy8gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgcHJlc2VydmUgcGFyYW1zCi0gICAgY29uc3QgaW50IFNUUklERSA9IDg7Ci0gICAgc1AgLT0gQ0hBTk5FTFMqKChTVFJJREU+PjEpLTEpOwotICAgIGFzbSAoCi0gICAgICAgICJ2bW92LjMyICAgICAgICBkMlswXSwgJVtsZXJwUF0gICAgICAgICAgXG4iLy8gbG9hZCB0aGUgcG9zaXRpdmUgcGhhc2UgUzMyIFExNQotICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vICgwIC0gY29tYmluZXMrKSBhY2N1bXVsYXRvciA9IDAKLQotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgICAgICJ2bGQxLjE2ICAgICAgICB7ZDR9LCBbJVtzUF1dICAgICAgICAgICAgXG4iLy8gKDIrMGQpIGxvYWQgNCAxNi1iaXRzIG1vbm8gc2FtcGxlcwotICAgICAgICAidmxkMS4xNiAgICAgICAge2Q2fSwgWyVbc05dXSEgICAgICAgICAgIFxuIi8vICgyKSBsb2FkIDQgMTYtYml0cyBtb25vIHNhbXBsZXMKLSAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMTZ9LCBbJVtjb2Vmc1AwXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA0IDE2LWJpdHMgY29lZnMKLSAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMTd9LCBbJVtjb2Vmc1AxXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA0IDE2LWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KLSAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMjB9LCBbJVtjb2Vmc04xXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA0IDE2LWJpdHMgY29lZnMKLSAgICAgICAgInZsZDEuMTYgICAgICAgIHtkMjF9LCBbJVtjb2Vmc04wXTo2NF0hICBcbiIvLyAoMSkgbG9hZCA0IDE2LWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KLQotICAgICAgICAidnN1Yi5zMTYgICAgICAgZDE3LCBkMTcsIGQxNiAgICAgICAgICAgIFxuIi8vICgxKSBpbnRlcnBvbGF0ZSAoc3RlcDEpIDFzdCBzZXQgb2YgY29lZnMKLSAgICAgICAgInZzdWIuczE2ICAgICAgIGQyMSwgZDIxLCBkMjAgICAgICAgICAgICBcbiIvLyAoMSkgaW50ZXJwb2xhdGUgKHN0ZXAxKSAybmQgc2V0IG9mIGNvZXRzCi0KLSAgICAgICAgInZxcmRtdWxoLnMxNiAgIGQxNywgZDE3LCBkMlswXSAgICAgICAgICBcbiIvLyAoMikgaW50ZXJwb2xhdGUgKHN0ZXAyKSAxc3Qgc2V0IG9mIGNvZWZzCi0gICAgICAgICJ2cXJkbXVsaC5zMTYgICBkMjEsIGQyMSwgZDJbMF0gICAgICAgICAgXG4iLy8gKDIpIGludGVycG9sYXRlIChzdGVwMikgMm5kIHNldCBvZiBjb2VmcwotCi0gICAgICAgICJ2cmV2NjQuMTYgICAgICBkNCwgZDQgICAgICAgICAgICAgICAgICAgXG4iLy8gKDEpIHJldmVyc2UgczMsIHMyLCBzMSwgczAsIHM3LCBzNiwgczUsIHM0Ci0KLSAgICAgICAgInZhZGQuczE2ICAgICAgIGQxNiwgZDE2LCBkMTcgICAgICAgICAgICBcbiIvLyAoMSsyZCkgaW50ZXJwb2xhdGUgKHN0ZXAzKSAxc3Qgc2V0Ci0gICAgICAgICJ2YWRkLnMxNiAgICAgICBkMjAsIGQyMCwgZDIxICAgICAgICAgICAgXG4iLy8gKDErMWQpIGludGVycG9sYXRlIChzdGVwMykgMm5kIHNldAotCi0gICAgICAgIC8vIHJlb3JkZXJpbmcgdGhlIHZtYWwgdG8gZG8gZDYsIGQ3IGJlZm9yZSBkNCwgZDUgaXMgc2xvd2VyKD8pCi0gICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDQsIGQxNiAgICAgICAgICAgICAgXG4iLy8gKDErMGQpIG11bHRpcGx5IChyZXZlcnNlZClieSBjb2VmCi0gICAgICAgICJ2bWxhbC5zMTYgICAgICBxMCwgZDYsIGQyMCAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IG5lZyBzYW1wbGVzCi0KLSAgICAgICAgLy8gbW92aW5nIHRoZXNlIEFSTSBpbnN0cnVjdGlvbnMgYmVmb3JlIG5lb24gYWJvdmUgc2VlbXMgdG8gYmUgc2xvd2VyCi0gICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM0ICAgXG4iLy8gKDEpIHVwZGF0ZSBsb29wIGNvdW50ZXIKLSAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzggICAgICAgIFxuIi8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCi0KLSAgICAgICAgLy8gc1AgdXNlZCBhZnRlciBicmFuY2ggKHdhcm5pbmcpCi0gICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAotCi0gICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfTU9OTwotCi0gICAgICAgIDogW291dF0gICAgICI9VXYiIChvdXRbMF0pLAotICAgICAgICAgIFtjb3VudF0gICAiK3IiIChjb3VudCksCi0gICAgICAgICAgW2NvZWZzUDBdICIrciIgKGNvZWZzUCksCi0gICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCi0gICAgICAgICAgW2NvZWZzUDFdICIrciIgKGNvZWZzUDEpLAotICAgICAgICAgIFtjb2Vmc04xXSAiK3IiIChjb2Vmc04xKSwKLSAgICAgICAgICBbc1BdICAgICAgIityIiAoc1ApLAotICAgICAgICAgIFtzTl0gICAgICAiK3IiIChzTikKLSAgICAgICAgOiBbbGVycFBdICAgInIiIChsZXJwUCksCi0gICAgICAgICAgW3ZMUl0gICAgICJyIiAodm9sdW1lTFIpCi0gICAgICAgIDogImNjIiwgIm1lbW9yeSIsCi0gICAgICAgICAgInEwIiwgInExIiwgInEyIiwgInEzIiwKLSAgICAgICAgICAicTgiLCAicTkiLCAicTEwIiwgInExMSIKLSAgICApOworICAgIFByb2Nlc3NOZW9uSW50cmluc2ljPDEsIDE2LCBmYWxzZT4ob3V0LCBjb3VudCwgY29lZnNQLCBjb2Vmc04sIHNQLCBzTiwgdm9sdW1lTFIsCisgICAgICAgICAgICBsZXJwUCwgY29lZnNQMSwgY29lZnNOMSk7CiB9CiAKLXRlbXBsYXRlIDw+Ci1pbmxpbmUgdm9pZCBQcm9jZXNzPDIsIDg+KGludDMyX3QqIGNvbnN0IG91dCwKK3RlbXBsYXRlPD4KK2lubGluZSB2b2lkIFByb2Nlc3M8MiwgMTY+KGZsb2F0KiBjb25zdCBvdXQsCiAgICAgICAgIGludCBjb3VudCwKLSAgICAgICAgY29uc3QgaW50MTZfdCogY29lZnNQLAotICAgICAgICBjb25zdCBpbnQxNl90KiBjb2Vmc04sCi0gICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzUDEsCi0gICAgICAgIGNvbnN0IGludDE2X3QqIGNvZWZzTjEsCi0gICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAotICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKLSAgICAgICAgdWludDMyX3QgbGVycFAsCi0gICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQorICAgICAgICBjb25zdCBmbG9hdCogY29lZnNQLAorICAgICAgICBjb25zdCBmbG9hdCogY29lZnNOLAorICAgICAgICBjb25zdCBmbG9hdCogY29lZnNQMSwKKyAgICAgICAgY29uc3QgZmxvYXQqIGNvZWZzTjEsCisgICAgICAgIGNvbnN0IGZsb2F0KiBzUCwKKyAgICAgICAgY29uc3QgZmxvYXQqIHNOLAorICAgICAgICBmbG9hdCBsZXJwUCwKKyAgICAgICAgY29uc3QgZmxvYXQqIGNvbnN0IHZvbHVtZUxSKQogewotICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDI7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcwotICAgIGNvbnN0IGludCBTVFJJREUgPSA4OwotICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKLSAgICBhc20gKAotICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMF0sICVbbGVycFBdICAgICAgICAgIFxuIi8vIGxvYWQgdGhlIHBvc2l0aXZlIHBoYXNlCi0gICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gKDEpIGFjY19MID0gMAotICAgICAgICAidmVvciAgICAgICAgICAgcTQsIHE0LCBxNCAgICAgICAgICAgICAgIFxuIi8vICgwIGNvbWJpbmVzKykgYWNjX1IgPSAwCi0KLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICAgICAidmxkMi4xNiAgICAgICAge2Q0LCBkNX0sIFslW3NQXV0gICAgICAgIFxuIi8vICgzKzBkKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gc2FtcGxlcwotICAgICAgICAidmxkMi4xNiAgICAgICAge2Q2LCBkN30sIFslW3NOXV0hICAgICAgIFxuIi8vICgzKSBsb2FkIDggMTYtYml0cyBzdGVyZW8gc2FtcGxlcwotICAgICAgICAidmxkMS4xNiAgICAgICAge2QxNn0sIFslW2NvZWZzUDBdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcwotICAgICAgICAidmxkMS4xNiAgICAgICAge2QxN30sIFslW2NvZWZzUDFdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgotICAgICAgICAidmxkMS4xNiAgICAgICAge2QyMH0sIFslW2NvZWZzTjFdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcwotICAgICAgICAidmxkMS4xNiAgICAgICAge2QyMX0sIFslW2NvZWZzTjBdOjY0XSEgIFxuIi8vICgxKSBsb2FkIDggMTYtYml0cyBjb2VmcyBmb3IgaW50ZXJwb2xhdGlvbgotCi0gICAgICAgICJ2c3ViLnMxNiAgICAgICBkMTcsIGQxNywgZDE2ICAgICAgICAgICAgXG4iLy8gKDEpIGludGVycG9sYXRlIChzdGVwMSkgMXN0IHNldCBvZiBjb2VmcwotICAgICAgICAidnN1Yi5zMTYgICAgICAgZDIxLCBkMjEsIGQyMCAgICAgICAgICAgIFxuIi8vICgxKSBpbnRlcnBvbGF0ZSAoc3RlcDEpIDJuZCBzZXQgb2YgY29ldHMKLQotICAgICAgICAidnFyZG11bGguczE2ICAgZDE3LCBkMTcsIGQyWzBdICAgICAgICAgIFxuIi8vICgyKSBpbnRlcnBvbGF0ZSAoc3RlcDIpIDFzdCBzZXQgb2YgY29lZnMKLSAgICAgICAgInZxcmRtdWxoLnMxNiAgIGQyMSwgZDIxLCBkMlswXSAgICAgICAgICBcbiIvLyAoMikgaW50ZXJwb2xhdGUgKHN0ZXAyKSAybmQgc2V0IG9mIGNvZWZzCi0KLSAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICBcbiIvLyAoMSkgcmV2ZXJzZSA4IGZyYW1lcyBvZiB0aGUgbGVmdCBwb3NpdGl2ZQotCi0gICAgICAgICJ2YWRkLnMxNiAgICAgICBkMTYsIGQxNiwgZDE3ICAgICAgICAgICAgXG4iLy8gKDErMWQpIGludGVycG9sYXRlIChzdGVwMykgMXN0IHNldAotICAgICAgICAidmFkZC5zMTYgICAgICAgZDIwLCBkMjAsIGQyMSAgICAgICAgICAgIFxuIi8vICgxKzFkKSBpbnRlcnBvbGF0ZSAoc3RlcDMpIDJuZCBzZXQKLQotICAgICAgICAidm1sYWwuczE2ICAgICAgcTAsIGQ0LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSAocmV2ZXJzZWQpIHNhbXBsZXMgbGVmdAotICAgICAgICAidm1sYWwuczE2ICAgICAgcTQsIGQ1LCBkMTYgICAgICAgICAgICAgIFxuIi8vICgxKSBtdWx0aXBseSAocmV2ZXJzZWQpIHNhbXBsZXMgcmlnaHQKLSAgICAgICAgInZtbGFsLnMxNiAgICAgIHEwLCBkNiwgZDIwICAgICAgICAgICAgICBcbiIvLyAoMSkgbXVsdGlwbHkgc2FtcGxlcyBsZWZ0Ci0gICAgICAgICJ2bWxhbC5zMTYgICAgICBxNCwgZDcsIGQyMCAgICAgICAgICAgICAgXG4iLy8gKDEpIG11bHRpcGx5IHNhbXBsZXMgcmlnaHQKLQotICAgICAgICAvLyBtb3ZpbmcgdGhlc2UgQVJNIGJlZm9yZSBuZW9uIHNlZW1zIHRvIGJlIHNsb3dlcgotICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIi8vICgxKSB1cGRhdGUgbG9vcCBjb3VudGVyCi0gICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICMxNiAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKLQotICAgICAgICAvLyBzUCB1c2VkIGFmdGVyIGJyYW5jaCAod2FybmluZykKLSAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCi0KLSAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9TVEVSRU8KLQotICAgICAgICA6IFtvdXRdICI9VXYiIChvdXRbMF0pLAotICAgICAgICAgIFtjb3VudF0gIityIiAoY291bnQpLAotICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAotICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAotICAgICAgICAgIFtjb2Vmc1AxXSAiK3IiIChjb2Vmc1AxKSwKLSAgICAgICAgICBbY29lZnNOMV0gIityIiAoY29lZnNOMSksCi0gICAgICAgICAgW3NQXSAiK3IiIChzUCksCi0gICAgICAgICAgW3NOXSAiK3IiIChzTikKLSAgICAgICAgOiBbbGVycFBdICAgInIiIChsZXJwUCksCi0gICAgICAgICAgW3ZMUl0gInIiICh2b2x1bWVMUikKLSAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKLSAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAotICAgICAgICAgICJxNCIsICJxNSIsICJxNiIsCi0gICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiCi0gICAgKTsKLX0KLQotdGVtcGxhdGUgPD4KLWlubGluZSB2b2lkIFByb2Nlc3NMPDEsIDg+KGludDMyX3QqIGNvbnN0IG91dCwKLSAgICAgICAgaW50IGNvdW50LAotICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AsCi0gICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTiwKLSAgICAgICAgY29uc3QgaW50MTZfdCogc1AsCi0gICAgICAgIGNvbnN0IGludDE2X3QqIHNOLAotICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKLXsKLSAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAxOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKLSAgICBjb25zdCBpbnQgU1RSSURFID0gODsKLSAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7Ci0gICAgYXNtICgKLSAgICAgICAgInZlb3IgICAgICAgICAgIHEwLCBxMCwgcTAgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAotCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAgICAgInZsZDEuMTYgICAgICAgIHtkNH0sIFslW3NQXV0gICAgICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBtb25vIHNhbXBsZXMKLSAgICAgICAgInZsZDEuMTYgICAgICAgIHtkNn0sIFslW3NOXV0hICAgICAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBtb25vIHNhbXBsZXMKLSAgICAgICAgInZsZDEuMzIgICAgICAgIHtxOH0sIFslW2NvZWZzUDBdOjEyOF0hICBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcwotICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMH0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCi0KLSAgICAgICAgInZyZXY2NC4xNiAgICAgIGQ0LCBkNCAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDIgZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCi0KLSAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgZDQsICMxNSAgICAgICAgICAgICBcbiIvLyAoc3RhbGwpIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKLSAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgZDYsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCi0KLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMiwgcTEyLCBxOCAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotCi0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMiAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTE0ICAgICAgICAgICAgICBcbiIvLyAoc3RhbGwpIGFjY3VtdWxhdGUgcmVzdWx0Ci0KLSAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzQgICBcbiIvLyB1cGRhdGUgbG9vcCBjb3VudGVyCi0gICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICM4ICAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKLQotICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKLQotICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX01PTk8KLQotICAgICAgICA6IFtvdXRdICI9VXYiIChvdXRbMF0pLAotICAgICAgICAgIFtjb3VudF0gIityIiAoY291bnQpLAotICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAotICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAotICAgICAgICAgIFtzUF0gIityIiAoc1ApLAotICAgICAgICAgIFtzTl0gIityIiAoc04pCi0gICAgICAgIDogW3ZMUl0gInIiICh2b2x1bWVMUikKLSAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKLSAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLAotICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwKLSAgICAgICAgICAicTEyIiwgInExNCIKLSAgICApOwotfQotCi10ZW1wbGF0ZSA8PgotaW5saW5lIHZvaWQgUHJvY2Vzc0w8MiwgOD4oaW50MzJfdCogY29uc3Qgb3V0LAotICAgICAgICBpbnQgY291bnQsCi0gICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUCwKLSAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOLAotICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKLSAgICAgICAgY29uc3QgaW50MTZfdCogc04sCi0gICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQotewotICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDI7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcwotICAgIGNvbnN0IGludCBTVFJJREUgPSA4OwotICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKLSAgICBhc20gKAotICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCi0gICAgICAgICJ2ZW9yICAgICAgICAgICBxNCwgcTQsIHE0ICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKLQotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDQsIGQ1fSwgWyVbc1BdXSAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKLSAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNiwgZDd9LCBbJVtzTl1dISAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcwotICAgICAgICAidmxkMS4zMiAgICAgICAge3E4fSwgWyVbY29lZnNQMF06MTI4XSEgIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCi0gICAgICAgICJ2bGQxLjMyICAgICAgICB7cTEwfSwgWyVbY29lZnNOMF06MTI4XSEgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMKLQotICAgICAgICAidnJldjY0LjE2ICAgICAgcTIsIHEyICAgICAgICAgICAgICAgICAgIFxuIi8vIHJldmVyc2UgMiBmcmFtZXMgb2YgdGhlIHBvc2l0aXZlIHNpZGUKLQotICAgICAgICAidnNobGwuczE2ICAgICAgcTEyLCBkNCwgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKLSAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMywgZDUsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCi0KLSAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgZDYsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCi0gICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTUsIGQ3LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwotCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTggICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBjb2VmCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTMsIHExMywgcTggICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBjb2VmCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTQsIHExNCwgcTEwICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBjb2VmCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTEwICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBjb2VmCi0KLSAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAidmFkZC5zMzIgICAgICAgcTQsIHE0LCBxMTMgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExNCAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTE1ICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAotCi0gICAgICAgICJzdWJzICAgICAgICAgICAlW2NvdW50XSwgJVtjb3VudF0sICM0ICAgXG4iLy8gdXBkYXRlIGxvb3AgY291bnRlcgotICAgICAgICAic3ViICAgICAgICAgICAgJVtzUF0sICVbc1BdLCAjMTYgICAgICAgIFxuIi8vIG1vdmUgcG9pbnRlciB0byBuZXh0IHNldCBvZiBzYW1wbGVzCi0KLSAgICAgICAgImJuZSAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICBcbiIvLyBsb29wCi0KLSAgICAgICAgQVNTRU1CTFlfQUNDVU1VTEFURV9TVEVSRU8KLQotICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKLSAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAotICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAotICAgICAgICAgIFtjb2Vmc04wXSAiK3IiIChjb2Vmc04pLAotICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCi0gICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQotICAgICAgICA6IFt2TFJdICAgICAiciIgKHZvbHVtZUxSKQotICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAotICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsICJxNCIsCi0gICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAotICAgICAgICAgICJxMTIiLCAicTEzIiwgInExNCIsICJxMTUiCi0gICAgKTsKLX0KLQotdGVtcGxhdGUgPD4KLWlubGluZSB2b2lkIFByb2Nlc3M8MSwgOD4oaW50MzJfdCogY29uc3Qgb3V0LAotICAgICAgICBpbnQgY291bnQsCi0gICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUCwKLSAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNOLAotICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc1AxLAotICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04xLAotICAgICAgICBjb25zdCBpbnQxNl90KiBzUCwKLSAgICAgICAgY29uc3QgaW50MTZfdCogc04sCi0gICAgICAgIHVpbnQzMl90IGxlcnBQLAotICAgICAgICBjb25zdCBpbnQzMl90KiBjb25zdCB2b2x1bWVMUikKLXsKLSAgICBjb25zdCBpbnQgQ0hBTk5FTFMgPSAxOyAvLyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiBkb2VzIG5vdCBwcmVzZXJ2ZSBwYXJhbXMKLSAgICBjb25zdCBpbnQgU1RSSURFID0gODsKLSAgICBzUCAtPSBDSEFOTkVMUyooKFNUUklERT4+MSktMSk7Ci0gICAgYXNtICgKLSAgICAgICAgInZtb3YuMzIgICAgICAgIGQyWzBdLCAlW2xlcnBQXSAgICAgICAgICBcbiIvLyBsb2FkIHRoZSBwb3NpdGl2ZSBwaGFzZQotICAgICAgICAidmVvciAgICAgICAgICAgcTAsIHEwLCBxMCAgICAgICAgICAgICAgIFxuIi8vIHJlc3VsdCwgaW5pdGlhbGl6ZSB0byAwCi0KLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICAgICAidmxkMS4xNiAgICAgICAge2Q0fSwgWyVbc1BdXSAgICAgICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIG1vbm8gc2FtcGxlcwotICAgICAgICAidmxkMS4xNiAgICAgICAge2Q2fSwgWyVbc05dXSEgICAgICAgICAgIFxuIi8vIGxvYWQgNCAxNi1iaXRzIG1vbm8gc2FtcGxlcwotICAgICAgICAidmxkMS4zMiAgICAgICAge3E4fSwgWyVbY29lZnNQMF06MTI4XSEgIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCi0gICAgICAgICJ2bGQxLjMyICAgICAgICB7cTl9LCBbJVtjb2Vmc1AxXToxMjhdISAgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KLSAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTB9LCBbJVtjb2Vmc04xXToxMjhdISBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcwotICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMX0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCi0KLSAgICAgICAgInZyZXY2NC4xNiAgICAgIGQ0LCBkNCAgICAgICAgICAgICAgICAgICBcbiIvLyByZXZlcnNlIDIgZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCi0KLSAgICAgICAgInZzdWIuczMyICAgICAgIHE5LCBxOSwgcTggICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpIDFzdCBzZXQgb2YgY29lZnMKLSAgICAgICAgInZzdWIuczMyICAgICAgIHExMSwgcTExLCBxMTAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpIDJuZCBzZXQgb2YgY29ldHMKLSAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgZDQsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCi0KLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHE5LCBxOSwgZDJbMF0gICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDIpIDFzdCBzZXQgb2YgY29lZnMKLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExMSwgcTExLCBkMlswXSAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDIpIDJuZCBzZXQgb2YgY29lZnMKLSAgICAgICAgInZzaGxsLnMxNiAgICAgIHExNCwgZDYsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCi0KLSAgICAgICAgInZhZGQuczMyICAgICAgIHE4LCBxOCwgcTkgICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDMpIDFzdCBzZXQKLSAgICAgICAgInZhZGQuczMyICAgICAgIHExMCwgcTEwLCBxMTEgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDQpIDJuZCBzZXQKLQotICAgICAgICAidnFyZG11bGguczMyICAgcTEyLCBxMTIsIHE4ICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0KLSAgICAgICAgInZhZGQuczMyICAgICAgIHEwLCBxMCwgcTEyICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTQgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0KLSAgICAgICAgInN1YnMgICAgICAgICAgICVbY291bnRdLCAlW2NvdW50XSwgIzQgICBcbiIvLyB1cGRhdGUgbG9vcCBjb3VudGVyCi0gICAgICAgICJzdWIgICAgICAgICAgICAlW3NQXSwgJVtzUF0sICM4ICAgICAgICAgXG4iLy8gbW92ZSBwb2ludGVyIHRvIG5leHQgc2V0IG9mIHNhbXBsZXMKLQotICAgICAgICAiYm5lICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuIi8vIGxvb3AKLQotICAgICAgICBBU1NFTUJMWV9BQ0NVTVVMQVRFX01PTk8KLQotICAgICAgICA6IFtvdXRdICAgICAiPVV2IiAob3V0WzBdKSwKLSAgICAgICAgICBbY291bnRdICAgIityIiAoY291bnQpLAotICAgICAgICAgIFtjb2Vmc1AwXSAiK3IiIChjb2Vmc1ApLAotICAgICAgICAgIFtjb2Vmc1AxXSAiK3IiIChjb2Vmc1AxKSwKLSAgICAgICAgICBbY29lZnNOMF0gIityIiAoY29lZnNOKSwKLSAgICAgICAgICBbY29lZnNOMV0gIityIiAoY29lZnNOMSksCi0gICAgICAgICAgW3NQXSAgICAgICIrciIgKHNQKSwKLSAgICAgICAgICBbc05dICAgICAgIityIiAoc04pCi0gICAgICAgIDogW2xlcnBQXSAgICJyIiAobGVycFApLAotICAgICAgICAgIFt2TFJdICAgICAiciIgKHZvbHVtZUxSKQotICAgICAgICA6ICJjYyIsICJtZW1vcnkiLAotICAgICAgICAgICJxMCIsICJxMSIsICJxMiIsICJxMyIsCi0gICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLAotICAgICAgICAgICJxMTIiLCAicTE0IgotICAgICk7Ci19Ci0KLXRlbXBsYXRlIDw+Ci1pbmxpbmUKLXZvaWQgUHJvY2VzczwyLCA4PihpbnQzMl90KiBjb25zdCBvdXQsCi0gICAgICAgIGludCBjb3VudCwKLSAgICAgICAgY29uc3QgaW50MzJfdCogY29lZnNQLAotICAgICAgICBjb25zdCBpbnQzMl90KiBjb2Vmc04sCi0gICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzUDEsCi0gICAgICAgIGNvbnN0IGludDMyX3QqIGNvZWZzTjEsCi0gICAgICAgIGNvbnN0IGludDE2X3QqIHNQLAotICAgICAgICBjb25zdCBpbnQxNl90KiBzTiwKLSAgICAgICAgdWludDMyX3QgbGVycFAsCi0gICAgICAgIGNvbnN0IGludDMyX3QqIGNvbnN0IHZvbHVtZUxSKQotewotICAgIGNvbnN0IGludCBDSEFOTkVMUyA9IDI7IC8vIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGRvZXMgbm90IHByZXNlcnZlIHBhcmFtcwotICAgIGNvbnN0IGludCBTVFJJREUgPSA4OwotICAgIHNQIC09IENIQU5ORUxTKigoU1RSSURFPj4xKS0xKTsKLSAgICBhc20gKAotICAgICAgICAidm1vdi4zMiAgICAgICAgZDJbMF0sICVbbGVycFBdICAgICAgICAgIFxuIi8vIGxvYWQgdGhlIHBvc2l0aXZlIHBoYXNlCi0gICAgICAgICJ2ZW9yICAgICAgICAgICBxMCwgcTAsIHEwICAgICAgICAgICAgICAgXG4iLy8gcmVzdWx0LCBpbml0aWFsaXplIHRvIDAKLSAgICAgICAgInZlb3IgICAgICAgICAgIHE0LCBxNCwgcTQgICAgICAgICAgICAgICBcbiIvLyByZXN1bHQsIGluaXRpYWxpemUgdG8gMAotCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgICAgICJ2bGQyLjE2ICAgICAgICB7ZDQsIGQ1fSwgWyVbc1BdXSAgICAgICAgXG4iLy8gbG9hZCA0IDE2LWJpdHMgc3RlcmVvIHNhbXBsZXMKLSAgICAgICAgInZsZDIuMTYgICAgICAgIHtkNiwgZDd9LCBbJVtzTl1dISAgICAgICBcbiIvLyBsb2FkIDQgMTYtYml0cyBzdGVyZW8gc2FtcGxlcwotICAgICAgICAidmxkMS4zMiAgICAgICAge3E4fSwgWyVbY29lZnNQMF06MTI4XSEgIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzCi0gICAgICAgICJ2bGQxLjMyICAgICAgICB7cTl9LCBbJVtjb2Vmc1AxXToxMjhdISAgXG4iLy8gbG9hZCA0IDMyLWJpdHMgY29lZnMgZm9yIGludGVycG9sYXRpb24KLSAgICAgICAgInZsZDEuMzIgICAgICAgIHtxMTB9LCBbJVtjb2Vmc04xXToxMjhdISBcbiIvLyBsb2FkIDQgMzItYml0cyBjb2VmcwotICAgICAgICAidmxkMS4zMiAgICAgICAge3ExMX0sIFslW2NvZWZzTjBdOjEyOF0hIFxuIi8vIGxvYWQgNCAzMi1iaXRzIGNvZWZzIGZvciBpbnRlcnBvbGF0aW9uCi0KLSAgICAgICAgInZyZXY2NC4xNiAgICAgIHEyLCBxMiAgICAgICAgICAgICAgICAgICBcbiIvLyAocmV2ZXJzZWQpIDIgZnJhbWVzIG9mIHRoZSBwb3NpdGl2ZSBzaWRlCi0KLSAgICAgICAgInZzdWIuczMyICAgICAgIHE5LCBxOSwgcTggICAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpIDFzdCBzZXQgb2YgY29lZnMKLSAgICAgICAgInZzdWIuczMyICAgICAgIHExMSwgcTExLCBxMTAgICAgICAgICAgICBcbiIvLyBpbnRlcnBvbGF0ZSAoc3RlcDEpIDJuZCBzZXQgb2YgY29ldHMKLSAgICAgICAgInZzaGxsLnMxNiAgICAgIHExMiwgZDQsICMxNSAgICAgICAgICAgICBcbiIvLyBleHRlbmQgc2FtcGxlcyB0byAzMSBiaXRzCi0gICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTMsIGQ1LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwotCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxOSwgcTksIGQyWzBdICAgICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAyKSAxc3Qgc2V0IG9mIGNvZWZzCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTEsIHExMSwgZDJbMV0gICAgICAgICAgXG4iLy8gaW50ZXJwb2xhdGUgKHN0ZXAzKSAybmQgc2V0IG9mIGNvZWZzCi0gICAgICAgICJ2c2hsbC5zMTYgICAgICBxMTQsIGQ2LCAjMTUgICAgICAgICAgICAgXG4iLy8gZXh0ZW5kIHNhbXBsZXMgdG8gMzEgYml0cwotICAgICAgICAidnNobGwuczE2ICAgICAgcTE1LCBkNywgIzE1ICAgICAgICAgICAgIFxuIi8vIGV4dGVuZCBzYW1wbGVzIHRvIDMxIGJpdHMKLQotICAgICAgICAidmFkZC5zMzIgICAgICAgcTgsIHE4LCBxOSAgICAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwMykgMXN0IHNldAotICAgICAgICAidmFkZC5zMzIgICAgICAgcTEwLCBxMTAsIHExMSAgICAgICAgICAgIFxuIi8vIGludGVycG9sYXRlIChzdGVwNCkgMm5kIHNldAotCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTIsIHExMiwgcTggICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotICAgICAgICAidnFyZG11bGguczMyICAgcTEzLCBxMTMsIHE4ICAgICAgICAgICAgIFxuIi8vIG11bHRpcGx5IHNhbXBsZXMgYnkgaW50ZXJwb2xhdGVkIGNvZWYKLSAgICAgICAgInZxcmRtdWxoLnMzMiAgIHExNCwgcTE0LCBxMTAgICAgICAgICAgICBcbiIvLyBtdWx0aXBseSBzYW1wbGVzIGJ5IGludGVycG9sYXRlZCBjb2VmCi0gICAgICAgICJ2cXJkbXVsaC5zMzIgICBxMTUsIHExNSwgcTEwICAgICAgICAgICAgXG4iLy8gbXVsdGlwbHkgc2FtcGxlcyBieSBpbnRlcnBvbGF0ZWQgY29lZgotCi0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxMCwgcTAsIHExMiAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKLSAgICAgICAgInZhZGQuczMyICAgICAgIHE0LCBxNCwgcTEzICAgICAgICAgICAgICBcbiIvLyBhY2N1bXVsYXRlIHJlc3VsdAotICAgICAgICAidmFkZC5zMzIgICAgICAgcTAsIHEwLCBxMTQgICAgICAgICAgICAgIFxuIi8vIGFjY3VtdWxhdGUgcmVzdWx0Ci0gICAgICAgICJ2YWRkLnMzMiAgICAgICBxNCwgcTQsIHExNSAgICAgICAgICAgICAgXG4iLy8gYWNjdW11bGF0ZSByZXN1bHQKLQotICAgICAgICAic3VicyAgICAgICAgICAgJVtjb3VudF0sICVbY291bnRdLCAjNCAgIFxuIi8vIHVwZGF0ZSBsb29wIGNvdW50ZXIKLSAgICAgICAgInN1YiAgICAgICAgICAgICVbc1BdLCAlW3NQXSwgIzE2ICAgICAgICBcbiIvLyBtb3ZlIHBvaW50ZXIgdG8gbmV4dCBzZXQgb2Ygc2FtcGxlcwotCi0gICAgICAgICJibmUgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgXG4iLy8gbG9vcAotCi0gICAgICAgIEFTU0VNQkxZX0FDQ1VNVUxBVEVfU1RFUkVPCi0KLSAgICAgICAgOiBbb3V0XSAgICAgIj1VdiIgKG91dFswXSksCi0gICAgICAgICAgW2NvdW50XSAgICIrciIgKGNvdW50KSwKLSAgICAgICAgICBbY29lZnNQMF0gIityIiAoY29lZnNQKSwKLSAgICAgICAgICBbY29lZnNQMV0gIityIiAoY29lZnNQMSksCi0gICAgICAgICAgW2NvZWZzTjBdICIrciIgKGNvZWZzTiksCi0gICAgICAgICAgW2NvZWZzTjFdICIrciIgKGNvZWZzTjEpLAotICAgICAgICAgIFtzUF0gICAgICAiK3IiIChzUCksCi0gICAgICAgICAgW3NOXSAgICAgICIrciIgKHNOKQotICAgICAgICA6IFtsZXJwUF0gICAiciIgKGxlcnBQKSwKLSAgICAgICAgICBbdkxSXSAgICAgInIiICh2b2x1bWVMUikKLSAgICAgICAgOiAiY2MiLCAibWVtb3J5IiwKLSAgICAgICAgICAicTAiLCAicTEiLCAicTIiLCAicTMiLCAicTQiLAotICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwKLSAgICAgICAgICAicTEyIiwgInExMyIsICJxMTQiLCAicTE1IgotICAgICk7CisgICAgUHJvY2Vzc05lb25JbnRyaW5zaWM8MiwgMTYsIGZhbHNlPihvdXQsIGNvdW50LCBjb2Vmc1AsIGNvZWZzTiwgc1AsIHNOLCB2b2x1bWVMUiwKKyAgICAgICAgICAgIGxlcnBQLCBjb2Vmc1AxLCBjb2Vmc04xKTsKIH0KIAogI2VuZGlmIC8vVVNFX05FT04KIAotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8qQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfRklSX1BST0NFU1NfTkVPTl9IKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKaW5kZXggZTZmYjc2Yy4uNDE3MzBlZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKQEAgLTYxLDEzNSArNjEsNyBAQAogICogY21kLWxpbmU6IGZpciAtbCA3IC1zIDQ4MDAwIC1jIDIwNDc4CiAgKi8KIGNvbnN0IHVpbnQzMl90IEF1ZGlvUmVzYW1wbGVyU2luYzo6bUZpckNvZWZzVXBbXSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoMzIpKSkgPSB7Ci0gICAgICAgIDB4NmQzNzRiYzcsIDB4MTExYzZiYTAsIDB4ZjMyNDBlNjEsIDB4MDdkMTRhMzgsIDB4ZmM1MDllNjQsIDB4MDEzOWNlZTksIDB4ZmZjOGM4NjYsIDB4ZmZmY2MzMDAsCi0gICAgICAgIDB4NmQzNTI3OGEsIDB4MTAzZTgxOTIsIDB4ZjM2YjlkZmQsIDB4MDdiZGZhYTUsIDB4ZmM1MTAyZDAsIDB4MDEzZDYxOGQsIDB4ZmZjNjYzYjksIDB4ZmZmZDk1OTIsCi0gICAgICAgIDB4NmQyZWJhZmUsIDB4MGY2MjgxMWEsIDB4ZjNiM2Q4YWMsIDB4MDdhOWYzOTksIDB4ZmM1MWQ5YTYsIDB4MDE0MGJlYTUsIDB4ZmZjNDEyMTIsIDB4ZmZmZTYzMWUsCi0gICAgICAgIDB4NmQyNDA2OWQsIDB4MGU4ODc1YWQsIDB4ZjNmY2I0M2UsIDB4MDc5NTM5NzYsIDB4ZmM1MzIxNmYsIDB4MDE0M2U2N2MsIDB4ZmZjMWQzNzMsIDB4ZmZmZjJiOWYsCi0gICAgICAgIDB4NmQxNTBiMzUsIDB4MGRiMDZhODksIDB4ZjQ0NjI2OTAsIDB4MDc3ZmQwYWMsIDB4ZmM1NGQ4YWUsIDB4MDE0NmQ5NjUsIDB4ZmZiZmE3ZDksIDB4ZmZmZmVmMTAsCi0gICAgICAgIDB4NmQwMWM5ZTMsIDB4MGNkYTZhYjUsIDB4ZjQ5MDI1ODcsIDB4MDc2OWJkYWYsIDB4ZmM1NmZkZGEsIDB4MDE0OTk3YmIsIDB4ZmZiZDhmNDAsIDB4MDAwMGFkNmUsCi0gICAgICAgIDB4NmNlYTQ0MTgsIDB4MGMwNjgwZmUsIDB4ZjRkYWE3MTgsIDB4MDc1MzA1MDEsIDB4ZmM1OThmNjAsIDB4MDE0YzIxZGIsIDB4ZmZiYjg5YTEsIDB4MDAwMTY2YjYsCi0gICAgICAgIDB4NmNjZTdiOTcsIDB4MGIzNGI3ZjUsIDB4ZjUyNWExNDMsIDB4MDczYmFiMjgsIDB4ZmM1YzhiYTUsIDB4MDE0ZTc4MmEsIDB4ZmZiOTk2ZjMsIDB4MDAwMjFhZTUsCi0gICAgICAgIDB4NmNhZTcyNzIsIDB4MGE2NTE5ZjQsIDB4ZjU3MTBhMTcsIDB4MDcyM2I0YjQsIDB4ZmM1ZmYxMDUsIDB4MDE1MDliMTQsIDB4ZmZiN2I3MjgsIDB4MDAwMmM5ZmQsCi0gICAgICAgIDB4NmM4YTJiMGYsIDB4MDk5N2IxMTYsIDB4ZjViY2Q3YjEsIDB4MDcwYjI2MzksIDB4ZmM2M2JkZDMsIDB4MDE1MjhiMDgsIDB4ZmZiNWVhMzEsIDB4MDAwMzczZmIsCi0gICAgICAgIDB4NmM2MWE4MjMsIDB4MDhjYzg3M2MsIDB4ZjYwOTAwM2YsIDB4MDZmMjA0NTMsIDB4ZmM2N2YwNWEsIDB4MDE1NDQ4N2IsIDB4ZmZiNDJmZmMsIDB4MDAwNDE4ZTIsCi0gICAgICAgIDB4NmMzNGVjYjUsIDB4MDgwM2E2MGEsIDB4ZjY1NTdhMDAsIDB4MDZkODUzYTIsIDB4ZmM2Yzg2ZGQsIDB4MDE1NWQzZTgsIDB4ZmZiMjg4NzYsIDB4MDAwNGI4YjMsCi0gICAgICAgIDB4NmMwM2ZjMWMsIDB4MDczZDE2ZTcsIDB4ZjZhMjNiNDQsIDB4MDZiZTE4Y2QsIDB4ZmM3MTdmOTcsIDB4MDE1NzJkY2YsIDB4ZmZiMGYzODgsIDB4MDAwNTUzNzEsCi0gICAgICAgIDB4NmJjZWQ5ZmYsIDB4MDY3OGUyZmMsIDB4ZjZlZjNhNmUsIDB4MDZhMzU4N2UsIDB4ZmM3NmQ4YmMsIDB4MDE1ODU2YjYsIDB4ZmZhZjcxMTgsIDB4MDAwNWU5MjEsCi0gICAgICAgIDB4NmI5NThhNTQsIDB4MDViNzEzMzIsIDB4ZjczYzZkZjQsIDB4MDY4ODE3NjEsIDB4ZmM3YzkwNzksIDB4MDE1OTRmMjUsIDB4ZmZhZTAxMGIsIDB4MDAwNjc5YzUsCi0gICAgICAgIDB4NmI1ODExNjMsIDB4MDRmN2IwMzcsIDB4Zjc4OWNjNjEsIDB4MDY2YzVhMjcsIDB4ZmM4MmE0ZjQsIDB4MDE1YTE3YWIsIDB4ZmZhY2EzNDQsIDB4MDAwNzA1NjQsCi0gICAgICAgIDB4NmIxNjczYzEsIDB4MDQzYWMyNzYsIDB4ZjdkNzRjNTMsIDB4MDY1MDI1ODMsIDB4ZmM4OTE0NGQsIDB4MDE1YWIwZGIsIDB4ZmZhYjU3YTEsIDB4MDAwNzhjMDQsCi0gICAgICAgIDB4NmFkMGI2NTIsIDB4MDM4MDUyMWMsIDB4ZjgyNGU0ODAsIDB4MDYzMzdlMmEsIDB4ZmM4ZmRjOWYsIDB4MDE1YjFiNGUsIDB4ZmZhYTFlMDIsIDB4MDAwODBkYWIsCi0gICAgICAgIDB4NmE4NmRlNDgsIDB4MDJjODY3MTUsIDB4Zjg3MjhiYjMsIDB4MDYxNjY4ZDIsIDB4ZmM5NmZiZmMsIDB4MDE1YjU3OWUsIDB4ZmZhOGY2NDEsIDB4MDAwODhhNjIsCi0gICAgICAgIDB4NmEzOGYxMjMsIDB4MDIxMzA5MGMsIDB4ZjhjMDM4ZDAsIDB4MDVmOGVhMzAsIDB4ZmM5ZTcwNzQsIDB4MDE1YjY2NmMsIDB4ZmZhN2UwMzksIDB4MDAwOTAyMzAsCi0gICAgICAgIDB4NjllNmY0YjEsIDB4MDE2MDNmNmUsIDB4ZjkwZGUyZDEsIDB4MDVkYjA2ZmMsIDB4ZmNhNjM4MTAsIDB4MDE1YjQ4NWIsIDB4ZmZhNmRiYzAsIDB4MDAwOTc1MWUsCi0gICAgICAgIDB4Njk5MGVmMGIsIDB4MDBiMDExNjIsIDB4Zjk1YjgwY2IsIDB4MDViY2MzZWQsIDB4ZmNhZTUwZDYsIDB4MDE1YWZlMTQsIDB4ZmZhNWU4YWQsIDB4MDAwOWUzMzcsCi0gICAgICAgIDB4NjkzNmU2OTcsIDB4MDAwMjg1ZDAsIDB4ZjlhOTA5ZWEsIDB4MDU5ZTI1YjUsIDB4ZmNiNmI4YzQsIDB4MDE1YTg4NDMsIDB4ZmZhNTA2ZDIsIDB4MDAwYTRjODUsCi0gICAgICAgIDB4NjhkOGUyMDYsIDB4ZmY1N2EzNWUsIDB4ZjlmNjc1NzcsIDB4MDU3ZjMxMGEsIDB4ZmNiZjZkZDgsIDB4MDE1OWU3OTYsIDB4ZmZhNDM2MDMsIDB4MDAwYWIxMTIsCi0gICAgICAgIDB4Njg3NmU4NTUsIDB4ZmVhZjcwNmYsIDB4ZmE0M2JhZDIsIDB4MDU1ZmVhOWQsIDB4ZmNjODZlMDksIDB4MDE1OTFjYzAsIDB4ZmZhMzc2MGUsIDB4MDAwYjEwZWMsCi0gICAgICAgIDB4NjgxMTAwYzksIDB4ZmUwOWYzMjMsIDB4ZmE5MGQxN2IsIDB4MDU0MDU3MWEsIDB4ZmNkMWI3NGMsIDB4MDE1ODI4NzgsIDB4ZmZhMmM2YzIsIDB4MDAwYjZjMWQsCi0gICAgICAgIDB4NjdhNzMyZjQsIDB4ZmQ2NzMxNTksIDB4ZmFkZGIxMGMsIDB4MDUyMDdiMmYsIDB4ZmNkYjQ3OTMsIDB4MDE1NzBiNzcsIDB4ZmZhMjI3ZWMsIDB4MDAwYmMyYjMsCi0gICAgICAgIDB4NjczOTg2YWMsIDB4ZmNjNzMwYWEsIDB4ZmIyYTUxM2IsIDB4MDUwMDViODIsIDB4ZmNlNTFjY2IsIDB4MDE1NWM2NzgsIDB4ZmZhMTk5NTcsIDB4MDAwYzE0YmIsCi0gICAgICAgIDB4NjZjODA0MTMsIDB4ZmMyOWY2NzAsIDB4ZmI3NmE5ZGQsIDB4MDRkZmZjYjYsIDB4ZmNlZjM0ZTEsIDB4MDE1NDVhM2MsIDB4ZmZhMTFhY2IsIDB4MDAwYzYyNDQsCi0gICAgICAgIDB4NjY1MmIzOTIsIDB4ZmI4Zjg3YmQsIDB4ZmJjMmIyZTQsIDB4MDRiZjYzNjksIDB4ZmNmOThkYmUsIDB4MDE1MmM3ODMsIDB4ZmZhMGFjMTEsIDB4MDAwY2FiNWMsCi0gICAgICAgIDB4NjVkOTlkZDUsIDB4ZmFmN2U5NjMsIDB4ZmMwZTY0NjEsIDB4MDQ5ZTk0MzMsIDB4ZmQwNDI1NGEsIDB4MDE1MTBmMTMsIDB4ZmZhMDRjZjAsIDB4MDAwY2YwMTIsCi0gICAgICAgIDB4NjU1Y2NiZDMsIDB4ZmE2MzFmZWYsIDB4ZmM1OWI2ODUsIDB4MDQ3ZDkzYTgsIDB4ZmQwZWY5NjksIDB4MDE0ZjMxYjIsIDB4ZmY5ZmZkMmMsIDB4MDAwZDMwNzUsCi0gICAgICAgIDB4NjRkYzQ2YzMsIDB4ZjlkMTJmYWIsIDB4ZmNhNGExOWYsIDB4MDQ1YzY2NTQsIDB4ZmQxYTA4MDEsIDB4MDE0ZDMwMjksIDB4ZmY5ZmJjODksIDB4MDAwZDZjOTcsCi0gICAgICAgIDB4NjQ1ODE4MjMsIDB4Zjk0MjFjOWQsIDB4ZmNlZjFlMjAsIDB4MDQzYjEwYmQsIDB4ZmQyNTRlZjQsIDB4MDE0YjBiNDUsIDB4ZmY5ZjhhYzksIDB4MDAwZGE0ODYsCi0gICAgICAgIDB4NjNkMDQ5YjQsIDB4ZjhiNWVhODcsIDB4ZmQzOTI0OTgsIDB4MDQxOTk3NjAsIDB4ZmQzMGNjMjQsIDB4MDE0OGMzZDIsIDB4ZmY5ZjY3YWUsIDB4MDAwZGQ4NTQsCi0gICAgICAgIDB4NjM0NGU1NzgsIDB4ZjgyYzljZTcsIDB4ZmQ4MmFkYmEsIDB4MDNmN2ZlYjQsIDB4ZmQzYzdkNzMsIDB4MDE0NjVhOWYsIDB4ZmY5ZjUyZjcsIDB4MDAwZTA4MTIsCi0gICAgICAgIDB4NjJiNWY1YjIsIDB4ZjdhNjM2ZmEsIDB4ZmRjYmIyNWEsIDB4MDNkNjRiMjcsIDB4ZmQ0ODYwYzIsIDB4MDE0M2QwN2YsIDB4ZmY5ZjRjNjUsIDB4MDAwZTMzZDMsCi0gICAgICAgIDB4NjIyMzg0ZTgsIDB4ZjcyMmJiYjUsIDB4ZmUxNDJiNmUsIDB4MDNiNDgxMWQsIDB4ZmQ1NDczZjMsIDB4MDE0MTI2NDMsIDB4ZmY5ZjUzYjQsIDB4MDAwZTViYTcsCi0gICAgICAgIDB4NjE4ZDlkZGMsIDB4ZjZhMjJkY2YsIDB4ZmU1YzEyMGYsIDB4MDM5MmE0ZjQsIDB4ZmQ2MGI0ZTcsIDB4MDEzZTVjYzAsIDB4ZmY5ZjY4YTEsIDB4MDAwZTdmYTEsCi0gICAgICAgIDB4NjBmNDRiOTEsIDB4ZjYyNDhmYjYsIDB4ZmVhMzVmNzksIDB4MDM3MGJhZmMsIDB4ZmQ2ZDIxODAsIDB4MDEzYjc0Y2EsIDB4ZmY5ZjhhZTksIDB4MDAwZTlmZDUsCi0gICAgICAgIDB4NjA1Nzk5NDcsIDB4ZjVhOWUzOTgsIDB4ZmVlYTBkMGMsIDB4MDM0ZWM3N2YsIDB4ZmQ3OWI3YTEsIDB4MDEzODZmM2EsIDB4ZmY5ZmJhNDcsIDB4MDAwZWJjNTQsCi0gICAgICAgIDB4NWZiNzkyNzgsIDB4ZjUzMjJiNjEsIDB4ZmYzMDE0NGEsIDB4MDMyY2NlYmIsIDB4ZmQ4Njc1MmUsIDB4MDEzNTRjZTcsIDB4ZmY5ZmY2NzQsIDB4MDAwZWQ1MzMsCi0gICAgICAgIDB4NWYxNDQyZGMsIDB4ZjRiZDY4YjYsIDB4ZmY3NTZlZGMsIDB4MDMwYWQ0ZTEsIDB4ZmQ5MzU4MGQsIDB4MDEzMjBlYTksIDB4ZmZhMDNmMmIsIDB4MDAwZWVhODQsCi0gICAgICAgIDB4NWU2ZGI2NjUsIDB4ZjQ0YjljZmUsIDB4ZmZiYTE2OGQsIDB4MDJlOGRlMTksIDB4ZmRhMDVlMjMsIDB4MDEyZWI1NWEsIDB4ZmZhMDk0MjUsIDB4MDAwZWZjNWMsCi0gICAgICAgIDB4NWRjM2Y5M2MsIDB4ZjNkY2M5NTksIDB4ZmZmZTA1NGUsIDB4MDJjNmVlN2YsIDB4ZmRhZDg1NWIsIDB4MDEyYjQxZDMsIDB4ZmZhMGY1MTksIDB4MDAwZjBhY2UsCi0gICAgICAgIDB4NWQxNzE3YzQsIDB4ZjM3MGVlYTksIDB4MDA0MTM1MzYsIDB4MDJhNTBhMjIsIDB4ZmRiYWNiOWUsIDB4MDEyN2I0ZjEsIDB4ZmZhMTYxYmYsIDB4MDAwZjE1ZWYsCi0gICAgICAgIDB4NWM2NzFlOTYsIDB4ZjMwODBkOGMsIDB4MDA4M2EwODEsIDB4MDI4MzM1MDYsIDB4ZmRjODJlZGIsIDB4MDEyNDBmOGUsIDB4ZmZhMWQ5Y2YsIDB4MDAwZjFkZDIsCi0gICAgICAgIDB4NWJiNDFhODAsIDB4ZjJhMjI2NWUsIDB4MDBjNTQxOTAsIDB4MDI2MTczMjEsIDB4ZmRkNWFkMDEsIDB4MDEyMDUyODUsIDB4ZmZhMjVjZmUsIDB4MDAwZjIyOGQsCi0gICAgICAgIDB4NWFmZTE4ODYsIDB4ZjIzZjM5M2IsIDB4MDEwNjEyZWIsIDB4MDIzZmM4NWMsIDB4ZmRlMzQ0MDMsIDB4MDExYzdlYjIsIDB4ZmZhMmViMDQsIDB4MDAwZjI0MzQsCi0gICAgICAgIDB4NWE0NTI1ZGYsIDB4ZjFkZjQ1ZmQsIDB4MDE0NjBmNDEsIDB4MDIxZTM4OTEsIDB4ZmRmMGYxZDYsIDB4MDExODk0ZjAsIDB4ZmZhMzgzOTUsIDB4MDAwZjIyZGMsCi0gICAgICAgIDB4NTk4OTRmZjMsIDB4ZjE4MjRjM2UsIDB4MDE4NTMxNjUsIDB4MDFmY2M3OGYsIDB4ZmRmZWI0NzUsIDB4MDExNDk2MWIsIDB4ZmZhNDI2NjgsIDB4MDAwZjFlOTksCi0gICAgICAgIDB4NThjYWE0NWIsIDB4ZjEyODRiNTgsIDB4MDFjMzc0NTIsIDB4MDFkYjc5MTQsIDB4ZmUwYzg5ZGIsIDB4MDExMDgzMGYsIDB4ZmZhNGQzMzIsIDB4MDAwZjE3ODEsCi0gICAgICAgIDB4NTgwOTMwZTEsIDB4ZjBkMTQyNjcsIDB4MDIwMGQzMmMsIDB4MDFiYTUwZDIsIDB4ZmUxYTcwMDksIDB4MDEwYzVjYTYsIDB4ZmZhNTg5YTYsIDB4MDAwZjBkYTgsCi0gICAgICAgIDB4NTc0NTAzN2MsIDB4ZjA3ZDMwNDMsIDB4MDIzZDQ5M2MsIDB4MDE5OTUyNmIsIDB4ZmUyODY1MDUsIDB4MDEwODIzYmEsIDB4ZmZhNjQ5N2MsIDB4MDAwZjAxMjUsCi0gICAgICAgIDB4NTY3ZTJhNTEsIDB4ZjAyYzEzOGEsIDB4MDI3OGQxZjIsIDB4MDE3ODgxNzAsIDB4ZmUzNjY2ZDUsIDB4MDEwM2Q5MjcsIDB4ZmZhNzEyNjYsIDB4MDAwZWYyMGIsCi0gICAgICAgIDB4NTViNGIzYWYsIDB4ZWZkZGVhOWEsIDB4MDJiMzY4ZTYsIDB4MDE1N2UxNjYsIDB4ZmU0NDczODksIDB4MDBmZjdkYzQsIDB4ZmZhN2U0MWEsIDB4MDAwZWUwNzAsCi0gICAgICAgIDB4NTRlOGFlMTMsIDB4ZWY5MmIzOTMsIDB4MDJlZDA5ZDcsIDB4MDEzNzc1YmYsIDB4ZmU1Mjg5MzEsIDB4MDBmYjEyNmIsIDB4ZmZhOGJlNGMsIDB4MDAwZWNjNjksCi0gICAgICAgIDB4NTQxYTI4MWUsIDB4ZWY0YTZjNTgsIDB4MDMyNWIwYWQsIDB4MDExNzQxZGYsIDB4ZmU2MGE1ZTUsIDB4MDBmNjk3ZjMsIDB4ZmZhOWEwYjEsIDB4MDAwZWI2MGIsCi0gICAgICAgIDB4NTM0OTMwOWUsIDB4ZWYwNTEyOTAsIDB4MDM1ZDU5NzcsIDB4MDBmNzQ5MWEsIDB4ZmU2ZWM3YzAsIDB4MDBmMjBmMzIsIDB4ZmZhYThhZmUsIDB4MDAwZTlkNmIsCi0gICAgICAgIDB4NTI3NWQ2ODQsIDB4ZWVjMmEzYTMsIDB4MDM5NDAwNmEsIDB4MDBkNzhlYjMsIDB4ZmU3Y2VjZTIsIDB4MDBlZDc4ZmYsIDB4ZmZhYjdjZTcsIDB4MDAwZTgyOWUsCi0gICAgICAgIDB4NTFhMDI4ZTgsIDB4ZWU4MzFjYzMsIDB4MDNjOWExZTUsIDB4MDBiODE1ZGEsIDB4ZmU4YjEzNzMsIDB4MDBlOGQ2MmQsIDB4ZmZhYzc2MjEsIDB4MDAwZTY1YmEsCi0gICAgICAgIDB4NTBjODM3MDQsIDB4ZWU0NjdhZTEsIDB4MDNmZTNhNmYsIDB4MDA5OGUxYjMsIDB4ZmU5OTM5OWYsIDB4MDBlNDI3OGYsIDB4ZmZhZDc2NjIsIDB4MDAwZTQ2ZDMsCi0gICAgICAgIDB4NGZlZTEwMzcsIDB4ZWUwY2JhYjksIDB4MDQzMWM2YjUsIDB4MDA3OWY1NGMsIDB4ZmVhNzVkOTcsIDB4MDBkZjZkZjcsIDB4ZmZhZTdkNWYsIDB4MDAwZTI1ZmQsCi0gICAgICAgIDB4NGYxMWMzZmUsIDB4ZWRkNWQ4Y2EsIDB4MDQ2NDQzOGMsIDB4MDA1YjUzYTQsIDB4ZmViNTdkOTIsIDB4MDBkYWFhMzQsIDB4ZmZhZjhhY2QsIDB4MDAwZTAzNGYsCi0gICAgICAgIDB4NGUzMzYxZjcsIDB4ZWRhMWQxNWMsIDB4MDQ5NWFkZjIsIDB4MDAzY2ZmYTksIDB4ZmVjMzk3Y2YsIDB4MDBkNWRkMTYsIDB4ZmZiMDllNjMsIDB4MDAwZGRlZGIsCi0gICAgICAgIDB4NGQ1MmY5ZGYsIDB4ZWQ3MGEwN2QsIDB4MDRjNjAzMGQsIDB4MDAxZWZjMzUsIDB4ZmVkMWFhOTIsIDB4MDBkMTA3NjksIDB4ZmZiMWI3ZDgsIDB4MDAwZGI4YjcsCi0gICAgICAgIDB4NGM3MDliOGUsIDB4ZWQ0MjQyMDUsIDB4MDRmNTQwMjksIDB4MDAwMTRjMTIsIDB4ZmVkZmI0MjUsIDB4MDBjYzI5ZjcsIDB4ZmZiMmQ2ZTEsIDB4MDAwZDkwZjYsCi0gICAgICAgIDB4NGI4YzU2ZjgsIDB4ZWQxNmIxOTYsIDB4MDUyMzYyYmEsIDB4ZmZlM2YxZjcsIDB4ZmVlZGIyZGEsIDB4MDBjNzQ1OGEsIDB4ZmZiM2ZiMzcsIDB4MDAwZDY3YWUsCi0gICAgICAgIDB4NGFhNjNjMmMsIDB4ZWNlZGVhOTksIDB4MDU1MDY4NWQsIDB4ZmZjNmYwOGEsIDB4ZmVmYmE1MDgsIDB4MDBjMjVhZTgsIDB4ZmZiNTI0OTAsIDB4MDAwZDNjZjEsCi0gICAgICAgIDB4NDliZTViNTAsIDB4ZWNjN2U4NDUsIDB4MDU3YzRlZDQsIDB4ZmZhYTRhNWQsIDB4ZmYwOTg5MGYsIDB4MDBiZDZhZDcsIDB4ZmZiNjUyYTcsIDB4MDAwZDEwZDUsCi0gICAgICAgIDB4NDhkNGM0YTIsIDB4ZWNhNGE1OWIsIDB4MDVhNzE0MGIsIDB4ZmY4ZTAxZjEsIDB4ZmYxNzVkNTMsIDB4MDBiODc2MTksIDB4ZmZiNzg1MzMsIDB4MDAwY2UzNmIsCi0gICAgICAgIDB4NDdlOTg4NzQsIDB4ZWM4NDFkNjgsIDB4MDVkMGI2MTIsIDB4ZmY3MjE5YjMsIDB4ZmYyNTIwNDIsIDB4MDBiMzdkNzAsIDB4ZmZiOGJiZWQsIDB4MDAwY2I0YzgsCi0gICAgICAgIDB4NDZmY2I3MmQsIDB4ZWM2NjRhNDgsIDB4MDVmOTMzMjQsIDB4ZmY1NjkzZmUsIDB4ZmYzMmQwNGYsIDB4MDBhZTgxOTgsIDB4ZmZiOWY2OTEsIDB4MDAwYzg0ZmYsCi0gICAgICAgIDB4NDYwZTYxNDgsIDB4ZWM0YjI2YTIsIDB4MDYyMDg5OWUsIDB4ZmYzYjczMWIsIDB4ZmY0MDZiZjgsIDB4MDBhOTgzNGUsIDB4ZmZiYjM0ZDgsIDB4MDAwYzU0MjIsCi0gICAgICAgIDB4NDUxZTk3NTAsIDB4ZWMzMmFjYjAsIDB4MDY0NmI4MDgsIDB4ZmYyMGI5M2UsIDB4ZmY0ZGYxYmUsIDB4MDBhNDgzNGMsIDB4ZmZiYzc2N2YsIDB4MDAwYzIyNDUsCi0gICAgICAgIDB4NDQyZDY5ZGUsIDB4ZWMxY2Q2NzcsIDB4MDY2YmJkMGQsIDB4ZmYwNjY4ODksIDB4ZmY1YjYwMmMsIDB4MDA5ZjgyNDksIDB4ZmZiZGJiNDIsIDB4MDAwYmVmNzksCi0gICAgICAgIDB4NDMzYWU5OWMsIDB4ZWMwOTlkY2YsIDB4MDY4Zjk3ODEsIDB4ZmVlYzgzMGQsIDB4ZmY2OGI1ZDUsIDB4MDA5YTgwZjgsIDB4ZmZiZjAyZGQsIDB4MDAwYmJiZDIsCi0gICAgICAgIDB4NDI0NzI3M2YsIDB4ZWJmOGZjNjQsIDB4MDZiMjQ2NWIsIDB4ZmVkMzBhYzUsIDB4ZmY3NWYxNTMsIDB4MDA5NTgwMGMsIDB4ZmZjMDRkMGYsIDB4MDAwYjg3NjAsCi0gICAgICAgIDB4NDE1MjMzODksIDB4ZWJlYWViYWYsIDB4MDZkM2M4YmIsIDB4ZmViYTAxOTksIDB4ZmY4MzExNDgsIDB4MDA5MDgwMzQsIDB4ZmZjMTk5OTYsIDB4MDAwYjUyMzUsCi0gICAgICAgIDB4NDA1YzFmNDMsIDB4ZWJkZjY1MDAsIDB4MDZmNDFkZTMsIDB4ZmVhMTY5NjAsIDB4ZmY5MDE0NWUsIDB4MDA4YjgyMWIsIDB4ZmZjMmU4MzIsIDB4MDAwYjFjNjQsCi0gICAgICAgIDB4M2Y2NGZiNDAsIDB4ZWJkNjYxN2IsIDB4MDcxMzQ1M2QsIDB4ZmU4OTQzZGMsIDB4ZmY5Y2Y5NDcsIDB4MDA4Njg2NmIsIDB4ZmZjNDM4YTMsIDB4MDAwYWU1ZmMsCi0gICAgICAgIDB4M2U2Y2Q4NWIsIDB4ZWJjZmRhMTksIDB4MDczMTNlNTYsIDB4ZmU3MTkyYmQsIDB4ZmZhOWJlYmUsIDB4MDA4MThkY2IsIDB4ZmZjNThhYWEsIDB4MDAwYWFmMGYsCi0gICAgICAgIDB4M2Q3M2M3NzIsIDB4ZWJjYmM3YTcsIDB4MDc0ZTA4ZTAsIDB4ZmU1YTU3OWQsIDB4ZmZiNjYzODYsIDB4MDA3Yzk4ZGUsIDB4ZmZjNmRlMDksIDB4MDAwYTc3YWMsCi0gICAgICAgIDB4M2M3OWQ5NjgsIDB4ZWJjYTIyY2MsIDB4MDc2OWE0YjIsIDB4ZmU0Mzk0MDcsIDB4ZmZjMmU2NjksIDB4MDA3N2E4NDUsIDB4ZmZjODMyODUsIDB4MDAwYTNmZTUsCi0gICAgICAgIDB4M2I3ZjFmMjMsIDB4ZWJjYWU0MDUsIDB4MDc4NDExYzcsIDB4ZmUyZDQ5NmYsIDB4ZmZjZjQ2M2EsIDB4MDA3MmJjOWQsIDB4ZmZjOTg3ZTAsIDB4MDAwYTA3YzksCi0gICAgICAgIDB4M2E4M2E5ODksIDB4ZWJjZTAzYWEsIDB4MDc5ZDUwM2IsIDB4ZmUxNzc5MzcsIDB4ZmZkYjgxZDYsIDB4MDA2ZGQ2ODAsIDB4ZmZjYWRkZTEsIDB4MDAwOWNmNjcsCi0gICAgICAgIDB4Mzk4Nzg5N2YsIDB4ZWJkMzc5ZWIsIDB4MDdiNTYwNTEsIDB4ZmUwMjI0YjAsIDB4ZmZlNzk4MjAsIDB4MDA2OGY2ODcsIDB4ZmZjYzM0NGMsIDB4MDAwOTk2Y2UsCi0gICAgICAgIDB4Mzg4YWNmZTksIDB4ZWJkYjNlZDUsIDB4MDdjYzQyNmMsIDB4ZmRlZDRkMTMsIDB4ZmZmMzg4MDYsIDB4MDA2NDFkNDQsIDB4ZmZjZDhhZWIsIDB4MDAwOTVlMGUsCi0gICAgICAgIDB4Mzc4ZDhkYTgsIDB4ZWJlNTRhNGYsIDB4MDdlMWY3MTIsIDB4ZmRkOGYzOGIsIDB4ZmZmZjUwN2IsIDB4MDA1ZjRiNGEsIDB4ZmZjZWUxODMsIDB4MDAwOTI1MzUsCi0gICAgICAgIDB4MzY4ZmQzOTcsIDB4ZWJmMTk0MWYsIDB4MDdmNjdlZWMsIDB4ZmRjNTE5MmQsIDB4MDAwYWYwN2YsIDB4MDA1YTgxMjUsIDB4ZmZkMDM3ZTAsIDB4MDAwOGVjNTAsCi0gICAgICAgIDB4MzU5MWIyOGIsIDB4ZWMwMDEzZTgsIDB4MDgwOWRhYzMsIDB4ZmRiMWJlZmMsIDB4MDAxNjY3MTgsIDB4MDA1NWJmNjAsIDB4ZmZkMThkY2MsIDB4MDAwOGIzNmUsCi0gICAgICAgIDB4MzQ5MzNiNTAsIDB4ZWMxMGMxMmMsIDB4MDgxYzBiODQsIDB4ZmQ5ZWU1ZTcsIDB4MDAyMWIzNTUsIDB4MDA1MTA2ODIsIDB4ZmZkMmUzMTEsIDB4MDAwODdhOWMsCi0gICAgICAgIDB4MzM5NDdlYWIsIDB4ZWMyMzkzNGYsIDB4MDgyZDEyMzksIDB4ZmQ4YzhlY2MsIDB4MDAyY2Q0NGQsIDB4MDA0YzU3MGYsIDB4ZmZkNDM3N2QsIDB4MDAwODQxZTgsCi0gICAgICAgIDB4MzI5NThkNTUsIDB4ZWMzODgxOTQsIDB4MDgzY2YwMTAsIDB4ZmQ3YWJhNzQsIDB4MDAzN2M5MjIsIDB4MDA0N2IxODYsIDB4ZmZkNThhZGUsIDB4MDAwODA5NWQsCi0gICAgICAgIDB4MzE5Njc3ZmEsIDB4ZWM0ZjgzMjIsIDB4MDg0YmE2NTQsIDB4ZmQ2OTY5OTgsIDB4MDA0MjkwZmMsIDB4MDA0MzE2NjYsIDB4ZmZkNmRkMDIsIDB4MDAwN2QxMDgsCi0gICAgICAgIDB4MzA5NzRmM2IsIDB4ZWM2ODhmMDIsIDB4MDg1OTM2NzEsIDB4ZmQ1ODljZGMsIDB4MDA0ZDJiMGUsIDB4MDAzZTg2MjgsIDB4ZmZkODJkYmEsIDB4MDAwNzk4ZjUsCi0gICAgICAgIDB4MmY5ODIzYTgsIDB4ZWM4MzljMjIsIDB4MDg2NWExZjEsIDB4ZmQ0ODU0ZDMsIDB4MDA1Nzk2OTEsIDB4MDAzYTAxNDEsIDB4ZmZkOTdjZDYsIDB4MDAwNzYxMzAsCi0gICAgICAgIDB4MmU5OTA1YzEsIDB4ZWNhMGExNTYsIDB4MDg3MGVhN2UsIDB4ZmQzODkxZmQsIDB4MDA2MWQyY2EsIDB4MDAzNTg4MjQsIDB4ZmZkYWNhMmEsIDB4MDAwNzI5YzQsCi0gICAgICAgIDB4MmQ5YTA1ZjQsIDB4ZWNiZjk1NTgsIDB4MDg3YjExZGUsIDB4ZmQyOTU0YzgsIDB4MDA2YmRmMDUsIDB4MDAzMTFiNDEsIDB4ZmZkYzE1ODgsIDB4MDAwNmYyYmIsCi0gICAgICAgIDB4MmM5YjM0OWUsIDB4ZWNlMDZlY2IsIDB4MDg4NDE5ZjYsIDB4ZmQxYTlkOTEsIDB4MDA3NWJhOTUsIDB4MDAyY2JiMDMsIDB4ZmZkZDVlYzYsIDB4MDAwNmJjMjEsCi0gICAgICAgIDB4MmI5Y2EyMDMsIDB4ZWQwMzI0MzksIDB4MDg4YzA0YzgsIDB4ZmQwYzZjYTIsIDB4MDA3ZjY0ZGEsIDB4MDAyODY3ZDIsIDB4ZmZkZWE1YmIsIDB4MDAwNjg1ZmYsCi0gICAgICAgIDB4MmE5ZTVlNTcsIDB4ZWQyN2FjMTYsIDB4MDg5MmQ0NzAsIDB4ZmNmZWMyMzMsIDB4MDA4OGRkMzgsIDB4MDAyNDIyMTMsIDB4ZmZkZmVhM2MsIDB4MDAwNjUwNWYsCi0gICAgICAgIDB4MjlhMDc5YjIsIDB4ZWQ0ZGZjYzIsIDB4MDg5ODhiMmEsIDB4ZmNmMTllNmIsIDB4MDA5MjIzMWUsIDB4MDAxZmVhMjcsIDB4ZmZlMTJjMjIsIDB4MDAwNjFiNGIsCi0gICAgICAgIDB4MjhhMzA0MTYsIDB4ZWQ3NjBjODgsIDB4MDg5ZDJiNGEsIDB4ZmNlNTAxNjEsIDB4MDA5YjM2MDUsIDB4MDAxYmMwNmIsIDB4ZmZlMjZiNDgsIDB4MDAwNWU2Y2IsCi0gICAgICAgIDB4MjdhNjBkNmEsIDB4ZWQ5ZmQxYTIsIDB4MDhhMGI3NDAsIDB4ZmNkOGViMTcsIDB4MDBhNDE1NmIsIDB4MDAxN2E1M2IsIDB4ZmZlM2E3ODgsIDB4MDAwNWIyZTgsCi0gICAgICAgIDB4MjZhOWE1N2IsIDB4ZWRjYjQyMzcsIDB4MDhhMzMxOTYsIDB4ZmNjZDViODIsIDB4MDBhY2MwZGEsIDB4MDAxMzk4ZWMsIDB4ZmZlNGUwYmYsIDB4MDAwNTdmYWEsCi0gICAgICAgIDB4MjVhZGRiZjksIDB4ZWRmODU0NWIsIDB4MDhhNDljZjAsIDB4ZmNjMjUyODUsIDB4MDBiNTM3ZTEsIDB4MDAwZjliZDIsIDB4ZmZlNjE2YzgsIDB4MDAwNTRkMWEsCi0gICAgICAgIDB4MjRiMmMwNzUsIDB4ZWUyNmZlMTcsIDB4MDhhNGZjMGQsIDB4ZmNiN2NmZjAsIDB4MDBiZDdhMWMsIDB4MDAwYmFlM2MsIDB4ZmZlNzQ5ODQsIDB4MDAwNTFiM2UsCi0gICAgICAgIDB4MjNiODYyNjMsIDB4ZWU1NzM1NjIsIDB4MDhhNDUxYzAsIDB4ZmNhZGQzODYsIDB4MDBjNTg3MmEsIDB4MDAwN2QwNzUsIDB4ZmZlODc4ZDMsIDB4MDAwNGVhMWQsCi0gICAgICAgIDB4MjJiZWQxMTYsIDB4ZWU4OGYwMjYsIDB4MDhhMmEwZjgsIDB4ZmNhNDVjZjcsIDB4MDBjZDVlYjcsIDB4MDAwNDAyYzgsIDB4ZmZlOWE0OTQsIDB4MDAwNGI5YzAsCi0gICAgICAgIDB4MjFjNjFiYzAsIDB4ZWViYzI0NDQsIDB4MDg5ZmVjYmIsIDB4ZmM5YjZiZTUsIDB4MDBkNTAwNzUsIDB4MDAwMDQ1NzksIDB4ZmZlYWNjYWEsIDB4MDAwNDhhMmIsCi0gICAgICAgIDB4MjBjZTUxNmYsIDB4ZWVmMGM3OGQsIDB4MDg5YzM4MjQsIDB4ZmM5MmZmZTEsIDB4MDBkYzZjMWUsIDB4ZmZmYzk4YzksIDB4ZmZlYmYwZmEsIDB4MDAwNDViNjUsCi0gICAgICAgIDB4MWZkNzgxMGYsIDB4ZWYyNmNmY2EsIDB4MDg5Nzg2NjYsIDB4ZmM4YjE4NmQsIDB4MDBlM2ExNzUsIDB4ZmZmOGZjZjcsIDB4ZmZlZDExNjYsIDB4MDAwNDJkNzQsCi0gICAgICAgIDB4MWVlMWI5NjUsIDB4ZWY1ZTMyYmQsIDB4MDg5MWRhYzgsIDB4ZmM4M2I0ZmMsIDB4MDBlYWEwNDUsIDB4ZmZmNTcyM2QsIDB4ZmZlZTJkZDcsIDB4MDAwNDAwNWUsCi0gICAgICAgIDB4MWRlZDA5MTEsIDB4ZWY5NmU2MWMsIDB4MDg4YjM4YTksIDB4ZmM3Y2Q0ZjAsIDB4MDBmMTY4NjEsIDB4ZmZmMWY4ZDIsIDB4ZmZlZjQ2MzIsIDB4MDAwM2Q0MjYsCi0gICAgICAgIDB4MWNmOTdlOGIsIDB4ZWZkMGRmOWEsIDB4MDg4M2EzNzgsIDB4ZmM3Njc3OWUsIDB4MDBmN2Y5YTMsIDB4ZmZlZTkwZWIsIDB4ZmZmMDVhNjAsIDB4MDAwM2E4ZDIsCi0gICAgICAgIDB4MWMwNzI4MjMsIDB4ZjAwYzE0ZTEsIDB4MDg3YjFlYmMsIDB4ZmM3MDljNGQsIDB4MDBmZTUzZWYsIDB4ZmZlYjNhYjgsIDB4ZmZmMTZhNGEsIDB4MDAwMzdlNjUsCi0gICAgICAgIDB4MWIxNjEzZmYsIDB4ZjA0ODdiOTgsIDB4MDg3MWFlMGQsIDB4ZmM2YjQyMzMsIDB4MDEwNDc3MmUsIDB4ZmZlN2Y2NjYsIDB4ZmZmMjc1ZGIsIDB4MDAwMzU0ZTUsCi0gICAgICAgIDB4MWEyNjUwMWIsIDB4ZjA4NjA5NjIsIDB4MDg2NzU1MTYsIDB4ZmM2NjY4N2EsIDB4MDEwYTYzNTMsIDB4ZmZlNGM0MWUsIDB4ZmZmMzdkMDAsIDB4MDAwMzJjNTQsCi0gICAgICAgIDB4MTkzN2VhNDcsIDB4ZjBjNGIzZTAsIDB4MDg1YzE3OTQsIDB4ZmM2MjBlM2QsIDB4MDExMDE4NTgsIDB4ZmZlMWE0MDgsIDB4ZmZmNDdmYTUsIDB4MDAwMzA0YjcsCi0gICAgICAgIDB4MTg0YWYwMjUsIDB4ZjEwNDcwYjAsIDB4MDg0ZmY5NTcsIDB4ZmM1ZTMyOGMsIDB4MDExNTk2M2QsIDB4ZmZkZTk2NDYsIDB4ZmZmNTdkYjgsIDB4MDAwMmRlMGUsCi0gICAgICAgIDB4MTc1ZjZmMmIsIDB4ZjE0NTM1NzEsIDB4MDg0MmZlM2QsIDB4ZmM1YWQ0NjUsIDB4MDExYWRkMGIsIDB4ZmZkYjlhZjgsIDB4ZmZmNjc3MjksIDB4MDAwMmI4NWYsCi0gICAgICAgIDB4MTY3NTc0OWUsIDB4ZjE4NmY3YzAsIDB4MDgzNTJhMzUsIDB4ZmM1N2YyYmUsIDB4MDExZmVjZDMsIDB4ZmZkOGIyM2IsIDB4ZmZmNzZiZTksIDB4MDAwMjkzYWEsCi0gICAgICAgIDB4MTU4ZDBkOTUsIDB4ZjFjOWFkNDAsIDB4MDgyNjgxM2UsIDB4ZmM1NThjN2MsIDB4MDEyNGM1YWIsIDB4ZmZkNWRjMjgsIDB4ZmZmODViZTgsIDB4MDAwMjZmZjIsCi0gICAgICAgIDB4MTRhNjQ2ZjYsIDB4ZjIwZDRiOTIsIDB4MDgxNzA3NjcsIDB4ZmM1M2EwN2IsIDB4MDEyOTY3YjEsIDB4ZmZkMzE4ZDYsIDB4ZmZmOTQ3MWIsIDB4MDAwMjRkMzksCi0gICAgICAgIDB4MTNjMTJkNzMsIDB4ZjI1MWM4NWQsIDB4MDgwNmMwY2IsIDB4ZmM1MjJkODgsIDB4MDEyZGQzMGEsIDB4ZmZkMDY4NTgsIDB4ZmZmYTJkNzQsIDB4MDAwMjJiN2YsCi0gICAgICAgIDB4MTJkZGNkOGYsIDB4ZjI5NzE5NGQsIDB4MDdmNWIxOTMsIDB4ZmM1MTMyNjYsIDB4MDEzMjA3ZTQsIDB4ZmZjZGNhYmUsIDB4ZmZmYjBlZTksIDB4MDAwMjBhYzcsCi0gICAgICAgIDB4MTFmYzMzOTUsIDB4ZjJkZDM0MTEsIDB4MDdlM2RkZjcsIDB4ZmM1MGFkY2MsIDB4MDEzNjA2NzAsIDB4ZmZjYjQwMTQsIDB4ZmZmYmViNzAsIDB4MDAwMWViMTAsCi0gICAgICAgIDB4MTExYzZiYTAsIDB4ZjMyNDBlNjEsIDB4MDdkMTRhMzgsIDB4ZmM1MDllNjQsIDB4MDEzOWNlZTksIDB4ZmZjOGM4NjYsIDB4ZmZmY2MzMDAsIDB4MDAwMWNjNWMsCisjaW5jbHVkZSAiQXVkaW9SZXNhbXBsZXJTaW5jVXAuaCIKIH07CiAKIC8qCkBAIC0xOTcsMTM1ICs2OSw3IEBACiAgKiBjbWQtbGluZTogZmlyIC1sIDcgLXMgNDgwMDAgLWMgMTcxODkKICAqLwogY29uc3QgdWludDMyX3QgQXVkaW9SZXNhbXBsZXJTaW5jOjptRmlyQ29lZnNEb3duW10gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDMyKSkpID0gewotICAgICAgICAweDViYWNiNmY0LCAweDFkZWQxYTFkLCAweGYwMzk4ZDU2LCAweDAzOTRmNjc0LCAweDAxOTNhNWY5LCAweGZlNjZkYmViLCAweDAwNzkxMDQzLCAweGZmZmU2NjMxLAotICAgICAgICAweDViYWI2YzgxLCAweDFkM2RkY2NkLCAweGYwNDIxZDJjLCAweDAzYWY5OTk1LCAweDAxODE4ZGM5LCAweGZlNmJiNjNlLCAweDAwNzk4MTJhLCAweGZmZmRjMzdkLAotICAgICAgICAweDViYTc4ZDM3LCAweDFjOGYyY2Y5LCAweGYwNGJlYjFkLCAweDAzYzlhMDRhLCAweDAxNmY4YWNhLCAweGZlNzBhNTExLCAweDAwNzllMzRkLCAweGZmZmQyNTQ1LAotICAgICAgICAweDViYTExOTRmLCAweDFiZTExMjMxLCAweGYwNTZmMmM3LCAweDAzZTMwOWZlLCAweDAxNWQ5ZTY0LCAweGZlNzVhNzlmLCAweDAwN2EzNmUyLCAweGZmZmM4Yjg2LAotICAgICAgICAweDViOTgxMTIyLCAweDFiMzM5M2Y4LCAweGYwNjMyZmI3LCAweDAzZmJkNjI1LCAweDAxNGJjOWZhLCAweGZlN2FiZDIzLCAweDAwN2E3YzIwLCAweGZmZmJmNjM5LAotICAgICAgICAweDViOGM3NTMwLCAweDFhODZiOWJmLCAweGYwNzA5ZDc0LCAweDA0MTQwNDQ5LCAweDAxM2EwZWU5LCAweGZlN2ZlNGRiLCAweDAwN2FiMzNkLCAweGZmZmI2NTViLAotICAgICAgICAweDViN2U0NjFhLCAweDE5ZGE4YWU1LCAweGYwN2YzNzc2LCAweDA0MmI5M2ZkLCAweDAxMjg2ZTg2LCAweGZlODUxZTA1LCAweDAwN2FkYzcyLCAweGZmZmFkOGU0LAotICAgICAgICAweDViNmQ4NGE4LCAweDE5MmYwZWI3LCAweGYwOGVmOTJkLCAweDA0NDI4NGU2LCAweDAxMTZlYTIyLCAweGZlOGE2N2RkLCAweDAwN2FmN2Y2LCAweGZmZmE1MGNlLAotICAgICAgICAweDViNWEzMWM2LCAweDE4ODQ0YzcwLCAweGYwOWZkZGZlLCAweDA0NThkNmI3LCAweDAxMDU4MzA2LCAweGZlOGZjMWE1LCAweDAwN2IwNjAzLCAweGZmZjljZDEyLAotICAgICAgICAweDViNDQ0ZTgxLCAweDE3ZGE0YjM3LCAweGYwYjFlMTQzLCAweDA0NmU4OTMzLCAweDAwZjQzYTc0LCAweGZlOTUyYTliLCAweDAwN2IwNmQ0LCAweGZmZjk0ZGE5LAotICAgICAgICAweDViMmJkYzBlLCAweDE3MzExMjIyLCAweGYwYzRmZTUwLCAweDA0ODM5YzI5LCAweDAwZTMxMWE5LCAweGZlOWFhMjAxLCAweDAwN2FmYWExLCAweGZmZjhkMjhjLAotICAgICAgICAweDViMTBkYmMyLCAweDE2ODhhODMyLCAweGYwZDkzMDZkLCAweDA0OTgwZjc5LCAweDAwZDIwOWRiLCAweGZlYTAyNzE5LCAweDAwN2FlMWE3LCAweGZmZjg1YmIxLAotICAgICAgICAweDVhZjM0ZjE4LCAweDE1ZTExNDUzLCAweGYwZWU3MmRiLCAweDA0YWJlMzEwLCAweDAwYzEyNDM5LCAweGZlYTViOTI2LCAweDAwN2FiYzIwLCAweGZmZjdlOTEwLAotICAgICAgICAweDVhZDMzN2FmLCAweDE1M2E1ZDVlLCAweGYxMDRjMGQyLCAweDA0YmYxNmU5LCAweDAwYjA2MWViLCAweGZlYWI1NzZkLCAweDAwN2E4YTQ5LCAweGZmZjc3YTlmLAotICAgICAgICAweDVhYjA5NzQ4LCAweDE0OTQ4YTE2LCAweGYxMWMxNTgzLCAweDA0ZDFhYjBkLCAweDAwOWZjNDEzLCAweGZlYjEwMTM0LCAweDAwN2E0YzVkLCAweGZmZjcxMDU3LAotICAgICAgICAweDVhOGI2ZmM3LCAweDEzZWZhMTJjLCAweGYxMzQ2YzE3LCAweDA0ZTM5ZjkzLCAweDAwOGY0YmNiLCAweGZlYjZiNWMwLCAweDAwN2EwMjlhLCAweGZmZjZhYTJiLAotICAgICAgICAweDVhNjNjMzM2LCAweDEzNGJhOTM3LCAweGYxNGRiZmIxLCAweDA0ZjRmNGEyLCAweDAwN2VmYTI5LCAweGZlYmM3NDVjLCAweDAwNzlhZDNkLCAweGZmZjY0ODEyLAotICAgICAgICAweDVhMzk5M2MwLCAweDEyYThhOGJiLCAweGYxNjgwYjZlLCAweDA1MDVhYTZhLCAweDAwNmVkMDM4LCAweGZlYzIzYzUwLCAweDAwNzk0YzgyLCAweGZmZjVlYTAyLAotICAgICAgICAweDVhMGNlM2IyLCAweDEyMDZhNjI1LCAweGYxODM0YTYzLCAweDA1MTVjMTJkLCAweDAwNWVjZjAxLCAweGZlYzgwY2U4LCAweDAwNzhlMGE5LCAweGZmZjU4ZmYwLAotICAgICAgICAweDU5ZGRiNTdmLCAweDExNjVhN2NjLCAweGYxOWY3N2EwLCAweDA1MjUzOTM4LCAweDAwNGVmNzgyLCAweGZlY2RlNTcxLCAweDAwNzg2OWVlLCAweGZmZjUzOWNmLAotICAgICAgICAweDU5YWMwYmJhLCAweDEwYzViM2VmLCAweGYxYmM4ZTMxLCAweDA1MzQxMmU0LCAweDAwM2Y0YWI0LCAweGZlZDNjNTM4LCAweDAwNzdlODkxLCAweGZmZjRlNzk0LAotICAgICAgICAweDU5NzdlOTE5LCAweDEwMjZkMGI4LCAweGYxZGE4OTFiLCAweDA1NDI0ZTliLCAweDAwMmZjOThhLCAweGZlZDlhYjhmLCAweDAwNzc1Y2NmLCAweGZmZjQ5OTM0LAotICAgICAgICAweDU5NDE1MDc1LCAweDBmODkwNDM3LCAweGYxZjk2MzYwLCAweDA1NGZlY2NmLCAweDAwMjA3NGVkLCAweGZlZGY5N2M2LCAweDAwNzZjNmU4LCAweGZmZjQ0ZWEzLAotICAgICAgICAweDU5MDg0NGM5LCAweDBlZWM1NDY1LCAweGYyMTkxN2ZmLCAweDA1NWNlZTAzLCAweDAwMTE0ZGMzLCAweGZlZTU4OTMyLCAweDAwNzYyNzE5LCAweGZmZjQwN2QyLAotICAgICAgICAweDU4Y2NjOTMwLCAweDBlNTBjNzIzLCAweGYyMzlhMWVmLCAweDA1Njk1MmMzLCAweDAwMDI1NGU4LCAweGZlZWI3ZjI3LCAweDAwNzU3ZGEzLCAweGZmZjNjNGI3LAotICAgICAgICAweDU4OGVlMGVhLCAweDBkYjY2MjNiLCAweGYyNWFmYzI5LCAweDA1NzUxYmFhLCAweGZmZjM4YjMyLCAweGZlZjE3OGZjLCAweDAwNzRjYWM0LCAweGZmZjM4NTQyLAotICAgICAgICAweDU4NGU4ZjU2LCAweDBkMWQyYjVkLCAweGYyN2QyMTlmLCAweDA1ODA0OTVjLCAweGZmZTRmMTcxLCAweGZlZjc3NjBjLCAweDAwNzQwZWJiLCAweGZmZjM0OTY4LAotICAgICAgICAweDU4MGJkN2Y0LCAweDBjODUyODFmLCAweGYyYTAwZDQzLCAweDA1OGFkYzhkLCAweGZmZDY4ODZkLCAweGZlZmQ3NWFmLCAweDAwNzM0OWM3LCAweGZmZjMxMTFiLAotICAgICAgICAweDU3YzZiZTY3LCAweDBiZWU1ZGZmLCAweGYyYzNiYTA0LCAweDA1OTRkNWZhLCAweGZmYzg1MGU2LCAweGZmMDM3NzQ0LCAweDAwNzI3YzI3LCAweGZmZjJkYzRjLAotICAgICAgICAweDU3N2Y0NjcwLCAweDBiNThkMjYyLCAweGYyZTgyMmNlLCAweDA1OWUzNjZjLCAweGZmYmE0Yjk4LCAweGZmMDk3YTI5LCAweDAwNzFhNjFiLCAweGZmZjJhYWVmLAotICAgICAgICAweDU3MzU3M2YyLCAweDBhYzQ4YTkyLCAweGYzMGQ0MjhlLCAweDA1YTZmZWI5LCAweGZmYWM3OTM2LCAweGZmMGY3ZGJmLCAweDAwNzBjN2UxLCAweGZmZjI3Y2YzLAotICAgICAgICAweDU2ZTk0YWYxLCAweDBhMzE4YmMxLCAweGYzMzMxNDJmLCAweDA1YWYyZmJmLCAweGZmOWVkYTZkLCAweGZmMTU4MTZhLCAweDAwNmZlMWI4LCAweGZmZjI1MjRjLAotICAgICAgICAweDU2OWFjZjkwLCAweDA5OWZkYjA0LCAweGYzNTk5MjlhLCAweDA1YjZjYTZiLCAweGZmOTE2ZmUxLCAweGZmMWI4NDhlLCAweDAwNmVmM2RmLCAweGZmZjIyYWVhLAotICAgICAgICAweDU2NGEwNjEwLCAweDA5MGY3ZDU3LCAweGYzODBiOGJhLCAweDA1YmRjZmIyLCAweGZmODQzYTMyLCAweGZmMjE4NjkyLCAweDAwNmRmZTk0LCAweGZmZjIwNmJmLAotICAgICAgICAweDU1ZjZmMmQzLCAweDA4ODA3NzlkLCAweGYzYTg4MTc5LCAweDA1YzQ0MDk1LCAweGZmNzczOWY3LCAweGZmMjc4NmUxLCAweDAwNmQwMjE3LCAweGZmZjFlNWJiLAotICAgICAgICAweDU1YTE5YTVjLCAweDA3ZjJjZTliLCAweGYzZDBlN2MyLCAweDA1Y2ExZTFmLCAweGZmNmE2ZmMxLCAweGZmMmQ4NGU1LCAweDAwNmJmZWE0LCAweGZmZjFjN2QwLAotICAgICAgICAweDU1NGEwMTQ4LCAweDA3NjY4NmZjLCAweGYzZjllNjgwLCAweDA1Y2Y2OTY1LCAweGZmNWRkYzFhLCAweGZmMzM4MDBlLCAweDAwNmFmNDdiLCAweGZmZjFhY2VmLAotICAgICAgICAweDU0ZjAyYzU2LCAweDA2ZGJhNTUxLCAweGY0MjM3OGEwLCAweDA1ZDQyMzg3LCAweGZmNTE3Zjg2LCAweGZmMzk3N2NiLCAweDAwNjllM2Q5LCAweGZmZjE5NTA4LAotICAgICAgICAweDU0OTQyMDYxLCAweDA2NTIyZTBmLCAweGY0NGQ5OTEyLCAweDA1ZDg0ZGFmLCAweGZmNDU1YTgwLCAweGZmM2Y2YjhmLCAweDAwNjhjY2ZhLCAweGZmZjE4MDBiLAotICAgICAgICAweDU0MzVlMjYzLCAweDA1Y2EyNThmLCAweGY0Nzg0MmM1LCAweDA1ZGJlOTBmLCAweGZmMzk2ZDdmLCAweGZmNDU1YWNmLCAweDAwNjdiMDFlLCAweGZmZjE2ZGU5LAotICAgICAgICAweDUzZDU3Nzc0LCAweDA1NDM5MDBkLCAweGY0YTM3MGFkLCAweDA1ZGVmNmU0LCAweGZmMmRiOGYyLCAweGZmNGI0NTAzLCAweDAwNjY4ZDgwLCAweGZmZjE1ZTkzLAotICAgICAgICAweDUzNzJlNGM2LCAweDA0YmU3MWFiLCAweGY0Y2YxZGJmLCAweDA1ZTE3ODczLCAweGZmMjIzZDQwLCAweGZmNTEyOWEzLCAweDAwNjU2NTVkLCAweGZmZjE1MWY5LAotICAgICAgICAweDUzMGUyZmFjLCAweDA0M2FjZTZlLCAweGY0ZmI0NGY0LCAweDA1ZTM2ZjBkLCAweGZmMTZmYWNhLCAweGZmNTcwODJlLCAweDAwNjQzN2YxLCAweGZmZjE0ODBiLAotICAgICAgICAweDUyYTc1ZDkwLCAweDAzYjhhYTQwLCAweGY1MjdlMTQ5LCAweDA1ZTRkYzA4LCAweGZmMGJmMWVkLCAweGZmNWNlMDIxLCAweDAwNjMwNTc3LCAweGZmZjE0MGI5LAotICAgICAgICAweDUyM2U3M2ZkLCAweDAzMzgwOGViLCAweGY1NTRlZGJkLCAweDA1ZTVjMGM2LCAweGZmMDEyMmZjLCAweGZmNjJiMGZkLCAweDAwNjFjZTJjLCAweGZmZjEzYmYzLAotICAgICAgICAweDUxZDM3ODk3LCAweDAyYjhlZTIyLCAweGY1ODI2NTU1LCAweDA1ZTYxZWFlLCAweGZlZjY4ZTQ1LCAweGZmNjg3YTQ3LCAweDAwNjA5MjQ5LCAweGZmZjEzOWFhLAotICAgICAgICAweDUxNjY3MTFjLCAweDAyM2I1ZDc2LCAweGY1YjA0MzFhLCAweDA1ZTVmNzMzLCAweGZlZWMzNDBmLCAweGZmNmUzYjg0LCAweDAwNWY1MjBhLCAweGZmZjEzOWNkLAotICAgICAgICAweDUwZjc2MzY4LCAweDAxYmY1YTVlLCAweGY1ZGU4MjE4LCAweDA1ZTU0YmNkLCAweGZlZTIxNDliLCAweGZmNzNmNDNkLCAweDAwNWUwZGE4LCAweGZmZjEzYzRjLAotICAgICAgICAweDUwODY1NTZmLCAweDAxNDRlODM0LCAweGY2MGQxZDYzLCAweDA1ZTQxZGZlLCAweGZlZDgzMDIzLCAweGZmNzlhM2ZlLCAweDAwNWNjNTVjLCAweGZmZjE0MTE5LAotICAgICAgICAweDUwMTM0ZDNlLCAweDAwY2MwYTM2LCAweGY2M2MxMDEyLCAweDA1ZTI2ZjRlLCAweGZlY2U4NmRiLCAweGZmN2Y0YTU0LCAweDAwNWI3OTYxLCAweGZmZjE0ODIxLAotICAgICAgICAweDRmOWU1MGZmLCAweDAwNTRjMzgyLCAweGY2NmI1NTQ0LCAweDA1ZTA0MTRkLCAweGZlYzUxOGYxLCAweGZmODRlNmQwLCAweDAwNWEyOWVkLCAweGZmZjE1MTU2LAotICAgICAgICAweDRmMjc2NmYyLCAweGZmZGYxNzFiLCAweGY2OWFlODFkLCAweDA1ZGQ5NTkzLCAweGZlYmJlNjhjLCAweGZmOGE3OTA1LCAweDAwNThkNzM4LCAweGZmZjE1Y2E4LAotICAgICAgICAweDRlYWU5NTcxLCAweGZmNmIwN2U3LCAweGY2Y2FjM2M3LCAweDA1ZGE2ZGJlLCAweGZlYjJlZmNkLCAweGZmOTAwMDg5LCAweDAwNTc4MTdiLCAweGZmZjE2YTA3LAotICAgICAgICAweDRlMzNlMmVlLCAweGZlZjg5OGFlLCAweGY2ZmFlMzczLCAweDA1ZDZjYjcyLCAweGZlYWEzNGQwLCAweGZmOTU3Y2Y0LCAweDAwNTYyOGVjLCAweGZmZjE3OTYyLAotICAgICAgICAweDRkYjc1NWYzLCAweGZlODdjYzFiLCAweGY3MmI0MjViLCAweDA1ZDJiMDVjLCAweGZlYTFiNWE5LCAweGZmOWFlZGUwLCAweDAwNTRjZGMwLCAweGZmZjE4YWFiLAotICAgICAgICAweDRkMzhmNTIwLCAweGZlMThhNGJjLCAweGY3NWJkYmJkLCAweDA1Y2UxZTJkLCAweGZlOTk3MjY4LCAweGZmYTA1MmVjLCAweDAwNTM3MDJkLCAweGZmZjE5ZGQxLAotICAgICAgICAweDRjYjhjNzJlLCAweGZkYWIyNTAxLCAweGY3OGNhYWUwLCAweDA1YzkxNjlkLCAweGZlOTE2YjE1LCAweGZmYTVhYmI4LCAweDAwNTIxMDY4LCAweGZmZjFiMmM1LAotICAgICAgICAweDRjMzZkMmViLCAweGZkM2Y0ZjNkLCAweGY3YmRhYjE2LCAweDA1YzM5YjZhLCAweGZlODk5ZmIyLCAweGZmYWFmN2U2LCAweDAwNTBhZWE1LCAweGZmZjFjOTc2LAotICAgICAgICAweDRiYjMxZjNjLCAweGZjZDUyNWE1LCAweGY3ZWVkN2I0LCAweDA1YmRhZTU3LCAweGZlODIxMDNmLCAweGZmYjAzNzFjLCAweDAwNGY0YjE3LCAweGZmZjFlMWQ2LAotICAgICAgICAweDRiMmRiMzFhLCAweGZjNmNhYTUzLCAweGY4MjAyYzFjLCAweDA1Yjc1MTJlLCAweGZlN2FiY2IxLCAweGZmYjU2OTAyLCAweDAwNGRlNWYxLCAweGZmZjFmYmQ1LAotICAgICAgICAweDRhYTY5NTk0LCAweGZjMDVkZjQwLCAweGY4NTFhM2I2LCAweDA1YjA4NWJjLCAweGZlNzNhNGZiLCAweGZmYmE4ZDQ0LCAweDAwNGM3ZjY2LCAweGZmZjIxNzY0LAotICAgICAgICAweDRhMWRjZGNlLCAweGZiYTBjNjRiLCAweGY4ODMzOWY1LCAweDA1YTk0ZGQ1LCAweGZlNmNjOTA5LCAweGZmYmZhMzhkLCAweDAwNGIxN2E2LCAweGZmZjIzNDczLAotICAgICAgICAweDQ5OTM2MmZmLCAweGZiM2Q2MTMzLCAweGY4YjRlYTU1LCAweDA1YTFhYjUyLCAweGZlNjYyOGMxLCAweGZmYzRhYjhmLCAweDAwNDlhZWUzLCAweGZmZjI1MmYzLAotICAgICAgICAweDQ5MDc1YzcyLCAweGZhZGJiMTlhLCAweGY4ZTZiMDU5LCAweDA1OTlhMDBlLCAweGZlNWZjNDA1LCAweGZmYzlhNGZjLCAweDAwNDg0NTRiLCAweGZmZjI3MmQ2LAotICAgICAgICAweDQ4NzljMTg1LCAweGZhN2JiOTA4LCAweGY5MTg4NzkzLCAweDA1OTEyZGVhLCAweGZlNTk5YWFmLCAweGZmY2U4ZjhhLCAweDAwNDZkYjBmLCAweGZmZjI5NDBiLAotICAgICAgICAweDQ3ZWE5OWE5LCAweGZhMWQ3OGUzLCAweGY5NGE2YjliLCAweDA1ODg1NmNkLCAweGZlNTNhYzk3LCAweGZmZDM2YWYxLCAweDAwNDU3MDVjLCAweGZmZjJiNjg2LAotICAgICAgICAweDQ3NTllYzYwLCAweGY5YzBmMjc2LCAweGY5N2M1ODE1LCAweDA1N2YxYzllLCAweGZlNGRmOThlLCAweGZmZDgzNmViLCAweDAwNDQwNTYxLCAweGZmZjJkYTM2LAotICAgICAgICAweDQ2YzdjMTQwLCAweGY5NjYyNmYwLCAweGY5YWU0OGFmLCAweDA1NzU4MTRjLCAweGZlNDg4MTVlLCAweGZmZGNmMzM2LCAweDAwNDI5YTRhLCAweGZmZjJmZjBkLAotICAgICAgICAweDQ2MzQxZmVkLCAweGY5MGQxNzYxLCAweGY5ZTAzOTI0LCAweDA1NmI4NmM2LCAweGZlNDM0M2QwLCAweGZmZTE5ZjkxLCAweDAwNDEyZjQzLCAweGZmZjMyNGZkLAotICAgICAgICAweDQ1OWYxMDFkLCAweGY4YjVjNGJlLCAweGZhMTIyNTM3LCAweDA1NjEyZjAwLCAweGZlM2U0MGE2LCAweGZmZTYzYmMwLCAweDAwM2ZjNDc4LCAweGZmZjM0YmY5LAotICAgICAgICAweDQ1MDg5OTk2LCAweGY4NjAyZmRjLCAweGZhNDQwOGJhLCAweDA1NTY3YmYxLCAweGZlMzk3NzlhLCAweGZmZWFjNzg3LCAweDAwM2U1YTEyLCAweGZmZjM3M2YwLAotICAgICAgICAweDQ0NzBjNDJkLCAweGY4MGM1OTc3LCAweGZhNzVkZjg3LCAweDA1NGI2ZjkyLCAweGZlMzRlODY3LCAweGZmZWY0MmFmLCAweDAwM2NmMDNkLCAweGZmZjM5Y2Q3LAotICAgICAgICAweDQzZDc5N2M3LCAweGY3YmE0MjJiLCAweGZhYTdhNTg2LCAweDA1NDAwYmUxLCAweGZlMzA5MmJmLCAweGZmZjNhZDAxLCAweDAwM2I4NzFmLCAweGZmZjNjNjlmLAotICAgICAgICAweDQzM2QxYzU2LCAweGY3NjllYTc4LCAweGZhZDk1NmFiLCAweDA1MzQ1MmRjLCAweGZlMmM3NjUwLCAweGZmZjgwNjRiLCAweDAwM2ExZWUzLCAweGZmZjNmMTNhLAotICAgICAgICAweDQyYTE1OWRjLCAweGY3MWI1MmM0LCAweGZiMGFlZWY2LCAweDA1Mjg0Njg1LCAweGZlMjg5MmM1LCAweGZmZmM0ZTVjLCAweDAwMzhiN2FlLCAweGZmZjQxYzljLAotICAgICAgICAweDQyMDQ1ODY1LCAweGY2Y2U3YjU3LCAweGZiM2M2YTczLCAweDA1MWJlOGRkLCAweGZlMjRlN2MzLCAweDAwMDA4NTA3LCAweDAwMzc1MWE3LCAweGZmZjQ0OGI3LAotICAgICAgICAweDQxNjYyMDBlLCAweGY2ODM2NDVhLCAweGZiNmRjNTNjLCAweDA1MGYzYmVjLCAweGZlMjE3NGVjLCAweDAwMDRhYTFmLCAweDAwMzVlY2Y0LCAweGZmZjQ3NTdlLAotICAgICAgICAweDQwYzZiOGZkLCAweGY2M2EwZGRmLCAweGZiOWVmYjc3LCAweDA1MDI0MWI2LCAweGZlMWUzOWRhLCAweDAwMDhiZDdjLCAweDAwMzQ4OWI5LCAweGZmZjRhMmU1LAotICAgICAgICAweDQwMjYyYjY1LCAweGY1ZjI3N2Q5LCAweGZiZDAwOTU2LCAweDA0ZjRmYzQ2LCAweGZlMWIzNjI4LCAweDAwMGNiZWY3LCAweDAwMzMyODFhLCAweGZmZjRkMGRlLAotICAgICAgICAweDNmODQ3ZjgzLCAweGY1YWNhMjFmLCAweGZjMDBlYjFiLCAweDA0ZTc2ZGEzLCAweGZlMTg2OTZhLCAweDAwMTBhZTZlLCAweDAwMzFjODNhLCAweGZmZjRmZjVkLAotICAgICAgICAweDNlZTFiZGEyLCAweGY1Njg4YzZkLCAweGZjMzE5ZDEzLCAweDA0ZDk5N2Q4LCAweGZlMTVkMzJmLCAweDAwMTQ4YmJkLCAweDAwMzA2YTNiLCAweGZmZjUyZTU3LAotICAgICAgICAweDNlM2RlZTEzLCAweGY1MjYzNjY1LCAweGZjNjIxYjlhLCAweDA0Y2I3Y2YyLCAweGZlMTM3MzA0LCAweDAwMTg1NmM3LCAweDAwMmYwZTNmLCAweGZmZjU1ZGJmLAotICAgICAgICAweDNkOTkxOTMyLCAweGY0ZTU5ZjhhLCAweGZjOTI2MzE5LCAweDA0YmQxZWZiLCAweGZlMTE0ODcyLCAweDAwMWMwZjZlLCAweDAwMmRiNDY2LCAweGZmZjU4ZDg5LAotICAgICAgICAweDNjZjM0NzY2LCAweGY0YTZjNzQ4LCAweGZjYzI3MDA4LCAweDA0YWU4MDAwLCAweGZlMGY1MmZjLCAweDAwMWZiNTk5LCAweDAwMmM1Y2QwLCAweGZmZjViZGFhLAotICAgICAgICAweDNjNGM4MTFjLCAweGY0NjlhY2VkLCAweGZjZjIzZWVjLCAweDA0OWZhMjBmLCAweGZlMGQ5MjI0LCAweDAwMjM0OTJmLCAweDAwMmIwNzlhLCAweGZmZjVlZTE3LAotICAgICAgICAweDNiYTRjZWM5LCAweGY0MmU0ZmFmLCAweGZkMjFjYzU5LCAweDA0OTA4NzMzLCAweGZlMGMwNTY3LCAweDAwMjZjYTFjLCAweDAwMjliNGU0LCAweGZmZjYxZWM1LAotICAgICAgICAweDNhZmMzOGViLCAweGYzZjRhZWE2LCAweGZkNTExNGYwLCAweDA0ODEzMTdhLCAweGZlMGFhYzNmLCAweDAwMmEzODRjLCAweDAwMjg2NGM5LCAweGZmZjY0ZmE4LAotICAgICAgICAweDNhNTJjODA1LCAweGYzYmNjOGQzLCAweGZkODAxNTY0LCAweDA0NzFhMmVmLCAweGZlMDk4NjIyLCAweDAwMmQ5M2FlLCAweDAwMjcxNzY2LCAweGZmZjY4MGI1LAotICAgICAgICAweDM5YTg4NGExLCAweGYzODY5ZDFhLCAweGZkYWVjYTczLCAweDA0NjFkZGEwLCAweGZlMDg5MjgzLCAweDAwMzBkYzM0LCAweDAwMjVjY2Q3LCAweGZmZjZiMWU0LAotICAgICAgICAweDM4ZmQ3NzRlLCAweGYzNTIyYTQ5LCAweGZkZGQzMGViLCAweDA0NTFlMzk2LCAweGZlMDdkMGQzLCAweDAwMzQxMWQyLCAweDAwMjQ4NTM1LCAweGZmZjZlMzI5LAotICAgICAgICAweDM4NTFhOGEyLCAweGYzMWY2ZjBmLCAweGZlMGI0NWFhLCAweDA0NDFiNmRkLCAweGZlMDc0MDdkLCAweDAwMzczNDdkLCAweDAwMjM0MDlhLCAweGZmZjcxNDdhLAotICAgICAgICAweDM3YTUyMTM1LCAweGYyZWU2YTA3LCAweGZlMzkwNTliLCAweDA0MzE1OTdkLCAweGZlMDZlMGViLCAweDAwM2E0NDJlLCAweDAwMjFmZjFmLCAweGZmZjc0NWNkLAotICAgICAgICAweDM2ZjdlOWE0LCAweGYyYmYxOWFlLCAweGZlNjY2ZGJjLCAweDA0MjBjZDgwLCAweGZlMDZiMTg0LCAweDAwM2Q0MGUwLCAweDAwMjBjMGRjLCAweGZmZjc3NzFhLAotICAgICAgICAweDM2NGEwYTkwLCAweGYyOTE3YzZkLCAweGZlOTM3YjE1LCAweDA0MTAxNGViLCAweGZlMDZiMWFjLCAweDAwNDAyYThlLCAweDAwMWY4NWU2LCAweGZmZjdhODU3LAotICAgICAgICAweDM1OWI4YzlkLCAweGYyNjU5MDhmLCAweGZlYzAyYWMyLCAweDAzZmYzMWMzLCAweGZlMDZlMGM0LCAweDAwNDMwMTM3LCAweDAwMWU0ZTU2LCAweGZmZjdkOTdhLAotICAgICAgICAweDM0ZWM3ODZmLCAweGYyM2I1NDRiLCAweGZlZWM3OWVjLCAweDAzZWUyNjBkLCAweGZlMDczZTJhLCAweDAwNDVjNGRkLCAweDAwMWQxYTNmLCAweGZmZjgwYTdjLAotICAgICAgICAweDM0M2NkNmFmLCAweGYyMTJjNWJlLCAweGZmMTg2NWNkLCAweDAzZGNmM2NhLCAweGZlMDdjOTNhLCAweDAwNDg3NTgyLCAweDAwMWJlOWI3LCAweGZmZjgzYjUyLAotICAgICAgICAweDMzOGNiMDA0LCAweGYxZWJlMmVjLCAweGZmNDNlYmFjLCAweDAzY2I5Y2Y5LCAweGZlMDg4MTRlLCAweDAwNGIxMzJiLCAweDAwMWFiY2QwLCAweGZmZjg2YmY2LAotICAgICAgICAweDMyZGMwZDE3LCAweGYxYzZhOWMzLCAweGZmNmYwOGU0LCAweDAzYmEyMzk4LCAweGZlMDk2NWJjLCAweDAwNGQ5ZGRlLCAweDAwMTk5MzlkLCAweGZmZjg5YzYwLAotICAgICAgICAweDMyMmFmNjkzLCAweGYxYTMxODFhLCAweGZmOTliYWRiLCAweDAzYTg4OWExLCAweGZlMGE3NWRhLCAweDAwNTAxNWE1LCAweDAwMTg2ZTMxLCAweGZmZjhjYzg2LAotICAgICAgICAweDMxNzk3NTFmLCAweGYxODEyYmIwLCAweGZmYzNmZjBjLCAweDAzOTZkMTBjLCAweGZlMGJiMGY5LCAweDAwNTI3YThhLCAweDAwMTc0YzljLCAweGZmZjhmYzYyLAotICAgICAgICAweDMwYzc5MTYzLCAweGYxNjBlMjJkLCAweGZmZWRkMmZkLCAweDAzODRmYmQxLCAweGZlMGQxNjZiLCAweDAwNTRjYzlhLCAweDAwMTYyZWVmLCAweGZmZjkyYmVjLAotICAgICAgICAweDMwMTU1NDA0LCAweGYxNDIzOTI0LCAweDAwMTczNDQ3LCAweDAzNzMwYmUwLCAweGZlMGVhNTdlLCAweDAwNTcwYmU0LCAweDAwMTUxNTM4LCAweGZmZjk1YjFlLAotICAgICAgICAweDJmNjJjNWE3LCAweGYxMjUyZTBmLCAweDAwNDAyMDkyLCAweDAzNjEwMzJhLCAweGZlMTA1ZDdlLCAweDAwNTkzODc3LCAweDAwMTNmZjg4LCAweGZmZjk4OWVmLAotICAgICAgICAweDJlYWZlZWVkLCAweGYxMDliZTU2LCAweDAwNjg5NTk4LCAweDAzNGVlMzliLCAweGZlMTIzZGI2LCAweDAwNWI1MjY3LCAweDAwMTJlZGVhLCAweGZmZjliODViLAotICAgICAgICAweDJkZmNkODczLCAweGYwZWZlNzQ4LCAweDAwOTA5MTFmLCAweDAzM2NhZjFkLCAweGZlMTQ0NTcwLCAweDAwNWQ1OWM2LCAweDAwMTFlMDZkLCAweGZmZjllNjVhLAotICAgICAgICAweDJkNDk4YWQzLCAweGYwZDdhNjIyLCAweDAwYjgxMTAyLCAweDAzMmE2Nzk2LCAweGZlMTY3M2YyLCAweDAwNWY0ZWFjLCAweDAwMTBkNzFkLCAweGZmZmExM2U1LAotICAgICAgICAweDJjOTYwZWEzLCAweGYwYzBmODA4LCAweDAwZGYxMzI4LCAweDAzMTgwZWU3LCAweGZlMThjODg0LCAweDAwNjEzMTJlLCAweDAwMGZkMjA1LCAweGZmZmE0MGY4LAotICAgICAgICAweDJiZTI2YzczLCAweGYwYWJkYTBlLCAweDAxMDU5NThjLCAweDAzMDVhNmYwLCAweGZlMWI0MjY4LCAweDAwNjMwMTY3LCAweDAwMGVkMTMwLCAweGZmZmE2ZDhkLAotICAgICAgICAweDJiMmVhY2NmLCAweGYwOTg0OTMxLCAweDAxMmI5NjM1LCAweDAyZjMzMThhLCAweGZlMWRlMGUyLCAweDAwNjRiZjcxLCAweDAwMGRkNGE3LCAweGZmZmE5OTlkLAotICAgICAgICAweDJhN2FkODNjLCAweGYwODY0MjVhLCAweDAxNTExMzNlLCAweDAyZTBiMDhkLCAweGZlMjBhMzM1LCAweDAwNjY2YjY4LCAweDAwMGNkYzc0LCAweGZmZmFjNTI1LAotICAgICAgICAweDI5YzZmNzM4LCAweGYwNzVjMjYwLCAweDAxNzYwYWQxLCAweDAyY2UyNWNhLCAweGZlMjM4OGExLCAweDAwNjgwNTZiLCAweDAwMGJlODlmLCAweGZmZmFmMDFlLAotICAgICAgICAweDI5MTMxMjNjLCAweGYwNjZjNjA2LCAweDAxOWE3YjI3LCAweDAyYmI5MzEwLCAweGZlMjY5MDY1LCAweDAwNjk4ZDk4LCAweDAwMGFmOTMxLCAweGZmZmIxYTg0LAotICAgICAgICAweDI4NWYzMWI3LCAweGYwNTk0OWZiLCAweDAxYmU2MjhjLCAweDAyYThmYTJhLCAweGZlMjliOWMxLCAweDAwNmIwNDExLCAweDAwMGEwZTJmLCAweGZmZmI0NDUzLAotICAgICAgICAweDI3YWI1ZTEyLCAweGYwNGQ0YWRlLCAweDAxZTFiZjU4LCAweDAyOTY1Y2RiLCAweGZlMmQwM2YyLCAweDAwNmM2OGY4LCAweDAwMDkyN2EwLCAweGZmZmI2ZDg2LAotICAgICAgICAweDI2Zjc5ZmFiLCAweGYwNDJjNTM5LCAweDAyMDQ4ZmY4LCAweDAyODNiY2U2LCAweGZlMzA2ZTM1LCAweDAwNmRiYzcxLCAweDAwMDg0NTg5LCAweGZmZmI5NjFhLAotICAgICAgICAweDI2NDNmZWRhLCAweGYwMzliNTg3LCAweDAyMjZkMmU2LCAweDAyNzExYzA1LCAweGZlMzNmN2M3LCAweDAwNmVmZWEwLCAweDAwMDc2N2YwLCAweGZmZmJiZTA5LAotICAgICAgICAweDI1OTA4M2ViLCAweGYwMzIxODJmLCAweDAyNDg4NmFkLCAweDAyNWU3YmYwLCAweGZlMzc5ZmUzLCAweDAwNzAyZmFlLCAweDAwMDY4ZWQ4LCAweGZmZmJlNTUyLAotICAgICAgICAweDI0ZGQzNzIxLCAweGYwMmJlOThhLCAweDAyNjlhOWU5LCAweDAyNGJkZTVhLCAweGZlM2I2NWM0LCAweDAwNzE0ZmMwLCAweDAwMDViYTQ2LCAweGZmZmMwYmVmLAotICAgICAgICAweDI0MmEyMGIzLCAweGYwMjcyNWRjLCAweDAyOGEzYjQ0LCAweDAyMzk0NGVlLCAweGZlM2Y0OGE1LCAweDAwNzI1ZjAyLCAweDAwMDRlYTNhLCAweGZmZmMzMWRmLAotICAgICAgICAweDIzNzc0OGNmLCAweGYwMjNjOTVkLCAweDAyYWEzOTdiLCAweDAyMjZiMTU2LCAweGZlNDM0N2MwLCAweDAwNzM1ZDljLCAweDAwMDQxZWI5LCAweGZmZmM1NzFlLAotICAgICAgICAweDIyYzRiNzk1LCAweGYwMjFkMDMxLCAweDAyYzlhMzU5LCAweDAyMTQyNTMzLCAweGZlNDc2MjUwLCAweDAwNzQ0YmJhLCAweDAwMDM1N2MyLCAweGZmZmM3YmE5LAotICAgICAgICAweDIyMTI3NTFhLCAweGYwMjEzNjcxLCAweDAyZTg3N2I5LCAweDAyMDFhMjIzLCAweGZlNGI5NzhlLCAweDAwNzUyOThhLCAweDAwMDI5NTU4LCAweGZmZmM5ZjdlLAotICAgICAgICAweDIxNjA4OTY4LCAweGYwMjFmODIzLCAweDAzMDZiNTg2LCAweDAxZWYyOWJlLCAweGZlNGZlNmIzLCAweDAwNzVmNzM5LCAweDAwMDFkNzc5LCAweGZmZmNjMjlhLAotICAgICAgICAweDIwYWVmYzc5LCAweGYwMjQxMTQwLCAweDAzMjQ1YmJjLCAweDAxZGNiZDk2LCAweGZlNTQ0ZWZiLCAweDAwNzZiNGY1LCAweDAwMDExZTI2LCAweGZmZmNlNGZjLAotICAgICAgICAweDFmZmRkNjNiLCAweGYwMjc3ZGIxLCAweDAzNDE2OTY2LCAweDAxY2E1ZjM3LCAweGZlNThjZjlkLCAweDAwNzc2MmYwLCAweDAwMDA2OTVlLCAweGZmZmQwNmExLAotICAgICAgICAweDFmNGQxZThlLCAweGYwMmMzOTUzLCAweDAzNWRkZDllLCAweDAxYjgxMDI4LCAweGZlNWQ2N2Q0LCAweDAwNzgwMTVhLCAweGZmZmZiOTFmLCAweGZmZmQyNzg3LAotICAgICAgICAweDFlOWNkZDQzLCAweGYwMzIzZmY1LCAweDAzNzliNzkwLCAweDAxYTVkMWVhLCAweGZlNjIxNmRiLCAweDAwNzg5MDY1LCAweGZmZmYwZDY2LCAweGZmZmQ0N2FlLAotICAgICAgICAweDFkZWQxYTFkLCAweGYwMzk4ZDU2LCAweDAzOTRmNjc0LCAweDAxOTNhNWY5LCAweGZlNjZkYmViLCAweDAwNzkxMDQzLCAweGZmZmU2NjMxLCAweGZmZmQ2NzEzLAorI2luY2x1ZGUgIkF1ZGlvUmVzYW1wbGVyU2luY0Rvd24uaCIKIH07CiAKIC8vIHdlIHVzZSAxNSBiaXRzIHRvIGludGVycG9sYXRlIGJldHdlZW4gdGhlc2Ugc2FtcGxlcwpAQCAtNTEyLDcgKzI1Niw3IEBACiAgICAgbVZvbHVtZVNJTURbMV0gPSB1NF8yOF9mcm9tX2Zsb2F0KGNsYW1wRmxvYXRWb2wocmlnaHQpKTsKIH0KIAotdm9pZCBBdWRpb1Jlc2FtcGxlclNpbmM6OnJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCitzaXplX3QgQXVkaW9SZXNhbXBsZXJTaW5jOjpyZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpCiB7CiAgICAgLy8gRklYTUUgc3RvcmUgY3VycmVudCBzdGF0ZSAodXAgb3IgZG93biBzYW1wbGUpIGFuZCBvbmx5IGxvYWQgdGhlIGNvZWZzIHdoZW4gdGhlIHN0YXRlCkBAIC01MjEsMjMgKzI2NSwyNSBAQAogICAgIGlmIChtQ29uc3RhbnRzID09ICZ2ZXJ5SGlnaFF1YWxpdHlDb25zdGFudHMgJiYgcmVhZFJlc2FtcGxlQ29lZmZpY2llbnRzKSB7CiAgICAgICAgIG1GaXJDb2VmcyA9IHJlYWRSZXNhbXBsZUNvZWZmaWNpZW50cyggbUluU2FtcGxlUmF0ZSA8PSBtU2FtcGxlUmF0ZSApOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG1GaXJDb2VmcyA9IChjb25zdCBpbnQzMl90ICopICgobUluU2FtcGxlUmF0ZSA8PSBtU2FtcGxlUmF0ZSkgPyBtRmlyQ29lZnNVcCA6IG1GaXJDb2Vmc0Rvd24pOworICAgICAgICBtRmlyQ29lZnMgPSAoY29uc3QgaW50MzJfdCAqKQorICAgICAgICAgICAgICAgICgobUluU2FtcGxlUmF0ZSA8PSBtU2FtcGxlUmF0ZSkgPyBtRmlyQ29lZnNVcCA6IG1GaXJDb2Vmc0Rvd24pOwogICAgIH0KIAogICAgIC8vIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgcmVzYW1wbGVyCiAgICAgc3dpdGNoIChtQ2hhbm5lbENvdW50KSB7CiAgICAgY2FzZSAxOgotICAgICAgICByZXNhbXBsZTwxPihvdXQsIG91dEZyYW1lQ291bnQsIHByb3ZpZGVyKTsKLSAgICAgICAgYnJlYWs7CisgICAgICAgIHJldHVybiByZXNhbXBsZTwxPihvdXQsIG91dEZyYW1lQ291bnQsIHByb3ZpZGVyKTsKICAgICBjYXNlIDI6Ci0gICAgICAgIHJlc2FtcGxlPDI+KG91dCwgb3V0RnJhbWVDb3VudCwgcHJvdmlkZXIpOwotICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIHJlc2FtcGxlPDI+KG91dCwgb3V0RnJhbWVDb3VudCwgcHJvdmlkZXIpOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImludmFsaWQgY2hhbm5lbCBjb3VudDogJWQiLCBtQ2hhbm5lbENvdW50KTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogfQogCiAKIHRlbXBsYXRlPGludCBDSEFOTkVMUz4KLXZvaWQgQXVkaW9SZXNhbXBsZXJTaW5jOjpyZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorc2l6ZV90IEF1ZGlvUmVzYW1wbGVyU2luYzo6cmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpCiB7CiAgICAgY29uc3QgQ29uc3RhbnRzJiBjKCptQ29uc3RhbnRzKTsKQEAgLTYxMiw2ICszNTgsNyBAQAogICAgIG1JbXB1bHNlID0gaW1wdWxzZTsKICAgICBtSW5wdXRJbmRleCA9IGlucHV0SW5kZXg7CiAgICAgbVBoYXNlRnJhY3Rpb24gPSBwaGFzZUZyYWN0aW9uOworICAgIHJldHVybiBvdXRwdXRJbmRleCAvIENIQU5ORUxTOwogfQogCiB0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFM+CkBAIC04NTYsNCArNjAzLDQgQEAKICAgICB9CiB9CiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvUmVzYW1wbGVyU2luYy5oCmluZGV4IDQ2OTFkMGEuLjBmYmVhYzggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jLmgKQEAgLTM5LDcgKzM5LDcgQEAKIAogICAgIHZpcnR1YWwgfkF1ZGlvUmVzYW1wbGVyU2luYygpOwogCi0gICAgdmlydHVhbCB2b2lkIHJlc2FtcGxlKGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsCisgICAgdmlydHVhbCBzaXplX3QgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKIHByaXZhdGU6CiAgICAgdm9pZCBpbml0KCk7CkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgdmlydHVhbCB2b2lkIHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CiAKICAgICB0ZW1wbGF0ZTxpbnQgQ0hBTk5FTFM+Ci0gICAgdm9pZCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAorICAgIHNpemVfdCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOwogCiAgICAgdGVtcGxhdGU8aW50IENIQU5ORUxTPgpAQCAtOTUsNiArOTUsNiBAQAogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8qQU5EUk9JRF9BVURJT19SRVNBTVBMRVJfU0lOQ19IKi8KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmNEb3duLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jRG93bi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMGZiODYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jRG93bi5oCkBAIC0wLDAgKzEsMTMxIEBACisvLyBjbWQtbGluZTogZmlyIC1sIDcgLXM0ODAwMCAtYyAxNzE4OQorCisgICAgMHg1YmFjYjZmNCwgMHgxZGVkMWExZCwgMHhmMDM5OGQ1NiwgMHgwMzk0ZjY3NCwgMHgwMTkzYTVmOSwgMHhmZTY2ZGJlYiwgMHgwMDc5MTA0MywgMHhmZmZlNjYzMSwKKyAgICAweDViYWI2YzgxLCAweDFkM2RkY2NkLCAweGYwNDIxZDJjLCAweDAzYWY5OTk1LCAweDAxODE4ZGM5LCAweGZlNmJiNjNlLCAweDAwNzk4MTJhLCAweGZmZmRjMzdkLAorICAgIDB4NWJhNzhkMzcsIDB4MWM4ZjJjZjksIDB4ZjA0YmViMWQsIDB4MDNjOWEwNGEsIDB4MDE2ZjhhY2EsIDB4ZmU3MGE1MTEsIDB4MDA3OWUzNGQsIDB4ZmZmZDI1NDUsCisgICAgMHg1YmExMTk0ZiwgMHgxYmUxMTIzMSwgMHhmMDU2ZjJjNywgMHgwM2UzMDlmZSwgMHgwMTVkOWU2NCwgMHhmZTc1YTc5ZiwgMHgwMDdhMzZlMiwgMHhmZmZjOGI4NiwKKyAgICAweDViOTgxMTIyLCAweDFiMzM5M2Y4LCAweGYwNjMyZmI3LCAweDAzZmJkNjI1LCAweDAxNGJjOWZhLCAweGZlN2FiZDIzLCAweDAwN2E3YzIwLCAweGZmZmJmNjM5LAorICAgIDB4NWI4Yzc1MzAsIDB4MWE4NmI5YmYsIDB4ZjA3MDlkNzQsIDB4MDQxNDA0NDksIDB4MDEzYTBlZTksIDB4ZmU3ZmU0ZGIsIDB4MDA3YWIzM2QsIDB4ZmZmYjY1NWIsCisgICAgMHg1YjdlNDYxYSwgMHgxOWRhOGFlNSwgMHhmMDdmMzc3NiwgMHgwNDJiOTNmZCwgMHgwMTI4NmU4NiwgMHhmZTg1MWUwNSwgMHgwMDdhZGM3MiwgMHhmZmZhZDhlNCwKKyAgICAweDViNmQ4NGE4LCAweDE5MmYwZWI3LCAweGYwOGVmOTJkLCAweDA0NDI4NGU2LCAweDAxMTZlYTIyLCAweGZlOGE2N2RkLCAweDAwN2FmN2Y2LCAweGZmZmE1MGNlLAorICAgIDB4NWI1YTMxYzYsIDB4MTg4NDRjNzAsIDB4ZjA5ZmRkZmUsIDB4MDQ1OGQ2YjcsIDB4MDEwNTgzMDYsIDB4ZmU4ZmMxYTUsIDB4MDA3YjA2MDMsIDB4ZmZmOWNkMTIsCisgICAgMHg1YjQ0NGU4MSwgMHgxN2RhNGIzNywgMHhmMGIxZTE0MywgMHgwNDZlODkzMywgMHgwMGY0M2E3NCwgMHhmZTk1MmE5YiwgMHgwMDdiMDZkNCwgMHhmZmY5NGRhOSwKKyAgICAweDViMmJkYzBlLCAweDE3MzExMjIyLCAweGYwYzRmZTUwLCAweDA0ODM5YzI5LCAweDAwZTMxMWE5LCAweGZlOWFhMjAxLCAweDAwN2FmYWExLCAweGZmZjhkMjhjLAorICAgIDB4NWIxMGRiYzIsIDB4MTY4OGE4MzIsIDB4ZjBkOTMwNmQsIDB4MDQ5ODBmNzksIDB4MDBkMjA5ZGIsIDB4ZmVhMDI3MTksIDB4MDA3YWUxYTcsIDB4ZmZmODViYjEsCisgICAgMHg1YWYzNGYxOCwgMHgxNWUxMTQ1MywgMHhmMGVlNzJkYiwgMHgwNGFiZTMxMCwgMHgwMGMxMjQzOSwgMHhmZWE1YjkyNiwgMHgwMDdhYmMyMCwgMHhmZmY3ZTkxMCwKKyAgICAweDVhZDMzN2FmLCAweDE1M2E1ZDVlLCAweGYxMDRjMGQyLCAweDA0YmYxNmU5LCAweDAwYjA2MWViLCAweGZlYWI1NzZkLCAweDAwN2E4YTQ5LCAweGZmZjc3YTlmLAorICAgIDB4NWFiMDk3NDgsIDB4MTQ5NDhhMTYsIDB4ZjExYzE1ODMsIDB4MDRkMWFiMGQsIDB4MDA5ZmM0MTMsIDB4ZmViMTAxMzQsIDB4MDA3YTRjNWQsIDB4ZmZmNzEwNTcsCisgICAgMHg1YThiNmZjNywgMHgxM2VmYTEyYywgMHhmMTM0NmMxNywgMHgwNGUzOWY5MywgMHgwMDhmNGJjYiwgMHhmZWI2YjVjMCwgMHgwMDdhMDI5YSwgMHhmZmY2YWEyYiwKKyAgICAweDVhNjNjMzM2LCAweDEzNGJhOTM3LCAweGYxNGRiZmIxLCAweDA0ZjRmNGEyLCAweDAwN2VmYTI5LCAweGZlYmM3NDVjLCAweDAwNzlhZDNkLCAweGZmZjY0ODEyLAorICAgIDB4NWEzOTkzYzAsIDB4MTJhOGE4YmIsIDB4ZjE2ODBiNmUsIDB4MDUwNWFhNmEsIDB4MDA2ZWQwMzgsIDB4ZmVjMjNjNTAsIDB4MDA3OTRjODIsIDB4ZmZmNWVhMDIsCisgICAgMHg1YTBjZTNiMiwgMHgxMjA2YTYyNSwgMHhmMTgzNGE2MywgMHgwNTE1YzEyZCwgMHgwMDVlY2YwMSwgMHhmZWM4MGNlOCwgMHgwMDc4ZTBhOSwgMHhmZmY1OGZmMCwKKyAgICAweDU5ZGRiNTdmLCAweDExNjVhN2NjLCAweGYxOWY3N2EwLCAweDA1MjUzOTM4LCAweDAwNGVmNzgyLCAweGZlY2RlNTcxLCAweDAwNzg2OWVlLCAweGZmZjUzOWNmLAorICAgIDB4NTlhYzBiYmEsIDB4MTBjNWIzZWYsIDB4ZjFiYzhlMzEsIDB4MDUzNDEyZTQsIDB4MDAzZjRhYjQsIDB4ZmVkM2M1MzgsIDB4MDA3N2U4OTEsIDB4ZmZmNGU3OTQsCisgICAgMHg1OTc3ZTkxOSwgMHgxMDI2ZDBiOCwgMHhmMWRhODkxYiwgMHgwNTQyNGU5YiwgMHgwMDJmYzk4YSwgMHhmZWQ5YWI4ZiwgMHgwMDc3NWNjZiwgMHhmZmY0OTkzNCwKKyAgICAweDU5NDE1MDc1LCAweDBmODkwNDM3LCAweGYxZjk2MzYwLCAweDA1NGZlY2NmLCAweDAwMjA3NGVkLCAweGZlZGY5N2M2LCAweDAwNzZjNmU4LCAweGZmZjQ0ZWEzLAorICAgIDB4NTkwODQ0YzksIDB4MGVlYzU0NjUsIDB4ZjIxOTE3ZmYsIDB4MDU1Y2VlMDMsIDB4MDAxMTRkYzMsIDB4ZmVlNTg5MzIsIDB4MDA3NjI3MTksIDB4ZmZmNDA3ZDIsCisgICAgMHg1OGNjYzkzMCwgMHgwZTUwYzcyMywgMHhmMjM5YTFlZiwgMHgwNTY5NTJjMywgMHgwMDAyNTRlOCwgMHhmZWViN2YyNywgMHgwMDc1N2RhMywgMHhmZmYzYzRiNywKKyAgICAweDU4OGVlMGVhLCAweDBkYjY2MjNiLCAweGYyNWFmYzI5LCAweDA1NzUxYmFhLCAweGZmZjM4YjMyLCAweGZlZjE3OGZjLCAweDAwNzRjYWM0LCAweGZmZjM4NTQyLAorICAgIDB4NTg0ZThmNTYsIDB4MGQxZDJiNWQsIDB4ZjI3ZDIxOWYsIDB4MDU4MDQ5NWMsIDB4ZmZlNGYxNzEsIDB4ZmVmNzc2MGMsIDB4MDA3NDBlYmIsIDB4ZmZmMzQ5NjgsCisgICAgMHg1ODBiZDdmNCwgMHgwYzg1MjgxZiwgMHhmMmEwMGQ0MywgMHgwNThhZGM4ZCwgMHhmZmQ2ODg2ZCwgMHhmZWZkNzVhZiwgMHgwMDczNDljNywgMHhmZmYzMTExYiwKKyAgICAweDU3YzZiZTY3LCAweDBiZWU1ZGZmLCAweGYyYzNiYTA0LCAweDA1OTRkNWZhLCAweGZmYzg1MGU2LCAweGZmMDM3NzQ0LCAweDAwNzI3YzI3LCAweGZmZjJkYzRjLAorICAgIDB4NTc3ZjQ2NzAsIDB4MGI1OGQyNjIsIDB4ZjJlODIyY2UsIDB4MDU5ZTM2NmMsIDB4ZmZiYTRiOTgsIDB4ZmYwOTdhMjksIDB4MDA3MWE2MWIsIDB4ZmZmMmFhZWYsCisgICAgMHg1NzM1NzNmMiwgMHgwYWM0OGE5MiwgMHhmMzBkNDI4ZSwgMHgwNWE2ZmViOSwgMHhmZmFjNzkzNiwgMHhmZjBmN2RiZiwgMHgwMDcwYzdlMSwgMHhmZmYyN2NmMywKKyAgICAweDU2ZTk0YWYxLCAweDBhMzE4YmMxLCAweGYzMzMxNDJmLCAweDA1YWYyZmJmLCAweGZmOWVkYTZkLCAweGZmMTU4MTZhLCAweDAwNmZlMWI4LCAweGZmZjI1MjRjLAorICAgIDB4NTY5YWNmOTAsIDB4MDk5ZmRiMDQsIDB4ZjM1OTkyOWEsIDB4MDViNmNhNmIsIDB4ZmY5MTZmZTEsIDB4ZmYxYjg0OGUsIDB4MDA2ZWYzZGYsIDB4ZmZmMjJhZWEsCisgICAgMHg1NjRhMDYxMCwgMHgwOTBmN2Q1NywgMHhmMzgwYjhiYSwgMHgwNWJkY2ZiMiwgMHhmZjg0M2EzMiwgMHhmZjIxODY5MiwgMHgwMDZkZmU5NCwgMHhmZmYyMDZiZiwKKyAgICAweDU1ZjZmMmQzLCAweDA4ODA3NzlkLCAweGYzYTg4MTc5LCAweDA1YzQ0MDk1LCAweGZmNzczOWY3LCAweGZmMjc4NmUxLCAweDAwNmQwMjE3LCAweGZmZjFlNWJiLAorICAgIDB4NTVhMTlhNWMsIDB4MDdmMmNlOWIsIDB4ZjNkMGU3YzIsIDB4MDVjYTFlMWYsIDB4ZmY2YTZmYzEsIDB4ZmYyZDg0ZTUsIDB4MDA2YmZlYTQsIDB4ZmZmMWM3ZDAsCisgICAgMHg1NTRhMDE0OCwgMHgwNzY2ODZmYywgMHhmM2Y5ZTY4MCwgMHgwNWNmNjk2NSwgMHhmZjVkZGMxYSwgMHhmZjMzODAwZSwgMHgwMDZhZjQ3YiwgMHhmZmYxYWNlZiwKKyAgICAweDU0ZjAyYzU2LCAweDA2ZGJhNTUxLCAweGY0MjM3OGEwLCAweDA1ZDQyMzg3LCAweGZmNTE3Zjg2LCAweGZmMzk3N2NiLCAweDAwNjllM2Q5LCAweGZmZjE5NTA4LAorICAgIDB4NTQ5NDIwNjEsIDB4MDY1MjJlMGYsIDB4ZjQ0ZDk5MTIsIDB4MDVkODRkYWYsIDB4ZmY0NTVhODAsIDB4ZmYzZjZiOGYsIDB4MDA2OGNjZmEsIDB4ZmZmMTgwMGIsCisgICAgMHg1NDM1ZTI2MywgMHgwNWNhMjU4ZiwgMHhmNDc4NDJjNSwgMHgwNWRiZTkwZiwgMHhmZjM5NmQ3ZiwgMHhmZjQ1NWFjZiwgMHgwMDY3YjAxZSwgMHhmZmYxNmRlOSwKKyAgICAweDUzZDU3Nzc0LCAweDA1NDM5MDBkLCAweGY0YTM3MGFkLCAweDA1ZGVmNmU0LCAweGZmMmRiOGYyLCAweGZmNGI0NTAzLCAweDAwNjY4ZDgwLCAweGZmZjE1ZTkzLAorICAgIDB4NTM3MmU0YzYsIDB4MDRiZTcxYWIsIDB4ZjRjZjFkYmYsIDB4MDVlMTc4NzMsIDB4ZmYyMjNkNDAsIDB4ZmY1MTI5YTMsIDB4MDA2NTY1NWQsIDB4ZmZmMTUxZjksCisgICAgMHg1MzBlMmZhYywgMHgwNDNhY2U2ZSwgMHhmNGZiNDRmNCwgMHgwNWUzNmYwZCwgMHhmZjE2ZmFjYSwgMHhmZjU3MDgyZSwgMHgwMDY0MzdmMSwgMHhmZmYxNDgwYiwKKyAgICAweDUyYTc1ZDkwLCAweDAzYjhhYTQwLCAweGY1MjdlMTQ5LCAweDA1ZTRkYzA4LCAweGZmMGJmMWVkLCAweGZmNWNlMDIxLCAweDAwNjMwNTc3LCAweGZmZjE0MGI5LAorICAgIDB4NTIzZTczZmQsIDB4MDMzODA4ZWIsIDB4ZjU1NGVkYmQsIDB4MDVlNWMwYzYsIDB4ZmYwMTIyZmMsIDB4ZmY2MmIwZmQsIDB4MDA2MWNlMmMsIDB4ZmZmMTNiZjMsCisgICAgMHg1MWQzNzg5NywgMHgwMmI4ZWUyMiwgMHhmNTgyNjU1NSwgMHgwNWU2MWVhZSwgMHhmZWY2OGU0NSwgMHhmZjY4N2E0NywgMHgwMDYwOTI0OSwgMHhmZmYxMzlhYSwKKyAgICAweDUxNjY3MTFjLCAweDAyM2I1ZDc2LCAweGY1YjA0MzFhLCAweDA1ZTVmNzMzLCAweGZlZWMzNDBmLCAweGZmNmUzYjg0LCAweDAwNWY1MjBhLCAweGZmZjEzOWNkLAorICAgIDB4NTBmNzYzNjgsIDB4MDFiZjVhNWUsIDB4ZjVkZTgyMTgsIDB4MDVlNTRiY2QsIDB4ZmVlMjE0OWIsIDB4ZmY3M2Y0M2QsIDB4MDA1ZTBkYTgsIDB4ZmZmMTNjNGMsCisgICAgMHg1MDg2NTU2ZiwgMHgwMTQ0ZTgzNCwgMHhmNjBkMWQ2MywgMHgwNWU0MWRmZSwgMHhmZWQ4MzAyMywgMHhmZjc5YTNmZSwgMHgwMDVjYzU1YywgMHhmZmYxNDExOSwKKyAgICAweDUwMTM0ZDNlLCAweDAwY2MwYTM2LCAweGY2M2MxMDEyLCAweDA1ZTI2ZjRlLCAweGZlY2U4NmRiLCAweGZmN2Y0YTU0LCAweDAwNWI3OTYxLCAweGZmZjE0ODIxLAorICAgIDB4NGY5ZTUwZmYsIDB4MDA1NGMzODIsIDB4ZjY2YjU1NDQsIDB4MDVlMDQxNGQsIDB4ZmVjNTE4ZjEsIDB4ZmY4NGU2ZDAsIDB4MDA1YTI5ZWQsIDB4ZmZmMTUxNTYsCisgICAgMHg0ZjI3NjZmMiwgMHhmZmRmMTcxYiwgMHhmNjlhZTgxZCwgMHgwNWRkOTU5MywgMHhmZWJiZTY4YywgMHhmZjhhNzkwNSwgMHgwMDU4ZDczOCwgMHhmZmYxNWNhOCwKKyAgICAweDRlYWU5NTcxLCAweGZmNmIwN2U3LCAweGY2Y2FjM2M3LCAweDA1ZGE2ZGJlLCAweGZlYjJlZmNkLCAweGZmOTAwMDg5LCAweDAwNTc4MTdiLCAweGZmZjE2YTA3LAorICAgIDB4NGUzM2UyZWUsIDB4ZmVmODk4YWUsIDB4ZjZmYWUzNzMsIDB4MDVkNmNiNzIsIDB4ZmVhYTM0ZDAsIDB4ZmY5NTdjZjQsIDB4MDA1NjI4ZWMsIDB4ZmZmMTc5NjIsCisgICAgMHg0ZGI3NTVmMywgMHhmZTg3Y2MxYiwgMHhmNzJiNDI1YiwgMHgwNWQyYjA1YywgMHhmZWExYjVhOSwgMHhmZjlhZWRlMCwgMHgwMDU0Y2RjMCwgMHhmZmYxOGFhYiwKKyAgICAweDRkMzhmNTIwLCAweGZlMThhNGJjLCAweGY3NWJkYmJkLCAweDA1Y2UxZTJkLCAweGZlOTk3MjY4LCAweGZmYTA1MmVjLCAweDAwNTM3MDJkLCAweGZmZjE5ZGQxLAorICAgIDB4NGNiOGM3MmUsIDB4ZmRhYjI1MDEsIDB4Zjc4Y2FhZTAsIDB4MDVjOTE2OWQsIDB4ZmU5MTZiMTUsIDB4ZmZhNWFiYjgsIDB4MDA1MjEwNjgsIDB4ZmZmMWIyYzUsCisgICAgMHg0YzM2ZDJlYiwgMHhmZDNmNGYzZCwgMHhmN2JkYWIxNiwgMHgwNWMzOWI2YSwgMHhmZTg5OWZiMiwgMHhmZmFhZjdlNiwgMHgwMDUwYWVhNSwgMHhmZmYxYzk3NiwKKyAgICAweDRiYjMxZjNjLCAweGZjZDUyNWE1LCAweGY3ZWVkN2I0LCAweDA1YmRhZTU3LCAweGZlODIxMDNmLCAweGZmYjAzNzFjLCAweDAwNGY0YjE3LCAweGZmZjFlMWQ2LAorICAgIDB4NGIyZGIzMWEsIDB4ZmM2Y2FhNTMsIDB4ZjgyMDJjMWMsIDB4MDViNzUxMmUsIDB4ZmU3YWJjYjEsIDB4ZmZiNTY5MDIsIDB4MDA0ZGU1ZjEsIDB4ZmZmMWZiZDUsCisgICAgMHg0YWE2OTU5NCwgMHhmYzA1ZGY0MCwgMHhmODUxYTNiNiwgMHgwNWIwODViYywgMHhmZTczYTRmYiwgMHhmZmJhOGQ0NCwgMHgwMDRjN2Y2NiwgMHhmZmYyMTc2NCwKKyAgICAweDRhMWRjZGNlLCAweGZiYTBjNjRiLCAweGY4ODMzOWY1LCAweDA1YTk0ZGQ1LCAweGZlNmNjOTA5LCAweGZmYmZhMzhkLCAweDAwNGIxN2E2LCAweGZmZjIzNDczLAorICAgIDB4NDk5MzYyZmYsIDB4ZmIzZDYxMzMsIDB4ZjhiNGVhNTUsIDB4MDVhMWFiNTIsIDB4ZmU2NjI4YzEsIDB4ZmZjNGFiOGYsIDB4MDA0OWFlZTMsIDB4ZmZmMjUyZjMsCisgICAgMHg0OTA3NWM3MiwgMHhmYWRiYjE5YSwgMHhmOGU2YjA1OSwgMHgwNTk5YTAwZSwgMHhmZTVmYzQwNSwgMHhmZmM5YTRmYywgMHgwMDQ4NDU0YiwgMHhmZmYyNzJkNiwKKyAgICAweDQ4NzljMTg1LCAweGZhN2JiOTA4LCAweGY5MTg4NzkzLCAweDA1OTEyZGVhLCAweGZlNTk5YWFmLCAweGZmY2U4ZjhhLCAweDAwNDZkYjBmLCAweGZmZjI5NDBiLAorICAgIDB4NDdlYTk5YTksIDB4ZmExZDc4ZTMsIDB4Zjk0YTZiOWIsIDB4MDU4ODU2Y2QsIDB4ZmU1M2FjOTcsIDB4ZmZkMzZhZjEsIDB4MDA0NTcwNWMsIDB4ZmZmMmI2ODYsCisgICAgMHg0NzU5ZWM2MCwgMHhmOWMwZjI3NiwgMHhmOTdjNTgxNSwgMHgwNTdmMWM5ZSwgMHhmZTRkZjk4ZSwgMHhmZmQ4MzZlYiwgMHgwMDQ0MDU2MSwgMHhmZmYyZGEzNiwKKyAgICAweDQ2YzdjMTQwLCAweGY5NjYyNmYwLCAweGY5YWU0OGFmLCAweDA1NzU4MTRjLCAweGZlNDg4MTVlLCAweGZmZGNmMzM2LCAweDAwNDI5YTRhLCAweGZmZjJmZjBkLAorICAgIDB4NDYzNDFmZWQsIDB4ZjkwZDE3NjEsIDB4ZjllMDM5MjQsIDB4MDU2Yjg2YzYsIDB4ZmU0MzQzZDAsIDB4ZmZlMTlmOTEsIDB4MDA0MTJmNDMsIDB4ZmZmMzI0ZmQsCisgICAgMHg0NTlmMTAxZCwgMHhmOGI1YzRiZSwgMHhmYTEyMjUzNywgMHgwNTYxMmYwMCwgMHhmZTNlNDBhNiwgMHhmZmU2M2JjMCwgMHgwMDNmYzQ3OCwgMHhmZmYzNGJmOSwKKyAgICAweDQ1MDg5OTk2LCAweGY4NjAyZmRjLCAweGZhNDQwOGJhLCAweDA1NTY3YmYxLCAweGZlMzk3NzlhLCAweGZmZWFjNzg3LCAweDAwM2U1YTEyLCAweGZmZjM3M2YwLAorICAgIDB4NDQ3MGM0MmQsIDB4ZjgwYzU5NzcsIDB4ZmE3NWRmODcsIDB4MDU0YjZmOTIsIDB4ZmUzNGU4NjcsIDB4ZmZlZjQyYWYsIDB4MDAzY2YwM2QsIDB4ZmZmMzljZDcsCisgICAgMHg0M2Q3OTdjNywgMHhmN2JhNDIyYiwgMHhmYWE3YTU4NiwgMHgwNTQwMGJlMSwgMHhmZTMwOTJiZiwgMHhmZmYzYWQwMSwgMHgwMDNiODcxZiwgMHhmZmYzYzY5ZiwKKyAgICAweDQzM2QxYzU2LCAweGY3NjllYTc4LCAweGZhZDk1NmFiLCAweDA1MzQ1MmRjLCAweGZlMmM3NjUwLCAweGZmZjgwNjRiLCAweDAwM2ExZWUzLCAweGZmZjNmMTNhLAorICAgIDB4NDJhMTU5ZGMsIDB4ZjcxYjUyYzQsIDB4ZmIwYWVlZjYsIDB4MDUyODQ2ODUsIDB4ZmUyODkyYzUsIDB4ZmZmYzRlNWMsIDB4MDAzOGI3YWUsIDB4ZmZmNDFjOWMsCisgICAgMHg0MjA0NTg2NSwgMHhmNmNlN2I1NywgMHhmYjNjNmE3MywgMHgwNTFiZThkZCwgMHhmZTI0ZTdjMywgMHgwMDAwODUwNywgMHgwMDM3NTFhNywgMHhmZmY0NDhiNywKKyAgICAweDQxNjYyMDBlLCAweGY2ODM2NDVhLCAweGZiNmRjNTNjLCAweDA1MGYzYmVjLCAweGZlMjE3NGVjLCAweDAwMDRhYTFmLCAweDAwMzVlY2Y0LCAweGZmZjQ3NTdlLAorICAgIDB4NDBjNmI4ZmQsIDB4ZjYzYTBkZGYsIDB4ZmI5ZWZiNzcsIDB4MDUwMjQxYjYsIDB4ZmUxZTM5ZGEsIDB4MDAwOGJkN2MsIDB4MDAzNDg5YjksIDB4ZmZmNGEyZTUsCisgICAgMHg0MDI2MmI2NSwgMHhmNWYyNzdkOSwgMHhmYmQwMDk1NiwgMHgwNGY0ZmM0NiwgMHhmZTFiMzYyOCwgMHgwMDBjYmVmNywgMHgwMDMzMjgxYSwgMHhmZmY0ZDBkZSwKKyAgICAweDNmODQ3ZjgzLCAweGY1YWNhMjFmLCAweGZjMDBlYjFiLCAweDA0ZTc2ZGEzLCAweGZlMTg2OTZhLCAweDAwMTBhZTZlLCAweDAwMzFjODNhLCAweGZmZjRmZjVkLAorICAgIDB4M2VlMWJkYTIsIDB4ZjU2ODhjNmQsIDB4ZmMzMTlkMTMsIDB4MDRkOTk3ZDgsIDB4ZmUxNWQzMmYsIDB4MDAxNDhiYmQsIDB4MDAzMDZhM2IsIDB4ZmZmNTJlNTcsCisgICAgMHgzZTNkZWUxMywgMHhmNTI2MzY2NSwgMHhmYzYyMWI5YSwgMHgwNGNiN2NmMiwgMHhmZTEzNzMwNCwgMHgwMDE4NTZjNywgMHgwMDJmMGUzZiwgMHhmZmY1NWRiZiwKKyAgICAweDNkOTkxOTMyLCAweGY0ZTU5ZjhhLCAweGZjOTI2MzE5LCAweDA0YmQxZWZiLCAweGZlMTE0ODcyLCAweDAwMWMwZjZlLCAweDAwMmRiNDY2LCAweGZmZjU4ZDg5LAorICAgIDB4M2NmMzQ3NjYsIDB4ZjRhNmM3NDgsIDB4ZmNjMjcwMDgsIDB4MDRhZTgwMDAsIDB4ZmUwZjUyZmMsIDB4MDAxZmI1OTksIDB4MDAyYzVjZDAsIDB4ZmZmNWJkYWEsCisgICAgMHgzYzRjODExYywgMHhmNDY5YWNlZCwgMHhmY2YyM2VlYywgMHgwNDlmYTIwZiwgMHhmZTBkOTIyNCwgMHgwMDIzNDkyZiwgMHgwMDJiMDc5YSwgMHhmZmY1ZWUxNywKKyAgICAweDNiYTRjZWM5LCAweGY0MmU0ZmFmLCAweGZkMjFjYzU5LCAweDA0OTA4NzMzLCAweGZlMGMwNTY3LCAweDAwMjZjYTFjLCAweDAwMjliNGU0LCAweGZmZjYxZWM1LAorICAgIDB4M2FmYzM4ZWIsIDB4ZjNmNGFlYTYsIDB4ZmQ1MTE0ZjAsIDB4MDQ4MTMxN2EsIDB4ZmUwYWFjM2YsIDB4MDAyYTM4NGMsIDB4MDAyODY0YzksIDB4ZmZmNjRmYTgsCisgICAgMHgzYTUyYzgwNSwgMHhmM2JjYzhkMywgMHhmZDgwMTU2NCwgMHgwNDcxYTJlZiwgMHhmZTA5ODYyMiwgMHgwMDJkOTNhZSwgMHgwMDI3MTc2NiwgMHhmZmY2ODBiNSwKKyAgICAweDM5YTg4NGExLCAweGYzODY5ZDFhLCAweGZkYWVjYTczLCAweDA0NjFkZGEwLCAweGZlMDg5MjgzLCAweDAwMzBkYzM0LCAweDAwMjVjY2Q3LCAweGZmZjZiMWU0LAorICAgIDB4MzhmZDc3NGUsIDB4ZjM1MjJhNDksIDB4ZmRkZDMwZWIsIDB4MDQ1MWUzOTYsIDB4ZmUwN2QwZDMsIDB4MDAzNDExZDIsIDB4MDAyNDg1MzUsIDB4ZmZmNmUzMjksCisgICAgMHgzODUxYThhMiwgMHhmMzFmNmYwZiwgMHhmZTBiNDVhYSwgMHgwNDQxYjZkZCwgMHhmZTA3NDA3ZCwgMHgwMDM3MzQ3ZCwgMHgwMDIzNDA5YSwgMHhmZmY3MTQ3YSwKKyAgICAweDM3YTUyMTM1LCAweGYyZWU2YTA3LCAweGZlMzkwNTliLCAweDA0MzE1OTdkLCAweGZlMDZlMGViLCAweDAwM2E0NDJlLCAweDAwMjFmZjFmLCAweGZmZjc0NWNkLAorICAgIDB4MzZmN2U5YTQsIDB4ZjJiZjE5YWUsIDB4ZmU2NjZkYmMsIDB4MDQyMGNkODAsIDB4ZmUwNmIxODQsIDB4MDAzZDQwZTAsIDB4MDAyMGMwZGMsIDB4ZmZmNzc3MWEsCisgICAgMHgzNjRhMGE5MCwgMHhmMjkxN2M2ZCwgMHhmZTkzN2IxNSwgMHgwNDEwMTRlYiwgMHhmZTA2YjFhYywgMHgwMDQwMmE4ZSwgMHgwMDFmODVlNiwgMHhmZmY3YTg1NywKKyAgICAweDM1OWI4YzlkLCAweGYyNjU5MDhmLCAweGZlYzAyYWMyLCAweDAzZmYzMWMzLCAweGZlMDZlMGM0LCAweDAwNDMwMTM3LCAweDAwMWU0ZTU2LCAweGZmZjdkOTdhLAorICAgIDB4MzRlYzc4NmYsIDB4ZjIzYjU0NGIsIDB4ZmVlYzc5ZWMsIDB4MDNlZTI2MGQsIDB4ZmUwNzNlMmEsIDB4MDA0NWM0ZGQsIDB4MDAxZDFhM2YsIDB4ZmZmODBhN2MsCisgICAgMHgzNDNjZDZhZiwgMHhmMjEyYzViZSwgMHhmZjE4NjVjZCwgMHgwM2RjZjNjYSwgMHhmZTA3YzkzYSwgMHgwMDQ4NzU4MiwgMHgwMDFiZTliNywgMHhmZmY4M2I1MiwKKyAgICAweDMzOGNiMDA0LCAweGYxZWJlMmVjLCAweGZmNDNlYmFjLCAweDAzY2I5Y2Y5LCAweGZlMDg4MTRlLCAweDAwNGIxMzJiLCAweDAwMWFiY2QwLCAweGZmZjg2YmY2LAorICAgIDB4MzJkYzBkMTcsIDB4ZjFjNmE5YzMsIDB4ZmY2ZjA4ZTQsIDB4MDNiYTIzOTgsIDB4ZmUwOTY1YmMsIDB4MDA0ZDlkZGUsIDB4MDAxOTkzOWQsIDB4ZmZmODljNjAsCisgICAgMHgzMjJhZjY5MywgMHhmMWEzMTgxYSwgMHhmZjk5YmFkYiwgMHgwM2E4ODlhMSwgMHhmZTBhNzVkYSwgMHgwMDUwMTVhNSwgMHgwMDE4NmUzMSwgMHhmZmY4Y2M4NiwKKyAgICAweDMxNzk3NTFmLCAweGYxODEyYmIwLCAweGZmYzNmZjBjLCAweDAzOTZkMTBjLCAweGZlMGJiMGY5LCAweDAwNTI3YThhLCAweDAwMTc0YzljLCAweGZmZjhmYzYyLAorICAgIDB4MzBjNzkxNjMsIDB4ZjE2MGUyMmQsIDB4ZmZlZGQyZmQsIDB4MDM4NGZiZDEsIDB4ZmUwZDE2NmIsIDB4MDA1NGNjOWEsIDB4MDAxNjJlZWYsIDB4ZmZmOTJiZWMsCisgICAgMHgzMDE1NTQwNCwgMHhmMTQyMzkyNCwgMHgwMDE3MzQ0NywgMHgwMzczMGJlMCwgMHhmZTBlYTU3ZSwgMHgwMDU3MGJlNCwgMHgwMDE1MTUzOCwgMHhmZmY5NWIxZSwKKyAgICAweDJmNjJjNWE3LCAweGYxMjUyZTBmLCAweDAwNDAyMDkyLCAweDAzNjEwMzJhLCAweGZlMTA1ZDdlLCAweDAwNTkzODc3LCAweDAwMTNmZjg4LCAweGZmZjk4OWVmLAorICAgIDB4MmVhZmVlZWQsIDB4ZjEwOWJlNTYsIDB4MDA2ODk1OTgsIDB4MDM0ZWUzOWIsIDB4ZmUxMjNkYjYsIDB4MDA1YjUyNjcsIDB4MDAxMmVkZWEsIDB4ZmZmOWI4NWIsCisgICAgMHgyZGZjZDg3MywgMHhmMGVmZTc0OCwgMHgwMDkwOTExZiwgMHgwMzNjYWYxZCwgMHhmZTE0NDU3MCwgMHgwMDVkNTljNiwgMHgwMDExZTA2ZCwgMHhmZmY5ZTY1YSwKKyAgICAweDJkNDk4YWQzLCAweGYwZDdhNjIyLCAweDAwYjgxMTAyLCAweDAzMmE2Nzk2LCAweGZlMTY3M2YyLCAweDAwNWY0ZWFjLCAweDAwMTBkNzFkLCAweGZmZmExM2U1LAorICAgIDB4MmM5NjBlYTMsIDB4ZjBjMGY4MDgsIDB4MDBkZjEzMjgsIDB4MDMxODBlZTcsIDB4ZmUxOGM4ODQsIDB4MDA2MTMxMmUsIDB4MDAwZmQyMDUsIDB4ZmZmYTQwZjgsCisgICAgMHgyYmUyNmM3MywgMHhmMGFiZGEwZSwgMHgwMTA1OTU4YywgMHgwMzA1YTZmMCwgMHhmZTFiNDI2OCwgMHgwMDYzMDE2NywgMHgwMDBlZDEzMCwgMHhmZmZhNmQ4ZCwKKyAgICAweDJiMmVhY2NmLCAweGYwOTg0OTMxLCAweDAxMmI5NjM1LCAweDAyZjMzMThhLCAweGZlMWRlMGUyLCAweDAwNjRiZjcxLCAweDAwMGRkNGE3LCAweGZmZmE5OTlkLAorICAgIDB4MmE3YWQ4M2MsIDB4ZjA4NjQyNWEsIDB4MDE1MTEzM2UsIDB4MDJlMGIwOGQsIDB4ZmUyMGEzMzUsIDB4MDA2NjZiNjgsIDB4MDAwY2RjNzQsIDB4ZmZmYWM1MjUsCisgICAgMHgyOWM2ZjczOCwgMHhmMDc1YzI2MCwgMHgwMTc2MGFkMSwgMHgwMmNlMjVjYSwgMHhmZTIzODhhMSwgMHgwMDY4MDU2YiwgMHgwMDBiZTg5ZiwgMHhmZmZhZjAxZSwKKyAgICAweDI5MTMxMjNjLCAweGYwNjZjNjA2LCAweDAxOWE3YjI3LCAweDAyYmI5MzEwLCAweGZlMjY5MDY1LCAweDAwNjk4ZDk4LCAweDAwMGFmOTMxLCAweGZmZmIxYTg0LAorICAgIDB4Mjg1ZjMxYjcsIDB4ZjA1OTQ5ZmIsIDB4MDFiZTYyOGMsIDB4MDJhOGZhMmEsIDB4ZmUyOWI5YzEsIDB4MDA2YjA0MTEsIDB4MDAwYTBlMmYsIDB4ZmZmYjQ0NTMsCisgICAgMHgyN2FiNWUxMiwgMHhmMDRkNGFkZSwgMHgwMWUxYmY1OCwgMHgwMjk2NWNkYiwgMHhmZTJkMDNmMiwgMHgwMDZjNjhmOCwgMHgwMDA5MjdhMCwgMHhmZmZiNmQ4NiwKKyAgICAweDI2Zjc5ZmFiLCAweGYwNDJjNTM5LCAweDAyMDQ4ZmY4LCAweDAyODNiY2U2LCAweGZlMzA2ZTM1LCAweDAwNmRiYzcxLCAweDAwMDg0NTg5LCAweGZmZmI5NjFhLAorICAgIDB4MjY0M2ZlZGEsIDB4ZjAzOWI1ODcsIDB4MDIyNmQyZTYsIDB4MDI3MTFjMDUsIDB4ZmUzM2Y3YzcsIDB4MDA2ZWZlYTAsIDB4MDAwNzY3ZjAsIDB4ZmZmYmJlMDksCisgICAgMHgyNTkwODNlYiwgMHhmMDMyMTgyZiwgMHgwMjQ4ODZhZCwgMHgwMjVlN2JmMCwgMHhmZTM3OWZlMywgMHgwMDcwMmZhZSwgMHgwMDA2OGVkOCwgMHhmZmZiZTU1MiwKKyAgICAweDI0ZGQzNzIxLCAweGYwMmJlOThhLCAweDAyNjlhOWU5LCAweDAyNGJkZTVhLCAweGZlM2I2NWM0LCAweDAwNzE0ZmMwLCAweDAwMDViYTQ2LCAweGZmZmMwYmVmLAorICAgIDB4MjQyYTIwYjMsIDB4ZjAyNzI1ZGMsIDB4MDI4YTNiNDQsIDB4MDIzOTQ0ZWUsIDB4ZmUzZjQ4YTUsIDB4MDA3MjVmMDIsIDB4MDAwNGVhM2EsIDB4ZmZmYzMxZGYsCisgICAgMHgyMzc3NDhjZiwgMHhmMDIzYzk1ZCwgMHgwMmFhMzk3YiwgMHgwMjI2YjE1NiwgMHhmZTQzNDdjMCwgMHgwMDczNWQ5YywgMHgwMDA0MWViOSwgMHhmZmZjNTcxZSwKKyAgICAweDIyYzRiNzk1LCAweGYwMjFkMDMxLCAweDAyYzlhMzU5LCAweDAyMTQyNTMzLCAweGZlNDc2MjUwLCAweDAwNzQ0YmJhLCAweDAwMDM1N2MyLCAweGZmZmM3YmE5LAorICAgIDB4MjIxMjc1MWEsIDB4ZjAyMTM2NzEsIDB4MDJlODc3YjksIDB4MDIwMWEyMjMsIDB4ZmU0Yjk3OGUsIDB4MDA3NTI5OGEsIDB4MDAwMjk1NTgsIDB4ZmZmYzlmN2UsCisgICAgMHgyMTYwODk2OCwgMHhmMDIxZjgyMywgMHgwMzA2YjU4NiwgMHgwMWVmMjliZSwgMHhmZTRmZTZiMywgMHgwMDc1ZjczOSwgMHgwMDAxZDc3OSwgMHhmZmZjYzI5YSwKKyAgICAweDIwYWVmYzc5LCAweGYwMjQxMTQwLCAweDAzMjQ1YmJjLCAweDAxZGNiZDk2LCAweGZlNTQ0ZWZiLCAweDAwNzZiNGY1LCAweDAwMDExZTI2LCAweGZmZmNlNGZjLAorICAgIDB4MWZmZGQ2M2IsIDB4ZjAyNzdkYjEsIDB4MDM0MTY5NjYsIDB4MDFjYTVmMzcsIDB4ZmU1OGNmOWQsIDB4MDA3NzYyZjAsIDB4MDAwMDY5NWUsIDB4ZmZmZDA2YTEsCisgICAgMHgxZjRkMWU4ZSwgMHhmMDJjMzk1MywgMHgwMzVkZGQ5ZSwgMHgwMWI4MTAyOCwgMHhmZTVkNjdkNCwgMHgwMDc4MDE1YSwgMHhmZmZmYjkxZiwgMHhmZmZkMjc4NywKKyAgICAweDFlOWNkZDQzLCAweGYwMzIzZmY1LCAweDAzNzliNzkwLCAweDAxYTVkMWVhLCAweGZlNjIxNmRiLCAweDAwNzg5MDY1LCAweGZmZmYwZDY2LCAweGZmZmQ0N2FlLAorICAgIDB4MWRlZDFhMWQsIDB4ZjAzOThkNTYsIDB4MDM5NGY2NzQsIDB4MDE5M2E1ZjksIDB4ZmU2NmRiZWIsIDB4MDA3OTEwNDMsIDB4ZmZmZTY2MzEsIDB4ZmZmZDY3MTMsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jVXAuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1Jlc2FtcGxlclNpbmNVcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNTM2N2UKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9SZXNhbXBsZXJTaW5jVXAuaApAQCAtMCwwICsxLDEzMSBAQAorLy8gY21kLWxpbmU6IGZpciAtbCA3IC1zNDgwMDAgLWMgMjA0NzgKKworICAgIDB4NmQzNzRiYzcsIDB4MTExYzZiYTAsIDB4ZjMyNDBlNjEsIDB4MDdkMTRhMzgsIDB4ZmM1MDllNjQsIDB4MDEzOWNlZTksIDB4ZmZjOGM4NjYsIDB4ZmZmY2MzMDAsCisgICAgMHg2ZDM1Mjc4YSwgMHgxMDNlODE5MiwgMHhmMzZiOWRmZCwgMHgwN2JkZmFhNSwgMHhmYzUxMDJkMCwgMHgwMTNkNjE4ZCwgMHhmZmM2NjNiOSwgMHhmZmZkOTU5MiwKKyAgICAweDZkMmViYWZlLCAweDBmNjI4MTFhLCAweGYzYjNkOGFjLCAweDA3YTlmMzk5LCAweGZjNTFkOWE2LCAweDAxNDBiZWE1LCAweGZmYzQxMjEyLCAweGZmZmU2MzFlLAorICAgIDB4NmQyNDA2OWQsIDB4MGU4ODc1YWQsIDB4ZjNmY2I0M2UsIDB4MDc5NTM5NzYsIDB4ZmM1MzIxNmYsIDB4MDE0M2U2N2MsIDB4ZmZjMWQzNzMsIDB4ZmZmZjJiOWYsCisgICAgMHg2ZDE1MGIzNSwgMHgwZGIwNmE4OSwgMHhmNDQ2MjY5MCwgMHgwNzdmZDBhYywgMHhmYzU0ZDhhZSwgMHgwMTQ2ZDk2NSwgMHhmZmJmYTdkOSwgMHhmZmZmZWYxMCwKKyAgICAweDZkMDFjOWUzLCAweDBjZGE2YWI1LCAweGY0OTAyNTg3LCAweDA3NjliZGFmLCAweGZjNTZmZGRhLCAweDAxNDk5N2JiLCAweGZmYmQ4ZjQwLCAweDAwMDBhZDZlLAorICAgIDB4NmNlYTQ0MTgsIDB4MGMwNjgwZmUsIDB4ZjRkYWE3MTgsIDB4MDc1MzA1MDEsIDB4ZmM1OThmNjAsIDB4MDE0YzIxZGIsIDB4ZmZiYjg5YTEsIDB4MDAwMTY2YjYsCisgICAgMHg2Y2NlN2I5NywgMHgwYjM0YjdmNSwgMHhmNTI1YTE0MywgMHgwNzNiYWIyOCwgMHhmYzVjOGJhNSwgMHgwMTRlNzgyYSwgMHhmZmI5OTZmMywgMHgwMDAyMWFlNSwKKyAgICAweDZjYWU3MjcyLCAweDBhNjUxOWY0LCAweGY1NzEwYTE3LCAweDA3MjNiNGI0LCAweGZjNWZmMTA1LCAweDAxNTA5YjE0LCAweGZmYjdiNzI4LCAweDAwMDJjOWZkLAorICAgIDB4NmM4YTJiMGYsIDB4MDk5N2IxMTYsIDB4ZjViY2Q3YjEsIDB4MDcwYjI2MzksIDB4ZmM2M2JkZDMsIDB4MDE1MjhiMDgsIDB4ZmZiNWVhMzEsIDB4MDAwMzczZmIsCisgICAgMHg2YzYxYTgyMywgMHgwOGNjODczYywgMHhmNjA5MDAzZiwgMHgwNmYyMDQ1MywgMHhmYzY3ZjA1YSwgMHgwMTU0NDg3YiwgMHhmZmI0MmZmYywgMHgwMDA0MThlMiwKKyAgICAweDZjMzRlY2I1LCAweDA4MDNhNjBhLCAweGY2NTU3YTAwLCAweDA2ZDg1M2EyLCAweGZjNmM4NmRkLCAweDAxNTVkM2U4LCAweGZmYjI4ODc2LCAweDAwMDRiOGIzLAorICAgIDB4NmMwM2ZjMWMsIDB4MDczZDE2ZTcsIDB4ZjZhMjNiNDQsIDB4MDZiZTE4Y2QsIDB4ZmM3MTdmOTcsIDB4MDE1NzJkY2YsIDB4ZmZiMGYzODgsIDB4MDAwNTUzNzEsCisgICAgMHg2YmNlZDlmZiwgMHgwNjc4ZTJmYywgMHhmNmVmM2E2ZSwgMHgwNmEzNTg3ZSwgMHhmYzc2ZDhiYywgMHgwMTU4NTZiNiwgMHhmZmFmNzExOCwgMHgwMDA1ZTkyMSwKKyAgICAweDZiOTU4YTU0LCAweDA1YjcxMzMyLCAweGY3M2M2ZGY0LCAweDA2ODgxNzYxLCAweGZjN2M5MDc5LCAweDAxNTk0ZjI1LCAweGZmYWUwMTBiLCAweDAwMDY3OWM1LAorICAgIDB4NmI1ODExNjMsIDB4MDRmN2IwMzcsIDB4Zjc4OWNjNjEsIDB4MDY2YzVhMjcsIDB4ZmM4MmE0ZjQsIDB4MDE1YTE3YWIsIDB4ZmZhY2EzNDQsIDB4MDAwNzA1NjQsCisgICAgMHg2YjE2NzNjMSwgMHgwNDNhYzI3NiwgMHhmN2Q3NGM1MywgMHgwNjUwMjU4MywgMHhmYzg5MTQ0ZCwgMHgwMTVhYjBkYiwgMHhmZmFiNTdhMSwgMHgwMDA3OGMwNCwKKyAgICAweDZhZDBiNjUyLCAweDAzODA1MjFjLCAweGY4MjRlNDgwLCAweDA2MzM3ZTJhLCAweGZjOGZkYzlmLCAweDAxNWIxYjRlLCAweGZmYWExZTAyLCAweDAwMDgwZGFiLAorICAgIDB4NmE4NmRlNDgsIDB4MDJjODY3MTUsIDB4Zjg3MjhiYjMsIDB4MDYxNjY4ZDIsIDB4ZmM5NmZiZmMsIDB4MDE1YjU3OWUsIDB4ZmZhOGY2NDEsIDB4MDAwODhhNjIsCisgICAgMHg2YTM4ZjEyMywgMHgwMjEzMDkwYywgMHhmOGMwMzhkMCwgMHgwNWY4ZWEzMCwgMHhmYzllNzA3NCwgMHgwMTViNjY2YywgMHhmZmE3ZTAzOSwgMHgwMDA5MDIzMCwKKyAgICAweDY5ZTZmNGIxLCAweDAxNjAzZjZlLCAweGY5MGRlMmQxLCAweDA1ZGIwNmZjLCAweGZjYTYzODEwLCAweDAxNWI0ODViLCAweGZmYTZkYmMwLCAweDAwMDk3NTFlLAorICAgIDB4Njk5MGVmMGIsIDB4MDBiMDExNjIsIDB4Zjk1YjgwY2IsIDB4MDViY2MzZWQsIDB4ZmNhZTUwZDYsIDB4MDE1YWZlMTQsIDB4ZmZhNWU4YWQsIDB4MDAwOWUzMzcsCisgICAgMHg2OTM2ZTY5NywgMHgwMDAyODVkMCwgMHhmOWE5MDllYSwgMHgwNTllMjViNSwgMHhmY2I2YjhjNCwgMHgwMTVhODg0MywgMHhmZmE1MDZkMiwgMHgwMDBhNGM4NSwKKyAgICAweDY4ZDhlMjA2LCAweGZmNTdhMzVlLCAweGY5ZjY3NTc3LCAweDA1N2YzMTBhLCAweGZjYmY2ZGQ4LCAweDAxNTllNzk2LCAweGZmYTQzNjAzLCAweDAwMGFiMTEyLAorICAgIDB4Njg3NmU4NTUsIDB4ZmVhZjcwNmYsIDB4ZmE0M2JhZDIsIDB4MDU1ZmVhOWQsIDB4ZmNjODZlMDksIDB4MDE1OTFjYzAsIDB4ZmZhMzc2MGUsIDB4MDAwYjEwZWMsCisgICAgMHg2ODExMDBjOSwgMHhmZTA5ZjMyMywgMHhmYTkwZDE3YiwgMHgwNTQwNTcxYSwgMHhmY2QxYjc0YywgMHgwMTU4Mjg3OCwgMHhmZmEyYzZjMiwgMHgwMDBiNmMxZCwKKyAgICAweDY3YTczMmY0LCAweGZkNjczMTU5LCAweGZhZGRiMTBjLCAweDA1MjA3YjJmLCAweGZjZGI0NzkzLCAweDAxNTcwYjc3LCAweGZmYTIyN2VjLCAweDAwMGJjMmIzLAorICAgIDB4NjczOTg2YWMsIDB4ZmNjNzMwYWEsIDB4ZmIyYTUxM2IsIDB4MDUwMDViODIsIDB4ZmNlNTFjY2IsIDB4MDE1NWM2NzgsIDB4ZmZhMTk5NTcsIDB4MDAwYzE0YmIsCisgICAgMHg2NmM4MDQxMywgMHhmYzI5ZjY3MCwgMHhmYjc2YTlkZCwgMHgwNGRmZmNiNiwgMHhmY2VmMzRlMSwgMHgwMTU0NWEzYywgMHhmZmExMWFjYiwgMHgwMDBjNjI0NCwKKyAgICAweDY2NTJiMzkyLCAweGZiOGY4N2JkLCAweGZiYzJiMmU0LCAweDA0YmY2MzY5LCAweGZjZjk4ZGJlLCAweDAxNTJjNzgzLCAweGZmYTBhYzExLCAweDAwMGNhYjVjLAorICAgIDB4NjVkOTlkZDUsIDB4ZmFmN2U5NjMsIDB4ZmMwZTY0NjEsIDB4MDQ5ZTk0MzMsIDB4ZmQwNDI1NGEsIDB4MDE1MTBmMTMsIDB4ZmZhMDRjZjAsIDB4MDAwY2YwMTIsCisgICAgMHg2NTVjY2JkMywgMHhmYTYzMWZlZiwgMHhmYzU5YjY4NSwgMHgwNDdkOTNhOCwgMHhmZDBlZjk2OSwgMHgwMTRmMzFiMiwgMHhmZjlmZmQyYywgMHgwMDBkMzA3NSwKKyAgICAweDY0ZGM0NmMzLCAweGY5ZDEyZmFiLCAweGZjYTRhMTlmLCAweDA0NWM2NjU0LCAweGZkMWEwODAxLCAweDAxNGQzMDI5LCAweGZmOWZiYzg5LCAweDAwMGQ2Yzk3LAorICAgIDB4NjQ1ODE4MjMsIDB4Zjk0MjFjOWQsIDB4ZmNlZjFlMjAsIDB4MDQzYjEwYmQsIDB4ZmQyNTRlZjQsIDB4MDE0YjBiNDUsIDB4ZmY5ZjhhYzksIDB4MDAwZGE0ODYsCisgICAgMHg2M2QwNDliNCwgMHhmOGI1ZWE4NywgMHhmZDM5MjQ5OCwgMHgwNDE5OTc2MCwgMHhmZDMwY2MyNCwgMHgwMTQ4YzNkMiwgMHhmZjlmNjdhZSwgMHgwMDBkZDg1NCwKKyAgICAweDYzNDRlNTc4LCAweGY4MmM5Y2U3LCAweGZkODJhZGJhLCAweDAzZjdmZWI0LCAweGZkM2M3ZDczLCAweDAxNDY1YTlmLCAweGZmOWY1MmY3LCAweDAwMGUwODEyLAorICAgIDB4NjJiNWY1YjIsIDB4ZjdhNjM2ZmEsIDB4ZmRjYmIyNWEsIDB4MDNkNjRiMjcsIDB4ZmQ0ODYwYzIsIDB4MDE0M2QwN2YsIDB4ZmY5ZjRjNjUsIDB4MDAwZTMzZDMsCisgICAgMHg2MjIzODRlOCwgMHhmNzIyYmJiNSwgMHhmZTE0MmI2ZSwgMHgwM2I0ODExZCwgMHhmZDU0NzNmMywgMHgwMTQxMjY0MywgMHhmZjlmNTNiNCwgMHgwMDBlNWJhNywKKyAgICAweDYxOGQ5ZGRjLCAweGY2YTIyZGNmLCAweGZlNWMxMjBmLCAweDAzOTJhNGY0LCAweGZkNjBiNGU3LCAweDAxM2U1Y2MwLCAweGZmOWY2OGExLCAweDAwMGU3ZmExLAorICAgIDB4NjBmNDRiOTEsIDB4ZjYyNDhmYjYsIDB4ZmVhMzVmNzksIDB4MDM3MGJhZmMsIDB4ZmQ2ZDIxODAsIDB4MDEzYjc0Y2EsIDB4ZmY5ZjhhZTksIDB4MDAwZTlmZDUsCisgICAgMHg2MDU3OTk0NywgMHhmNWE5ZTM5OCwgMHhmZWVhMGQwYywgMHgwMzRlYzc3ZiwgMHhmZDc5YjdhMSwgMHgwMTM4NmYzYSwgMHhmZjlmYmE0NywgMHgwMDBlYmM1NCwKKyAgICAweDVmYjc5Mjc4LCAweGY1MzIyYjYxLCAweGZmMzAxNDRhLCAweDAzMmNjZWJiLCAweGZkODY3NTJlLCAweDAxMzU0Y2U3LCAweGZmOWZmNjc0LCAweDAwMGVkNTMzLAorICAgIDB4NWYxNDQyZGMsIDB4ZjRiZDY4YjYsIDB4ZmY3NTZlZGMsIDB4MDMwYWQ0ZTEsIDB4ZmQ5MzU4MGQsIDB4MDEzMjBlYTksIDB4ZmZhMDNmMmIsIDB4MDAwZWVhODQsCisgICAgMHg1ZTZkYjY2NSwgMHhmNDRiOWNmZSwgMHhmZmJhMTY4ZCwgMHgwMmU4ZGUxOSwgMHhmZGEwNWUyMywgMHgwMTJlYjU1YSwgMHhmZmEwOTQyNSwgMHgwMDBlZmM1YywKKyAgICAweDVkYzNmOTNjLCAweGYzZGNjOTU5LCAweGZmZmUwNTRlLCAweDAyYzZlZTdmLCAweGZkYWQ4NTViLCAweDAxMmI0MWQzLCAweGZmYTBmNTE5LCAweDAwMGYwYWNlLAorICAgIDB4NWQxNzE3YzQsIDB4ZjM3MGVlYTksIDB4MDA0MTM1MzYsIDB4MDJhNTBhMjIsIDB4ZmRiYWNiOWUsIDB4MDEyN2I0ZjEsIDB4ZmZhMTYxYmYsIDB4MDAwZjE1ZWYsCisgICAgMHg1YzY3MWU5NiwgMHhmMzA4MGQ4YywgMHgwMDgzYTA4MSwgMHgwMjgzMzUwNiwgMHhmZGM4MmVkYiwgMHgwMTI0MGY4ZSwgMHhmZmExZDljZiwgMHgwMDBmMWRkMiwKKyAgICAweDViYjQxYTgwLCAweGYyYTIyNjVlLCAweDAwYzU0MTkwLCAweDAyNjE3MzIxLCAweGZkZDVhZDAxLCAweDAxMjA1Mjg1LCAweGZmYTI1Y2ZlLCAweDAwMGYyMjhkLAorICAgIDB4NWFmZTE4ODYsIDB4ZjIzZjM5M2IsIDB4MDEwNjEyZWIsIDB4MDIzZmM4NWMsIDB4ZmRlMzQ0MDMsIDB4MDExYzdlYjIsIDB4ZmZhMmViMDQsIDB4MDAwZjI0MzQsCisgICAgMHg1YTQ1MjVkZiwgMHhmMWRmNDVmZCwgMHgwMTQ2MGY0MSwgMHgwMjFlMzg5MSwgMHhmZGYwZjFkNiwgMHgwMTE4OTRmMCwgMHhmZmEzODM5NSwgMHgwMDBmMjJkYywKKyAgICAweDU5ODk0ZmYzLCAweGYxODI0YzNlLCAweDAxODUzMTY1LCAweDAxZmNjNzhmLCAweGZkZmViNDc1LCAweDAxMTQ5NjFiLCAweGZmYTQyNjY4LCAweDAwMGYxZTk5LAorICAgIDB4NThjYWE0NWIsIDB4ZjEyODRiNTgsIDB4MDFjMzc0NTIsIDB4MDFkYjc5MTQsIDB4ZmUwYzg5ZGIsIDB4MDExMDgzMGYsIDB4ZmZhNGQzMzIsIDB4MDAwZjE3ODEsCisgICAgMHg1ODA5MzBlMSwgMHhmMGQxNDI2NywgMHgwMjAwZDMyYywgMHgwMWJhNTBkMiwgMHhmZTFhNzAwOSwgMHgwMTBjNWNhNiwgMHhmZmE1ODlhNiwgMHgwMDBmMGRhOCwKKyAgICAweDU3NDUwMzdjLCAweGYwN2QzMDQzLCAweDAyM2Q0OTNjLCAweDAxOTk1MjZiLCAweGZlMjg2NTA1LCAweDAxMDgyM2JhLCAweGZmYTY0OTdjLCAweDAwMGYwMTI1LAorICAgIDB4NTY3ZTJhNTEsIDB4ZjAyYzEzOGEsIDB4MDI3OGQxZjIsIDB4MDE3ODgxNzAsIDB4ZmUzNjY2ZDUsIDB4MDEwM2Q5MjcsIDB4ZmZhNzEyNjYsIDB4MDAwZWYyMGIsCisgICAgMHg1NWI0YjNhZiwgMHhlZmRkZWE5YSwgMHgwMmIzNjhlNiwgMHgwMTU3ZTE2NiwgMHhmZTQ0NzM4OSwgMHgwMGZmN2RjNCwgMHhmZmE3ZTQxYSwgMHgwMDBlZTA3MCwKKyAgICAweDU0ZThhZTEzLCAweGVmOTJiMzkzLCAweDAyZWQwOWQ3LCAweDAxMzc3NWJmLCAweGZlNTI4OTMxLCAweDAwZmIxMjZiLCAweGZmYThiZTRjLCAweDAwMGVjYzY5LAorICAgIDB4NTQxYTI4MWUsIDB4ZWY0YTZjNTgsIDB4MDMyNWIwYWQsIDB4MDExNzQxZGYsIDB4ZmU2MGE1ZTUsIDB4MDBmNjk3ZjMsIDB4ZmZhOWEwYjEsIDB4MDAwZWI2MGIsCisgICAgMHg1MzQ5MzA5ZSwgMHhlZjA1MTI5MCwgMHgwMzVkNTk3NywgMHgwMGY3NDkxYSwgMHhmZTZlYzdjMCwgMHgwMGYyMGYzMiwgMHhmZmFhOGFmZSwgMHgwMDBlOWQ2YiwKKyAgICAweDUyNzVkNjg0LCAweGVlYzJhM2EzLCAweDAzOTQwMDZhLCAweDAwZDc4ZWIzLCAweGZlN2NlY2UyLCAweDAwZWQ3OGZmLCAweGZmYWI3Y2U3LCAweDAwMGU4MjllLAorICAgIDB4NTFhMDI4ZTgsIDB4ZWU4MzFjYzMsIDB4MDNjOWExZTUsIDB4MDBiODE1ZGEsIDB4ZmU4YjEzNzMsIDB4MDBlOGQ2MmQsIDB4ZmZhYzc2MjEsIDB4MDAwZTY1YmEsCisgICAgMHg1MGM4MzcwNCwgMHhlZTQ2N2FlMSwgMHgwM2ZlM2E2ZiwgMHgwMDk4ZTFiMywgMHhmZTk5Mzk5ZiwgMHgwMGU0Mjc4ZiwgMHhmZmFkNzY2MiwgMHgwMDBlNDZkMywKKyAgICAweDRmZWUxMDM3LCAweGVlMGNiYWI5LCAweDA0MzFjNmI1LCAweDAwNzlmNTRjLCAweGZlYTc1ZDk3LCAweDAwZGY2ZGY3LCAweGZmYWU3ZDVmLCAweDAwMGUyNWZkLAorICAgIDB4NGYxMWMzZmUsIDB4ZWRkNWQ4Y2EsIDB4MDQ2NDQzOGMsIDB4MDA1YjUzYTQsIDB4ZmViNTdkOTIsIDB4MDBkYWFhMzQsIDB4ZmZhZjhhY2QsIDB4MDAwZTAzNGYsCisgICAgMHg0ZTMzNjFmNywgMHhlZGExZDE1YywgMHgwNDk1YWRmMiwgMHgwMDNjZmZhOSwgMHhmZWMzOTdjZiwgMHgwMGQ1ZGQxNiwgMHhmZmIwOWU2MywgMHgwMDBkZGVkYiwKKyAgICAweDRkNTJmOWRmLCAweGVkNzBhMDdkLCAweDA0YzYwMzBkLCAweDAwMWVmYzM1LCAweGZlZDFhYTkyLCAweDAwZDEwNzY5LCAweGZmYjFiN2Q4LCAweDAwMGRiOGI3LAorICAgIDB4NGM3MDliOGUsIDB4ZWQ0MjQyMDUsIDB4MDRmNTQwMjksIDB4MDAwMTRjMTIsIDB4ZmVkZmI0MjUsIDB4MDBjYzI5ZjcsIDB4ZmZiMmQ2ZTEsIDB4MDAwZDkwZjYsCisgICAgMHg0YjhjNTZmOCwgMHhlZDE2YjE5NiwgMHgwNTIzNjJiYSwgMHhmZmUzZjFmNywgMHhmZWVkYjJkYSwgMHgwMGM3NDU4YSwgMHhmZmIzZmIzNywgMHgwMDBkNjdhZSwKKyAgICAweDRhYTYzYzJjLCAweGVjZWRlYTk5LCAweDA1NTA2ODVkLCAweGZmYzZmMDhhLCAweGZlZmJhNTA4LCAweDAwYzI1YWU4LCAweGZmYjUyNDkwLCAweDAwMGQzY2YxLAorICAgIDB4NDliZTViNTAsIDB4ZWNjN2U4NDUsIDB4MDU3YzRlZDQsIDB4ZmZhYTRhNWQsIDB4ZmYwOTg5MGYsIDB4MDBiZDZhZDcsIDB4ZmZiNjUyYTcsIDB4MDAwZDEwZDUsCisgICAgMHg0OGQ0YzRhMiwgMHhlY2E0YTU5YiwgMHgwNWE3MTQwYiwgMHhmZjhlMDFmMSwgMHhmZjE3NWQ1MywgMHgwMGI4NzYxOSwgMHhmZmI3ODUzMywgMHgwMDBjZTM2YiwKKyAgICAweDQ3ZTk4ODc0LCAweGVjODQxZDY4LCAweDA1ZDBiNjEyLCAweGZmNzIxOWIzLCAweGZmMjUyMDQyLCAweDAwYjM3ZDcwLCAweGZmYjhiYmVkLCAweDAwMGNiNGM4LAorICAgIDB4NDZmY2I3MmQsIDB4ZWM2NjRhNDgsIDB4MDVmOTMzMjQsIDB4ZmY1NjkzZmUsIDB4ZmYzMmQwNGYsIDB4MDBhZTgxOTgsIDB4ZmZiOWY2OTEsIDB4MDAwYzg0ZmYsCisgICAgMHg0NjBlNjE0OCwgMHhlYzRiMjZhMiwgMHgwNjIwODk5ZSwgMHhmZjNiNzMxYiwgMHhmZjQwNmJmOCwgMHgwMGE5ODM0ZSwgMHhmZmJiMzRkOCwgMHgwMDBjNTQyMiwKKyAgICAweDQ1MWU5NzUwLCAweGVjMzJhY2IwLCAweDA2NDZiODA4LCAweGZmMjBiOTNlLCAweGZmNGRmMWJlLCAweDAwYTQ4MzRjLCAweGZmYmM3NjdmLCAweDAwMGMyMjQ1LAorICAgIDB4NDQyZDY5ZGUsIDB4ZWMxY2Q2NzcsIDB4MDY2YmJkMGQsIDB4ZmYwNjY4ODksIDB4ZmY1YjYwMmMsIDB4MDA5ZjgyNDksIDB4ZmZiZGJiNDIsIDB4MDAwYmVmNzksCisgICAgMHg0MzNhZTk5YywgMHhlYzA5OWRjZiwgMHgwNjhmOTc4MSwgMHhmZWVjODMwZCwgMHhmZjY4YjVkNSwgMHgwMDlhODBmOCwgMHhmZmJmMDJkZCwgMHgwMDBiYmJkMiwKKyAgICAweDQyNDcyNzNmLCAweGViZjhmYzY0LCAweDA2YjI0NjViLCAweGZlZDMwYWM1LCAweGZmNzVmMTUzLCAweDAwOTU4MDBjLCAweGZmYzA0ZDBmLCAweDAwMGI4NzYwLAorICAgIDB4NDE1MjMzODksIDB4ZWJlYWViYWYsIDB4MDZkM2M4YmIsIDB4ZmViYTAxOTksIDB4ZmY4MzExNDgsIDB4MDA5MDgwMzQsIDB4ZmZjMTk5OTYsIDB4MDAwYjUyMzUsCisgICAgMHg0MDVjMWY0MywgMHhlYmRmNjUwMCwgMHgwNmY0MWRlMywgMHhmZWExNjk2MCwgMHhmZjkwMTQ1ZSwgMHgwMDhiODIxYiwgMHhmZmMyZTgzMiwgMHgwMDBiMWM2NCwKKyAgICAweDNmNjRmYjQwLCAweGViZDY2MTdiLCAweDA3MTM0NTNkLCAweGZlODk0M2RjLCAweGZmOWNmOTQ3LCAweDAwODY4NjZiLCAweGZmYzQzOGEzLCAweDAwMGFlNWZjLAorICAgIDB4M2U2Y2Q4NWIsIDB4ZWJjZmRhMTksIDB4MDczMTNlNTYsIDB4ZmU3MTkyYmQsIDB4ZmZhOWJlYmUsIDB4MDA4MThkY2IsIDB4ZmZjNThhYWEsIDB4MDAwYWFmMGYsCisgICAgMHgzZDczYzc3MiwgMHhlYmNiYzdhNywgMHgwNzRlMDhlMCwgMHhmZTVhNTc5ZCwgMHhmZmI2NjM4NiwgMHgwMDdjOThkZSwgMHhmZmM2ZGUwOSwgMHgwMDBhNzdhYywKKyAgICAweDNjNzlkOTY4LCAweGViY2EyMmNjLCAweDA3NjlhNGIyLCAweGZlNDM5NDA3LCAweGZmYzJlNjY5LCAweDAwNzdhODQ1LCAweGZmYzgzMjg1LCAweDAwMGEzZmU1LAorICAgIDB4M2I3ZjFmMjMsIDB4ZWJjYWU0MDUsIDB4MDc4NDExYzcsIDB4ZmUyZDQ5NmYsIDB4ZmZjZjQ2M2EsIDB4MDA3MmJjOWQsIDB4ZmZjOTg3ZTAsIDB4MDAwYTA3YzksCisgICAgMHgzYTgzYTk4OSwgMHhlYmNlMDNhYSwgMHgwNzlkNTAzYiwgMHhmZTE3NzkzNywgMHhmZmRiODFkNiwgMHgwMDZkZDY4MCwgMHhmZmNhZGRlMSwgMHgwMDA5Y2Y2NywKKyAgICAweDM5ODc4OTdmLCAweGViZDM3OWViLCAweDA3YjU2MDUxLCAweGZlMDIyNGIwLCAweGZmZTc5ODIwLCAweDAwNjhmNjg3LCAweGZmY2MzNDRjLCAweDAwMDk5NmNlLAorICAgIDB4Mzg4YWNmZTksIDB4ZWJkYjNlZDUsIDB4MDdjYzQyNmMsIDB4ZmRlZDRkMTMsIDB4ZmZmMzg4MDYsIDB4MDA2NDFkNDQsIDB4ZmZjZDhhZWIsIDB4MDAwOTVlMGUsCisgICAgMHgzNzhkOGRhOCwgMHhlYmU1NGE0ZiwgMHgwN2UxZjcxMiwgMHhmZGQ4ZjM4YiwgMHhmZmZmNTA3YiwgMHgwMDVmNGI0YSwgMHhmZmNlZTE4MywgMHgwMDA5MjUzNSwKKyAgICAweDM2OGZkMzk3LCAweGViZjE5NDFmLCAweDA3ZjY3ZWVjLCAweGZkYzUxOTJkLCAweDAwMGFmMDdmLCAweDAwNWE4MTI1LCAweGZmZDAzN2UwLCAweDAwMDhlYzUwLAorICAgIDB4MzU5MWIyOGIsIDB4ZWMwMDEzZTgsIDB4MDgwOWRhYzMsIDB4ZmRiMWJlZmMsIDB4MDAxNjY3MTgsIDB4MDA1NWJmNjAsIDB4ZmZkMThkY2MsIDB4MDAwOGIzNmUsCisgICAgMHgzNDkzM2I1MCwgMHhlYzEwYzEyYywgMHgwODFjMGI4NCwgMHhmZDllZTVlNywgMHgwMDIxYjM1NSwgMHgwMDUxMDY4MiwgMHhmZmQyZTMxMSwgMHgwMDA4N2E5YywKKyAgICAweDMzOTQ3ZWFiLCAweGVjMjM5MzRmLCAweDA4MmQxMjM5LCAweGZkOGM4ZWNjLCAweDAwMmNkNDRkLCAweDAwNGM1NzBmLCAweGZmZDQzNzdkLCAweDAwMDg0MWU4LAorICAgIDB4MzI5NThkNTUsIDB4ZWMzODgxOTQsIDB4MDgzY2YwMTAsIDB4ZmQ3YWJhNzQsIDB4MDAzN2M5MjIsIDB4MDA0N2IxODYsIDB4ZmZkNThhZGUsIDB4MDAwODA5NWQsCisgICAgMHgzMTk2NzdmYSwgMHhlYzRmODMyMiwgMHgwODRiYTY1NCwgMHhmZDY5Njk5OCwgMHgwMDQyOTBmYywgMHgwMDQzMTY2NiwgMHhmZmQ2ZGQwMiwgMHgwMDA3ZDEwOCwKKyAgICAweDMwOTc0ZjNiLCAweGVjNjg4ZjAyLCAweDA4NTkzNjcxLCAweGZkNTg5Y2RjLCAweDAwNGQyYjBlLCAweDAwM2U4NjI4LCAweGZmZDgyZGJhLCAweDAwMDc5OGY1LAorICAgIDB4MmY5ODIzYTgsIDB4ZWM4MzljMjIsIDB4MDg2NWExZjEsIDB4ZmQ0ODU0ZDMsIDB4MDA1Nzk2OTEsIDB4MDAzYTAxNDEsIDB4ZmZkOTdjZDYsIDB4MDAwNzYxMzAsCisgICAgMHgyZTk5MDVjMSwgMHhlY2EwYTE1NiwgMHgwODcwZWE3ZSwgMHhmZDM4OTFmZCwgMHgwMDYxZDJjYSwgMHgwMDM1ODgyNCwgMHhmZmRhY2EyYSwgMHgwMDA3MjljNCwKKyAgICAweDJkOWEwNWY0LCAweGVjYmY5NTU4LCAweDA4N2IxMWRlLCAweGZkMjk1NGM4LCAweDAwNmJkZjA1LCAweDAwMzExYjQxLCAweGZmZGMxNTg4LCAweDAwMDZmMmJiLAorICAgIDB4MmM5YjM0OWUsIDB4ZWNlMDZlY2IsIDB4MDg4NDE5ZjYsIDB4ZmQxYTlkOTEsIDB4MDA3NWJhOTUsIDB4MDAyY2JiMDMsIDB4ZmZkZDVlYzYsIDB4MDAwNmJjMjEsCisgICAgMHgyYjljYTIwMywgMHhlZDAzMjQzOSwgMHgwODhjMDRjOCwgMHhmZDBjNmNhMiwgMHgwMDdmNjRkYSwgMHgwMDI4NjdkMiwgMHhmZmRlYTViYiwgMHgwMDA2ODVmZiwKKyAgICAweDJhOWU1ZTU3LCAweGVkMjdhYzE2LCAweDA4OTJkNDcwLCAweGZjZmVjMjMzLCAweDAwODhkZDM4LCAweDAwMjQyMjEzLCAweGZmZGZlYTNjLCAweDAwMDY1MDVmLAorICAgIDB4MjlhMDc5YjIsIDB4ZWQ0ZGZjYzIsIDB4MDg5ODhiMmEsIDB4ZmNmMTllNmIsIDB4MDA5MjIzMWUsIDB4MDAxZmVhMjcsIDB4ZmZlMTJjMjIsIDB4MDAwNjFiNGIsCisgICAgMHgyOGEzMDQxNiwgMHhlZDc2MGM4OCwgMHgwODlkMmI0YSwgMHhmY2U1MDE2MSwgMHgwMDliMzYwNSwgMHgwMDFiYzA2YiwgMHhmZmUyNmI0OCwgMHgwMDA1ZTZjYiwKKyAgICAweDI3YTYwZDZhLCAweGVkOWZkMWEyLCAweDA4YTBiNzQwLCAweGZjZDhlYjE3LCAweDAwYTQxNTZiLCAweDAwMTdhNTNiLCAweGZmZTNhNzg4LCAweDAwMDViMmU4LAorICAgIDB4MjZhOWE1N2IsIDB4ZWRjYjQyMzcsIDB4MDhhMzMxOTYsIDB4ZmNjZDViODIsIDB4MDBhY2MwZGEsIDB4MDAxMzk4ZWMsIDB4ZmZlNGUwYmYsIDB4MDAwNTdmYWEsCisgICAgMHgyNWFkZGJmOSwgMHhlZGY4NTQ1YiwgMHgwOGE0OWNmMCwgMHhmY2MyNTI4NSwgMHgwMGI1MzdlMSwgMHgwMDBmOWJkMiwgMHhmZmU2MTZjOCwgMHgwMDA1NGQxYSwKKyAgICAweDI0YjJjMDc1LCAweGVlMjZmZTE3LCAweDA4YTRmYzBkLCAweGZjYjdjZmYwLCAweDAwYmQ3YTFjLCAweDAwMGJhZTNjLCAweGZmZTc0OTg0LCAweDAwMDUxYjNlLAorICAgIDB4MjNiODYyNjMsIDB4ZWU1NzM1NjIsIDB4MDhhNDUxYzAsIDB4ZmNhZGQzODYsIDB4MDBjNTg3MmEsIDB4MDAwN2QwNzUsIDB4ZmZlODc4ZDMsIDB4MDAwNGVhMWQsCisgICAgMHgyMmJlZDExNiwgMHhlZTg4ZjAyNiwgMHgwOGEyYTBmOCwgMHhmY2E0NWNmNywgMHgwMGNkNWViNywgMHgwMDA0MDJjOCwgMHhmZmU5YTQ5NCwgMHgwMDA0YjljMCwKKyAgICAweDIxYzYxYmMwLCAweGVlYmMyNDQ0LCAweDA4OWZlY2JiLCAweGZjOWI2YmU1LCAweDAwZDUwMDc1LCAweDAwMDA0NTc5LCAweGZmZWFjY2FhLCAweDAwMDQ4YTJiLAorICAgIDB4MjBjZTUxNmYsIDB4ZWVmMGM3OGQsIDB4MDg5YzM4MjQsIDB4ZmM5MmZmZTEsIDB4MDBkYzZjMWUsIDB4ZmZmYzk4YzksIDB4ZmZlYmYwZmEsIDB4MDAwNDViNjUsCisgICAgMHgxZmQ3ODEwZiwgMHhlZjI2Y2ZjYSwgMHgwODk3ODY2NiwgMHhmYzhiMTg2ZCwgMHgwMGUzYTE3NSwgMHhmZmY4ZmNmNywgMHhmZmVkMTE2NiwgMHgwMDA0MmQ3NCwKKyAgICAweDFlZTFiOTY1LCAweGVmNWUzMmJkLCAweDA4OTFkYWM4LCAweGZjODNiNGZjLCAweDAwZWFhMDQ1LCAweGZmZjU3MjNkLCAweGZmZWUyZGQ3LCAweDAwMDQwMDVlLAorICAgIDB4MWRlZDA5MTEsIDB4ZWY5NmU2MWMsIDB4MDg4YjM4YTksIDB4ZmM3Y2Q0ZjAsIDB4MDBmMTY4NjEsIDB4ZmZmMWY4ZDIsIDB4ZmZlZjQ2MzIsIDB4MDAwM2Q0MjYsCisgICAgMHgxY2Y5N2U4YiwgMHhlZmQwZGY5YSwgMHgwODgzYTM3OCwgMHhmYzc2Nzc5ZSwgMHgwMGY3ZjlhMywgMHhmZmVlOTBlYiwgMHhmZmYwNWE2MCwgMHgwMDAzYThkMiwKKyAgICAweDFjMDcyODIzLCAweGYwMGMxNGUxLCAweDA4N2IxZWJjLCAweGZjNzA5YzRkLCAweDAwZmU1M2VmLCAweGZmZWIzYWI4LCAweGZmZjE2YTRhLCAweDAwMDM3ZTY1LAorICAgIDB4MWIxNjEzZmYsIDB4ZjA0ODdiOTgsIDB4MDg3MWFlMGQsIDB4ZmM2YjQyMzMsIDB4MDEwNDc3MmUsIDB4ZmZlN2Y2NjYsIDB4ZmZmMjc1ZGIsIDB4MDAwMzU0ZTUsCisgICAgMHgxYTI2NTAxYiwgMHhmMDg2MDk2MiwgMHgwODY3NTUxNiwgMHhmYzY2Njg3YSwgMHgwMTBhNjM1MywgMHhmZmU0YzQxZSwgMHhmZmYzN2QwMCwgMHgwMDAzMmM1NCwKKyAgICAweDE5MzdlYTQ3LCAweGYwYzRiM2UwLCAweDA4NWMxNzk0LCAweGZjNjIwZTNkLCAweDAxMTAxODU4LCAweGZmZTFhNDA4LCAweGZmZjQ3ZmE1LCAweDAwMDMwNGI3LAorICAgIDB4MTg0YWYwMjUsIDB4ZjEwNDcwYjAsIDB4MDg0ZmY5NTcsIDB4ZmM1ZTMyOGMsIDB4MDExNTk2M2QsIDB4ZmZkZTk2NDYsIDB4ZmZmNTdkYjgsIDB4MDAwMmRlMGUsCisgICAgMHgxNzVmNmYyYiwgMHhmMTQ1MzU3MSwgMHgwODQyZmUzZCwgMHhmYzVhZDQ2NSwgMHgwMTFhZGQwYiwgMHhmZmRiOWFmOCwgMHhmZmY2NzcyOSwgMHgwMDAyYjg1ZiwKKyAgICAweDE2NzU3NDllLCAweGYxODZmN2MwLCAweDA4MzUyYTM1LCAweGZjNTdmMmJlLCAweDAxMWZlY2QzLCAweGZmZDhiMjNiLCAweGZmZjc2YmU5LCAweDAwMDI5M2FhLAorICAgIDB4MTU4ZDBkOTUsIDB4ZjFjOWFkNDAsIDB4MDgyNjgxM2UsIDB4ZmM1NThjN2MsIDB4MDEyNGM1YWIsIDB4ZmZkNWRjMjgsIDB4ZmZmODViZTgsIDB4MDAwMjZmZjIsCisgICAgMHgxNGE2NDZmNiwgMHhmMjBkNGI5MiwgMHgwODE3MDc2NywgMHhmYzUzYTA3YiwgMHgwMTI5NjdiMSwgMHhmZmQzMThkNiwgMHhmZmY5NDcxYiwgMHgwMDAyNGQzOSwKKyAgICAweDEzYzEyZDczLCAweGYyNTFjODVkLCAweDA4MDZjMGNiLCAweGZjNTIyZDg4LCAweDAxMmRkMzBhLCAweGZmZDA2ODU4LCAweGZmZmEyZDc0LCAweDAwMDIyYjdmLAorICAgIDB4MTJkZGNkOGYsIDB4ZjI5NzE5NGQsIDB4MDdmNWIxOTMsIDB4ZmM1MTMyNjYsIDB4MDEzMjA3ZTQsIDB4ZmZjZGNhYmUsIDB4ZmZmYjBlZTksIDB4MDAwMjBhYzcsCisgICAgMHgxMWZjMzM5NSwgMHhmMmRkMzQxMSwgMHgwN2UzZGRmNywgMHhmYzUwYWRjYywgMHgwMTM2MDY3MCwgMHhmZmNiNDAxNCwgMHhmZmZiZWI3MCwgMHgwMDAxZWIxMCwKKyAgICAweDExMWM2YmEwLCAweGYzMjQwZTYxLCAweDA3ZDE0YTM4LCAweGZjNTA5ZTY0LCAweDAxMzljZWU5LCAweGZmYzhjODY2LCAweGZmZmNjMzAwLCAweDAwMDFjYzVjLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZkMWJlNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5jcHAKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTUsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9GbGluZ2VyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkF1ZGlvSHdEZXZpY2UuaCIKKyNpbmNsdWRlICJBdWRpb1N0cmVhbU91dC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0F1ZGlvU3RyZWFtT3V0OjpBdWRpb1N0cmVhbU91dChBdWRpb0h3RGV2aWNlICpkZXYsIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQorICAgICAgICA6IGF1ZGlvSHdEZXYoZGV2KQorICAgICAgICAsIHN0cmVhbShOVUxMKQorICAgICAgICAsIGZsYWdzKGZsYWdzKQorICAgICAgICAsIG1GcmFtZXNXcml0dGVuKDApCisgICAgICAgICwgbUZyYW1lc1dyaXR0ZW5BdFN0YW5kYnkoMCkKKyAgICAgICAgLCBtUmVuZGVyUG9zaXRpb24oMCkKKyAgICAgICAgLCBtUmF0ZU11bHRpcGxpZXIoMSkKKyAgICAgICAgLCBtSGFsRm9ybWF0SXNMaW5lYXJQY20oZmFsc2UpCisgICAgICAgICwgbUhhbEZyYW1lU2l6ZSgwKQoreworfQorCithdWRpb19od19kZXZpY2VfdCAqQXVkaW9TdHJlYW1PdXQ6Omh3RGV2KCkgY29uc3QKK3sKKyAgICByZXR1cm4gYXVkaW9Id0Rldi0+aHdEZXZpY2UoKTsKK30KKworc3RhdHVzX3QgQXVkaW9TdHJlYW1PdXQ6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMpCit7CisgICAgaWYgKHN0cmVhbSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHVpbnQzMl90IGhhbFBvc2l0aW9uID0gMDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdHJlYW0tPmdldF9yZW5kZXJfcG9zaXRpb24oc3RyZWFtLCAmaGFsUG9zaXRpb24pOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvLyBNYWludGFpbiBhIDY0LWJpdCByZW5kZXIgcG9zaXRpb24gdXNpbmcgdGhlIDMyLWJpdCByZXN1bHQgZnJvbSB0aGUgSEFMLgorICAgIC8vIFRoaXMgZGVsdGEgY2FsY3VsYXRpb24gcmVsaWVzIG9uIHRoZSBhcml0aG1ldGljIG92ZXJmbG93IGJlaGF2aW9yCisgICAgLy8gb2YgaW50ZWdlcnMuIEZvciBleGFtcGxlICgxMDAgLSAweEZGRkZGRkYwKSA9IDExNi4KKyAgICB1aW50MzJfdCB0cnVuY2F0ZWRQb3NpdGlvbiA9ICh1aW50MzJfdCltUmVuZGVyUG9zaXRpb247CisgICAgaW50MzJfdCBkZWx0YUhhbFBvc2l0aW9uID0gKGludDMyX3QpKGhhbFBvc2l0aW9uIC0gdHJ1bmNhdGVkUG9zaXRpb24pOworICAgIGlmIChkZWx0YUhhbFBvc2l0aW9uID4gMCkgeworICAgICAgICBtUmVuZGVyUG9zaXRpb24gKz0gZGVsdGFIYWxQb3NpdGlvbjsKKyAgICB9CisgICAgLy8gU2NhbGUgZnJvbSBIQUwgc2FtcGxlIHJhdGUgdG8gYXBwbGljYXRpb24gcmF0ZS4KKyAgICAqZnJhbWVzID0gbVJlbmRlclBvc2l0aW9uIC8gbVJhdGVNdWx0aXBsaWVyOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLy8gcmV0dXJuIGJvdHRvbSAzMi1iaXRzIG9mIHRoZSByZW5kZXIgcG9zaXRpb24KK3N0YXR1c190IEF1ZGlvU3RyZWFtT3V0OjpnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZnJhbWVzKQoreworICAgIHVpbnQ2NF90IHBvc2l0aW9uNjQgPSAwOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldFJlbmRlclBvc2l0aW9uKCZwb3NpdGlvbjY0KTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICpmcmFtZXMgPSAodWludDMyX3QpcG9zaXRpb242NDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9TdHJlYW1PdXQ6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKQoreworICAgIGlmIChzdHJlYW0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICB1aW50NjRfdCBoYWxQb3NpdGlvbiA9IDA7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKHN0cmVhbSwgJmhhbFBvc2l0aW9uLCB0aW1lc3RhbXApOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvLyBBZGp1c3QgZm9yIHN0YW5kYnkgdXNpbmcgSEFMIHJhdGUgZnJhbWVzLgorICAgIC8vIE9ubHkgYXBwbHkgdGhpcyBjb3JyZWN0aW9uIGlmIHRoZSBIQUwgaXMgZ2V0dGluZyBQQ00gZnJhbWVzLgorICAgIGlmIChtSGFsRm9ybWF0SXNMaW5lYXJQY20pIHsKKyAgICAgICAgdWludDY0X3QgYWRqdXN0ZWRQb3NpdGlvbiA9IChoYWxQb3NpdGlvbiA8PSBtRnJhbWVzV3JpdHRlbkF0U3RhbmRieSkgPworICAgICAgICAgICAgICAgIDAgOiAoaGFsUG9zaXRpb24gLSBtRnJhbWVzV3JpdHRlbkF0U3RhbmRieSk7CisgICAgICAgIC8vIFNjYWxlIGZyb20gSEFMIHNhbXBsZSByYXRlIHRvIGFwcGxpY2F0aW9uIHJhdGUuCisgICAgICAgICpmcmFtZXMgPSBhZGp1c3RlZFBvc2l0aW9uIC8gbVJhdGVNdWx0aXBsaWVyOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZvciBvZmZsb2FkZWQgTVAzIGFuZCBvdGhlciBjb21wcmVzc2VkIGZvcm1hdHMuCisgICAgICAgICpmcmFtZXMgPSBoYWxQb3NpdGlvbjsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1N0cmVhbU91dDo6b3BlbigKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzKQoreworICAgIGF1ZGlvX3N0cmVhbV9vdXRfdCAqb3V0U3RyZWFtOworICAgIGludCBzdGF0dXMgPSBod0RldigpLT5vcGVuX291dHB1dF9zdHJlYW0oCisgICAgICAgICAgICBod0RldigpLAorICAgICAgICAgICAgaGFuZGxlLAorICAgICAgICAgICAgZGV2aWNlcywKKyAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgY29uZmlnLAorICAgICAgICAgICAgJm91dFN0cmVhbSwKKyAgICAgICAgICAgIGFkZHJlc3MpOworICAgIEFMT0dWKCJBdWRpb1N0cmVhbU91dDo6b3BlbigpLCBIQUwgb3Blbl9vdXRwdXRfc3RyZWFtIHJldHVybmVkICIKKyAgICAgICAgICAgICIgJXAsIHNhbXBsZVJhdGUgJWQsIEZvcm1hdCAlI3gsICIKKyAgICAgICAgICAgICJjaGFubmVsTWFzayAlI3gsIHN0YXR1cyAlZCIsCisgICAgICAgICAgICBvdXRTdHJlYW0sCisgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQsCisgICAgICAgICAgICBjb25maWctPmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgIHN0YXR1cyk7CisKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHN0cmVhbSA9IG91dFN0cmVhbTsKKyAgICAgICAgbUhhbEZvcm1hdElzTGluZWFyUGNtID0gYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCk7CisgICAgICAgIEFMT0dJKCJBdWRpb1N0cmVhbU91dDo6b3BlbigpLCBtSGFsRm9ybWF0SXNMaW5lYXJQY20gPSAlZCIsIChpbnQpbUhhbEZvcm1hdElzTGluZWFyUGNtKTsKKyAgICAgICAgbUhhbEZyYW1lU2l6ZSA9IGF1ZGlvX3N0cmVhbV9vdXRfZnJhbWVfc2l6ZShzdHJlYW0pOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2F1ZGlvX2Zvcm1hdF90IEF1ZGlvU3RyZWFtT3V0OjpnZXRGb3JtYXQoKSBjb25zdAoreworICAgIHJldHVybiBzdHJlYW0tPmNvbW1vbi5nZXRfZm9ybWF0KCZzdHJlYW0tPmNvbW1vbik7Cit9CisKK3VpbnQzMl90IEF1ZGlvU3RyZWFtT3V0OjpnZXRTYW1wbGVSYXRlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gc3RyZWFtLT5jb21tb24uZ2V0X3NhbXBsZV9yYXRlKCZzdHJlYW0tPmNvbW1vbik7Cit9CisKK2F1ZGlvX2NoYW5uZWxfbWFza190IEF1ZGlvU3RyZWFtT3V0OjpnZXRDaGFubmVsTWFzaygpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmc3RyZWFtLT5jb21tb24pOworfQorCitpbnQgQXVkaW9TdHJlYW1PdXQ6OmZsdXNoKCkKK3sKKyAgICBBTE9HX0FTU0VSVChzdHJlYW0gIT0gTlVMTCk7CisgICAgbVJlbmRlclBvc2l0aW9uID0gMDsKKyAgICBtRnJhbWVzV3JpdHRlbiA9IDA7CisgICAgbUZyYW1lc1dyaXR0ZW5BdFN0YW5kYnkgPSAwOworICAgIGlmIChzdHJlYW0tPmZsdXNoICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIHN0cmVhbS0+Zmx1c2goc3RyZWFtKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitpbnQgQXVkaW9TdHJlYW1PdXQ6OnN0YW5kYnkoKQoreworICAgIEFMT0dfQVNTRVJUKHN0cmVhbSAhPSBOVUxMKTsKKyAgICBtUmVuZGVyUG9zaXRpb24gPSAwOworICAgIG1GcmFtZXNXcml0dGVuQXRTdGFuZGJ5ID0gbUZyYW1lc1dyaXR0ZW47CisgICAgcmV0dXJuIHN0cmVhbS0+Y29tbW9uLnN0YW5kYnkoJnN0cmVhbS0+Y29tbW9uKTsKK30KKworc3NpemVfdCBBdWRpb1N0cmVhbU91dDo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbnVtQnl0ZXMpCit7CisgICAgQUxPR19BU1NFUlQoc3RyZWFtICE9IE5VTEwpOworICAgIHNzaXplX3QgYnl0ZXNXcml0dGVuID0gc3RyZWFtLT53cml0ZShzdHJlYW0sIGJ1ZmZlciwgbnVtQnl0ZXMpOworICAgIGlmIChieXRlc1dyaXR0ZW4gPiAwICYmIG1IYWxGcmFtZVNpemUgPiAwKSB7CisgICAgICAgIG1GcmFtZXNXcml0dGVuICs9IGJ5dGVzV3JpdHRlbiAvIG1IYWxGcmFtZVNpemU7CisgICAgfQorICAgIHJldHVybiBieXRlc1dyaXR0ZW47Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhMjI3NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5oCkBAIC0wLDAgKzEsMTE1IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fU1RSRUFNX09VVF9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fU1RSRUFNX09VVF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCisjaW5jbHVkZSAiQXVkaW9TdHJlYW1PdXQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBdWRpb0h3RGV2aWNlOworCisvKioKKyAqIE1hbmFnZWQgYWNjZXNzIHRvIGEgSEFMIG91dHB1dCBzdHJlYW0uCisgKi8KK2NsYXNzIEF1ZGlvU3RyZWFtT3V0IHsKK3B1YmxpYzoKKy8vIEF1ZGlvU3RyZWFtT3V0IGlzIGltbXV0YWJsZSwgc28gaXRzIGZpZWxkcyBhcmUgY29uc3QuCisvLyBGb3IgZW1waGFzaXMsIHdlIGNvdWxkIGFsc28gbWFrZSBhbGwgcG9pbnRlcnMgdG8gdGhlbSBiZSAiY29uc3QgKiIsCisvLyBidXQgdGhhdCB3b3VsZCBjbHV0dGVyIHRoZSBjb2RlIHVubmVjZXNzYXJpbHkuCisgICAgQXVkaW9Id0RldmljZSAqIGNvbnN0IGF1ZGlvSHdEZXY7CisgICAgYXVkaW9fc3RyZWFtX291dF90ICpzdHJlYW07CisgICAgY29uc3QgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3M7CisKKyAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXYoKSBjb25zdDsKKworICAgIEF1ZGlvU3RyZWFtT3V0KEF1ZGlvSHdEZXZpY2UgKmRldiwgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzKTsKKworICAgIHZpcnR1YWwgfkF1ZGlvU3RyZWFtT3V0KCkgeyB9CisKKyAgICAvLyBHZXQgdGhlIGJvdHRvbSAzMi1iaXRzIG9mIHRoZSA2NC1iaXQgcmVuZGVyIHBvc2l0aW9uLgorICAgIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpmcmFtZXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOworCisgICAgLyoqCisgICAgKiBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB3cml0dGVuLCBvciBhCisgICAgKiBuZWdhdGl2ZSBzdGF0dXNfdC4gSWYgYXQgbGVhc3Qgb25lIGZyYW1lIHdhcyB3cml0dGVuIHN1Y2Nlc3NmdWxseSBwcmlvciB0byB0aGUgZXJyb3IsCisgICAgKiBpdCBpcyBzdWdnZXN0ZWQgdGhhdCB0aGUgZHJpdmVyIHJldHVybiB0aGF0IHN1Y2Nlc3NmdWwgKHNob3J0KSBieXRlIGNvdW50CisgICAgKiBhbmQgdGhlbiByZXR1cm4gYW4gZXJyb3IgaW4gdGhlIHN1YnNlcXVlbnQgY2FsbC4KKyAgICAqCisgICAgKiBJZiBzZXRfY2FsbGJhY2soKSBoYXMgcHJldmlvdXNseSBiZWVuIGNhbGxlZCB0byBlbmFibGUgbm9uLWJsb2NraW5nIG1vZGUKKyAgICAqIHRoZSB3cml0ZSgpIGlzIG5vdCBhbGxvd2VkIHRvIGJsb2NrLiBJdCBtdXN0IHdyaXRlIG9ubHkgdGhlIG51bWJlciBvZgorICAgICogYnl0ZXMgdGhhdCBjdXJyZW50bHkgZml0IGluIHRoZSBkcml2ZXIvaGFyZHdhcmUgYnVmZmVyIGFuZCB0aGVuIHJldHVybgorICAgICogdGhpcyBieXRlIGNvdW50LiBJZiB0aGlzIGlzIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIHdyaXRlIHNpemUgdGhlCisgICAgKiBjYWxsYmFjayBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuIG1vcmUgc3BhY2UgaXMgYXZhaWxhYmxlIGluIHRoZQorICAgICogZHJpdmVyL2hhcmR3YXJlIGJ1ZmZlci4KKyAgICAqLworICAgIHZpcnR1YWwgc3NpemVfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcyk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGZyYW1lIHNpemUgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgQXVkaW9GbGluZ2VyLgorICAgICAqLworICAgIHZpcnR1YWwgc2l6ZV90IGdldEZyYW1lU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1IYWxGcmFtZVNpemU7IH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gZm9ybWF0IGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIEF1ZGlvRmxpbmdlci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogVGhlIEhBTCBtYXkgYmUgcnVubmluZyBhdCBhIGhpZ2hlciBzYW1wbGUgcmF0ZSBpZiwgZm9yIGV4YW1wbGUsIHBsYXlpbmcgd3JhcHBlZCBFQUMzLgorICAgICAqIEByZXR1cm4gc2FtcGxlIHJhdGUgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgQXVkaW9GbGluZ2VyLgorICAgICAqLworICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogVGhlIEhBTCBpcyBpbiBzdGVyZW8gbW9kZSB3aGVuIHBsYXlpbmcgbXVsdGktY2hhbm5lbCBjb21wcmVzc2VkIGF1ZGlvIG92ZXIgSERNSS4KKyAgICAgKiBAcmV0dXJuIGNoYW5uZWwgbWFzayBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBBdWRpb0ZsaW5nZXIuCisgICAgICovCisgICAgdmlydHVhbCBhdWRpb19jaGFubmVsX21hc2tfdCBnZXRDaGFubmVsTWFzaygpIGNvbnN0OworCisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7CisKK3Byb3RlY3RlZDoKKyAgICB1aW50NjRfdCAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbjsgLy8gcmVzZXQgYnkgZmx1c2gKKyAgICB1aW50NjRfdCAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbkF0U3RhbmRieTsKKyAgICB1aW50NjRfdCAgICAgICAgICAgICBtUmVuZGVyUG9zaXRpb247IC8vIHJlc2V0IGJ5IGZsdXNoIG9yIHN0YW5kYnkKKyAgICBpbnQgICAgICAgICAgICAgICAgICBtUmF0ZU11bHRpcGxpZXI7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgbUhhbEZvcm1hdElzTGluZWFyUGNtOworICAgIHNpemVfdCAgICAgICAgICAgICAgIG1IYWxGcmFtZVNpemU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0FVRElPX1NUUkVBTV9PVVRfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0J1ZmZlclByb3ZpZGVycy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQnVmZmVyUHJvdmlkZXJzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGJlMjA2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0J1ZmZlclByb3ZpZGVycy5jcHAKQEAgLTAsMCArMSw1NDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclByb3ZpZGVyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfZG93bm1peC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJCdWZmZXJQcm92aWRlcnMuaCIKKworI2lmbmRlZiBBUlJBWV9TSVpFCisjZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZih4KS9zaXplb2YoKHgpWzBdKSkKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGF0aWMgaW5saW5lIFQgbWluKGNvbnN0IFQmIGEsIGNvbnN0IFQmIGIpCit7CisgICAgcmV0dXJuIGEgPCBiID8gYSA6IGI7Cit9CisKK0NvcHlCdWZmZXJQcm92aWRlcjo6Q29weUJ1ZmZlclByb3ZpZGVyKHNpemVfdCBpbnB1dEZyYW1lU2l6ZSwKKyAgICAgICAgc2l6ZV90IG91dHB1dEZyYW1lU2l6ZSwgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpIDoKKyAgICAgICAgbUlucHV0RnJhbWVTaXplKGlucHV0RnJhbWVTaXplKSwKKyAgICAgICAgbU91dHB1dEZyYW1lU2l6ZShvdXRwdXRGcmFtZVNpemUpLAorICAgICAgICBtTG9jYWxCdWZmZXJGcmFtZUNvdW50KGJ1ZmZlckZyYW1lQ291bnQpLAorICAgICAgICBtTG9jYWxCdWZmZXJEYXRhKE5VTEwpLAorICAgICAgICBtQ29uc3VtZWQoMCkKK3sKKyAgICBBTE9HVigiQ29weUJ1ZmZlclByb3ZpZGVyKCVwKSglenUsICV6dSwgJXp1KSIsIHRoaXMsCisgICAgICAgICAgICBpbnB1dEZyYW1lU2l6ZSwgb3V0cHV0RnJhbWVTaXplLCBidWZmZXJGcmFtZUNvdW50KTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGlucHV0RnJhbWVTaXplIDwgb3V0cHV0RnJhbWVTaXplICYmIGJ1ZmZlckZyYW1lQ291bnQgPT0gMCwKKyAgICAgICAgICAgICJSZXF1aXJlcyBsb2NhbCBidWZmZXIgaWYgaW5wdXRGcmFtZVNpemUoJXp1KSA8IG91dHB1dEZyYW1lU2l6ZSglenUpIiwKKyAgICAgICAgICAgIGlucHV0RnJhbWVTaXplLCBvdXRwdXRGcmFtZVNpemUpOworICAgIGlmIChtTG9jYWxCdWZmZXJGcmFtZUNvdW50KSB7CisgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtTG9jYWxCdWZmZXJEYXRhLCAzMiwgbUxvY2FsQnVmZmVyRnJhbWVDb3VudCAqIG1PdXRwdXRGcmFtZVNpemUpOworICAgIH0KKyAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSAwOworfQorCitDb3B5QnVmZmVyUHJvdmlkZXI6On5Db3B5QnVmZmVyUHJvdmlkZXIoKQoreworICAgIEFMT0dWKCJ+Q29weUJ1ZmZlclByb3ZpZGVyKCVwKSIsIHRoaXMpOworICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgIT0gMCkgeworICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CisgICAgfQorICAgIGZyZWUobUxvY2FsQnVmZmVyRGF0YSk7Cit9CisKK3N0YXR1c190IENvcHlCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIsCisgICAgICAgIGludDY0X3QgcHRzKQoreworICAgIC8vQUxPR1YoIkNvcHlCdWZmZXJQcm92aWRlciglcCk6OmdldE5leHRCdWZmZXIoJXAgKCV6dSksICVsbGQpIiwKKyAgICAvLyAgICAgICAgdGhpcywgcEJ1ZmZlciwgcEJ1ZmZlci0+ZnJhbWVDb3VudCwgcHRzKTsKKyAgICBpZiAobUxvY2FsQnVmZmVyRnJhbWVDb3VudCA9PSAwKSB7CisgICAgICAgIHN0YXR1c190IHJlcyA9IG1UcmFja0J1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKHBCdWZmZXIsIHB0cyk7CisgICAgICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgICAgIGNvcHlGcmFtZXMocEJ1ZmZlci0+cmF3LCBwQnVmZmVyLT5yYXcsIHBCdWZmZXItPmZyYW1lQ291bnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSBwQnVmZmVyLT5mcmFtZUNvdW50OworICAgICAgICBzdGF0dXNfdCByZXMgPSBtVHJhY2tCdWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmbUJ1ZmZlciwgcHRzKTsKKyAgICAgICAgLy8gQXQgb25lIHRpbWUgYW4gdXBzdHJlYW0gYnVmZmVyIHByb3ZpZGVyIGhhZAorICAgICAgICAvLyByZXMgPT0gT0sgYW5kIG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwLCBkb2Vzbid0IHNlZW0gdG8gaGFwcGVuIG5vdyA3LzE4LzIwMTQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEJ5IEFQSSBzcGVjLCBpZiByZXMgIT0gT0ssIHRoZW4gbUJ1ZmZlci5mcmFtZUNvdW50ID09IDAuCisgICAgICAgIC8vIGJ1dCB0aGVyZSBtYXkgYmUgaW1wcm9wZXIgaW1wbGVtZW50YXRpb25zLgorICAgICAgICBBTE9HX0FTU0VSVChyZXMgPT0gT0sgfHwgbUJ1ZmZlci5mcmFtZUNvdW50ID09IDApOworICAgICAgICBpZiAocmVzICE9IE9LIHx8IG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSB7IC8vIG5vdCBuZWVkZWQgYnkgQVBJIHNwZWMsIGJ1dCB0byBiZSBzYWZlLgorICAgICAgICAgICAgcEJ1ZmZlci0+cmF3ID0gTlVMTDsKKyAgICAgICAgICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSAwOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBtQ29uc3VtZWQgPSAwOworICAgIH0KKyAgICBBTE9HX0FTU0VSVChtQ29uc3VtZWQgPCBtQnVmZmVyLmZyYW1lQ291bnQpOworICAgIHNpemVfdCBjb3VudCA9IG1pbihtTG9jYWxCdWZmZXJGcmFtZUNvdW50LCBtQnVmZmVyLmZyYW1lQ291bnQgLSBtQ29uc3VtZWQpOworICAgIGNvdW50ID0gbWluKGNvdW50LCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICBwQnVmZmVyLT5yYXcgPSBtTG9jYWxCdWZmZXJEYXRhOworICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSBjb3VudDsKKyAgICBjb3B5RnJhbWVzKHBCdWZmZXItPnJhdywgKHVpbnQ4X3QqKW1CdWZmZXIucmF3ICsgbUNvbnN1bWVkICogbUlucHV0RnJhbWVTaXplLAorICAgICAgICAgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCk7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIENvcHlCdWZmZXJQcm92aWRlcjo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgKnBCdWZmZXIpCit7CisgICAgLy9BTE9HVigiQ29weUJ1ZmZlclByb3ZpZGVyKCVwKTo6cmVsZWFzZUJ1ZmZlciglcCglenUpKSIsCisgICAgLy8gICAgICAgIHRoaXMsIHBCdWZmZXIsIHBCdWZmZXItPmZyYW1lQ291bnQpOworICAgIGlmIChtTG9jYWxCdWZmZXJGcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIocEJ1ZmZlcik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gTE9HX0FMV0FZU19GQVRBTF9JRihwQnVmZmVyLT5mcmFtZUNvdW50ID09IDAsICJJbnZhbGlkIGZyYW1lY291bnQiKTsKKyAgICBtQ29uc3VtZWQgKz0gcEJ1ZmZlci0+ZnJhbWVDb3VudDsgLy8gVE9ETzogdXBkYXRlIGZvciBlZmZpY2llbmN5IHRvIHJldXNlIGV4aXN0aW5nIGNvbnRlbnQKKyAgICBpZiAobUNvbnN1bWVkICE9IDAgJiYgbUNvbnN1bWVkID49IG1CdWZmZXIuZnJhbWVDb3VudCkgeworICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CisgICAgICAgIEFMT0dfQVNTRVJUKG1CdWZmZXIuZnJhbWVDb3VudCA9PSAwKTsKKyAgICB9CisgICAgcEJ1ZmZlci0+cmF3ID0gTlVMTDsKKyAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKK30KKwordm9pZCBDb3B5QnVmZmVyUHJvdmlkZXI6OnJlc2V0KCkKK3sKKyAgICBpZiAobUJ1ZmZlci5mcmFtZUNvdW50ICE9IDApIHsKKyAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOworICAgIH0KKyAgICBtQ29uc3VtZWQgPSAwOworfQorCitEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXIoCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGlucHV0Q2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dHB1dENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3Qgc2Vzc2lvbklkLCBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCkgOgorICAgICAgICBDb3B5QnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkgKiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soaW5wdXRDaGFubmVsTWFzayksCisgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkgKiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sob3V0cHV0Q2hhbm5lbE1hc2spLAorICAgICAgICAgICAgYnVmZmVyRnJhbWVDb3VudCkgIC8vIHNldCBidWZmZXJGcmFtZUNvdW50IHRvIDAgdG8gZG8gaW4tcGxhY2UKK3sKKyAgICBBTE9HVigiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoJXApKCUjeCwgJSN4LCAlI3ggJXUgJWQpIiwKKyAgICAgICAgICAgIHRoaXMsIGlucHV0Q2hhbm5lbE1hc2ssIG91dHB1dENoYW5uZWxNYXNrLCBmb3JtYXQsCisgICAgICAgICAgICBzYW1wbGVSYXRlLCBzZXNzaW9uSWQpOworICAgIGlmICghc0lzTXVsdGljaGFubmVsQ2FwYWJsZQorICAgICAgICAgICAgfHwgRWZmZWN0Q3JlYXRlKCZzRHdubUZ4RGVzYy51dWlkLAorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgIFNFU1NJT05fSURfSU5WQUxJRF9BTkRfSUdOT1JFRCwKKyAgICAgICAgICAgICAgICAgICAgJm1Eb3dubWl4SGFuZGxlKSAhPSAwKSB7CisgICAgICAgICBBTE9HRSgiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKSBlcnJvciBjcmVhdGluZyBkb3dubWl4ZXIgZWZmZWN0Iik7CisgICAgICAgICBtRG93bm1peEhhbmRsZSA9IE5VTEw7CisgICAgICAgICByZXR1cm47CisgICAgIH0KKyAgICAgLy8gY2hhbm5lbCBpbnB1dCBjb25maWd1cmF0aW9uIHdpbGwgYmUgb3ZlcnJpZGRlbiBwZXItdHJhY2sKKyAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBpbnB1dENoYW5uZWxNYXNrOyAgIC8vIEZJWE1FOiBTaG91bGQgYmUgYml0cworICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBvdXRwdXRDaGFubmVsTWFzazsgLy8gRklYTUU6IHNob3VsZCBiZSBiaXRzCisgICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IGZvcm1hdDsKKyAgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IGZvcm1hdDsKKyAgICAgbURvd25taXhDb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgIG1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOworICAgICBtRG93bm1peENvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFOworICAgICAvLyBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlciBwcm92aWRlciwgYW5kIGZyYW1lIGNvdW50IHdpbGwgbm90IGJlIHVzZWQgYXMgdGhlIGRvd25taXggZWZmZWN0CisgICAgIC8vIHByb2Nlc3MoKSBmdW5jdGlvbiBpcyBjYWxsZWQgZGlyZWN0bHkgKHNlZSBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcigpKQorICAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19TTVBfUkFURSB8IEVGRkVDVF9DT05GSUdfQ0hBTk5FTFMgfAorICAgICAgICAgICAgIEVGRkVDVF9DT05GSUdfRk9STUFUIHwgRUZGRUNUX0NPTkZJR19BQ0NfTU9ERTsKKyAgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLm1hc2sgPSBtRG93bm1peENvbmZpZy5pbnB1dENmZy5tYXNrOworCisgICAgIGludCBjbWRTdGF0dXM7CisgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihpbnQpOworCisgICAgIC8vIENvbmZpZ3VyZSBkb3dubWl4ZXIKKyAgICAgc3RhdHVzX3Qgc3RhdHVzID0gKCptRG93bm1peEhhbmRsZSktPmNvbW1hbmQobURvd25taXhIYW5kbGUsCisgICAgICAgICAgICAgRUZGRUNUX0NNRF9TRVRfQ09ORklHIC8qY21kQ29kZSovLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSAvKmNtZFNpemUqLywKKyAgICAgICAgICAgICAmbURvd25taXhDb25maWcgLypwQ21kRGF0YSovLAorICAgICAgICAgICAgICZyZXBseVNpemUsICZjbWRTdGF0dXMgLypwUmVwbHlEYXRhKi8pOworICAgICBpZiAoc3RhdHVzICE9IDAgfHwgY21kU3RhdHVzICE9IDApIHsKKyAgICAgICAgIEFMT0dFKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpIGVycm9yICVkIGNtZFN0YXR1cyAlZCB3aGlsZSBjb25maWd1cmluZyBkb3dubWl4ZXIiLAorICAgICAgICAgICAgICAgICBzdGF0dXMsIGNtZFN0YXR1cyk7CisgICAgICAgICBFZmZlY3RSZWxlYXNlKG1Eb3dubWl4SGFuZGxlKTsKKyAgICAgICAgIG1Eb3dubWl4SGFuZGxlID0gTlVMTDsKKyAgICAgICAgIHJldHVybjsKKyAgICAgfQorCisgICAgIC8vIEVuYWJsZSBkb3dubWl4ZXIKKyAgICAgcmVwbHlTaXplID0gc2l6ZW9mKGludCk7CisgICAgIHN0YXR1cyA9ICgqbURvd25taXhIYW5kbGUpLT5jb21tYW5kKG1Eb3dubWl4SGFuZGxlLAorICAgICAgICAgICAgIEVGRkVDVF9DTURfRU5BQkxFIC8qY21kQ29kZSovLCAwIC8qY21kU2l6ZSovLCBOVUxMIC8qcENtZERhdGEqLywKKyAgICAgICAgICAgICAmcmVwbHlTaXplLCAmY21kU3RhdHVzIC8qcFJlcGx5RGF0YSovKTsKKyAgICAgaWYgKHN0YXR1cyAhPSAwIHx8IGNtZFN0YXR1cyAhPSAwKSB7CisgICAgICAgICBBTE9HRSgiRG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKSBlcnJvciAlZCBjbWRTdGF0dXMgJWQgd2hpbGUgZW5hYmxpbmcgZG93bm1peGVyIiwKKyAgICAgICAgICAgICAgICAgc3RhdHVzLCBjbWRTdGF0dXMpOworICAgICAgICAgRWZmZWN0UmVsZWFzZShtRG93bm1peEhhbmRsZSk7CisgICAgICAgICBtRG93bm1peEhhbmRsZSA9IE5VTEw7CisgICAgICAgICByZXR1cm47CisgICAgIH0KKworICAgICAvLyBTZXQgZG93bm1peCB0eXBlCisgICAgIC8vIHBhcmFtZXRlciBzaXplIHJvdW5kZWQgZm9yIHBhZGRpbmcgb24gMzJiaXQgYm91bmRhcnkKKyAgICAgY29uc3QgaW50IHBzaXplUGFkZGVkID0gKChzaXplb2YoZG93bm1peF9wYXJhbXNfdCkgLSAxKS9zaXplb2YoaW50KSArIDEpICogc2l6ZW9mKGludCk7CisgICAgIGNvbnN0IGludCBkb3dubWl4UGFyYW1TaXplID0KKyAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcHNpemVQYWRkZWQgKyBzaXplb2YoZG93bm1peF90eXBlX3QpOworICAgICBlZmZlY3RfcGFyYW1fdCAqIGNvbnN0IHBhcmFtID0gKGVmZmVjdF9wYXJhbV90ICopIG1hbGxvYyhkb3dubWl4UGFyYW1TaXplKTsKKyAgICAgcGFyYW0tPnBzaXplID0gc2l6ZW9mKGRvd25taXhfcGFyYW1zX3QpOworICAgICBjb25zdCBkb3dubWl4X3BhcmFtc190IGRvd25taXhQYXJhbSA9IERPV05NSVhfUEFSQU1fVFlQRTsKKyAgICAgbWVtY3B5KHBhcmFtLT5kYXRhLCAmZG93bm1peFBhcmFtLCBwYXJhbS0+cHNpemUpOworICAgICBjb25zdCBkb3dubWl4X3R5cGVfdCBkb3dubWl4VHlwZSA9IERPV05NSVhfVFlQRV9GT0xEOworICAgICBwYXJhbS0+dnNpemUgPSBzaXplb2YoZG93bm1peF90eXBlX3QpOworICAgICBtZW1jcHkocGFyYW0tPmRhdGEgKyBwc2l6ZVBhZGRlZCwgJmRvd25taXhUeXBlLCBwYXJhbS0+dnNpemUpOworICAgICByZXBseVNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgc3RhdHVzID0gKCptRG93bm1peEhhbmRsZSktPmNvbW1hbmQobURvd25taXhIYW5kbGUsCisgICAgICAgICAgICAgRUZGRUNUX0NNRF9TRVRfUEFSQU0gLyogY21kQ29kZSAqLywgZG93bm1peFBhcmFtU2l6ZSAvKiBjbWRTaXplICovLAorICAgICAgICAgICAgIHBhcmFtIC8qcENtZERhdGEqLywgJnJlcGx5U2l6ZSwgJmNtZFN0YXR1cyAvKnBSZXBseURhdGEqLyk7CisgICAgIGZyZWUocGFyYW0pOworICAgICBpZiAoc3RhdHVzICE9IDAgfHwgY21kU3RhdHVzICE9IDApIHsKKyAgICAgICAgIEFMT0dFKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpIGVycm9yICVkIGNtZFN0YXR1cyAlZCB3aGlsZSBzZXR0aW5nIGRvd25taXggdHlwZSIsCisgICAgICAgICAgICAgICAgIHN0YXR1cywgY21kU3RhdHVzKTsKKyAgICAgICAgIEVmZmVjdFJlbGVhc2UobURvd25taXhIYW5kbGUpOworICAgICAgICAgbURvd25taXhIYW5kbGUgPSBOVUxMOworICAgICAgICAgcmV0dXJuOworICAgICB9CisgICAgIEFMT0dWKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpIGRvd25taXggdHlwZSBzZXQgdG8gJWQiLCAoaW50KSBkb3dubWl4VHlwZSk7Cit9CisKK0Rvd25taXhlckJ1ZmZlclByb3ZpZGVyOjp+RG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKQoreworICAgIEFMT0dWKCJ+RG93bm1peGVyQnVmZmVyUHJvdmlkZXIgKCVwKSIsIHRoaXMpOworICAgIEVmZmVjdFJlbGVhc2UobURvd25taXhIYW5kbGUpOworICAgIG1Eb3dubWl4SGFuZGxlID0gTlVMTDsKK30KKwordm9pZCBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6Y29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykKK3sKKyAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5idWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lczsKKyAgICBtRG93bm1peENvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3ID0gY29uc3RfY2FzdDx2b2lkICo+KHNyYyk7CisgICAgbURvd25taXhDb25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzOworICAgIG1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5idWZmZXIucmF3ID0gZHN0OworICAgIC8vIG1heSBiZSBpbi1wbGFjZSBpZiBzcmMgPT0gZHN0LgorICAgIHN0YXR1c190IHJlcyA9ICgqbURvd25taXhIYW5kbGUpLT5wcm9jZXNzKG1Eb3dubWl4SGFuZGxlLAorICAgICAgICAgICAgJm1Eb3dubWl4Q29uZmlnLmlucHV0Q2ZnLmJ1ZmZlciwgJm1Eb3dubWl4Q29uZmlnLm91dHB1dENmZy5idWZmZXIpOworICAgIEFMT0dFX0lGKHJlcyAhPSBPSywgIkRvd25taXhCdWZmZXJQcm92aWRlciBlcnJvciAlZCIsIHJlcyk7Cit9CisKKy8qIGNhbGwgb25jZSBpbiBhIHB0aHJlYWRfb25jZSBoYW5kbGVyLiAqLworLypzdGF0aWMqLyBzdGF0dXNfdCBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6aW5pdCgpCit7CisgICAgLy8gZmluZCBtdWx0aWNoYW5uZWwgZG93bm1peCBlZmZlY3QgaWYgd2UgaGF2ZSB0byBwbGF5IG11bHRpY2hhbm5lbCBjb250ZW50CisgICAgdWludDMyX3QgbnVtRWZmZWN0cyA9IDA7CisgICAgaW50IHJldCA9IEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygmbnVtRWZmZWN0cyk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJBdWRpb01peGVyKCkgZXJyb3IgJWQgcXVlcnlpbmcgbnVtYmVyIG9mIGVmZmVjdHMiLCByZXQpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQUxPR1YoIkVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cygpIG51bUVmZmVjdHM9JWQiLCBudW1FZmZlY3RzKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDAgOyBpIDwgbnVtRWZmZWN0cyA7IGkrKykgeworICAgICAgICBpZiAoRWZmZWN0UXVlcnlFZmZlY3QoaSwgJnNEd25tRnhEZXNjKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigiZWZmZWN0ICVkIGlzIGNhbGxlZCAlcyIsIGksIHNEd25tRnhEZXNjLm5hbWUpOworICAgICAgICAgICAgaWYgKG1lbWNtcCgmc0R3bm1GeERlc2MudHlwZSwgRUZGRUNUX1VJSURfRE9XTk1JWCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIGVmZmVjdCBcIiVzXCIgZnJvbSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBzRHdubUZ4RGVzYy5uYW1lLCBzRHdubUZ4RGVzYy5pbXBsZW1lbnRvcik7CisgICAgICAgICAgICAgICAgc0lzTXVsdGljaGFubmVsQ2FwYWJsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1dfSUYoIXNJc011bHRpY2hhbm5lbENhcGFibGUsICJ1bmFibGUgdG8gZmluZCBkb3dubWl4IGVmZmVjdCIpOworICAgIHJldHVybiBOT19JTklUOworfQorCisvKnN0YXRpYyovIGJvb2wgRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6OnNJc011bHRpY2hhbm5lbENhcGFibGUgPSBmYWxzZTsKKy8qc3RhdGljKi8gZWZmZWN0X2Rlc2NyaXB0b3JfdCBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6c0R3bm1GeERlc2M7CisKK1JlbWl4QnVmZmVyUHJvdmlkZXI6OlJlbWl4QnVmZmVyUHJvdmlkZXIoYXVkaW9fY2hhbm5lbF9tYXNrX3QgaW5wdXRDaGFubmVsTWFzaywKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0cHV0Q2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgc2l6ZV90IGJ1ZmZlckZyYW1lQ291bnQpIDoKKyAgICAgICAgQ29weUJ1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KQorICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhpbnB1dENoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkKKyAgICAgICAgICAgICAgICAgICAgKiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sob3V0cHV0Q2hhbm5lbE1hc2spLAorICAgICAgICAgICAgICAgIGJ1ZmZlckZyYW1lQ291bnQpLAorICAgICAgICBtRm9ybWF0KGZvcm1hdCksCisgICAgICAgIG1TYW1wbGVTaXplKGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSksCisgICAgICAgIG1JbnB1dENoYW5uZWxzKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhpbnB1dENoYW5uZWxNYXNrKSksCisgICAgICAgIG1PdXRwdXRDaGFubmVscyhhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sob3V0cHV0Q2hhbm5lbE1hc2spKQoreworICAgIEFMT0dWKCJSZW1peEJ1ZmZlclByb3ZpZGVyKCVwKSglI3gsICUjeCwgJSN4KSAlenUgJXp1IiwKKyAgICAgICAgICAgIHRoaXMsIGZvcm1hdCwgaW5wdXRDaGFubmVsTWFzaywgb3V0cHV0Q2hhbm5lbE1hc2ssCisgICAgICAgICAgICBtSW5wdXRDaGFubmVscywgbU91dHB1dENoYW5uZWxzKTsKKyAgICAodm9pZCkgbWVtY3B5X2J5X2luZGV4X2FycmF5X2luaXRpYWxpemF0aW9uX2Zyb21fY2hhbm5lbF9tYXNrKAorICAgICAgICAgICAgbUlkeEFyeSwgQVJSQVlfU0laRShtSWR4QXJ5KSwgb3V0cHV0Q2hhbm5lbE1hc2ssIGlucHV0Q2hhbm5lbE1hc2spOworfQorCit2b2lkIFJlbWl4QnVmZmVyUHJvdmlkZXI6OmNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpCit7CisgICAgbWVtY3B5X2J5X2luZGV4X2FycmF5KGRzdCwgbU91dHB1dENoYW5uZWxzLAorICAgICAgICAgICAgc3JjLCBtSW5wdXRDaGFubmVscywgbUlkeEFyeSwgbVNhbXBsZVNpemUsIGZyYW1lcyk7Cit9CisKK1JlZm9ybWF0QnVmZmVyUHJvdmlkZXI6OlJlZm9ybWF0QnVmZmVyUHJvdmlkZXIoaW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGlucHV0Rm9ybWF0LCBhdWRpb19mb3JtYXRfdCBvdXRwdXRGb3JtYXQsCisgICAgICAgIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KSA6CisgICAgICAgIENvcHlCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGlucHV0Rm9ybWF0KSwKKyAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG91dHB1dEZvcm1hdCksCisgICAgICAgICAgICAgICAgYnVmZmVyRnJhbWVDb3VudCksCisgICAgICAgIG1DaGFubmVsQ291bnQoY2hhbm5lbENvdW50KSwKKyAgICAgICAgbUlucHV0Rm9ybWF0KGlucHV0Rm9ybWF0KSwKKyAgICAgICAgbU91dHB1dEZvcm1hdChvdXRwdXRGb3JtYXQpCit7CisgICAgQUxPR1YoIlJlZm9ybWF0QnVmZmVyUHJvdmlkZXIoJXApKCV1LCAlI3gsICUjeCkiLAorICAgICAgICAgICAgdGhpcywgY2hhbm5lbENvdW50LCBpbnB1dEZvcm1hdCwgb3V0cHV0Rm9ybWF0KTsKK30KKwordm9pZCBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOjpjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKQoreworICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoZHN0LCBtT3V0cHV0Rm9ybWF0LCBzcmMsIG1JbnB1dEZvcm1hdCwgZnJhbWVzICogbUNoYW5uZWxDb3VudCk7Cit9CisKK1RpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI6OlRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIoaW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgdWludDMyX3Qgc2FtcGxlUmF0ZSwgY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSkgOgorICAgICAgICBtQ2hhbm5lbENvdW50KGNoYW5uZWxDb3VudCksCisgICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKKyAgICAgICAgbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksCisgICAgICAgIG1GcmFtZVNpemUoY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpKSwKKyAgICAgICAgbUxvY2FsQnVmZmVyRnJhbWVDb3VudCgwKSwKKyAgICAgICAgbUxvY2FsQnVmZmVyRGF0YShOVUxMKSwKKyAgICAgICAgbVJlbWFpbmluZygwKSwKKyAgICAgICAgbVNvbmljU3RyZWFtKHNvbmljQ3JlYXRlU3RyZWFtKHNhbXBsZVJhdGUsIG1DaGFubmVsQ291bnQpKSwKKyAgICAgICAgbUZhbGxiYWNrRmFpbEVycm9yU2hvd24oZmFsc2UpLAorICAgICAgICBtQXVkaW9QbGF5YmFja1JhdGVWYWxpZChmYWxzZSkKK3sKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1Tb25pY1N0cmVhbSA9PSBOVUxMLAorICAgICAgICAgICAgIlRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIgY2FuJ3QgYWxsb2NhdGUgU29uaWMgc3RyZWFtIik7CisKKyAgICBzZXRQbGF5YmFja1JhdGUocGxheWJhY2tSYXRlKTsKKyAgICBBTE9HVigiVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlciglcCkoJXUsICUjeCwgJXUgJWYgJWYgJWQgJWQpIiwKKyAgICAgICAgICAgIHRoaXMsIGNoYW5uZWxDb3VudCwgZm9ybWF0LCBzYW1wbGVSYXRlLCBwbGF5YmFja1JhdGUubVNwZWVkLAorICAgICAgICAgICAgcGxheWJhY2tSYXRlLm1QaXRjaCwgcGxheWJhY2tSYXRlLm1TdHJldGNoTW9kZSwgcGxheWJhY2tSYXRlLm1GYWxsYmFja01vZGUpOworICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IDA7Cit9CisKK1RpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI6On5UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyKCkKK3sKKyAgICBBTE9HVigiflRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIoJXApIiwgdGhpcyk7CisgICAgc29uaWNEZXN0cm95U3RyZWFtKG1Tb25pY1N0cmVhbSk7CisgICAgaWYgKG1CdWZmZXIuZnJhbWVDb3VudCAhPSAwKSB7CisgICAgICAgIG1UcmFja0J1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZtQnVmZmVyKTsKKyAgICB9CisgICAgZnJlZShtTG9jYWxCdWZmZXJEYXRhKTsKK30KKworc3RhdHVzX3QgVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcigKKyAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyICpwQnVmZmVyLCBpbnQ2NF90IHB0cykKK3sKKyAgICBBTE9HVigiVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlciglcCk6OmdldE5leHRCdWZmZXIoJXAgKCV6dSksICVsbGQpIiwKKyAgICAgICAgICAgIHRoaXMsIHBCdWZmZXIsIHBCdWZmZXItPmZyYW1lQ291bnQsIHB0cyk7CisKKyAgICAvLyBCWVBBU1MKKyAgICAvL3JldHVybiBtVHJhY2tCdWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcihwQnVmZmVyLCBwdHMpOworCisgICAgLy8gY2hlY2sgaWYgcHJldmlvdXNseSBwcm9jZXNzZWQgZGF0YSBpcyBzdWZmaWNpZW50LgorICAgIGlmIChwQnVmZmVyLT5mcmFtZUNvdW50IDw9IG1SZW1haW5pbmcpIHsKKyAgICAgICAgQUxPR1YoInByZXZpb3VzIHN1ZmZpY2llbnQiKTsKKyAgICAgICAgcEJ1ZmZlci0+cmF3ID0gbUxvY2FsQnVmZmVyRGF0YTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIGRvIHdlIG5lZWQgdG8gcmVzaXplIG91ciBidWZmZXI/CisgICAgaWYgKHBCdWZmZXItPmZyYW1lQ291bnQgPiBtTG9jYWxCdWZmZXJGcmFtZUNvdW50KSB7CisgICAgICAgIHZvaWQgKm5ld21lbTsKKyAgICAgICAgaWYgKHBvc2l4X21lbWFsaWduKCZuZXdtZW0sIDMyLCBwQnVmZmVyLT5mcmFtZUNvdW50ICogbUZyYW1lU2l6ZSkgPT0gT0spIHsKKyAgICAgICAgICAgIGlmIChtUmVtYWluaW5nICE9IDApIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkobmV3bWVtLCBtTG9jYWxCdWZmZXJEYXRhLCBtUmVtYWluaW5nICogbUZyYW1lU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlKG1Mb2NhbEJ1ZmZlckRhdGEpOworICAgICAgICAgICAgbUxvY2FsQnVmZmVyRGF0YSA9IG5ld21lbTsKKyAgICAgICAgICAgIG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQgPSBwQnVmZmVyLT5mcmFtZUNvdW50OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gbmVlZCB0byBmZXRjaCBtb3JlIGRhdGEKKyAgICBjb25zdCBzaXplX3Qgb3V0cHV0RGVzaXJlZCA9IHBCdWZmZXItPmZyYW1lQ291bnQgLSBtUmVtYWluaW5nOworICAgIHNpemVfdCBkc3RBdmFpbGFibGU7CisgICAgZG8geworICAgICAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSBtUGxheWJhY2tSYXRlLm1TcGVlZCA9PSBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9OT1JNQUwKKyAgICAgICAgICAgICAgICA/IG91dHB1dERlc2lyZWQgOiBvdXRwdXREZXNpcmVkICogbVBsYXliYWNrUmF0ZS5tU3BlZWQgKyAxOworCisgICAgICAgIHN0YXR1c190IHJlcyA9IG1UcmFja0J1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZtQnVmZmVyLCBwdHMpOworCisgICAgICAgIEFMT0dfQVNTRVJUKHJlcyA9PSBPSyB8fCBtQnVmZmVyLmZyYW1lQ291bnQgPT0gMCk7CisgICAgICAgIGlmIChyZXMgIT0gT0sgfHwgbUJ1ZmZlci5mcmFtZUNvdW50ID09IDApIHsgLy8gbm90IG5lZWRlZCBieSBBUEkgc3BlYywgYnV0IHRvIGJlIHNhZmUuCisgICAgICAgICAgICBBTE9HVigidXBzdHJlYW0gcHJvdmlkZXIgY2Fubm90IHByb3ZpZGUgZGF0YSIpOworICAgICAgICAgICAgaWYgKG1SZW1haW5pbmcgPT0gMCkgeworICAgICAgICAgICAgICAgIHBCdWZmZXItPnJhdyA9IE5VTEw7CisgICAgICAgICAgICAgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIHJldHVybiBwYXJ0aWFsIGNvdW50CisgICAgICAgICAgICAgICAgcEJ1ZmZlci0+cmF3ID0gbUxvY2FsQnVmZmVyRGF0YTsKKyAgICAgICAgICAgICAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gbVJlbWFpbmluZzsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB0aW1lLXN0cmV0Y2ggdGhlIGRhdGEKKyAgICAgICAgZHN0QXZhaWxhYmxlID0gbWluKG1Mb2NhbEJ1ZmZlckZyYW1lQ291bnQgLSBtUmVtYWluaW5nLCBvdXRwdXREZXNpcmVkKTsKKyAgICAgICAgc2l6ZV90IHNyY0F2YWlsYWJsZSA9IG1CdWZmZXIuZnJhbWVDb3VudDsKKyAgICAgICAgcHJvY2Vzc0ZyYW1lcygodWludDhfdCopbUxvY2FsQnVmZmVyRGF0YSArIG1SZW1haW5pbmcgKiBtRnJhbWVTaXplLCAmZHN0QXZhaWxhYmxlLAorICAgICAgICAgICAgICAgIG1CdWZmZXIucmF3LCAmc3JjQXZhaWxhYmxlKTsKKworICAgICAgICAvLyByZWxlYXNlIGFsbCBkYXRhIGNvbnN1bWVkCisgICAgICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IHNyY0F2YWlsYWJsZTsKKyAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJm1CdWZmZXIpOworICAgIH0gd2hpbGUgKGRzdEF2YWlsYWJsZSA9PSAwKTsgLy8gdHJ5IHVudGlsIHdlIGdldCBvdXRwdXQgZGF0YSBvciB1cHN0cmVhbSBwcm92aWRlciBmYWlscy4KKworICAgIC8vIHVwZGF0ZSBidWZmZXIgdmFycyB3aXRoIHRoZSBhY3R1YWwgZGF0YSBwcm9jZXNzZWQgYW5kIHJldHVybiB3aXRoIGJ1ZmZlcgorICAgIG1SZW1haW5pbmcgKz0gZHN0QXZhaWxhYmxlOworCisgICAgcEJ1ZmZlci0+cmF3ID0gbUxvY2FsQnVmZmVyRGF0YTsKKyAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gbVJlbWFpbmluZzsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciAqcEJ1ZmZlcikKK3sKKyAgICBBTE9HVigiVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlciglcCk6OnJlbGVhc2VCdWZmZXIoJXAgKCV6dSkpIiwKKyAgICAgICB0aGlzLCBwQnVmZmVyLCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKKworICAgIC8vIEJZUEFTUworICAgIC8vcmV0dXJuIG1UcmFja0J1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKHBCdWZmZXIpOworCisgICAgLy8gTE9HX0FMV0FZU19GQVRBTF9JRihwQnVmZmVyLT5mcmFtZUNvdW50ID09IDAsICJJbnZhbGlkIGZyYW1lY291bnQiKTsKKyAgICBpZiAocEJ1ZmZlci0+ZnJhbWVDb3VudCA8IG1SZW1haW5pbmcpIHsKKyAgICAgICAgbWVtY3B5KG1Mb2NhbEJ1ZmZlckRhdGEsCisgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKW1Mb2NhbEJ1ZmZlckRhdGEgKyBwQnVmZmVyLT5mcmFtZUNvdW50ICogbUZyYW1lU2l6ZSwKKyAgICAgICAgICAgICAgICAobVJlbWFpbmluZyAtIHBCdWZmZXItPmZyYW1lQ291bnQpICogbUZyYW1lU2l6ZSk7CisgICAgICAgIG1SZW1haW5pbmcgLT0gcEJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICB9IGVsc2UgaWYgKHBCdWZmZXItPmZyYW1lQ291bnQgPT0gbVJlbWFpbmluZykgeworICAgICAgICBtUmVtYWluaW5nID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJSZWxlYXNpbmcgbW9yZSBmcmFtZXMoJXp1KSB0aGFuIGF2YWlsYWJsZSglenUpIiwKKyAgICAgICAgICAgICAgICBwQnVmZmVyLT5mcmFtZUNvdW50LCBtUmVtYWluaW5nKTsKKyAgICB9CisKKyAgICBwQnVmZmVyLT5yYXcgPSBOVUxMOworICAgIHBCdWZmZXItPmZyYW1lQ291bnQgPSAwOworfQorCit2b2lkIFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI6OnJlc2V0KCkKK3sKKyAgICBtUmVtYWluaW5nID0gMDsKK30KKworc3RhdHVzX3QgVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjo6c2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpCit7CisgICAgbVBsYXliYWNrUmF0ZSA9IHBsYXliYWNrUmF0ZTsKKyAgICBtRmFsbGJhY2tGYWlsRXJyb3JTaG93biA9IGZhbHNlOworICAgIHNvbmljU2V0U3BlZWQobVNvbmljU3RyZWFtLCBtUGxheWJhY2tSYXRlLm1TcGVlZCk7CisgICAgLy9UT0RPOiBwaXRjaCBpcyBpZ25vcmVkIGZvciBub3cKKyAgICAvL1RPRE86IG9wdGltaXplOiBpZiBwYXJhbWV0ZXJzIGFyZSB0aGUgc2FtZSwgZG9uJ3QgZG8gYW55IGV4dHJhIGNvbXB1dGF0aW9uLgorCisgICAgbUF1ZGlvUGxheWJhY2tSYXRlVmFsaWQgPSBpc0F1ZGlvUGxheWJhY2tSYXRlVmFsaWQobVBsYXliYWNrUmF0ZSk7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI6OnByb2Nlc3NGcmFtZXModm9pZCAqZHN0QnVmZmVyLCBzaXplX3QgKmRzdEZyYW1lcywKKyAgICAgICAgY29uc3Qgdm9pZCAqc3JjQnVmZmVyLCBzaXplX3QgKnNyY0ZyYW1lcykKK3sKKyAgICBBTE9HVigicHJvY2Vzc0ZyYW1lcyglenUgJXp1KSAgcmVtYWluaW5nKCV6dSkiLCAqZHN0RnJhbWVzLCAqc3JjRnJhbWVzLCBtUmVtYWluaW5nKTsKKyAgICAvLyBOb3RlIGRzdEZyYW1lcyBpcyB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGZyYW1lcy4KKworICAgIC8vIEVuc3VyZSBjb25zdW1wdGlvbiBmcm9tIHNyYyBpcyBhcyBleHBlY3RlZC4KKyAgICAvL1RPRE86IGFkZCBsb2dpYyB0byB0cmFjayAidmVyeSBhY2N1cmF0ZSIgY29uc3VtcHRpb24gcmVsYXRlZCB0byBzcGVlZCwgb3JpZ2luYWwgc2FtcGxpbmcKKyAgICAvL3JhdGUsIGFjdHVhbCBmcmFtZXMgcHJvY2Vzc2VkLgorICAgIGNvbnN0IHNpemVfdCB0YXJnZXRTcmMgPSAqZHN0RnJhbWVzICogbVBsYXliYWNrUmF0ZS5tU3BlZWQ7CisgICAgaWYgKCpzcmNGcmFtZXMgPCB0YXJnZXRTcmMpIHsgLy8gbGltaXQgZHN0IGZyYW1lcyB0byB0aGF0IHBvc3NpYmxlCisgICAgICAgICpkc3RGcmFtZXMgPSAqc3JjRnJhbWVzIC8gbVBsYXliYWNrUmF0ZS5tU3BlZWQ7CisgICAgfSBlbHNlIGlmICgqc3JjRnJhbWVzID4gdGFyZ2V0U3JjICsgMSkgeworICAgICAgICAqc3JjRnJhbWVzID0gdGFyZ2V0U3JjICsgMTsKKyAgICB9CisKKyAgICBpZiAoIW1BdWRpb1BsYXliYWNrUmF0ZVZhbGlkKSB7CisgICAgICAgIC8vZmFsbGJhY2sgbW9kZQorICAgICAgICBpZiAoKmRzdEZyYW1lcyA+IDApIHsKKyAgICAgICAgICAgIHN3aXRjaChtUGxheWJhY2tSYXRlLm1GYWxsYmFja01vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgQVVESU9fVElNRVNUUkVUQ0hfRkFMTEJBQ0tfQ1VUX1JFUEVBVDoKKyAgICAgICAgICAgICAgICBpZiAoKmRzdEZyYW1lcyA8PSAqc3JjRnJhbWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvcHlTaXplID0gbUZyYW1lU2l6ZSAqICpkc3RGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRzdEJ1ZmZlciwgc3JjQnVmZmVyLCBjb3B5U2l6ZSk7CisgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgIC8vIGN5Y2xpY2FsbHkgcmVwZWF0IHRoZSBzb3VyY2UuCisgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgY291bnQgPSAwOyBjb3VudCA8ICpkc3RGcmFtZXM7IGNvdW50ICs9ICpzcmNGcmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlbWFpbmluZyA9IG1pbigqc3JjRnJhbWVzLCAqZHN0RnJhbWVzIC0gY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHVpbnQ4X3QqKWRzdEJ1ZmZlciArIG1GcmFtZVNpemUgKiBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNCdWZmZXIsIG1GcmFtZVNpemUgKiByZW1haW5pbmcpOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVVESU9fVElNRVNUUkVUQ0hfRkFMTEJBQ0tfREVGQVVMVDoKKyAgICAgICAgICAgIGNhc2UgQVVESU9fVElNRVNUUkVUQ0hfRkFMTEJBQ0tfTVVURToKKyAgICAgICAgICAgICAgICBtZW1zZXQoZHN0QnVmZmVyLDAsIG1GcmFtZVNpemUgKiAqZHN0RnJhbWVzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVVESU9fVElNRVNUUkVUQ0hfRkFMTEJBQ0tfRkFJTDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYoIW1GYWxsYmFja0ZhaWxFcnJvclNob3duKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIHBhcmFtZXRlcnMgaW4gVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlciBmYWxsYmFja01vZGU6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1JhdGUubUZhbGxiYWNrTW9kZSk7CisgICAgICAgICAgICAgICAgICAgIG1GYWxsYmFja0ZhaWxFcnJvclNob3duID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKG1Gb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgaWYgKHNvbmljV3JpdGVGbG9hdFRvU3RyZWFtKG1Tb25pY1N0cmVhbSwgKGZsb2F0KilzcmNCdWZmZXIsICpzcmNGcmFtZXMpICE9IDEpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgic29uaWNXcml0ZUZsb2F0VG9TdHJlYW0gY2Fubm90IHJlYWxsb2MiKTsKKyAgICAgICAgICAgICAgICAqc3JjRnJhbWVzID0gMDsgLy8gY2Fubm90IGNvbnN1bWUgYWxsIG9mIHNyY0J1ZmZlcgorICAgICAgICAgICAgfQorICAgICAgICAgICAgKmRzdEZyYW1lcyA9IHNvbmljUmVhZEZsb2F0RnJvbVN0cmVhbShtU29uaWNTdHJlYW0sIChmbG9hdCopZHN0QnVmZmVyLCAqZHN0RnJhbWVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgaWYgKHNvbmljV3JpdGVTaG9ydFRvU3RyZWFtKG1Tb25pY1N0cmVhbSwgKHNob3J0KilzcmNCdWZmZXIsICpzcmNGcmFtZXMpICE9IDEpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgic29uaWNXcml0ZVNob3J0VG9TdHJlYW0gY2Fubm90IHJlYWxsb2MiKTsKKyAgICAgICAgICAgICAgICAqc3JjRnJhbWVzID0gMDsgLy8gY2Fubm90IGNvbnN1bWUgYWxsIG9mIHNyY0J1ZmZlcgorICAgICAgICAgICAgfQorICAgICAgICAgICAgKmRzdEZyYW1lcyA9IHNvbmljUmVhZFNob3J0RnJvbVN0cmVhbShtU29uaWNTdHJlYW0sIChzaG9ydCopZHN0QnVmZmVyLCAqZHN0RnJhbWVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gY291bGQgYWxzbyBiZSBjYXVnaHQgb24gY29uc3RydWN0aW9uCisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJpbnZhbGlkIGZvcm1hdCAlI3ggZm9yIFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIiLCBtRm9ybWF0KTsKKyAgICAgICAgfQorICAgIH0KK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9CdWZmZXJQcm92aWRlcnMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9CdWZmZXJQcm92aWRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmM4OTVjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0J1ZmZlclByb3ZpZGVycy5oCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0JVRkZFUl9QUk9WSURFUlNfSAorI2RlZmluZSBBTkRST0lEX0JVRkZFUl9QUk9WSURFUlNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c29uaWMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQXVkaW9CdWZmZXJQcm92aWRlciB7CitwdWJsaWM6CisgICAgUGFzc3RocnVCdWZmZXJQcm92aWRlcigpIDogbVRyYWNrQnVmZmVyUHJvdmlkZXIoTlVMTCkgeyB9CisKKyAgICB2aXJ0dWFsIH5QYXNzdGhydUJ1ZmZlclByb3ZpZGVyKCkgeyB9CisKKyAgICAvLyBjYWxsIHRoaXMgdG8gcmVsZWFzZSB0aGUgYnVmZmVyIHRvIHRoZSB1cHN0cmVhbSBwcm92aWRlci4KKyAgICAvLyB0cmVhdCBpdCBhcyBhbiBhdWRpbyBkaXNjb250aW51aXR5IGZvciBmdXR1cmUgc2FtcGxlcy4KKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKSB7IH0KKworICAgIC8vIHNldCB0aGUgdXBzdHJlYW0gYnVmZmVyIHByb3ZpZGVyLiBDb25zaWRlciBjYWxsaW5nICJyZXNldCIgYmVmb3JlIHRoaXMgZnVuY3Rpb24uCisgICAgdmlydHVhbCB2b2lkIHNldEJ1ZmZlclByb3ZpZGVyKEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnApIHsKKyAgICAgICAgbVRyYWNrQnVmZmVyUHJvdmlkZXIgPSBwOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKm1UcmFja0J1ZmZlclByb3ZpZGVyOworfTsKKworLy8gQmFzZSBBdWRpb0J1ZmZlclByb3ZpZGVyIGNsYXNzIHVzZWQgZm9yIERvd25NaXhlckJ1ZmZlclByb3ZpZGVyLCBSZW1peEJ1ZmZlclByb3ZpZGVyLAorLy8gYW5kIFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuCisvLyBJdCBoYW5kbGVzIGEgcHJpdmF0ZSBidWZmZXIgZm9yIHVzZSBpbiBjb252ZXJ0aW5nIGZvcm1hdCBvciBjaGFubmVsIG1hc2tzIGZyb20gdGhlCisvLyBpbnB1dCBkYXRhIHRvIGEgZm9ybSBhY2NlcHRhYmxlIGJ5IHRoZSBtaXhlci4KKy8vIFRPRE86IE1ha2UgYSBSZXNhbXBsZXJCdWZmZXJQcm92aWRlciB3aGVuIGludGVnZXJzIGFyZSBlbnRpcmVseSByZW1vdmVkIGZyb20gdGhlCisvLyBwcm9jZXNzaW5nIHBpcGVsaW5lLgorY2xhc3MgQ29weUJ1ZmZlclByb3ZpZGVyIDogcHVibGljIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIgeworcHVibGljOgorICAgIC8vIFVzZSBhIHByaXZhdGUgYnVmZmVyIG9mIGJ1ZmZlckZyYW1lQ291bnQgZnJhbWVzIChlYWNoIGZyYW1lIGlzIG91dHB1dEZyYW1lU2l6ZSBieXRlcykuCisgICAgLy8gSWYgYnVmZmVyRnJhbWVDb3VudCBpcyAwLCBubyBwcml2YXRlIGJ1ZmZlciBpcyBjcmVhdGVkIGFuZCBpbi1wbGFjZSBtb2RpZmljYXRpb24gb2YKKyAgICAvLyB0aGUgdXBzdHJlYW0gYnVmZmVyIHByb3ZpZGVyJ3MgYnVmZmVycyBpcyBwZXJmb3JtZWQgYnkgY29weUZyYW1lcygpLgorICAgIENvcHlCdWZmZXJQcm92aWRlcihzaXplX3QgaW5wdXRGcmFtZVNpemUsIHNpemVfdCBvdXRwdXRGcmFtZVNpemUsCisgICAgICAgICAgICBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCk7CisgICAgdmlydHVhbCB+Q29weUJ1ZmZlclByb3ZpZGVyKCk7CisKKyAgICAvLyBPdmVycmlkZXMgQXVkaW9CdWZmZXJQcm92aWRlciBtZXRob2RzCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEJ1ZmZlciAqYnVmZmVyLCBpbnQ2NF90IHB0cyk7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VCdWZmZXIoQnVmZmVyICpidWZmZXIpOworCisgICAgLy8gT3ZlcnJpZGVzIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIKKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKworICAgIC8vIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHN1cHBsaWVkIGJ5IHRoZSBkZXJpdmVkIGNsYXNzLiAgSXQgY29udmVydHMKKyAgICAvLyAjZnJhbWVzIGluIHRoZSAqc3JjIHBvaW50ZXIgdG8gdGhlICpkc3QgcG9pbnRlci4gIEl0IGlzIHB1YmxpYyBiZWNhdXNlCisgICAgLy8gc29tZSBwcm92aWRlcnMgd2lsbCBhbGxvdyB0aGlzIHRvIHdvcmsgb24gYXJiaXRyYXJ5IGJ1ZmZlcnMgb3V0c2lkZQorICAgIC8vIG9mIHRoZSBpbnRlcm5hbCBidWZmZXJzLgorICAgIHZpcnR1YWwgdm9pZCBjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtSW5wdXRGcmFtZVNpemU7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbU91dHB1dEZyYW1lU2l6ZTsKK3ByaXZhdGU6CisgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIG1CdWZmZXI7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUxvY2FsQnVmZmVyRnJhbWVDb3VudDsKKyAgICB2b2lkICAgICAgICAgICAgICAgICptTG9jYWxCdWZmZXJEYXRhOworICAgIHNpemVfdCAgICAgICAgICAgICAgIG1Db25zdW1lZDsKK307CisKKy8vIERvd25taXhlckJ1ZmZlclByb3ZpZGVyIGRlcml2ZXMgZnJvbSBDb3B5QnVmZmVyUHJvdmlkZXIgdG8gcHJvdmlkZQorLy8gcG9zaXRpb24gZGVwZW5kZW50IGRvd25taXhpbmcgYnkgYW4gQXVkaW8gRWZmZWN0LgorY2xhc3MgRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKK3B1YmxpYzoKKyAgICBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcihhdWRpb19jaGFubmVsX21hc2tfdCBpbnB1dENoYW5uZWxNYXNrLAorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0cHV0Q2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3Qgc2Vzc2lvbklkLCBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCk7CisgICAgdmlydHVhbCB+RG93bm1peGVyQnVmZmVyUHJvdmlkZXIoKTsKKyAgICAvL092ZXJyaWRlcworICAgIHZpcnR1YWwgdm9pZCBjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKTsKKworICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1Eb3dubWl4SGFuZGxlICE9IE5VTEw7IH0KKyAgICBzdGF0aWMgc3RhdHVzX3QgaW5pdCgpOworICAgIHN0YXRpYyBib29sIGlzTXVsdGljaGFubmVsQ2FwYWJsZSgpIHsgcmV0dXJuIHNJc011bHRpY2hhbm5lbENhcGFibGU7IH0KKworcHJvdGVjdGVkOgorICAgIGVmZmVjdF9oYW5kbGVfdCAgICBtRG93bm1peEhhbmRsZTsKKyAgICBlZmZlY3RfY29uZmlnX3QgICAgbURvd25taXhDb25maWc7CisKKyAgICAvLyBlZmZlY3QgZGVzY3JpcHRvciBmb3IgdGhlIGRvd25taXhlciB1c2VkIGJ5IHRoZSBtaXhlcgorICAgIHN0YXRpYyBlZmZlY3RfZGVzY3JpcHRvcl90IHNEd25tRnhEZXNjOworICAgIC8vIGluZGljYXRlcyB3aGV0aGVyIGEgZG93bm1peCBlZmZlY3QgaGFzIGJlZW4gZm91bmQgYW5kIGlzIHVzYWJsZSBieSB0aGlzIG1peGVyCisgICAgc3RhdGljIGJvb2wgICAgICAgICAgICAgICAgc0lzTXVsdGljaGFubmVsQ2FwYWJsZTsKKyAgICAvLyBGSVhNRTogc2hvdWxkIHdlIGFsbG93IGVmZmVjdHMgb3V0c2lkZSBvZiB0aGUgZnJhbWV3b3JrPworICAgIC8vIFdlIG5lZWQgdG8gaGVyZS4gQSBzcGVjaWFsIGlvSWQgdGhhdCBtdXN0IGJlIDw9IC0yIHNvIGl0IGRvZXMgbm90IG1hcCB0byBhIHNlc3Npb24uCisgICAgc3RhdGljIGNvbnN0IGludDMyX3QgU0VTU0lPTl9JRF9JTlZBTElEX0FORF9JR05PUkVEID0gLTI7Cit9OworCisvLyBSZW1peEJ1ZmZlclByb3ZpZGVyIGRlcml2ZXMgZnJvbSBDb3B5QnVmZmVyUHJvdmlkZXIgdG8gcGVyZm9ybSBhbgorLy8gdXBtaXggb3IgZG93bm1peCB0byB0aGUgcHJvcGVyIGNoYW5uZWwgY291bnQgYW5kIG1hc2suCitjbGFzcyBSZW1peEJ1ZmZlclByb3ZpZGVyIDogcHVibGljIENvcHlCdWZmZXJQcm92aWRlciB7CitwdWJsaWM6CisgICAgUmVtaXhCdWZmZXJQcm92aWRlcihhdWRpb19jaGFubmVsX21hc2tfdCBpbnB1dENoYW5uZWxNYXNrLAorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgb3V0cHV0Q2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgIHNpemVfdCBidWZmZXJGcmFtZUNvdW50KTsKKyAgICAvL092ZXJyaWRlcworICAgIHZpcnR1YWwgdm9pZCBjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKTsKKworcHJvdGVjdGVkOgorICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbVNhbXBsZVNpemU7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUlucHV0Q2hhbm5lbHM7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbU91dHB1dENoYW5uZWxzOworICAgIGludDhfdCAgICAgICAgICAgICAgIG1JZHhBcnlbc2l6ZW9mKHVpbnQzMl90KSAqIDhdOyAvLyAzMiBiaXRzID0+IGNoYW5uZWwgaW5kaWNlcworfTsKKworLy8gUmVmb3JtYXRCdWZmZXJQcm92aWRlciBkZXJpdmVzIGZyb20gQ29weUJ1ZmZlclByb3ZpZGVyIHRvIGNvbnZlcnQgdGhlIGlucHV0IGRhdGEKKy8vIHRvIGFuIGFjY2VwdGFibGUgbWl4ZXIgaW5wdXQgZm9ybWF0IHR5cGUuCitjbGFzcyBSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyIDogcHVibGljIENvcHlCdWZmZXJQcm92aWRlciB7CitwdWJsaWM6CisgICAgUmVmb3JtYXRCdWZmZXJQcm92aWRlcihpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGlucHV0Rm9ybWF0LCBhdWRpb19mb3JtYXRfdCBvdXRwdXRGb3JtYXQsCisgICAgICAgICAgICBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCk7CisgICAgdmlydHVhbCB2b2lkIGNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpOworCitwcm90ZWN0ZWQ6CisgICAgY29uc3QgdWludDMyX3QgICAgICAgbUNoYW5uZWxDb3VudDsKKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtSW5wdXRGb3JtYXQ7CisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgbU91dHB1dEZvcm1hdDsKK307CisKKy8vIFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIgZGVyaXZlcyBmcm9tIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIgZm9yIHRpbWUgc3RyZXRjaGluZworY2xhc3MgVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyIHsKK3B1YmxpYzoKKyAgICBUaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyKGludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgICAgICAgICAgY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSk7CisgICAgdmlydHVhbCB+VGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcigpOworCisgICAgLy8gT3ZlcnJpZGVzIEF1ZGlvQnVmZmVyUHJvdmlkZXIgbWV0aG9kcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIGJ1ZmZlciwgaW50NjRfdCBwdHMpOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQnVmZmVyKEJ1ZmZlciogYnVmZmVyKTsKKworICAgIC8vIE92ZXJyaWRlcyBQYXNzdGhydUJ1ZmZlclByb3ZpZGVyCisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKTsKKworICAgIC8vIHByb2Nlc3NlcyBmcmFtZXMKKyAgICAvLyBkc3RCdWZmZXIgaXMgd2hlcmUgdG8gcGxhY2UgdGhlIGRhdGEKKyAgICAvLyBkc3RGcmFtZXMgW2luL291dF0gaXMgdGhlIGRlc2lyZWQgZnJhbWVzIChyZXR1cm4gd2l0aCBhY3R1YWwgcGxhY2VkIGluIGJ1ZmZlcikKKyAgICAvLyBzcmNCdWZmZXIgaXMgdGhlIHNvdXJjZSBkYXRhCisgICAgLy8gc3JjRnJhbWVzIFtpbi9vdXRdIGlzIHRoZSBhdmFpbGFibGUgc291cmNlIGZyYW1lcyAocmV0dXJuIHdpdGggY29uc3VtZWQpCisgICAgdmlydHVhbCB2b2lkIHByb2Nlc3NGcmFtZXModm9pZCAqZHN0QnVmZmVyLCBzaXplX3QgKmRzdEZyYW1lcywKKyAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNyY0J1ZmZlciwgc2l6ZV90ICpzcmNGcmFtZXMpOworCitwcm90ZWN0ZWQ6CisgICAgY29uc3QgdWludDMyX3QgICAgICAgbUNoYW5uZWxDb3VudDsKKyAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBtRm9ybWF0OworICAgIGNvbnN0IHVpbnQzMl90ICAgICAgIG1TYW1wbGVSYXRlOyAvLyBjb25zdCBmb3Igbm93IChUT0RPIGNoYW5nZSB0aGlzKQorICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1GcmFtZVNpemU7CisgICAgQXVkaW9QbGF5YmFja1JhdGUgICAgbVBsYXliYWNrUmF0ZTsKKworcHJpdmF0ZToKKyAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgbUJ1ZmZlcjsgICAgICAgICAgLy8gZm9yIHVwc3RyZWFtIHJlcXVlc3QKKyAgICBzaXplX3QgICAgICAgICAgICAgICBtTG9jYWxCdWZmZXJGcmFtZUNvdW50OyAgLy8gc2l6ZSBvZiBsb2NhbCBidWZmZXIKKyAgICB2b2lkICAgICAgICAgICAgICAgICptTG9jYWxCdWZmZXJEYXRhOyAgICAgICAgLy8gaW50ZXJuYWxseSBhbGxvY2F0ZWQgYnVmZmVyIGZvciBkYXRhIHJldHVybmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGNhbGxlcgorICAgIHNpemVfdCAgICAgICAgICAgICAgIG1SZW1haW5pbmc7ICAgICAgICAgICAgICAvLyByZW1haW5pbmcgZGF0YSBpbiBsb2NhbCBidWZmZXIKKyAgICBzb25pY1N0cmVhbSAgICAgICAgICBtU29uaWNTdHJlYW07ICAgICAgICAgICAgLy8gaGFuZGxlIHRvIHNvbmljIHRpbWVzdHJldGNoIG9iamVjdAorICAgIC8vRklYTUU6IHRoaXMgZGVwZW5kZW5jeSBzaG91bGQgYmUgYWJzdHJhY3RlZCBvdXQKKyAgICBib29sICAgICAgICAgICAgICAgICBtRmFsbGJhY2tGYWlsRXJyb3JTaG93bjsgLy8gbG9nIGZhbGxiYWNrIGVycm9yIG9ubHkgb25jZQorICAgIGJvb2wgICAgICAgICAgICAgICAgIG1BdWRpb1BsYXliYWNrUmF0ZVZhbGlkOyAvLyBmbGFnIGZvciBjdXJyZW50IHBhcmFtZXRlcnMgdmFsaWRpdHkKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfQlVGRkVSX1BST1ZJREVSU19ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQ29uZmlndXJhdGlvbi5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0NvbmZpZ3VyYXRpb24uaAppbmRleCA2YThhZWIxLi44NDU2OTdhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQ29uZmlndXJhdGlvbi5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9Db25maWd1cmF0aW9uLmgKQEAgLTI5LDkgKzI5LDggQEAKIC8vIHVuY29tbWVudCB0byBkaXNwbGF5IENQVSBsb2FkIGFkanVzdGVkIGZvciBDUFUgZnJlcXVlbmN5CiAvLyNkZWZpbmUgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCiAKLS8vIHVuY29tbWVudCB0byBlbmFibGUgZmFzdCBtaXhlciB0byB0YWtlIHBlcmZvcm1hbmNlIHNhbXBsZXMgZm9yIGxhdGVyIHN0YXRpc3RpY2FsIGFuYWx5c2lzCi0jZGVmaW5lIEZBU1RfTUlYRVJfU1RBVElTVElDUwotLy8gRklYTUUgcmVuYW1lIHRvIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKKy8vIHVuY29tbWVudCB0byBlbmFibGUgZmFzdCB0aHJlYWRzIHRvIHRha2UgcGVyZm9ybWFuY2Ugc2FtcGxlcyBmb3IgbGF0ZXIgc3RhdGlzdGljYWwgYW5hbHlzaXMKKyNkZWZpbmUgRkFTVF9USFJFQURfU1RBVElTVElDUwogCiAvLyB1bmNvbW1lbnQgZm9yIGRlYnVnZ2luZyB0aW1pbmcgcHJvYmxlbXMgcmVsYXRlZCB0byBTdGF0ZVF1ZXVlOjpwdXNoKCkKIC8vI2RlZmluZSBTVEFURV9RVUVVRV9EVU1QCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKaW5kZXggMmRkNmZmNS4uZjg3YjhmNTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKQEAgLTMzNSwxMyArMzM1LDIxIEBACiAKICAgICAvLyBUT0RPOiBoYW5kbGUgY29uZmlndXJhdGlvbiBvZiBlZmZlY3RzIHJlcGxhY2luZyB0cmFjayBwcm9jZXNzCiAgICAgY2hhbm5lbE1hc2sgPSB0aHJlYWQtPmNoYW5uZWxNYXNrKCk7CisgICAgbUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBjaGFubmVsTWFzazsKIAogICAgIGlmICgobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7CiAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9NT05POwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBjaGFubmVsTWFzazsKKyAgICAgICAgLy8gVE9ETzogVXBkYXRlIHRoaXMgbG9naWMgd2hlbiBtdWx0aWNoYW5uZWwgZWZmZWN0cyBhcmUgaW1wbGVtZW50ZWQuCisgICAgICAgIC8vIEZvciBvZmZsb2FkZWQgdHJhY2tzIGNvbnNpZGVyIG1vbm8gb3V0cHV0IGFzIHN0ZXJlbyBmb3IgcHJvcGVyIGVmZmVjdCBpbml0aWFsaXphdGlvbgorICAgICAgICBpZiAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTykgeworICAgICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgICAgICAgICAgQUxPR1YoIk92ZXJyaWRpbmcgZWZmZWN0IGlucHV0IGFuZCBvdXRwdXQgYXMgU1RFUkVPIik7CisgICAgICAgIH0KICAgICB9Ci0gICAgbUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBjaGFubmVsTWFzazsKKwogICAgIG1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgbUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgbUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSB0aHJlYWQtPnNhbXBsZVJhdGUoKTsKQEAgLTE5ODIsNCArMTk5MCw0IEBACiAgICAgfQogfQogCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAKaW5kZXggOTYxM2UyNi4uMWJiYTVmNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwCkBAIC0yOSwxOCArMjksMTggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0vKnN0YXRpYyovIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgRmFzdENhcHR1cmU6OmluaXRpYWw7CisvKnN0YXRpYyovIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgRmFzdENhcHR1cmU6OnNJbml0aWFsOwogCiBGYXN0Q2FwdHVyZTo6RmFzdENhcHR1cmUoKSA6IEZhc3RUaHJlYWQoKSwKLSAgICBpbnB1dFNvdXJjZShOVUxMKSwgaW5wdXRTb3VyY2VHZW4oMCksIHBpcGVTaW5rKE5VTEwpLCBwaXBlU2lua0dlbigwKSwKLSAgICByZWFkQnVmZmVyKE5VTEwpLCByZWFkQnVmZmVyU3RhdGUoLTEpLCBmb3JtYXQoRm9ybWF0X0ludmFsaWQpLCBzYW1wbGVSYXRlKDApLAotICAgIC8vIGR1bW15RHVtcFN0YXRlCi0gICAgdG90YWxOYXRpdmVGcmFtZXNSZWFkKDApCisgICAgbUlucHV0U291cmNlKE5VTEwpLCBtSW5wdXRTb3VyY2VHZW4oMCksIG1QaXBlU2luayhOVUxMKSwgbVBpcGVTaW5rR2VuKDApLAorICAgIG1SZWFkQnVmZmVyKE5VTEwpLCBtUmVhZEJ1ZmZlclN0YXRlKC0xKSwgbUZvcm1hdChGb3JtYXRfSW52YWxpZCksIG1TYW1wbGVSYXRlKDApLAorICAgIC8vIG1EdW1teUR1bXBTdGF0ZQorICAgIG1Ub3RhbE5hdGl2ZUZyYW1lc1JlYWQoMCkKIHsKLSAgICBwcmV2aW91cyA9ICZpbml0aWFsOwotICAgIGN1cnJlbnQgPSAmaW5pdGlhbDsKKyAgICBtUHJldmlvdXMgPSAmc0luaXRpYWw7CisgICAgbUN1cnJlbnQgPSAmc0luaXRpYWw7CiAKLSAgICBtRHVtbXlEdW1wU3RhdGUgPSAmZHVtbXlEdW1wU3RhdGU7CisgICAgbUR1bW15RHVtcFN0YXRlID0gJm1EdW1teUZhc3RDYXB0dXJlRHVtcFN0YXRlOwogfQogCiBGYXN0Q2FwdHVyZTo6fkZhc3RDYXB0dXJlKCkKQEAgLTYzLDEzICs2MywxMyBAQAogCiB2b2lkIEZhc3RDYXB0dXJlOjpvbklkbGUoKQogewotICAgIHByZUlkbGUgPSAqKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKiljdXJyZW50OwotICAgIGN1cnJlbnQgPSAmcHJlSWRsZTsKKyAgICBtUHJlSWRsZSA9ICooY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqKW1DdXJyZW50OworICAgIG1DdXJyZW50ID0gJm1QcmVJZGxlOwogfQogCiB2b2lkIEZhc3RDYXB0dXJlOjpvbkV4aXQoKQogewotICAgIGRlbGV0ZVtdIHJlYWRCdWZmZXI7CisgICAgZnJlZShtUmVhZEJ1ZmZlcik7CiB9CiAKIGJvb2wgRmFzdENhcHR1cmU6OmlzU3ViQ2xhc3NDb21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZCBjb21tYW5kKQpAQCAtODYsNjggKzg2LDY5IEBACiAKIHZvaWQgRmFzdENhcHR1cmU6Om9uU3RhdGVDaGFuZ2UoKQogewotICAgIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKikgdGhpcy0+Y3VycmVudDsKLSAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICogY29uc3QgcHJldmlvdXMgPSAoY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqKSB0aGlzLT5wcmV2aW91czsKLSAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSAqIGNvbnN0IGR1bXBTdGF0ZSA9IChGYXN0Q2FwdHVyZUR1bXBTdGF0ZSAqKSB0aGlzLT5kdW1wU3RhdGU7CisgICAgY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqKSBtQ3VycmVudDsKKyAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICogY29uc3QgcHJldmlvdXMgPSAoY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqKSBtUHJldmlvdXM7CisgICAgRmFzdENhcHR1cmVEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdENhcHR1cmVEdW1wU3RhdGUgKikgbUR1bXBTdGF0ZTsKICAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OwogCiAgICAgYm9vbCBlaXRoZXJDaGFuZ2VkID0gZmFsc2U7CiAKICAgICAvLyBjaGVjayBmb3IgY2hhbmdlIGluIGlucHV0IEhBTCBjb25maWd1cmF0aW9uCi0gICAgTkJBSU9fRm9ybWF0IHByZXZpb3VzRm9ybWF0ID0gZm9ybWF0OwotICAgIGlmIChjdXJyZW50LT5tSW5wdXRTb3VyY2VHZW4gIT0gaW5wdXRTb3VyY2VHZW4pIHsKLSAgICAgICAgaW5wdXRTb3VyY2UgPSBjdXJyZW50LT5tSW5wdXRTb3VyY2U7Ci0gICAgICAgIGlucHV0U291cmNlR2VuID0gY3VycmVudC0+bUlucHV0U291cmNlR2VuOwotICAgICAgICBpZiAoaW5wdXRTb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgZm9ybWF0ID0gRm9ybWF0X0ludmFsaWQ7Ci0gICAgICAgICAgICBzYW1wbGVSYXRlID0gMDsKKyAgICBOQkFJT19Gb3JtYXQgcHJldmlvdXNGb3JtYXQgPSBtRm9ybWF0OworICAgIGlmIChjdXJyZW50LT5tSW5wdXRTb3VyY2VHZW4gIT0gbUlucHV0U291cmNlR2VuKSB7CisgICAgICAgIG1JbnB1dFNvdXJjZSA9IGN1cnJlbnQtPm1JbnB1dFNvdXJjZTsKKyAgICAgICAgbUlucHV0U291cmNlR2VuID0gY3VycmVudC0+bUlucHV0U291cmNlR2VuOworICAgICAgICBpZiAobUlucHV0U291cmNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIG1Gb3JtYXQgPSBGb3JtYXRfSW52YWxpZDsKKyAgICAgICAgICAgIG1TYW1wbGVSYXRlID0gMDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvcm1hdCA9IGlucHV0U291cmNlLT5mb3JtYXQoKTsKLSAgICAgICAgICAgIHNhbXBsZVJhdGUgPSBGb3JtYXRfc2FtcGxlUmF0ZShmb3JtYXQpOwotICAgICAgICAgICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpOwotICAgICAgICAgICAgQUxPR19BU1NFUlQoY2hhbm5lbENvdW50ID09IDEgfHwgY2hhbm5lbENvdW50ID09IDIpOworICAgICAgICAgICAgbUZvcm1hdCA9IG1JbnB1dFNvdXJjZS0+Zm9ybWF0KCk7CisgICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IEZvcm1hdF9zYW1wbGVSYXRlKG1Gb3JtYXQpOworICAgICAgICAgICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gRm9ybWF0X2NoYW5uZWxDb3VudChtRm9ybWF0KTsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKGNoYW5uZWxDb3VudCA+PSAxICYmIGNoYW5uZWxDb3VudCA8PSBGQ0NfOCk7CiAgICAgICAgIH0KLSAgICAgICAgZHVtcFN0YXRlLT5tU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgICAgIGR1bXBTdGF0ZS0+bVNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICAgICAgZWl0aGVyQ2hhbmdlZCA9IHRydWU7CiAgICAgfQogCiAgICAgLy8gY2hlY2sgZm9yIGNoYW5nZSBpbiBwaXBlCi0gICAgaWYgKGN1cnJlbnQtPm1QaXBlU2lua0dlbiAhPSBwaXBlU2lua0dlbikgewotICAgICAgICBwaXBlU2luayA9IGN1cnJlbnQtPm1QaXBlU2luazsKLSAgICAgICAgcGlwZVNpbmtHZW4gPSBjdXJyZW50LT5tUGlwZVNpbmtHZW47CisgICAgaWYgKGN1cnJlbnQtPm1QaXBlU2lua0dlbiAhPSBtUGlwZVNpbmtHZW4pIHsKKyAgICAgICAgbVBpcGVTaW5rID0gY3VycmVudC0+bVBpcGVTaW5rOworICAgICAgICBtUGlwZVNpbmtHZW4gPSBjdXJyZW50LT5tUGlwZVNpbmtHZW47CiAgICAgICAgIGVpdGhlckNoYW5nZWQgPSB0cnVlOwogICAgIH0KIAogICAgIC8vIGlucHV0IHNvdXJjZSBhbmQgcGlwZSBzaW5rIG11c3QgYmUgY29tcGF0aWJsZQotICAgIGlmIChlaXRoZXJDaGFuZ2VkICYmIGlucHV0U291cmNlICE9IE5VTEwgJiYgcGlwZVNpbmsgIT0gTlVMTCkgewotICAgICAgICBBTE9HX0FTU0VSVChGb3JtYXRfaXNFcXVhbChmb3JtYXQsIHBpcGVTaW5rLT5mb3JtYXQoKSkpOworICAgIGlmIChlaXRoZXJDaGFuZ2VkICYmIG1JbnB1dFNvdXJjZSAhPSBOVUxMICYmIG1QaXBlU2luayAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKEZvcm1hdF9pc0VxdWFsKG1Gb3JtYXQsIG1QaXBlU2luay0+Zm9ybWF0KCkpKTsKICAgICB9CiAKLSAgICBpZiAoKCFGb3JtYXRfaXNFcXVhbChmb3JtYXQsIHByZXZpb3VzRm9ybWF0KSkgfHwgKGZyYW1lQ291bnQgIT0gcHJldmlvdXMtPm1GcmFtZUNvdW50KSkgewotICAgICAgICAvLyBGSVhNRSB0byBhdm9pZCBwcmlvcml0eSBpbnZlcnNpb24sIGRvbid0IGRlbGV0ZSBoZXJlCi0gICAgICAgIGRlbGV0ZVtdIHJlYWRCdWZmZXI7Ci0gICAgICAgIHJlYWRCdWZmZXIgPSBOVUxMOwotICAgICAgICBpZiAoZnJhbWVDb3VudCA+IDAgJiYgc2FtcGxlUmF0ZSA+IDApIHsKKyAgICBpZiAoKCFGb3JtYXRfaXNFcXVhbChtRm9ybWF0LCBwcmV2aW91c0Zvcm1hdCkpIHx8IChmcmFtZUNvdW50ICE9IHByZXZpb3VzLT5tRnJhbWVDb3VudCkpIHsKKyAgICAgICAgLy8gRklYTUUgdG8gYXZvaWQgcHJpb3JpdHkgaW52ZXJzaW9uLCBkb24ndCBmcmVlIGhlcmUKKyAgICAgICAgZnJlZShtUmVhZEJ1ZmZlcik7CisgICAgICAgIG1SZWFkQnVmZmVyID0gTlVMTDsKKyAgICAgICAgaWYgKGZyYW1lQ291bnQgPiAwICYmIG1TYW1wbGVSYXRlID4gMCkgewogICAgICAgICAgICAgLy8gRklYTUUgbmV3IG1heSBibG9jayBmb3IgdW5ib3VuZGVkIHRpbWUgYXQgaW50ZXJuYWwgbXV0ZXggb2YgdGhlIGhlYXAKICAgICAgICAgICAgIC8vICAgICAgIGltcGxlbWVudGF0aW9uOyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2ZSBub3JtYWwgY2FwdHVyZSB0aHJlYWQgYWxsb2NhdGUgZm9yCiAgICAgICAgICAgICAvLyAgICAgICB1cyB0byBhdm9pZCBibG9ja2luZyBoZXJlIGFuZCB0byBwcmV2ZW50IHBvc3NpYmxlIHByaW9yaXR5IGludmVyc2lvbgotICAgICAgICAgICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpOwotICAgICAgICAgICAgLy8gRklYTUUgZnJhbWVTaXplCi0gICAgICAgICAgICByZWFkQnVmZmVyID0gbmV3IHNob3J0W2ZyYW1lQ291bnQgKiBjaGFubmVsQ291bnRdOwotICAgICAgICAgICAgbWVtc2V0KHJlYWRCdWZmZXIsIDAsIGZyYW1lQ291bnQgKiBjaGFubmVsQ291bnQgKiBzaXplb2YocmVhZEJ1ZmZlclswXSkpOwotICAgICAgICAgICAgcGVyaW9kTnMgPSAoZnJhbWVDb3VudCAqIDEwMDAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgICAvLyAxLjAwCi0gICAgICAgICAgICB1bmRlcnJ1bk5zID0gKGZyYW1lQ291bnQgKiAxNzUwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgIC8vIDEuNzUKLSAgICAgICAgICAgIG92ZXJydW5OcyA9IChmcmFtZUNvdW50ICogNTAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgLy8gMC41MAotICAgICAgICAgICAgZm9yY2VOcyA9IChmcmFtZUNvdW50ICogOTUwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgICAvLyAwLjk1Ci0gICAgICAgICAgICB3YXJtdXBOcyA9IChmcmFtZUNvdW50ICogNTAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgIC8vIDAuNTAKKyAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplID0gZnJhbWVDb3VudCAqIEZvcm1hdF9mcmFtZVNpemUobUZvcm1hdCk7CisgICAgICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbVJlYWRCdWZmZXIsIDMyLCBidWZmZXJTaXplKTsKKyAgICAgICAgICAgIG1lbXNldChtUmVhZEJ1ZmZlciwgMCwgYnVmZmVyU2l6ZSk7IC8vIGlmIHBvc2l4X21lbWFsaWduIGZhaWxzLCB3aWxsIHNlZ3YgaGVyZS4KKyAgICAgICAgICAgIG1QZXJpb2ROcyA9IChmcmFtZUNvdW50ICogMTAwMDAwMDAwMExMKSAvIG1TYW1wbGVSYXRlOyAgICAgIC8vIDEuMDAKKyAgICAgICAgICAgIG1VbmRlcnJ1bk5zID0gKGZyYW1lQ291bnQgKiAxNzUwMDAwMDAwTEwpIC8gbVNhbXBsZVJhdGU7ICAgIC8vIDEuNzUKKyAgICAgICAgICAgIG1PdmVycnVuTnMgPSAoZnJhbWVDb3VudCAqIDUwMDAwMDAwMExMKSAvIG1TYW1wbGVSYXRlOyAgICAgIC8vIDAuNTAKKyAgICAgICAgICAgIG1Gb3JjZU5zID0gKGZyYW1lQ291bnQgKiA5NTAwMDAwMDBMTCkgLyBtU2FtcGxlUmF0ZTsgICAgICAgIC8vIDAuOTUKKyAgICAgICAgICAgIG1XYXJtdXBOc01pbiA9IChmcmFtZUNvdW50ICogNzUwMDAwMDAwTEwpIC8gbVNhbXBsZVJhdGU7ICAgIC8vIDAuNzUKKyAgICAgICAgICAgIG1XYXJtdXBOc01heCA9IChmcmFtZUNvdW50ICogMTI1MDAwMDAwMExMKSAvIG1TYW1wbGVSYXRlOyAgIC8vIDEuMjUKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBlcmlvZE5zID0gMDsKLSAgICAgICAgICAgIHVuZGVycnVuTnMgPSAwOwotICAgICAgICAgICAgb3ZlcnJ1bk5zID0gMDsKLSAgICAgICAgICAgIGZvcmNlTnMgPSAwOwotICAgICAgICAgICAgd2FybXVwTnMgPSAwOworICAgICAgICAgICAgbVBlcmlvZE5zID0gMDsKKyAgICAgICAgICAgIG1VbmRlcnJ1bk5zID0gMDsKKyAgICAgICAgICAgIG1PdmVycnVuTnMgPSAwOworICAgICAgICAgICAgbUZvcmNlTnMgPSAwOworICAgICAgICAgICAgbVdhcm11cE5zTWluID0gMDsKKyAgICAgICAgICAgIG1XYXJtdXBOc01heCA9IExPTkdfTUFYOwogICAgICAgICB9Ci0gICAgICAgIHJlYWRCdWZmZXJTdGF0ZSA9IC0xOworICAgICAgICBtUmVhZEJ1ZmZlclN0YXRlID0gLTE7CiAgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwogICAgIH0KIApAQCAtMTU1LDQ0ICsxNTYsNDMgQEAKIAogdm9pZCBGYXN0Q2FwdHVyZTo6b25Xb3JrKCkKIHsKLSAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0Q2FwdHVyZVN0YXRlICopIHRoaXMtPmN1cnJlbnQ7Ci0gICAgRmFzdENhcHR1cmVEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdENhcHR1cmVEdW1wU3RhdGUgKikgdGhpcy0+ZHVtcFN0YXRlOwotICAgIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGU6OkNvbW1hbmQgY29tbWFuZCA9IHRoaXMtPmNvbW1hbmQ7CisgICAgY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdENhcHR1cmVTdGF0ZSAqKSBtQ3VycmVudDsKKyAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSAqIGNvbnN0IGR1bXBTdGF0ZSA9IChGYXN0Q2FwdHVyZUR1bXBTdGF0ZSAqKSBtRHVtcFN0YXRlOworICAgIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGU6OkNvbW1hbmQgY29tbWFuZCA9IG1Db21tYW5kOwogICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7CiAKICAgICBpZiAoKGNvbW1hbmQgJiBGYXN0Q2FwdHVyZVN0YXRlOjpSRUFEKSAvKiYmIGlzV2FybSovKSB7Ci0gICAgICAgIEFMT0dfQVNTRVJUKGlucHV0U291cmNlICE9IE5VTEwpOwotICAgICAgICBBTE9HX0FTU0VSVChyZWFkQnVmZmVyICE9IE5VTEwpOworICAgICAgICBBTE9HX0FTU0VSVChtSW5wdXRTb3VyY2UgIT0gTlVMTCk7CisgICAgICAgIEFMT0dfQVNTRVJUKG1SZWFkQnVmZmVyICE9IE5VTEwpOwogICAgICAgICBkdW1wU3RhdGUtPm1SZWFkU2VxdWVuY2UrKzsKICAgICAgICAgQVRSQUNFX0JFR0lOKCJyZWFkIik7Ci0gICAgICAgIHNzaXplX3QgZnJhbWVzUmVhZCA9IGlucHV0U291cmNlLT5yZWFkKHJlYWRCdWZmZXIsIGZyYW1lQ291bnQsCisgICAgICAgIHNzaXplX3QgZnJhbWVzUmVhZCA9IG1JbnB1dFNvdXJjZS0+cmVhZChtUmVhZEJ1ZmZlciwgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjprSW52YWxpZFBUUyk7CiAgICAgICAgIEFUUkFDRV9FTkQoKTsKICAgICAgICAgZHVtcFN0YXRlLT5tUmVhZFNlcXVlbmNlKys7CiAgICAgICAgIGlmIChmcmFtZXNSZWFkID49IDApIHsKICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKHNpemVfdCkgZnJhbWVzUmVhZCA+IGZyYW1lQ291bnQpOwotICAgICAgICAgICAgdG90YWxOYXRpdmVGcmFtZXNSZWFkICs9IGZyYW1lc1JlYWQ7Ci0gICAgICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZXNSZWFkID0gdG90YWxOYXRpdmVGcmFtZXNSZWFkOwotICAgICAgICAgICAgcmVhZEJ1ZmZlclN0YXRlID0gZnJhbWVzUmVhZDsKKyAgICAgICAgICAgIG1Ub3RhbE5hdGl2ZUZyYW1lc1JlYWQgKz0gZnJhbWVzUmVhZDsKKyAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lc1JlYWQgPSBtVG90YWxOYXRpdmVGcmFtZXNSZWFkOworICAgICAgICAgICAgbVJlYWRCdWZmZXJTdGF0ZSA9IGZyYW1lc1JlYWQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBkdW1wU3RhdGUtPm1SZWFkRXJyb3JzKys7Ci0gICAgICAgICAgICByZWFkQnVmZmVyU3RhdGUgPSAwOworICAgICAgICAgICAgbVJlYWRCdWZmZXJTdGF0ZSA9IDA7CiAgICAgICAgIH0KICAgICAgICAgLy8gRklYTUUgcmVuYW1lIHRvIGF0dGVtcHRlZElPCi0gICAgICAgIGF0dGVtcHRlZFdyaXRlID0gdHJ1ZTsKKyAgICAgICAgbUF0dGVtcHRlZFdyaXRlID0gdHJ1ZTsKICAgICB9CiAKICAgICBpZiAoY29tbWFuZCAmIEZhc3RDYXB0dXJlU3RhdGU6OldSSVRFKSB7Ci0gICAgICAgIEFMT0dfQVNTRVJUKHBpcGVTaW5rICE9IE5VTEwpOwotICAgICAgICBBTE9HX0FTU0VSVChyZWFkQnVmZmVyICE9IE5VTEwpOwotICAgICAgICBpZiAocmVhZEJ1ZmZlclN0YXRlIDwgMCkgewotICAgICAgICAgICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpOwotICAgICAgICAgICAgLy8gRklYTUUgZnJhbWVTaXplCi0gICAgICAgICAgICBtZW1zZXQocmVhZEJ1ZmZlciwgMCwgZnJhbWVDb3VudCAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihzaG9ydCkpOwotICAgICAgICAgICAgcmVhZEJ1ZmZlclN0YXRlID0gZnJhbWVDb3VudDsKKyAgICAgICAgQUxPR19BU1NFUlQobVBpcGVTaW5rICE9IE5VTEwpOworICAgICAgICBBTE9HX0FTU0VSVChtUmVhZEJ1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgaWYgKG1SZWFkQnVmZmVyU3RhdGUgPCAwKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSBGb3JtYXRfY2hhbm5lbENvdW50KG1Gb3JtYXQpOworICAgICAgICAgICAgbWVtc2V0KG1SZWFkQnVmZmVyLCAwLCBmcmFtZUNvdW50ICogRm9ybWF0X2ZyYW1lU2l6ZShtRm9ybWF0KSk7CisgICAgICAgICAgICBtUmVhZEJ1ZmZlclN0YXRlID0gZnJhbWVDb3VudDsKICAgICAgICAgfQotICAgICAgICBpZiAocmVhZEJ1ZmZlclN0YXRlID4gMCkgewotICAgICAgICAgICAgc3NpemVfdCBmcmFtZXNXcml0dGVuID0gcGlwZVNpbmstPndyaXRlKHJlYWRCdWZmZXIsIHJlYWRCdWZmZXJTdGF0ZSk7CisgICAgICAgIGlmIChtUmVhZEJ1ZmZlclN0YXRlID4gMCkgeworICAgICAgICAgICAgc3NpemVfdCBmcmFtZXNXcml0dGVuID0gbVBpcGVTaW5rLT53cml0ZShtUmVhZEJ1ZmZlciwgbVJlYWRCdWZmZXJTdGF0ZSk7CiAgICAgICAgICAgICAvLyBGSVhNRSBUaGlzIHN1cHBvcnRzIGF0IG1vc3Qgb25lIGZhc3QgY2FwdHVyZSBjbGllbnQuCiAgICAgICAgICAgICAvLyAgICAgICBUbyBoYW5kbGUgbXVsdGlwbGUgY2xpZW50cyB0aGlzIGNvdWxkIGJlIGNvbnZlcnRlZCB0byBhbiBhcnJheSwKICAgICAgICAgICAgIC8vICAgICAgIG9yIHdpdGggYSBsb3QgbW9yZSB3b3JrIHRoZSBjb250cm9sIGJsb2NrIGNvdWxkIGJlIHNoYXJlZCBieSBhbGwgY2xpZW50cy4KQEAgLTIxMSwxMyArMjExLDQgQEAKICAgICB9CiB9CiAKLUZhc3RDYXB0dXJlRHVtcFN0YXRlOjpGYXN0Q2FwdHVyZUR1bXBTdGF0ZSgpIDogRmFzdFRocmVhZER1bXBTdGF0ZSgpLAotICAgIG1SZWFkU2VxdWVuY2UoMCksIG1GcmFtZXNSZWFkKDApLCBtUmVhZEVycm9ycygwKSwgbVNhbXBsZVJhdGUoMCksIG1GcmFtZUNvdW50KDApCi17Ci19Ci0KLUZhc3RDYXB0dXJlRHVtcFN0YXRlOjp+RmFzdENhcHR1cmVEdW1wU3RhdGUoKQotewotfQotCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmgKaW5kZXggZTUzNWI5ZC4uZTI1OGE0ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmgKQEAgLTIwLDIzICsyMCwxMiBAQAogI2luY2x1ZGUgIkZhc3RUaHJlYWQuaCIKICNpbmNsdWRlICJTdGF0ZVF1ZXVlLmgiCiAjaW5jbHVkZSAiRmFzdENhcHR1cmVTdGF0ZS5oIgorI2luY2x1ZGUgIkZhc3RDYXB0dXJlRHVtcFN0YXRlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdHlwZWRlZiBTdGF0ZVF1ZXVlPEZhc3RDYXB0dXJlU3RhdGU+IEZhc3RDYXB0dXJlU3RhdGVRdWV1ZTsKIAotc3RydWN0IEZhc3RDYXB0dXJlRHVtcFN0YXRlIDogRmFzdFRocmVhZER1bXBTdGF0ZSB7Ci0gICAgRmFzdENhcHR1cmVEdW1wU3RhdGUoKTsKLSAgICAvKnZpcnR1YWwqLyB+RmFzdENhcHR1cmVEdW1wU3RhdGUoKTsKLQotICAgIC8vIEZJWE1FIGJ5IHJlbmFtaW5nLCBjb3VsZCBwdWxsIHVwIG1hbnkgb2YgdGhlc2UgdG8gRmFzdFRocmVhZER1bXBTdGF0ZQotICAgIHVpbnQzMl90IG1SZWFkU2VxdWVuY2U7ICAgICAvLyBpbmNyZW1lbnRlZCBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggcmVhZCgpCi0gICAgdWludDMyX3QgbUZyYW1lc1JlYWQ7ICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgcmVhZCBzdWNjZXNzZnVsbHkKLSAgICB1aW50MzJfdCBtUmVhZEVycm9yczsgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIHJlYWQoKSBlcnJvcnMKLSAgICB1aW50MzJfdCBtU2FtcGxlUmF0ZTsKLSAgICBzaXplX3QgICBtRnJhbWVDb3VudDsKLX07Ci0KIGNsYXNzIEZhc3RDYXB0dXJlIDogcHVibGljIEZhc3RUaHJlYWQgewogCiBwdWJsaWM6CkBAIC01NywxOSArNDYsMjEgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25TdGF0ZUNoYW5nZSgpOwogICAgIHZpcnR1YWwgdm9pZCBvbldvcmsoKTsKIAotICAgIHN0YXRpYyBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlIGluaXRpYWw7Ci0gICAgRmFzdENhcHR1cmVTdGF0ZSBwcmVJZGxlOyAvLyBjb3B5IG9mIHN0YXRlIGJlZm9yZSB3ZSB3ZW50IGludG8gaWRsZQorICAgIHN0YXRpYyBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlIHNJbml0aWFsOworCisgICAgRmFzdENhcHR1cmVTdGF0ZSAgICBtUHJlSWRsZTsgICAvLyBjb3B5IG9mIHN0YXRlIGJlZm9yZSB3ZSB3ZW50IGludG8gaWRsZQogICAgIC8vIEZJWE1FIGJ5IHJlbmFtaW5nLCBjb3VsZCBwdWxsIHVwIG1hbnkgb2YgdGhlc2UgdG8gRmFzdFRocmVhZAotICAgIE5CQUlPX1NvdXJjZSAqaW5wdXRTb3VyY2U7Ci0gICAgaW50IGlucHV0U291cmNlR2VuOwotICAgIE5CQUlPX1NpbmsgKnBpcGVTaW5rOwotICAgIGludCBwaXBlU2lua0dlbjsKLSAgICBzaG9ydCAqcmVhZEJ1ZmZlcjsKLSAgICBzc2l6ZV90IHJlYWRCdWZmZXJTdGF0ZTsgICAgLy8gbnVtYmVyIG9mIGluaXRpYWxpemVkIGZyYW1lcyBpbiByZWFkQnVmZmVyLCBvciAtMSB0byBjbGVhcgotICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQ7Ci0gICAgdW5zaWduZWQgc2FtcGxlUmF0ZTsKLSAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSBkdW1teUR1bXBTdGF0ZTsKLSAgICB1aW50MzJfdCB0b3RhbE5hdGl2ZUZyYW1lc1JlYWQ7IC8vIGNvcGllZCB0byBkdW1wU3RhdGUtPm1GcmFtZXNSZWFkCisgICAgTkJBSU9fU291cmNlKiAgICAgICBtSW5wdXRTb3VyY2U7CisgICAgaW50ICAgICAgICAgICAgICAgICBtSW5wdXRTb3VyY2VHZW47CisgICAgTkJBSU9fU2luayogICAgICAgICBtUGlwZVNpbms7CisgICAgaW50ICAgICAgICAgICAgICAgICBtUGlwZVNpbmtHZW47CisgICAgdm9pZCogICAgICAgICAgICAgICBtUmVhZEJ1ZmZlcjsKKyAgICBzc2l6ZV90ICAgICAgICAgICAgIG1SZWFkQnVmZmVyU3RhdGU7ICAgLy8gbnVtYmVyIG9mIGluaXRpYWxpemVkIGZyYW1lcyBpbiByZWFkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciAtMSB0byBjbGVhcgorICAgIE5CQUlPX0Zvcm1hdCAgICAgICAgbUZvcm1hdDsKKyAgICB1bnNpZ25lZCAgICAgICAgICAgIG1TYW1wbGVSYXRlOworICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlIG1EdW1teUZhc3RDYXB0dXJlRHVtcFN0YXRlOworICAgIHVpbnQzMl90ICAgICAgICAgICAgbVRvdGFsTmF0aXZlRnJhbWVzUmVhZDsgLy8gY29waWVkIHRvIGR1bXBTdGF0ZS0+bUZyYW1lc1JlYWQKIAogfTsgIC8vIGNsYXNzIEZhc3RDYXB0dXJlCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZUR1bXBTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVEdW1wU3RhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZWViYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVEdW1wU3RhdGUuY3BwCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkZhc3RDYXB0dXJlRHVtcFN0YXRlIgorLy9kZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiRmFzdENhcHR1cmVEdW1wU3RhdGUuaCIKKyNpbmNsdWRlICJGYXN0Q2FwdHVyZVN0YXRlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworRmFzdENhcHR1cmVEdW1wU3RhdGU6OkZhc3RDYXB0dXJlRHVtcFN0YXRlKCkgOiBGYXN0VGhyZWFkRHVtcFN0YXRlKCksCisgICAgbVJlYWRTZXF1ZW5jZSgwKSwgbUZyYW1lc1JlYWQoMCksIG1SZWFkRXJyb3JzKDApLCBtU2FtcGxlUmF0ZSgwKSwgbUZyYW1lQ291bnQoMCkKK3sKK30KKworRmFzdENhcHR1cmVEdW1wU3RhdGU6On5GYXN0Q2FwdHVyZUR1bXBTdGF0ZSgpCit7Cit9CisKK3ZvaWQgRmFzdENhcHR1cmVEdW1wU3RhdGU6OmR1bXAoaW50IGZkKSBjb25zdAoreworICAgIGlmIChtQ29tbWFuZCA9PSBGYXN0Q2FwdHVyZVN0YXRlOjpJTklUSUFMKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIEZhc3RDYXB0dXJlIG5vdCBpbml0aWFsaXplZFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZG91YmxlIG1lYXN1cmVkV2FybXVwTXMgPSAobU1lYXN1cmVkV2FybXVwVHMudHZfc2VjICogMTAwMC4wKSArCisgICAgICAgICAgICAobU1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyAvIDEwMDAwMDAuMCk7CisgICAgZG91YmxlIHBlcmlvZFNlYyA9IChkb3VibGUpIG1GcmFtZUNvdW50IC8gbVNhbXBsZVJhdGU7CisgICAgZHByaW50ZihmZCwgIiAgRmFzdENhcHR1cmUgY29tbWFuZD0lcyByZWFkU2VxdWVuY2U9JXUgZnJhbWVzUmVhZD0ldVxuIgorICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIHJlYWRFcnJvcnM9JXUgc2FtcGxlUmF0ZT0ldSBmcmFtZUNvdW50PSV6dVxuIgorICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwPSUuM2cgbXMsIHdhcm11cEN5Y2xlcz0ldSBwZXJpb2Q9JS4yZiBtc1xuIiwKKyAgICAgICAgICAgICAgICBGYXN0Q2FwdHVyZVN0YXRlOjpjb21tYW5kVG9TdHJpbmcobUNvbW1hbmQpLCBtUmVhZFNlcXVlbmNlLCBtRnJhbWVzUmVhZCwKKyAgICAgICAgICAgICAgICBtUmVhZEVycm9ycywgbVNhbXBsZVJhdGUsIG1GcmFtZUNvdW50LCBtZWFzdXJlZFdhcm11cE1zLCBtV2FybXVwQ3ljbGVzLAorICAgICAgICAgICAgICAgIHBlcmlvZFNlYyAqIDFlMyk7Cit9CisKK30gICAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVEdW1wU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZUR1bXBTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmOWM0YzMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVEdW1wU3RhdGUuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX0ZBU1RfQ0FQVFVSRV9EVU1QX1NUQVRFX0gKKyNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX0NBUFRVUkVfRFVNUF9TVEFURV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSAiRmFzdFRocmVhZER1bXBTdGF0ZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBGYXN0Q2FwdHVyZUR1bXBTdGF0ZSA6IEZhc3RUaHJlYWREdW1wU3RhdGUgeworICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlKCk7CisgICAgLyp2aXJ0dWFsKi8gfkZhc3RDYXB0dXJlRHVtcFN0YXRlKCk7CisKKyAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdDsgICAgLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgc3RhYmxlIGNvcHksIG5vdCB0aGUgb3JpZ2luYWwKKworICAgIC8vIEZJWE1FIGJ5IHJlbmFtaW5nLCBjb3VsZCBwdWxsIHVwIG1hbnkgb2YgdGhlc2UgdG8gRmFzdFRocmVhZER1bXBTdGF0ZQorICAgIHVpbnQzMl90IG1SZWFkU2VxdWVuY2U7ICAgICAvLyBpbmNyZW1lbnRlZCBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggcmVhZCgpCisgICAgdWludDMyX3QgbUZyYW1lc1JlYWQ7ICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgcmVhZCBzdWNjZXNzZnVsbHkKKyAgICB1aW50MzJfdCBtUmVhZEVycm9yczsgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIHJlYWQoKSBlcnJvcnMKKyAgICB1aW50MzJfdCBtU2FtcGxlUmF0ZTsKKyAgICBzaXplX3QgICBtRnJhbWVDb3VudDsKK307CisKK30gICAvLyBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19GQVNUX0NBUFRVUkVfRFVNUF9TVEFURV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5jcHAKaW5kZXggMWQwMjliNy4uYzRkNWU0NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmNwcApAQCAtMjcsNCArMjcsMTkgQEAKIHsKIH0KIAorLy8gc3RhdGljCitjb25zdCBjaGFyICpGYXN0Q2FwdHVyZVN0YXRlOjpjb21tYW5kVG9TdHJpbmcoQ29tbWFuZCBjb21tYW5kKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IEZhc3RUaHJlYWRTdGF0ZTo6Y29tbWFuZFRvU3RyaW5nKGNvbW1hbmQpOworICAgIGlmIChzdHIgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gc3RyOworICAgIH0KKyAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKKyAgICBjYXNlIEZhc3RDYXB0dXJlU3RhdGU6OlJFQUQ6ICAgICAgICByZXR1cm4gIlJFQUQiOworICAgIGNhc2UgRmFzdENhcHR1cmVTdGF0ZTo6V1JJVEU6ICAgICAgIHJldHVybiAiV1JJVEUiOworICAgIGNhc2UgRmFzdENhcHR1cmVTdGF0ZTo6UkVBRF9XUklURTogIHJldHVybiAiUkVBRF9XUklURSI7CisgICAgfQorICAgIExPR19BTFdBWVNfRkFUQUwoIiVzIiwgX19mdW5jX18pOworfQorCiB9ICAgLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmgKaW5kZXggMjljODY1YS4uOWJjYTJkNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5oCkBAIC0yOSwyMSArMjksMjMgQEAKICAgICAvKnZpcnR1YWwqLyB+RmFzdENhcHR1cmVTdGF0ZSgpOwogCiAgICAgLy8gYWxsIHBvaW50ZXIgZmllbGRzIHVzZSByYXcgcG9pbnRlcnM7IG9iamVjdHMgYXJlIG93bmVkIGFuZCByZWYtY291bnRlZCBieSBSZWNvcmRUaHJlYWQKLSAgICBOQkFJT19Tb3VyY2UgICAgKm1JbnB1dFNvdXJjZTsgICAgICAvLyBIQUwgaW5wdXQgZGV2aWNlLCBtdXN0IGFscmVhZHkgYmUgbmVnb3RpYXRlZAorICAgIE5CQUlPX1NvdXJjZSogICBtSW5wdXRTb3VyY2U7ICAgICAgIC8vIEhBTCBpbnB1dCBkZXZpY2UsIG11c3QgYWxyZWFkeSBiZSBuZWdvdGlhdGVkCiAgICAgLy8gRklYTUUgYnkgcmVuYW1pbmcsIGNvdWxkIHB1bGwgdXAgdGhlc2UgZmllbGRzIHRvIEZhc3RUaHJlYWRTdGF0ZQogICAgIGludCAgICAgICAgICAgICBtSW5wdXRTb3VyY2VHZW47ICAgIC8vIGluY3JlbWVudCB3aGVuIG1JbnB1dFNvdXJjZSBpcyBhc3NpZ25lZAotICAgIE5CQUlPX1NpbmsgICAgICAqbVBpcGVTaW5rOyAgICAgICAgIC8vIGFmdGVyIHJlYWRpbmcgZnJvbSBpbnB1dCBzb3VyY2UsIHdyaXRlIHRvIHRoaXMgcGlwZSBzaW5rCisgICAgTkJBSU9fU2luayogICAgIG1QaXBlU2luazsgICAgICAgICAgLy8gYWZ0ZXIgcmVhZGluZyBmcm9tIGlucHV0IHNvdXJjZSwgd3JpdGUgdG8gdGhpcyBwaXBlIHNpbmsKICAgICBpbnQgICAgICAgICAgICAgbVBpcGVTaW5rR2VuOyAgICAgICAvLyBpbmNyZW1lbnQgd2hlbiBtUGlwZVNpbmsgaXMgYXNzaWduZWQKICAgICBzaXplX3QgICAgICAgICAgbUZyYW1lQ291bnQ7ICAgICAgICAvLyBudW1iZXIgb2YgZnJhbWVzIHBlciBmYXN0IGNhcHR1cmUgYnVmZmVyCi0gICAgYXVkaW9fdHJhY2tfY2Jsa190ICAqbUNibGs7ICAgICAgICAgLy8gY29udHJvbCBibG9jayBmb3IgdGhlIHNpbmdsZSBmYXN0IGNsaWVudCwgb3IgTlVMTAorICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogbUNibGs7ICAgICAgICAgIC8vIGNvbnRyb2wgYmxvY2sgZm9yIHRoZSBzaW5nbGUgZmFzdCBjbGllbnQsIG9yIE5VTEwKIAogICAgIC8vIEV4dGVuZHMgRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kCiAgICAgc3RhdGljIGNvbnN0IENvbW1hbmQKICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhbHNvIHByb2Nlc3MgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCBhbmQgY2FuIGJlICJvciJlZDoKLSAgICAgICAgUkVBRCA9IDB4OCwgICAgICAgICAgICAgLy8gcmVhZCBmcm9tIGlucHV0IHNvdXJjZQotICAgICAgICBXUklURSA9IDB4MTAsICAgICAgICAgICAvLyB3cml0ZSB0byBwaXBlIHNpbmsKLSAgICAgICAgUkVBRF9XUklURSA9IDB4MTg7ICAgICAgLy8gcmVhZCBmcm9tIGlucHV0IHNvdXJjZSBhbmQgd3JpdGUgdG8gcGlwZSBzaW5rCisgICAgICAgIFJFQUQgPSAweDgsICAgICAgICAgICAgICAgICAgICAgLy8gcmVhZCBmcm9tIGlucHV0IHNvdXJjZQorICAgICAgICBXUklURSA9IDB4MTAsICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHRvIHBpcGUgc2luaworICAgICAgICBSRUFEX1dSSVRFID0gMHgxODsgICAgICAgICAgICAgIC8vIHJlYWQgZnJvbSBpbnB1dCBzb3VyY2UgYW5kIHdyaXRlIHRvIHBpcGUgc2luawogCisgICAgLy8gbmV2ZXIgcmV0dXJucyBOVUxMOyBhc3NlcnRzIGlmIGNvbW1hbmQgaXMgaW52YWxpZAorICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb21tYW5kVG9TdHJpbmcoQ29tbWFuZCBjb21tYW5kKTsKIH07ICAvLyBzdHJ1Y3QgRmFzdENhcHR1cmVTdGF0ZQogCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKaW5kZXggMjY3OGNiZi4uNDVjNjhiNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAKQEAgLTI3LDEwICsyNywxMSBAQAogCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCisjaWZkZWYgRkFTVF9USFJFQURfU1RBVElTVElDUwogI2luY2x1ZGUgPGNwdXN0YXRzL0NlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3MuaD4KICNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKICNpbmNsdWRlIDxjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5oPgpAQCAtNDQsMTUgKzQ1LDE1IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLypzdGF0aWMqLyBjb25zdCBGYXN0TWl4ZXJTdGF0ZSBGYXN0TWl4ZXI6OmluaXRpYWw7CisvKnN0YXRpYyovIGNvbnN0IEZhc3RNaXhlclN0YXRlIEZhc3RNaXhlcjo6c0luaXRpYWw7CiAKIEZhc3RNaXhlcjo6RmFzdE1peGVyKCkgOiBGYXN0VGhyZWFkKCksCi0gICAgc2xvcE5zKDApLAotICAgIC8vIGZhc3RUcmFja05hbWVzCi0gICAgLy8gZ2VuZXJhdGlvbnMKLSAgICBvdXRwdXRTaW5rKE5VTEwpLAotICAgIG91dHB1dFNpbmtHZW4oMCksCi0gICAgbWl4ZXIoTlVMTCksCisgICAgbVNsb3BOcygwKSwKKyAgICAvLyBtRmFzdFRyYWNrTmFtZXMKKyAgICAvLyBtR2VuZXJhdGlvbnMKKyAgICBtT3V0cHV0U2luayhOVUxMKSwKKyAgICBtT3V0cHV0U2lua0dlbigwKSwKKyAgICBtTWl4ZXIoTlVMTCksCiAgICAgbVNpbmtCdWZmZXIoTlVMTCksCiAgICAgbVNpbmtCdWZmZXJTaXplKDApLAogICAgIG1TaW5rQ2hhbm5lbENvdW50KEZDQ18yKSwKQEAgLTYwLDMwICs2MSwzMCBAQAogICAgIG1NaXhlckJ1ZmZlclNpemUoMCksCiAgICAgbU1peGVyQnVmZmVyRm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSwKICAgICBtTWl4ZXJCdWZmZXJTdGF0ZShVTkRFRklORUQpLAotICAgIGZvcm1hdChGb3JtYXRfSW52YWxpZCksCi0gICAgc2FtcGxlUmF0ZSgwKSwKLSAgICBmYXN0VHJhY2tzR2VuKDApLAotICAgIHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbigwKSwKKyAgICBtRm9ybWF0KEZvcm1hdF9JbnZhbGlkKSwKKyAgICBtU2FtcGxlUmF0ZSgwKSwKKyAgICBtRmFzdFRyYWNrc0dlbigwKSwKKyAgICBtVG90YWxOYXRpdmVGcmFtZXNXcml0dGVuKDApLAogICAgIC8vIHRpbWVzdGFtcAotICAgIG5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQoMCkgICAvLyB0aGUgPSAwIGlzIHRvIHNpbGVuY2UgdGhlIGNvbXBpbGVyCisgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQoMCkgICAvLyB0aGUgPSAwIGlzIHRvIHNpbGVuY2UgdGhlIGNvbXBpbGVyCiB7Ci0gICAgLy8gRklYTUUgcGFzcyBpbml0aWFsIGFzIHBhcmFtZXRlciB0byBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yLCBhbmQgbWFrZSBpdCBzdGF0aWMgbG9jYWwKLSAgICBwcmV2aW91cyA9ICZpbml0aWFsOwotICAgIGN1cnJlbnQgPSAmaW5pdGlhbDsKKyAgICAvLyBGSVhNRSBwYXNzIHNJbml0aWFsIGFzIHBhcmFtZXRlciB0byBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yLCBhbmQgbWFrZSBpdCBzdGF0aWMgbG9jYWwKKyAgICBtUHJldmlvdXMgPSAmc0luaXRpYWw7CisgICAgbUN1cnJlbnQgPSAmc0luaXRpYWw7CiAKLSAgICBtRHVtbXlEdW1wU3RhdGUgPSAmZHVtbXlEdW1wU3RhdGU7CisgICAgbUR1bW15RHVtcFN0YXRlID0gJm1EdW1teUZhc3RNaXhlckR1bXBTdGF0ZTsKICAgICAvLyBUT0RPOiBBZGQgY2hhbm5lbCBtYXNrIHRvIE5CQUlPX0Zvcm1hdC4KICAgICAvLyBXZSBhc3N1bWUgdGhhdCB0aGUgY2hhbm5lbCBtYXNrIG11c3QgYmUgYSB2YWxpZCBwb3NpdGlvbmFsIGNoYW5uZWwgbWFzay4KICAgICBtU2lua0NoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KG1TaW5rQ2hhbm5lbENvdW50KTsKIAogICAgIHVuc2lnbmVkIGk7CiAgICAgZm9yIChpID0gMDsgaSA8IEZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrczsgKytpKSB7Ci0gICAgICAgIGZhc3RUcmFja05hbWVzW2ldID0gLTE7Ci0gICAgICAgIGdlbmVyYXRpb25zW2ldID0gMDsKKyAgICAgICAgbUZhc3RUcmFja05hbWVzW2ldID0gLTE7CisgICAgICAgIG1HZW5lcmF0aW9uc1tpXSA9IDA7CiAgICAgfQotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgIG9sZExvYWQudHZfc2VjID0gMDsKLSAgICBvbGRMb2FkLnR2X25zZWMgPSAwOworI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKKyAgICBtT2xkTG9hZC50dl9zZWMgPSAwOworICAgIG1PbGRMb2FkLnR2X25zZWMgPSAwOwogI2VuZGlmCiB9CiAKQEAgLTEwMywyMCArMTA0LDIwIEBACiAKIHZvaWQgRmFzdE1peGVyOjpzZXRMb2coTkJMb2c6OldyaXRlciAqbG9nV3JpdGVyKQogewotICAgIGlmIChtaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1peGVyLT5zZXRMb2cobG9nV3JpdGVyKTsKKyAgICBpZiAobU1peGVyICE9IE5VTEwpIHsKKyAgICAgICAgbU1peGVyLT5zZXRMb2cobG9nV3JpdGVyKTsKICAgICB9CiB9CiAKIHZvaWQgRmFzdE1peGVyOjpvbklkbGUoKQogewotICAgIHByZUlkbGUgPSAqKGNvbnN0IEZhc3RNaXhlclN0YXRlICopY3VycmVudDsKLSAgICBjdXJyZW50ID0gJnByZUlkbGU7CisgICAgbVByZUlkbGUgPSAqKGNvbnN0IEZhc3RNaXhlclN0YXRlICopbUN1cnJlbnQ7CisgICAgbUN1cnJlbnQgPSAmbVByZUlkbGU7CiB9CiAKIHZvaWQgRmFzdE1peGVyOjpvbkV4aXQoKQogewotICAgIGRlbGV0ZSBtaXhlcjsKKyAgICBkZWxldGUgbU1peGVyOwogICAgIGZyZWUobU1peGVyQnVmZmVyKTsKICAgICBmcmVlKG1TaW5rQnVmZmVyKTsKIH0KQEAgLTEzNSw4MiArMTM2LDg4IEBACiAKIHZvaWQgRmFzdE1peGVyOjpvblN0YXRlQ2hhbmdlKCkKIHsKLSAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgdGhpcy0+Y3VycmVudDsKLSAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IHByZXZpb3VzID0gKGNvbnN0IEZhc3RNaXhlclN0YXRlICopIHRoaXMtPnByZXZpb3VzOwotICAgIEZhc3RNaXhlckR1bXBTdGF0ZSAqIGNvbnN0IGR1bXBTdGF0ZSA9IChGYXN0TWl4ZXJEdW1wU3RhdGUgKikgdGhpcy0+ZHVtcFN0YXRlOworICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSBtQ3VycmVudDsKKyAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IHByZXZpb3VzID0gKGNvbnN0IEZhc3RNaXhlclN0YXRlICopIG1QcmV2aW91czsKKyAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdE1peGVyRHVtcFN0YXRlICopIG1EdW1wU3RhdGU7CiAgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBjdXJyZW50LT5tRnJhbWVDb3VudDsKIAogICAgIC8vIGhhbmRsZSBzdGF0ZSBjaGFuZ2UgaGVyZSwgYnV0IHNpbmNlIHdlIHdhbnQgdG8gZGlmZiB0aGUgc3RhdGUsCi0gICAgLy8gd2UncmUgcHJlcGFyZWQgZm9yIHByZXZpb3VzID09ICZpbml0aWFsIHRoZSBmaXJzdCB0aW1lIHRocm91Z2gKKyAgICAvLyB3ZSdyZSBwcmVwYXJlZCBmb3IgcHJldmlvdXMgPT0gJnNJbml0aWFsIHRoZSBmaXJzdCB0aW1lIHRocm91Z2gKICAgICB1bnNpZ25lZCBwcmV2aW91c1RyYWNrTWFzazsKIAogICAgIC8vIGNoZWNrIGZvciBjaGFuZ2UgaW4gb3V0cHV0IEhBTCBjb25maWd1cmF0aW9uCi0gICAgTkJBSU9fRm9ybWF0IHByZXZpb3VzRm9ybWF0ID0gZm9ybWF0OwotICAgIGlmIChjdXJyZW50LT5tT3V0cHV0U2lua0dlbiAhPSBvdXRwdXRTaW5rR2VuKSB7Ci0gICAgICAgIG91dHB1dFNpbmsgPSBjdXJyZW50LT5tT3V0cHV0U2luazsKLSAgICAgICAgb3V0cHV0U2lua0dlbiA9IGN1cnJlbnQtPm1PdXRwdXRTaW5rR2VuOwotICAgICAgICBpZiAob3V0cHV0U2luayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBmb3JtYXQgPSBGb3JtYXRfSW52YWxpZDsKLSAgICAgICAgICAgIHNhbXBsZVJhdGUgPSAwOworICAgIE5CQUlPX0Zvcm1hdCBwcmV2aW91c0Zvcm1hdCA9IG1Gb3JtYXQ7CisgICAgaWYgKGN1cnJlbnQtPm1PdXRwdXRTaW5rR2VuICE9IG1PdXRwdXRTaW5rR2VuKSB7CisgICAgICAgIG1PdXRwdXRTaW5rID0gY3VycmVudC0+bU91dHB1dFNpbms7CisgICAgICAgIG1PdXRwdXRTaW5rR2VuID0gY3VycmVudC0+bU91dHB1dFNpbmtHZW47CisgICAgICAgIGlmIChtT3V0cHV0U2luayA9PSBOVUxMKSB7CisgICAgICAgICAgICBtRm9ybWF0ID0gRm9ybWF0X0ludmFsaWQ7CisgICAgICAgICAgICBtU2FtcGxlUmF0ZSA9IDA7CiAgICAgICAgICAgICBtU2lua0NoYW5uZWxDb3VudCA9IDA7CiAgICAgICAgICAgICBtU2lua0NoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9ybWF0ID0gb3V0cHV0U2luay0+Zm9ybWF0KCk7Ci0gICAgICAgICAgICBzYW1wbGVSYXRlID0gRm9ybWF0X3NhbXBsZVJhdGUoZm9ybWF0KTsKLSAgICAgICAgICAgIG1TaW5rQ2hhbm5lbENvdW50ID0gRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpOworICAgICAgICAgICAgbUZvcm1hdCA9IG1PdXRwdXRTaW5rLT5mb3JtYXQoKTsKKyAgICAgICAgICAgIG1TYW1wbGVSYXRlID0gRm9ybWF0X3NhbXBsZVJhdGUobUZvcm1hdCk7CisgICAgICAgICAgICBtU2lua0NoYW5uZWxDb3VudCA9IEZvcm1hdF9jaGFubmVsQ291bnQobUZvcm1hdCk7CiAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1TaW5rQ2hhbm5lbENvdW50ID4gQXVkaW9NaXhlcjo6TUFYX05VTV9DSEFOTkVMUyk7CiAKICAgICAgICAgICAgIC8vIFRPRE86IEFkZCBjaGFubmVsIG1hc2sgdG8gTkJBSU9fRm9ybWF0CiAgICAgICAgICAgICAvLyBXZSBhc3N1bWUgdGhhdCB0aGUgY2hhbm5lbCBtYXNrIG11c3QgYmUgYSB2YWxpZCBwb3NpdGlvbmFsIGNoYW5uZWwgbWFzay4KICAgICAgICAgICAgIG1TaW5rQ2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQobVNpbmtDaGFubmVsQ291bnQpOwogICAgICAgICB9Ci0gICAgICAgIGR1bXBTdGF0ZS0+bVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgICAgICBkdW1wU3RhdGUtPm1TYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgfQogCi0gICAgaWYgKCghRm9ybWF0X2lzRXF1YWwoZm9ybWF0LCBwcmV2aW91c0Zvcm1hdCkpIHx8IChmcmFtZUNvdW50ICE9IHByZXZpb3VzLT5tRnJhbWVDb3VudCkpIHsKKyAgICBpZiAoKCFGb3JtYXRfaXNFcXVhbChtRm9ybWF0LCBwcmV2aW91c0Zvcm1hdCkpIHx8IChmcmFtZUNvdW50ICE9IHByZXZpb3VzLT5tRnJhbWVDb3VudCkpIHsKICAgICAgICAgLy8gRklYTUUgdG8gYXZvaWQgcHJpb3JpdHkgaW52ZXJzaW9uLCBkb24ndCBkZWxldGUgaGVyZQotICAgICAgICBkZWxldGUgbWl4ZXI7Ci0gICAgICAgIG1peGVyID0gTlVMTDsKKyAgICAgICAgZGVsZXRlIG1NaXhlcjsKKyAgICAgICAgbU1peGVyID0gTlVMTDsKICAgICAgICAgZnJlZShtTWl4ZXJCdWZmZXIpOwogICAgICAgICBtTWl4ZXJCdWZmZXIgPSBOVUxMOwogICAgICAgICBmcmVlKG1TaW5rQnVmZmVyKTsKICAgICAgICAgbVNpbmtCdWZmZXIgPSBOVUxMOwotICAgICAgICBpZiAoZnJhbWVDb3VudCA+IDAgJiYgc2FtcGxlUmF0ZSA+IDApIHsKKyAgICAgICAgaWYgKGZyYW1lQ291bnQgPiAwICYmIG1TYW1wbGVSYXRlID4gMCkgeworICAgICAgICAgICAgLy8gVGhlIG1peGVyIHByb2R1Y2VzIGVpdGhlciAxNiBiaXQgUENNIG9yIGZsb2F0IG91dHB1dCwgc2VsZWN0CisgICAgICAgICAgICAvLyBmbG9hdCBvdXRwdXQgaWYgdGhlIEhBTCBzdXBwb3J0cyBoaWdoZXIgdGhhbiAxNiBiaXQgcHJlY2lzaW9uLgorICAgICAgICAgICAgbU1peGVyQnVmZmVyRm9ybWF0ID0gbUZvcm1hdC5tRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUID8KKyAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgOiBBVURJT19GT1JNQVRfUENNX0ZMT0FUOwogICAgICAgICAgICAgLy8gRklYTUUgbmV3IG1heSBibG9jayBmb3IgdW5ib3VuZGVkIHRpbWUgYXQgaW50ZXJuYWwgbXV0ZXggb2YgdGhlIGhlYXAKICAgICAgICAgICAgIC8vICAgICAgIGltcGxlbWVudGF0aW9uOyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2ZSBub3JtYWwgbWl4ZXIgYWxsb2NhdGUgZm9yIHVzCiAgICAgICAgICAgICAvLyAgICAgICB0byBhdm9pZCBibG9ja2luZyBoZXJlIGFuZCB0byBwcmV2ZW50IHBvc3NpYmxlIHByaW9yaXR5IGludmVyc2lvbgotICAgICAgICAgICAgbWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihmcmFtZUNvdW50LCBzYW1wbGVSYXRlLCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3MpOworICAgICAgICAgICAgbU1peGVyID0gbmV3IEF1ZGlvTWl4ZXIoZnJhbWVDb3VudCwgbVNhbXBsZVJhdGUsIEZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrcyk7CiAgICAgICAgICAgICBjb25zdCBzaXplX3QgbWl4ZXJGcmFtZVNpemUgPSBtU2lua0NoYW5uZWxDb3VudAogICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobU1peGVyQnVmZmVyRm9ybWF0KTsKICAgICAgICAgICAgIG1NaXhlckJ1ZmZlclNpemUgPSBtaXhlckZyYW1lU2l6ZSAqIGZyYW1lQ291bnQ7CiAgICAgICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbU1peGVyQnVmZmVyLCAzMiwgbU1peGVyQnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2lua0ZyYW1lU2l6ZSA9IG1TaW5rQ2hhbm5lbENvdW50Ci0gICAgICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQubUZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRm9ybWF0Lm1Gb3JtYXQpOwogICAgICAgICAgICAgaWYgKHNpbmtGcmFtZVNpemUgPiBtaXhlckZyYW1lU2l6ZSkgeyAvLyBuZWVkIGEgc2luayBidWZmZXIKICAgICAgICAgICAgICAgICBtU2lua0J1ZmZlclNpemUgPSBzaW5rRnJhbWVTaXplICogZnJhbWVDb3VudDsKICAgICAgICAgICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbVNpbmtCdWZmZXIsIDMyLCBtU2lua0J1ZmZlclNpemUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcGVyaW9kTnMgPSAoZnJhbWVDb3VudCAqIDEwMDAwMDAwMDBMTCkgLyBzYW1wbGVSYXRlOyAgICAvLyAxLjAwCi0gICAgICAgICAgICB1bmRlcnJ1bk5zID0gKGZyYW1lQ291bnQgKiAxNzUwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgIC8vIDEuNzUKLSAgICAgICAgICAgIG92ZXJydW5OcyA9IChmcmFtZUNvdW50ICogNTAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgLy8gMC41MAotICAgICAgICAgICAgZm9yY2VOcyA9IChmcmFtZUNvdW50ICogOTUwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgICAvLyAwLjk1Ci0gICAgICAgICAgICB3YXJtdXBOcyA9IChmcmFtZUNvdW50ICogNTAwMDAwMDAwTEwpIC8gc2FtcGxlUmF0ZTsgICAgIC8vIDAuNTAKKyAgICAgICAgICAgIG1QZXJpb2ROcyA9IChmcmFtZUNvdW50ICogMTAwMDAwMDAwMExMKSAvIG1TYW1wbGVSYXRlOyAgICAvLyAxLjAwCisgICAgICAgICAgICBtVW5kZXJydW5OcyA9IChmcmFtZUNvdW50ICogMTc1MDAwMDAwMExMKSAvIG1TYW1wbGVSYXRlOyAgLy8gMS43NQorICAgICAgICAgICAgbU92ZXJydW5OcyA9IChmcmFtZUNvdW50ICogNTAwMDAwMDAwTEwpIC8gbVNhbXBsZVJhdGU7ICAgIC8vIDAuNTAKKyAgICAgICAgICAgIG1Gb3JjZU5zID0gKGZyYW1lQ291bnQgKiA5NTAwMDAwMDBMTCkgLyBtU2FtcGxlUmF0ZTsgICAgICAvLyAwLjk1CisgICAgICAgICAgICBtV2FybXVwTnNNaW4gPSAoZnJhbWVDb3VudCAqIDc1MDAwMDAwMExMKSAvIG1TYW1wbGVSYXRlOyAgLy8gMC43NQorICAgICAgICAgICAgbVdhcm11cE5zTWF4ID0gKGZyYW1lQ291bnQgKiAxMjUwMDAwMDAwTEwpIC8gbVNhbXBsZVJhdGU7IC8vIDEuMjUKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBlcmlvZE5zID0gMDsKLSAgICAgICAgICAgIHVuZGVycnVuTnMgPSAwOwotICAgICAgICAgICAgb3ZlcnJ1bk5zID0gMDsKLSAgICAgICAgICAgIGZvcmNlTnMgPSAwOwotICAgICAgICAgICAgd2FybXVwTnMgPSAwOworICAgICAgICAgICAgbVBlcmlvZE5zID0gMDsKKyAgICAgICAgICAgIG1VbmRlcnJ1bk5zID0gMDsKKyAgICAgICAgICAgIG1PdmVycnVuTnMgPSAwOworICAgICAgICAgICAgbUZvcmNlTnMgPSAwOworICAgICAgICAgICAgbVdhcm11cE5zTWluID0gMDsKKyAgICAgICAgICAgIG1XYXJtdXBOc01heCA9IExPTkdfTUFYOwogICAgICAgICB9CiAgICAgICAgIG1NaXhlckJ1ZmZlclN0YXRlID0gVU5ERUZJTkVEOwogI2lmICFMT0dfTkRFQlVHCiAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3M7ICsraSkgewotICAgICAgICAgICAgZmFzdFRyYWNrTmFtZXNbaV0gPSAtMTsKKyAgICAgICAgICAgIG1GYXN0VHJhY2tOYW1lc1tpXSA9IC0xOwogICAgICAgICB9CiAjZW5kaWYKICAgICAgICAgLy8gd2UgbmVlZCB0byByZWNvbmZpZ3VyZSBhbGwgYWN0aXZlIHRyYWNrcwogICAgICAgICBwcmV2aW91c1RyYWNrTWFzayA9IDA7Ci0gICAgICAgIGZhc3RUcmFja3NHZW4gPSBjdXJyZW50LT5tRmFzdFRyYWNrc0dlbiAtIDE7CisgICAgICAgIG1GYXN0VHJhY2tzR2VuID0gY3VycmVudC0+bUZhc3RUcmFja3NHZW4gLSAxOwogICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKICAgICB9IGVsc2UgewogICAgICAgICBwcmV2aW91c1RyYWNrTWFzayA9IHByZXZpb3VzLT5tVHJhY2tNYXNrOwpAQCAtMjE5LDcgKzIyNiw3IEBACiAgICAgLy8gY2hlY2sgZm9yIGNoYW5nZSBpbiBhY3RpdmUgdHJhY2sgc2V0CiAgICAgY29uc3QgdW5zaWduZWQgY3VycmVudFRyYWNrTWFzayA9IGN1cnJlbnQtPm1UcmFja01hc2s7CiAgICAgZHVtcFN0YXRlLT5tVHJhY2tNYXNrID0gY3VycmVudFRyYWNrTWFzazsKLSAgICBpZiAoY3VycmVudC0+bUZhc3RUcmFja3NHZW4gIT0gZmFzdFRyYWNrc0dlbikgeworICAgIGlmIChjdXJyZW50LT5tRmFzdFRyYWNrc0dlbiAhPSBtRmFzdFRyYWNrc0dlbikgewogICAgICAgICBBTE9HX0FTU0VSVChtTWl4ZXJCdWZmZXIgIT0gTlVMTCk7CiAgICAgICAgIGludCBuYW1lOwogCkBAIC0yMzAsMTYgKzIzNywxNiBAQAogICAgICAgICAgICAgcmVtb3ZlZFRyYWNrcyAmPSB+KDEgPDwgaSk7CiAgICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyID09IE5VTEwpOwotICAgICAgICAgICAgaWYgKG1peGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gZmFzdFRyYWNrTmFtZXNbaV07CisgICAgICAgICAgICBpZiAobU1peGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gbUZhc3RUcmFja05hbWVzW2ldOwogICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG5hbWUgPj0gMCk7Ci0gICAgICAgICAgICAgICAgbWl4ZXItPmRlbGV0ZVRyYWNrTmFtZShuYW1lKTsKKyAgICAgICAgICAgICAgICBtTWl4ZXItPmRlbGV0ZVRyYWNrTmFtZShuYW1lKTsKICAgICAgICAgICAgIH0KICNpZiAhTE9HX05ERUJVRwotICAgICAgICAgICAgZmFzdFRyYWNrTmFtZXNbaV0gPSAtMTsKKyAgICAgICAgICAgIG1GYXN0VHJhY2tOYW1lc1tpXSA9IC0xOwogI2VuZGlmCiAgICAgICAgICAgICAvLyBkb24ndCByZXNldCB0cmFjayBkdW1wIHN0YXRlLCBzaW5jZSBvdGhlciBzaWRlIGlzIGlnbm9yaW5nIGl0Ci0gICAgICAgICAgICBnZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247CisgICAgICAgICAgICBtR2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOwogICAgICAgICB9CiAKICAgICAgICAgLy8gbm93IHByb2Nlc3MgYWRkZWQgdHJhY2tzCkBAIC0yNDksMjkgKzI1NiwyOSBAQAogICAgICAgICAgICAgYWRkZWRUcmFja3MgJj0gfigxIDw8IGkpOwogICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07CiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyICpidWZmZXJQcm92aWRlciA9IGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyOwotICAgICAgICAgICAgQUxPR19BU1NFUlQoYnVmZmVyUHJvdmlkZXIgIT0gTlVMTCAmJiBmYXN0VHJhY2tOYW1lc1tpXSA9PSAtMSk7Ci0gICAgICAgICAgICBpZiAobWl4ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG5hbWUgPSBtaXhlci0+Z2V0VHJhY2tOYW1lKGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrLAorICAgICAgICAgICAgQUxPR19BU1NFUlQoYnVmZmVyUHJvdmlkZXIgIT0gTlVMTCAmJiBtRmFzdFRyYWNrTmFtZXNbaV0gPT0gLTEpOworICAgICAgICAgICAgaWYgKG1NaXhlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbmFtZSA9IG1NaXhlci0+Z2V0VHJhY2tOYW1lKGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tRm9ybWF0LCBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpOwogICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG5hbWUgPj0gMCk7Ci0gICAgICAgICAgICAgICAgZmFzdFRyYWNrTmFtZXNbaV0gPSBuYW1lOwotICAgICAgICAgICAgICAgIG1peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCBidWZmZXJQcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsCisgICAgICAgICAgICAgICAgbUZhc3RUcmFja05hbWVzW2ldID0gbmFtZTsKKyAgICAgICAgICAgICAgICBtTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIGJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUFJTl9CVUZGRVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKW1NaXhlckJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgLy8gbmV3bHkgYWxsb2NhdGVkIHRyYWNrIG5hbWVzIGRlZmF1bHQgdG8gZnVsbCBzY2FsZSB2b2x1bWUKLSAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKW1NaXhlckJ1ZmZlckZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Rk9STUFULAorICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpGT1JNQVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tRm9ybWF0KTsKLSAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfTUFTSywKICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1DaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssCiAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpbVNpbmtDaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgbWl4ZXItPmVuYWJsZShuYW1lKTsKKyAgICAgICAgICAgICAgICBtTWl4ZXItPmVuYWJsZShuYW1lKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdlbmVyYXRpb25zW2ldID0gZmFzdFRyYWNrLT5tR2VuZXJhdGlvbjsKKyAgICAgICAgICAgIG1HZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247CiAgICAgICAgIH0KIAogICAgICAgICAvLyBmaW5hbGx5IHByb2Nlc3MgKHBvdGVudGlhbGx5KSBtb2RpZmllZCB0cmFja3M7IHRoZXNlIHVzZSB0aGUgc2FtZSBzbG90CkBAIC0yODEsMzggKzI4OCwzOCBAQAogICAgICAgICAgICAgaW50IGkgPSBfX2J1aWx0aW5fY3R6KG1vZGlmaWVkVHJhY2tzKTsKICAgICAgICAgICAgIG1vZGlmaWVkVHJhY2tzICY9IH4oMSA8PCBpKTsKICAgICAgICAgICAgIGNvbnN0IEZhc3RUcmFjayogZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2ldOwotICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bUdlbmVyYXRpb24gIT0gZ2VuZXJhdGlvbnNbaV0pIHsKKyAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1HZW5lcmF0aW9uICE9IG1HZW5lcmF0aW9uc1tpXSkgewogICAgICAgICAgICAgICAgIC8vIHRoaXMgdHJhY2sgd2FzIGFjdHVhbGx5IG1vZGlmaWVkCiAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciAqYnVmZmVyUHJvdmlkZXIgPSBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlcjsKICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChidWZmZXJQcm92aWRlciAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICBpZiAobWl4ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBuYW1lID0gZmFzdFRyYWNrTmFtZXNbaV07CisgICAgICAgICAgICAgICAgaWYgKG1NaXhlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBtRmFzdFRyYWNrTmFtZXNbaV07CiAgICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG5hbWUgPj0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCBidWZmZXJQcm92aWRlcik7CisgICAgICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgYnVmZmVyUHJvdmlkZXIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZmFzdFRyYWNrLT5tVm9sdW1lUHJvdmlkZXIgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZiA9IEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJmYpOworICAgICAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmZik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSRVNBTVBMRSwKKyAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UkVNT1ZFLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9GT1JNQVQsICh2b2lkICopbU1peGVyQnVmZmVyRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Rk9STUFULAorICAgICAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6Rk9STUFULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1Gb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCltU2lua0NoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBlbmFibGVkCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGdlbmVyYXRpb25zW2ldID0gZmFzdFRyYWNrLT5tR2VuZXJhdGlvbjsKKyAgICAgICAgICAgICAgICBtR2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgZmFzdFRyYWNrc0dlbiA9IGN1cnJlbnQtPm1GYXN0VHJhY2tzR2VuOworICAgICAgICBtRmFzdFRyYWNrc0dlbiA9IGN1cnJlbnQtPm1GYXN0VHJhY2tzR2VuOwogCiAgICAgICAgIGR1bXBTdGF0ZS0+bU51bVRyYWNrcyA9IHBvcGNvdW50KGN1cnJlbnRUcmFja01hc2spOwogICAgIH0KQEAgLTMyMCwxMiArMzI3LDEyIEBACiAKIHZvaWQgRmFzdE1peGVyOjpvbldvcmsoKQogewotICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSB0aGlzLT5jdXJyZW50OwotICAgIEZhc3RNaXhlckR1bXBTdGF0ZSAqIGNvbnN0IGR1bXBTdGF0ZSA9IChGYXN0TWl4ZXJEdW1wU3RhdGUgKikgdGhpcy0+ZHVtcFN0YXRlOwotICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlOjpDb21tYW5kIGNvbW1hbmQgPSB0aGlzLT5jb21tYW5kOworICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSBtQ3VycmVudDsKKyAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdE1peGVyRHVtcFN0YXRlICopIG1EdW1wU3RhdGU7CisgICAgY29uc3QgRmFzdE1peGVyU3RhdGU6OkNvbW1hbmQgY29tbWFuZCA9IG1Db21tYW5kOwogICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7CiAKLSAgICBpZiAoKGNvbW1hbmQgJiBGYXN0TWl4ZXJTdGF0ZTo6TUlYKSAmJiAobWl4ZXIgIT0gTlVMTCkgJiYgaXNXYXJtKSB7CisgICAgaWYgKChjb21tYW5kICYgRmFzdE1peGVyU3RhdGU6Ok1JWCkgJiYgKG1NaXhlciAhPSBOVUxMKSAmJiBtSXNXYXJtKSB7CiAgICAgICAgIEFMT0dfQVNTRVJUKG1NaXhlckJ1ZmZlciAhPSBOVUxMKTsKICAgICAgICAgLy8gZm9yIGVhY2ggdHJhY2ssIHVwZGF0ZSB2b2x1bWUgYW5kIGNoZWNrIGZvciB1bmRlcnJ1bgogICAgICAgICB1bnNpZ25lZCBjdXJyZW50VHJhY2tNYXNrID0gY3VycmVudC0+bVRyYWNrTWFzazsKQEAgLTMzNSw5ICszNDIsOSBAQAogICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07CiAKICAgICAgICAgICAgIC8vIFJlZnJlc2ggdGhlIHBlci10cmFjayB0aW1lc3RhbXAKLSAgICAgICAgICAgIGlmICh0aW1lc3RhbXBTdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGlmIChtVGltZXN0YW1wU3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhY2tGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0KLSAgICAgICAgICAgICAgICAgICAgbmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZDsKKyAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQ7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgdHJhY2tGcmFtZXNXcml0dGVuID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXItPmZyYW1lc1JlbGVhc2VkKCk7CiAgICAgICAgICAgICAgICAgLy8gQ2FuJ3QgcHJvdmlkZSBhbiBBdWRpb1RpbWVzdGFtcCBiZWZvcmUgZmlyc3QgZnJhbWUgcHJlc2VudGVkLAogICAgICAgICAgICAgICAgIC8vIG9yIGR1cmluZyB0aGUgYnJpZWYgMzItYml0IHdyYXBhcm91bmQgd2luZG93CkBAIC0zNDUsMjAgKzM1MiwyMCBAQAogICAgICAgICAgICAgICAgICAgICBBdWRpb1RpbWVzdGFtcCBwZXJUcmFja1RpbWVzdGFtcDsKICAgICAgICAgICAgICAgICAgICAgcGVyVHJhY2tUaW1lc3RhbXAubVBvc2l0aW9uID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0ZyYW1lc1dyaXR0ZW4gLSB0cmFja0ZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQ7Ci0gICAgICAgICAgICAgICAgICAgIHBlclRyYWNrVGltZXN0YW1wLm1UaW1lID0gdGltZXN0YW1wLm1UaW1lOworICAgICAgICAgICAgICAgICAgICBwZXJUcmFja1RpbWVzdGFtcC5tVGltZSA9IG1UaW1lc3RhbXAubVRpbWU7CiAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyLT5vblRpbWVzdGFtcChwZXJUcmFja1RpbWVzdGFtcCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpbnQgbmFtZSA9IGZhc3RUcmFja05hbWVzW2ldOworICAgICAgICAgICAgaW50IG5hbWUgPSBtRmFzdFRyYWNrTmFtZXNbaV07CiAgICAgICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOwogICAgICAgICAgICAgaWYgKGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCB2bHIgPSBmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlci0+Z2V0Vm9sdW1lTFIoKTsKICAgICAgICAgICAgICAgICBmbG9hdCB2bGYgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSk7CiAgICAgICAgICAgICAgICAgZmxvYXQgdnJmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKTsKIAotICAgICAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmdmxmKTsKLSAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgJnZyZik7CisgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmdmxmKTsKKyAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gRklYTUUgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZnJhbWVzUmVhZHkoKSBmb3IgZmFzdCB0cmFja3MKICAgICAgICAgICAgIC8vIHRha2VzIGEgdHJ5TG9jaywgd2hpY2ggY2FuIGJsb2NrCkBAIC0zNzksNDMgKzM4Niw0NCBAQAogICAgICAgICAgICAgICAgIGlmIChmcmFtZXNSZWFkeSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHVuZGVycnVucy5tQml0RmllbGRzLm1FbXB0eSsrOwogICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCA9IFVOREVSUlVOX0VNUFRZOwotICAgICAgICAgICAgICAgICAgICBtaXhlci0+ZGlzYWJsZShuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5kaXNhYmxlKG5hbWUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93IG1peGluZyBwYXJ0aWFsIGJ1ZmZlcgogICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tUGFydGlhbCsrOwogICAgICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCA9IFVOREVSUlVOX1BBUlRJQUw7Ci0gICAgICAgICAgICAgICAgICAgIG1peGVyLT5lbmFibGUobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIG1NaXhlci0+ZW5hYmxlKG5hbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdW5kZXJydW5zLm1CaXRGaWVsZHMubUZ1bGwrKzsKICAgICAgICAgICAgICAgICB1bmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCA9IFVOREVSUlVOX0ZVTEw7Ci0gICAgICAgICAgICAgICAgbWl4ZXItPmVuYWJsZShuYW1lKTsKKyAgICAgICAgICAgICAgICBtTWl4ZXItPmVuYWJsZShuYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZ0RHVtcC0+bVVuZGVycnVucyA9IHVuZGVycnVuczsKICAgICAgICAgICAgIGZ0RHVtcC0+bUZyYW1lc1JlYWR5ID0gZnJhbWVzUmVhZHk7CiAgICAgICAgIH0KIAogICAgICAgICBpbnQ2NF90IHB0czsKLSAgICAgICAgaWYgKG91dHB1dFNpbmsgPT0gTlVMTCB8fCAoT0sgIT0gb3V0cHV0U2luay0+Z2V0TmV4dFdyaXRlVGltZXN0YW1wKCZwdHMpKSkgeworICAgICAgICBpZiAobU91dHB1dFNpbmsgPT0gTlVMTCB8fCAoT0sgIT0gbU91dHB1dFNpbmstPmdldE5leHRXcml0ZVRpbWVzdGFtcCgmcHRzKSkpIHsKICAgICAgICAgICAgIHB0cyA9IEF1ZGlvQnVmZmVyUHJvdmlkZXI6OmtJbnZhbGlkUFRTOwogICAgICAgICB9CiAKICAgICAgICAgLy8gcHJvY2VzcygpIGlzIENQVS1ib3VuZAotICAgICAgICBtaXhlci0+cHJvY2VzcyhwdHMpOworICAgICAgICBtTWl4ZXItPnByb2Nlc3MocHRzKTsKICAgICAgICAgbU1peGVyQnVmZmVyU3RhdGUgPSBNSVhFRDsKICAgICB9IGVsc2UgaWYgKG1NaXhlckJ1ZmZlclN0YXRlID09IE1JWEVEKSB7CiAgICAgICAgIG1NaXhlckJ1ZmZlclN0YXRlID0gVU5ERUZJTkVEOwogICAgIH0KICAgICAvL2Jvb2wgZGlkRnVsbFdyaXRlID0gZmFsc2U7ICAgIC8vIGR1bXBzeXMgY291bGQgZGlzcGxheSBhIGNvdW50IG9mIHBhcnRpYWwgd3JpdGVzCi0gICAgaWYgKChjb21tYW5kICYgRmFzdE1peGVyU3RhdGU6OldSSVRFKSAmJiAob3V0cHV0U2luayAhPSBOVUxMKSAmJiAobU1peGVyQnVmZmVyICE9IE5VTEwpKSB7CisgICAgaWYgKChjb21tYW5kICYgRmFzdE1peGVyU3RhdGU6OldSSVRFKSAmJiAobU91dHB1dFNpbmsgIT0gTlVMTCkgJiYgKG1NaXhlckJ1ZmZlciAhPSBOVUxMKSkgewogICAgICAgICBpZiAobU1peGVyQnVmZmVyU3RhdGUgPT0gVU5ERUZJTkVEKSB7CiAgICAgICAgICAgICBtZW1zZXQobU1peGVyQnVmZmVyLCAwLCBtTWl4ZXJCdWZmZXJTaXplKTsKICAgICAgICAgICAgIG1NaXhlckJ1ZmZlclN0YXRlID0gWkVST0VEOwogICAgICAgICB9CisgICAgICAgIC8vIHByZXBhcmUgdGhlIGJ1ZmZlciB1c2VkIHRvIHdyaXRlIHRvIHNpbmsKICAgICAgICAgdm9pZCAqYnVmZmVyID0gbVNpbmtCdWZmZXIgIT0gTlVMTCA/IG1TaW5rQnVmZmVyIDogbU1peGVyQnVmZmVyOwotICAgICAgICBpZiAoZm9ybWF0Lm1Gb3JtYXQgIT0gbU1peGVyQnVmZmVyRm9ybWF0KSB7IC8vIHNpbmsgZm9ybWF0IG5vdCB0aGUgc2FtZSBhcyBtaXhlciBmb3JtYXQKLSAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoYnVmZmVyLCBmb3JtYXQubUZvcm1hdCwgbU1peGVyQnVmZmVyLCBtTWl4ZXJCdWZmZXJGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgKiBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCkpOworICAgICAgICBpZiAobUZvcm1hdC5tRm9ybWF0ICE9IG1NaXhlckJ1ZmZlckZvcm1hdCkgeyAvLyBzaW5rIGZvcm1hdCBub3QgdGhlIHNhbWUgYXMgbWl4ZXIgZm9ybWF0CisgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGJ1ZmZlciwgbUZvcm1hdC5tRm9ybWF0LCBtTWl4ZXJCdWZmZXIsIG1NaXhlckJ1ZmZlckZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCAqIEZvcm1hdF9jaGFubmVsQ291bnQobUZvcm1hdCkpOwogICAgICAgICB9CiAgICAgICAgIC8vIGlmIG5vbi1OVUxMLCB0aGVuIGR1cGxpY2F0ZSB3cml0ZSgpIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKICAgICAgICAgTkJBSU9fU2luayogdGVlU2luazsKQEAgLTQyNiwyNTIgKzQzNCwzNCBAQAogICAgICAgICAvLyAgICAgICBidXQgdGhpcyBjb2RlIHNob3VsZCBiZSBtb2RpZmllZCB0byBoYW5kbGUgYm90aCBub24tYmxvY2tpbmcgYW5kIGJsb2NraW5nIHNpbmtzCiAgICAgICAgIGR1bXBTdGF0ZS0+bVdyaXRlU2VxdWVuY2UrKzsKICAgICAgICAgQVRSQUNFX0JFR0lOKCJ3cml0ZSIpOwotICAgICAgICBzc2l6ZV90IGZyYW1lc1dyaXR0ZW4gPSBvdXRwdXRTaW5rLT53cml0ZShidWZmZXIsIGZyYW1lQ291bnQpOworICAgICAgICBzc2l6ZV90IGZyYW1lc1dyaXR0ZW4gPSBtT3V0cHV0U2luay0+d3JpdGUoYnVmZmVyLCBmcmFtZUNvdW50KTsKICAgICAgICAgQVRSQUNFX0VORCgpOwogICAgICAgICBkdW1wU3RhdGUtPm1Xcml0ZVNlcXVlbmNlKys7CiAgICAgICAgIGlmIChmcmFtZXNXcml0dGVuID49IDApIHsKICAgICAgICAgICAgIEFMT0dfQVNTRVJUKChzaXplX3QpIGZyYW1lc1dyaXR0ZW4gPD0gZnJhbWVDb3VudCk7Ci0gICAgICAgICAgICB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gKz0gZnJhbWVzV3JpdHRlbjsKLSAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lc1dyaXR0ZW4gPSB0b3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW47CisgICAgICAgICAgICBtVG90YWxOYXRpdmVGcmFtZXNXcml0dGVuICs9IGZyYW1lc1dyaXR0ZW47CisgICAgICAgICAgICBkdW1wU3RhdGUtPm1GcmFtZXNXcml0dGVuID0gbVRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbjsKICAgICAgICAgICAgIC8vaWYgKChzaXplX3QpIGZyYW1lc1dyaXR0ZW4gPT0gZnJhbWVDb3VudCkgewogICAgICAgICAgICAgLy8gICAgZGlkRnVsbFdyaXRlID0gdHJ1ZTsKICAgICAgICAgICAgIC8vfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZHVtcFN0YXRlLT5tV3JpdGVFcnJvcnMrKzsKICAgICAgICAgfQotICAgICAgICBhdHRlbXB0ZWRXcml0ZSA9IHRydWU7CisgICAgICAgIG1BdHRlbXB0ZWRXcml0ZSA9IHRydWU7CiAgICAgICAgIC8vIEZJWE1FIGNvdW50ICMgb2Ygd3JpdGVzIGJsb2NrZWQgZXhjZXNzaXZlbHksIENQVSB1c2FnZSwgZXRjLiBmb3IgZHVtcAogCi0gICAgICAgIHRpbWVzdGFtcFN0YXR1cyA9IG91dHB1dFNpbmstPmdldFRpbWVzdGFtcCh0aW1lc3RhbXApOwotICAgICAgICBpZiAodGltZXN0YW1wU3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA9IHRpbWVzdGFtcC5tUG9zaXRpb247Ci0gICAgICAgICAgICBpZiAodG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQgPD0gdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuKSB7Ci0gICAgICAgICAgICAgICAgbmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCA9Ci0gICAgICAgICAgICAgICAgICAgIHRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbiAtIHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkOworICAgICAgICBtVGltZXN0YW1wU3RhdHVzID0gbU91dHB1dFNpbmstPmdldFRpbWVzdGFtcChtVGltZXN0YW1wKTsKKyAgICAgICAgaWYgKG1UaW1lc3RhbXBTdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkID0gbVRpbWVzdGFtcC5tUG9zaXRpb247CisgICAgICAgICAgICBpZiAodG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQgPD0gbVRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbikgeworICAgICAgICAgICAgICAgIG1OYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0KKyAgICAgICAgICAgICAgICAgICAgbVRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbiAtIHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBIQUwgcmVwb3J0ZWQgdGhhdCBtb3JlIGZyYW1lcyB3ZXJlIHByZXNlbnRlZCB0aGFuIHdlcmUgd3JpdHRlbgotICAgICAgICAgICAgICAgIHRpbWVzdGFtcFN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAotRmFzdE1peGVyRHVtcFN0YXRlOjpGYXN0TWl4ZXJEdW1wU3RhdGUoCi0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgICAgIHVpbnQzMl90IHNhbXBsaW5nTgotI2VuZGlmCi0gICAgICAgICkgOiBGYXN0VGhyZWFkRHVtcFN0YXRlKCksCi0gICAgbVdyaXRlU2VxdWVuY2UoMCksIG1GcmFtZXNXcml0dGVuKDApLAotICAgIG1OdW1UcmFja3MoMCksIG1Xcml0ZUVycm9ycygwKSwKLSAgICBtU2FtcGxlUmF0ZSgwKSwgbUZyYW1lQ291bnQoMCksCi0gICAgbVRyYWNrTWFzaygwKQotewotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgIGluY3JlYXNlU2FtcGxpbmdOKHNhbXBsaW5nTik7Ci0jZW5kaWYKLX0KLQotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotdm9pZCBGYXN0TWl4ZXJEdW1wU3RhdGU6OmluY3JlYXNlU2FtcGxpbmdOKHVpbnQzMl90IHNhbXBsaW5nTikKLXsKLSAgICBpZiAoc2FtcGxpbmdOIDw9IG1TYW1wbGluZ04gfHwgc2FtcGxpbmdOID4ga1NhbXBsaW5nTiB8fCByb3VuZHVwKHNhbXBsaW5nTikgIT0gc2FtcGxpbmdOKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdWludDMyX3QgYWRkaXRpb25hbCA9IHNhbXBsaW5nTiAtIG1TYW1wbGluZ047Ci0gICAgLy8gc2FtcGxlIGFycmF5cyBhcmVuJ3QgYWNjZXNzZWQgYXRvbWljYWxseSB3aXRoIHJlc3BlY3QgdG8gdGhlIGJvdW5kcywKLSAgICAvLyBzbyBjbGVhcmluZyByZWR1Y2VzIGNoYW5jZSBmb3IgZHVtcHN5cyB0byByZWFkIHJhbmRvbSB1bmluaXRpYWxpemVkIHNhbXBsZXMKLSAgICBtZW1zZXQoJm1Nb25vdG9uaWNOc1ttU2FtcGxpbmdOXSwgMCwgc2l6ZW9mKG1Nb25vdG9uaWNOc1swXSkgKiBhZGRpdGlvbmFsKTsKLSAgICBtZW1zZXQoJm1Mb2FkTnNbbVNhbXBsaW5nTl0sIDAsIHNpemVvZihtTG9hZE5zWzBdKSAqIGFkZGl0aW9uYWwpOwotI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwotICAgIG1lbXNldCgmbUNwdWtIelttU2FtcGxpbmdOXSwgMCwgc2l6ZW9mKG1DcHVrSHpbMF0pICogYWRkaXRpb25hbCk7Ci0jZW5kaWYKLSAgICBtU2FtcGxpbmdOID0gc2FtcGxpbmdOOwotfQotI2VuZGlmCi0KLUZhc3RNaXhlckR1bXBTdGF0ZTo6fkZhc3RNaXhlckR1bXBTdGF0ZSgpCi17Ci19Ci0KLS8vIGhlbHBlciBmdW5jdGlvbiBjYWxsZWQgYnkgcXNvcnQoKQotc3RhdGljIGludCBjb21wYXJlX3VpbnQzMl90KGNvbnN0IHZvaWQgKnBhLCBjb25zdCB2b2lkICpwYikKLXsKLSAgICB1aW50MzJfdCBhID0gKihjb25zdCB1aW50MzJfdCAqKXBhOwotICAgIHVpbnQzMl90IGIgPSAqKGNvbnN0IHVpbnQzMl90ICopcGI7Ci0gICAgaWYgKGEgPCBiKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9IGVsc2UgaWYgKGEgPiBiKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotdm9pZCBGYXN0TWl4ZXJEdW1wU3RhdGU6OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIGlmIChtQ29tbWFuZCA9PSBGYXN0TWl4ZXJTdGF0ZTo6SU5JVElBTCkgewotICAgICAgICBkcHJpbnRmKGZkLCAiICBGYXN0TWl4ZXIgbm90IGluaXRpYWxpemVkXG4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNkZWZpbmUgQ09NTUFORF9NQVggMzIKLSAgICBjaGFyIHN0cmluZ1tDT01NQU5EX01BWF07Ci0gICAgc3dpdGNoIChtQ29tbWFuZCkgewotICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6OklOSVRJQUw6Ci0gICAgICAgIHN0cmNweShzdHJpbmcsICJJTklUSUFMIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6OkhPVF9JRExFOgotICAgICAgICBzdHJjcHkoc3RyaW5nLCAiSE9UX0lETEUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6Q09MRF9JRExFOgotICAgICAgICBzdHJjcHkoc3RyaW5nLCAiQ09MRF9JRExFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6OkVYSVQ6Ci0gICAgICAgIHN0cmNweShzdHJpbmcsICJFWElUIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6Ok1JWDoKLSAgICAgICAgc3RyY3B5KHN0cmluZywgIk1JWCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEZhc3RNaXhlclN0YXRlOjpXUklURToKLSAgICAgICAgc3RyY3B5KHN0cmluZywgIldSSVRFIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6Ok1JWF9XUklURToKLSAgICAgICAgc3RyY3B5KHN0cmluZywgIk1JWF9XUklURSIpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBzbnByaW50ZihzdHJpbmcsIENPTU1BTkRfTUFYLCAiJWQiLCBtQ29tbWFuZCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkb3VibGUgbWVhc3VyZWRXYXJtdXBNcyA9IChtTWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgKiAxMDAwLjApICsKLSAgICAgICAgICAgIChtTWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjIC8gMTAwMDAwMC4wKTsKLSAgICBkb3VibGUgbWl4UGVyaW9kU2VjID0gKGRvdWJsZSkgbUZyYW1lQ291bnQgLyAoZG91YmxlKSBtU2FtcGxlUmF0ZTsKLSAgICBkcHJpbnRmKGZkLCAiICBGYXN0TWl4ZXIgY29tbWFuZD0lcyB3cml0ZVNlcXVlbmNlPSV1IGZyYW1lc1dyaXR0ZW49JXVcbiIKLSAgICAgICAgICAgICAgICAiICAgICAgICAgICAgbnVtVHJhY2tzPSV1IHdyaXRlRXJyb3JzPSV1IHVuZGVycnVucz0ldSBvdmVycnVucz0ldVxuIgotICAgICAgICAgICAgICAgICIgICAgICAgICAgICBzYW1wbGVSYXRlPSV1IGZyYW1lQ291bnQ9JXp1IG1lYXN1cmVkV2FybXVwPSUuM2cgbXMsIHdhcm11cEN5Y2xlcz0ldVxuIgotICAgICAgICAgICAgICAgICIgICAgICAgICAgICBtaXhQZXJpb2Q9JS4yZiBtc1xuIiwKLSAgICAgICAgICAgICAgICAgc3RyaW5nLCBtV3JpdGVTZXF1ZW5jZSwgbUZyYW1lc1dyaXR0ZW4sCi0gICAgICAgICAgICAgICAgIG1OdW1UcmFja3MsIG1Xcml0ZUVycm9ycywgbVVuZGVycnVucywgbU92ZXJydW5zLAotICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUZyYW1lQ291bnQsIG1lYXN1cmVkV2FybXVwTXMsIG1XYXJtdXBDeWNsZXMsCi0gICAgICAgICAgICAgICAgIG1peFBlcmlvZFNlYyAqIDFlMyk7Ci0jaWZkZWYgRkFTVF9NSVhFUl9TVEFUSVNUSUNTCi0gICAgLy8gZmluZCB0aGUgaW50ZXJ2YWwgb2YgdmFsaWQgc2FtcGxlcwotICAgIHVpbnQzMl90IGJvdW5kcyA9IG1Cb3VuZHM7Ci0gICAgdWludDMyX3QgbmV3ZXN0T3BlbiA9IGJvdW5kcyAmIDB4RkZGRjsKLSAgICB1aW50MzJfdCBvbGRlc3RDbG9zZWQgPSBib3VuZHMgPj4gMTY7Ci0gICAgdWludDMyX3QgbiA9IChuZXdlc3RPcGVuIC0gb2xkZXN0Q2xvc2VkKSAmIDB4RkZGRjsKLSAgICBpZiAobiA+IG1TYW1wbGluZ04pIHsKLSAgICAgICAgQUxPR0UoInRvbyBtYW55IHNhbXBsZXMgJXUiLCBuKTsKLSAgICAgICAgbiA9IG1TYW1wbGluZ047Ci0gICAgfQotICAgIC8vIHN0YXRpc3RpY3MgZm9yIG1vbm90b25pYyAod2FsbCBjbG9jaykgdGltZSwgdGhyZWFkIHJhdyBDUFUgbG9hZCBpbiB0aW1lLCBDUFUgY2xvY2sgZnJlcXVlbmN5LAotICAgIC8vIGFuZCBhZGp1c3RlZCBDUFUgbG9hZCBpbiBNSHogbm9ybWFsaXplZCBmb3IgQ1BVIGNsb2NrIGZyZXF1ZW5jeQotICAgIENlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3Mgd2FsbCwgbG9hZE5zOwotI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwotICAgIENlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3Mga0h6LCBsb2FkTUh6OwotICAgIHVpbnQzMl90IHByZXZpb3VzQ3B1a0h6ID0gMDsKLSNlbmRpZgotICAgIC8vIEFzc3VtaW5nIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBmb3IgY3ljbGUgdGltZXMsIHRocmVlIHN0YW5kYXJkIGRldmlhdGlvbnMgb24gZWl0aGVyIHNpZGUgb2YKLSAgICAvLyB0aGUgbWVhbiBhY2NvdW50IGZvciA5OS43MyUgb2YgdGhlIHBvcHVsYXRpb24uICBTbyBpZiB3ZSB0YWtlIGVhY2ggdGFpbCB0byBiZSAxLzEwMDAgb2YgdGhlCi0gICAgLy8gc2FtcGxlIHNldCwgd2UgZ2V0IDk5LjglIGNvbWJpbmVkLCBvciBjbG9zZSB0byB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zLgotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrVGFpbERlbm9taW5hdG9yID0gMTAwMDsKLSAgICB1aW50MzJfdCAqdGFpbCA9IG4gPj0ga1RhaWxEZW5vbWluYXRvciA/IG5ldyB1aW50MzJfdFtuXSA6IE5VTEw7Ci0gICAgLy8gbG9vcCBvdmVyIGFsbCB0aGUgc2FtcGxlcwotICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBuOyArK2opIHsKLSAgICAgICAgc2l6ZV90IGkgPSBvbGRlc3RDbG9zZWQrKyAmIChtU2FtcGxpbmdOIC0gMSk7Ci0gICAgICAgIHVpbnQzMl90IHdhbGxOcyA9IG1Nb25vdG9uaWNOc1tpXTsKLSAgICAgICAgaWYgKHRhaWwgIT0gTlVMTCkgewotICAgICAgICAgICAgdGFpbFtqXSA9IHdhbGxOczsKLSAgICAgICAgfQotICAgICAgICB3YWxsLnNhbXBsZSh3YWxsTnMpOwotICAgICAgICB1aW50MzJfdCBzYW1wbGVMb2FkTnMgPSBtTG9hZE5zW2ldOwotICAgICAgICBsb2FkTnMuc2FtcGxlKHNhbXBsZUxvYWROcyk7Ci0jaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCi0gICAgICAgIHVpbnQzMl90IHNhbXBsZUNwdWtIeiA9IG1DcHVrSHpbaV07Ci0gICAgICAgIC8vIHNraXAgYmFkIGtIeiBzYW1wbGVzCi0gICAgICAgIGlmICgoc2FtcGxlQ3B1a0h6ICYgfjB4RikgIT0gMCkgewotICAgICAgICAgICAga0h6LnNhbXBsZShzYW1wbGVDcHVrSHogPj4gNCk7Ci0gICAgICAgICAgICBpZiAoc2FtcGxlQ3B1a0h6ID09IHByZXZpb3VzQ3B1a0h6KSB7Ci0gICAgICAgICAgICAgICAgZG91YmxlIG1lZ2FjeWNsZXMgPSAoZG91YmxlKSBzYW1wbGVMb2FkTnMgKiAoZG91YmxlKSAoc2FtcGxlQ3B1a0h6ID4+IDQpICogMWUtMTI7Ci0gICAgICAgICAgICAgICAgZG91YmxlIGFkak1IeiA9IG1lZ2FjeWNsZXMgLyBtaXhQZXJpb2RTZWM7ICAvLyBfbm90XyB3YWxsTnMgKiAxZTkKLSAgICAgICAgICAgICAgICBsb2FkTUh6LnNhbXBsZShhZGpNSHopOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByZXZpb3VzQ3B1a0h6ID0gc2FtcGxlQ3B1a0h6OwotI2VuZGlmCi0gICAgfQotICAgIGlmIChuKSB7Ci0gICAgICAgIGRwcmludGYoZmQsICIgIFNpbXBsZSBtb3Zpbmcgc3RhdGlzdGljcyBvdmVyIGxhc3QgJS4xZiBzZWNvbmRzOlxuIiwKLSAgICAgICAgICAgICAgICAgICAgd2FsbC5uKCkgKiBtaXhQZXJpb2RTZWMpOwotICAgICAgICBkcHJpbnRmKGZkLCAiICAgIHdhbGwgY2xvY2sgdGltZSBpbiBtcyBwZXIgbWl4IGN5Y2xlOlxuIgotICAgICAgICAgICAgICAgICAgICAiICAgICAgbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iLAotICAgICAgICAgICAgICAgICAgICB3YWxsLm1lYW4oKSoxZS02LCB3YWxsLm1pbmltdW0oKSoxZS02LCB3YWxsLm1heGltdW0oKSoxZS02LAotICAgICAgICAgICAgICAgICAgICB3YWxsLnN0ZGRldigpKjFlLTYpOwotICAgICAgICBkcHJpbnRmKGZkLCAiICAgIHJhdyBDUFUgbG9hZCBpbiB1cyBwZXIgbWl4IGN5Y2xlOlxuIgotICAgICAgICAgICAgICAgICAgICAiICAgICAgbWVhbj0lLjBmIG1pbj0lLjBmIG1heD0lLjBmIHN0ZGRldj0lLjBmXG4iLAotICAgICAgICAgICAgICAgICAgICBsb2FkTnMubWVhbigpKjFlLTMsIGxvYWROcy5taW5pbXVtKCkqMWUtMywgbG9hZE5zLm1heGltdW0oKSoxZS0zLAotICAgICAgICAgICAgICAgICAgICBsb2FkTnMuc3RkZGV2KCkqMWUtMyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHByaW50ZihmZCwgIiAgTm8gRmFzdE1peGVyIHN0YXRpc3RpY3MgYXZhaWxhYmxlIGN1cnJlbnRseVxuIik7Ci0gICAgfQotI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwotICAgIGRwcmludGYoZmQsICIgIENQVSBjbG9jayBmcmVxdWVuY3kgaW4gTUh6OlxuIgotICAgICAgICAgICAgICAgICIgICAgbWVhbj0lLjBmIG1pbj0lLjBmIG1heD0lLjBmIHN0ZGRldj0lLjBmXG4iLAotICAgICAgICAgICAgICAgIGtIei5tZWFuKCkqMWUtMywga0h6Lm1pbmltdW0oKSoxZS0zLCBrSHoubWF4aW11bSgpKjFlLTMsIGtIei5zdGRkZXYoKSoxZS0zKTsKLSAgICBkcHJpbnRmKGZkLCAiICBhZGp1c3RlZCBDUFUgbG9hZCBpbiBNSHogKGkuZS4gbm9ybWFsaXplZCBmb3IgQ1BVIGNsb2NrIGZyZXF1ZW5jeSk6XG4iCi0gICAgICAgICAgICAgICAgIiAgICBtZWFuPSUuMWYgbWluPSUuMWYgbWF4PSUuMWYgc3RkZGV2PSUuMWZcbiIsCi0gICAgICAgICAgICAgICAgbG9hZE1Iei5tZWFuKCksIGxvYWRNSHoubWluaW11bSgpLCBsb2FkTUh6Lm1heGltdW0oKSwgbG9hZE1Iei5zdGRkZXYoKSk7Ci0jZW5kaWYKLSAgICBpZiAodGFpbCAhPSBOVUxMKSB7Ci0gICAgICAgIHFzb3J0KHRhaWwsIG4sIHNpemVvZih1aW50MzJfdCksIGNvbXBhcmVfdWludDMyX3QpOwotICAgICAgICAvLyBhc3N1bWUgc2FtZSBudW1iZXIgb2YgdGFpbCBzYW1wbGVzIG9uIGVhY2ggc2lkZSwgbGVmdCBhbmQgcmlnaHQKLSAgICAgICAgdWludDMyX3QgY291bnQgPSBuIC8ga1RhaWxEZW5vbWluYXRvcjsKLSAgICAgICAgQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcyBsZWZ0LCByaWdodDsKLSAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgICAgIGxlZnQuc2FtcGxlKHRhaWxbaV0pOwotICAgICAgICAgICAgcmlnaHQuc2FtcGxlKHRhaWxbbiAtIChpICsgMSldKTsKLSAgICAgICAgfQotICAgICAgICBkcHJpbnRmKGZkLCAiICBEaXN0cmlidXRpb24gb2YgbWl4IGN5Y2xlIHRpbWVzIGluIG1zIGZvciB0aGUgdGFpbHMgKD4gfjMgc3RkZGV2IG91dGxpZXJzKTpcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgICBsZWZ0IHRhaWw6IG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIgotICAgICAgICAgICAgICAgICAgICAiICAgIHJpZ2h0IHRhaWw6IG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgbGVmdC5tZWFuKCkqMWUtNiwgbGVmdC5taW5pbXVtKCkqMWUtNiwgbGVmdC5tYXhpbXVtKCkqMWUtNiwgbGVmdC5zdGRkZXYoKSoxZS02LAotICAgICAgICAgICAgICAgICAgICByaWdodC5tZWFuKCkqMWUtNiwgcmlnaHQubWluaW11bSgpKjFlLTYsIHJpZ2h0Lm1heGltdW0oKSoxZS02LAotICAgICAgICAgICAgICAgICAgICByaWdodC5zdGRkZXYoKSoxZS02KTsKLSAgICAgICAgZGVsZXRlW10gdGFpbDsKLSAgICB9Ci0jZW5kaWYKLSAgICAvLyBUaGUgYWN0aXZlIHRyYWNrIG1hc2sgYW5kIHRyYWNrIHN0YXRlcyBhcmUgdXBkYXRlZCBub24tYXRvbWljYWxseS4KLSAgICAvLyBTbyBpZiB3ZSByZWxpZWQgb24gaXNBY3RpdmUgdG8gZGVjaWRlIHdoZXRoZXIgdG8gZGlzcGxheSwKLSAgICAvLyB0aGVuIHdlIG1pZ2h0IGRpc3BsYXkgYW4gb2Jzb2xldGUgdHJhY2sgb3Igb21pdCBhbiBhY3RpdmUgdHJhY2suCi0gICAgLy8gSW5zdGVhZCB3ZSBhbHdheXMgZGlzcGxheSBhbGwgdHJhY2tzLCB3aXRoIGFuIGluZGljYXRpb24KLSAgICAvLyBvZiB3aGV0aGVyIHdlIHRoaW5rIHRoZSB0cmFjayBpcyBhY3RpdmUuCi0gICAgdWludDMyX3QgdHJhY2tNYXNrID0gbVRyYWNrTWFzazsKLSAgICBkcHJpbnRmKGZkLCAiICBGYXN0IHRyYWNrczoga01heEZhc3RUcmFja3M9JXUgYWN0aXZlTWFzaz0lI3hcbiIsCi0gICAgICAgICAgICBGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3MsIHRyYWNrTWFzayk7Ci0gICAgZHByaW50ZihmZCwgIiAgSW5kZXggQWN0aXZlIEZ1bGwgUGFydGlhbCBFbXB0eSAgUmVjZW50IFJlYWR5XG4iKTsKLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzOyArK2ksIHRyYWNrTWFzayA+Pj0gMSkgewotICAgICAgICBib29sIGlzQWN0aXZlID0gdHJhY2tNYXNrICYgMTsKLSAgICAgICAgY29uc3QgRmFzdFRyYWNrRHVtcCAqZnREdW1wID0gJm1UcmFja3NbaV07Ci0gICAgICAgIGNvbnN0IEZhc3RUcmFja1VuZGVycnVucyYgdW5kZXJydW5zID0gZnREdW1wLT5tVW5kZXJydW5zOwotICAgICAgICBjb25zdCBjaGFyICptb3N0UmVjZW50OwotICAgICAgICBzd2l0Y2ggKHVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50KSB7Ci0gICAgICAgIGNhc2UgVU5ERVJSVU5fRlVMTDoKLSAgICAgICAgICAgIG1vc3RSZWNlbnQgPSAiZnVsbCI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBVTkRFUlJVTl9QQVJUSUFMOgotICAgICAgICAgICAgbW9zdFJlY2VudCA9ICJwYXJ0aWFsIjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFVOREVSUlVOX0VNUFRZOgotICAgICAgICAgICAgbW9zdFJlY2VudCA9ICJlbXB0eSI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIG1vc3RSZWNlbnQgPSAiPyI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkcHJpbnRmKGZkLCAiICAlNXUgJTZzICU0dSAlN3UgJTV1ICU3cyAlNXp1XG4iLCBpLCBpc0FjdGl2ZSA/ICJ5ZXMiIDogIm5vIiwKLSAgICAgICAgICAgICAgICAodW5kZXJydW5zLm1CaXRGaWVsZHMubUZ1bGwpICYgVU5ERVJSVU5fTUFTSywKLSAgICAgICAgICAgICAgICAodW5kZXJydW5zLm1CaXRGaWVsZHMubVBhcnRpYWwpICYgVU5ERVJSVU5fTUFTSywKLSAgICAgICAgICAgICAgICAodW5kZXJydW5zLm1CaXRGaWVsZHMubUVtcHR5KSAmIFVOREVSUlVOX01BU0ssCi0gICAgICAgICAgICAgICAgbW9zdFJlY2VudCwgZnREdW1wLT5tRnJhbWVzUmVhZHkpOwotICAgIH0KLX0KLQogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmgKaW5kZXggZmRlOGMyYi4uMDZhNjhmYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaApAQCAtMTcsMTEgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX0gKIAotI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+Ci0jaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KLSNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgogI2luY2x1ZGUgIkZhc3RUaHJlYWQuaCIKLSNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KICNpbmNsdWRlICJTdGF0ZVF1ZXVlLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyU3RhdGUuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXJEdW1wU3RhdGUuaCIKQEAgLTUyLDM2ICs0OCwzOSBAQAogICAgIHZpcnR1YWwgdm9pZCBvblN0YXRlQ2hhbmdlKCk7CiAgICAgdmlydHVhbCB2b2lkIG9uV29yaygpOwogCi0gICAgLy8gRklYTUUgdGhlc2UgZm9ybWVyIGxvY2FsIHZhcmlhYmxlcyBuZWVkIGNvbW1lbnRzIGFuZCB0byBiZSByZW5hbWVkIHRvIGhhdmUgIm0iIHByZWZpeAotICAgIHN0YXRpYyBjb25zdCBGYXN0TWl4ZXJTdGF0ZSBpbml0aWFsOwotICAgIEZhc3RNaXhlclN0YXRlIHByZUlkbGU7IC8vIGNvcHkgb2Ygc3RhdGUgYmVmb3JlIHdlIHdlbnQgaW50byBpZGxlCi0gICAgbG9uZyBzbG9wTnM7ICAgICAgICAvLyBhY2N1bXVsYXRlZCB0aW1lIHdlJ3ZlIHdva2VuIHVwIHRvbyBlYXJseSAoPiAwKSBvciB0b28gbGF0ZSAoPCAwKQotICAgIGludCBmYXN0VHJhY2tOYW1lc1tGYXN0TWl4ZXJTdGF0ZTo6a01heEZhc3RUcmFja3NdOyAvLyBoYW5kbGVzIHVzZWQgYnkgbWl4ZXIgdG8gaWRlbnRpZnkgdHJhY2tzCi0gICAgaW50IGdlbmVyYXRpb25zW0Zhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrc107ICAgIC8vIGxhc3Qgb2JzZXJ2ZWQgbUZhc3RUcmFja3NbaV0ubUdlbmVyYXRpb24KLSAgICBOQkFJT19TaW5rICpvdXRwdXRTaW5rOwotICAgIGludCBvdXRwdXRTaW5rR2VuOwotICAgIEF1ZGlvTWl4ZXIqIG1peGVyOworICAgIC8vIEZJWE1FIHRoZXNlIGZvcm1lciBsb2NhbCB2YXJpYWJsZXMgbmVlZCBjb21tZW50cworICAgIHN0YXRpYyBjb25zdCBGYXN0TWl4ZXJTdGF0ZSBzSW5pdGlhbDsKKworICAgIEZhc3RNaXhlclN0YXRlICBtUHJlSWRsZTsgICAvLyBjb3B5IG9mIHN0YXRlIGJlZm9yZSB3ZSB3ZW50IGludG8gaWRsZQorICAgIGxvbmcgICAgICAgICAgICBtU2xvcE5zOyAgICAvLyBhY2N1bXVsYXRlZCB0aW1lIHdlJ3ZlIHdva2VuIHVwIHRvbyBlYXJseSAoPiAwKSBvciB0b28gbGF0ZSAoPCAwKQorICAgIGludCAgICAgICAgICAgICBtRmFzdFRyYWNrTmFtZXNbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlcyB1c2VkIGJ5IG1peGVyIHRvIGlkZW50aWZ5IHRyYWNrcworICAgIGludCAgICAgICAgICAgICBtR2VuZXJhdGlvbnNbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCBvYnNlcnZlZCBtRmFzdFRyYWNrc1tpXS5tR2VuZXJhdGlvbgorICAgIE5CQUlPX1NpbmsqICAgICBtT3V0cHV0U2luazsKKyAgICBpbnQgICAgICAgICAgICAgbU91dHB1dFNpbmtHZW47CisgICAgQXVkaW9NaXhlciogICAgIG1NaXhlcjsKIAogICAgIC8vIG1TaW5rQnVmZmVyIGF1ZGlvIGZvcm1hdCBpcyBzdG9yZWQgaW4gZm9ybWF0Lm1Gb3JtYXQuCi0gICAgdm9pZCogbVNpbmtCdWZmZXI7ICAgICAgICAgICAgICAgICAgLy8gdXNlZCBmb3IgbWl4ZXIgb3V0cHV0IGZvcm1hdCB0cmFuc2xhdGlvbgorICAgIHZvaWQqICAgICAgICAgICBtU2lua0J1ZmZlcjsgICAgICAgIC8vIHVzZWQgZm9yIG1peGVyIG91dHB1dCBmb3JtYXQgdHJhbnNsYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBzaW5rIGZvcm1hdCBpcyBkaWZmZXJlbnQgdGhhbiBtaXhlciBvdXRwdXQuCi0gICAgc2l6ZV90IG1TaW5rQnVmZmVyU2l6ZTsKLSAgICB1aW50MzJfdCBtU2lua0NoYW5uZWxDb3VudDsKKyAgICBzaXplX3QgICAgICAgICAgbVNpbmtCdWZmZXJTaXplOworICAgIHVpbnQzMl90ICAgICAgICBtU2lua0NoYW5uZWxDb3VudDsKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtU2lua0NoYW5uZWxNYXNrOwotICAgIHZvaWQqIG1NaXhlckJ1ZmZlcjsgICAgICAgICAgICAgICAgIC8vIG1peGVyIG91dHB1dCBidWZmZXIuCi0gICAgc2l6ZV90IG1NaXhlckJ1ZmZlclNpemU7Ci0gICAgYXVkaW9fZm9ybWF0X3QgbU1peGVyQnVmZmVyRm9ybWF0OyAgLy8gbWl4ZXIgb3V0cHV0IGZvcm1hdDogQVVESU9fRk9STUFUX1BDTV8oMTZfQklUfEZMT0FUKS4KKyAgICB2b2lkKiAgICAgICAgICAgbU1peGVyQnVmZmVyOyAgICAgICAvLyBtaXhlciBvdXRwdXQgYnVmZmVyLgorICAgIHNpemVfdCAgICAgICAgICBtTWl4ZXJCdWZmZXJTaXplOworICAgIGF1ZGlvX2Zvcm1hdF90ICBtTWl4ZXJCdWZmZXJGb3JtYXQ7IC8vIG1peGVyIG91dHB1dCBmb3JtYXQ6IEFVRElPX0ZPUk1BVF9QQ01fKDE2X0JJVHxGTE9BVCkuCiAKICAgICBlbnVtIHtVTkRFRklORUQsIE1JWEVELCBaRVJPRUR9IG1NaXhlckJ1ZmZlclN0YXRlOwotICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQ7Ci0gICAgdW5zaWduZWQgc2FtcGxlUmF0ZTsKLSAgICBpbnQgZmFzdFRyYWNrc0dlbjsKLSAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgZHVtbXlEdW1wU3RhdGU7Ci0gICAgdWludDMyX3QgdG90YWxOYXRpdmVGcmFtZXNXcml0dGVuOyAgLy8gY29waWVkIHRvIGR1bXBTdGF0ZS0+bUZyYW1lc1dyaXR0ZW4KKyAgICBOQkFJT19Gb3JtYXQgICAgbUZvcm1hdDsKKyAgICB1bnNpZ25lZCAgICAgICAgbVNhbXBsZVJhdGU7CisgICAgaW50ICAgICAgICAgICAgIG1GYXN0VHJhY2tzR2VuOworICAgIEZhc3RNaXhlckR1bXBTdGF0ZSBtRHVtbXlGYXN0TWl4ZXJEdW1wU3RhdGU7CisgICAgdWludDMyX3QgICAgICAgIG1Ub3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW47ICAvLyBjb3BpZWQgdG8gZHVtcFN0YXRlLT5tRnJhbWVzV3JpdHRlbgogCiAgICAgLy8gbmV4dCAyIGZpZWxkcyBhcmUgdmFsaWQgb25seSB3aGVuIHRpbWVzdGFtcFN0YXR1cyA9PSBOT19FUlJPUgotICAgIEF1ZGlvVGltZXN0YW1wIHRpbWVzdGFtcDsKLSAgICB1aW50MzJfdCBuYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkOworICAgIEF1ZGlvVGltZXN0YW1wICBtVGltZXN0YW1wOworICAgIHVpbnQzMl90ICAgICAgICBtTmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZDsKIAogfTsgIC8vIGNsYXNzIEZhc3RNaXhlcgogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMDk0MmIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcApAQCAtMCwwICsxLDE5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRmFzdE1peGVyRHVtcFN0YXRlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKKyNpbmNsdWRlIDxjcHVzdGF0cy9DZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzLmg+CisjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCisjaW5jbHVkZSA8Y3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuaD4KKyNlbmRpZgorI2VuZGlmCisjaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJGYXN0TWl4ZXJEdW1wU3RhdGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitGYXN0TWl4ZXJEdW1wU3RhdGU6OkZhc3RNaXhlckR1bXBTdGF0ZSgpIDogRmFzdFRocmVhZER1bXBTdGF0ZSgpLAorICAgIG1Xcml0ZVNlcXVlbmNlKDApLCBtRnJhbWVzV3JpdHRlbigwKSwKKyAgICBtTnVtVHJhY2tzKDApLCBtV3JpdGVFcnJvcnMoMCksCisgICAgbVNhbXBsZVJhdGUoMCksIG1GcmFtZUNvdW50KDApLAorICAgIG1UcmFja01hc2soMCkKK3sKK30KKworRmFzdE1peGVyRHVtcFN0YXRlOjp+RmFzdE1peGVyRHVtcFN0YXRlKCkKK3sKK30KKworLy8gaGVscGVyIGZ1bmN0aW9uIGNhbGxlZCBieSBxc29ydCgpCitzdGF0aWMgaW50IGNvbXBhcmVfdWludDMyX3QoY29uc3Qgdm9pZCAqcGEsIGNvbnN0IHZvaWQgKnBiKQoreworICAgIHVpbnQzMl90IGEgPSAqKGNvbnN0IHVpbnQzMl90ICopcGE7CisgICAgdWludDMyX3QgYiA9ICooY29uc3QgdWludDMyX3QgKilwYjsKKyAgICBpZiAoYSA8IGIpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSBpZiAoYSA+IGIpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCit2b2lkIEZhc3RNaXhlckR1bXBTdGF0ZTo6ZHVtcChpbnQgZmQpIGNvbnN0Cit7CisgICAgaWYgKG1Db21tYW5kID09IEZhc3RNaXhlclN0YXRlOjpJTklUSUFMKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIEZhc3RNaXhlciBub3QgaW5pdGlhbGl6ZWRcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGRvdWJsZSBtZWFzdXJlZFdhcm11cE1zID0gKG1NZWFzdXJlZFdhcm11cFRzLnR2X3NlYyAqIDEwMDAuMCkgKworICAgICAgICAgICAgKG1NZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgLyAxMDAwMDAwLjApOworICAgIGRvdWJsZSBtaXhQZXJpb2RTZWMgPSAoZG91YmxlKSBtRnJhbWVDb3VudCAvIG1TYW1wbGVSYXRlOworICAgIGRwcmludGYoZmQsICIgIEZhc3RNaXhlciBjb21tYW5kPSVzIHdyaXRlU2VxdWVuY2U9JXUgZnJhbWVzV3JpdHRlbj0ldVxuIgorICAgICAgICAgICAgICAgICIgICAgICAgICAgICBudW1UcmFja3M9JXUgd3JpdGVFcnJvcnM9JXUgdW5kZXJydW5zPSV1IG92ZXJydW5zPSV1XG4iCisgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIHNhbXBsZVJhdGU9JXUgZnJhbWVDb3VudD0lenUgbWVhc3VyZWRXYXJtdXA9JS4zZyBtcywgd2FybXVwQ3ljbGVzPSV1XG4iCisgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIG1peFBlcmlvZD0lLjJmIG1zXG4iLAorICAgICAgICAgICAgICAgIEZhc3RNaXhlclN0YXRlOjpjb21tYW5kVG9TdHJpbmcobUNvbW1hbmQpLCBtV3JpdGVTZXF1ZW5jZSwgbUZyYW1lc1dyaXR0ZW4sCisgICAgICAgICAgICAgICAgbU51bVRyYWNrcywgbVdyaXRlRXJyb3JzLCBtVW5kZXJydW5zLCBtT3ZlcnJ1bnMsCisgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1GcmFtZUNvdW50LCBtZWFzdXJlZFdhcm11cE1zLCBtV2FybXVwQ3ljbGVzLAorICAgICAgICAgICAgICAgIG1peFBlcmlvZFNlYyAqIDFlMyk7CisjaWZkZWYgRkFTVF9USFJFQURfU1RBVElTVElDUworICAgIC8vIGZpbmQgdGhlIGludGVydmFsIG9mIHZhbGlkIHNhbXBsZXMKKyAgICB1aW50MzJfdCBib3VuZHMgPSBtQm91bmRzOworICAgIHVpbnQzMl90IG5ld2VzdE9wZW4gPSBib3VuZHMgJiAweEZGRkY7CisgICAgdWludDMyX3Qgb2xkZXN0Q2xvc2VkID0gYm91bmRzID4+IDE2OworICAgIHVpbnQzMl90IG4gPSAobmV3ZXN0T3BlbiAtIG9sZGVzdENsb3NlZCkgJiAweEZGRkY7CisgICAgaWYgKG4gPiBtU2FtcGxpbmdOKSB7CisgICAgICAgIEFMT0dFKCJ0b28gbWFueSBzYW1wbGVzICV1Iiwgbik7CisgICAgICAgIG4gPSBtU2FtcGxpbmdOOworICAgIH0KKyAgICAvLyBzdGF0aXN0aWNzIGZvciBtb25vdG9uaWMgKHdhbGwgY2xvY2spIHRpbWUsIHRocmVhZCByYXcgQ1BVIGxvYWQgaW4gdGltZSwgQ1BVIGNsb2NrIGZyZXF1ZW5jeSwKKyAgICAvLyBhbmQgYWRqdXN0ZWQgQ1BVIGxvYWQgaW4gTUh6IG5vcm1hbGl6ZWQgZm9yIENQVSBjbG9jayBmcmVxdWVuY3kKKyAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIHdhbGwsIGxvYWROczsKKyNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKKyAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIGtIeiwgbG9hZE1IejsKKyAgICB1aW50MzJfdCBwcmV2aW91c0NwdWtIeiA9IDA7CisjZW5kaWYKKyAgICAvLyBBc3N1bWluZyBhIG5vcm1hbCBkaXN0cmlidXRpb24gZm9yIGN5Y2xlIHRpbWVzLCB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zIG9uIGVpdGhlciBzaWRlIG9mCisgICAgLy8gdGhlIG1lYW4gYWNjb3VudCBmb3IgOTkuNzMlIG9mIHRoZSBwb3B1bGF0aW9uLiAgU28gaWYgd2UgdGFrZSBlYWNoIHRhaWwgdG8gYmUgMS8xMDAwIG9mIHRoZQorICAgIC8vIHNhbXBsZSBzZXQsIHdlIGdldCA5OS44JSBjb21iaW5lZCwgb3IgY2xvc2UgdG8gdGhyZWUgc3RhbmRhcmQgZGV2aWF0aW9ucy4KKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1RhaWxEZW5vbWluYXRvciA9IDEwMDA7CisgICAgdWludDMyX3QgKnRhaWwgPSBuID49IGtUYWlsRGVub21pbmF0b3IgPyBuZXcgdWludDMyX3Rbbl0gOiBOVUxMOworICAgIC8vIGxvb3Agb3ZlciBhbGwgdGhlIHNhbXBsZXMKKyAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgbjsgKytqKSB7CisgICAgICAgIHNpemVfdCBpID0gb2xkZXN0Q2xvc2VkKysgJiAobVNhbXBsaW5nTiAtIDEpOworICAgICAgICB1aW50MzJfdCB3YWxsTnMgPSBtTW9ub3RvbmljTnNbaV07CisgICAgICAgIGlmICh0YWlsICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHRhaWxbal0gPSB3YWxsTnM7CisgICAgICAgIH0KKyAgICAgICAgd2FsbC5zYW1wbGUod2FsbE5zKTsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlTG9hZE5zID0gbUxvYWROc1tpXTsKKyAgICAgICAgbG9hZE5zLnNhbXBsZShzYW1wbGVMb2FkTnMpOworI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUworICAgICAgICB1aW50MzJfdCBzYW1wbGVDcHVrSHogPSBtQ3B1a0h6W2ldOworICAgICAgICAvLyBza2lwIGJhZCBrSHogc2FtcGxlcworICAgICAgICBpZiAoKHNhbXBsZUNwdWtIeiAmIH4weEYpICE9IDApIHsKKyAgICAgICAgICAgIGtIei5zYW1wbGUoc2FtcGxlQ3B1a0h6ID4+IDQpOworICAgICAgICAgICAgaWYgKHNhbXBsZUNwdWtIeiA9PSBwcmV2aW91c0NwdWtIeikgeworICAgICAgICAgICAgICAgIGRvdWJsZSBtZWdhY3ljbGVzID0gKGRvdWJsZSkgc2FtcGxlTG9hZE5zICogKGRvdWJsZSkgKHNhbXBsZUNwdWtIeiA+PiA0KSAqIDFlLTEyOworICAgICAgICAgICAgICAgIGRvdWJsZSBhZGpNSHogPSBtZWdhY3ljbGVzIC8gbWl4UGVyaW9kU2VjOyAgLy8gX25vdF8gd2FsbE5zICogMWU5CisgICAgICAgICAgICAgICAgbG9hZE1Iei5zYW1wbGUoYWRqTUh6KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcmV2aW91c0NwdWtIeiA9IHNhbXBsZUNwdWtIejsKKyNlbmRpZgorICAgIH0KKyAgICBpZiAobikgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBTaW1wbGUgbW92aW5nIHN0YXRpc3RpY3Mgb3ZlciBsYXN0ICUuMWYgc2Vjb25kczpcbiIsCisgICAgICAgICAgICAgICAgICAgIHdhbGwubigpICogbWl4UGVyaW9kU2VjKTsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgICB3YWxsIGNsb2NrIHRpbWUgaW4gbXMgcGVyIG1peCBjeWNsZTpcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgICAgIG1lYW49JS4yZiBtaW49JS4yZiBtYXg9JS4yZiBzdGRkZXY9JS4yZlxuIiwKKyAgICAgICAgICAgICAgICAgICAgd2FsbC5tZWFuKCkqMWUtNiwgd2FsbC5taW5pbXVtKCkqMWUtNiwgd2FsbC5tYXhpbXVtKCkqMWUtNiwKKyAgICAgICAgICAgICAgICAgICAgd2FsbC5zdGRkZXYoKSoxZS02KTsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgICByYXcgQ1BVIGxvYWQgaW4gdXMgcGVyIG1peCBjeWNsZTpcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKKyAgICAgICAgICAgICAgICAgICAgbG9hZE5zLm1lYW4oKSoxZS0zLCBsb2FkTnMubWluaW11bSgpKjFlLTMsIGxvYWROcy5tYXhpbXVtKCkqMWUtMywKKyAgICAgICAgICAgICAgICAgICAgbG9hZE5zLnN0ZGRldigpKjFlLTMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIE5vIEZhc3RNaXhlciBzdGF0aXN0aWNzIGF2YWlsYWJsZSBjdXJyZW50bHlcbiIpOworICAgIH0KKyNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKKyAgICBkcHJpbnRmKGZkLCAiICBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIE1IejpcbiIKKyAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKKyAgICAgICAgICAgICAgICBrSHoubWVhbigpKjFlLTMsIGtIei5taW5pbXVtKCkqMWUtMywga0h6Lm1heGltdW0oKSoxZS0zLCBrSHouc3RkZGV2KCkqMWUtMyk7CisgICAgZHByaW50ZihmZCwgIiAgYWRqdXN0ZWQgQ1BVIGxvYWQgaW4gTUh6IChpLmUuIG5vcm1hbGl6ZWQgZm9yIENQVSBjbG9jayBmcmVxdWVuY3kpOlxuIgorICAgICAgICAgICAgICAgICIgICAgbWVhbj0lLjFmIG1pbj0lLjFmIG1heD0lLjFmIHN0ZGRldj0lLjFmXG4iLAorICAgICAgICAgICAgICAgIGxvYWRNSHoubWVhbigpLCBsb2FkTUh6Lm1pbmltdW0oKSwgbG9hZE1Iei5tYXhpbXVtKCksIGxvYWRNSHouc3RkZGV2KCkpOworI2VuZGlmCisgICAgaWYgKHRhaWwgIT0gTlVMTCkgeworICAgICAgICBxc29ydCh0YWlsLCBuLCBzaXplb2YodWludDMyX3QpLCBjb21wYXJlX3VpbnQzMl90KTsKKyAgICAgICAgLy8gYXNzdW1lIHNhbWUgbnVtYmVyIG9mIHRhaWwgc2FtcGxlcyBvbiBlYWNoIHNpZGUsIGxlZnQgYW5kIHJpZ2h0CisgICAgICAgIHVpbnQzMl90IGNvdW50ID0gbiAvIGtUYWlsRGVub21pbmF0b3I7CisgICAgICAgIENlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3MgbGVmdCwgcmlnaHQ7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICBsZWZ0LnNhbXBsZSh0YWlsW2ldKTsKKyAgICAgICAgICAgIHJpZ2h0LnNhbXBsZSh0YWlsW24gLSAoaSArIDEpXSk7CisgICAgICAgIH0KKyAgICAgICAgZHByaW50ZihmZCwgIiAgRGlzdHJpYnV0aW9uIG9mIG1peCBjeWNsZSB0aW1lcyBpbiBtcyBmb3IgdGhlIHRhaWxzICIKKyAgICAgICAgICAgICAgICAgICAgIig+IH4zIHN0ZGRldiBvdXRsaWVycyk6XG4iCisgICAgICAgICAgICAgICAgICAgICIgICAgbGVmdCB0YWlsOiBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgICByaWdodCB0YWlsOiBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIsCisgICAgICAgICAgICAgICAgICAgIGxlZnQubWVhbigpKjFlLTYsIGxlZnQubWluaW11bSgpKjFlLTYsIGxlZnQubWF4aW11bSgpKjFlLTYsIGxlZnQuc3RkZGV2KCkqMWUtNiwKKyAgICAgICAgICAgICAgICAgICAgcmlnaHQubWVhbigpKjFlLTYsIHJpZ2h0Lm1pbmltdW0oKSoxZS02LCByaWdodC5tYXhpbXVtKCkqMWUtNiwKKyAgICAgICAgICAgICAgICAgICAgcmlnaHQuc3RkZGV2KCkqMWUtNik7CisgICAgICAgIGRlbGV0ZVtdIHRhaWw7CisgICAgfQorI2VuZGlmCisgICAgLy8gVGhlIGFjdGl2ZSB0cmFjayBtYXNrIGFuZCB0cmFjayBzdGF0ZXMgYXJlIHVwZGF0ZWQgbm9uLWF0b21pY2FsbHkuCisgICAgLy8gU28gaWYgd2UgcmVsaWVkIG9uIGlzQWN0aXZlIHRvIGRlY2lkZSB3aGV0aGVyIHRvIGRpc3BsYXksCisgICAgLy8gdGhlbiB3ZSBtaWdodCBkaXNwbGF5IGFuIG9ic29sZXRlIHRyYWNrIG9yIG9taXQgYW4gYWN0aXZlIHRyYWNrLgorICAgIC8vIEluc3RlYWQgd2UgYWx3YXlzIGRpc3BsYXkgYWxsIHRyYWNrcywgd2l0aCBhbiBpbmRpY2F0aW9uCisgICAgLy8gb2Ygd2hldGhlciB3ZSB0aGluayB0aGUgdHJhY2sgaXMgYWN0aXZlLgorICAgIHVpbnQzMl90IHRyYWNrTWFzayA9IG1UcmFja01hc2s7CisgICAgZHByaW50ZihmZCwgIiAgRmFzdCB0cmFja3M6IGtNYXhGYXN0VHJhY2tzPSV1IGFjdGl2ZU1hc2s9JSN4XG4iLAorICAgICAgICAgICAgRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzLCB0cmFja01hc2spOworICAgIGRwcmludGYoZmQsICIgIEluZGV4IEFjdGl2ZSBGdWxsIFBhcnRpYWwgRW1wdHkgIFJlY2VudCBSZWFkeVxuIik7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IEZhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrczsgKytpLCB0cmFja01hc2sgPj49IDEpIHsKKyAgICAgICAgYm9vbCBpc0FjdGl2ZSA9IHRyYWNrTWFzayAmIDE7CisgICAgICAgIGNvbnN0IEZhc3RUcmFja0R1bXAgKmZ0RHVtcCA9ICZtVHJhY2tzW2ldOworICAgICAgICBjb25zdCBGYXN0VHJhY2tVbmRlcnJ1bnMmIHVuZGVycnVucyA9IGZ0RHVtcC0+bVVuZGVycnVuczsKKyAgICAgICAgY29uc3QgY2hhciAqbW9zdFJlY2VudDsKKyAgICAgICAgc3dpdGNoICh1bmRlcnJ1bnMubUJpdEZpZWxkcy5tTW9zdFJlY2VudCkgeworICAgICAgICBjYXNlIFVOREVSUlVOX0ZVTEw6CisgICAgICAgICAgICBtb3N0UmVjZW50ID0gImZ1bGwiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVU5ERVJSVU5fUEFSVElBTDoKKyAgICAgICAgICAgIG1vc3RSZWNlbnQgPSAicGFydGlhbCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBVTkRFUlJVTl9FTVBUWToKKyAgICAgICAgICAgIG1vc3RSZWNlbnQgPSAiZW1wdHkiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtb3N0UmVjZW50ID0gIj8iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZHByaW50ZihmZCwgIiAgJTV1ICU2cyAlNHUgJTd1ICU1dSAlN3MgJTV6dVxuIiwgaSwgaXNBY3RpdmUgPyAieWVzIiA6ICJubyIsCisgICAgICAgICAgICAgICAgKHVuZGVycnVucy5tQml0RmllbGRzLm1GdWxsKSAmIFVOREVSUlVOX01BU0ssCisgICAgICAgICAgICAgICAgKHVuZGVycnVucy5tQml0RmllbGRzLm1QYXJ0aWFsKSAmIFVOREVSUlVOX01BU0ssCisgICAgICAgICAgICAgICAgKHVuZGVycnVucy5tQml0RmllbGRzLm1FbXB0eSkgJiBVTkRFUlJVTl9NQVNLLAorICAgICAgICAgICAgICAgIG1vc3RSZWNlbnQsIGZ0RHVtcC0+bUZyYW1lc1JlYWR5KTsKKyAgICB9Cit9CisKK30gICAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmgKaW5kZXggNmExZTQ2NDkuLmFjMTVlN2MgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmgKQEAgLTE3LDcgKzE3LDEwIEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9EVU1QX1NUQVRFX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX0RVTVBfU1RBVEVfSAogCisjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgIkZhc3RUaHJlYWREdW1wU3RhdGUuaCIKKyNpbmNsdWRlICJGYXN0TWl4ZXJTdGF0ZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTUyLDIyICs1NSwxMiBAQAogc3RydWN0IEZhc3RUcmFja0R1bXAgewogICAgIEZhc3RUcmFja0R1bXAoKSA6IG1GcmFtZXNSZWFkeSgwKSB7IH0KICAgICAvKnZpcnR1YWwqLyB+RmFzdFRyYWNrRHVtcCgpIHsgfQotICAgIEZhc3RUcmFja1VuZGVycnVucyBtVW5kZXJydW5zOwotICAgIHNpemVfdCBtRnJhbWVzUmVhZHk7ICAgICAgICAvLyBtb3N0IHJlY2VudCB2YWx1ZSBvbmx5OyBubyBsb25nLXRlcm0gc3RhdGlzdGljcyBrZXB0CisgICAgRmFzdFRyYWNrVW5kZXJydW5zICBtVW5kZXJydW5zOworICAgIHNpemVfdCAgICAgICAgICAgICAgbUZyYW1lc1JlYWR5OyAgICAgICAgLy8gbW9zdCByZWNlbnQgdmFsdWUgb25seTsgbm8gbG9uZy10ZXJtIHN0YXRpc3RpY3Mga2VwdAogfTsKIAotLy8gVGhlIEZhc3RNaXhlckR1bXBTdGF0ZSBrZWVwcyBhIGNhY2hlIG9mIEZhc3RNaXhlciBzdGF0aXN0aWNzIHRoYXQgY2FuIGJlIGxvZ2dlZCBieSBkdW1wc3lzLgotLy8gRWFjaCBpbmRpdmlkdWFsIG5hdGl2ZSB3b3JkLXNpemVkIGZpZWxkIGlzIGFjY2Vzc2VkIGF0b21pY2FsbHkuICBCdXQgdGhlCi0vLyBvdmVyYWxsIHN0cnVjdHVyZSBpcyBub24tYXRvbWljLCB0aGF0IGlzIHRoZXJlIG1heSBiZSBhbiBpbmNvbnNpc3RlbmN5IGJldHdlZW4gZmllbGRzLgotLy8gTm8gYmFycmllcnMgb3IgbG9ja3MgYXJlIHVzZWQgZm9yIGVpdGhlciB3cml0aW5nIG9yIHJlYWRpbmcuCi0vLyBPbmx5IFBPRCB0eXBlcyBhcmUgcGVybWl0dGVkLCBhbmQgdGhlIGNvbnRlbnRzIHNob3VsZG4ndCBiZSB0cnVzdGVkIChpLmUuIGRvIHJhbmdlIGNoZWNrcykuCi0vLyBJdCBoYXMgYSBkaWZmZXJlbnQgbGlmZXRpbWUgdGhhbiB0aGUgRmFzdE1peGVyLCBhbmQgc28gaXQgY2FuJ3QgYmUgYSBtZW1iZXIgb2YgRmFzdE1peGVyLgogc3RydWN0IEZhc3RNaXhlckR1bXBTdGF0ZSA6IEZhc3RUaHJlYWREdW1wU3RhdGUgewotICAgIEZhc3RNaXhlckR1bXBTdGF0ZSgKLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nTiA9IGtTYW1wbGluZ05mb3JMb3dSYW1EZXZpY2UKLSNlbmRpZgotICAgICAgICAgICAgKTsKKyAgICBGYXN0TWl4ZXJEdW1wU3RhdGUoKTsKICAgICAvKnZpcnR1YWwqLyB+RmFzdE1peGVyRHVtcFN0YXRlKCk7CiAKICAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdDsgICAgLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIGEgc3RhYmxlIGNvcHksIG5vdCB0aGUgb3JpZ2luYWwKQEAgLTgwLDE0ICs3Myw2IEBACiAgICAgc2l6ZV90ICAgbUZyYW1lQ291bnQ7CiAgICAgdWludDMyX3QgbVRyYWNrTWFzazsgICAgICAgIC8vIG1hc2sgb2YgYWN0aXZlIHRyYWNrcwogICAgIEZhc3RUcmFja0R1bXAgICBtVHJhY2tzW0Zhc3RNaXhlclN0YXRlOjprTWF4RmFzdFRyYWNrc107Ci0KLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICAvLyBDb21waWxlLXRpbWUgY29uc3RhbnQgZm9yIGEgImxvdyBSQU0gZGV2aWNlIiwgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0ga1NhbXBsaW5nTi4KLSAgICAvLyBUaGlzIHZhbHVlIHdhcyBjaG9zZW4gc3VjaCB0aGF0IGVhY2ggYXJyYXkgdXNlcyAxIHNtYWxsIHBhZ2UgKDQgS2J5dGVzKS4KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1NhbXBsaW5nTmZvckxvd1JhbURldmljZSA9IDB4NDAwOwotICAgIC8vIEluY3JlYXNlIHNhbXBsaW5nIHdpbmRvdyBhZnRlciBjb25zdHJ1Y3Rpb24sIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IGtTYW1wbGluZ04KLSAgICB2b2lkICAgIGluY3JlYXNlU2FtcGxpbmdOKHVpbnQzMl90IHNhbXBsaW5nTik7Ci0jZW5kaWYKIH07CiAKIH0gICAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmNwcAppbmRleCAzYWE4ZGFkLi5hOGMyNjM0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5jcHAKQEAgLTM5LDQgKzM5LDE5IEBACiB7CiB9CiAKKy8vIHN0YXRpYworY29uc3QgY2hhciAqRmFzdE1peGVyU3RhdGU6OmNvbW1hbmRUb1N0cmluZyhDb21tYW5kIGNvbW1hbmQpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gRmFzdFRocmVhZFN0YXRlOjpjb21tYW5kVG9TdHJpbmcoY29tbWFuZCk7CisgICAgaWYgKHN0ciAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBzdHI7CisgICAgfQorICAgIHN3aXRjaCAoY29tbWFuZCkgeworICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6Ok1JWDogICAgICAgcmV0dXJuICJNSVgiOworICAgIGNhc2UgRmFzdE1peGVyU3RhdGU6OldSSVRFOiAgICAgcmV0dXJuICJXUklURSI7CisgICAgY2FzZSBGYXN0TWl4ZXJTdGF0ZTo6TUlYX1dSSVRFOiByZXR1cm4gIk1JWF9XUklURSI7CisgICAgfQorICAgIExPR19BTFdBWVNfRkFUQUwoIiVzIiwgX19mdW5jX18pOworfQorCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKaW5kZXggNjYxYzljYS4uOTE2NTE0ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKQEAgLTczLDYgKzczLDkgQEAKIAogICAgIC8vIFRoaXMgbWlnaHQgYmUgYSBvbmUtdGltZSBjb25maWd1cmF0aW9uIHJhdGhlciB0aGFuIHBlci1zdGF0ZQogICAgIE5CQUlPX1NpbmsqIG1UZWVTaW5rOyAgICAgICAvLyBpZiBub24tTlVMTCwgdGhlbiBkdXBsaWNhdGUgd3JpdGUoKXMgdG8gdGhpcyBub24tYmxvY2tpbmcgc2luaworCisgICAgLy8gbmV2ZXIgcmV0dXJucyBOVUxMOyBhc3NlcnRzIGlmIGNvbW1hbmQgaXMgaW52YWxpZAorICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb21tYW5kVG9TdHJpbmcoQ29tbWFuZCBjb21tYW5kKTsKIH07ICAvLyBzdHJ1Y3QgRmFzdE1peGVyU3RhdGUKIAogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5jcHAKaW5kZXggMjE2ZGFjZS4uNWNhNTc5YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmNwcApAQCAtMjUsNTQgKzI1LDU4IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlICJGYXN0VGhyZWFkLmgiCisjaW5jbHVkZSAiRmFzdFRocmVhZER1bXBTdGF0ZS5oIgogCiAjZGVmaW5lIEZBU1RfREVGQVVMVF9OUyAgICA5OTk5OTk5OTlMICAgLy8gfjEgc2VjOiBkZWZhdWx0IHRpbWUgdG8gc2xlZXAKICNkZWZpbmUgRkFTVF9IT1RfSURMRV9OUyAgICAgMTAwMDAwMEwgICAvLyAxIG1zOiB0aW1lIHRvIHNsZWVwIHdoaWxlIGhvdCBpZGxpbmcKLSNkZWZpbmUgTUlOX1dBUk1VUF9DWUNMRVMgICAgICAgICAgMiAgICAvLyBtaW5pbXVtIG51bWJlciBvZiBsb29wIGN5Y2xlcyB0byB3YWl0IGZvciB3YXJtdXAKKyNkZWZpbmUgTUlOX1dBUk1VUF9DWUNMRVMgICAgICAgICAgMiAgICAvLyBtaW5pbXVtIG51bWJlciBvZiBjb25zZWN1dGl2ZSBpbi1yYW5nZSBsb29wIGN5Y2xlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHdhaXQgZm9yIHdhcm11cAogI2RlZmluZSBNQVhfV0FSTVVQX0NZQ0xFUyAgICAgICAgIDEwICAgIC8vIG1heGltdW0gbnVtYmVyIG9mIGxvb3AgY3ljbGVzIHRvIHdhaXQgZm9yIHdhcm11cAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEZhc3RUaHJlYWQ6OkZhc3RUaHJlYWQoKSA6IFRocmVhZChmYWxzZSAvKmNhbkNhbGxKYXZhKi8pLAotICAgIC8vIHJlLWluaXRpYWxpemVkIHRvICZpbml0aWFsIGJ5IHN1YmNsYXNzIGNvbnN0cnVjdG9yCi0gICAgIHByZXZpb3VzKE5VTEwpLCBjdXJyZW50KE5VTEwpLAotICAgIC8qIG9sZFRzKHswLCAwfSksICovCi0gICAgb2xkVHNWYWxpZChmYWxzZSksCi0gICAgc2xlZXBOcygtMSksCi0gICAgcGVyaW9kTnMoMCksCi0gICAgdW5kZXJydW5OcygwKSwKLSAgICBvdmVycnVuTnMoMCksCi0gICAgZm9yY2VOcygwKSwKLSAgICB3YXJtdXBOcygwKSwKLSAgICAvLyByZS1pbml0aWFsaXplZCB0byAmZHVtbXlEdW1wU3RhdGUgYnkgc3ViY2xhc3MgY29uc3RydWN0b3IKKyAgICAvLyByZS1pbml0aWFsaXplZCB0byAmc0luaXRpYWwgYnkgc3ViY2xhc3MgY29uc3RydWN0b3IKKyAgICBtUHJldmlvdXMoTlVMTCksIG1DdXJyZW50KE5VTEwpLAorICAgIC8qIG1PbGRUcyh7MCwgMH0pLCAqLworICAgIG1PbGRUc1ZhbGlkKGZhbHNlKSwKKyAgICBtU2xlZXBOcygtMSksCisgICAgbVBlcmlvZE5zKDApLAorICAgIG1VbmRlcnJ1bk5zKDApLAorICAgIG1PdmVycnVuTnMoMCksCisgICAgbUZvcmNlTnMoMCksCisgICAgbVdhcm11cE5zTWluKDApLAorICAgIG1XYXJtdXBOc01heChMT05HX01BWCksCisgICAgLy8gcmUtaW5pdGlhbGl6ZWQgdG8gJm1EdW1teVN1YmNsYXNzRHVtcFN0YXRlIGJ5IHN1YmNsYXNzIGNvbnN0cnVjdG9yCiAgICAgbUR1bW15RHVtcFN0YXRlKE5VTEwpLAotICAgIGR1bXBTdGF0ZShOVUxMKSwKLSAgICBpZ25vcmVOZXh0T3ZlcnJ1bih0cnVlKSwKLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICAvLyBvbGRMb2FkCi0gICAgb2xkTG9hZFZhbGlkKGZhbHNlKSwKLSAgICBib3VuZHMoMCksCi0gICAgZnVsbChmYWxzZSksCi0gICAgLy8gdGN1CisgICAgbUR1bXBTdGF0ZShOVUxMKSwKKyAgICBtSWdub3JlTmV4dE92ZXJydW4odHJ1ZSksCisjaWZkZWYgRkFTVF9USFJFQURfU1RBVElTVElDUworICAgIC8vIG1PbGRMb2FkCisgICAgbU9sZExvYWRWYWxpZChmYWxzZSksCisgICAgbUJvdW5kcygwKSwKKyAgICBtRnVsbChmYWxzZSksCisgICAgLy8gbVRjdQogI2VuZGlmCi0gICAgY29sZEdlbigwKSwKLSAgICBpc1dhcm0oZmFsc2UpLAotICAgIC8qIG1lYXN1cmVkV2FybXVwVHMoezAsIDB9KSwgKi8KLSAgICB3YXJtdXBDeWNsZXMoMCksCi0gICAgLy8gZHVtbXlMb2dXcml0ZXIKLSAgICBsb2dXcml0ZXIoJmR1bW15TG9nV3JpdGVyKSwKLSAgICB0aW1lc3RhbXBTdGF0dXMoSU5WQUxJRF9PUEVSQVRJT04pLAorICAgIG1Db2xkR2VuKDApLAorICAgIG1Jc1dhcm0oZmFsc2UpLAorICAgIC8qIG1NZWFzdXJlZFdhcm11cFRzKHswLCAwfSksICovCisgICAgbVdhcm11cEN5Y2xlcygwKSwKKyAgICBtV2FybXVwQ29uc2VjdXRpdmVJblJhbmdlQ3ljbGVzKDApLAorICAgIC8vIG1EdW1teUxvZ1dyaXRlcgorICAgIG1Mb2dXcml0ZXIoJm1EdW1teUxvZ1dyaXRlciksCisgICAgbVRpbWVzdGFtcFN0YXR1cyhJTlZBTElEX09QRVJBVElPTiksCiAKLSAgICBjb21tYW5kKEZhc3RUaHJlYWRTdGF0ZTo6SU5JVElBTCksCisgICAgbUNvbW1hbmQoRmFzdFRocmVhZFN0YXRlOjpJTklUSUFMKSwKICNpZiAwCiAgICAgZnJhbWVDb3VudCgwKSwKICNlbmRpZgotICAgIGF0dGVtcHRlZFdyaXRlKGZhbHNlKQorICAgIG1BdHRlbXB0ZWRXcml0ZShmYWxzZSkKIHsKLSAgICBvbGRUcy50dl9zZWMgPSAwOwotICAgIG9sZFRzLnR2X25zZWMgPSAwOwotICAgIG1lYXN1cmVkV2FybXVwVHMudHZfc2VjID0gMDsKLSAgICBtZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgPSAwOworICAgIG1PbGRUcy50dl9zZWMgPSAwOworICAgIG1PbGRUcy50dl9uc2VjID0gMDsKKyAgICBtTWVhc3VyZWRXYXJtdXBUcy50dl9zZWMgPSAwOworICAgIG1NZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgPSAwOwogfQogCiBGYXN0VGhyZWFkOjp+RmFzdFRocmVhZCgpCkBAIC04NCwzNCArODgsMzQgQEAKICAgICBmb3IgKDs7KSB7CiAKICAgICAgICAgLy8gZWl0aGVyIG5hbm9zbGVlcCwgc2NoZWRfeWllbGQsIG9yIGJ1c3kgd2FpdAotICAgICAgICBpZiAoc2xlZXBOcyA+PSAwKSB7Ci0gICAgICAgICAgICBpZiAoc2xlZXBOcyA+IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChzbGVlcE5zIDwgMTAwMDAwMDAwMCk7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjIHJlcSA9IHswLCBzbGVlcE5zfTsKKyAgICAgICAgaWYgKG1TbGVlcE5zID49IDApIHsKKyAgICAgICAgICAgIGlmIChtU2xlZXBOcyA+IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChtU2xlZXBOcyA8IDEwMDAwMDAwMDApOworICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyByZXEgPSB7MCwgbVNsZWVwTnN9OwogICAgICAgICAgICAgICAgIG5hbm9zbGVlcCgmcmVxLCBOVUxMKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc2NoZWRfeWllbGQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyBkZWZhdWx0IHRvIGxvbmcgc2xlZXAgZm9yIG5leHQgY3ljbGUKLSAgICAgICAgc2xlZXBOcyA9IEZBU1RfREVGQVVMVF9OUzsKKyAgICAgICAgbVNsZWVwTnMgPSBGQVNUX0RFRkFVTFRfTlM7CiAKICAgICAgICAgLy8gcG9sbCBmb3Igc3RhdGUgY2hhbmdlCiAgICAgICAgIGNvbnN0IEZhc3RUaHJlYWRTdGF0ZSAqbmV4dCA9IHBvbGwoKTsKICAgICAgICAgaWYgKG5leHQgPT0gTlVMTCkgewogICAgICAgICAgICAgLy8gY29udGludWUgdG8gdXNlIHRoZSBkZWZhdWx0IGluaXRpYWwgc3RhdGUgdW50aWwgYSByZWFsIHN0YXRlIGlzIGF2YWlsYWJsZQotICAgICAgICAgICAgLy8gRklYTUUgJmluaXRpYWwgbm90IGF2YWlsYWJsZSwgc2hvdWxkIHNhdmUgYWRkcmVzcyBlYXJsaWVyCi0gICAgICAgICAgICAvL0FMT0dfQVNTRVJUKGN1cnJlbnQgPT0gJmluaXRpYWwgJiYgcHJldmlvdXMgPT0gJmluaXRpYWwpOwotICAgICAgICAgICAgbmV4dCA9IGN1cnJlbnQ7CisgICAgICAgICAgICAvLyBGSVhNRSAmc0luaXRpYWwgbm90IGF2YWlsYWJsZSwgc2hvdWxkIHNhdmUgYWRkcmVzcyBlYXJsaWVyCisgICAgICAgICAgICAvL0FMT0dfQVNTRVJUKG1DdXJyZW50ID09ICZzSW5pdGlhbCAmJiBwcmV2aW91cyA9PSAmc0luaXRpYWwpOworICAgICAgICAgICAgbmV4dCA9IG1DdXJyZW50OwogICAgICAgICB9CiAKLSAgICAgICAgY29tbWFuZCA9IG5leHQtPm1Db21tYW5kOwotICAgICAgICBpZiAobmV4dCAhPSBjdXJyZW50KSB7CisgICAgICAgIG1Db21tYW5kID0gbmV4dC0+bUNvbW1hbmQ7CisgICAgICAgIGlmIChuZXh0ICE9IG1DdXJyZW50KSB7CiAKICAgICAgICAgICAgIC8vIEFzIHNvb24gYXMgcG9zc2libGUgb2YgbGVhcm5pbmcgb2YgYSBuZXcgZHVtcCBhcmVhLCBzdGFydCB1c2luZyBpdAotICAgICAgICAgICAgZHVtcFN0YXRlID0gbmV4dC0+bUR1bXBTdGF0ZSAhPSBOVUxMID8gbmV4dC0+bUR1bXBTdGF0ZSA6IG1EdW1teUR1bXBTdGF0ZTsKLSAgICAgICAgICAgIGxvZ1dyaXRlciA9IG5leHQtPm1OQkxvZ1dyaXRlciAhPSBOVUxMID8gbmV4dC0+bU5CTG9nV3JpdGVyIDogJmR1bW15TG9nV3JpdGVyOwotICAgICAgICAgICAgc2V0TG9nKGxvZ1dyaXRlcik7CisgICAgICAgICAgICBtRHVtcFN0YXRlID0gbmV4dC0+bUR1bXBTdGF0ZSAhPSBOVUxMID8gbmV4dC0+bUR1bXBTdGF0ZSA6IG1EdW1teUR1bXBTdGF0ZTsKKyAgICAgICAgICAgIG1Mb2dXcml0ZXIgPSBuZXh0LT5tTkJMb2dXcml0ZXIgIT0gTlVMTCA/IG5leHQtPm1OQkxvZ1dyaXRlciA6ICZtRHVtbXlMb2dXcml0ZXI7CisgICAgICAgICAgICBzZXRMb2cobUxvZ1dyaXRlcik7CiAKICAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gYWx3YXlzIGhhdmUgYSB2YWxpZCByZWZlcmVuY2UgdG8gdGhlIHByZXZpb3VzIChub24taWRsZSkgc3RhdGUuCiAgICAgICAgICAgICAvLyBIb3dldmVyLCB0aGUgc3RhdGUgcXVldWUgb25seSBndWFyYW50ZWVzIGFjY2VzcyB0byBjdXJyZW50IGFuZCBwcmV2aW91cyBzdGF0ZXMuCkBAIC0xMjIsMzcgKzEyNiwzOCBAQAogICAgICAgICAgICAgLy8gIG5vbi1pZGxlIC0+IGlkbGUgICAgICAgIHVwZGF0ZSBwcmV2aW91cyBmcm9tIGNvcHkgb2YgY3VycmVudAogICAgICAgICAgICAgLy8gIGlkbGUgICAgIC0+IGlkbGUgICAgICAgIGRvbid0IHVwZGF0ZSBwcmV2aW91cwogICAgICAgICAgICAgLy8gIGlkbGUgICAgIC0+IG5vbi1pZGxlICAgIGRvbid0IHVwZGF0ZSBwcmV2aW91cwotICAgICAgICAgICAgaWYgKCEoY3VycmVudC0+bUNvbW1hbmQgJiBGYXN0VGhyZWFkU3RhdGU6OklETEUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQgJiBGYXN0VGhyZWFkU3RhdGU6OklETEUpIHsKKyAgICAgICAgICAgIGlmICghKG1DdXJyZW50LT5tQ29tbWFuZCAmIEZhc3RUaHJlYWRTdGF0ZTo6SURMRSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUNvbW1hbmQgJiBGYXN0VGhyZWFkU3RhdGU6OklETEUpIHsKICAgICAgICAgICAgICAgICAgICAgb25JZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9sZFRzVmFsaWQgPSBmYWxzZTsKLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICAgICAgICAgICAgICAgICAgb2xkTG9hZFZhbGlkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG1PbGRUc1ZhbGlkID0gZmFsc2U7CisjaWZkZWYgRkFTVF9USFJFQURfU1RBVElTVElDUworICAgICAgICAgICAgICAgICAgICBtT2xkTG9hZFZhbGlkID0gZmFsc2U7CiAjZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgaWdub3JlTmV4dE92ZXJydW4gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtSWdub3JlTmV4dE92ZXJydW4gPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgbVByZXZpb3VzID0gbUN1cnJlbnQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjdXJyZW50ID0gbmV4dDsKKyAgICAgICAgICAgIG1DdXJyZW50ID0gbmV4dDsKICAgICAgICAgfQogI2lmICFMT0dfTkRFQlVHCiAgICAgICAgIG5leHQgPSBOVUxMOyAgICAvLyBub3QgcmVmZXJlbmNlZCBhZ2FpbgogI2VuZGlmCiAKLSAgICAgICAgZHVtcFN0YXRlLT5tQ29tbWFuZCA9IGNvbW1hbmQ7CisgICAgICAgIG1EdW1wU3RhdGUtPm1Db21tYW5kID0gbUNvbW1hbmQ7CiAKKyAgICAgICAgLy8gRklYTUUgd2hhdCBkb2VzIHRoaXMgY29tbWVudCBtZWFuPwogICAgICAgICAvLyA8PCBjdXJyZW50LCBwcmV2aW91cywgY29tbWFuZCwgZHVtcFN0YXRlID4+CiAKLSAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7CisgICAgICAgIHN3aXRjaCAobUNvbW1hbmQpIHsKICAgICAgICAgY2FzZSBGYXN0VGhyZWFkU3RhdGU6OklOSVRJQUw6CiAgICAgICAgIGNhc2UgRmFzdFRocmVhZFN0YXRlOjpIT1RfSURMRToKLSAgICAgICAgICAgIHNsZWVwTnMgPSBGQVNUX0hPVF9JRExFX05TOworICAgICAgICAgICAgbVNsZWVwTnMgPSBGQVNUX0hPVF9JRExFX05TOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIGNhc2UgRmFzdFRocmVhZFN0YXRlOjpDT0xEX0lETEU6CiAgICAgICAgICAgICAvLyBvbmx5IHBlcmZvcm0gYSBjb2xkIGlkbGUgY29tbWFuZCBvbmNlCiAgICAgICAgICAgICAvLyBGSVhNRSBjb25zaWRlciBjaGVja2luZyBwcmV2aW91cyBzdGF0ZSBhbmQgb25seSBwZXJmb3JtIGlmIHByZXZpb3VzICE9IENPTERfSURMRQotICAgICAgICAgICAgaWYgKGN1cnJlbnQtPm1Db2xkR2VuICE9IGNvbGRHZW4pIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90ICpjb2xkRnV0ZXhBZGRyID0gY3VycmVudC0+bUNvbGRGdXRleEFkZHI7CisgICAgICAgICAgICBpZiAobUN1cnJlbnQtPm1Db2xkR2VuICE9IG1Db2xkR2VuKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCAqY29sZEZ1dGV4QWRkciA9IG1DdXJyZW50LT5tQ29sZEZ1dGV4QWRkcjsKICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChjb2xkRnV0ZXhBZGRyICE9IE5VTEwpOwogICAgICAgICAgICAgICAgIGludDMyX3Qgb2xkID0gYW5kcm9pZF9hdG9taWNfZGVjKGNvbGRGdXRleEFkZHIpOwogICAgICAgICAgICAgICAgIGlmIChvbGQgPD0gMCkgewpAQCAtMTY0LDQxICsxNjksNDIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gVGhpcyBtYXkgYmUgb3Zlcmx5IGNvbnNlcnZhdGl2ZTsgdGhlcmUgY291bGQgYmUgdGltZXMgdGhhdCB0aGUgbm9ybWFsIG1peGVyCiAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdHMgc3VjaCBhIGJyaWVmIGNvbGQgaWRsZSB0aGF0IGl0IGRvZXNuJ3QgcmVxdWlyZSByZXNldHRpbmcgdGhpcyBmbGFnLgotICAgICAgICAgICAgICAgIGlzV2FybSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfc2VjID0gMDsKLSAgICAgICAgICAgICAgICBtZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgPSAwOwotICAgICAgICAgICAgICAgIHdhcm11cEN5Y2xlcyA9IDA7Ci0gICAgICAgICAgICAgICAgc2xlZXBOcyA9IC0xOwotICAgICAgICAgICAgICAgIGNvbGRHZW4gPSBjdXJyZW50LT5tQ29sZEdlbjsKLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICAgICAgICAgICAgICBib3VuZHMgPSAwOwotICAgICAgICAgICAgICAgIGZ1bGwgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtSXNXYXJtID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbU1lYXN1cmVkV2FybXVwVHMudHZfc2VjID0gMDsKKyAgICAgICAgICAgICAgICBtTWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjID0gMDsKKyAgICAgICAgICAgICAgICBtV2FybXVwQ3ljbGVzID0gMDsKKyAgICAgICAgICAgICAgICBtV2FybXVwQ29uc2VjdXRpdmVJblJhbmdlQ3ljbGVzID0gMDsKKyAgICAgICAgICAgICAgICBtU2xlZXBOcyA9IC0xOworICAgICAgICAgICAgICAgIG1Db2xkR2VuID0gbUN1cnJlbnQtPm1Db2xkR2VuOworI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKKyAgICAgICAgICAgICAgICBtQm91bmRzID0gMDsKKyAgICAgICAgICAgICAgICBtRnVsbCA9IGZhbHNlOwogI2VuZGlmCi0gICAgICAgICAgICAgICAgb2xkVHNWYWxpZCA9ICFjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJm9sZFRzKTsKLSAgICAgICAgICAgICAgICB0aW1lc3RhbXBTdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICBtT2xkVHNWYWxpZCA9ICFjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJm1PbGRUcyk7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzbGVlcE5zID0gRkFTVF9IT1RfSURMRV9OUzsKKyAgICAgICAgICAgICAgICBtU2xlZXBOcyA9IEZBU1RfSE9UX0lETEVfTlM7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgY2FzZSBGYXN0VGhyZWFkU3RhdGU6OkVYSVQ6CiAgICAgICAgICAgICBvbkV4aXQoKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWlzU3ViQ2xhc3NDb21tYW5kKGNvbW1hbmQpKTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWlzU3ViQ2xhc3NDb21tYW5kKG1Db21tYW5kKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIC8vIHRoZXJlIGlzIGEgbm9uLWlkbGUgc3RhdGUgYXZhaWxhYmxlIHRvIHVzOyBkaWQgdGhlIHN0YXRlIGNoYW5nZT8KLSAgICAgICAgaWYgKGN1cnJlbnQgIT0gcHJldmlvdXMpIHsKKyAgICAgICAgaWYgKG1DdXJyZW50ICE9IG1QcmV2aW91cykgewogICAgICAgICAgICAgb25TdGF0ZUNoYW5nZSgpOwogI2lmIDEgICAvLyBGSVhNRSBzaG91bGRuJ3QgbmVlZCB0aGlzCiAgICAgICAgICAgICAvLyBvbmx5IHByb2Nlc3Mgc3RhdGUgY2hhbmdlIG9uY2UKLSAgICAgICAgICAgIHByZXZpb3VzID0gY3VycmVudDsKKyAgICAgICAgICAgIG1QcmV2aW91cyA9IG1DdXJyZW50OwogI2VuZGlmCiAgICAgICAgIH0KIAogICAgICAgICAvLyBkbyB3b3JrIHVzaW5nIGN1cnJlbnQgc3RhdGUgaGVyZQotICAgICAgICBhdHRlbXB0ZWRXcml0ZSA9IGZhbHNlOworICAgICAgICBtQXR0ZW1wdGVkV3JpdGUgPSBmYWxzZTsKICAgICAgICAgb25Xb3JrKCk7CiAKICAgICAgICAgLy8gVG8gYmUgZXhhY3RseSBwZXJpb2RpYywgY29tcHV0ZSB0aGUgbmV4dCBzbGVlcCB0aW1lIGJhc2VkIG9uIGN1cnJlbnQgdGltZS4KQEAgLTIwNywxMyArMjEzLDEzIEBACiAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyBuZXdUczsKICAgICAgICAgaW50IHJjID0gY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZuZXdUcyk7CiAgICAgICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgICAgICAvL2xvZ1dyaXRlci0+bG9nVGltZXN0YW1wKG5ld1RzKTsKLSAgICAgICAgICAgIGlmIChvbGRUc1ZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgdGltZV90IHNlYyA9IG5ld1RzLnR2X3NlYyAtIG9sZFRzLnR2X3NlYzsKLSAgICAgICAgICAgICAgICBsb25nIG5zZWMgPSBuZXdUcy50dl9uc2VjIC0gb2xkVHMudHZfbnNlYzsKKyAgICAgICAgICAgIC8vbUxvZ1dyaXRlci0+bG9nVGltZXN0YW1wKG5ld1RzKTsKKyAgICAgICAgICAgIGlmIChtT2xkVHNWYWxpZCkgeworICAgICAgICAgICAgICAgIHRpbWVfdCBzZWMgPSBuZXdUcy50dl9zZWMgLSBtT2xkVHMudHZfc2VjOworICAgICAgICAgICAgICAgIGxvbmcgbnNlYyA9IG5ld1RzLnR2X25zZWMgLSBtT2xkVHMudHZfbnNlYzsKICAgICAgICAgICAgICAgICBBTE9HRV9JRihzZWMgPCAwIHx8IChzZWMgPT0gMCAmJiBuc2VjIDwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAiY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpIGZhaWxlZDogd2FzICVsZC4lMDlsZCBidXQgbm93ICVsZC4lMDlsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBvbGRUcy50dl9zZWMsIG9sZFRzLnR2X25zZWMsIG5ld1RzLnR2X3NlYywgbmV3VHMudHZfbnNlYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtT2xkVHMudHZfc2VjLCBtT2xkVHMudHZfbnNlYywgbmV3VHMudHZfc2VjLCBuZXdUcy50dl9uc2VjKTsKICAgICAgICAgICAgICAgICBpZiAobnNlYyA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgLS1zZWM7CiAgICAgICAgICAgICAgICAgICAgIG5zZWMgKz0gMTAwMDAwMDAwMDsKQEAgLTIyMSw2MiArMjI3LDcwIEBACiAgICAgICAgICAgICAgICAgLy8gVG8gYXZvaWQgYW4gaW5pdGlhbCB1bmRlcnJ1biBvbiBmYXN0IHRyYWNrcyBhZnRlciBleGl0aW5nIHN0YW5kYnksCiAgICAgICAgICAgICAgICAgLy8gZG8gbm90IHN0YXJ0IHB1bGxpbmcgZGF0YSBmcm9tIHRyYWNrcyBhbmQgbWl4aW5nIHVudGlsIHdhcm11cCBpcyBjb21wbGV0ZS4KICAgICAgICAgICAgICAgICAvLyBXYXJtdXAgaXMgY29uc2lkZXJlZCBjb21wbGV0ZSBhZnRlciB0aGUgZWFybGllciBvZjoKLSAgICAgICAgICAgICAgICAvLyAgICAgIE1JTl9XQVJNVVBfQ1lDTEVTIHdyaXRlKCkgYXR0ZW1wdHMgYW5kIGxhc3Qgb25lIGJsb2NrcyBmb3IgYXQgbGVhc3Qgd2FybXVwTnMKKyAgICAgICAgICAgICAgICAvLyAgICAgIE1JTl9XQVJNVVBfQ1lDTEVTIGNvbnNlY3V0aXZlIGluLXJhbmdlIHdyaXRlKCkgYXR0ZW1wdHMsCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgd2hlcmUgImluLXJhbmdlIiBtZWFucyBtV2FybXVwTnNNaW4gPD0gY3ljbGUgdGltZSA8PSBtV2FybXVwTnNNYXgKICAgICAgICAgICAgICAgICAvLyAgICAgIE1BWF9XQVJNVVBfQ1lDTEVTIHdyaXRlKCkgYXR0ZW1wdHMuCiAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBvdmVybHkgY29uc2VydmF0aXZlLCBidXQgdG8gZ2V0IGJldHRlciBhY2N1cmFjeSByZXF1aXJlcyBhIG5ldyBIQUwgQVBJLgotICAgICAgICAgICAgICAgIGlmICghaXNXYXJtICYmIGF0dGVtcHRlZFdyaXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfc2VjICs9IHNlYzsKLSAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9uc2VjICs9IG5zZWM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgPj0gMTAwMDAwMDAwMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZWRXYXJtdXBUcy50dl9zZWMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyAtPSAxMDAwMDAwMDAwOworICAgICAgICAgICAgICAgIGlmICghbUlzV2FybSAmJiBtQXR0ZW1wdGVkV3JpdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1lYXN1cmVkV2FybXVwVHMudHZfc2VjICs9IHNlYzsKKyAgICAgICAgICAgICAgICAgICAgbU1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyArPSBuc2VjOworICAgICAgICAgICAgICAgICAgICBpZiAobU1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyA+PSAxMDAwMDAwMDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTWVhc3VyZWRXYXJtdXBUcy50dl9zZWMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NZWFzdXJlZFdhcm11cFRzLnR2X25zZWMgLT0gMTAwMDAwMDAwMDsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICArK3dhcm11cEN5Y2xlczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChuc2VjID4gd2FybXVwTnMgJiYgd2FybXVwQ3ljbGVzID49IE1JTl9XQVJNVVBfQ1lDTEVTKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3YXJtdXBDeWNsZXMgPj0gTUFYX1dBUk1VUF9DWUNMRVMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc1dhcm0gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tTWVhc3VyZWRXYXJtdXBUcyA9IG1lYXN1cmVkV2FybXVwVHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1XYXJtdXBDeWNsZXMgPSB3YXJtdXBDeWNsZXM7CisgICAgICAgICAgICAgICAgICAgICsrbVdhcm11cEN5Y2xlczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1XYXJtdXBOc01pbiA8PSBuc2VjICYmIG5zZWMgPD0gbVdhcm11cE5zTWF4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigid2FybXVwIGN5Y2xlICVkIGluIHJhbmdlOiAlLjAzZiBtcyIsIG1XYXJtdXBDeWNsZXMsIG5zZWMgKiAxZS05KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrbVdhcm11cENvbnNlY3V0aXZlSW5SYW5nZUN5Y2xlczsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJ3YXJtdXAgY3ljbGUgJWQgb3V0IG9mIHJhbmdlOiAlLjAzZiBtcyIsIG1XYXJtdXBDeWNsZXMsIG5zZWMgKiAxZS05KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1XYXJtdXBDb25zZWN1dGl2ZUluUmFuZ2VDeWNsZXMgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgobVdhcm11cENvbnNlY3V0aXZlSW5SYW5nZUN5Y2xlcyA+PSBNSU5fV0FSTVVQX0NZQ0xFUykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVdhcm11cEN5Y2xlcyA+PSBNQVhfV0FSTVVQX0NZQ0xFUykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1dhcm0gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgbUR1bXBTdGF0ZS0+bU1lYXN1cmVkV2FybXVwVHMgPSBtTWVhc3VyZWRXYXJtdXBUczsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1XYXJtdXBDeWNsZXMgPSBtV2FybXVwQ3ljbGVzOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNsZWVwTnMgPSAtMTsKLSAgICAgICAgICAgICAgICBpZiAoaXNXYXJtKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZWMgPiAwIHx8IG5zZWMgPiB1bmRlcnJ1bk5zKSB7CisgICAgICAgICAgICAgICAgbVNsZWVwTnMgPSAtMTsKKyAgICAgICAgICAgICAgICBpZiAobUlzV2FybSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2VjID4gMCB8fCBuc2VjID4gbVVuZGVycnVuTnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJ1bmRlcnJ1biIpOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgb25seSBsb2cgb2NjYXNpb25hbGx5CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigidW5kZXJydW46IHRpbWUgc2luY2UgbGFzdCBjeWNsZSAlZC4lMDNsZCBzZWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBzZWMsIG5zZWMgLyAxMDAwMDAwTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1VbmRlcnJ1bnMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuc2VjIDwgb3ZlcnJ1bk5zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWdub3JlTmV4dE92ZXJydW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVOZXh0T3ZlcnJ1biA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgbUR1bXBTdGF0ZS0+bVVuZGVycnVucysrOworICAgICAgICAgICAgICAgICAgICAgICAgbUlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuc2VjIDwgbU92ZXJydW5OcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1JZ25vcmVOZXh0T3ZlcnJ1bikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JZ25vcmVOZXh0T3ZlcnJ1biA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBvbmx5IGxvZyBvY2Nhc2lvbmFsbHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigib3ZlcnJ1bjogdGltZSBzaW5jZSBsYXN0IGN5Y2xlICVkLiUwM2xkIHNlYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSBzZWMsIG5zZWMgLyAxMDAwMDAwTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tT3ZlcnJ1bnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tT3ZlcnJ1bnMrKzsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgZm9yY2VzIGEgbWluaW11bSBjeWNsZSB0aW1lLiBJdDoKICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIGNvbXBlbnNhdGVzIGZvciBhbiBhdWRpbyBIQUwgd2l0aCBqaXR0ZXIgZHVlIHRvIHNhbXBsZSByYXRlIGNvbnZlcnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAtIHdvcmtzIHdpdGggYSB2YXJpYWJsZSBidWZmZXIgZGVwdGggYXVkaW8gSEFMIHRoYXQgbmV2ZXIgcHVsbHMgYXQgYQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmF0ZSA8IHRoYW4gb3ZlcnJ1bk5zIHBlciBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICByYXRlIDwgdGhhbiBtT3ZlcnJ1bk5zIHBlciBidWZmZXIuCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSByZWNvdmVycyBmcm9tIG92ZXJydW4gaW1tZWRpYXRlbHkgYWZ0ZXIgdW5kZXJydW4KICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0IGRvZXNuJ3Qgd29yayB3aXRoIGEgbm9uLWJsb2NraW5nIGF1ZGlvIEhBTC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwTnMgPSBmb3JjZU5zIC0gbnNlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TbGVlcE5zID0gbUZvcmNlTnMgLSBuc2VjOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlTmV4dE92ZXJydW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JZ25vcmVOZXh0T3ZlcnJ1biA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgICAgICAgICAgICAgIGlmIChpc1dhcm0pIHsKKyNpZmRlZiBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCisgICAgICAgICAgICAgICAgaWYgKG1Jc1dhcm0pIHsKICAgICAgICAgICAgICAgICAgICAgLy8gYWR2YW5jZSB0aGUgRklGTyBxdWV1ZSBib3VuZHMKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGkgPSBib3VuZHMgJiAoZHVtcFN0YXRlLT5tU2FtcGxpbmdOIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIGJvdW5kcyA9IChib3VuZHMgJiAweEZGRkYwMDAwKSB8ICgoYm91bmRzICsgMSkgJiAweEZGRkYpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzICs9IDB4MTAwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIShib3VuZHMgJiAoZHVtcFN0YXRlLT5tU2FtcGxpbmdOIC0gMSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmdWxsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGkgPSBtQm91bmRzICYgKG1EdW1wU3RhdGUtPm1TYW1wbGluZ04gLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgbUJvdW5kcyA9IChtQm91bmRzICYgMHhGRkZGMDAwMCkgfCAoKG1Cb3VuZHMgKyAxKSAmIDB4RkZGRik7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUJvdW5kcyArPSAweDEwMDAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEobUJvdW5kcyAmIChtRHVtcFN0YXRlLT5tU2FtcGxpbmdOIC0gMSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtRnVsbCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSB0aGUgZGVsdGEgdmFsdWUgb2YgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpCiAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1vbm90b25pY05zID0gbnNlYzsKQEAgLTI4OCw5ICszMDIsOSBAQAogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgbmV3TG9hZDsKICAgICAgICAgICAgICAgICAgICAgcmMgPSBjbG9ja19nZXR0aW1lKENMT0NLX1RIUkVBRF9DUFVUSU1FX0lELCAmbmV3TG9hZCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkTG9hZFZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjID0gbmV3TG9hZC50dl9zZWMgLSBvbGRMb2FkLnR2X3NlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2VjID0gbmV3TG9hZC50dl9uc2VjIC0gb2xkTG9hZC50dl9uc2VjOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1PbGRMb2FkVmFsaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWMgPSBuZXdMb2FkLnR2X3NlYyAtIG1PbGRMb2FkLnR2X3NlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2VjID0gbmV3TG9hZC50dl9uc2VjIC0gbU9sZExvYWQudHZfbnNlYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnNlYyA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1zZWM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWMgKz0gMTAwMDAwMDAwMDsKQEAgLTMwMSw0MiArMzE1LDQyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCB0aW1lIHRocm91Z2ggdGhlIGxvb3AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRMb2FkVmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PbGRMb2FkVmFsaWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgb2xkTG9hZCA9IG5ld0xvYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtT2xkTG9hZCA9IG5ld0xvYWQ7CiAgICAgICAgICAgICAgICAgICAgIH0KICNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIGtIegogICAgICAgICAgICAgICAgICAgICBpbnQgY3B1TnVtID0gc2NoZWRfZ2V0Y3B1KCk7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGtIeiA9IHRjdS5nZXRDcHVrSHooY3B1TnVtKTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qga0h6ID0gbVRjdS5nZXRDcHVrSHooY3B1TnVtKTsKICAgICAgICAgICAgICAgICAgICAga0h6ID0gKGtIeiA8PCA0KSB8IChjcHVOdW0gJiAweEYpOwogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgdmFsdWVzIGluIEZJRk8gcXVldWVzIGZvciBkdW1wc3lzCiAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIHN0b3JlcyAjMSwgIzIsICMzIGFyZSBub3QgYXRvbWljIHdpdGggcmVzcGVjdCB0byBlYWNoIG90aGVyLAogICAgICAgICAgICAgICAgICAgICAvLyBvciB3aXRoIHJlc3BlY3QgdG8gc3RvcmUgIzQgYmVsb3cKLSAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tTW9ub3RvbmljTnNbaV0gPSBtb25vdG9uaWNOczsKLSAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tTG9hZE5zW2ldID0gbG9hZE5zOworICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tTW9ub3RvbmljTnNbaV0gPSBtb25vdG9uaWNOczsKKyAgICAgICAgICAgICAgICAgICAgbUR1bXBTdGF0ZS0+bUxvYWROc1tpXSA9IGxvYWROczsKICNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICAgICAgICAgICAgICAgICAgZHVtcFN0YXRlLT5tQ3B1a0h6W2ldID0ga0h6OworICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tQ3B1a0h6W2ldID0ga0h6OwogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc3RvcmUgIzQgaXMgbm90IGF0b21pYyB3aXRoIHJlc3BlY3QgdG8gc3RvcmVzICMxLCAjMiwgIzMgYWJvdmUsIGJ1dAogICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmV3ZXN0IG9wZW4gJiBvbGRlc3QgY2xvc2VkIGhhbHZlcyBhcmUgYXRvbWljIHdpdGggcmVzcGVjdCB0byBlYWNoIG90aGVyCi0gICAgICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bUJvdW5kcyA9IGJvdW5kczsKKyAgICAgICAgICAgICAgICAgICAgbUR1bXBTdGF0ZS0+bUJvdW5kcyA9IG1Cb3VuZHM7CiAgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9JTlQoImN5Y2xlX21zIiwgbW9ub3RvbmljTnMgLyAxMDAwMDAwKTsKICAgICAgICAgICAgICAgICAgICAgQVRSQUNFX0lOVCgibG9hZF91cyIsIGxvYWROcyAvIDEwMDApOwogICAgICAgICAgICAgICAgIH0KICNlbmRpZgogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBmaXJzdCB0aW1lIHRocm91Z2ggdGhlIGxvb3AKLSAgICAgICAgICAgICAgICBvbGRUc1ZhbGlkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzbGVlcE5zID0gcGVyaW9kTnM7Ci0gICAgICAgICAgICAgICAgaWdub3JlTmV4dE92ZXJydW4gPSB0cnVlOworICAgICAgICAgICAgICAgIG1PbGRUc1ZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtU2xlZXBOcyA9IG1QZXJpb2ROczsKKyAgICAgICAgICAgICAgICBtSWdub3JlTmV4dE92ZXJydW4gPSB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgb2xkVHMgPSBuZXdUczsKKyAgICAgICAgICAgIG1PbGRUcyA9IG5ld1RzOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gbW9ub3RvbmljIGNsb2NrIGlzIGJyb2tlbgotICAgICAgICAgICAgb2xkVHNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgc2xlZXBOcyA9IHBlcmlvZE5zOworICAgICAgICAgICAgbU9sZFRzVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgICAgIG1TbGVlcE5zID0gbVBlcmlvZE5zOwogICAgICAgICB9CiAKICAgICB9ICAgLy8gZm9yICg7OykKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oCmluZGV4IDEzMzAzMzQuLjJlZmI2ZGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuaApAQCAtNDgsNDIgKzQ4LDQ1IEBACiAgICAgdmlydHVhbCB2b2lkIG9uU3RhdGVDaGFuZ2UoKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIG9uV29yaygpID0gMDsKIAotICAgIC8vIEZJWE1FIHRoZXNlIGZvcm1lciBsb2NhbCB2YXJpYWJsZXMgbmVlZCBjb21tZW50cyBhbmQgdG8gYmUgcmVuYW1lZCB0byBoYXZlIGFuICJtIiBwcmVmaXgKLSAgICBjb25zdCBGYXN0VGhyZWFkU3RhdGUgKnByZXZpb3VzOwotICAgIGNvbnN0IEZhc3RUaHJlYWRTdGF0ZSAqY3VycmVudDsKLSAgICBzdHJ1Y3QgdGltZXNwZWMgb2xkVHM7Ci0gICAgYm9vbCBvbGRUc1ZhbGlkOwotICAgIGxvbmcgc2xlZXBOczsgICAvLyAtMTogYnVzeSB3YWl0LCAwOiBzY2hlZF95aWVsZCwgPiAwOiBuYW5vc2xlZXAKLSAgICBsb25nIHBlcmlvZE5zOyAgICAgIC8vIGV4cGVjdGVkIHBlcmlvZDsgdGhlIHRpbWUgcmVxdWlyZWQgdG8gcmVuZGVyIG9uZSBtaXggYnVmZmVyCi0gICAgbG9uZyB1bmRlcnJ1bk5zOyAgICAvLyB1bmRlcnJ1biBsaWtlbHkgd2hlbiB3cml0ZSBjeWNsZSBpcyBncmVhdGVyIHRoYW4gdGhpcyB2YWx1ZQotICAgIGxvbmcgb3ZlcnJ1bk5zOyAgICAgLy8gb3ZlcnJ1biBsaWtlbHkgd2hlbiB3cml0ZSBjeWNsZSBpcyBsZXNzIHRoYW4gdGhpcyB2YWx1ZQotICAgIGxvbmcgZm9yY2VOczsgICAgICAgLy8gaWYgb3ZlcnJ1biBkZXRlY3RlZCwgZm9yY2UgdGhlIHdyaXRlIGN5Y2xlIHRvIHRha2UgdGhpcyBtdWNoIHRpbWUKLSAgICBsb25nIHdhcm11cE5zOyAgICAgIC8vIHdhcm11cCBjb21wbGV0ZSB3aGVuIHdyaXRlIGN5Y2xlIGlzIGdyZWF0ZXIgdGhhbiB0byB0aGlzIHZhbHVlCi0gICAgRmFzdFRocmVhZER1bXBTdGF0ZSAqbUR1bW15RHVtcFN0YXRlOwotICAgIEZhc3RUaHJlYWREdW1wU3RhdGUgKmR1bXBTdGF0ZTsKLSAgICBib29sIGlnbm9yZU5leHRPdmVycnVuOyAgLy8gdXNlZCB0byBpZ25vcmUgaW5pdGlhbCBvdmVycnVuIGFuZCBmaXJzdCBhZnRlciBhbiB1bmRlcnJ1bgotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgIHN0cnVjdCB0aW1lc3BlYyBvbGRMb2FkOyAgICAvLyBwcmV2aW91cyB2YWx1ZSBvZiBjbG9ja19nZXR0aW1lKENMT0NLX1RIUkVBRF9DUFVUSU1FX0lEKQotICAgIGJvb2wgb2xkTG9hZFZhbGlkOyAgLy8gd2hldGhlciBvbGRMb2FkIGlzIHZhbGlkCi0gICAgdWludDMyX3QgYm91bmRzOwotICAgIGJvb2wgZnVsbDsgICAgICAgICAgLy8gd2hldGhlciB3ZSBoYXZlIGNvbGxlY3RlZCBhdCBsZWFzdCBtU2FtcGxpbmdOIHNhbXBsZXMKKyAgICAvLyBGSVhNRSB0aGVzZSBmb3JtZXIgbG9jYWwgdmFyaWFibGVzIG5lZWQgY29tbWVudHMKKyAgICBjb25zdCBGYXN0VGhyZWFkU3RhdGUqICBtUHJldmlvdXM7CisgICAgY29uc3QgRmFzdFRocmVhZFN0YXRlKiAgbUN1cnJlbnQ7CisgICAgc3RydWN0IHRpbWVzcGVjIG1PbGRUczsKKyAgICBib29sICAgICAgICAgICAgbU9sZFRzVmFsaWQ7CisgICAgbG9uZyAgICAgICAgICAgIG1TbGVlcE5zOyAgICAgICAvLyAtMTogYnVzeSB3YWl0LCAwOiBzY2hlZF95aWVsZCwgPiAwOiBuYW5vc2xlZXAKKyAgICBsb25nICAgICAgICAgICAgbVBlcmlvZE5zOyAgICAgIC8vIGV4cGVjdGVkIHBlcmlvZDsgdGhlIHRpbWUgcmVxdWlyZWQgdG8gcmVuZGVyIG9uZSBtaXggYnVmZmVyCisgICAgbG9uZyAgICAgICAgICAgIG1VbmRlcnJ1bk5zOyAgICAvLyB1bmRlcnJ1biBsaWtlbHkgd2hlbiB3cml0ZSBjeWNsZSBpcyBncmVhdGVyIHRoYW4gdGhpcyB2YWx1ZQorICAgIGxvbmcgICAgICAgICAgICBtT3ZlcnJ1bk5zOyAgICAgLy8gb3ZlcnJ1biBsaWtlbHkgd2hlbiB3cml0ZSBjeWNsZSBpcyBsZXNzIHRoYW4gdGhpcyB2YWx1ZQorICAgIGxvbmcgICAgICAgICAgICBtRm9yY2VOczsgICAgICAgLy8gaWYgb3ZlcnJ1biBkZXRlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcmNlIHRoZSB3cml0ZSBjeWNsZSB0byB0YWtlIHRoaXMgbXVjaCB0aW1lCisgICAgbG9uZyAgICAgICAgICAgIG1XYXJtdXBOc01pbjsgICAvLyB3YXJtdXAgY29tcGxldGUgd2hlbiB3cml0ZSBjeWNsZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgdmFsdWUKKyAgICBsb25nICAgICAgICAgICAgbVdhcm11cE5zTWF4OyAgIC8vIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhpcyB2YWx1ZQorICAgIEZhc3RUaHJlYWREdW1wU3RhdGUqIG1EdW1teUR1bXBTdGF0ZTsKKyAgICBGYXN0VGhyZWFkRHVtcFN0YXRlKiBtRHVtcFN0YXRlOworICAgIGJvb2wgICAgICAgICAgICBtSWdub3JlTmV4dE92ZXJydW47ICAgICAvLyB1c2VkIHRvIGlnbm9yZSBpbml0aWFsIG92ZXJydW4gYW5kIGZpcnN0IGFmdGVyIGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuZGVycnVuCisjaWZkZWYgRkFTVF9USFJFQURfU1RBVElTVElDUworICAgIHN0cnVjdCB0aW1lc3BlYyBtT2xkTG9hZDsgICAgICAgLy8gcHJldmlvdXMgdmFsdWUgb2YgY2xvY2tfZ2V0dGltZShDTE9DS19USFJFQURfQ1BVVElNRV9JRCkKKyAgICBib29sICAgICAgICAgICAgbU9sZExvYWRWYWxpZDsgIC8vIHdoZXRoZXIgb2xkTG9hZCBpcyB2YWxpZAorICAgIHVpbnQzMl90ICAgICAgICBtQm91bmRzOworICAgIGJvb2wgICAgICAgICAgICBtRnVsbDsgICAgICAgICAgLy8gd2hldGhlciB3ZSBoYXZlIGNvbGxlY3RlZCBhdCBsZWFzdCBtU2FtcGxpbmdOIHNhbXBsZXMKICNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICBUaHJlYWRDcHVVc2FnZSB0Y3U7ICAgICAvLyBmb3IgcmVhZGluZyB0aGUgY3VycmVudCBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIGtIegorICAgIFRocmVhZENwdVVzYWdlICBtVGN1OyAgICAgICAgICAgLy8gZm9yIHJlYWRpbmcgdGhlIGN1cnJlbnQgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBrSHoKICNlbmRpZgogI2VuZGlmCi0gICAgdW5zaWduZWQgY29sZEdlbjsgICAvLyBsYXN0IG9ic2VydmVkIG1Db2xkR2VuCi0gICAgYm9vbCBpc1dhcm07ICAgICAgICAvLyB0cnVlIG1lYW5zIHJlYWR5IHRvIG1peCwgZmFsc2UgbWVhbnMgd2FpdCBmb3Igd2FybXVwIGJlZm9yZSBtaXhpbmcKLSAgICBzdHJ1Y3QgdGltZXNwZWMgbWVhc3VyZWRXYXJtdXBUczsgIC8vIGhvdyBsb25nIGRpZCBpdCB0YWtlIGZvciB3YXJtdXAgdG8gY29tcGxldGUKLSAgICB1aW50MzJfdCB3YXJtdXBDeWNsZXM7ICAvLyBjb3VudGVyIG9mIG51bWJlciBvZiBsb29wIGN5Y2xlcyByZXF1aXJlZCB0byB3YXJtdXAKLSAgICBOQkxvZzo6V3JpdGVyIGR1bW15TG9nV3JpdGVyOwotICAgIE5CTG9nOjpXcml0ZXIgKmxvZ1dyaXRlcjsKLSAgICBzdGF0dXNfdCB0aW1lc3RhbXBTdGF0dXM7CisgICAgdW5zaWduZWQgICAgICAgIG1Db2xkR2VuOyAgICAgICAvLyBsYXN0IG9ic2VydmVkIG1Db2xkR2VuCisgICAgYm9vbCAgICAgICAgICAgIG1Jc1dhcm07ICAgICAgICAvLyB0cnVlIG1lYW5zIHJlYWR5IHRvIG1peCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbHNlIG1lYW5zIHdhaXQgZm9yIHdhcm11cCBiZWZvcmUgbWl4aW5nCisgICAgc3RydWN0IHRpbWVzcGVjIG1NZWFzdXJlZFdhcm11cFRzOyAgLy8gaG93IGxvbmcgZGlkIGl0IHRha2UgZm9yIHdhcm11cCB0byBjb21wbGV0ZQorICAgIHVpbnQzMl90ICAgICAgICBtV2FybXVwQ3ljbGVzOyAgLy8gY291bnRlciBvZiBudW1iZXIgb2YgbG9vcCBjeWNsZXMgZHVyaW5nIHdhcm11cCBwaGFzZQorICAgIHVpbnQzMl90ICAgICAgICBtV2FybXVwQ29uc2VjdXRpdmVJblJhbmdlQ3ljbGVzOyAgICAvLyBudW1iZXIgb2YgY29uc2VjdXRpdmUgY3ljbGVzIGluIHJhbmdlCisgICAgTkJMb2c6OldyaXRlciAgIG1EdW1teUxvZ1dyaXRlcjsKKyAgICBOQkxvZzo6V3JpdGVyKiAgbUxvZ1dyaXRlcjsKKyAgICBzdGF0dXNfdCAgICAgICAgbVRpbWVzdGFtcFN0YXR1czsKIAotICAgIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZCBjb21tYW5kOwotI2lmIDAKLSAgICBzaXplX3QgZnJhbWVDb3VudDsKLSNlbmRpZgotICAgIGJvb2wgYXR0ZW1wdGVkV3JpdGU7CisgICAgRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kIG1Db21tYW5kOworICAgIGJvb2wgICAgICAgICAgICBtQXR0ZW1wdGVkV3JpdGU7CiAKIH07ICAvLyBjbGFzcyBGYXN0VGhyZWFkCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkRHVtcFN0YXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkRHVtcFN0YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGY1YzRjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWREdW1wU3RhdGUuY3BwCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiRmFzdFRocmVhZER1bXBTdGF0ZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0Zhc3RUaHJlYWREdW1wU3RhdGU6OkZhc3RUaHJlYWREdW1wU3RhdGUoKSA6CisgICAgbUNvbW1hbmQoRmFzdFRocmVhZFN0YXRlOjpJTklUSUFMKSwgbVVuZGVycnVucygwKSwgbU92ZXJydW5zKDApLAorICAgIC8qIG1NZWFzdXJlZFdhcm11cFRzKHswLCAwfSksICovCisgICAgbVdhcm11cEN5Y2xlcygwKQorI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKKyAgICAsIG1TYW1wbGluZ04oMCksIG1Cb3VuZHMoMCkKKyNlbmRpZgoreworICAgIG1NZWFzdXJlZFdhcm11cFRzLnR2X3NlYyA9IDA7CisgICAgbU1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyA9IDA7CisjaWZkZWYgRkFTVF9USFJFQURfU1RBVElTVElDUworICAgIGluY3JlYXNlU2FtcGxpbmdOKDEpOworI2VuZGlmCit9CisKK0Zhc3RUaHJlYWREdW1wU3RhdGU6On5GYXN0VGhyZWFkRHVtcFN0YXRlKCkKK3sKK30KKworI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKK3ZvaWQgRmFzdFRocmVhZER1bXBTdGF0ZTo6aW5jcmVhc2VTYW1wbGluZ04odWludDMyX3Qgc2FtcGxpbmdOKQoreworICAgIGlmIChzYW1wbGluZ04gPD0gbVNhbXBsaW5nTiB8fCBzYW1wbGluZ04gPiBrU2FtcGxpbmdOIHx8IHJvdW5kdXAoc2FtcGxpbmdOKSAhPSBzYW1wbGluZ04pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB1aW50MzJfdCBhZGRpdGlvbmFsID0gc2FtcGxpbmdOIC0gbVNhbXBsaW5nTjsKKyAgICAvLyBzYW1wbGUgYXJyYXlzIGFyZW4ndCBhY2Nlc3NlZCBhdG9taWNhbGx5IHdpdGggcmVzcGVjdCB0byB0aGUgYm91bmRzLAorICAgIC8vIHNvIGNsZWFyaW5nIHJlZHVjZXMgY2hhbmNlIGZvciBkdW1wc3lzIHRvIHJlYWQgcmFuZG9tIHVuaW5pdGlhbGl6ZWQgc2FtcGxlcworICAgIG1lbXNldCgmbU1vbm90b25pY05zW21TYW1wbGluZ05dLCAwLCBzaXplb2YobU1vbm90b25pY05zWzBdKSAqIGFkZGl0aW9uYWwpOworICAgIG1lbXNldCgmbUxvYWROc1ttU2FtcGxpbmdOXSwgMCwgc2l6ZW9mKG1Mb2FkTnNbMF0pICogYWRkaXRpb25hbCk7CisjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCisgICAgbWVtc2V0KCZtQ3B1a0h6W21TYW1wbGluZ05dLCAwLCBzaXplb2YobUNwdWtIelswXSkgKiBhZGRpdGlvbmFsKTsKKyNlbmRpZgorICAgIG1TYW1wbGluZ04gPSBzYW1wbGluZ047Cit9CisjZW5kaWYKKworfSAgIC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkRHVtcFN0YXRlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZER1bXBTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZTA5MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZER1bXBTdGF0ZS5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQVVESU9fRkFTVF9USFJFQURfRFVNUF9TVEFURV9ICisjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9USFJFQURfRFVNUF9TVEFURV9ICisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSAiRmFzdFRocmVhZFN0YXRlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gVGhlIEZhc3RUaHJlYWREdW1wU3RhdGUga2VlcHMgYSBjYWNoZSBvZiBGYXN0VGhyZWFkIHN0YXRpc3RpY3MgdGhhdCBjYW4gYmUgbG9nZ2VkIGJ5IGR1bXBzeXMuCisvLyBFYWNoIGluZGl2aWR1YWwgbmF0aXZlIHdvcmQtc2l6ZWQgZmllbGQgaXMgYWNjZXNzZWQgYXRvbWljYWxseS4gIEJ1dCB0aGUKKy8vIG92ZXJhbGwgc3RydWN0dXJlIGlzIG5vbi1hdG9taWMsIHRoYXQgaXMgdGhlcmUgbWF5IGJlIGFuIGluY29uc2lzdGVuY3kgYmV0d2VlbiBmaWVsZHMuCisvLyBObyBiYXJyaWVycyBvciBsb2NrcyBhcmUgdXNlZCBmb3IgZWl0aGVyIHdyaXRpbmcgb3IgcmVhZGluZy4KKy8vIE9ubHkgUE9EIHR5cGVzIGFyZSBwZXJtaXR0ZWQsIGFuZCB0aGUgY29udGVudHMgc2hvdWxkbid0IGJlIHRydXN0ZWQgKGkuZS4gZG8gcmFuZ2UgY2hlY2tzKS4KKy8vIEl0IGhhcyBhIGRpZmZlcmVudCBsaWZldGltZSB0aGFuIHRoZSBGYXN0VGhyZWFkLCBhbmQgc28gaXQgY2FuJ3QgYmUgYSBtZW1iZXIgb2YgRmFzdFRocmVhZC4KK3N0cnVjdCBGYXN0VGhyZWFkRHVtcFN0YXRlIHsKKyAgICBGYXN0VGhyZWFkRHVtcFN0YXRlKCk7CisgICAgLyp2aXJ0dWFsKi8gfkZhc3RUaHJlYWREdW1wU3RhdGUoKTsKKworICAgIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZCBtQ29tbWFuZDsgICAvLyBjdXJyZW50IGNvbW1hbmQKKyAgICB1aW50MzJfdCBtVW5kZXJydW5zOyAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIHVuZGVycnVucworICAgIHVpbnQzMl90IG1PdmVycnVuczsgICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2Ygb3ZlcnJ1bnMKKyAgICBzdHJ1Y3QgdGltZXNwZWMgbU1lYXN1cmVkV2FybXVwVHM7ICAvLyBtZWFzdXJlZCB3YXJtdXAgdGltZQorICAgIHVpbnQzMl90IG1XYXJtdXBDeWNsZXM7ICAgICAvLyBudW1iZXIgb2YgbG9vcCBjeWNsZXMgcmVxdWlyZWQgdG8gd2FybXVwCisKKyNpZmRlZiBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCisgICAgLy8gUmVjZW50bHkgY29sbGVjdGVkIHNhbXBsZXMgb2YgcGVyLWN5Y2xlIG1vbm90b25pYyB0aW1lLCB0aHJlYWQgQ1BVIHRpbWUsIGFuZCBDUFUgZnJlcXVlbmN5LgorICAgIC8vIGtTYW1wbGluZ04gaXMgbWF4IHNpemUgb2Ygc2FtcGxpbmcgZnJhbWUgKHN0YXRpc3RpY3MpLCBhbmQgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0gMHg4MDAwLgorICAgIC8vIFRoZSBzYW1wbGUgYXJyYXlzIGFyZSB2aXJ0dWFsbHkgYWxsb2NhdGVkIGJhc2VkIG9uIHRoaXMgY29tcGlsZS10aW1lIGNvbnN0YW50LAorICAgIC8vIGJ1dCBhcmUgb25seSBpbml0aWFsaXplZCBhbmQgdXNlZCBiYXNlZCBvbiB0aGUgcnVudGltZSBwYXJhbWV0ZXIgbVNhbXBsaW5nTi4KKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1NhbXBsaW5nTiA9IDB4ODAwMDsKKyAgICAvLyBDb21waWxlLXRpbWUgY29uc3RhbnQgZm9yIGEgImxvdyBSQU0gZGV2aWNlIiwgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0ga1NhbXBsaW5nTi4KKyAgICAvLyBUaGlzIHZhbHVlIHdhcyBjaG9zZW4gc3VjaCB0aGF0IGVhY2ggYXJyYXkgdXNlcyAxIHNtYWxsIHBhZ2UgKDQgS2J5dGVzKS4KKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1NhbXBsaW5nTmZvckxvd1JhbURldmljZSA9IDB4NDAwOworICAgIC8vIENvcnJlc3BvbmRpbmcgcnVudGltZSBtYXhpbXVtIHNpemUgb2Ygc2FtcGxlIGFycmF5cywgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0ga1NhbXBsaW5nTi4KKyAgICB1aW50MzJfdCBtU2FtcGxpbmdOOworICAgIC8vIFRoZSBib3VuZHMgZGVmaW5lIHRoZSBpbnRlcnZhbCBvZiB2YWxpZCBzYW1wbGVzLCBhbmQgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6CisgICAgLy8gICAgICBuZXdlc3Qgb3BlbiAoZXhjbHVkZWQpIGVuZHBvaW50ICAgPSBsb3dlciAxNiBiaXRzIG9mIGJvdW5kcywgbW9kdWxvIE4KKyAgICAvLyAgICAgIG9sZGVzdCBjbG9zZWQgKGluY2x1ZGVkKSBlbmRwb2ludCA9IHVwcGVyIDE2IGJpdHMgb2YgYm91bmRzLCBtb2R1bG8gTgorICAgIC8vIE51bWJlciBvZiB2YWxpZCBzYW1wbGVzIGlzIG5ld2VzdCAtIG9sZGVzdC4KKyAgICB1aW50MzJfdCBtQm91bmRzOyAgICAgICAgICAgICAgICAgICAvLyBib3VuZHMgZm9yIG1Nb25vdG9uaWNOcywgbVRocmVhZENwdU5zLCBhbmQgbUNwdWtIegorICAgIC8vIFRoZSBlbGVtZW50cyBpbiB0aGUgKk5zIGFycmF5cyBhcmUgaW4gdW5pdHMgb2YgbmFub3NlY29uZHMgPD0gMzk5OTk5OTk5OS4KKyAgICB1aW50MzJfdCBtTW9ub3RvbmljTnNba1NhbXBsaW5nTl07ICAvLyBkZWx0YSBtb25vdG9uaWMgKHdhbGwgY2xvY2spIHRpbWUKKyAgICB1aW50MzJfdCBtTG9hZE5zW2tTYW1wbGluZ05dOyAgICAgICAvLyBkZWx0YSBDUFUgbG9hZCBpbiB0aW1lCisjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCisgICAgdWludDMyX3QgbUNwdWtIeltrU2FtcGxpbmdOXTsgICAgICAgLy8gYWJzb2x1dGUgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBrSHosIGJpdHMgMC0zIGFyZSBDUFUjCisjZW5kaWYKKworICAgIC8vIEluY3JlYXNlIHNhbXBsaW5nIHdpbmRvdyBhZnRlciBjb25zdHJ1Y3Rpb24sIG11c3QgYmUgYSBwb3dlciBvZiAyIDw9IGtTYW1wbGluZ04KKyAgICB2b2lkICAgIGluY3JlYXNlU2FtcGxpbmdOKHVpbnQzMl90IHNhbXBsaW5nTik7CisjZW5kaWYKKworfTsgIC8vIHN0cnVjdCBGYXN0VGhyZWFkRHVtcFN0YXRlCisKK30gICAvLyBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19GQVNUX1RIUkVBRF9EVU1QX1NUQVRFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWRTdGF0ZS5jcHAKaW5kZXggNjk5NDg3Mi4uYWQ1ZjMxZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWRTdGF0ZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWRTdGF0ZS5jcHAKQEAgLTI5LDIxICsyOSwxNiBAQAogewogfQogCi0KLUZhc3RUaHJlYWREdW1wU3RhdGU6OkZhc3RUaHJlYWREdW1wU3RhdGUoKSA6Ci0gICAgbUNvbW1hbmQoRmFzdFRocmVhZFN0YXRlOjpJTklUSUFMKSwgbVVuZGVycnVucygwKSwgbU92ZXJydW5zKDApLAotICAgIC8qIG1NZWFzdXJlZFdhcm11cFRzKHswLCAwfSksICovCi0gICAgbVdhcm11cEN5Y2xlcygwKQotI2lmZGVmIEZBU1RfTUlYRVJfU1RBVElTVElDUwotICAgICwgbVNhbXBsaW5nTigxKSwgbUJvdW5kcygwKQotI2VuZGlmCisvLyBzdGF0aWMKK2NvbnN0IGNoYXIgKkZhc3RUaHJlYWRTdGF0ZTo6Y29tbWFuZFRvU3RyaW5nKEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZCBjb21tYW5kKQogewotICAgIG1NZWFzdXJlZFdhcm11cFRzLnR2X3NlYyA9IDA7Ci0gICAgbU1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyA9IDA7Ci19Ci0KLUZhc3RUaHJlYWREdW1wU3RhdGU6On5GYXN0VGhyZWFkRHVtcFN0YXRlKCkKLXsKKyAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKKyAgICBjYXNlIEZhc3RUaHJlYWRTdGF0ZTo6SU5JVElBTDogICAgICByZXR1cm4gIklOSVRJQUwiOworICAgIGNhc2UgRmFzdFRocmVhZFN0YXRlOjpIT1RfSURMRTogICAgIHJldHVybiAiSE9UX0lETEUiOworICAgIGNhc2UgRmFzdFRocmVhZFN0YXRlOjpDT0xEX0lETEU6ICAgIHJldHVybiAiQ09MRF9JRExFIjsKKyAgICBjYXNlIEZhc3RUaHJlYWRTdGF0ZTo6RVhJVDogICAgICAgICByZXR1cm4gIkVYSVQiOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZFN0YXRlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZFN0YXRlLmgKaW5kZXggMWFiOGEwYS4uZjE4Zjg0NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWRTdGF0ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkU3RhdGUuaApAQCAtNDYsNDMgKzQ2LDEwIEBACiAgICAgRmFzdFRocmVhZER1bXBTdGF0ZSogbUR1bXBTdGF0ZTsgLy8gaWYgbm9uLU5VTEwsIHRoZW4gdXBkYXRlIGR1bXAgc3RhdGUgcGVyaW9kaWNhbGx5CiAgICAgTkJMb2c6OldyaXRlciogbU5CTG9nV3JpdGVyOyAvLyBub24tYmxvY2tpbmcgbG9nZ2VyCiAKKyAgICAvLyByZXR1cm5zIE5VTEwgaWYgY29tbWFuZCBiZWxvbmdzIHRvIGEgc3ViY2xhc3MKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29tbWFuZFRvU3RyaW5nKENvbW1hbmQgY29tbWFuZCk7CiB9OyAgLy8gc3RydWN0IEZhc3RUaHJlYWRTdGF0ZQogCi0KLS8vIEZJWE1FIGV4dHJhY3QgY29tbW9uIHBhcnQgb2YgY29tbWVudCBhdCBGYXN0TWl4ZXJEdW1wU3RhdGUKLXN0cnVjdCBGYXN0VGhyZWFkRHVtcFN0YXRlIHsKLSAgICBGYXN0VGhyZWFkRHVtcFN0YXRlKCk7Ci0gICAgLyp2aXJ0dWFsKi8gfkZhc3RUaHJlYWREdW1wU3RhdGUoKTsKLQotICAgIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZCBtQ29tbWFuZDsgICAvLyBjdXJyZW50IGNvbW1hbmQKLSAgICB1aW50MzJfdCBtVW5kZXJydW5zOyAgICAgICAgLy8gdG90YWwgbnVtYmVyIG9mIHVuZGVycnVucwotICAgIHVpbnQzMl90IG1PdmVycnVuczsgICAgICAgICAvLyB0b3RhbCBudW1iZXIgb2Ygb3ZlcnJ1bnMKLSAgICBzdHJ1Y3QgdGltZXNwZWMgbU1lYXN1cmVkV2FybXVwVHM7ICAvLyBtZWFzdXJlZCB3YXJtdXAgdGltZQotICAgIHVpbnQzMl90IG1XYXJtdXBDeWNsZXM7ICAgICAvLyBudW1iZXIgb2YgbG9vcCBjeWNsZXMgcmVxdWlyZWQgdG8gd2FybXVwCi0KLSNpZmRlZiBGQVNUX01JWEVSX1NUQVRJU1RJQ1MKLSAgICAvLyBSZWNlbnRseSBjb2xsZWN0ZWQgc2FtcGxlcyBvZiBwZXItY3ljbGUgbW9ub3RvbmljIHRpbWUsIHRocmVhZCBDUFUgdGltZSwgYW5kIENQVSBmcmVxdWVuY3kuCi0gICAgLy8ga1NhbXBsaW5nTiBpcyBtYXggc2l6ZSBvZiBzYW1wbGluZyBmcmFtZSAoc3RhdGlzdGljcyksIGFuZCBtdXN0IGJlIGEgcG93ZXIgb2YgMiA8PSAweDgwMDAuCi0gICAgLy8gVGhlIHNhbXBsZSBhcnJheXMgYXJlIHZpcnR1YWxseSBhbGxvY2F0ZWQgYmFzZWQgb24gdGhpcyBjb21waWxlLXRpbWUgY29uc3RhbnQsCi0gICAgLy8gYnV0IGFyZSBvbmx5IGluaXRpYWxpemVkIGFuZCB1c2VkIGJhc2VkIG9uIHRoZSBydW50aW1lIHBhcmFtZXRlciBtU2FtcGxpbmdOLgotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrU2FtcGxpbmdOID0gMHg4MDAwOwotICAgIC8vIENvcnJlc3BvbmRpbmcgcnVudGltZSBtYXhpbXVtIHNpemUgb2Ygc2FtcGxlIGFycmF5cywgbXVzdCBiZSBhIHBvd2VyIG9mIDIgPD0ga1NhbXBsaW5nTi4KLSAgICB1aW50MzJfdCBtU2FtcGxpbmdOOwotICAgIC8vIFRoZSBib3VuZHMgZGVmaW5lIHRoZSBpbnRlcnZhbCBvZiB2YWxpZCBzYW1wbGVzLCBhbmQgYXJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6Ci0gICAgLy8gICAgICBuZXdlc3Qgb3BlbiAoZXhjbHVkZWQpIGVuZHBvaW50ICAgPSBsb3dlciAxNiBiaXRzIG9mIGJvdW5kcywgbW9kdWxvIE4KLSAgICAvLyAgICAgIG9sZGVzdCBjbG9zZWQgKGluY2x1ZGVkKSBlbmRwb2ludCA9IHVwcGVyIDE2IGJpdHMgb2YgYm91bmRzLCBtb2R1bG8gTgotICAgIC8vIE51bWJlciBvZiB2YWxpZCBzYW1wbGVzIGlzIG5ld2VzdCAtIG9sZGVzdC4KLSAgICB1aW50MzJfdCBtQm91bmRzOyAgICAgICAgICAgICAgICAgICAvLyBib3VuZHMgZm9yIG1Nb25vdG9uaWNOcywgbVRocmVhZENwdU5zLCBhbmQgbUNwdWtIegotICAgIC8vIFRoZSBlbGVtZW50cyBpbiB0aGUgKk5zIGFycmF5cyBhcmUgaW4gdW5pdHMgb2YgbmFub3NlY29uZHMgPD0gMzk5OTk5OTk5OS4KLSAgICB1aW50MzJfdCBtTW9ub3RvbmljTnNba1NhbXBsaW5nTl07ICAvLyBkZWx0YSBtb25vdG9uaWMgKHdhbGwgY2xvY2spIHRpbWUKLSAgICB1aW50MzJfdCBtTG9hZE5zW2tTYW1wbGluZ05dOyAgICAgICAvLyBkZWx0YSBDUFUgbG9hZCBpbiB0aW1lCi0jaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCi0gICAgdWludDMyX3QgbUNwdWtIeltrU2FtcGxpbmdOXTsgICAgICAgLy8gYWJzb2x1dGUgQ1BVIGNsb2NrIGZyZXF1ZW5jeSBpbiBrSHosIGJpdHMgMC0zIGFyZSBDUFUjCi0jZW5kaWYKLSNlbmRpZgotCi19OyAgLy8gc3RydWN0IEZhc3RUaHJlYWREdW1wU3RhdGUKLQogfSAgIC8vIGFuZHJvaWQKIAogI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX0ZBU1RfVEhSRUFEX1NUQVRFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcAppbmRleCA0ZjBjNmIxLi5mNjA3OGEyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCkBAIC0yMDAsMjYgKzIwMCwxNyBAQAogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gbGltaXQgdG8gY29ubmVjdGlvbnMgYmV0d2VlbiBkZXZpY2VzIGFuZCBpbnB1dCBzdHJlYW1zIGZvciBIQUwgYmVmb3JlIDMuMAotICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbaV0uZXh0Lm1peC5od19tb2R1bGUgPT0gc3JjTW9kdWxlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9Id0RldmljZS0+dmVyc2lvbigpIDwgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChwYXRjaC0+c2lua3NbaV0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfTUlYKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGludmFsaWQgc2luayB0eXBlICVkIGZvciBkZXZpY2Ugc291cmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLnR5cGUpOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0gc3JjTW9kdWxlKSB7Ci0gICAgICAgICAgICAgICAgLy8gbGltaXQgdG8gZGV2aWNlIHRvIGRldmljZSBjb25uZWN0aW9uIGlmIG5vdCBvbiBzYW1lIGh3IG1vZHVsZQotICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgaW52YWxpZCBzaW5rIHR5cGUgZm9yIGNyb3NzIGh3IG1vZHVsZSIpOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgbnVtIHNvdXJjZXMgPT0gMiAtPT4gcmV1c2UgYW4gZXhpdGluZyBvdXRwdXQgbWl4IHRvIGNvbm5lY3QgdG8gdGhlCi0gICAgICAgICAgICAgICAgLy8gc2luaworICAgICAgICAgICAgLy8gbWFuYWdlIHBhdGNoZXMgcmVxdWlyaW5nIGEgc29mdHdhcmUgYnJpZGdlCisgICAgICAgICAgICAvLyAtIERldmljZSB0byBkZXZpY2UgQU5ECisgICAgICAgICAgICAvLyAgICAtIHNvdXJjZSBIVyBtb2R1bGUgIT0gZGVzdGluYXRpb24gSFcgbW9kdWxlIE9SCisgICAgICAgICAgICAvLyAgICAtIGF1ZGlvIEhBTCB2ZXJzaW9uIDwgMy4wCisgICAgICAgICAgICAvLyAgICAtIHNwZWNpYWwgcGF0Y2ggcmVxdWVzdCB3aXRoIDIgc291cmNlcyAocmV1c2Ugb25lIGV4aXN0aW5nIG91dHB1dCBtaXgpCisgICAgICAgICAgICBpZiAoKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpICYmCisgICAgICAgICAgICAgICAgICAgICgocGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlICE9IHNyY01vZHVsZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGF1ZGlvSHdEZXZpY2UtPnZlcnNpb24oKSA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHx8CisgICAgICAgICAgICAgICAgICAgIChwYXRjaC0+bnVtX3NvdXJjZXMgPT0gMikpKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA9PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c291cmNlc1sxXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVggfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0KQEAgLTI4Myw1MiArMjc0LDI5IEBACiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChhdWRpb0h3RGV2aWNlLT52ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja1JlY29yZFRocmVhZF9sKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQocGF0Y2gsICZoYWxIYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5jcmVhdGVfYXVkaW9fcGF0Y2goaHdEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFsSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKICAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja1JlY29yZFRocmVhZF9sKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2hhciAqYWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmNtcChwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmFkZHJlc3MsICIiKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5hZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSAoY2hhciAqKWNhbGxvYygxLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHBhdGNoLCAmaGFsSGFuZGxlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9Id0RldmljZS0+dmVyc2lvbigpIDwgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihTdHJpbmc4KGFkZHJlc3MpKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShhZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9ST1VUSU5HKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS50eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9JTlBVVF9TT1VSQ0UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXBhdGNoLT5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBBVURJT19QT1JUX1RZUEVfREVWSUNFIHNldFBhcmFtZXRlcnMgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLnRvU3RyaW5nKCkuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPmNyZWF0ZV9hdWRpb19wYXRjaChod0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm51bV9zb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm51bV9zaW5rcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFsSGFuZGxlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gYnJlYWs7CkBAIC0zNDEsNiArMzA5LDcgQEAKICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBsaW1pdCB0byBjb25uZWN0aW9ucyBiZXR3ZWVuIGRldmljZXMgYW5kIG91dHB1dCBzdHJlYW1zCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IEFVRElPX0RFVklDRV9OT05FOwogICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGludmFsaWQgc2luayB0eXBlICVkIGZvciBtaXggc291cmNlIiwKQEAgLTM1Myw4ICszMjIsOCBAQAogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHlwZSB8PSBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOwogICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmNoZWNrUGxheWJhY2tUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKQEAgLTM2MywyOCArMzMyLDE0IEBACiAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdWRpb0h3RGV2aWNlLT52ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZENyZWF0ZUF1ZGlvUGF0Y2hDb25maWdFdmVudChwYXRjaCwgJmhhbEhhbmRsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZSB8PSBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjaGFyICphZGRyZXNzOwotICAgICAgICAgICAgICAgIGlmIChzdHJjbXAocGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcywgIiIpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy9GSVhNRTogd2Ugb25seSBzdXBwb3J0IGFkZHJlc3Mgb24gZmlyc3Qgc2luayB3aXRoIEhBTCB2ZXJzaW9uIDwgMy4wCi0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UudHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5hZGRyZXNzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gKGNoYXIgKiljYWxsb2MoMSwgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoU3RyaW5nOChhZGRyZXNzKSk7Ci0gICAgICAgICAgICAgICAgZnJlZShhZGRyZXNzKTsKKyAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gYXVkaW9mbGluZ2VyLT5wcmltYXJ5UGxheWJhY2tUaHJlYWRfbCgpKSB7CisgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOwogICAgICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUk9VVElORyksIChpbnQpdHlwZSk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5icm9hY2FzdFBhcmFtZXRlcnNUb1JlY29yZFRocmVhZHNfbChwYXJhbS50b1N0cmluZygpKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHBhdGNoLCAmaGFsSGFuZGxlKTsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKQEAgLTQ3Miw2ICs0MjcsNyBAQAogICAgIC8vIHRoaXMgdHJhY2sgaXMgZ2l2ZW4gdGhlIHNhbWUgYnVmZmVyIGFzIHRoZSBQYXRjaFJlY29yZCBidWZmZXIKICAgICBwYXRjaC0+bVBhdGNoVHJhY2sgPSBuZXcgUGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1BhdGNoLT5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRDaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCkBAIC01MjUsMjIgKzQ4MSwzMSBAQAogICAgIGlmIChwYXRjaC0+bVJlY29yZFRocmVhZCAhPSAwKSB7CiAgICAgICAgIGlmIChwYXRjaC0+bVBhdGNoUmVjb3JkICE9IDApIHsKICAgICAgICAgICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLT5kZWxldGVQYXRjaFJlY29yZChwYXRjaC0+bVBhdGNoUmVjb3JkKTsKLSAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQuY2xlYXIoKTsKICAgICAgICAgfQogICAgICAgICBhdWRpb2ZsaW5nZXItPmNsb3NlSW5wdXRJbnRlcm5hbF9sKHBhdGNoLT5tUmVjb3JkVGhyZWFkKTsKLSAgICAgICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQuY2xlYXIoKTsKICAgICB9CiAgICAgaWYgKHBhdGNoLT5tUGxheWJhY2tUaHJlYWQgIT0gMCkgewogICAgICAgICBpZiAocGF0Y2gtPm1QYXRjaFRyYWNrICE9IDApIHsKICAgICAgICAgICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmRlbGV0ZVBhdGNoVHJhY2socGF0Y2gtPm1QYXRjaFRyYWNrKTsKLSAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hUcmFjay5jbGVhcigpOwogICAgICAgICB9CiAgICAgICAgIC8vIGlmIG51bSBzb3VyY2VzID09IDIgd2UgYXJlIHJldXNpbmcgYW4gZXhpc3RpbmcgcGxheWJhY2sgdGhyZWFkIHNvIHdlIGRvIG5vdCBjbG9zZSBpdAogICAgICAgICBpZiAocGF0Y2gtPm1BdWRpb1BhdGNoLm51bV9zb3VyY2VzICE9IDIpIHsKICAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+Y2xvc2VPdXRwdXRJbnRlcm5hbF9sKHBhdGNoLT5tUGxheWJhY2tUaHJlYWQpOwogICAgICAgICB9CisgICAgfQorICAgIGlmIChwYXRjaC0+bVJlY29yZFRocmVhZCAhPSAwKSB7CisgICAgICAgIGlmIChwYXRjaC0+bVBhdGNoUmVjb3JkICE9IDApIHsKKyAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBwYXRjaC0+bVJlY29yZFRocmVhZC5jbGVhcigpOworICAgIH0KKyAgICBpZiAocGF0Y2gtPm1QbGF5YmFja1RocmVhZCAhPSAwKSB7CisgICAgICAgIGlmIChwYXRjaC0+bVBhdGNoVHJhY2sgIT0gMCkgeworICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFRyYWNrLmNsZWFyKCk7CisgICAgICAgIH0KICAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC5jbGVhcigpOwogICAgIH0KKwogfQogCiAvKiBEaXNjb25uZWN0IGEgcGF0Y2ggKi8KQEAgLTU3OCw0MiArNTQzLDMwIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFICYmCi0gICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPSBzcmNNb2R1bGUpIHsKKyAgICAgICAgICAgIGlmIChyZW1vdmVkUGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSB8fAorICAgICAgICAgICAgICAgICAgICByZW1vdmVkUGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICAgICAgY2xlYXJQYXRjaENvbm5lY3Rpb25zKHJlbW92ZWRQYXRjaCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgIGlmIChhdWRpb0h3RGV2aWNlLT52ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewotICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tSZWNvcmRUaHJlYWRfbCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygicmVsZWFzZUF1ZGlvUGF0Y2goKSBiYWQgY2FwdHVyZSBJL08gaGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHJlbW92ZWRQYXRjaC0+bUhhbEhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPnJlbGVhc2VfYXVkaW9fcGF0Y2goaHdEZXZpY2UsIHJlbW92ZWRQYXRjaC0+bUhhbEhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CiAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja1JlY29yZFRocmVhZF9sKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGJhZCBjYXB0dXJlIEkvTyBoYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07Ci0gICAgICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9ST1VUSU5HKSwgMCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoKCkgQVVESU9fUE9SVF9UWVBFX0RFVklDRSBzZXRQYXJhbWV0ZXJzICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChyZW1vdmVkUGF0Y2gtPm1IYWxIYW5kbGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvSHdEZXZpY2UtPnZlcnNpb24oKSA8IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UgPSBhdWRpb0h3RGV2aWNlLT5od0RldmljZSgpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5yZWxlYXNlX2F1ZGlvX3BhdGNoKGh3RGV2aWNlLCByZW1vdmVkUGF0Y2gtPm1IYWxIYW5kbGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9NSVg6IHsKQEAgLTYzMiwxNCArNTg1LDcgQEAKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgICAgICBpZiAoYXVkaW9Id0RldmljZS0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHJlbW92ZWRQYXRjaC0+bUhhbEhhbmRsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOwotICAgICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUk9VVElORyksIDApOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQocmVtb3ZlZFBhdGNoLT5tSGFsSGFuZGxlKTsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKQEAgLTY5Myw1ICs2MzksNCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAppbmRleCBlZTQ4Mjc2Li43YmM2ZjBjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaApAQCAtMTU2LDEwICsxNTYsNiBAQAogICAgIGJvb2wgICAgICAgICAgICAgICAgbVJlc3VtZVRvU3RvcHBpbmc7IC8vIHRyYWNrIHdhcyBwYXVzZWQgaW4gc3RvcHBpbmcgc3RhdGUuCiAgICAgYm9vbCAgICAgICAgICAgICAgICBtRmx1c2hId1BlbmRpbmc7IC8vIHRyYWNrIHJlcXVlc3RzIGZvciB0aHJlYWQgZmx1c2gKIAotICAgIC8vIGZvciBsYXN0IGNhbGwgdG8gZ2V0VGltZXN0YW1wCi0gICAgYm9vbCAgICAgICAgICAgICAgICBtUHJldmlvdXNWYWxpZDsKLSAgICB1aW50MzJfdCAgICAgICAgICAgIG1QcmV2aW91c0ZyYW1lc1dyaXR0ZW47Ci0gICAgQXVkaW9UaW1lc3RhbXAgICAgICBtUHJldmlvdXNUaW1lc3RhbXA7CiB9OyAgLy8gZW5kIG9mIFRyYWNrCiAKIGNsYXNzIFRpbWVkVHJhY2sgOiBwdWJsaWMgVHJhY2sgewpAQCAtMjU1LDcgKzI1MSw3IEBACiAKICAgICBjbGFzcyBCdWZmZXIgOiBwdWJsaWMgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIGludDE2X3QgKm1CdWZmZXI7CisgICAgICAgIHZvaWQgKm1CdWZmZXI7CiAgICAgfTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0VHJhY2soUGxheWJhY2tUaHJlYWQgKnRocmVhZCwKQEAgLTI3MSw3ICsyNjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyaWdnZXJTZXNzaW9uID0gMCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICBzdG9wKCk7Ci0gICAgICAgICAgICBib29sICAgICAgICB3cml0ZShpbnQxNl90KiBkYXRhLCB1aW50MzJfdCBmcmFtZXMpOworICAgICAgICAgICAgYm9vbCAgICAgICAgd3JpdGUodm9pZCogZGF0YSwgdWludDMyX3QgZnJhbWVzKTsKICAgICAgICAgICAgIGJvb2wgICAgICAgIGJ1ZmZlclF1ZXVlRW1wdHkoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyUXVldWUuc2l6ZSgpID09IDA7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzQWN0aXZlKCkgY29uc3QgeyByZXR1cm4gbUFjdGl2ZTsgfQogICAgIGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQoKSBjb25zdCB7IHJldHVybiBtVGhyZWFkOyB9CkBAIC0yOTcsNiArMjkzLDcgQEAKIHB1YmxpYzoKIAogICAgICAgICAgICAgICAgICAgICAgICAgUGF0Y2hUcmFjayhQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaAppbmRleCAyMDRhOWQ2Li4yNWQ2ZDk1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCkBAIC0zNCw2ICszNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBdWRpb0ZsaW5nZXI6OnRyYWNrX2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrX3R5cGUgdHlwZSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+UmVjb3JkVHJhY2soKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpIGNvbnN0OwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50LCBpbnQgdHJpZ2dlclNlc3Npb24pOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgc3RvcCgpOwpAQCAtNjYsMjEgKzY3LDYgQEAKIAogICAgIGJvb2wgICAgICAgICAgICAgICAgbU92ZXJmbG93OyAgLy8gb3ZlcmZsb3cgb24gbW9zdCByZWNlbnQgYXR0ZW1wdCB0byBmaWxsIGNsaWVudCBidWZmZXIKIAotICAgICAgICAgICAvLyB1cGRhdGVkIGJ5IFJlY29yZFRocmVhZDo6cmVhZElucHV0UGFyYW1ldGVyc19sKCkKLSAgICAgICAgICAgIEF1ZGlvUmVzYW1wbGVyICAgICAgICAgICAgICAgICAgICAgICptUmVzYW1wbGVyOwotCi0gICAgICAgICAgICAvLyBpbnRlcmxlYXZlZCBzdGVyZW8gcGFpcnMgb2YgZml4ZWQtcG9pbnQgUTQuMjcKLSAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptUnNtcE91dEJ1ZmZlcjsKLSAgICAgICAgICAgIC8vIGN1cnJlbnQgYWxsb2NhdGVkIGZyYW1lIGNvdW50IGZvciB0aGUgYWJvdmUsIHdoaWNoIG1heSBiZSBsYXJnZXIgdGhhbiBuZWVkZWQKLSAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wT3V0RnJhbWVDb3VudDsKLQotICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJzbXBJblVucmVsOyAgIC8vIHVucmVsZWFzZWQgZnJhbWVzIHJlbWFpbmluZyBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9zdCByZWNlbnQgZ2V0TmV4dEJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBkZWJ1ZyBvbmx5Ci0KLSAgICAgICAgICAgIC8vIHJvbGxpbmcgY291bnRlciB0aGF0IGlzIG5ldmVyIGNsZWFyZWQKLSAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5Gcm9udDsgICAvLyBuZXh0IGF2YWlsYWJsZSBmcmFtZQotCiAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgbVNpbms7ICAvLyByZWZlcmVuY2VzIGNsaWVudCdzIGJ1ZmZlciBzaW5rIGluIHNoYXJlZCBtZW1vcnkKIAogICAgICAgICAgICAgLy8gc3luYyBldmVudCB0cmlnZ2VyaW5nIGFjdHVhbCBhdWRpbyBjYXB0dXJlLiBGcmFtZXMgcmVhZCBiZWZvcmUgdGhpcyBldmVudCB3aWxsCkBAIC05Myw3ICs3OSwxMCBAQAogICAgICAgICAgICAgc3NpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1RvRHJvcDsKIAogICAgICAgICAgICAgLy8gdXNlZCBieSByZXNhbXBsZXIgdG8gZmluZCBzb3VyY2UgZnJhbWVzCi0gICAgICAgICAgICBSZXNhbXBsZXJCdWZmZXJQcm92aWRlciAqbVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOworICAgICAgICAgICAgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIgICAgICAgICAgICAqbVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOworCisgICAgICAgICAgICAvLyB1c2VkIGJ5IHRoZSByZWNvcmQgdGhyZWFkIHRvIGNvbnZlcnQgZnJhbWVzIHRvIHByb3BlciBkZXN0aW5hdGlvbiBmb3JtYXQKKyAgICAgICAgICAgIFJlY29yZEJ1ZmZlckNvbnZlcnRlciAgICAgICAgICAgICAgKm1SZWNvcmRCdWZmZXJDb252ZXJ0ZXI7CiB9OwogCiAvLyBwbGF5YmFjayB0cmFjaywgdXNlZCBieSBQYXRjaFBhbmVsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKaW5kZXggZmFlMTlhMS4uMmU2OGRhZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcApAQCAtMTQsNjEgKzE0LDExOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGJpbmRlci9BcHBPcHNNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KICNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAKKy8qIFdoZW4gcGVyZm9ybWluZyBwZXJtaXNzaW9uIGNoZWNrcyB3ZSBkbyBub3QgdXNlIHBlcm1pc3Npb24gY2FjaGUgZm9yCisgKiBydW50aW1lIHBlcm1pc3Npb25zIChwcm90ZWN0aW9uIGxldmVsIGRhbmdlcm91cykgYXMgdGhleSBtYXkgY2hhbmdlIGF0CisgKiBydW50aW1lLiBBbGwgb3RoZXIgcGVybWlzc2lvbnMgKHByb3RlY3Rpb24gbGV2ZWwgbm9ybWFsIGFuZCBkYW5nZXJvdXMpCisgKiBjYW4gYmUgY2FjaGVkIGFzIHRoZXkgbmV2ZXIgY2hhbmdlLiBPZiBjb3Vyc2UgYWxsIHBlcm1pc3Npb24gY2hlY2tlZAorICogaGVyZSBhcmUgcGxhdGZvcm0gZGVmaW5lZC4KKyAqLworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIE5vdCB2YWxpZCB1bnRpbCBpbml0aWFsaXplZCBieSBBdWRpb0ZsaW5nZXIgY29uc3RydWN0b3IuICBJdCB3b3VsZCBoYXZlIHRvIGJlCiAvLyByZS1pbml0aWFsaXplZCBpZiB0aGUgcHJvY2VzcyBjb250YWluaW5nIEF1ZGlvRmxpbmdlciBzZXJ2aWNlIGZvcmtzICh3aGljaCBpdCBkb2Vzbid0KS4KIHBpZF90IGdldHBpZF9jYWNoZWQ7CiAKLWJvb2wgcmVjb3JkaW5nQWxsb3dlZCgpIHsKK2Jvb2wgcmVjb3JkaW5nQWxsb3dlZChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSkgeworICAgIC8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIHRoZSBVSUQgZnJvbSB0aGUgY2FsbGluZyBJUEMgdGhyZWFkIHN0YXRlIGJlY2F1c2UgYWxsCisgICAgLy8gY2xpZW50cyB0aGF0IHBlcmZvcm0gcmVjb3JkaW5nIGNyZWF0ZSBBdWRpb1JlY29yZCBpbiB0aGVpciBvd24gcHJvY2Vzc2VzCisgICAgLy8gYW5kIHRoZSBzeXN0ZW0gZG9lcyBub3QgY3JlYXRlIEF1ZGlvUmVjb3JkIG9iamVjdHMgb24gYmVoYWxmIG9mIGFwcHMuIFRoaXMKKyAgICAvLyBkaWZmZXJzIGZyb20gcGxheWJhY2sgd2hlcmUgaW4gc29tZSBzaXR1YXRpb25zIHRoZSBzeXN0ZW0gcmVjcmVhdGVzIEF1ZGlvVHJhY2sKKyAgICAvLyBpbnN0YW5jZXMgYXNzb2NpYXRlZCB3aXRoIGEgY2xpZW50J3MgTWVkaWFQbGF5ZXIgb24gYmVoYWxmIG9mIHRoaXMgY2xpZW50LgorICAgIC8vIEluIHRoZSBsYXR0ZXIgY2FzZSB3ZSBoYXZlIHRvIHN0b3JlIHRoZSBjbGllbnQgVUlEIGFuZCBwYXNzIGluIGFsb25nIGZvcgorICAgIC8vIHNlY3VyaXR5IGNoZWNrcy4KKwogICAgIGlmIChnZXRwaWRfY2FjaGVkID09IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSkgcmV0dXJuIHRydWU7CiAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNSZWNvcmRBdWRpbygiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTyIpOwotICAgIC8vIGRvbid0IHVzZSBQZXJtaXNzaW9uQ2FjaGU7IHRoaXMgaXMgbm90IGEgc3lzdGVtIHBlcm1pc3Npb24KLSAgICBib29sIG9rID0gY2hlY2tDYWxsaW5nUGVybWlzc2lvbihzUmVjb3JkQXVkaW8pOwotICAgIGlmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5SRUNPUkRfQVVESU8iKTsKLSAgICByZXR1cm4gb2s7CisKKyAgICAvLyBJTVBPUlRBTlQ6IERvbid0IHVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IGNoYW5nZS4KKyAgICBjb25zdCBib29sIG9rID0gY2hlY2tDYWxsaW5nUGVybWlzc2lvbihzUmVjb3JkQXVkaW8pOworICAgIGlmICghb2spIHsKKyAgICAgICAgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3QgdWlkX3QgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworCisgICAgLy8gVG8gcGVybWl0IGNvbW1hbmQtbGluZSBuYXRpdmUgdGVzdHMKKyAgICBpZiAodWlkID09IEFJRF9ST09UKSByZXR1cm4gdHJ1ZTsKKworICAgIFN0cmluZzE2IGNoZWNrZWRPcFBhY2thZ2VOYW1lID0gb3BQYWNrYWdlTmFtZTsKKworICAgIC8vIEluIHNvbWUgY2FzZXMgdGhlIGNhbGxpbmcgY29kZSBoYXMgbm8gYWNjZXNzIHRvIHRoZSBwYWNrYWdlIGl0IHJ1bnMgdW5kZXIuCisgICAgLy8gRm9yIGV4YW1wbGUsIGNvZGUgdXNpbmcgdGhlIHdpbGhlbG0gZnJhbWV3b3JrJ3MgT3BlblNMLUVTIEFQSXMuIEluIHRoaXMKKyAgICAvLyBjYXNlIHdlIHdpbGwgZ2V0IHRoZSBwYWNrYWdlcyBmb3IgdGhlIGNhbGxpbmcgVUlEIGFuZCBwaWNrIHRoZSBmaXJzdCBvbmUKKyAgICAvLyBmb3IgYXR0cmlidXRpbmcgdGhlIGFwcCBvcC4gVGhpcyB3aWxsIHdvcmsgY29ycmVjdGx5IGZvciBydW50aW1lIHBlcm1pc3Npb25zCisgICAgLy8gYXMgZm9yIGxlZ2FjeSBhcHBzIHdlIHdpbGwgdG9nZ2xlIHRoZSBhcHAgb3AgZm9yIGFsbCBwYWNrYWdlcyBpbiB0aGUgVUlELgorICAgIC8vIFRoZSBjYXZlYXQgaXMgdGhhdCB0aGUgb3BlcmF0aW9uIG1heSBiZSBhdHRyaWJ1dGVkIHRvIHRoZSB3cm9uZyBwYWNrYWdlIGFuZAorICAgIC8vIHN0YXRzIGJhc2VkIG9uIGFwcCBvcHMgbWF5IGJlIHNsaWdodGx5IG9mZi4KKyAgICBpZiAoY2hlY2tlZE9wUGFja2FnZU5hbWUuc2l6ZSgpIDw9IDApIHsKKyAgICAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigicGVybWlzc2lvbiIpKTsKKyAgICAgICAgaWYgKGJpbmRlciA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGdldCBwZXJtaXNzaW9uIHNlcnZpY2UiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPElQZXJtaXNzaW9uQ29udHJvbGxlcj4gcGVybUN0cmwgPSBpbnRlcmZhY2VfY2FzdDxJUGVybWlzc2lvbkNvbnRyb2xsZXI+KGJpbmRlcik7CisgICAgICAgIFZlY3RvcjxTdHJpbmcxNj4gcGFja2FnZXM7CisKKyAgICAgICAgcGVybUN0cmwtPmdldFBhY2thZ2VzRm9yVWlkKHVpZCwgcGFja2FnZXMpOworCisgICAgICAgIGlmIChwYWNrYWdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJObyBwYWNrYWdlcyBmb3IgY2FsbGluZyBVSUQiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBjaGVja2VkT3BQYWNrYWdlTmFtZSA9IHBhY2thZ2VzWzBdOworICAgIH0KKworICAgIEFwcE9wc01hbmFnZXIgYXBwT3BzOworICAgIGlmIChhcHBPcHMubm90ZU9wKEFwcE9wc01hbmFnZXI6Ok9QX1JFQ09SRF9BVURJTywgdWlkLCBjaGVja2VkT3BQYWNrYWdlTmFtZSkKKyAgICAgICAgICAgICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgeworICAgICAgICBBTE9HRSgiUmVxdWVzdCBkZW5pZWQgYnkgYXBwIG9wIE9QX1JFQ09SRF9BVURJTyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZCgpIHsKICAgICBpZiAoZ2V0cGlkX2NhY2hlZCA9PSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpIHJldHVybiB0cnVlOwogICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FwdHVyZUF1ZGlvT3V0cHV0KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19PVVRQVVQiKTsKLSAgICAvLyBkb24ndCB1c2UgUGVybWlzc2lvbkNhY2hlOyB0aGlzIGlzIG5vdCBhIHN5c3RlbSBwZXJtaXNzaW9uCi0gICAgYm9vbCBvayA9IGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0NhcHR1cmVBdWRpb091dHB1dCk7CisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNDYXB0dXJlQXVkaW9PdXRwdXQpOwogICAgIGlmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX09VVFBVVCIpOwogICAgIHJldHVybiBvazsKIH0KIAogYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQoKSB7CiAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNDYXB0dXJlSG90d29yZEFsbG93ZWQoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkQiKTsKLSAgICBib29sIG9rID0gY2hlY2tDYWxsaW5nUGVybWlzc2lvbihzQ2FwdHVyZUhvdHdvcmRBbGxvd2VkKTsKKyAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgorICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0NhcHR1cmVIb3R3b3JkQWxsb3dlZCk7CiAgICAgaWYgKCFvaykgQUxPR0UoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkQiKTsKICAgICByZXR1cm4gb2s7CiB9CiAKLWJvb2wgY2FwdHVyZUZtVHVuZXJBbGxvd2VkKCkgewotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FwdHVyZUZtVHVuZXJBbGxvd2VkKCJhbmRyb2lkLnBlcm1pc3Npb24uQUNDRVNTX0ZNX1JBRElPIik7Ci0gICAgYm9vbCBvayA9IGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0NhcHR1cmVGbVR1bmVyQWxsb3dlZCk7Ci0gICAgaWYgKCFvaykgQUxPR0UoImFuZHJvaWQucGVybWlzc2lvbi5BQ0NFU1NfRk1fUkFESU8iKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KIGJvb2wgc2V0dGluZ3NBbGxvd2VkKCkgewogICAgIGlmIChnZXRwaWRfY2FjaGVkID09IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSkgcmV0dXJuIHRydWU7CiAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNBdWRpb1NldHRpbmdzKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1NFVFRJTkdTIik7Ci0gICAgLy8gZG9uJ3QgdXNlIFBlcm1pc3Npb25DYWNoZTsgdGhpcyBpcyBub3QgYSBzeXN0ZW0gcGVybWlzc2lvbgotICAgIGJvb2wgb2sgPSBjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNBdWRpb1NldHRpbmdzKTsKKyAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgorICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0F1ZGlvU2V0dGluZ3MpOwogICAgIGlmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fU0VUVElOR1MiKTsKICAgICByZXR1cm4gb2s7CiB9CiAKIGJvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpIHsKICAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fUk9VVElORyIpOwotICAgIGJvb2wgb2sgPSBjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNNb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKTsKKyAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgorICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc01vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQpOwogICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1JPVVRJTkciKTsKICAgICByZXR1cm4gb2s7CiB9CkBAIC03Niw3ICsxMzQsNyBAQAogYm9vbCBkdW1wQWxsb3dlZCgpIHsKICAgICAvLyBkb24ndCBvcHRpbWl6ZSBmb3Igc2FtZSBwaWQsIHNpbmNlIG1lZGlhc2VydmVyIG5ldmVyIGR1bXBzIGl0c2VsZgogICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzRHVtcCgiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKTsKLSAgICAvLyBPSyB0byB1c2UgUGVybWlzc2lvbkNhY2hlOyB0aGlzIGlzIGEgc3lzdGVtIHBlcm1pc3Npb24KKyAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgogICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0R1bXApOwogICAgIC8vIGNvbnZlbnRpb24gaXMgZm9yIGNhbGxlciB0byBkdW1wIGFuIGVycm9yIG1lc3NhZ2UgdG8gZmQgaW5zdGVhZCBvZiBsb2dnaW5nIGhlcmUKICAgICAvL2lmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaAppbmRleCBjZTE4YTkwLi5mYmE2ZGNlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmgKQEAgLTIwLDEyICsyMCwxMCBAQAogCiBleHRlcm4gcGlkX3QgZ2V0cGlkX2NhY2hlZDsKIAotYm9vbCByZWNvcmRpbmdBbGxvd2VkKCk7Citib29sIHJlY29yZGluZ0FsbG93ZWQoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOwogYm9vbCBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKCk7CiBib29sIGNhcHR1cmVIb3R3b3JkQWxsb3dlZCgpOwotYm9vbCBjYXB0dXJlRm1UdW5lckFsbG93ZWQoKTsKIGJvb2wgc2V0dGluZ3NBbGxvd2VkKCk7CiBib29sIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKTsKIGJvb2wgZHVtcEFsbG93ZWQoKTsKLQogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NwZGlmU3RyZWFtT3V0LmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TcGRpZlN0cmVhbU91dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA0YTA2OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TcGRpZlN0cmVhbU91dC5jcHAKQEAgLTAsMCArMSwxMjggQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTUsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9GbGluZ2VyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9zcGRpZi9TUERJRkVuY29kZXIuaD4KKworI2luY2x1ZGUgIkF1ZGlvSHdEZXZpY2UuaCIKKyNpbmNsdWRlICJBdWRpb1N0cmVhbU91dC5oIgorI2luY2x1ZGUgIlNwZGlmU3RyZWFtT3V0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBJZiB0aGUgQXVkaW9GbGluZ2VyIGlzIHByb2Nlc3NpbmcgZW5jb2RlZCBkYXRhIGFuZCB0aGUgSEFMIGV4cGVjdHMKKyAqIFBDTSB0aGVuIHdlIG5lZWQgdG8gd3JhcCB0aGUgZGF0YSBpbiBhbiBTUERJRiB3cmFwcGVyLgorICovCitTcGRpZlN0cmVhbU91dDo6U3BkaWZTdHJlYW1PdXQoQXVkaW9Id0RldmljZSAqZGV2LAorICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpCisgICAgICAgIC8vIFRlbGwgdGhlIEhBTCB0aGF0IHRoZSBkYXRhIHdpbGwgYmUgY29tcHJlc3NlZCBhdWRpbyB3cmFwcGVkIGluIGEgZGF0YSBidXJzdC4KKyAgICAgICAgOiBBdWRpb1N0cmVhbU91dChkZXYsIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfSUVDOTU4X05PTkFVRElPKSkKKyAgICAgICAgLCBtU3BkaWZFbmNvZGVyKHRoaXMsIGZvcm1hdCkKKyAgICAgICAgLCBtQXBwbGljYXRpb25Gb3JtYXQoQVVESU9fRk9STUFUX0RFRkFVTFQpCisgICAgICAgICwgbUFwcGxpY2F0aW9uU2FtcGxlUmF0ZSgwKQorICAgICAgICAsIG1BcHBsaWNhdGlvbkNoYW5uZWxNYXNrKDApCit7Cit9CisKK3N0YXR1c190IFNwZGlmU3RyZWFtT3V0OjpvcGVuKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzKQoreworICAgIHN0cnVjdCBhdWRpb19jb25maWcgY3VzdG9tQ29uZmlnID0gKmNvbmZpZzsKKworICAgIG1BcHBsaWNhdGlvbkZvcm1hdCA9IGNvbmZpZy0+Zm9ybWF0OworICAgIG1BcHBsaWNhdGlvblNhbXBsZVJhdGUgPSBjb25maWctPnNhbXBsZV9yYXRlOworICAgIG1BcHBsaWNhdGlvbkNoYW5uZWxNYXNrID0gY29uZmlnLT5jaGFubmVsX21hc2s7CisKKyAgICAvLyBTb21lIGRhdGEgYnVyc3RzIHJ1biBhdCBhIGhpZ2hlciBzYW1wbGUgcmF0ZS4KKyAgICAvLyBUT0RPIE1vdmUgdGhpcyBpbnRvIHRoZSBhdWRpb191dGlscyBhcyBhIHN0YXRpYyBtZXRob2QuCisgICAgc3dpdGNoKGNvbmZpZy0+Zm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0VfQUMzOgorICAgICAgICAgICAgbVJhdGVNdWx0aXBsaWVyID0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9BQzM6CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUUzoKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRFRTX0hEOgorICAgICAgICAgICAgbVJhdGVNdWx0aXBsaWVyID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIkVSUk9SIFNwZGlmU3RyZWFtT3V0OjpvcGVuKCkgdW5yZWNvZ25pemVkIGZvcm1hdCAweCUwOFhcbiIsCisgICAgICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgY3VzdG9tQ29uZmlnLnNhbXBsZV9yYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZSAqIG1SYXRlTXVsdGlwbGllcjsKKworICAgIGN1c3RvbUNvbmZpZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBjdXN0b21Db25maWcuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworCisgICAgLy8gQWx3YXlzIHByaW50IHRoaXMgYmVjYXVzZSBvdGhlcndpc2UgaXQgY291bGQgYmUgdmVyeSBjb25mdXNpbmcgaWYgdGhlCisgICAgLy8gSEFMIGFuZCBBdWRpb0ZsaW5nZXIgYXJlIHVzaW5nIGRpZmZlcmVudCBmb3JtYXRzLgorICAgIC8vIFByaW50IGJlZm9yZSBvcGVuKCkgYmVjYXVzZSBIQUwgbWF5IG1vZGlmeSBjdXN0b21Db25maWcuCisgICAgQUxPR0koIlNwZGlmU3RyZWFtT3V0OjpvcGVuKCkgQXVkaW9GbGluZ2VyIHJlcXVlc3RlZCIKKyAgICAgICAgICAgICIgc2FtcGxlUmF0ZSAlZCwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4IiwKKyAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICBjb25maWctPmZvcm1hdCwKKyAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKKyAgICBBTE9HSSgiU3BkaWZTdHJlYW1PdXQ6Om9wZW4oKSBIQUwgY29uZmlndXJlZCBmb3IiCisgICAgICAgICAgICAiIHNhbXBsZVJhdGUgJWQsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCIsCisgICAgICAgICAgICBjdXN0b21Db25maWcuc2FtcGxlX3JhdGUsCisgICAgICAgICAgICBjdXN0b21Db25maWcuZm9ybWF0LAorICAgICAgICAgICAgY3VzdG9tQ29uZmlnLmNoYW5uZWxfbWFzayk7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBBdWRpb1N0cmVhbU91dDo6b3BlbigKKyAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgIGRldmljZXMsCisgICAgICAgICAgICAmY3VzdG9tQ29uZmlnLAorICAgICAgICAgICAgYWRkcmVzcyk7CisKKyAgICBBTE9HSSgiU3BkaWZTdHJlYW1PdXQ6Om9wZW4oKSBzdGF0dXMgPSAlZCIsIHN0YXR1cyk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitpbnQgU3BkaWZTdHJlYW1PdXQ6OmZsdXNoKCkKK3sKKyAgICBtU3BkaWZFbmNvZGVyLnJlc2V0KCk7CisgICAgcmV0dXJuIEF1ZGlvU3RyZWFtT3V0OjpmbHVzaCgpOworfQorCitpbnQgU3BkaWZTdHJlYW1PdXQ6OnN0YW5kYnkoKQoreworICAgIG1TcGRpZkVuY29kZXIucmVzZXQoKTsKKyAgICByZXR1cm4gQXVkaW9TdHJlYW1PdXQ6OnN0YW5kYnkoKTsKK30KKworc3NpemVfdCBTcGRpZlN0cmVhbU91dDo6d3JpdGVEYXRhQnVyc3QoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgYnl0ZXMpCit7CisgICAgcmV0dXJuIEF1ZGlvU3RyZWFtT3V0Ojp3cml0ZShidWZmZXIsIGJ5dGVzKTsKK30KKworc3NpemVfdCBTcGRpZlN0cmVhbU91dDo6d3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3QgbnVtQnl0ZXMpCit7CisgICAgLy8gV3JpdGUgdG8gU1BESUYgd3JhcHBlci4gSXQgd2lsbCBjYWxsIGJhY2sgdG8gd3JpdGVEYXRhQnVyc3QoKS4KKyAgICByZXR1cm4gbVNwZGlmRW5jb2Rlci53cml0ZShidWZmZXIsIG51bUJ5dGVzKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NwZGlmU3RyZWFtT3V0LmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3BkaWZTdHJlYW1PdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODcwMjUwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NwZGlmU3RyZWFtT3V0LmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTUsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpZm5kZWYgQU5EUk9JRF9TUERJRl9TVFJFQU1fT1VUX0gKKyNkZWZpbmUgQU5EUk9JRF9TUERJRl9TVFJFQU1fT1VUX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJBdWRpb0h3RGV2aWNlLmgiCisjaW5jbHVkZSAiQXVkaW9TdHJlYW1PdXQuaCIKKyNpbmNsdWRlICJTcGRpZlN0cmVhbU91dC5oIgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc3BkaWYvU1BESUZFbmNvZGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBTdHJlYW0gdGhhdCBpcyBhIFBDTSBkYXRhIGJ1cnN0IGluIHRoZSBIQUwgYnV0IGxvb2tzIGxpa2UgYW4gZW5jb2RlZCBzdHJlYW0KKyAqIHRvIHRoZSBBdWRpb0ZsaW5nZXIuIFdyYXBzIGVuY29kZWQgZGF0YSBpbiBhbiBTUERJRiB3cmFwcGVyIHBlciBJRUM2MTk3My0zLgorICovCitjbGFzcyBTcGRpZlN0cmVhbU91dCA6IHB1YmxpYyBBdWRpb1N0cmVhbU91dCB7CitwdWJsaWM6CisKKyAgICBTcGRpZlN0cmVhbU91dChBdWRpb0h3RGV2aWNlICpkZXYsIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKKworICAgIHZpcnR1YWwgflNwZGlmU3RyZWFtT3V0KCkgeyB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW4oCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MpOworCisgICAgLyoqCisgICAgKiBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB3cml0dGVuLCBvciBhCisgICAgKiBuZWdhdGl2ZSBzdGF0dXNfdC4gSWYgYXQgbGVhc3Qgb25lIGZyYW1lIHdhcyB3cml0dGVuIHN1Y2Nlc3NmdWxseSBwcmlvciB0byB0aGUgZXJyb3IsCisgICAgKiBpdCBpcyBzdWdnZXN0ZWQgdGhhdCB0aGUgZHJpdmVyIHJldHVybiB0aGF0IHN1Y2Nlc3NmdWwgKHNob3J0KSBieXRlIGNvdW50CisgICAgKiBhbmQgdGhlbiByZXR1cm4gYW4gZXJyb3IgaW4gdGhlIHN1YnNlcXVlbnQgY2FsbC4KKyAgICAqCisgICAgKiBJZiBzZXRfY2FsbGJhY2soKSBoYXMgcHJldmlvdXNseSBiZWVuIGNhbGxlZCB0byBlbmFibGUgbm9uLWJsb2NraW5nIG1vZGUKKyAgICAqIHRoZSB3cml0ZSgpIGlzIG5vdCBhbGxvd2VkIHRvIGJsb2NrLiBJdCBtdXN0IHdyaXRlIG9ubHkgdGhlIG51bWJlciBvZgorICAgICogYnl0ZXMgdGhhdCBjdXJyZW50bHkgZml0IGluIHRoZSBkcml2ZXIvaGFyZHdhcmUgYnVmZmVyIGFuZCB0aGVuIHJldHVybgorICAgICogdGhpcyBieXRlIGNvdW50LiBJZiB0aGlzIGlzIGxlc3MgdGhhbiB0aGUgcmVxdWVzdGVkIHdyaXRlIHNpemUgdGhlCisgICAgKiBjYWxsYmFjayBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuIG1vcmUgc3BhY2UgaXMgYXZhaWxhYmxlIGluIHRoZQorICAgICogZHJpdmVyL2hhcmR3YXJlIGJ1ZmZlci4KKyAgICAqLworICAgIHZpcnR1YWwgc3NpemVfdCB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBieXRlcyk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGZyYW1lIHNpemUgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgQXVkaW9GbGluZ2VyLgorICAgICAqLworICAgIHZpcnR1YWwgc2l6ZV90IGdldEZyYW1lU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVvZihpbnQ4X3QpOyB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGZvcm1hdCBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBBdWRpb0ZsaW5nZXIuCisgICAgICovCisgICAgdmlydHVhbCBhdWRpb19mb3JtYXRfdCBnZXRGb3JtYXQoKSBjb25zdCB7IHJldHVybiBtQXBwbGljYXRpb25Gb3JtYXQ7IH0KKworICAgIC8qKgorICAgICAqIFRoZSBIQUwgbWF5IGJlIHJ1bm5pbmcgYXQgYSBoaWdoZXIgc2FtcGxlIHJhdGUgaWYsIGZvciBleGFtcGxlLCBwbGF5aW5nIHdyYXBwZWQgRUFDMy4KKyAgICAgKiBAcmV0dXJuIHNhbXBsZSByYXRlIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIEF1ZGlvRmxpbmdlci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtQXBwbGljYXRpb25TYW1wbGVSYXRlOyB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgSEFMIGlzIGluIHN0ZXJlbyBtb2RlIHdoZW4gcGxheWluZyBtdWx0aS1jaGFubmVsIGNvbXByZXNzZWQgYXVkaW8gb3ZlciBIRE1JLgorICAgICAqIEByZXR1cm4gY2hhbm5lbCBtYXNrIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIEF1ZGlvRmxpbmdlci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGF1ZGlvX2NoYW5uZWxfbWFza190IGdldENoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gbUFwcGxpY2F0aW9uQ2hhbm5lbE1hc2s7IH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKKworcHJpdmF0ZToKKworICAgIGNsYXNzIE15U1BESUZFbmNvZGVyIDogcHVibGljIFNQRElGRW5jb2RlcgorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIE15U1BESUZFbmNvZGVyKFNwZGlmU3RyZWFtT3V0ICpzcGRpZlN0cmVhbU91dCwgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQorICAgICAgICAgIDogIFNQRElGRW5jb2Rlcihmb3JtYXQpCisgICAgICAgICAgLCBtU3BkaWZTdHJlYW1PdXQoc3BkaWZTdHJlYW1PdXQpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgc3NpemVfdCB3cml0ZU91dHB1dChjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBieXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1TcGRpZlN0cmVhbU91dC0+d3JpdGVEYXRhQnVyc3QoYnVmZmVyLCBieXRlcyk7CisgICAgICAgIH0KKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIFNwZGlmU3RyZWFtT3V0ICogY29uc3QgbVNwZGlmU3RyZWFtT3V0OworICAgIH07CisKKyAgICBNeVNQRElGRW5jb2RlciAgICAgICBtU3BkaWZFbmNvZGVyOworICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgIG1BcHBsaWNhdGlvbkZvcm1hdDsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICBtQXBwbGljYXRpb25TYW1wbGVSYXRlOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1BcHBsaWNhdGlvbkNoYW5uZWxNYXNrOworCisgICAgc3NpemVfdCAgd3JpdGVEYXRhQnVyc3QoY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IGJ5dGVzKTsKKyAgICBzc2l6ZV90ICB3cml0ZUludGVybmFsKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IGJ5dGVzKTsKKworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9TUERJRl9TVFJFQU1fT1VUX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcAppbmRleCA5NjhiMGY5Li4yNDZmNmJhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCkBAIC0yMyw3ICsyMyw5IEBACiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgpAQCAtNTQsNiArNTYsNyBAQAogCiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCiAjaW5jbHVkZSAiQXVkaW9NaXhlci5oIgorI2luY2x1ZGUgIkJ1ZmZlclByb3ZpZGVycy5oIgogI2luY2x1ZGUgIkZhc3RNaXhlci5oIgogI2luY2x1ZGUgIkZhc3RDYXB0dXJlLmgiCiAjaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgpAQCAtODQsNyArODcsMTcgQEAKICNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQogI2VuZGlmCiAKKy8vIFRPRE86IE1vdmUgdGhlc2UgbWFjcm8vaW5saW5lcyB0byBhIGhlYWRlciBmaWxlLgogI2RlZmluZSBtYXgoYSwgYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIGlubGluZSBUIG1pbihjb25zdCBUJiBhLCBjb25zdCBUJiBiKQoreworICAgIHJldHVybiBhIDwgYiA/IGEgOiBiOworfQorCisjaWZuZGVmIEFSUkFZX1NJWkUKKyNkZWZpbmUgQVJSQVlfU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKGFbMF0pKQorI2VuZGlmCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMTEyLDEwICsxMjUsMTUgQEAKIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4VGhyZWFkU2xlZXBUaW1lU2hpZnQgPSAyOwogCiAvLyBtaW5pbXVtIG5vcm1hbCBzaW5rIGJ1ZmZlciBzaXplLCBleHByZXNzZWQgaW4gbWlsbGlzZWNvbmRzIHJhdGhlciB0aGFuIGZyYW1lcworLy8gRklYTUUgVGhpcyBzaG91bGQgYmUgYmFzZWQgb24gZXhwZXJpbWVudGFsbHkgb2JzZXJ2ZWQgc2NoZWR1bGluZyBqaXR0ZXIKIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWluTm9ybWFsU2lua0J1ZmZlclNpemVNcyA9IDIwOwogLy8gbWF4aW11bSBub3JtYWwgc2luayBidWZmZXIgc2l6ZQogc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXhOb3JtYWxTaW5rQnVmZmVyU2l6ZU1zID0gMjQ7CiAKKy8vIG1pbmltdW0gY2FwdHVyZSBidWZmZXIgc2l6ZSBpbiBtaWxsaXNlY29uZHMgdG8gX25vdF8gbmVlZCBhIGZhc3QgY2FwdHVyZSB0aHJlYWQKKy8vIEZJWE1FIFRoaXMgc2hvdWxkIGJlIGJhc2VkIG9uIGV4cGVyaW1lbnRhbGx5IG9ic2VydmVkIHNjaGVkdWxpbmcgaml0dGVyCitzdGF0aWMgY29uc3QgdWludDMyX3Qga01pbk5vcm1hbENhcHR1cmVCdWZmZXJTaXplTXMgPSAxMjsKKwogLy8gT2ZmbG9hZGVkIG91dHB1dCB0aHJlYWQgc3RhbmRieSBkZWxheTogYWxsb3dzIHRyYWNrIHRyYW5zaXRpb24gd2l0aG91dCBnb2luZyB0byBzdGFuZGJ5CiBzdGF0aWMgY29uc3QgbnNlY3NfdCBrT2ZmbG9hZFN0YW5kYnlEZWxheU5zID0gc2Vjb25kcygxKTsKIApAQCAtMzE0LDggKzMzMiwyMDMgQEAKIC8vICAgICAgVGhyZWFkQmFzZQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCisvLyBzdGF0aWMKK2NvbnN0IGNoYXIgKkF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6dGhyZWFkVHlwZVRvU3RyaW5nKEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6dHlwZV90IHR5cGUpCit7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBNSVhFUjoKKyAgICAgICAgcmV0dXJuICJNSVhFUiI7CisgICAgY2FzZSBESVJFQ1Q6CisgICAgICAgIHJldHVybiAiRElSRUNUIjsKKyAgICBjYXNlIERVUExJQ0FUSU5HOgorICAgICAgICByZXR1cm4gIkRVUExJQ0FUSU5HIjsKKyAgICBjYXNlIFJFQ09SRDoKKyAgICAgICAgcmV0dXJuICJSRUNPUkQiOworICAgIGNhc2UgT0ZGTE9BRDoKKyAgICAgICAgcmV0dXJuICJPRkZMT0FEIjsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gInVua25vd24iOworICAgIH0KK30KKworU3RyaW5nOCBkZXZpY2VzVG9TdHJpbmcoYXVkaW9fZGV2aWNlc190IGRldmljZXMpCit7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCBtYXBwaW5nIHsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2VzOworICAgICAgICBjb25zdCBjaGFyICogICAgbVN0cmluZzsKKyAgICB9IG1hcHBpbmdzT3V0W10gPSB7CisgICAgICAgIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0UsICAgICAgICAgICJFQVJQSUVDRSIsCisgICAgICAgIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUiwgICAgICAgICAgICJTUEVBS0VSIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VULCAgICAgIldJUkVEX0hFQURTRVQiLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSwgICAiV0lSRURfSEVBRFBIT05FIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPLCAgICAgIkJMVUVUT09USF9TQ08iLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVCwgICAgICJCTFVFVE9PVEhfU0NPX0hFQURTRVQiLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lULCAgICAgICJCTFVFVE9PVEhfU0NPX0NBUktJVCIsCisgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAsICAgICAgICAgICAgIkJMVUVUT09USF9BMkRQIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTLCAiQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyIsCisgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiwgICAgIkJMVUVUT09USF9BMkRQX1NQRUFLRVIiLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMLCAgICAgICAiQVVYX0RJR0lUQUwiLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0hETUksICAgICAgICAgICAgICAiSERNSSIsCisgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQsICJBTkxHX0RPQ0tfSEVBRFNFVCIsCisgICAgICAgIEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQsICJER1RMX0RPQ0tfSEVBRFNFVCIsCisgICAgICAgIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWSwgICAgICJVU0JfQUNDRVNTT1JZIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFLCAgICAgICAgIlVTQl9ERVZJQ0UiLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCwgICAgICAiVEVMRVBIT05ZX1RYIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9MSU5FLCAgICAgICAgICAgICAgIkxJTkUiLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDLCAgICAgICAgICAiSERNSV9BUkMiLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1NQRElGLCAgICAgICAgICAgICAiU1BESUYiLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0ZNLCAgICAgICAgICAgICAgICAiRk0iLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FLCAgICAgICAgICAiQVVYX0xJTkUiLAorICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSwgICAgICAiU1BFQUtFUl9TQUZFIiwKKyAgICAgICAgQVVESU9fREVWSUNFX09VVF9JUCwgICAgICAgICAgICAgICAgIklQIiwKKyAgICAgICAgQVVESU9fREVWSUNFX05PTkUsICAgICAgICAgICAgICAgICAgIk5PTkUiLCAgICAgICAgIC8vIG11c3QgYmUgbGFzdAorICAgIH0sIG1hcHBpbmdzSW5bXSA9IHsKKyAgICAgICAgQVVESU9fREVWSUNFX0lOX0NPTU1VTklDQVRJT04sICAgICAgIkNPTU1VTklDQVRJT04iLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fQU1CSUVOVCwgICAgICAgICAgICAiQU1CSUVOVCIsCisgICAgICAgIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQywgICAgICAgICJCVUlMVElOX01JQyIsCisgICAgICAgIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQsICAiQkxVRVRPT1RIX1NDT19IRUFEU0VUIiwKKyAgICAgICAgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQsICAgICAgIldJUkVEX0hFQURTRVQiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fQVVYX0RJR0lUQUwsICAgICAgICAiQVVYX0RJR0lUQUwiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCwgICAgICAgICAiVk9JQ0VfQ0FMTCIsCisgICAgICAgIEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgsICAgICAgICJURUxFUEhPTllfUlgiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMsICAgICAgICAgICAiQkFDS19NSUMiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwgICAgICAiUkVNT1RFX1NVQk1JWCIsCisgICAgICAgIEFVRElPX0RFVklDRV9JTl9BTkxHX0RPQ0tfSEVBRFNFVCwgICJBTkxHX0RPQ0tfSEVBRFNFVCIsCisgICAgICAgIEFVRElPX0RFVklDRV9JTl9ER1RMX0RPQ0tfSEVBRFNFVCwgICJER1RMX0RPQ0tfSEVBRFNFVCIsCisgICAgICAgIEFVRElPX0RFVklDRV9JTl9VU0JfQUNDRVNTT1JZLCAgICAgICJVU0JfQUNDRVNTT1JZIiwKKyAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UsICAgICAgICAgIlVTQl9ERVZJQ0UiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIsICAgICAgICAgICAiRk1fVFVORVIiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fVFZfVFVORVIsICAgICAgICAgICAiVFZfVFVORVIiLAorICAgICAgICBBVURJT19ERVZJQ0VfSU5fTElORSwgICAgICAgICAgICAgICAiTElORSIsCisgICAgICAgIEFVRElPX0RFVklDRV9JTl9TUERJRiwgICAgICAgICAgICAgICJTUERJRiIsCisgICAgICAgIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCwgICAgICJCTFVFVE9PVEhfQTJEUCIsCisgICAgICAgIEFVRElPX0RFVklDRV9JTl9MT09QQkFDSywgICAgICAgICAgICJMT09QQkFDSyIsCisgICAgICAgIEFVRElPX0RFVklDRV9JTl9JUCwgICAgICAgICAgICAgICAgICJJUCIsCisgICAgICAgIEFVRElPX0RFVklDRV9OT05FLCAgICAgICAgICAgICAgICAgICJOT05FIiwgICAgICAgICAvLyBtdXN0IGJlIGxhc3QKKyAgICB9OworICAgIFN0cmluZzggcmVzdWx0OworICAgIGF1ZGlvX2RldmljZXNfdCBhbGxEZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgY29uc3QgbWFwcGluZyAqZW50cnk7CisgICAgaWYgKGRldmljZXMgJiBBVURJT19ERVZJQ0VfQklUX0lOKSB7CisgICAgICAgIGRldmljZXMgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgICAgIGVudHJ5ID0gbWFwcGluZ3NJbjsKKyAgICB9IGVsc2UgeworICAgICAgICBlbnRyeSA9IG1hcHBpbmdzT3V0OworICAgIH0KKyAgICBmb3IgKCA7IGVudHJ5LT5tRGV2aWNlcyAhPSBBVURJT19ERVZJQ0VfTk9ORTsgZW50cnkrKykgeworICAgICAgICBhbGxEZXZpY2VzID0gKGF1ZGlvX2RldmljZXNfdCkgKGFsbERldmljZXMgfCBlbnRyeS0+bURldmljZXMpOworICAgICAgICBpZiAoZGV2aWNlcyAmIGVudHJ5LT5tRGV2aWNlcykgeworICAgICAgICAgICAgaWYgKCFyZXN1bHQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgifCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChlbnRyeS0+bVN0cmluZyk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGRldmljZXMgJiB+YWxsRGV2aWNlcykgeworICAgICAgICBpZiAoIXJlc3VsdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoInwiKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIweCVYIiwgZGV2aWNlcyAmIH5hbGxEZXZpY2VzKTsKKyAgICB9CisgICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChlbnRyeS0+bVN0cmluZyk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1N0cmluZzggaW5wdXRGbGFnc1RvU3RyaW5nKGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCit7CisgICAgc3RhdGljIGNvbnN0IHN0cnVjdCBtYXBwaW5nIHsKKyAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCAgICAgbUZsYWc7CisgICAgICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgIG1TdHJpbmc7CisgICAgfSBtYXBwaW5nc1tdID0geworICAgICAgICBBVURJT19JTlBVVF9GTEFHX0ZBU1QsICAgICAgICAgICAgICAiRkFTVCIsCisgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfSFdfSE9UV09SRCwgICAgICAgICJIV19IT1RXT1JEIiwKKyAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FLCAgICAgICAgICAgICAgIk5PTkUiLCAgICAgICAgIC8vIG11c3QgYmUgbGFzdAorICAgIH07CisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBhbGxGbGFncyA9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKKyAgICBjb25zdCBtYXBwaW5nICplbnRyeTsKKyAgICBmb3IgKGVudHJ5ID0gbWFwcGluZ3M7IGVudHJ5LT5tRmxhZyAhPSBBVURJT19JTlBVVF9GTEFHX05PTkU7IGVudHJ5KyspIHsKKyAgICAgICAgYWxsRmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKGFsbEZsYWdzIHwgZW50cnktPm1GbGFnKTsKKyAgICAgICAgaWYgKGZsYWdzICYgZW50cnktPm1GbGFnKSB7CisgICAgICAgICAgICBpZiAoIXJlc3VsdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGVudHJ5LT5tU3RyaW5nKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZmxhZ3MgJiB+YWxsRmxhZ3MpIHsKKyAgICAgICAgaWYgKCFyZXN1bHQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJ8Iik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiMHglWCIsIGZsYWdzICYgfmFsbEZsYWdzKTsKKyAgICB9CisgICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChlbnRyeS0+bVN0cmluZyk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1N0cmluZzggb3V0cHV0RmxhZ3NUb1N0cmluZyhhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKK3sKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IG1hcHBpbmcgeworICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAgICBtRmxhZzsKKyAgICAgICAgY29uc3QgY2hhciAqICAgICAgICAgICAgbVN0cmluZzsKKyAgICB9IG1hcHBpbmdzW10gPSB7CisgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCwgICAgICAgICAgICJESVJFQ1QiLAorICAgICAgICBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZLCAgICAgICAgICAiUFJJTUFSWSIsCisgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QsICAgICAgICAgICAgICJGQVNUIiwKKyAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIsICAgICAgIkRFRVBfQlVGRkVSIiwKKyAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCwgIkNPTVBSRVNTX09GRkxPQUQiLAorICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05fQkxPQ0tJTkcsICAgICAiTk9OX0JMT0NLSU5HIiwKKyAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQywgICAgICAgIkhXX0FWX1NZTkMiLAorICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLCAgICAgICAgICAgICAiTk9ORSIsICAgICAgICAgLy8gbXVzdCBiZSBsYXN0CisgICAgfTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBhbGxGbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CisgICAgY29uc3QgbWFwcGluZyAqZW50cnk7CisgICAgZm9yIChlbnRyeSA9IG1hcHBpbmdzOyBlbnRyeS0+bUZsYWcgIT0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsgZW50cnkrKykgeworICAgICAgICBhbGxGbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKGFsbEZsYWdzIHwgZW50cnktPm1GbGFnKTsKKyAgICAgICAgaWYgKGZsYWdzICYgZW50cnktPm1GbGFnKSB7CisgICAgICAgICAgICBpZiAoIXJlc3VsdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJ8Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGVudHJ5LT5tU3RyaW5nKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZmxhZ3MgJiB+YWxsRmxhZ3MpIHsKKyAgICAgICAgaWYgKCFyZXN1bHQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJ8Iik7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiMHglWCIsIGZsYWdzICYgfmFsbEZsYWdzKTsKKyAgICB9CisgICAgaWYgKHJlc3VsdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChlbnRyeS0+bVN0cmluZyk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2NvbnN0IGNoYXIgKnNvdXJjZVRvU3RyaW5nKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKK3sKKyAgICBzd2l0Y2ggKHNvdXJjZSkgeworICAgIGNhc2UgQVVESU9fU09VUkNFX0RFRkFVTFQ6ICAgICAgICAgICAgICByZXR1cm4gImRlZmF1bHQiOworICAgIGNhc2UgQVVESU9fU09VUkNFX01JQzogICAgICAgICAgICAgICAgICByZXR1cm4gIm1pYyI7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOiAgICAgICAgIHJldHVybiAidm9pY2UgdXBsaW5rIjsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzogICAgICAgcmV0dXJuICJ2b2ljZSBkb3dubGluayI7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDogICAgICAgICAgIHJldHVybiAidm9pY2UgY2FsbCI7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfQ0FNQ09SREVSOiAgICAgICAgICAgIHJldHVybiAiY2FtY29yZGVyIjsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjogICAgcmV0dXJuICJ2b2ljZSByZWNvZ25pdGlvbiI7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjogIHJldHVybiAidm9pY2UgY29tbXVuaWNhdGlvbiI7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDogICAgICAgIHJldHVybiAicmVtb3RlIHN1Ym1peCI7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfRk1fVFVORVI6ICAgICAgICAgICAgIHJldHVybiAiRk0gdHVuZXIiOworICAgIGNhc2UgQVVESU9fU09VUkNFX0hPVFdPUkQ6ICAgICAgICAgICAgICByZXR1cm4gImhvdHdvcmQiOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInVua25vd24iOworICAgIH0KK30KKwogQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpUaHJlYWRCYXNlKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgYXVkaW9faW9faGFuZGxlX3QgaWQsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwgdHlwZV90IHR5cGUpCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwgdHlwZV90IHR5cGUsIGJvb2wgc3lzdGVtUmVhZHkpCiAgICAgOiAgIFRocmVhZChmYWxzZSAvKmNhbkNhbGxKYXZhKi8pLAogICAgICAgICBtVHlwZSh0eXBlKSwKICAgICAgICAgbUF1ZGlvRmxpbmdlcihhdWRpb0ZsaW5nZXIpLApAQCAtMzI0LDEwICs1MzcsMTMgQEAKICAgICAgICAgLy8gUmVjb3JkVGhyZWFkOjpyZWFkSW5wdXRQYXJhbWV0ZXJzX2woKQogICAgICAgICAvL0ZJWE1FOiBtU3RhbmRieSBzaG91bGQgYmUgdHJ1ZSBoZXJlLiBJcyB0aGlzIHNvbWUga2luZCBvZiBoYWNrPwogICAgICAgICBtU3RhbmRieShmYWxzZSksIG1PdXREZXZpY2Uob3V0RGV2aWNlKSwgbUluRGV2aWNlKGluRGV2aWNlKSwKKyAgICAgICAgbVByZXZPdXREZXZpY2UoQVVESU9fREVWSUNFX05PTkUpLCBtUHJldkluRGV2aWNlKEFVRElPX0RFVklDRV9OT05FKSwKICAgICAgICAgbUF1ZGlvU291cmNlKEFVRElPX1NPVVJDRV9ERUZBVUxUKSwgbUlkKGlkKSwKICAgICAgICAgLy8gbU5hbWUgd2lsbCBiZSBzZXQgYnkgY29uY3JldGUgKG5vbi12aXJ0dWFsKSBzdWJjbGFzcwotICAgICAgICBtRGVhdGhSZWNpcGllbnQobmV3IFBNRGVhdGhSZWNpcGllbnQodGhpcykpCisgICAgICAgIG1EZWF0aFJlY2lwaWVudChuZXcgUE1EZWF0aFJlY2lwaWVudCh0aGlzKSksCisgICAgICAgIG1TeXN0ZW1SZWFkeShzeXN0ZW1SZWFkeSkKIHsKKyAgICBtZW1zZXQoJm1QYXRjaCwgMCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wYXRjaCkpOwogfQogCiBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6On5UaHJlYWRCYXNlKCkKQEAgLTM5NCw2ICs2MTAsMTEgQEAKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKIAorICAgIGlmIChldmVudC0+bVJlcXVpcmVzU3lzdGVtUmVhZHkgJiYgIW1TeXN0ZW1SZWFkeSkgeworICAgICAgICBldmVudC0+bVdhaXRTdGF0dXMgPSBmYWxzZTsKKyAgICAgICAgbVBlbmRpbmdDb25maWdFdmVudHMuYWRkKGV2ZW50KTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CiAgICAgbUNvbmZpZ0V2ZW50cy5hZGQoZXZlbnQpOwogICAgIEFMT0dWKCJzZW5kQ29uZmlnRXZlbnRfbCgpIG51bSBldmVudHMgJWQgZXZlbnQgJWQiLCBtQ29uZmlnRXZlbnRzLnNpemUoKSwgZXZlbnQtPm1UeXBlKTsKICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKQEAgLTQxMiwxOSArNjMzLDI1IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRJb0NvbmZpZ0V2ZW50KGludCBldmVudCwgaW50IHBhcmFtKQordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRJb0NvbmZpZ0V2ZW50KGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgc2VuZElvQ29uZmlnRXZlbnRfbChldmVudCwgcGFyYW0pOworICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woZXZlbnQsIHBpZCk7CiB9CiAKIC8vIHNlbmRJb0NvbmZpZ0V2ZW50X2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kSW9Db25maWdFdmVudF9sKGludCBldmVudCwgaW50IHBhcmFtKQordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRJb0NvbmZpZ0V2ZW50X2woYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQpCiB7Ci0gICAgc3A8Q29uZmlnRXZlbnQ+IGNvbmZpZ0V2ZW50ID0gKENvbmZpZ0V2ZW50ICopbmV3IElvQ29uZmlnRXZlbnQoZXZlbnQsIHBhcmFtKTsKKyAgICBzcDxDb25maWdFdmVudD4gY29uZmlnRXZlbnQgPSAoQ29uZmlnRXZlbnQgKiluZXcgSW9Db25maWdFdmVudChldmVudCwgcGlkKTsKICAgICBzZW5kQ29uZmlnRXZlbnRfbChjb25maWdFdmVudCk7CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kUHJpb0NvbmZpZ0V2ZW50KHBpZF90IHBpZCwgcGlkX3QgdGlkLCBpbnQzMl90IHByaW8pCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50X2wocGlkLCB0aWQsIHByaW8pOworfQorCiAvLyBzZW5kUHJpb0NvbmZpZ0V2ZW50X2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKIHZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kUHJpb0NvbmZpZ0V2ZW50X2wocGlkX3QgcGlkLCBwaWRfdCB0aWQsIGludDMyX3QgcHJpbykKIHsKQEAgLTQ4NSw3ICs3MTIsNyBAQAogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIENGR19FVkVOVF9JTzogewogICAgICAgICAgICAgSW9Db25maWdFdmVudERhdGEgKmRhdGEgPSAoSW9Db25maWdFdmVudERhdGEgKilldmVudC0+bURhdGEuZ2V0KCk7Ci0gICAgICAgICAgICBhdWRpb0NvbmZpZ0NoYW5nZWQoZGF0YS0+bUV2ZW50LCBkYXRhLT5tUGFyYW0pOworICAgICAgICAgICAgaW9Db25maWdDaGFuZ2VkKGRhdGEtPm1FdmVudCwgZGF0YS0+bVBpZCk7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQ0ZHX0VWRU5UX1NFVF9QQVJBTUVURVI6IHsKICAgICAgICAgICAgIFNldFBhcmFtZXRlckNvbmZpZ0V2ZW50RGF0YSAqZGF0YSA9IChTZXRQYXJhbWV0ZXJDb25maWdFdmVudERhdGEgKilldmVudC0+bURhdGEuZ2V0KCk7CkBAIC01MjQsNDkgKzc1MSw2MyBAQAogCiBTdHJpbmc4IGNoYW5uZWxNYXNrVG9TdHJpbmcoYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWFzaywgYm9vbCBvdXRwdXQpIHsKICAgICBTdHJpbmc4IHM7Ci0gICAgaWYgKG91dHB1dCkgewotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQpIHMuYXBwZW5kKCJmcm9udC1sZWZ0LCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVCkgcy5hcHBlbmQoImZyb250LXJpZ2h0LCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIpIHMuYXBwZW5kKCJmcm9udC1jZW50ZXIsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0xPV19GUkVRVUVOQ1kpIHMuYXBwZW5kKCJsb3cgZnJlcSwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19MRUZUKSBzLmFwcGVuZCgiYmFjay1sZWZ0LCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9CQUNLX1JJR0hUKSBzLmFwcGVuZCgiYmFjay1yaWdodCwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVF9PRl9DRU5URVIpIHMuYXBwZW5kKCJmcm9udC1sZWZ0LW9mLWNlbnRlciwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFRfT0ZfQ0VOVEVSKSBzLmFwcGVuZCgiZnJvbnQtcmlnaHQtb2YtY2VudGVyLCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9CQUNLX0NFTlRFUikgcy5hcHBlbmQoImJhY2stY2VudGVyLCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9TSURFX0xFRlQpIHMuYXBwZW5kKCJzaWRlLWxlZnQsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfUklHSFQpIHMuYXBwZW5kKCJzaWRlLXJpZ2h0LCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQ0VOVEVSKSBzLmFwcGVuZCgidG9wLWNlbnRlciAsIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX0xFRlQpIHMuYXBwZW5kKCJ0b3AtZnJvbnQtbGVmdCwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX0NFTlRFUikgcy5hcHBlbmQoInRvcC1mcm9udC1jZW50ZXIsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9SSUdIVCkgcy5hcHBlbmQoInRvcC1mcm9udC1yaWdodCwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfTEVGVCkgcy5hcHBlbmQoInRvcC1iYWNrLWxlZnQsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX0NFTlRFUikgcy5hcHBlbmQoInRvcC1iYWNrLWNlbnRlciwgIiApOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX1JJR0hUKSBzLmFwcGVuZCgidG9wLWJhY2stcmlnaHQsICIgKTsKLSAgICAgICAgaWYgKG1hc2sgJiB+QVVESU9fQ0hBTk5FTF9PVVRfQUxMKSBzLmFwcGVuZCgidW5rbm93biwgICIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9MRUZUKSBzLmFwcGVuZCgibGVmdCwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9SSUdIVCkgcy5hcHBlbmQoInJpZ2h0LCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0ZST05UKSBzLmFwcGVuZCgiZnJvbnQsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fQkFDSykgcy5hcHBlbmQoImJhY2ssICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fTEVGVF9QUk9DRVNTRUQpIHMuYXBwZW5kKCJsZWZ0LXByb2Nlc3NlZCwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9SSUdIVF9QUk9DRVNTRUQpIHMuYXBwZW5kKCJyaWdodC1wcm9jZXNzZWQsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfUFJPQ0VTU0VEKSBzLmFwcGVuZCgiZnJvbnQtcHJvY2Vzc2VkLCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0JBQ0tfUFJPQ0VTU0VEKSBzLmFwcGVuZCgiYmFjay1wcm9jZXNzZWQsICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fUFJFU1NVUkUpIHMuYXBwZW5kKCJwcmVzc3VyZSwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9YX0FYSVMpIHMuYXBwZW5kKCJYLCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1lfQVhJUykgcy5hcHBlbmQoIlksICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWl9BWElTKSBzLmFwcGVuZCgiWiwgIik7Ci0gICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTkspIHMuYXBwZW5kKCJ2b2ljZS11cGxpbmssICIpOwotICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LKSBzLmFwcGVuZCgidm9pY2UtZG5saW5rLCAiKTsKLSAgICAgICAgaWYgKG1hc2sgJiB+QVVESU9fQ0hBTk5FTF9JTl9BTEwpIHMuYXBwZW5kKCJ1bmtub3duLCAgIik7CisgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9yZXByZXNlbnRhdGlvbl90IHJlcHJlc2VudGF0aW9uID0KKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24obWFzayk7CisKKyAgICBzd2l0Y2ggKHJlcHJlc2VudGF0aW9uKSB7CisgICAgY2FzZSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX1BPU0lUSU9OOiB7CisgICAgICAgIGlmIChvdXRwdXQpIHsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCkgcy5hcHBlbmQoImZyb250LWxlZnQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9SSUdIVCkgcy5hcHBlbmQoImZyb250LXJpZ2h0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfQ0VOVEVSKSBzLmFwcGVuZCgiZnJvbnQtY2VudGVyLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSkgcy5hcHBlbmQoImxvdyBmcmVxLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19MRUZUKSBzLmFwcGVuZCgiYmFjay1sZWZ0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19SSUdIVCkgcy5hcHBlbmQoImJhY2stcmlnaHQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUX09GX0NFTlRFUikgcy5hcHBlbmQoImZyb250LWxlZnQtb2YtY2VudGVyLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFRfT0ZfQ0VOVEVSKSBzLmFwcGVuZCgiZnJvbnQtcmlnaHQtb2YtY2VudGVyLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIpIHMuYXBwZW5kKCJiYWNrLWNlbnRlciwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfTEVGVCkgcy5hcHBlbmQoInNpZGUtbGVmdCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1NJREVfUklHSFQpIHMuYXBwZW5kKCJzaWRlLXJpZ2h0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0NFTlRFUikgcy5hcHBlbmQoInRvcC1jZW50ZXIgLCIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfTEVGVCkgcy5hcHBlbmQoInRvcC1mcm9udC1sZWZ0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX0NFTlRFUikgcy5hcHBlbmQoInRvcC1mcm9udC1jZW50ZXIsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfUklHSFQpIHMuYXBwZW5kKCJ0b3AtZnJvbnQtcmlnaHQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19MRUZUKSBzLmFwcGVuZCgidG9wLWJhY2stbGVmdCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX0NFTlRFUikgcy5hcHBlbmQoInRvcC1iYWNrLWNlbnRlciwgIiApOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19SSUdIVCkgcy5hcHBlbmQoInRvcC1iYWNrLXJpZ2h0LCAiICk7CisgICAgICAgICAgICBpZiAobWFzayAmIH5BVURJT19DSEFOTkVMX09VVF9BTEwpIHMuYXBwZW5kKCJ1bmtub3duLCAgIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fTEVGVCkgcy5hcHBlbmQoImxlZnQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1JJR0hUKSBzLmFwcGVuZCgicmlnaHQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0ZST05UKSBzLmFwcGVuZCgiZnJvbnQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0JBQ0spIHMuYXBwZW5kKCJiYWNrLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9MRUZUX1BST0NFU1NFRCkgcy5hcHBlbmQoImxlZnQtcHJvY2Vzc2VkLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9SSUdIVF9QUk9DRVNTRUQpIHMuYXBwZW5kKCJyaWdodC1wcm9jZXNzZWQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0ZST05UX1BST0NFU1NFRCkgcy5hcHBlbmQoImZyb250LXByb2Nlc3NlZCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fQkFDS19QUk9DRVNTRUQpIHMuYXBwZW5kKCJiYWNrLXByb2Nlc3NlZCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fUFJFU1NVUkUpIHMuYXBwZW5kKCJwcmVzc3VyZSwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWF9BWElTKSBzLmFwcGVuZCgiWCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWV9BWElTKSBzLmFwcGVuZCgiWSwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWl9BWElTKSBzLmFwcGVuZCgiWiwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LKSBzLmFwcGVuZCgidm9pY2UtdXBsaW5rLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTkspIHMuYXBwZW5kKCJ2b2ljZS1kbmxpbmssICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiB+QVVESU9fQ0hBTk5FTF9JTl9BTEwpIHMuYXBwZW5kKCJ1bmtub3duLCAgIik7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgaW50IGxlbiA9IHMubGVuZ3RoKCk7CisgICAgICAgIGlmIChsZW4gPiAyKSB7CisgICAgICAgICAgICBjaGFyICpzdHIgPSBzLmxvY2tCdWZmZXIobGVuKTsgLy8gbmVlZGVkPworICAgICAgICAgICAgcy51bmxvY2tCdWZmZXIobGVuIC0gMik7ICAgICAgIC8vIHJlbW92ZSB0cmFpbGluZyAiLCAiCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHM7CiAgICAgfQotICAgIGludCBsZW4gPSBzLmxlbmd0aCgpOwotICAgIGlmIChzLmxlbmd0aCgpID4gMikgewotICAgICAgICBjaGFyICpzdHIgPSBzLmxvY2tCdWZmZXIobGVuKTsKLSAgICAgICAgcy51bmxvY2tCdWZmZXIobGVuIC0gMik7CisgICAgY2FzZSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX0lOREVYOgorICAgICAgICBzLmFwcGVuZEZvcm1hdCgiaW5kZXggbWFzaywgYml0czolI3giLCBhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMobWFzaykpOworICAgICAgICByZXR1cm4gczsKKyAgICBkZWZhdWx0OgorICAgICAgICBzLmFwcGVuZEZvcm1hdCgidW5rbm93biBtYXNrLCByZXByZXNlbnRhdGlvbjolZCAgYml0czolI3giLAorICAgICAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uLCBhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMobWFzaykpOworICAgICAgICByZXR1cm4gczsKICAgICB9Ci0gICAgcmV0dXJuIHM7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpkdW1wQmFzZShpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCkBAIC01NzcsMjAgKzgxOCwyMiBAQAogCiAgICAgYm9vbCBsb2NrZWQgPSBBdWRpb0ZsaW5nZXI6OmR1bXBUcnlMb2NrKG1Mb2NrKTsKICAgICBpZiAoIWxvY2tlZCkgewotICAgICAgICBkcHJpbnRmKGZkLCAidGhyZWFkICVwIG1heWJlIGRlYWQgbG9ja2VkXG4iLCB0aGlzKTsKKyAgICAgICAgZHByaW50ZihmZCwgInRocmVhZCAlcCBtYXkgYmUgZGVhZGxvY2tlZFxuIiwgdGhpcyk7CiAgICAgfQogCisgICAgZHByaW50ZihmZCwgIiAgVGhyZWFkIG5hbWU6ICVzXG4iLCBtVGhyZWFkTmFtZSk7CiAgICAgZHByaW50ZihmZCwgIiAgSS9PIGhhbmRsZTogJWRcbiIsIG1JZCk7CiAgICAgZHByaW50ZihmZCwgIiAgVElEOiAlZFxuIiwgZ2V0VGlkKCkpOwogICAgIGRwcmludGYoZmQsICIgIFN0YW5kYnk6ICVzXG4iLCBtU3RhbmRieSA/ICJ5ZXMiIDogIm5vIik7Ci0gICAgZHByaW50ZihmZCwgIiAgU2FtcGxlIHJhdGU6ICV1XG4iLCBtU2FtcGxlUmF0ZSk7CisgICAgZHByaW50ZihmZCwgIiAgU2FtcGxlIHJhdGU6ICV1IEh6XG4iLCBtU2FtcGxlUmF0ZSk7CiAgICAgZHByaW50ZihmZCwgIiAgSEFMIGZyYW1lIGNvdW50OiAlenVcbiIsIG1GcmFtZUNvdW50KTsKKyAgICBkcHJpbnRmKGZkLCAiICBIQUwgZm9ybWF0OiAweCV4ICglcylcbiIsIG1IQUxGb3JtYXQsIGZvcm1hdFRvU3RyaW5nKG1IQUxGb3JtYXQpKTsKICAgICBkcHJpbnRmKGZkLCAiICBIQUwgYnVmZmVyIHNpemU6ICV1IGJ5dGVzXG4iLCBtQnVmZmVyU2l6ZSk7Ci0gICAgZHByaW50ZihmZCwgIiAgQ2hhbm5lbCBDb3VudDogJXVcbiIsIG1DaGFubmVsQ291bnQpOwotICAgIGRwcmludGYoZmQsICIgIENoYW5uZWwgTWFzazogMHglMDh4ICglcylcbiIsIG1DaGFubmVsTWFzaywKKyAgICBkcHJpbnRmKGZkLCAiICBDaGFubmVsIGNvdW50OiAldVxuIiwgbUNoYW5uZWxDb3VudCk7CisgICAgZHByaW50ZihmZCwgIiAgQ2hhbm5lbCBtYXNrOiAweCUwOHggKCVzKVxuIiwgbUNoYW5uZWxNYXNrLAogICAgICAgICAgICAgY2hhbm5lbE1hc2tUb1N0cmluZyhtQ2hhbm5lbE1hc2ssIG1UeXBlICE9IFJFQ09SRCkuc3RyaW5nKCkpOwotICAgIGRwcmludGYoZmQsICIgIEZvcm1hdDogMHgleCAoJXMpXG4iLCBtSEFMRm9ybWF0LCBmb3JtYXRUb1N0cmluZyhtSEFMRm9ybWF0KSk7Ci0gICAgZHByaW50ZihmZCwgIiAgRnJhbWUgc2l6ZTogJXp1XG4iLCBtRnJhbWVTaXplKTsKKyAgICBkcHJpbnRmKGZkLCAiICBGb3JtYXQ6IDB4JXggKCVzKVxuIiwgbUZvcm1hdCwgZm9ybWF0VG9TdHJpbmcobUZvcm1hdCkpOworICAgIGRwcmludGYoZmQsICIgIEZyYW1lIHNpemU6ICV6dSBieXRlc1xuIiwgbUZyYW1lU2l6ZSk7CiAgICAgZHByaW50ZihmZCwgIiAgUGVuZGluZyBjb25maWcgZXZlbnRzOiIpOwogICAgIHNpemVfdCBudW1Db25maWcgPSBtQ29uZmlnRXZlbnRzLnNpemUoKTsKICAgICBpZiAobnVtQ29uZmlnKSB7CkBAIC02MDIsNiArODQ1LDkgQEAKICAgICB9IGVsc2UgewogICAgICAgICBkcHJpbnRmKGZkLCAiIG5vbmVcbiIpOwogICAgIH0KKyAgICBkcHJpbnRmKGZkLCAiICBPdXRwdXQgZGV2aWNlOiAlI3ggKCVzKVxuIiwgbU91dERldmljZSwgZGV2aWNlc1RvU3RyaW5nKG1PdXREZXZpY2UpLnN0cmluZygpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBJbnB1dCBkZXZpY2U6ICUjeCAoJXMpXG4iLCBtSW5EZXZpY2UsIGRldmljZXNUb1N0cmluZyhtSW5EZXZpY2UpLnN0cmluZygpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBBdWRpbyBzb3VyY2U6ICVkICglcylcbiIsIG1BdWRpb1NvdXJjZSwgc291cmNlVG9TdHJpbmcobUF1ZGlvU291cmNlKSk7CiAKICAgICBpZiAobG9ja2VkKSB7CiAgICAgICAgIG1Mb2NrLnVubG9jaygpOwpAQCAtNjM1LDE5ICs4ODEsMTkgQEAKIFN0cmluZzE2IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6Z2V0V2FrZUxvY2tUYWcoKQogewogICAgIHN3aXRjaCAobVR5cGUpIHsKLSAgICAgICAgY2FzZSBNSVhFUjoKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcxNigiQXVkaW9NaXgiKTsKLSAgICAgICAgY2FzZSBESVJFQ1Q6Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nMTYoIkF1ZGlvRGlyZWN0T3V0Iik7Ci0gICAgICAgIGNhc2UgRFVQTElDQVRJTkc6Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nMTYoIkF1ZGlvRHVwIik7Ci0gICAgICAgIGNhc2UgUkVDT1JEOgotICAgICAgICAgICAgcmV0dXJuIFN0cmluZzE2KCJBdWRpb0luIik7Ci0gICAgICAgIGNhc2UgT0ZGTE9BRDoKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcxNigiQXVkaW9PZmZsb2FkIik7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVChmYWxzZSk7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nMTYoIkF1ZGlvVW5rbm93biIpOworICAgIGNhc2UgTUlYRVI6CisgICAgICAgIHJldHVybiBTdHJpbmcxNigiQXVkaW9NaXgiKTsKKyAgICBjYXNlIERJUkVDVDoKKyAgICAgICAgcmV0dXJuIFN0cmluZzE2KCJBdWRpb0RpcmVjdE91dCIpOworICAgIGNhc2UgRFVQTElDQVRJTkc6CisgICAgICAgIHJldHVybiBTdHJpbmcxNigiQXVkaW9EdXAiKTsKKyAgICBjYXNlIFJFQ09SRDoKKyAgICAgICAgcmV0dXJuIFN0cmluZzE2KCJBdWRpb0luIik7CisgICAgY2FzZSBPRkZMT0FEOgorICAgICAgICByZXR1cm4gU3RyaW5nMTYoIkF1ZGlvT2ZmbG9hZCIpOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dfQVNTRVJUKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZzE2KCJBdWRpb1Vua25vd24iKTsKICAgICB9CiB9CiAKQEAgLTY3NCw3ICs5MjAsNyBAQAogICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBtV2FrZUxvY2tUb2tlbiA9IGJpbmRlcjsKICAgICAgICAgfQotICAgICAgICBBTE9HVigiYWNxdWlyZVdha2VMb2NrX2woKSAlcyBzdGF0dXMgJWQiLCBtTmFtZSwgc3RhdHVzKTsKKyAgICAgICAgQUxPR1YoImFjcXVpcmVXYWtlTG9ja19sKCkgJXMgc3RhdHVzICVkIiwgbVRocmVhZE5hbWUsIHN0YXR1cyk7CiAgICAgfQogfQogCkBAIC02ODcsNyArOTMzLDcgQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpyZWxlYXNlV2FrZUxvY2tfbCgpCiB7CiAgICAgaWYgKG1XYWtlTG9ja1Rva2VuICE9IDApIHsKLSAgICAgICAgQUxPR1YoInJlbGVhc2VXYWtlTG9ja19sKCkgJXMiLCBtTmFtZSk7CisgICAgICAgIEFMT0dWKCJyZWxlYXNlV2FrZUxvY2tfbCgpICVzIiwgbVRocmVhZE5hbWUpOwogICAgICAgICBpZiAobVBvd2VyTWFuYWdlciAhPSAwKSB7CiAgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyLT5yZWxlYXNlV2FrZUxvY2sobVdha2VMb2NrVG9rZW4sIDAsCiAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogRklYTUUgZm9yY2Ugb25ld2F5IGNvbnRyYXJ5IHRvIC5haWRsICovKTsKQEAgLTcwMiwxMyArOTQ4LDEyIEBACiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpnZXRQb3dlck1hbmFnZXJfbCgpIHsKLQotICAgIGlmIChtUG93ZXJNYW5hZ2VyID09IDApIHsKKyAgICBpZiAobVN5c3RlbVJlYWR5ICYmIG1Qb3dlck1hbmFnZXIgPT0gMCkgewogICAgICAgICAvLyB1c2UgY2hlY2tTZXJ2aWNlKCkgdG8gYXZvaWQgYmxvY2tpbmcgaWYgcG93ZXIgc2VydmljZSBpcyBub3QgdXAgeWV0CiAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9CiAgICAgICAgICAgICBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Y2hlY2tTZXJ2aWNlKFN0cmluZzE2KCJwb3dlciIpKTsKICAgICAgICAgaWYgKGJpbmRlciA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiVGhyZWFkICVzIGNhbm5vdCBjb25uZWN0IHRvIHRoZSBwb3dlciBtYW5hZ2VyIHNlcnZpY2UiLCBtTmFtZSk7CisgICAgICAgICAgICBBTE9HVygiVGhyZWFkICVzIGNhbm5vdCBjb25uZWN0IHRvIHRoZSBwb3dlciBtYW5hZ2VyIHNlcnZpY2UiLCBtVGhyZWFkTmFtZSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtUG93ZXJNYW5hZ2VyID0gaW50ZXJmYWNlX2Nhc3Q8SVBvd2VyTWFuYWdlcj4oYmluZGVyKTsKICAgICAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50KTsKQEAgLTcxNyw3ICs5NjIsNiBAQAogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6dXBkYXRlV2FrZUxvY2tVaWRzX2woY29uc3QgU29ydGVkVmVjdG9yPGludD4gJnVpZHMpIHsKLQogICAgIGdldFBvd2VyTWFuYWdlcl9sKCk7CiAgICAgaWYgKG1XYWtlTG9ja1Rva2VuID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIm5vIHdha2UgbG9jayB0byB1cGRhdGUhIik7CkBAIC03MjgsNyArOTcyLDcgQEAKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgICAgICBzdGF0dXMgPSBtUG93ZXJNYW5hZ2VyLT51cGRhdGVXYWtlTG9ja1VpZHMobVdha2VMb2NrVG9rZW4sIHVpZHMuc2l6ZSgpLCB1aWRzLmFycmF5KCksCiAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogRklYTUUgZm9yY2Ugb25ld2F5IGNvbnRyYXJ5IHRvIC5haWRsICovKTsKLSAgICAgICAgQUxPR1YoImFjcXVpcmVXYWtlTG9ja19sKCkgJXMgc3RhdHVzICVkIiwgbU5hbWUsIHN0YXR1cyk7CisgICAgICAgIEFMT0dWKCJhY3F1aXJlV2FrZUxvY2tfbCgpICVzIHN0YXR1cyAlZCIsIG1UaHJlYWROYW1lLCBzdGF0dXMpOwogICAgIH0KIH0KIApAQCAtOTEyLDcgKzExNTYsNyBAQAogICAgIC8vIG1TaW5rQnVmZmVyIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBlZmZlY3QgcHJvY2Vzc2luZyAoUENNIDE2IHN0ZXJlbykuCiAgICAgaWYgKG1UeXBlID09IERJUkVDVCkgewogICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0X2woKSBDYW5ub3QgYWRkIGVmZmVjdCAlcyBvbiBEaXJlY3Qgb3V0cHV0IHR5cGUgdGhyZWFkICVzIiwKLSAgICAgICAgICAgICAgICBkZXNjLT5uYW1lLCBtTmFtZSk7CisgICAgICAgICAgICAgICAgZGVzYy0+bmFtZSwgbVRocmVhZE5hbWUpOwogICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQpAQCAtOTM2LDcgKzExODAsOCBAQAogICAgICAgICBjYXNlIERVUExJQ0FUSU5HOgogICAgICAgICBjYXNlIFJFQ09SRDoKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3RfbCgpIENhbm5vdCBhZGQgZ2xvYmFsIGVmZmVjdCAlcyBvbiB0aHJlYWQgJXMiLCBkZXNjLT5uYW1lLCBtTmFtZSk7CisgICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0X2woKSBDYW5ub3QgYWRkIGdsb2JhbCBlZmZlY3QgJXMgb24gdGhyZWFkICVzIiwKKyAgICAgICAgICAgICAgICAgICAgZGVzYy0+bmFtZSwgbVRocmVhZE5hbWUpOwogICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQpAQCAtMTE1OCw2ICsxNDAzLDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c3lzdGVtUmVhZHkoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1TeXN0ZW1SZWFkeSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1TeXN0ZW1SZWFkeSA9IHRydWU7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QZW5kaW5nQ29uZmlnRXZlbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNlbmRDb25maWdFdmVudF9sKG1QZW5kaW5nQ29uZmlnRXZlbnRzLmVkaXRJdGVtQXQoaSkpOworICAgIH0KKyAgICBtUGVuZGluZ0NvbmZpZ0V2ZW50cy5jbGVhcigpOworfQorCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgUGxheWJhY2sKQEAgLTExNjcsOCArMTQyNiw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV90IHR5cGUpCi0gICAgOiAgIFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCwgZGV2aWNlLCBBVURJT19ERVZJQ0VfTk9ORSwgdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtUmVhZHkpCisgICAgOiAgIFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCwgZGV2aWNlLCBBVURJT19ERVZJQ0VfTk9ORSwgdHlwZSwgc3lzdGVtUmVhZHkpLAogICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCgwKSwgbVNpbmtCdWZmZXIoTlVMTCksCiAgICAgICAgIG1NaXhlckJ1ZmZlckVuYWJsZWQoQXVkaW9GbGluZ2VyOjprRW5hYmxlRXh0ZW5kZWRQcmVjaXNpb24pLAogICAgICAgICBtTWl4ZXJCdWZmZXIoTlVMTCksCkBAIC0xMTg3LDcgKzE0NDcsNyBAQAogICAgICAgICBtTGFzdFdyaXRlVGltZSgwKSwgbU51bVdyaXRlcygwKSwgbU51bURlbGF5ZWRXcml0ZXMoMCksIG1JbldyaXRlKGZhbHNlKSwKICAgICAgICAgbU1peGVyU3RhdHVzKE1JWEVSX0lETEUpLAogICAgICAgICBtTWl4ZXJTdGF0dXNJZ25vcmluZ0Zhc3RUcmFja3MoTUlYRVJfSURMRSksCi0gICAgICAgIHN0YW5kYnlEZWxheShBdWRpb0ZsaW5nZXI6Om1TdGFuZGJ5VGltZUluTnNlY3MpLAorICAgICAgICBtU3RhbmRieURlbGF5TnMoQXVkaW9GbGluZ2VyOjptU3RhbmRieVRpbWVJbk5zZWNzKSwKICAgICAgICAgbUJ5dGVzUmVtYWluaW5nKDApLAogICAgICAgICBtQ3VycmVudFdyaXRlTGVuZ3RoKDApLAogICAgICAgICBtVXNlQXN5bmNXcml0ZShmYWxzZSksCkBAIC0xMjAxLDggKzE0NjEsOCBAQAogICAgICAgICAvLyBtTGF0Y2hELCBtTGF0Y2hRLAogICAgICAgICBtTGF0Y2hEVmFsaWQoZmFsc2UpLCBtTGF0Y2hRVmFsaWQoZmFsc2UpCiB7Ci0gICAgc25wcmludGYobU5hbWUsIGtOYW1lTGVuZ3RoLCAiQXVkaW9PdXRfJVgiLCBpZCk7Ci0gICAgbU5CTG9nV3JpdGVyID0gYXVkaW9GbGluZ2VyLT5uZXdXcml0ZXJfbChrTG9nU2l6ZSwgbU5hbWUpOworICAgIHNucHJpbnRmKG1UaHJlYWROYW1lLCBrVGhyZWFkTmFtZUxlbmd0aCwgIkF1ZGlvT3V0XyVYIiwgaWQpOworICAgIG1OQkxvZ1dyaXRlciA9IGF1ZGlvRmxpbmdlci0+bmV3V3JpdGVyX2woa0xvZ1NpemUsIG1UaHJlYWROYW1lKTsKIAogICAgIC8vIEFzc3VtZXMgY29uc3RydWN0b3IgaXMgY2FsbGVkIGJ5IEF1ZGlvRmxpbmdlciB3aXRoIGl0J3MgbUxvY2sgaGVsZCwgYnV0CiAgICAgLy8gaXQgd291bGQgYmUgc2FmZXIgdG8gZXhwbGljaXRseSBwYXNzIGluaXRpYWwgbWFzdGVyVm9sdW1lL21hc3Rlck11dGUgYXMKQEAgLTEzMTUsNyArMTU3NSwxMCBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQogewotICAgIGRwcmludGYoZmQsICJcbk91dHB1dCB0aHJlYWQgJXA6XG4iLCB0aGlzKTsKKyAgICBkcHJpbnRmKGZkLCAiXG5PdXRwdXQgdGhyZWFkICVwIHR5cGUgJWQgKCVzKTpcbiIsIHRoaXMsIHR5cGUoKSwgdGhyZWFkVHlwZVRvU3RyaW5nKHR5cGUoKSkpOworCisgICAgZHVtcEJhc2UoZmQsIGFyZ3MpOworCiAgICAgZHByaW50ZihmZCwgIiAgTm9ybWFsIGZyYW1lIGNvdW50OiAlenVcbiIsIG1Ob3JtYWxGcmFtZUNvdW50KTsKICAgICBkcHJpbnRmKGZkLCAiICBMYXN0IHdyaXRlIG9jY3VycmVkIChtc2Vjcyk6ICVsbHVcbiIsIG5zMm1zKHN5c3RlbVRpbWUoKSAtIG1MYXN0V3JpdGVUaW1lKSk7CiAgICAgZHByaW50ZihmZCwgIiAgVG90YWwgd3JpdGVzOiAlZFxuIiwgbU51bVdyaXRlcyk7CkBAIC0xMzI2LDE1ICsxNTg5LDE3IEBACiAgICAgZHByaW50ZihmZCwgIiAgTWl4ZXIgYnVmZmVyOiAlcFxuIiwgbU1peGVyQnVmZmVyKTsKICAgICBkcHJpbnRmKGZkLCAiICBFZmZlY3QgYnVmZmVyOiAlcFxuIiwgbUVmZmVjdEJ1ZmZlcik7CiAgICAgZHByaW50ZihmZCwgIiAgRmFzdCB0cmFjayBhdmFpbE1hc2s9JSN4XG4iLCBtRmFzdFRyYWNrQXZhaWxNYXNrKTsKLQotICAgIGR1bXBCYXNlKGZkLCBhcmdzKTsKKyAgICBBdWRpb1N0cmVhbU91dCAqb3V0cHV0ID0gbU91dHB1dDsKKyAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IG91dHB1dCAhPSBOVUxMID8gb3V0cHV0LT5mbGFncyA6IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CisgICAgU3RyaW5nOCBmbGFnc0FzU3RyaW5nID0gb3V0cHV0RmxhZ3NUb1N0cmluZyhmbGFncyk7CisgICAgZHByaW50ZihmZCwgIiAgQXVkaW9TdHJlYW1PdXQ6ICVwIGZsYWdzICUjeCAoJXMpXG4iLCBvdXRwdXQsIGZsYWdzLCBmbGFnc0FzU3RyaW5nLnN0cmluZygpKTsKIH0KIAogLy8gVGhyZWFkIHZpcnR1YWxzCiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6b25GaXJzdFJlZigpCiB7Ci0gICAgcnVuKG1OYW1lLCBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTyk7CisgICAgcnVuKG1UaHJlYWROYW1lLCBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiB9CiAKIC8vIFRocmVhZEJhc2UgdmlydHVhbHMKQEAgLTEzNzgsMTkgKzE2NDMsMjIgQEAKICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgIChzaGFyZWRCdWZmZXIgIT0gMCkKICAgICAgICAgICAgICAgKSB8fAotICAgICAgICAgICAgICAvLyB1c2UgY2FzZSAyOiBjYWxsYmFjayBoYW5kbGVyIGFuZCBmcmFtZSBjb3VudCBpcyBkZWZhdWx0IG9yIGF0IGxlYXN0IGFzIGxhcmdlIGFzIEhBTAorICAgICAgICAgICAgICAvLyB1c2UgY2FzZSAyOiBmcmFtZSBjb3VudCBpcyBkZWZhdWx0IG9yIGF0IGxlYXN0IGFzIGxhcmdlIGFzIEhBTAogICAgICAgICAgICAgICAoCi0gICAgICAgICAgICAgICAgKHRpZCAhPSAtMSkgJiYKKyAgICAgICAgICAgICAgICAvLyB3ZSBmb3JtZXJseSBjaGVja2VkIGZvciBhIGNhbGxiYWNrIGhhbmRsZXIgKG5vbi0wIHRpZCksCisgICAgICAgICAgICAgICAgLy8gYnV0IHRoYXQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGZvciBUUkFOU0ZFUl9PQlRBSU4gbW9kZQogICAgICAgICAgICAgICAgICgoZnJhbWVDb3VudCA9PSAwKSB8fAogICAgICAgICAgICAgICAgIChmcmFtZUNvdW50ID49IG1GcmFtZUNvdW50KSkKICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgKSAmJgogICAgICAgICAgICAgLy8gUENNIGRhdGEKICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSAmJgotICAgICAgICAgICAgLy8gaWRlbnRpY2FsIGNoYW5uZWwgbWFzayB0byBzaW5rLCBvciBtb25vIGluIGFuZCBzdGVyZW8gc2luaworICAgICAgICAgICAgLy8gVE9ETzogZXh0cmFjdCBhcyBhIGRhdGEgbGlicmFyeSBmdW5jdGlvbiB0aGF0IGNoZWNrcyB0aGF0IGEgY29tcHV0YXRpb25hbGx5CisgICAgICAgICAgICAvLyBleHBlbnNpdmUgZG93bm1peGVyIGlzIG5vdCByZXF1aXJlZDogaXNGYXN0T3V0cHV0Q2hhbm5lbENvbnZlcnNpb24oKQogICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IG1DaGFubmVsTWFzayB8fAotICAgICAgICAgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pKSAmJgorICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIHx8CisgICAgICAgICAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogJiYgbUNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyAqLykpICYmCiAgICAgICAgICAgICAvLyBoYXJkd2FyZSBzYW1wbGUgcmF0ZQogICAgICAgICAgICAgKHNhbXBsZVJhdGUgPT0gbVNhbXBsZVJhdGUpICYmCiAgICAgICAgICAgICAvLyBub3JtYWwgbWl4ZXIgaGFzIGFuIGFzc29jaWF0ZWQgZmFzdCBtaXhlcgpAQCAtMTQyMCwyMCArMTY4OCwzMSBAQAogICAgICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSwKICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgc2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUsIGhhc0Zhc3RNaXhlcigpLCB0aWQsIG1GYXN0VHJhY2tBdmFpbE1hc2spOwogICAgICAgICAqZmxhZ3MgJj0gfklBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1Q7Ci0gICAgICAgIC8vIEZvciBjb21wYXRpYmlsaXR5IHdpdGggQXVkaW9UcmFjayBjYWxjdWxhdGlvbiwgYnVmZmVyIGRlcHRoIGlzIGZvcmNlZAotICAgICAgICAvLyB0byBiZSBhdCBsZWFzdCAyIHggdGhlIG5vcm1hbCBtaXhlciBmcmFtZSBjb3VudCBhbmQgY292ZXIgYXVkaW8gaGFyZHdhcmUgbGF0ZW5jeS4KLSAgICAgICAgLy8gVGhpcyBpcyBwcm9iYWJseSB0b28gY29uc2VydmF0aXZlLCBidXQgbGVnYWN5IGFwcGxpY2F0aW9uIGNvZGUgbWF5IGRlcGVuZCBvbiBpdC4KLSAgICAgICAgLy8gSWYgeW91IGNoYW5nZSB0aGlzIGNhbGN1bGF0aW9uLCBhbHNvIHJldmlldyB0aGUgc3RhcnQgdGhyZXNob2xkIHdoaWNoIGlzIHJlbGF0ZWQuCisgICAgICB9CisgICAgfQorICAgIC8vIEZvciBub3JtYWwgUENNIHN0cmVhbWluZyB0cmFja3MsIHVwZGF0ZSBtaW5pbXVtIGZyYW1lIGNvdW50LgorICAgIC8vIEZvciBjb21wYXRpYmlsaXR5IHdpdGggQXVkaW9UcmFjayBjYWxjdWxhdGlvbiwgYnVmZmVyIGRlcHRoIGlzIGZvcmNlZAorICAgIC8vIHRvIGJlIGF0IGxlYXN0IDIgeCB0aGUgbm9ybWFsIG1peGVyIGZyYW1lIGNvdW50IGFuZCBjb3ZlciBhdWRpbyBoYXJkd2FyZSBsYXRlbmN5LgorICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgdG9vIGNvbnNlcnZhdGl2ZSwgYnV0IGxlZ2FjeSBhcHBsaWNhdGlvbiBjb2RlIG1heSBkZXBlbmQgb24gaXQuCisgICAgLy8gSWYgeW91IGNoYW5nZSB0aGlzIGNhbGN1bGF0aW9uLCBhbHNvIHJldmlldyB0aGUgc3RhcnQgdGhyZXNob2xkIHdoaWNoIGlzIHJlbGF0ZWQuCisgICAgaWYgKCEoKmZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVCkKKyAgICAgICAgICAgICYmIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSAmJiBzaGFyZWRCdWZmZXIgPT0gMCkgeworICAgICAgICAvLyB0aGlzIG11c3QgbWF0Y2ggQXVkaW9UcmFjay5jcHAgY2FsY3VsYXRlTWluRnJhbWVDb3VudCgpLgorICAgICAgICAvLyBUT0RPOiBNb3ZlIHRvIGEgY29tbW9uIGxpYnJhcnkKICAgICAgICAgdWludDMyX3QgbGF0ZW5jeU1zID0gbU91dHB1dC0+c3RyZWFtLT5nZXRfbGF0ZW5jeShtT3V0cHV0LT5zdHJlYW0pOwogICAgICAgICB1aW50MzJfdCBtaW5CdWZDb3VudCA9IGxhdGVuY3lNcyAvICgoMTAwMCAqIG1Ob3JtYWxGcmFtZUNvdW50KSAvIG1TYW1wbGVSYXRlKTsKICAgICAgICAgaWYgKG1pbkJ1ZkNvdW50IDwgMikgewogICAgICAgICAgICAgbWluQnVmQ291bnQgPSAyOwogICAgICAgICB9Ci0gICAgICAgIHNpemVfdCBtaW5GcmFtZUNvdW50ID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtaW5CdWZDb3VudDsKLSAgICAgICAgaWYgKGZyYW1lQ291bnQgPCBtaW5GcmFtZUNvdW50KSB7CisgICAgICAgIC8vIEZvciBub3JtYWwgbWl4aW5nIHRyYWNrcywgaWYgc3BlZWQgaXMgPiAxLjBmIChub3JtYWwpLCBBdWRpb1RyYWNrCisgICAgICAgIC8vIG9yIHRoZSBjbGllbnQgc2hvdWxkIGNvbXB1dGUgYW5kIHBhc3MgaW4gYSBsYXJnZXIgYnVmZmVyIHJlcXVlc3QuCisgICAgICAgIHNpemVfdCBtaW5GcmFtZUNvdW50ID0KKyAgICAgICAgICAgICAgICBtaW5CdWZDb3VudCAqIHNvdXJjZUZyYW1lc05lZWRlZFdpdGhUaW1lc3RyZXRjaCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIG1Ob3JtYWxGcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX05PUk1BTCAvKnNwZWVkKi8pOworICAgICAgICBpZiAoZnJhbWVDb3VudCA8IG1pbkZyYW1lQ291bnQpIHsgLy8gaW5jbHVkaW5nIGZyYW1lQ291bnQgPT0gMAogICAgICAgICAgICAgZnJhbWVDb3VudCA9IG1pbkZyYW1lQ291bnQ7CiAgICAgICAgIH0KLSAgICAgIH0KICAgICB9CiAgICAgKnBGcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKIApAQCAtMTcyNiwzMiArMjAwNSwyOSBAQAogICAgIHJldHVybiBvdXRfczg7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6YXVkaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgaW50IHBhcmFtKSB7Ci0gICAgQXVkaW9TeXN0ZW06Ok91dHB1dERlc2NyaXB0b3IgZGVzYzsKLSAgICB2b2lkICpwYXJhbTIgPSBOVUxMOwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjppb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQpIHsKKyAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gZGVzYyA9IG5ldyBBdWRpb0lvRGVzY3JpcHRvcigpOworICAgIEFMT0dWKCJQbGF5YmFja1RocmVhZDo6aW9Db25maWdDaGFuZ2VkLCB0aHJlYWQgJXAsIGV2ZW50ICVkIiwgdGhpcywgZXZlbnQpOwogCi0gICAgQUxPR1YoIlBsYXliYWNrVGhyZWFkOjphdWRpb0NvbmZpZ0NoYW5nZWQsIHRocmVhZCAlcCwgZXZlbnQgJWQsIHBhcmFtICVkIiwgdGhpcywgZXZlbnQsCi0gICAgICAgICAgICBwYXJhbSk7CisgICAgZGVzYy0+bUlvSGFuZGxlID0gbUlkOwogCiAgICAgc3dpdGNoIChldmVudCkgewotICAgIGNhc2UgQXVkaW9TeXN0ZW06Ok9VVFBVVF9PUEVORUQ6Ci0gICAgY2FzZSBBdWRpb1N5c3RlbTo6T1VUUFVUX0NPTkZJR19DSEFOR0VEOgotICAgICAgICBkZXNjLmNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrOwotICAgICAgICBkZXNjLnNhbXBsaW5nUmF0ZSA9IG1TYW1wbGVSYXRlOwotICAgICAgICBkZXNjLmZvcm1hdCA9IG1Gb3JtYXQ7Ci0gICAgICAgIGRlc2MuZnJhbWVDb3VudCA9IG1Ob3JtYWxGcmFtZUNvdW50OyAvLyBGSVhNRSBzZWUKKyAgICBjYXNlIEFVRElPX09VVFBVVF9PUEVORUQ6CisgICAgY2FzZSBBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQ6CisgICAgICAgIGRlc2MtPm1QYXRjaCA9IG1QYXRjaDsKKyAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrOworICAgICAgICBkZXNjLT5tU2FtcGxpbmdSYXRlID0gbVNhbXBsZVJhdGU7CisgICAgICAgIGRlc2MtPm1Gb3JtYXQgPSBtRm9ybWF0OworICAgICAgICBkZXNjLT5tRnJhbWVDb3VudCA9IG1Ob3JtYWxGcmFtZUNvdW50OyAvLyBGSVhNRSBzZWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvRmxpbmdlcjo6ZnJhbWVDb3VudChhdWRpb19pb19oYW5kbGVfdCkKLSAgICAgICAgZGVzYy5sYXRlbmN5ID0gbGF0ZW5jeV9sKCk7Ci0gICAgICAgIHBhcmFtMiA9ICZkZXNjOworICAgICAgICBkZXNjLT5tTGF0ZW5jeSA9IGxhdGVuY3lfbCgpOwogICAgICAgICBicmVhazsKIAotICAgIGNhc2UgQXVkaW9TeXN0ZW06OlNUUkVBTV9DT05GSUdfQ0hBTkdFRDoKLSAgICAgICAgcGFyYW0yID0gJnBhcmFtOwotICAgIGNhc2UgQXVkaW9TeXN0ZW06Ok9VVFBVVF9DTE9TRUQ6CisgICAgY2FzZSBBVURJT19PVVRQVVRfQ0xPU0VEOgogICAgIGRlZmF1bHQ6CiAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBtQXVkaW9GbGluZ2VyLT5hdWRpb0NvbmZpZ0NoYW5nZWQoZXZlbnQsIG1JZCwgcGFyYW0yKTsKKyAgICBtQXVkaW9GbGluZ2VyLT5pb0NvbmZpZ0NoYW5nZWQoZXZlbnQsIGRlc2MsIHBpZCk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6d3JpdGVDYWxsYmFjaygpCkBAIC0xODEwLDggKzIwODYsOCBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkKIHsKICAgICAvLyB1bmZvcnR1bmF0ZWx5IHdlIGhhdmUgbm8gd2F5IG9mIHJlY292ZXJpbmcgZnJvbSBlcnJvcnMgaGVyZSwgaGVuY2UgdGhlIExPR19BTFdBWVNfRkFUQUwKLSAgICBtU2FtcGxlUmF0ZSA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwotICAgIG1DaGFubmVsTWFzayA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9jaGFubmVscygmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOworICAgIG1TYW1wbGVSYXRlID0gbU91dHB1dC0+Z2V0U2FtcGxlUmF0ZSgpOworICAgIG1DaGFubmVsTWFzayA9IG1PdXRwdXQtPmdldENoYW5uZWxNYXNrKCk7CiAgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChtQ2hhbm5lbE1hc2spKSB7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkhBTCBjaGFubmVsIG1hc2sgJSN4IG5vdCB2YWxpZCBmb3Igb3V0cHV0IiwgbUNoYW5uZWxNYXNrKTsKICAgICB9CkBAIC0xODIxLDggKzIwOTcsMTIgQEAKICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2spOwogICAgIH0KICAgICBtQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1DaGFubmVsTWFzayk7CisKKyAgICAvLyBHZXQgYWN0dWFsIEhBTCBmb3JtYXQuCiAgICAgbUhBTEZvcm1hdCA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9mb3JtYXQoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uKTsKLSAgICBtRm9ybWF0ID0gbUhBTEZvcm1hdDsKKyAgICAvLyBHZXQgZm9ybWF0IGZyb20gdGhlIHNoaW0sIHdoaWNoIHdpbGwgYmUgZGlmZmVyZW50IHRoYW4gdGhlIEhBTCBmb3JtYXQKKyAgICAvLyBpZiBwbGF5aW5nIGNvbXByZXNzZWQgYXVkaW8gb3ZlciBIRE1JIHBhc3N0aHJvdWdoLgorICAgIG1Gb3JtYXQgPSBtT3V0cHV0LT5nZXRGb3JtYXQoKTsKICAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChtRm9ybWF0KSkgewogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJIQUwgZm9ybWF0ICUjeCBub3QgdmFsaWQgZm9yIG91dHB1dCIsIG1Gb3JtYXQpOwogICAgIH0KQEAgLTE4MzEsNyArMjExMSw3IEBACiAgICAgICAgIExPR19GQVRBTCgiSEFMIGZvcm1hdCAlI3ggbm90IHN1cHBvcnRlZCBmb3IgbWl4ZWQgb3V0cHV0IiwKICAgICAgICAgICAgICAgICBtRm9ybWF0KTsKICAgICB9Ci0gICAgbUZyYW1lU2l6ZSA9IGF1ZGlvX3N0cmVhbV9vdXRfZnJhbWVfc2l6ZShtT3V0cHV0LT5zdHJlYW0pOworICAgIG1GcmFtZVNpemUgPSBtT3V0cHV0LT5nZXRGcmFtZVNpemUoKTsKICAgICBtQnVmZmVyU2l6ZSA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9idWZmZXJfc2l6ZSgmbU91dHB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgIG1GcmFtZUNvdW50ID0gbUJ1ZmZlclNpemUgLyBtRnJhbWVTaXplOwogICAgIGlmIChtRnJhbWVDb3VudCAmIDE1KSB7CkBAIC0xODYwLDYgKzIxNDAsMjUgQEAKICAgICAgICAgICAgIEFMT0dXKCJkaXJlY3Qgb3V0cHV0IGltcGxlbWVudHMgcmVzdW1lIGJ1dCBub3QgcGF1c2UiKTsKICAgICAgICAgfQogICAgIH0KKyAgICBpZiAoIW1Id1N1cHBvcnRzUGF1c2UgJiYgbU91dHB1dC0+ZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkhXX0FWX1NZTkMgcmVxdWVzdGVkIGJ1dCBIQUwgZG9lcyBub3QgaW1wbGVtZW50IHBhdXNlIGFuZCByZXN1bWUiKTsKKyAgICB9CisKKyAgICBpZiAobVR5cGUgPT0gRFVQTElDQVRJTkcgJiYgbU1peGVyQnVmZmVyRW5hYmxlZCAmJiBtRWZmZWN0QnVmZmVyRW5hYmxlZCkgeworICAgICAgICAvLyBGb3IgYmVzdCBwcmVjaXNpb24sIHdlIHVzZSBmbG9hdCBpbnN0ZWFkIG9mIHRoZSBhc3NvY2lhdGVkIG91dHB1dAorICAgICAgICAvLyBkZXZpY2UgZm9ybWF0ICh0eXBpY2FsbHkgUENNIDE2IGJpdCkuCisKKyAgICAgICAgbUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgICAgIG1GcmFtZVNpemUgPSBtQ2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRm9ybWF0KTsKKyAgICAgICAgbUJ1ZmZlclNpemUgPSBtRnJhbWVTaXplICogbUZyYW1lQ291bnQ7CisKKyAgICAgICAgLy8gVE9ETzogV2UgY3VycmVudGx5IHVzZSB0aGUgYXNzb2NpYXRlZCBvdXRwdXQgZGV2aWNlIGNoYW5uZWwgbWFzayBhbmQgc2FtcGxlIHJhdGUuCisgICAgICAgIC8vICgxKSBQZXJoYXBzIHVzZSB0aGUgT1JlZCBjaGFubmVsIG1hc2sgb2YgYWxsIGRvd25zdHJlYW0gTWl4ZXJUaHJlYWRzCisgICAgICAgIC8vIChpZiBhIHZhbGlkIG1hc2spIHRvIGF2b2lkIHByZW1hdHVyZSBkb3dubWl4LgorICAgICAgICAvLyAoMikgUGVyaGFwcyB1c2UgdGhlIG1heGltdW0gc2FtcGxlIHJhdGUgb2YgYWxsIGRvd25zdHJlYW0gTWl4ZXJUaHJlYWRzCisgICAgICAgIC8vIGluc3RlYWQgb2YgdGhlIG91dHB1dCBkZXZpY2Ugc2FtcGxlIHJhdGUgdG8gYXZvaWQgbG9zcyBvZiBoaWdoIGZyZXF1ZW5jeSBpbmZvcm1hdGlvbi4KKyAgICAgICAgLy8gVGhpcyBtYXkgbmVlZCB0byBiZSB1cGRhdGVkIGFzIE1peGVyVGhyZWFkL091dHB1dFRyYWNrcyBhcmUgYWRkZWQgYW5kIG5vdCBoZXJlLgorICAgIH0KIAogICAgIC8vIENhbGN1bGF0ZSBzaXplIG9mIG5vcm1hbCBzaW5rIGJ1ZmZlciByZWxhdGl2ZSB0byB0aGUgSEFMIG91dHB1dCBidWZmZXIgc2l6ZQogICAgIGRvdWJsZSBtdWx0aXBsaWVyID0gMS4wOwpAQCAtMTkwNSw2ICsyMjA0LDEyIEBACiAgICAgQUxPR0koIkhBTCBvdXRwdXQgYnVmZmVyIHNpemUgJXUgZnJhbWVzLCBub3JtYWwgc2luayBidWZmZXIgc2l6ZSAldSBmcmFtZXMiLCBtRnJhbWVDb3VudCwKICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50KTsKIAorICAgIC8vIENoZWNrIGlmIHdlIHdhbnQgdG8gdGhyb3R0bGUgdGhlIHByb2Nlc3NpbmcgdG8gbm8gbW9yZSB0aGFuIDJ4IG5vcm1hbCByYXRlCisgICAgbVRocmVhZFRocm90dGxlID0gcHJvcGVydHlfZ2V0X2Jvb2woImFmLnRocmVhZC50aHJvdHRsZSIsIHRydWUgLyogZGVmYXVsdF92YWx1ZSAqLyk7CisgICAgbVRocmVhZFRocm90dGxlVGltZU1zID0gMDsKKyAgICBtVGhyZWFkVGhyb3R0bGVFbmRNcyA9IDA7CisgICAgbUhhbGZCdWZmZXJNcyA9IG1Ob3JtYWxGcmFtZUNvdW50ICogMTAwMCAvICgyICogbVNhbXBsZVJhdGUpOworCiAgICAgLy8gbVNpbmtCdWZmZXIgaXMgdGhlIHNpbmsgYnVmZmVyLiAgU2l6ZSBpcyBhbHdheXMgbXVsdGlwbGUtb2YtMTYgZnJhbWVzLgogICAgIC8vIE9yaWdpbmFsbHkgdGhpcyB3YXMgaW50MTZfdFtdIGFycmF5LCBuZWVkIHRvIHJlbW92ZSBsZWdhY3kgaW1wbGljYXRpb25zLgogICAgIGZyZWUobVNpbmtCdWZmZXIpOwpAQCAtMTk2Niw3ICsyMjcxLDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgICAgIHVpbnQzMl90IGZyYW1lczsKLSAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5nZXRfcmVuZGVyX3Bvc2l0aW9uKG1PdXRwdXQtPnN0cmVhbSwgJmZyYW1lcyk7CisgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPmdldFJlbmRlclBvc2l0aW9uKCZmcmFtZXMpOwogICAgICAgICAqZHNwRnJhbWVzID0gKHNpemVfdClmcmFtZXM7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQpAQCAtMjAwOCwxMyArMjMxMywxMyBAQAogfQogCiAKLUF1ZGlvRmxpbmdlcjo6QXVkaW9TdHJlYW1PdXQqIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmdldE91dHB1dCgpIGNvbnN0CitBdWRpb1N0cmVhbU91dCogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Z2V0T3V0cHV0KCkgY29uc3QKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHJldHVybiBtT3V0cHV0OwogfQogCi1BdWRpb0ZsaW5nZXI6OkF1ZGlvU3RyZWFtT3V0KiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpjbGVhck91dHB1dCgpCitBdWRpb1N0cmVhbU91dCogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Y2xlYXJPdXRwdXQoKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXVkaW9TdHJlYW1PdXQgKm91dHB1dCA9IG1PdXRwdXQ7CkBAIC0yMTM3LDYgKzI0NDIsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gZnJhbWVzV3JpdHRlbjsKICAgICAgICAgfQorICAgICAgICBtTGF0Y2hEVmFsaWQgPSBmYWxzZTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU5vcm1hbFNpbmstPmdldFRpbWVzdGFtcChtTGF0Y2hELm1UaW1lc3RhbXApOwogICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBzaXplX3QgdG90YWxGcmFtZXNXcml0dGVuID0gbU5vcm1hbFNpbmstPmZyYW1lc1dyaXR0ZW4oKTsKQEAgLTIxNTksOCArMjQ2NSw3IEBACiAgICAgICAgIH0KICAgICAgICAgLy8gRklYTUUgV2Ugc2hvdWxkIGhhdmUgYW4gaW1wbGVtZW50YXRpb24gb2YgdGltZXN0YW1wcyBmb3IgZGlyZWN0IG91dHB1dCB0aHJlYWRzLgogICAgICAgICAvLyBUaGV5IGFyZSB1c2VkIGUuZyBmb3IgbXVsdGljaGFubmVsIFBDTSBwbGF5YmFjayBvdmVyIEhETUkuCi0gICAgICAgIGJ5dGVzV3JpdHRlbiA9IG1PdXRwdXQtPnN0cmVhbS0+d3JpdGUobU91dHB1dC0+c3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKiltU2lua0J1ZmZlciArIG9mZnNldCwgbUJ5dGVzUmVtYWluaW5nKTsKKyAgICAgICAgYnl0ZXNXcml0dGVuID0gbU91dHB1dC0+d3JpdGUoKGNoYXIgKiltU2lua0J1ZmZlciArIG9mZnNldCwgbUJ5dGVzUmVtYWluaW5nKTsKICAgICAgICAgaWYgKG1Vc2VBc3luY1dyaXRlICYmCiAgICAgICAgICAgICAgICAgKChieXRlc1dyaXR0ZW4gPCAwKSB8fCAoYnl0ZXNXcml0dGVuID09IChzc2l6ZV90KW1CeXRlc1JlbWFpbmluZykpKSB7CiAgICAgICAgICAgICAvLyBkbyBub3Qgd2FpdCBmb3IgYXN5bmMgY2FsbGJhY2sgaW4gY2FzZSBvZiBlcnJvciBvZiBmdWxsIHdyaXRlCkBAIC0yMjA2LDkgKzI1MTEsOSBAQAogLyoKIFRoZSBkZXJpdmVkIHZhbHVlcyB0aGF0IGFyZSBjYWNoZWQ6CiAgLSBtU2lua0J1ZmZlclNpemUgZnJvbSBmcmFtZSBjb3VudCAqIGZyYW1lIHNpemUKLSAtIGFjdGl2ZVNsZWVwVGltZSBmcm9tIGFjdGl2ZVNsZWVwVGltZVVzKCkKLSAtIGlkbGVTbGVlcFRpbWUgZnJvbSBpZGxlU2xlZXBUaW1lVXMoKQotIC0gc3RhbmRieURlbGF5IGZyb20gbUFjdGl2ZVNsZWVwVGltZVVzIChESVJFQ1Qgb25seSkKKyAtIG1BY3RpdmVTbGVlcFRpbWVVcyBmcm9tIGFjdGl2ZVNsZWVwVGltZVVzKCkKKyAtIG1JZGxlU2xlZXBUaW1lVXMgZnJvbSBpZGxlU2xlZXBUaW1lVXMoKQorIC0gbVN0YW5kYnlEZWxheU5zIGZyb20gbUFjdGl2ZVNsZWVwVGltZVVzIChESVJFQ1Qgb25seSkKICAtIG1heFBlcmlvZCBmcm9tIGZyYW1lIGNvdW50IGFuZCBzYW1wbGUgcmF0ZSAoTUlYRVIgb25seSkKIAogVGhlIHBhcmFtZXRlcnMgdGhhdCBhZmZlY3QgdGhlc2UgZGVyaXZlZCB2YWx1ZXMgYXJlOgpAQCAtMjIyNSw4ICsyNTMwLDggQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Y2FjaGVQYXJhbWV0ZXJzX2woKQogewogICAgIG1TaW5rQnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUZyYW1lU2l6ZTsKLSAgICBhY3RpdmVTbGVlcFRpbWUgPSBhY3RpdmVTbGVlcFRpbWVVcygpOwotICAgIGlkbGVTbGVlcFRpbWUgPSBpZGxlU2xlZXBUaW1lVXMoKTsKKyAgICBtQWN0aXZlU2xlZXBUaW1lVXMgPSBhY3RpdmVTbGVlcFRpbWVVcygpOworICAgIG1JZGxlU2xlZXBUaW1lVXMgPSBpZGxlU2xlZXBUaW1lVXMoKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjppbnZhbGlkYXRlVHJhY2tzKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKQEAgLTIzOTMsNyArMjY5OCw3IEBACiB7CiAgICAgVmVjdG9yPCBzcDxUcmFjaz4gPiB0cmFja3NUb1JlbW92ZTsKIAotICAgIHN0YW5kYnlUaW1lID0gc3lzdGVtVGltZSgpOworICAgIG1TdGFuZGJ5VGltZU5zID0gc3lzdGVtVGltZSgpOwogCiAgICAgLy8gTUlYRVIKICAgICBuc2Vjc190IGxhc3RXYXJuaW5nID0gMDsKQEAgLTI0MDUsNyArMjcxMCw3IEBACiAgICAgaW50IGxhc3RHZW5lcmF0aW9uID0gMDsKIAogICAgIGNhY2hlUGFyYW1ldGVyc19sKCk7Ci0gICAgc2xlZXBUaW1lID0gaWRsZVNsZWVwVGltZTsKKyAgICBtU2xlZXBUaW1lVXMgPSBtSWRsZVNsZWVwVGltZVVzOwogCiAgICAgaWYgKG1UeXBlID09IE1JWEVSKSB7CiAgICAgICAgIHNsZWVwVGltZVNoaWZ0ID0gMDsKQEAgLTI0NjcsMTkgKzI3NzIsMjkgQEAKICAgICAgICAgICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgewogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVsZWFzZVdha2VMb2NrX2woKTsKKyAgICAgICAgICAgICAgICBib29sIHJlbGVhc2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyB3b3JrcyBhcm91bmQgYSBidWcgaW4gdGhlIG9mZmxvYWQgZHJpdmVyLiBJZGVhbGx5IHdlIHdvdWxkIHJlbGVhc2UKKyAgICAgICAgICAgICAgICAvLyB0aGUgd2FrZSBsb2NrIGV2ZXJ5IHRpbWUsIGJ1dCB0aGF0IGNhdXNlcyB0aGUgbGFzdCBvZmZsb2FkIGJ1ZmZlcihzKSB0byBiZQorICAgICAgICAgICAgICAgIC8vIGRyb3BwZWQgd2hpbGUgdGhlIGRldmljZSBpcyBvbiBiYXR0ZXJ5LCBzbyB3ZSBuZWVkIHRvIGhvbGQgYSB3YWtlIGxvY2sgZHVyaW5nCisgICAgICAgICAgICAgICAgLy8gdGhlIGRyYWluIHBoYXNlLgorICAgICAgICAgICAgICAgIGlmIChtQnl0ZXNSZW1haW5pbmcgJiYgIShtRHJhaW5TZXF1ZW5jZSAmIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VXYWtlTG9ja19sKCk7CisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbVdha2VMb2NrVWlkcy5jbGVhcigpOwogICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3NHZW5lcmF0aW9uKys7CiAgICAgICAgICAgICAgICAgQUxPR1YoIndhaXQgYXN5bmMgY29tcGxldGlvbiIpOwogICAgICAgICAgICAgICAgIG1XYWl0V29ya0NWLndhaXQobUxvY2spOwogICAgICAgICAgICAgICAgIEFMT0dWKCJhc3luYyBjb21wbGV0aW9uL3dha2UiKTsKLSAgICAgICAgICAgICAgICBhY3F1aXJlV2FrZUxvY2tfbCgpOwotICAgICAgICAgICAgICAgIHN0YW5kYnlUaW1lID0gc3lzdGVtVGltZSgpICsgc3RhbmRieURlbGF5OwotICAgICAgICAgICAgICAgIHNsZWVwVGltZSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKHJlbGVhc2VkKSB7CisgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVXYWtlTG9ja19sKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1TdGFuZGJ5VGltZU5zID0gc3lzdGVtVGltZSgpICsgbVN0YW5kYnlEZWxheU5zOworICAgICAgICAgICAgICAgIG1TbGVlcFRpbWVVcyA9IDA7CiAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoIW1BY3RpdmVUcmFja3Muc2l6ZSgpICYmIHN5c3RlbVRpbWUoKSA+IHN0YW5kYnlUaW1lKSB8fAorICAgICAgICAgICAgaWYgKCghbUFjdGl2ZVRyYWNrcy5zaXplKCkgJiYgc3lzdGVtVGltZSgpID4gbVN0YW5kYnlUaW1lTnMpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3VzcGVuZGVkKCkpIHsKICAgICAgICAgICAgICAgICAvLyBwdXQgYXVkaW8gaGFyZHdhcmUgaW50byBzdGFuZGJ5IGFmdGVyIHNob3J0IGRlbGF5CiAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFN0YW5kYnlfbCgpKSB7CkBAIC0yNTE0LDggKzI4MjksOCBAQAogICAgICAgICAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSAwOwogICAgICAgICAgICAgICAgICAgICBjaGVja1NpbGVudE1vZGVfbCgpOwogCi0gICAgICAgICAgICAgICAgICAgIHN0YW5kYnlUaW1lID0gc3lzdGVtVGltZSgpICsgc3RhbmRieURlbGF5OwotICAgICAgICAgICAgICAgICAgICBzbGVlcFRpbWUgPSBpZGxlU2xlZXBUaW1lOworICAgICAgICAgICAgICAgICAgICBtU3RhbmRieVRpbWVOcyA9IHN5c3RlbVRpbWUoKSArIG1TdGFuZGJ5RGVsYXlOczsKKyAgICAgICAgICAgICAgICAgICAgbVNsZWVwVGltZVVzID0gbUlkbGVTbGVlcFRpbWVVczsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1UeXBlID09IE1JWEVSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcFRpbWVTaGlmdCA9IDA7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTI1NDYsMTUgKzI4NjEsMTUgQEAKICAgICAgICAgICAgICAgICB0aHJlYWRMb29wX21peCgpOwogICAgICAgICAgICAgfSBlbHNlIGlmICgobU1peGVyU3RhdHVzICE9IE1JWEVSX0RSQUlOX1RSQUNLKQogICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1NaXhlclN0YXR1cyAhPSBNSVhFUl9EUkFJTl9BTEwpKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhyZWFkTG9vcF9zbGVlcFRpbWUgc2V0cyBzbGVlcFRpbWUgdG8gMCBpZiBkYXRhCisgICAgICAgICAgICAgICAgLy8gdGhyZWFkTG9vcF9zbGVlcFRpbWUgc2V0cyBtU2xlZXBUaW1lVXMgdG8gMCBpZiBkYXRhCiAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSB3cml0dGVuIHRvIEhBTAogICAgICAgICAgICAgICAgIHRocmVhZExvb3Bfc2xlZXBUaW1lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNsZWVwVGltZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKG1TbGVlcFRpbWVVcyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50V3JpdGVMZW5ndGggPSBtU2lua0J1ZmZlclNpemU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gRWl0aGVyIHRocmVhZExvb3BfbWl4KCkgb3IgdGhyZWFkTG9vcF9zbGVlcFRpbWUoKSBzaG91bGQgaGF2ZSBzZXQKLSAgICAgICAgICAgIC8vIG1NaXhlckJ1ZmZlciB3aXRoIGRhdGEgaWYgbU1peGVyQnVmZmVyVmFsaWQgaXMgdHJ1ZSBhbmQgc2xlZXBUaW1lID09IDAuCisgICAgICAgICAgICAvLyBtTWl4ZXJCdWZmZXIgd2l0aCBkYXRhIGlmIG1NaXhlckJ1ZmZlclZhbGlkIGlzIHRydWUgYW5kIG1TbGVlcFRpbWVVcyA9PSAwLgogICAgICAgICAgICAgLy8gTWVyZ2UgbU1peGVyQnVmZmVyIGRhdGEgaW50byBtRWZmZWN0QnVmZmVyIChpZiBhbnkgZWZmZWN0cyBhcmUgdmFsaWQpCiAgICAgICAgICAgICAvLyBvciBtU2lua0J1ZmZlciAoaWYgdGhlcmUgYXJlIG5vIGVmZmVjdHMpLgogICAgICAgICAgICAgLy8KQEAgLTI1NjIsNyArMjg3Nyw3IEBACiAgICAgICAgICAgICAvLyBzdXBwb3J0IGhpZ2hlciBwcmVjaXNpb24sIHRoaXMgbmVlZHMgdG8gbW92ZS4KICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAvLyBtTWl4ZXJCdWZmZXJWYWxpZCBpcyBvbmx5IHNldCB0cnVlIGJ5IE1peGVyVGhyZWFkOjpwcmVwYXJlVHJhY2tzX2woKS4KLSAgICAgICAgICAgIC8vIFRPRE8gdXNlIHNsZWVwVGltZSA9PSAwIGFzIGFuIGFkZGl0aW9uYWwgY29uZGl0aW9uLgorICAgICAgICAgICAgLy8gVE9ETyB1c2UgbVNsZWVwVGltZVVzID09IDAgYXMgYW4gYWRkaXRpb25hbCBjb25kaXRpb24uCiAgICAgICAgICAgICBpZiAobU1peGVyQnVmZmVyVmFsaWQpIHsKICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIgPSBtRWZmZWN0QnVmZmVyVmFsaWQgPyBtRWZmZWN0QnVmZmVyIDogbVNpbmtCdWZmZXI7CiAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gbUVmZmVjdEJ1ZmZlclZhbGlkID8gbUVmZmVjdEJ1ZmZlckZvcm1hdCA6IG1Gb3JtYXQ7CkBAIC0yNTczLDE0ICsyODg4LDE0IEBACiAKICAgICAgICAgICAgIG1CeXRlc1JlbWFpbmluZyA9IG1DdXJyZW50V3JpdGVMZW5ndGg7CiAgICAgICAgICAgICBpZiAoaXNTdXNwZW5kZWQoKSkgewotICAgICAgICAgICAgICAgIHNsZWVwVGltZSA9IHN1c3BlbmRTbGVlcFRpbWVVcygpOworICAgICAgICAgICAgICAgIG1TbGVlcFRpbWVVcyA9IHN1c3BlbmRTbGVlcFRpbWVVcygpOwogICAgICAgICAgICAgICAgIC8vIHNpbXVsYXRlIHdyaXRlIHRvIEhBTCB3aGVuIHN1c3BlbmRlZAogICAgICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gKz0gbVNpbmtCdWZmZXJTaXplOwogICAgICAgICAgICAgICAgIG1CeXRlc1JlbWFpbmluZyA9IDA7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIG9ubHkgcHJvY2VzcyBlZmZlY3RzIGlmIHdlJ3JlIGdvaW5nIHRvIHdyaXRlCi0gICAgICAgICAgICBpZiAoc2xlZXBUaW1lID09IDAgJiYgbVR5cGUgIT0gT0ZGTE9BRCkgeworICAgICAgICAgICAgaWYgKG1TbGVlcFRpbWVVcyA9PSAwICYmIG1UeXBlICE9IE9GRkxPQUQpIHsKICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdENoYWlucy5zaXplKCk7IGkgKyspIHsKICAgICAgICAgICAgICAgICAgICAgZWZmZWN0Q2hhaW5zW2ldLT5wcm9jZXNzX2woKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yNTk5LDcgKzI5MTQsNyBAQAogICAgICAgICAvLyBPbmx5IGlmIHRoZSBFZmZlY3RzIGJ1ZmZlciBpcyBlbmFibGVkIGFuZCB0aGVyZSBpcyBkYXRhIGluIHRoZQogICAgICAgICAvLyBFZmZlY3RzIGJ1ZmZlciAoYnVmZmVyIHZhbGlkKSwgd2UgbmVlZCB0bwogICAgICAgICAvLyBjb3B5IGludG8gdGhlIHNpbmsgYnVmZmVyLgotICAgICAgICAvLyBUT0RPIHVzZSBzbGVlcFRpbWUgPT0gMCBhcyBhbiBhZGRpdGlvbmFsIGNvbmRpdGlvbi4KKyAgICAgICAgLy8gVE9ETyB1c2UgbVNsZWVwVGltZVVzID09IDAgYXMgYW4gYWRkaXRpb25hbCBjb25kaXRpb24uCiAgICAgICAgIGlmIChtRWZmZWN0QnVmZmVyVmFsaWQpIHsKICAgICAgICAgICAgIC8vQUxPR1YoIndyaXRpbmcgZWZmZWN0IGJ1ZmZlciB0byBzaW5rIGJ1ZmZlciBmb3JtYXQgJSN4IiwgbUZvcm1hdCk7CiAgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KG1TaW5rQnVmZmVyLCBtRm9ybWF0LCBtRWZmZWN0QnVmZmVyLCBtRWZmZWN0QnVmZmVyRm9ybWF0LApAQCAtMjYxMCwxMCArMjkyNSwxMSBAQAogICAgICAgICB1bmxvY2tFZmZlY3RDaGFpbnMoZWZmZWN0Q2hhaW5zKTsKIAogICAgICAgICBpZiAoIXdhaXRpbmdBc3luY0NhbGxiYWNrKCkpIHsKLSAgICAgICAgICAgIC8vIHNsZWVwVGltZSA9PSAwIG1lYW5zIHdlIG11c3Qgd3JpdGUgdG8gYXVkaW8gaGFyZHdhcmUKLSAgICAgICAgICAgIGlmIChzbGVlcFRpbWUgPT0gMCkgeworICAgICAgICAgICAgLy8gbVNsZWVwVGltZVVzID09IDAgbWVhbnMgd2UgbXVzdCB3cml0ZSB0byBhdWRpbyBoYXJkd2FyZQorICAgICAgICAgICAgaWYgKG1TbGVlcFRpbWVVcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgc3NpemVfdCByZXQgPSAwOwogICAgICAgICAgICAgICAgIGlmIChtQnl0ZXNSZW1haW5pbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgc3NpemVfdCByZXQgPSB0aHJlYWRMb29wX3dyaXRlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHRocmVhZExvb3Bfd3JpdGUoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1JlbWFpbmluZyA9IDA7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0yNjI0LDExICsyOTQwLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAobU1peGVyU3RhdHVzID09IE1JWEVSX0RSQUlOX0FMTCkpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyZWFkTG9vcF9kcmFpbigpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVR5cGUgPT0gTUlYRVIpIHsKKyAgICAgICAgICAgICAgICBpZiAobVR5cGUgPT0gTUlYRVIgJiYgIW1TdGFuZGJ5KSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIGJsb2NrZWQgZGV0ZWN0aW9uCiAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZSgpOwogICAgICAgICAgICAgICAgICAgICBuc2Vjc190IGRlbHRhID0gbm93IC0gbUxhc3RXcml0ZVRpbWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVN0YW5kYnkgJiYgZGVsdGEgPiBtYXhQZXJpb2QpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhID4gbWF4UGVyaW9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtRGVsYXllZFdyaXRlcysrOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChub3cgLSBsYXN0V2FybmluZykgPiBrV2FybmluZ1Rocm90dGxlTnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfTkFNRSgidW5kZXJydW4iKTsKQEAgLTI2MzcsMTAgKzI5NTMsNDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0V2FybmluZyA9IG5vdzsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChtVGhyZWFkVGhyb3R0bGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX1JFQURZIC8vIHdlIGFyZSBtaXhpbmcgKGFjdGl2ZSB0cmFja3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmV0ID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB3cm90ZSBzb21ldGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIExpbWl0IE1peGVyVGhyZWFkIGRhdGEgcHJvY2Vzc2luZyB0byBubyBtb3JlIHRoYW4gdHdpY2UgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZCBwcm9jZXNzaW5nIHJhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBoZWxwcyBwcmV2ZW50IHVuZGVycnVucyB3aXRoIE51UGxheWVyIGFuZCBvdGhlciBhcHBsaWNhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIG1heSBzZXQgdXAgYnVmZmVycyB0aGF0IGFyZSBjbG9zZSB0byB0aGUgbWluaW11bSBzaXplLCBvciB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZXAgYnVmZmVycywgYW5kIHJlbHkgb24gYSBkb3VibGUtYnVmZmVyaW5nIHNsZWVwIHN0cmF0ZWd5IHRvIGZpbGwuCisgICAgICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHRocm90dGxlIHNtb290aHMgb3V0IHN1ZGRlbiBsYXJnZSBkYXRhIGRyYWlucyBmcm9tIHRoZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuIHdoZW4gaXQgY29tZXMgb3V0IG9mIHN0YW5kYnksIHdoaWNoIG9mdGVuIGNhdXNlcyBwcm9ibGVtcyB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAoMSkgbWl4ZXIgdGhyZWFkcyB3aXRob3V0IGEgZmFzdCBtaXhlciAod2hpY2ggaGFzIGl0cyBvd24gd2FybS11cCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICgyKSBtaW5pbXVtIGJ1ZmZlciBzaXplZCB0cmFja3MgKGV2ZW4gaWYgdGhlIHRyYWNrIGlzIGZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhlIGFwcCB3b24ndCBmaWxsIGZhc3QgZW5vdWdoIHRvIGhhbmRsZSB0aGUgc3VkZGVuIGRyYXcpLgorCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGRlbHRhTXMgPSBkZWx0YSAvIDEwMDAwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHRocm90dGxlTXMgPSBtSGFsZkJ1ZmZlck1zIC0gZGVsdGFNczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc2lnbmVkKW1IYWxmQnVmZmVyTXMgPj0gdGhyb3R0bGVNcyAmJiB0aHJvdHRsZU1zID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzbGVlcCh0aHJvdHRsZU1zICogMTAwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZ5IG9mIHRocm90dGxlIHN0YXJ0IG9uIHZlcmJvc2UgbG9nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1ZfSUYobVRocmVhZFRocm90dGxlRW5kTXMgPT0gbVRocmVhZFRocm90dGxlVGltZU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1peGVyKCVwKSB0aHJvdHRsZSBiZWdpbjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJldCglemQpIGRlbHRhTXMoJWQpIHJlcXVpcmVzIHNsZWVwICVkIG1zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIHJldCwgZGVsdGFNcywgdGhyb3R0bGVNcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZFRocm90dGxlVGltZU1zICs9IHRocm90dGxlTXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRpZmYgPSBtVGhyZWFkVGhyb3R0bGVUaW1lTXMgLSBtVGhyZWFkVGhyb3R0bGVFbmRNczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZiA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZ5IG9mIHRocm90dGxlIGVuZCBvbiBkZWJ1ZyBsb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIm1peGVyKCVwKSB0aHJvdHRsZSBlbmQ6IHRocm90dGxlIHRpbWUoJXUpIiwgdGhpcywgZGlmZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRUaHJvdHRsZUVuZE1zID0gbVRocmVhZFRocm90dGxlVGltZU1zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1c2xlZXAoc2xlZXBUaW1lKTsKKyAgICAgICAgICAgICAgICBBVFJBQ0VfQkVHSU4oInNsZWVwIik7CisgICAgICAgICAgICAgICAgdXNsZWVwKG1TbGVlcFRpbWVVcyk7CisgICAgICAgICAgICAgICAgQVRSQUNFX0VORCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTI3MTEsOCArMzA2NSw3IEBACiAgICAgaWYgKChtVHlwZSA9PSBPRkZMT0FEIHx8IG1UeXBlID09IERJUkVDVCkKICAgICAgICAgICAgICYmIG1PdXRwdXQgIT0gTlVMTCAmJiBtT3V0cHV0LT5zdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24pIHsKICAgICAgICAgdWludDY0X3QgcG9zaXRpb242NDsKLSAgICAgICAgaW50IHJldCA9IG1PdXRwdXQtPnN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXQtPnN0cmVhbSwgJnBvc2l0aW9uNjQsICZ0aW1lc3RhbXAubVRpbWUpOworICAgICAgICBpbnQgcmV0ID0gbU91dHB1dC0+Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24oJnBvc2l0aW9uNjQsICZ0aW1lc3RhbXAubVRpbWUpOwogICAgICAgICBpZiAocmV0ID09IDApIHsKICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSAodWludDMyX3QpcG9zaXRpb242NDsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTI3MjEsMjEgKzMwNzQsODMgQEAKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OmNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCit7CisgICAgLy8gaWYgISZJRExFLCBob2xkcyB0aGUgRmFzdE1peGVyIHN0YXRlIHRvIHJlc3RvcmUgYWZ0ZXIgbmV3IHBhcmFtZXRlcnMgcHJvY2Vzc2VkCisgICAgRmFzdE1peGVyU3RhdGU6OkNvbW1hbmQgcHJldmlvdXNDb21tYW5kID0gRmFzdE1peGVyU3RhdGU6OkhPVF9JRExFOworICAgIGlmIChtRmFzdE1peGVyICE9IDApIHsKKyAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdE1peGVyLT5zcSgpOworICAgICAgICBGYXN0TWl4ZXJTdGF0ZSAqc3RhdGUgPSBzcS0+YmVnaW4oKTsKKyAgICAgICAgaWYgKCEoc3RhdGUtPm1Db21tYW5kICYgRmFzdE1peGVyU3RhdGU6OklETEUpKSB7CisgICAgICAgICAgICBwcmV2aW91c0NvbW1hbmQgPSBzdGF0ZS0+bUNvbW1hbmQ7CisgICAgICAgICAgICBzdGF0ZS0+bUNvbW1hbmQgPSBGYXN0TWl4ZXJTdGF0ZTo6SE9UX0lETEU7CisgICAgICAgICAgICBzcS0+ZW5kKCk7CisgICAgICAgICAgICBzcS0+cHVzaChGYXN0TWl4ZXJTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9BQ0tFRCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcS0+ZW5kKGZhbHNlIC8qZGlkTW9kaWZ5Ki8pOworICAgICAgICB9CisgICAgfQorICAgIHN0YXR1c190IHN0YXR1cyA9IFBsYXliYWNrVGhyZWFkOjpjcmVhdGVBdWRpb1BhdGNoX2wocGF0Y2gsIGhhbmRsZSk7CisKKyAgICBpZiAoIShwcmV2aW91c0NvbW1hbmQgJiBGYXN0TWl4ZXJTdGF0ZTo6SURMRSkpIHsKKyAgICAgICAgQUxPR19BU1NFUlQobUZhc3RNaXhlciAhPSAwKTsKKyAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSAqc3EgPSBtRmFzdE1peGVyLT5zcSgpOworICAgICAgICBGYXN0TWl4ZXJTdGF0ZSAqc3RhdGUgPSBzcS0+YmVnaW4oKTsKKyAgICAgICAgQUxPR19BU1NFUlQoc3RhdGUtPm1Db21tYW5kID09IEZhc3RNaXhlclN0YXRlOjpIT1RfSURMRSk7CisgICAgICAgIHN0YXRlLT5tQ29tbWFuZCA9IHByZXZpb3VzQ29tbWFuZDsKKyAgICAgICAgc3EtPmVuZCgpOworICAgICAgICBzcS0+cHVzaChGYXN0TWl4ZXJTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9QVVNIRUQpOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgaWYgKG1PdXRwdXQtPmF1ZGlvSHdEZXYtPnZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7Ci0gICAgICAgIC8vIHN0b3JlIG5ldyBkZXZpY2UgYW5kIHNlbmQgdG8gZWZmZWN0cwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IEFVRElPX0RFVklDRV9OT05FOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgewotICAgICAgICAgICAgdHlwZSB8PSBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlOwotICAgICAgICB9Ci0gICAgICAgIG1PdXREZXZpY2UgPSB0eXBlOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldERldmljZV9sKG1PdXREZXZpY2UpOworCisgICAgLy8gc3RvcmUgbmV3IGRldmljZSBhbmQgc2VuZCB0byBlZmZlY3RzCisgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgeworICAgICAgICB0eXBlIHw9IHBhdGNoLT5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGU7CisgICAgfQorCisjaWZkZWYgQUREX0JBVFRFUllfREFUQQorICAgIC8vIHdoZW4gY2hhbmdpbmcgdGhlIGF1ZGlvIG91dHB1dCBkZXZpY2UsIGNhbGwgYWRkQmF0dGVyeURhdGEgdG8gbm90aWZ5CisgICAgLy8gdGhlIGNoYW5nZQorICAgIGlmIChtT3V0RGV2aWNlICE9IHR5cGUpIHsKKyAgICAgICAgdWludDMyX3QgcGFyYW1zID0gMDsKKyAgICAgICAgLy8gY2hlY2sgd2hldGhlciBzcGVha2VyIGlzIG9uCisgICAgICAgIGlmICh0eXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSB7CisgICAgICAgICAgICBwYXJhbXMgfD0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhU3BlYWtlck9uOwogICAgICAgICB9CiAKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVdpdGhvdXRTcGVha2VyCisgICAgICAgICAgICA9IEFVRElPX0RFVklDRV9PVVRfQUxMICYgfkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgLy8gY2hlY2sgaWYgYW55IG90aGVyIGRldmljZSAoZXhjZXB0IHNwZWFrZXIpIGlzIG9uCisgICAgICAgIGlmICh0eXBlICYgZGV2aWNlV2l0aG91dFNwZWFrZXIpIHsKKyAgICAgICAgICAgIHBhcmFtcyB8PSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFPdGhlckF1ZGlvRGV2aWNlT247CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFyYW1zICE9IDApIHsKKyAgICAgICAgICAgIGFkZEJhdHRlcnlEYXRhKHBhcmFtcyk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgeworICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbCh0eXBlKTsKKyAgICB9CisKKyAgICAvLyBtUHJldk91dERldmljZSBpcyB0aGUgbGF0ZXN0IGRldmljZSBzZXQgYnkgY3JlYXRlQXVkaW9QYXRjaF9sKCkuIEl0IGlzIG5vdCBzZXQgd2hlbgorICAgIC8vIHRoZSB0aHJlYWQgaXMgY3JlYXRlZCBzbyB0aGF0IHRoZSBmaXJzdCBwYXRjaCBjcmVhdGlvbiB0cmlnZ2VycyBhbiBpb0NvbmZpZ0NoYW5nZWQgY2FsbGJhY2sKKyAgICBib29sIGNvbmZpZ0NoYW5nZWQgPSBtUHJldk91dERldmljZSAhPSB0eXBlOworICAgIG1PdXREZXZpY2UgPSB0eXBlOworICAgIG1QYXRjaCA9ICpwYXRjaDsKKworICAgIGlmIChtT3V0cHV0LT5hdWRpb0h3RGV2LT52ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewogICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UgPSBtT3V0cHV0LT5hdWRpb0h3RGV2LT5od0RldmljZSgpOwogICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+Y3JlYXRlX2F1ZGlvX3BhdGNoKGh3RGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NvdXJjZXMsCkBAIC0yNzQ0LDE5ICszMTU5LDc1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlKTsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HX0FTU0VSVChmYWxzZSwgImNyZWF0ZUF1ZGlvUGF0Y2hfbCgpIGNhbGxlZCBvbiBhIHByZSAzLjAgSEFMIik7CisgICAgICAgIGNoYXIgKmFkZHJlc3M7CisgICAgICAgIGlmIChzdHJjbXAocGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcywgIiIpICE9IDApIHsKKyAgICAgICAgICAgIC8vRklYTUU6IHdlIG9ubHkgc3VwcG9ydCBhZGRyZXNzIG9uIGZpcnN0IHNpbmsgd2l0aCBIQUwgdmVyc2lvbiA8IDMuMAorICAgICAgICAgICAgYWRkcmVzcyA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UudHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRyZXNzID0gKGNoYXIgKiljYWxsb2MoMSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihTdHJpbmc4KGFkZHJlc3MpKTsKKyAgICAgICAgZnJlZShhZGRyZXNzKTsKKyAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9ST1VUSU5HKSwgKGludCl0eXBlKTsKKyAgICAgICAgc3RhdHVzID0gbU91dHB1dC0+c3RyZWFtLT5jb21tb24uc2V0X3BhcmFtZXRlcnMoJm1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLAorICAgICAgICAgICAgICAgIHBhcmFtLnRvU3RyaW5nKCkuc3RyaW5nKCkpOworICAgICAgICAqaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgfQorICAgIGlmIChjb25maWdDaGFuZ2VkKSB7CisgICAgICAgIG1QcmV2T3V0RGV2aWNlID0gdHlwZTsKKyAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpyZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICAvLyBpZiAhJklETEUsIGhvbGRzIHRoZSBGYXN0TWl4ZXIgc3RhdGUgdG8gcmVzdG9yZSBhZnRlciBuZXcgcGFyYW1ldGVycyBwcm9jZXNzZWQKKyAgICBGYXN0TWl4ZXJTdGF0ZTo6Q29tbWFuZCBwcmV2aW91c0NvbW1hbmQgPSBGYXN0TWl4ZXJTdGF0ZTo6SE9UX0lETEU7CisgICAgaWYgKG1GYXN0TWl4ZXIgIT0gMCkgeworICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlICpzcSA9IG1GYXN0TWl4ZXItPnNxKCk7CisgICAgICAgIEZhc3RNaXhlclN0YXRlICpzdGF0ZSA9IHNxLT5iZWdpbigpOworICAgICAgICBpZiAoIShzdGF0ZS0+bUNvbW1hbmQgJiBGYXN0TWl4ZXJTdGF0ZTo6SURMRSkpIHsKKyAgICAgICAgICAgIHByZXZpb3VzQ29tbWFuZCA9IHN0YXRlLT5tQ29tbWFuZDsKKyAgICAgICAgICAgIHN0YXRlLT5tQ29tbWFuZCA9IEZhc3RNaXhlclN0YXRlOjpIT1RfSURMRTsKKyAgICAgICAgICAgIHNxLT5lbmQoKTsKKyAgICAgICAgICAgIHNxLT5wdXNoKEZhc3RNaXhlclN0YXRlUXVldWU6OkJMT0NLX1VOVElMX0FDS0VEKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNxLT5lbmQoZmFsc2UgLypkaWRNb2RpZnkqLyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBQbGF5YmFja1RocmVhZDo6cmVsZWFzZUF1ZGlvUGF0Y2hfbChoYW5kbGUpOworCisgICAgaWYgKCEocHJldmlvdXNDb21tYW5kICYgRmFzdE1peGVyU3RhdGU6OklETEUpKSB7CisgICAgICAgIEFMT0dfQVNTRVJUKG1GYXN0TWl4ZXIgIT0gMCk7CisgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgKnNxID0gbUZhc3RNaXhlci0+c3EoKTsKKyAgICAgICAgRmFzdE1peGVyU3RhdGUgKnN0YXRlID0gc3EtPmJlZ2luKCk7CisgICAgICAgIEFMT0dfQVNTRVJUKHN0YXRlLT5tQ29tbWFuZCA9PSBGYXN0TWl4ZXJTdGF0ZTo6SE9UX0lETEUpOworICAgICAgICBzdGF0ZS0+bUNvbW1hbmQgPSBwcmV2aW91c0NvbW1hbmQ7CisgICAgICAgIHNxLT5lbmQoKTsKKyAgICAgICAgc3EtPnB1c2goRmFzdE1peGVyU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfUFVTSEVEKTsKKyAgICB9CisKICAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKworICAgIG1PdXREZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKwogICAgIGlmIChtT3V0cHV0LT5hdWRpb0h3RGV2LT52ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewogICAgICAgICBhdWRpb19od19kZXZpY2VfdCAqaHdEZXZpY2UgPSBtT3V0cHV0LT5hdWRpb0h3RGV2LT5od0RldmljZSgpOwogICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+cmVsZWFzZV9hdWRpb19wYXRjaChod0RldmljZSwgaGFuZGxlKTsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HX0FTU0VSVChmYWxzZSwgInJlbGVhc2VBdWRpb1BhdGNoX2woKSBjYWxsZWQgb24gYSBwcmUgMy4wIEhBTCIpOworICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKKyAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9ST1VUSU5HKSwgMCk7CisgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKKyAgICAgICAgICAgICAgICBwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTI3ODQsOCArMzI1NSw4IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6Ok1peGVyVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHR5cGVfdCB0eXBlKQotICAgIDogICBQbGF5YmFja1RocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQsIGRldmljZSwgdHlwZSksCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBib29sIHN5c3RlbVJlYWR5LCB0eXBlX3QgdHlwZSkKKyAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UsIHR5cGUsIHN5c3RlbVJlYWR5KSwKICAgICAgICAgLy8gbUF1ZGlvTWl4ZXIgYmVsb3cKICAgICAgICAgLy8gbUZhc3RNaXhlciBiZWxvdwogICAgICAgICBtRmFzdE1peGVyRnV0ZXgoMCkKQEAgLTI4MDAsNiArMzI3MSwxMiBAQAogICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQpOwogICAgIG1BdWRpb01peGVyID0gbmV3IEF1ZGlvTWl4ZXIobU5vcm1hbEZyYW1lQ291bnQsIG1TYW1wbGVSYXRlKTsKIAorICAgIGlmICh0eXBlID09IERVUExJQ0FUSU5HKSB7CisgICAgICAgIC8vIFRoZSBEdXBsaWNhdGluZyB0aHJlYWQgdXNlcyB0aGUgQXVkaW9NaXhlciBhbmQgZGVsaXZlcnMgZGF0YSB0byBPdXRwdXRUcmFja3MKKyAgICAgICAgLy8gKGRvd25zdHJlYW0gTWl4ZXJUaHJlYWRzKSBpbiBEdXBsaWNhdGluZ1RocmVhZDo6dGhyZWFkTG9vcF93cml0ZSgpLgorICAgICAgICAvLyBEbyBub3QgY3JlYXRlIG9yIHVzZSBtRmFzdE1peGVyLCBtT3V0cHV0U2luaywgbVBpcGVTaW5rLCBvciBtTm9ybWFsU2luay4KKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICAvLyBjcmVhdGUgYW4gTkJBSU8gc2luayBmb3IgdGhlIEhBTCBvdXRwdXQgc3RyZWFtLCBhbmQgbmVnb3RpYXRlCiAgICAgbU91dHB1dFNpbmsgPSBuZXcgQXVkaW9TdHJlYW1PdXRTaW5rKG91dHB1dC0+c3RyZWFtKTsKICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7CkBAIC0yODQxLDYgKzMzMTgsNyBAQAogICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gbU91dHB1dFNpbmstPmZvcm1hdCgpOwogICAgICAgICBOQkFJT19Gb3JtYXQgb3JpZ2Zvcm1hdCA9IGZvcm1hdDsKICAgICAgICAgLy8gYWRqdXN0IGZvcm1hdCB0byBtYXRjaCB0aGF0IG9mIHRoZSBGYXN0IE1peGVyCisgICAgICAgIEFMT0dWKCJmb3JtYXQgY2hhbmdlZCBmcm9tICVkIHRvICVkIiwgZm9ybWF0Lm1Gb3JtYXQsIGZhc3RNaXhlckZvcm1hdCk7CiAgICAgICAgIGZvcm1hdC5tRm9ybWF0ID0gZmFzdE1peGVyRm9ybWF0OwogICAgICAgICBmb3JtYXQubUZyYW1lU2l6ZSA9IGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0Lm1Gb3JtYXQpICogZm9ybWF0Lm1DaGFubmVsQ291bnQ7CiAKQEAgLTI5MTEsMTEgKzMzODksNyBAQAogICAgICAgICAvLyBzdGFydCB0aGUgZmFzdCBtaXhlcgogICAgICAgICBtRmFzdE1peGVyLT5ydW4oIkZhc3RNaXhlciIsIFBSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiAgICAgICAgIHBpZF90IHRpZCA9IG1GYXN0TWl4ZXItPmdldFRpZCgpOwotICAgICAgICBpbnQgZXJyID0gcmVxdWVzdFByaW9yaXR5KGdldHBpZF9jYWNoZWQsIHRpZCwga1ByaW9yaXR5RmFzdE1peGVyKTsKLSAgICAgICAgaWYgKGVyciAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiUG9saWN5IFNDSEVEX0ZJRk8gcHJpb3JpdHkgJWQgaXMgdW5hdmFpbGFibGUgZm9yIHBpZCAlZCB0aWQgJWQ7IGVycm9yICVkIiwKLSAgICAgICAgICAgICAgICAgICAga1ByaW9yaXR5RmFzdE1peGVyLCBnZXRwaWRfY2FjaGVkLCB0aWQsIGVycik7Ci0gICAgICAgIH0KKyAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWRfY2FjaGVkLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlcik7CiAKICNpZmRlZiBBVURJT19XQVRDSERPRwogICAgICAgICAvLyBjcmVhdGUgYW5kIHN0YXJ0IHRoZSB3YXRjaGRvZwpAQCAtMjkyMywxMSArMzM5Nyw3IEBACiAgICAgICAgIG1BdWRpb1dhdGNoZG9nLT5zZXREdW1wKCZtQXVkaW9XYXRjaGRvZ0R1bXApOwogICAgICAgICBtQXVkaW9XYXRjaGRvZy0+cnVuKCJBdWRpb1dhdGNoZG9nIiwgUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKICAgICAgICAgdGlkID0gbUF1ZGlvV2F0Y2hkb2ctPmdldFRpZCgpOwotICAgICAgICBlcnIgPSByZXF1ZXN0UHJpb3JpdHkoZ2V0cGlkX2NhY2hlZCwgdGlkLCBrUHJpb3JpdHlGYXN0TWl4ZXIpOwotICAgICAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCJQb2xpY3kgU0NIRURfRklGTyBwcmlvcml0eSAlZCBpcyB1bmF2YWlsYWJsZSBmb3IgcGlkICVkIHRpZCAlZDsgZXJyb3IgJWQiLAotICAgICAgICAgICAgICAgICAgICBrUHJpb3JpdHlGYXN0TWl4ZXIsIGdldHBpZF9jYWNoZWQsIHRpZCwgZXJyKTsKLSAgICAgICAgfQorICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZF9jYWNoZWQsIHRpZCwga1ByaW9yaXR5RmFzdE1peGVyKTsKICNlbmRpZgogCiAgICAgfQpAQCAtMzAyMCw4ICszNDkwLDEwIEBACiAjZW5kaWYKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN0YXRlLT5tQ29tbWFuZCA9IEZhc3RNaXhlclN0YXRlOjpNSVhfV1JJVEU7CisjaWZkZWYgRkFTVF9USFJFQURfU1RBVElTVElDUwogICAgICAgICAgICAgbUZhc3RNaXhlckR1bXBTdGF0ZS5pbmNyZWFzZVNhbXBsaW5nTihtQXVkaW9GbGluZ2VyLT5pc0xvd1JhbURldmljZSgpID8KLSAgICAgICAgICAgICAgICAgICAgRmFzdE1peGVyRHVtcFN0YXRlOjprU2FtcGxpbmdOZm9yTG93UmFtRGV2aWNlIDogRmFzdE1peGVyRHVtcFN0YXRlOjprU2FtcGxpbmdOKTsKKyAgICAgICAgICAgICAgICBGYXN0VGhyZWFkRHVtcFN0YXRlOjprU2FtcGxpbmdOZm9yTG93UmFtRGV2aWNlIDogRmFzdFRocmVhZER1bXBTdGF0ZTo6a1NhbXBsaW5nTik7CisjZW5kaWYKICAgICAgICAgICAgIHNxLT5lbmQoKTsKICAgICAgICAgICAgIHNxLT5wdXNoKEZhc3RNaXhlclN0YXRlUXVldWU6OkJMT0NLX1VOVElMX1BVU0hFRCk7CiAgICAgICAgICAgICBpZiAoa1VzZUZhc3RNaXhlciA9PSBGYXN0TWl4ZXJfRHluYW1pYykgewpAQCAtMzA4Myw3ICszNTU1LDcgQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6dGhyZWFkTG9vcF9zdGFuZGJ5KCkKIHsKICAgICBBTE9HVigiQXVkaW8gaGFyZHdhcmUgZW50ZXJpbmcgc3RhbmRieSwgbWl4ZXIgJXAsIHN1c3BlbmQgY291bnQgJWQiLCB0aGlzLCBtU3VzcGVuZGVkKTsKLSAgICBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zdGFuZGJ5KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgbU91dHB1dC0+c3RhbmRieSgpOwogICAgIGlmIChtVXNlQXN5bmNXcml0ZSAhPSAwKSB7CiAgICAgICAgIC8vIGRpc2NhcmQgYW55IHBlbmRpbmcgZHJhaW4gb3Igd3JpdGUgYWNrIGJ5IGluY3JlbWVudGluZyBzZXF1ZW5jZQogICAgICAgICBtV3JpdGVBY2tTZXF1ZW5jZSA9IChtV3JpdGVBY2tTZXF1ZW5jZSArIDIpICYgfjE7CkBAIC0zMTI0LDExICszNTk2LDExIEBACiAgICAgLy8gT25seSBpbmNyZWFzZSBzbGVlcCB0aW1lIGlmIHRoZSBtaXhlciBpcyByZWFkeSBmb3IgdHdvIGNvbnNlY3V0aXZlIHRpbWVzIHRvIGF2b2lkCiAgICAgLy8gdGhhdCBhIHN0ZWFkeSBzdGF0ZSBvZiBhbHRlcm5hdGluZyByZWFkeS9ub3QgcmVhZHkgY29uZGl0aW9ucyBrZWVwcyB0aGUgc2xlZXAgdGltZQogICAgIC8vIHN1Y2ggdGhhdCB3ZSB3b3VsZCB1bmRlcnJ1biB0aGUgYXVkaW8gSEFMLgotICAgIGlmICgoc2xlZXBUaW1lID09IDApICYmIChzbGVlcFRpbWVTaGlmdCA+IDApKSB7CisgICAgaWYgKChtU2xlZXBUaW1lVXMgPT0gMCkgJiYgKHNsZWVwVGltZVNoaWZ0ID4gMCkpIHsKICAgICAgICAgc2xlZXBUaW1lU2hpZnQtLTsKICAgICB9Ci0gICAgc2xlZXBUaW1lID0gMDsKLSAgICBzdGFuZGJ5VGltZSA9IHN5c3RlbVRpbWUoKSArIHN0YW5kYnlEZWxheTsKKyAgICBtU2xlZXBUaW1lVXMgPSAwOworICAgIG1TdGFuZGJ5VGltZU5zID0gc3lzdGVtVGltZSgpICsgbVN0YW5kYnlEZWxheU5zOwogICAgIC8vVE9ETzogZGVsYXkgc3RhbmRieSB3aGVuIGVmZmVjdHMgaGF2ZSBhIHRhaWwKIAogfQpAQCAtMzEzNywxMSArMzYwOSwxMSBAQAogewogICAgIC8vIElmIG5vIHRyYWNrcyBhcmUgcmVhZHksIHNsZWVwIG9uY2UgZm9yIHRoZSBkdXJhdGlvbiBvZiBhbiBvdXRwdXQKICAgICAvLyBidWZmZXIgc2l6ZSwgdGhlbiB3cml0ZSAwcyB0byB0aGUgb3V0cHV0Ci0gICAgaWYgKHNsZWVwVGltZSA9PSAwKSB7CisgICAgaWYgKG1TbGVlcFRpbWVVcyA9PSAwKSB7CiAgICAgICAgIGlmIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQpIHsKLSAgICAgICAgICAgIHNsZWVwVGltZSA9IGFjdGl2ZVNsZWVwVGltZSA+PiBzbGVlcFRpbWVTaGlmdDsKLSAgICAgICAgICAgIGlmIChzbGVlcFRpbWUgPCBrTWluVGhyZWFkU2xlZXBUaW1lVXMpIHsKLSAgICAgICAgICAgICAgICBzbGVlcFRpbWUgPSBrTWluVGhyZWFkU2xlZXBUaW1lVXM7CisgICAgICAgICAgICBtU2xlZXBUaW1lVXMgPSBtQWN0aXZlU2xlZXBUaW1lVXMgPj4gc2xlZXBUaW1lU2hpZnQ7CisgICAgICAgICAgICBpZiAobVNsZWVwVGltZVVzIDwga01pblRocmVhZFNsZWVwVGltZVVzKSB7CisgICAgICAgICAgICAgICAgbVNsZWVwVGltZVVzID0ga01pblRocmVhZFNsZWVwVGltZVVzOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gcmVkdWNlIHNsZWVwIHRpbWUgaW4gY2FzZSBvZiBjb25zZWN1dGl2ZSBhcHBsaWNhdGlvbiB1bmRlcnJ1bnMgdG8gYXZvaWQKICAgICAgICAgICAgIC8vIHN0YXJ2aW5nIHRoZSBhdWRpbyBIQUwuIEFzIGFjdGl2ZVNsZWVwVGltZVVzKCkgaXMgbGFyZ2VyIHRoYW4gYSBidWZmZXIKQEAgLTMxNTEsNyArMzYyMyw3IEBACiAgICAgICAgICAgICAgICAgc2xlZXBUaW1lU2hpZnQrKzsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNsZWVwVGltZSA9IGlkbGVTbGVlcFRpbWU7CisgICAgICAgICAgICBtU2xlZXBUaW1lVXMgPSBtSWRsZVNsZWVwVGltZVVzOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtQnl0ZXNXcml0dGVuICE9IDAgfHwgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfRU5BQkxFRCkpIHsKICAgICAgICAgLy8gY2xlYXIgb3V0IG1NaXhlckJ1ZmZlciBvciBtU2lua0J1ZmZlciwgdG8gZW5zdXJlIGJ1ZmZlcnMgYXJlIGNsZWFyZWQKQEAgLTMxNjEsNyArMzYzMyw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtZW1zZXQobVNpbmtCdWZmZXIsIDAsIG1TaW5rQnVmZmVyU2l6ZSk7CiAgICAgICAgIH0KLSAgICAgICAgc2xlZXBUaW1lID0gMDsKKyAgICAgICAgbVNsZWVwVGltZVVzID0gMDsKICAgICAgICAgQUxPR1ZfSUYobUJ5dGVzV3JpdHRlbiA9PSAwICYmIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQpLAogICAgICAgICAgICAgICAgICJhbnRpY2lwYXRlZCBzdGFydCIpOwogICAgIH0KQEAgLTMzODIsMjIgKzM4NTQsMTYgQEAKICAgICAgICAgLy8gaGVuY2UgdGhlIHRlc3Qgb24gKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfUkVBRFkpIG1lYW5pbmcgdGhlIHRyYWNrIHdhcyBtaXhlZAogICAgICAgICAvLyBkdXJpbmcgbGFzdCByb3VuZAogICAgICAgICBzaXplX3QgZGVzaXJlZEZyYW1lczsKLSAgICAgICAgdWludDMyX3Qgc3IgPSB0cmFjay0+c2FtcGxlUmF0ZSgpOwotICAgICAgICBpZiAoc3IgPT0gbVNhbXBsZVJhdGUpIHsKLSAgICAgICAgICAgIGRlc2lyZWRGcmFtZXMgPSBtTm9ybWFsRnJhbWVDb3VudDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vICsxIGZvciByb3VuZGluZyBhbmQgKzEgZm9yIGFkZGl0aW9uYWwgc2FtcGxlIG5lZWRlZCBmb3IgaW50ZXJwb2xhdGlvbgotICAgICAgICAgICAgZGVzaXJlZEZyYW1lcyA9IChtTm9ybWFsRnJhbWVDb3VudCAqIHNyKSAvIG1TYW1wbGVSYXRlICsgMSArIDE7Ci0gICAgICAgICAgICAvLyBhZGQgZnJhbWVzIGFscmVhZHkgY29uc3VtZWQgYnV0IG5vdCB5ZXQgcmVsZWFzZWQgYnkgdGhlIHJlc2FtcGxlcgotICAgICAgICAgICAgLy8gYmVjYXVzZSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWFkeSgpIHdpbGwgaW5jbHVkZSB0aGVzZSBmcmFtZXMKLSAgICAgICAgICAgIGRlc2lyZWRGcmFtZXMgKz0gbUF1ZGlvTWl4ZXItPmdldFVucmVsZWFzZWRGcmFtZXModHJhY2stPm5hbWUoKSk7Ci0jaWYgMAotICAgICAgICAgICAgLy8gdGhlIG1pbmltdW0gdHJhY2sgYnVmZmVyIHNpemUgaXMgbm9ybWFsbHkgdHdpY2UgdGhlIG51bWJlciBvZiBmcmFtZXMgbmVjZXNzYXJ5Ci0gICAgICAgICAgICAvLyB0byBmaWxsIG9uZSBidWZmZXIgYW5kIHRoZSByZXNhbXBsZXIgc2hvdWxkIG5vdCBsZWF2ZSBtb3JlIHRoYW4gb25lIGJ1ZmZlciB3b3J0aAotICAgICAgICAgICAgLy8gb2YgdW5yZWxlYXNlZCBmcmFtZXMgYWZ0ZXIgZWFjaCBwYXNzLCBidXQganVzdCBpbiBjYXNlLi4uCi0gICAgICAgICAgICBBTE9HX0FTU0VSVChkZXNpcmVkRnJhbWVzIDw9IGNibGstPmZyYW1lQ291bnRfKTsKLSNlbmRpZgotICAgICAgICB9CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHNhbXBsZVJhdGUgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0U2FtcGxlUmF0ZSgpOworICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSBwbGF5YmFja1JhdGUgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0UGxheWJhY2tSYXRlKCk7CisKKyAgICAgICAgZGVzaXJlZEZyYW1lcyA9IHNvdXJjZUZyYW1lc05lZWRlZFdpdGhUaW1lc3RyZXRjaCgKKyAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBtTm9ybWFsRnJhbWVDb3VudCwgbVNhbXBsZVJhdGUsIHBsYXliYWNrUmF0ZS5tU3BlZWQpOworICAgICAgICAvLyBUT0RPOiBPTkxZIFVTRUQgRk9SIExFR0FDWSBSRVNBTVBMRVJTLCByZW1vdmUgd2hlbiB0aGV5IGFyZSByZW1vdmVkLgorICAgICAgICAvLyBhZGQgZnJhbWVzIGFscmVhZHkgY29uc3VtZWQgYnV0IG5vdCB5ZXQgcmVsZWFzZWQgYnkgdGhlIHJlc2FtcGxlcgorICAgICAgICAvLyBiZWNhdXNlIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlYWR5KCkgd2lsbCBpbmNsdWRlIHRoZXNlIGZyYW1lcworICAgICAgICBkZXNpcmVkRnJhbWVzICs9IG1BdWRpb01peGVyLT5nZXRVbnJlbGVhc2VkRnJhbWVzKHRyYWNrLT5uYW1lKCkpOworCiAgICAgICAgIHVpbnQzMl90IG1pbkZyYW1lcyA9IDE7CiAgICAgICAgIGlmICgodHJhY2stPnNoYXJlZEJ1ZmZlcigpID09IDApICYmICF0cmFjay0+aXNTdG9wcGVkKCkgJiYgIXRyYWNrLT5pc1BhdXNpbmcoKSAmJgogICAgICAgICAgICAgICAgIChtTWl4ZXJTdGF0dXNJZ25vcmluZ0Zhc3RUcmFja3MgPT0gTUlYRVJfVFJBQ0tTX1JFQURZKSkgewpAQCAtMzQwNSw2ICszODcxLDIzIEBACiAgICAgICAgIH0KIAogICAgICAgICBzaXplX3QgZnJhbWVzUmVhZHkgPSB0cmFjay0+ZnJhbWVzUmVhZHkoKTsKKyAgICAgICAgaWYgKEFUUkFDRV9FTkFCTEVEKCkpIHsKKyAgICAgICAgICAgIC8vIEkgd2lzaCB3ZSBoYWQgZm9ybWF0dGVkIHRyYWNlIG5hbWVzCisgICAgICAgICAgICBjaGFyIHRyYWNlTmFtZVsxNl07CisgICAgICAgICAgICBzdHJjcHkodHJhY2VOYW1lLCAiblJkeSIpOworICAgICAgICAgICAgaW50IG5hbWUgPSB0cmFjay0+bmFtZSgpOworICAgICAgICAgICAgaWYgKEF1ZGlvTWl4ZXI6OlRSQUNLMCA8PSBuYW1lICYmCisgICAgICAgICAgICAgICAgICAgIG5hbWUgPCAoaW50KSAoQXVkaW9NaXhlcjo6VFJBQ0swICsgQXVkaW9NaXhlcjo6TUFYX05VTV9UUkFDS1MpKSB7CisgICAgICAgICAgICAgICAgbmFtZSAtPSBBdWRpb01peGVyOjpUUkFDSzA7CisgICAgICAgICAgICAgICAgdHJhY2VOYW1lWzRdID0gKG5hbWUgLyAxMCkgKyAnMCc7CisgICAgICAgICAgICAgICAgdHJhY2VOYW1lWzVdID0gKG5hbWUgJSAxMCkgKyAnMCc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyYWNlTmFtZVs0XSA9ICc/JzsKKyAgICAgICAgICAgICAgICB0cmFjZU5hbWVbNV0gPSAnPyc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFjZU5hbWVbNl0gPSAnXDAnOworICAgICAgICAgICAgQVRSQUNFX0lOVCh0cmFjZU5hbWUsIGZyYW1lc1JlYWR5KTsKKyAgICAgICAgfQogICAgICAgICBpZiAoKGZyYW1lc1JlYWR5ID49IG1pbkZyYW1lcykgJiYgdHJhY2stPmlzUmVhZHkoKSAmJgogICAgICAgICAgICAgICAgICF0cmFjay0+aXNQYXVzZWQoKSAmJiAhdHJhY2stPmlzVGVybWluYXRlZCgpKQogICAgICAgICB7CkBAIC0zNTQzLDYgKzQwMjYsMTQgQEAKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpSRVNBTVBMRSwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpTQU1QTEVfUkFURSwKICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpcmVxU2FtcGxlUmF0ZSk7CisKKyAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIHBsYXliYWNrUmF0ZSA9IHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRQbGF5YmFja1JhdGUoKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUSU1FU1RSRVRDSCwKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpQTEFZQkFDS19SQVRFLAorICAgICAgICAgICAgICAgICZwbGF5YmFja1JhdGUpOworCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBvdXRwdXQgYnVmZmVyIGZvciB0aGUgdHJhY2suCiAgICAgICAgICAgICAgKgpAQCAtMzU5NSw2ICs0MDg2LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChmcmFtZXNSZWFkeSA8IGRlc2lyZWRGcmFtZXMgJiYgIXRyYWNrLT5pc1N0b3BwZWQoKSAmJiAhdHJhY2stPmlzUGF1c2VkKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigidHJhY2soJXApIHVuZGVycnVuLCAgZnJhbWVzUmVhZHkoJXp1KSA8IGZyYW1lc0Rlc2lyZWQoJXpkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjaywgZnJhbWVzUmVhZHksIGRlc2lyZWRGcmFtZXMpOwogICAgICAgICAgICAgICAgIHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKGRlc2lyZWRGcmFtZXMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gY2xlYXIgZWZmZWN0IGNoYWluIGlucHV0IGJ1ZmZlciBpZiBhbiBhY3RpdmUgdHJhY2sgdW5kZXJydW5zIHRvIGF2b2lkIHNlbmRpbmcKQEAgLTM4MTIsNyArNDMwNSw3IEBACiAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlV2l0aG91dFNwZWFrZXIKICAgICAgICAgICAgICAgICA9IEFVRElPX0RFVklDRV9PVVRfQUxMICYgfkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGFueSBvdGhlciBkZXZpY2UgKGV4Y2VwdCBzcGVha2VyKSBpcyBvbgotICAgICAgICAgICAgaWYgKHZhbHVlICYgZGV2aWNlV2l0aG91dFNwZWFrZXIgKSB7CisgICAgICAgICAgICBpZiAodmFsdWUgJiBkZXZpY2VXaXRob3V0U3BlYWtlcikgewogICAgICAgICAgICAgICAgIHBhcmFtcyB8PSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFPdGhlckF1ZGlvRGV2aWNlT247CiAgICAgICAgICAgICB9CiAKQEAgLTM4MzYsNyArNDMyOSw3IEBACiAgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7CiAgICAgICAgIGlmICghbVN0YW5kYnkgJiYgc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7Ci0gICAgICAgICAgICBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zdGFuZGJ5KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgICAgICAgICBtT3V0cHV0LT5zdGFuZGJ5KCk7CiAgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuID0gMDsKICAgICAgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKQEAgLTM4NTQsNyArNDM0Nyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1UcmFja3NbaV0tPm1OYW1lID0gbmFtZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQXVkaW9TeXN0ZW06Ok9VVFBVVF9DT05GSUdfQ0hBTkdFRCk7CisgICAgICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM4NzksNyArNDM3Miw3IEBACiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKICAgICBQbGF5YmFja1RocmVhZDo6ZHVtcEludGVybmFscyhmZCwgYXJncyk7Ci0KKyAgICBkcHJpbnRmKGZkLCAiICBUaHJlYWQgdGhyb3R0bGUgdGltZSAobXNlY3MpOiAldVxuIiwgbVRocmVhZFRocm90dGxlVGltZU1zKTsKICAgICBkcHJpbnRmKGZkLCAiICBBdWRpb01peGVyIHRyYWNrczogMHglMDh4XG4iLCBtQXVkaW9NaXhlci0+dHJhY2tOYW1lcygpKTsKIAogICAgIC8vIE1ha2UgYSBub24tYXRvbWljIGNvcHkgb2YgZmFzdCBtaXhlciBkdW1wIHN0YXRlIHNvIGl0IHdvbid0IGNoYW5nZSB1bmRlcm5lYXRoIHVzCkBAIC0zOTMyLDE2ICs0NDI1LDE2IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpEaXJlY3RPdXRwdXRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAotICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LCBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLSAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UsIERJUkVDVCkKKyAgICAgICAgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwgYXVkaW9faW9faGFuZGxlX3QgaWQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGJvb2wgc3lzdGVtUmVhZHkpCisgICAgOiAgIFBsYXliYWNrVGhyZWFkKGF1ZGlvRmxpbmdlciwgb3V0cHV0LCBpZCwgZGV2aWNlLCBESVJFQ1QsIHN5c3RlbVJlYWR5KQogICAgICAgICAvLyBtTGVmdFZvbEZsb2F0LCBtUmlnaHRWb2xGbG9hdAogewogfQogCiBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6RGlyZWN0T3V0cHV0VGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwKICAgICAgICAgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwgYXVkaW9faW9faGFuZGxlX3QgaWQsIHVpbnQzMl90IGRldmljZSwKLSAgICAgICAgVGhyZWFkQmFzZTo6dHlwZV90IHR5cGUpCi0gICAgOiAgIFBsYXliYWNrVGhyZWFkKGF1ZGlvRmxpbmdlciwgb3V0cHV0LCBpZCwgZGV2aWNlLCB0eXBlKQorICAgICAgICBUaHJlYWRCYXNlOjp0eXBlX3QgdHlwZSwgYm9vbCBzeXN0ZW1SZWFkeSkKKyAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UsIHR5cGUsIHN5c3RlbVJlYWR5KQogICAgICAgICAvLyBtTGVmdFZvbEZsb2F0LCBtUmlnaHRWb2xGbG9hdAogewogfQpAQCAtMzk5OCw2ICs0NDkxLDI0IEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpvbkFkZE5ld1RyYWNrX2woKQoreworICAgIHNwPFRyYWNrPiBwcmV2aW91c1RyYWNrID0gbVByZXZpb3VzVHJhY2sucHJvbW90ZSgpOworICAgIHNwPFRyYWNrPiBsYXRlc3RUcmFjayA9IG1MYXRlc3RBY3RpdmVUcmFjay5wcm9tb3RlKCk7CisKKyAgICBpZiAocHJldmlvdXNUcmFjayAhPSAwICYmIGxhdGVzdFRyYWNrICE9IDApIHsKKyAgICAgICAgaWYgKG1UeXBlID09IERJUkVDVCkgeworICAgICAgICAgICAgaWYgKHByZXZpb3VzVHJhY2suZ2V0KCkgIT0gbGF0ZXN0VHJhY2suZ2V0KCkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIC8qIG1UeXBlID09IE9GRkxPQUQgKi8geworICAgICAgICAgICAgaWYgKHByZXZpb3VzVHJhY2stPnNlc3Npb25JZCgpICE9IGxhdGVzdFRyYWNrLT5zZXNzaW9uSWQoKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaFBlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIFBsYXliYWNrVGhyZWFkOjpvbkFkZE5ld1RyYWNrX2woKTsKK30KIAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6bWl4ZXJfc3RhdGUgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OnByZXBhcmVUcmFja3NfbCgKICAgICBWZWN0b3I8IHNwPFRyYWNrPiA+ICp0cmFja3NUb1JlbW92ZQpAQCAtNDAwNyw3ICs0NTE4LDYgQEAKICAgICBtaXhlcl9zdGF0ZSBtaXhlclN0YXR1cyA9IE1JWEVSX0lETEU7CiAgICAgYm9vbCBkb0h3UGF1c2UgPSBmYWxzZTsKICAgICBib29sIGRvSHdSZXN1bWUgPSBmYWxzZTsKLSAgICBib29sIGZsdXNoUGVuZGluZyA9IGZhbHNlOwogCiAgICAgLy8gZmluZCBvdXQgd2hpY2ggdHJhY2tzIG5lZWQgdG8gYmUgcHJvY2Vzc2VkCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CkBAIC00MDE3LDYgKzQ1MjcsMTIgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKHQtPmlzSW52YWxpZCgpKSB7CisgICAgICAgICAgICBBTE9HVygiQW4gaW52YWxpZGF0ZWQgdHJhY2sgc2hvdWxkbid0IGJlIGluIGFjdGl2ZSBsaXN0Iik7CisgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKwogICAgICAgICBUcmFjayogY29uc3QgdHJhY2sgPSB0LmdldCgpOwogICAgICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsgPSB0cmFjay0+Y2JsaygpOwogICAgICAgICAvLyBPbmx5IGNvbnNpZGVyIGxhc3QgdHJhY2sgc3RhcnRlZCBmb3Igdm9sdW1lIGFuZCBtaXhlciBzdGF0ZSBjb250cm9sLgpAQCAtNDAyNiw5ICs0NTQyLDkgQEAKICAgICAgICAgc3A8VHJhY2s+IGwgPSBtTGF0ZXN0QWN0aXZlVHJhY2sucHJvbW90ZSgpOwogICAgICAgICBib29sIGxhc3QgPSBsLmdldCgpID09IHRyYWNrOwogCi0gICAgICAgIGlmIChtSHdTdXBwb3J0c1BhdXNlICYmIHRyYWNrLT5pc1BhdXNpbmcoKSkgeworICAgICAgICBpZiAodHJhY2stPmlzUGF1c2luZygpKSB7CiAgICAgICAgICAgICB0cmFjay0+c2V0UGF1c2VkKCk7Ci0gICAgICAgICAgICBpZiAobGFzdCAmJiAhbUh3UGF1c2VkKSB7CisgICAgICAgICAgICBpZiAobUh3U3VwcG9ydHNQYXVzZSAmJiBsYXN0ICYmICFtSHdQYXVzZWQpIHsKICAgICAgICAgICAgICAgICBkb0h3UGF1c2UgPSB0cnVlOwogICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IHRydWU7CiAgICAgICAgICAgICB9CkBAIC00MDM2LDE1ICs0NTUyLDEzIEBACiAgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmlzRmx1c2hQZW5kaW5nKCkpIHsKICAgICAgICAgICAgIHRyYWNrLT5mbHVzaEFjaygpOwogICAgICAgICAgICAgaWYgKGxhc3QpIHsKLSAgICAgICAgICAgICAgICBmbHVzaFBlbmRpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIG1GbHVzaFBlbmRpbmcgPSB0cnVlOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1Id1N1cHBvcnRzUGF1c2UgJiYgdHJhY2stPmlzUmVzdW1lUGVuZGluZygpKXsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+aXNSZXN1bWVQZW5kaW5nKCkpIHsKICAgICAgICAgICAgIHRyYWNrLT5yZXN1bWVBY2soKTsKLSAgICAgICAgICAgIGlmIChsYXN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Id1BhdXNlZCkgewotICAgICAgICAgICAgICAgICAgICBkb0h3UmVzdW1lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbUh3UGF1c2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxhc3QgJiYgbUh3UGF1c2VkKSB7CisgICAgICAgICAgICAgICAgZG9Id1Jlc3VtZSA9IHRydWU7CisgICAgICAgICAgICAgICAgbUh3UGF1c2VkID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNDA1NCw5ICs0NTY4LDEwIEBACiAgICAgICAgIC8vIGFwcCBkb2VzIG5vdCBjYWxsIHN0b3AoKSBhbmQgcmVsaWVzIG9uIHVuZGVycnVuIHRvIHN0b3A6CiAgICAgICAgIC8vIGhlbmNlIHRoZSB0ZXN0IG9uICh0cmFjay0+bVJldHJ5Q291bnQgPiAxKS4KICAgICAgICAgLy8gSWYgcmV0cnlDb3VudDw9MSB0aGVuIHRyYWNrIGlzIGFib3V0IHRvIHVuZGVycnVuIGFuZCBiZSByZW1vdmVkLgorICAgICAgICAvLyBEbyBub3QgdXNlIGEgaGlnaCB0aHJlc2hvbGQgZm9yIGNvbXByZXNzZWQgYXVkaW8uCiAgICAgICAgIHVpbnQzMl90IG1pbkZyYW1lczsKICAgICAgICAgaWYgKCh0cmFjay0+c2hhcmVkQnVmZmVyKCkgPT0gMCkgJiYgIXRyYWNrLT5pc1N0b3BwaW5nXzEoKSAmJiAhdHJhY2stPmlzUGF1c2luZygpCi0gICAgICAgICAgICAmJiAodHJhY2stPm1SZXRyeUNvdW50ID4gMSkpIHsKKyAgICAgICAgICAgICYmICh0cmFjay0+bVJldHJ5Q291bnQgPiAxKSAmJiBhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CiAgICAgICAgICAgICBtaW5GcmFtZXMgPSBtTm9ybWFsRnJhbWVDb3VudDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1pbkZyYW1lcyA9IDE7CkBAIC00MDc5LDExICs0NTk0LDIyIEBACiAgICAgICAgICAgICAvLyBjb21wdXRlIHZvbHVtZSBmb3IgdGhpcyB0cmFjawogICAgICAgICAgICAgcHJvY2Vzc1ZvbHVtZV9sKHRyYWNrLCBsYXN0KTsKICAgICAgICAgICAgIGlmIChsYXN0KSB7CisgICAgICAgICAgICAgICAgc3A8VHJhY2s+IHByZXZpb3VzVHJhY2sgPSBtUHJldmlvdXNUcmFjay5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzVHJhY2sgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2sgIT0gcHJldmlvdXNUcmFjay5nZXQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmx1c2ggYW55IGRhdGEgc3RpbGwgYmVpbmcgd3JpdHRlbiBmcm9tIGxhc3QgdHJhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1JlbWFpbmluZyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnZhbGlkYXRlIHByZXZpb3VzIHRyYWNrIHRvIGZvcmNlIGEgc2VlayB3aGVuIHJlc3VtaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNUcmFjay0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1QcmV2aW91c1RyYWNrID0gdHJhY2s7CisKICAgICAgICAgICAgICAgICAvLyByZXNldCByZXRyeSBjb3VudAogICAgICAgICAgICAgICAgIHRyYWNrLT5tUmV0cnlDb3VudCA9IGtNYXhUcmFja1JldHJpZXNEaXJlY3Q7CiAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrID0gdDsKICAgICAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX1RSQUNLU19SRUFEWTsKLSAgICAgICAgICAgICAgICBpZiAodXNlc0h3QXZTeW5jKCkgJiYgbUh3UGF1c2VkKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Id1BhdXNlZCkgewogICAgICAgICAgICAgICAgICAgICBkb0h3UmVzdW1lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgbUh3UGF1c2VkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDA5Niw2ICs0NjIyLDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodHJhY2stPmlzU3RvcHBpbmdfMSgpKSB7CiAgICAgICAgICAgICAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RPUFBJTkdfMjsKKyAgICAgICAgICAgICAgICBpZiAobGFzdCAmJiBtSHdQYXVzZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgIGRvSHdSZXN1bWUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgbUh3UGF1c2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICgodHJhY2stPnNoYXJlZEJ1ZmZlcigpICE9IDApIHx8IHRyYWNrLT5pc1N0b3BwZWQoKSB8fAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+aXNTdG9wcGluZ18yKCkgfHwgdHJhY2stPmlzUGF1c2VkKCkpIHsKQEAgLTQxMzAsOCArNDY2MCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIHRoZW4gYXV0b21hdGljYWxseSBjYWxsIHN0YXJ0KCkgd2hlbiBkYXRhIGlzIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX0RJU0FCTEVELCAmY2Jsay0+bUZsYWdzKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coInBhdXNlIGJlY2F1c2Ugb2YgVU5ERVJSVU4sIGZyYW1lc1JlYWR5ID0gJXp1LCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWluRnJhbWVzID0gJXUsIG1Gb3JtYXQgPSAlI3giLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5mcmFtZXNSZWFkeSgpLCBtaW5GcmFtZXMsIG1Gb3JtYXQpOwogICAgICAgICAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX1RSQUNLU19FTkFCTEVEOwotICAgICAgICAgICAgICAgICAgICBpZiAodXNlc0h3QXZTeW5jKCkgJiYgIW1Id1BhdXNlZCAmJiAhbVN0YW5kYnkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Id1N1cHBvcnRzUGF1c2UgJiYgIW1Id1BhdXNlZCAmJiAhbVN0YW5kYnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGRvSHdQYXVzZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICBtSHdQYXVzZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC00MTQxLDExICs0Njc0LDExIEBACiAgICAgfQogCiAgICAgLy8gaWYgYW4gYWN0aXZlIHRyYWNrIGRpZCBub3QgY29tbWFuZCBhIGZsdXNoLCBjaGVjayBmb3IgcGVuZGluZyBmbHVzaCBvbiBzdG9wcGVkIHRyYWNrcwotICAgIGlmICghZmx1c2hQZW5kaW5nKSB7CisgICAgaWYgKCFtRmx1c2hQZW5kaW5nKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgaWYgKG1UcmFja3NbaV0tPmlzRmx1c2hQZW5kaW5nKCkpIHsKICAgICAgICAgICAgICAgICBtVHJhY2tzW2ldLT5mbHVzaEFjaygpOwotICAgICAgICAgICAgICAgIGZsdXNoUGVuZGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgbUZsdXNoUGVuZGluZyA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC00MTU1LDEwICs0Njg4LDEwIEBACiAgICAgLy8gYmVmb3JlIGZsdXNoIGFuZCB0aGVuIHJlc3VtZSBIVy4gVGhpcyBjYW4gaGFwcGVuIGluIGNhc2Ugb2YgcGF1c2UvZmx1c2gvcmVzdW1lCiAgICAgLy8gaWYgcmVzdW1lIGlzIHJlY2VpdmVkIGJlZm9yZSBwYXVzZSBpcyBleGVjdXRlZC4KICAgICBpZiAobUh3U3VwcG9ydHNQYXVzZSAmJiAhbVN0YW5kYnkgJiYKLSAgICAgICAgICAgIChkb0h3UGF1c2UgfHwgKGZsdXNoUGVuZGluZyAmJiAhbUh3UGF1c2VkICYmIChjb3VudCAhPSAwKSkpKSB7CisgICAgICAgICAgICAoZG9Id1BhdXNlIHx8IChtRmx1c2hQZW5kaW5nICYmICFtSHdQYXVzZWQgJiYgKGNvdW50ICE9IDApKSkpIHsKICAgICAgICAgbU91dHB1dC0+c3RyZWFtLT5wYXVzZShtT3V0cHV0LT5zdHJlYW0pOwogICAgIH0KLSAgICBpZiAoZmx1c2hQZW5kaW5nKSB7CisgICAgaWYgKG1GbHVzaFBlbmRpbmcpIHsKICAgICAgICAgZmx1c2hId19sKCk7CiAgICAgfQogICAgIGlmIChtSHdTdXBwb3J0c1BhdXNlICYmICFtU3RhbmRieSAmJiBkb0h3UmVzdW1lKSB7CkBAIC00MTc4LDggKzQ3MTEsOCBAQAogICAgIHdoaWxlIChmcmFtZUNvdW50KSB7CiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBidWZmZXI7CiAgICAgICAgIGJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKLSAgICAgICAgbUFjdGl2ZVRyYWNrLT5nZXROZXh0QnVmZmVyKCZidWZmZXIpOwotICAgICAgICBpZiAoYnVmZmVyLnJhdyA9PSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1BY3RpdmVUcmFjay0+Z2V0TmV4dEJ1ZmZlcigmYnVmZmVyKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCBidWZmZXIucmF3ID09IE5VTEwpIHsKICAgICAgICAgICAgIG1lbXNldChjdXJCdWYsIDAsIGZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC00MTg5LDggKzQ3MjIsOCBAQAogICAgICAgICBtQWN0aXZlVHJhY2stPnJlbGVhc2VCdWZmZXIoJmJ1ZmZlcik7CiAgICAgfQogICAgIG1DdXJyZW50V3JpdGVMZW5ndGggPSBjdXJCdWYgLSAoaW50OF90ICopbVNpbmtCdWZmZXI7Ci0gICAgc2xlZXBUaW1lID0gMDsKLSAgICBzdGFuZGJ5VGltZSA9IHN5c3RlbVRpbWUoKSArIHN0YW5kYnlEZWxheTsKKyAgICBtU2xlZXBUaW1lVXMgPSAwOworICAgIG1TdGFuZGJ5VGltZU5zID0gc3lzdGVtVGltZSgpICsgbVN0YW5kYnlEZWxheU5zOwogICAgIG1BY3RpdmVUcmFjay5jbGVhcigpOwogfQogCkBAIC00MTk4LDE4ICs0NzMxLDE4IEBACiB7CiAgICAgLy8gZG8gbm90IHdyaXRlIHRvIEhBTCB3aGVuIHBhdXNlZAogICAgIGlmIChtSHdQYXVzZWQgfHwgKHVzZXNId0F2U3luYygpICYmIG1TdGFuZGJ5KSkgewotICAgICAgICBzbGVlcFRpbWUgPSBpZGxlU2xlZXBUaW1lOworICAgICAgICBtU2xlZXBUaW1lVXMgPSBtSWRsZVNsZWVwVGltZVVzOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGlmIChzbGVlcFRpbWUgPT0gMCkgeworICAgIGlmIChtU2xlZXBUaW1lVXMgPT0gMCkgewogICAgICAgICBpZiAobU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19FTkFCTEVEKSB7Ci0gICAgICAgICAgICBzbGVlcFRpbWUgPSBhY3RpdmVTbGVlcFRpbWU7CisgICAgICAgICAgICBtU2xlZXBUaW1lVXMgPSBtQWN0aXZlU2xlZXBUaW1lVXM7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzbGVlcFRpbWUgPSBpZGxlU2xlZXBUaW1lOworICAgICAgICAgICAgbVNsZWVwVGltZVVzID0gbUlkbGVTbGVlcFRpbWVVczsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobUJ5dGVzV3JpdHRlbiAhPSAwICYmIGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKICAgICAgICAgbWVtc2V0KG1TaW5rQnVmZmVyLCAwLCBtRnJhbWVDb3VudCAqIG1GcmFtZVNpemUpOwotICAgICAgICBzbGVlcFRpbWUgPSAwOworICAgICAgICBtU2xlZXBUaW1lVXMgPSAwOwogICAgIH0KIH0KIApAQCAtNDIxNywxNCArNDc1MCwxMyBAQAogewogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgYm9vbCBmbHVzaFBlbmRpbmcgPSBmYWxzZTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBpZiAobVRyYWNrc1tpXS0+aXNGbHVzaFBlbmRpbmcoKSkgewogICAgICAgICAgICAgICAgIG1UcmFja3NbaV0tPmZsdXNoQWNrKCk7Ci0gICAgICAgICAgICAgICAgZmx1c2hQZW5kaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtRmx1c2hQZW5kaW5nID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoZmx1c2hQZW5kaW5nKSB7CisgICAgICAgIGlmIChtRmx1c2hQZW5kaW5nKSB7CiAgICAgICAgICAgICBmbHVzaEh3X2woKTsKICAgICAgICAgfQogICAgIH0KQEAgLTQyMzUsMTQgKzQ3NjcsMTcgQEAKIGJvb2wgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OnNob3VsZFN0YW5kYnlfbCgpCiB7CiAgICAgYm9vbCB0cmFja1BhdXNlZCA9IGZhbHNlOworICAgIGJvb2wgdHJhY2tTdG9wcGVkID0gZmFsc2U7CiAKICAgICAvLyBkbyBub3QgcHV0IHRoZSBIQUwgaW4gc3RhbmRieSB3aGVuIHBhdXNlZC4gQXdlc29tZVBsYXllciBjbGVhciB0aGUgb2ZmbG9hZGVkIEF1ZGlvVHJhY2sKICAgICAvLyBhZnRlciBhIHRpbWVvdXQgYW5kIHdlIHdpbGwgZW50ZXIgc3RhbmRieSB0aGVuLgogICAgIGlmIChtVHJhY2tzLnNpemUoKSA+IDApIHsKICAgICAgICAgdHJhY2tQYXVzZWQgPSBtVHJhY2tzW21UcmFja3Muc2l6ZSgpIC0gMV0tPmlzUGF1c2VkKCk7CisgICAgICAgIHRyYWNrU3RvcHBlZCA9IG1UcmFja3NbbVRyYWNrcy5zaXplKCkgLSAxXS0+aXNTdG9wcGVkKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja3NbbVRyYWNrcy5zaXplKCkgLSAxXS0+bVN0YXRlID09IFRyYWNrQmFzZTo6SURMRTsKICAgICB9CiAKLSAgICByZXR1cm4gIW1TdGFuZGJ5ICYmICEodHJhY2tQYXVzZWQgfHwgKHVzZXNId0F2U3luYygpICYmIG1Id1BhdXNlZCkpOworICAgIHJldHVybiAhbVN0YW5kYnkgJiYgISh0cmFja1BhdXNlZCB8fCAobUh3UGF1c2VkICYmICF0cmFja1N0b3BwZWQpKTsKIH0KIAogLy8gZ2V0VHJhY2tOYW1lX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKQEAgLTQyOTEsNyArNDgyNiw3IEBACiAgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVZhbHVlUGFpci5zdHJpbmcoKSk7CiAgICAgICAgIGlmICghbVN0YW5kYnkgJiYgc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7Ci0gICAgICAgICAgICBtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbi5zdGFuZGJ5KCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbik7CisgICAgICAgICAgICBtT3V0cHV0LT5zdGFuZGJ5KCk7CiAgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7CiAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuID0gMDsKICAgICAgICAgICAgIHN0YXR1cyA9IG1PdXRwdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtT3V0cHV0LT5zdHJlYW0tPmNvbW1vbiwKQEAgLTQyOTksNyArNDgzNCw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiByZWNvbmZpZykgewogICAgICAgICAgICAgcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpOwotICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBdWRpb1N5c3RlbTo6T1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKKyAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDM0NSwxOSArNDg4MCwyMSBAQAogCiAgICAgLy8gdXNlIHNob3J0ZXIgc3RhbmRieSBkZWxheSBhcyBvbiBub3JtYWwgb3V0cHV0IHRvIHJlbGVhc2UKICAgICAvLyBoYXJkd2FyZSByZXNvdXJjZXMgYXMgc29vbiBhcyBwb3NzaWJsZQotICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7Ci0gICAgICAgIHN0YW5kYnlEZWxheSA9IG1pY3Jvc2Vjb25kcyhhY3RpdmVTbGVlcFRpbWUqMik7CisgICAgLy8gbm8gZGVsYXkgb24gb3V0cHV0cyB3aXRoIEhXIEEvViBzeW5jCisgICAgaWYgKHVzZXNId0F2U3luYygpKSB7CisgICAgICAgIG1TdGFuZGJ5RGVsYXlOcyA9IDA7CisgICAgfSBlbHNlIGlmICgobVR5cGUgPT0gT0ZGTE9BRCkgJiYgIWF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKKyAgICAgICAgbVN0YW5kYnlEZWxheU5zID0ga09mZmxvYWRTdGFuZGJ5RGVsYXlOczsKICAgICB9IGVsc2UgewotICAgICAgICBzdGFuZGJ5RGVsYXkgPSBrT2ZmbG9hZFN0YW5kYnlEZWxheU5zOworICAgICAgICBtU3RhbmRieURlbGF5TnMgPSBtaWNyb3NlY29uZHMobUFjdGl2ZVNsZWVwVGltZVVzKjIpOwogICAgIH0KIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6Zmx1c2hId19sKCkKIHsKLSAgICBpZiAobU91dHB1dC0+c3RyZWFtLT5mbHVzaCAhPSBOVUxMKSB7Ci0gICAgICAgIG1PdXRwdXQtPnN0cmVhbS0+Zmx1c2gobU91dHB1dC0+c3RyZWFtKTsKLSAgICB9CisgICAgbU91dHB1dC0+Zmx1c2goKTsKICAgICBtSHdQYXVzZWQgPSBmYWxzZTsKKyAgICBtRmx1c2hQZW5kaW5nID0gZmFsc2U7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQ0NjQsOCArNTAwMSw4IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEF1ZGlvRmxpbmdlcjo6T2ZmbG9hZFRocmVhZDo6T2ZmbG9hZFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCi0gICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCB1aW50MzJfdCBkZXZpY2UpCi0gICAgOiAgIERpcmVjdE91dHB1dFRocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQsIGRldmljZSwgT0ZGTE9BRCksCisgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCB1aW50MzJfdCBkZXZpY2UsIGJvb2wgc3lzdGVtUmVhZHkpCisgICAgOiAgIERpcmVjdE91dHB1dFRocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQsIGRldmljZSwgT0ZGTE9BRCwgc3lzdGVtUmVhZHkpLAogICAgICAgICBtUGF1c2VkQnl0ZXNSZW1haW5pbmcoMCkKIHsKICAgICAvL0ZJWE1FOiBtU3RhbmRieSBzaG91bGQgYmUgc2V0IHRvIHRydWUgYnkgVGhyZWFkQmFzZSBjb25zdHJ1Y3RvcgpAQCAtNDUzMCw3ICs1MDY3LDcgQEAKICAgICAgICAgaWYgKHRyYWNrLT5pc1BhdXNpbmcoKSkgewogICAgICAgICAgICAgdHJhY2stPnNldFBhdXNlZCgpOwogICAgICAgICAgICAgaWYgKGxhc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1Id1BhdXNlZCkgeworICAgICAgICAgICAgICAgIGlmIChtSHdTdXBwb3J0c1BhdXNlICYmICFtSHdQYXVzZWQpIHsKICAgICAgICAgICAgICAgICAgICAgZG9Id1BhdXNlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgbUh3UGF1c2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CkBAIC00NTY2LDcgKzUxMDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAvLyByZXN1bWUgYW4gaW50ZXJydXB0ZWQgd3JpdGUKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gZW5hYmxlIHdyaXRlIHRvIGF1ZGlvIEhBTAotICAgICAgICAgICAgICAgIHNsZWVwVGltZSA9IDA7CisgICAgICAgICAgICAgICAgbVNsZWVwVGltZVVzID0gMDsKIAogICAgICAgICAgICAgICAgIC8vIERvIG5vdCBoYW5kbGUgbmV3IGRhdGEgaW4gdGhpcyBpdGVyYXRpb24gZXZlbiBpZiB0cmFjay0+ZnJhbWVzUmVhZHkoKQogICAgICAgICAgICAgICAgIG1peGVyU3RhdHVzID0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQ7CkBAIC00NjI2LDggKzUxNjMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IG1vZGlmeSBkcmFpbiBzZXF1ZW5jZSBpZiB3ZSBhcmUgYWxyZWFkeSBkcmFpbmluZy4gVGhpcyBoYXBwZW5zCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHJlc3VtaW5nIGZyb20gcGF1c2UgYWZ0ZXIgZHJhaW4uCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1EcmFpblNlcXVlbmNlICYgMSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsZWVwVGltZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRieVRpbWUgPSBzeXN0ZW1UaW1lKCkgKyBzdGFuZGJ5RGVsYXk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNsZWVwVGltZVVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhbmRieVRpbWVOcyA9IHN5c3RlbVRpbWUoKSArIG1TdGFuZGJ5RGVsYXlOczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX0RSQUlOX1RSQUNLOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EcmFpblNlcXVlbmNlICs9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC00NjQ2LDcgKzUxODMsNyBAQAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgYXVkaW9IQUxGcmFtZXMgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtT3V0cHV0LT5zdHJlYW0tPmdldF9sYXRlbmN5KG1PdXRwdXQtPnN0cmVhbSkqbVNhbXBsZVJhdGUpIC8gMTAwMDsKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lc1dyaXR0ZW4gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW4gLyBhdWRpb19zdHJlYW1fb3V0X2ZyYW1lX3NpemUobU91dHB1dC0+c3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuIC8gbU91dHB1dC0+Z2V0RnJhbWVTaXplKCk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVzZW50YXRpb25Db21wbGV0ZShmcmFtZXNXcml0dGVuLCBhdWRpb0hBTEZyYW1lcyk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5yZXNldCgpOwogICAgICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKQEAgLTQ2NzksNyArNTIxNiw2IEBACiAgICAgfQogICAgIGlmIChtRmx1c2hQZW5kaW5nKSB7CiAgICAgICAgIGZsdXNoSHdfbCgpOwotICAgICAgICBtRmx1c2hQZW5kaW5nID0gZmFsc2U7CiAgICAgfQogICAgIGlmICghbVN0YW5kYnkgJiYgZG9Id1Jlc3VtZSkgewogICAgICAgICBtT3V0cHV0LT5zdHJlYW0tPnJlc3VtZShtT3V0cHV0LT5zdHJlYW0pOwpAQCAtNDcyNywyNCArNTI2MywxMiBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6Ok9mZmxvYWRUaHJlYWQ6Om9uQWRkTmV3VHJhY2tfbCgpCi17Ci0gICAgc3A8VHJhY2s+IHByZXZpb3VzVHJhY2sgPSBtUHJldmlvdXNUcmFjay5wcm9tb3RlKCk7Ci0gICAgc3A8VHJhY2s+IGxhdGVzdFRyYWNrID0gbUxhdGVzdEFjdGl2ZVRyYWNrLnByb21vdGUoKTsKLQotICAgIGlmIChwcmV2aW91c1RyYWNrICE9IDAgJiYgbGF0ZXN0VHJhY2sgIT0gMCAmJgotICAgICAgICAocHJldmlvdXNUcmFjay0+c2Vzc2lvbklkKCkgIT0gbGF0ZXN0VHJhY2stPnNlc3Npb25JZCgpKSkgewotICAgICAgICBtRmx1c2hQZW5kaW5nID0gdHJ1ZTsKLSAgICB9Ci0gICAgUGxheWJhY2tUaHJlYWQ6Om9uQWRkTmV3VHJhY2tfbCgpOwotfQotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6OkR1cGxpY2F0aW5nVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwKLSAgICAgICAgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZCogbWFpblRocmVhZCwgYXVkaW9faW9faGFuZGxlX3QgaWQpCisgICAgICAgIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQqIG1haW5UaHJlYWQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBib29sIHN5c3RlbVJlYWR5KQogICAgIDogICBNaXhlclRocmVhZChhdWRpb0ZsaW5nZXIsIG1haW5UaHJlYWQtPmdldE91dHB1dCgpLCBpZCwgbWFpblRocmVhZC0+b3V0RGV2aWNlKCksCi0gICAgICAgICAgICAgICAgRFVQTElDQVRJTkcpLAorICAgICAgICAgICAgICAgICAgICBzeXN0ZW1SZWFkeSwgRFVQTElDQVRJTkcpLAogICAgICAgICBtV2FpdFRpbWVNcyhVSU5UX01BWCkKIHsKICAgICBhZGRPdXRwdXRUcmFjayhtYWluVGhyZWFkKTsKQEAgLTQ3NjksMTkgKzUyOTMsMTkgQEAKICAgICAgICAgICAgIG1lbXNldChtU2lua0J1ZmZlciwgMCwgbVNpbmtCdWZmZXJTaXplKTsKICAgICAgICAgfQogICAgIH0KLSAgICBzbGVlcFRpbWUgPSAwOworICAgIG1TbGVlcFRpbWVVcyA9IDA7CiAgICAgd3JpdGVGcmFtZXMgPSBtTm9ybWFsRnJhbWVDb3VudDsKICAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbVNpbmtCdWZmZXJTaXplOwotICAgIHN0YW5kYnlUaW1lID0gc3lzdGVtVGltZSgpICsgc3RhbmRieURlbGF5OworICAgIG1TdGFuZGJ5VGltZU5zID0gc3lzdGVtVGltZSgpICsgbVN0YW5kYnlEZWxheU5zOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6OnRocmVhZExvb3Bfc2xlZXBUaW1lKCkKIHsKLSAgICBpZiAoc2xlZXBUaW1lID09IDApIHsKKyAgICBpZiAobVNsZWVwVGltZVVzID09IDApIHsKICAgICAgICAgaWYgKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfRU5BQkxFRCkgewotICAgICAgICAgICAgc2xlZXBUaW1lID0gYWN0aXZlU2xlZXBUaW1lOworICAgICAgICAgICAgbVNsZWVwVGltZVVzID0gbUFjdGl2ZVNsZWVwVGltZVVzOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2xlZXBUaW1lID0gaWRsZVNsZWVwVGltZTsKKyAgICAgICAgICAgIG1TbGVlcFRpbWVVcyA9IG1JZGxlU2xlZXBUaW1lVXM7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1CeXRlc1dyaXR0ZW4gIT0gMCkgewogICAgICAgICBpZiAobU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19FTkFCTEVEKSB7CkBAIC00NzkxLDIyICs1MzE1LDE0IEBACiAgICAgICAgICAgICAvLyBmbHVzaCByZW1haW5pbmcgb3ZlcmZsb3cgYnVmZmVycyBpbiBvdXRwdXQgdHJhY2tzCiAgICAgICAgICAgICB3cml0ZUZyYW1lcyA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgc2xlZXBUaW1lID0gMDsKKyAgICAgICAgbVNsZWVwVGltZVVzID0gMDsKICAgICB9CiB9CiAKIHNzaXplX3QgQXVkaW9GbGluZ2VyOjpEdXBsaWNhdGluZ1RocmVhZDo6dGhyZWFkTG9vcF93cml0ZSgpCiB7Ci0gICAgLy8gV2UgY29udmVydCB0aGUgZHVwbGljYXRpbmcgdGhyZWFkIGZvcm1hdCB0byBBVURJT19GT1JNQVRfUENNXzE2X0JJVAotICAgIC8vIGZvciBkZWxpdmVyeSBkb3duc3RyZWFtIGFzIG5lZWRlZC4gVGhpcyBpbi1wbGFjZSBjb252ZXJzaW9uIGlzIHNhZmUgYXMKLSAgICAvLyBBVURJT19GT1JNQVRfUENNXzE2X0JJVCBpcyBzbWFsbGVyIHRoYW4gYW55IG90aGVyIHN1cHBvcnRlZCBmb3JtYXQKLSAgICAvLyAoQVVESU9fRk9STUFUX1BDTV84X0JJVCBpcyBub3QgYWxsb3dlZCBoZXJlKS4KLSAgICBpZiAobUZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KG1TaW5rQnVmZmVyLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2lua0J1ZmZlciwgbUZvcm1hdCwgd3JpdGVGcmFtZXMgKiBtQ2hhbm5lbENvdW50KTsKLSAgICB9CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRUcmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgb3V0cHV0VHJhY2tzW2ldLT53cml0ZShyZWludGVycHJldF9jYXN0PGludDE2X3QqPihtU2lua0J1ZmZlciksIHdyaXRlRnJhbWVzKTsKKyAgICAgICAgb3V0cHV0VHJhY2tzW2ldLT53cml0ZShtU2lua0J1ZmZlciwgd3JpdGVGcmFtZXMpOwogICAgIH0KICAgICBtU3RhbmRieSA9IGZhbHNlOwogICAgIHJldHVybiAoc3NpemVfdCltU2lua0J1ZmZlclNpemU7CkBAIC00ODMzLDI1ICs1MzQ5LDI2IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6OmFkZE91dHB1dFRyYWNrKE1peGVyVGhyZWFkICp0aHJlYWQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAvLyBGSVhNRSBleHBsYWluIHRoaXMgZm9ybXVsYQotICAgIHNpemVfdCBmcmFtZUNvdW50ID0gKDMgKiBtTm9ybWFsRnJhbWVDb3VudCAqIG1TYW1wbGVSYXRlKSAvIHRocmVhZC0+c2FtcGxlUmF0ZSgpOwotICAgIC8vIE91dHB1dFRyYWNrIGlzIGZvcmNlZCB0byBBVURJT19GT1JNQVRfUENNXzE2X0JJVCByZWdhcmRsZXNzIG9mIG1Gb3JtYXQKLSAgICAvLyBkdWUgdG8gY3VycmVudCB1c2FnZSBjYXNlIGFuZCByZXN0cmljdGlvbnMgb24gdGhlIEF1ZGlvQnVmZmVyUHJvdmlkZXIuCi0gICAgLy8gQWN0dWFsIGJ1ZmZlciBjb252ZXJzaW9uIGlzIGRvbmUgaW4gdGhyZWFkTG9vcF93cml0ZSgpLgotICAgIC8vCi0gICAgLy8gVE9ETzogVGhpcyBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUsIGRlcGVuZGluZyBvbiBtdWx0aWNoYW5uZWwKLSAgICAvLyAoYW5kIG5vbiBpbnQxNl90Kikgc3VwcG9ydCBvbiBBRjo6UGxheWJhY2tUaHJlYWQ6Ok91dHB1dFRyYWNrCi0gICAgT3V0cHV0VHJhY2sgKm91dHB1dFRyYWNrID0gbmV3IE91dHB1dFRyYWNrKHRocmVhZCwKKyAgICAvLyBUaGUgZG93bnN0cmVhbSBNaXhlclRocmVhZCBjb25zdW1lcyB0aHJlYWQtPmZyYW1lQ291bnQoKSBhbW91bnQgb2YgZnJhbWVzIHBlciBtaXggcGFzcy4KKyAgICAvLyBBZGp1c3QgZm9yIHRocmVhZC0+c2FtcGxlUmF0ZSgpIHRvIGRldGVybWluZSBtaW5pbXVtIGJ1ZmZlciBmcmFtZSBjb3VudC4KKyAgICAvLyBUaGVuIHRyaXBsZSBidWZmZXIgYmVjYXVzZSBUaHJlYWRzIGRvIG5vdCBydW4gc3luY2hyb25vdXNseSBhbmQgbWF5IG5vdCBiZSBjbG9jayBsb2NrZWQuCisgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPQorICAgICAgICAgICAgMyAqIHNvdXJjZUZyYW1lc05lZWRlZChtU2FtcGxlUmF0ZSwgdGhyZWFkLT5mcmFtZUNvdW50KCksIHRocmVhZC0+c2FtcGxlUmF0ZSgpKTsKKyAgICAvLyBUT0RPOiBDb25zaWRlciBhc3luY2hyb25vdXMgc2FtcGxlIHJhdGUgY29udmVyc2lvbiB0byBoYW5kbGUgY2xvY2sgZGlzcGFyaXR5CisgICAgLy8gZnJvbSBkaWZmZXJlbnQgT3V0cHV0VHJhY2tzIGFuZCB0aGVpciBhc3NvY2lhdGVkIE1peGVyVGhyZWFkcyAoZS5nLiBvbmUgbWF5CisgICAgLy8gbmVhcmx5IGVtcHR5IGFuZCB0aGUgb3RoZXIgbWF5IGJlIGRyb3BwaW5nIGRhdGEpLgorCisgICAgc3A8T3V0cHV0VHJhY2s+IG91dHB1dFRyYWNrID0gbmV3IE91dHB1dFRyYWNrKHRocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CiAgICAgaWYgKG91dHB1dFRyYWNrLT5jYmxrKCkgIT0gTlVMTCkgewogICAgICAgICB0aHJlYWQtPnNldFN0cmVhbVZvbHVtZShBVURJT19TVFJFQU1fUEFUQ0gsIDEuMGYpOwogICAgICAgICBtT3V0cHV0VHJhY2tzLmFkZChvdXRwdXRUcmFjayk7Ci0gICAgICAgIEFMT0dWKCJhZGRPdXRwdXRUcmFjaygpIHRyYWNrICVwLCBvbiB0aHJlYWQgJXAiLCBvdXRwdXRUcmFjaywgdGhyZWFkKTsKKyAgICAgICAgQUxPR1YoImFkZE91dHB1dFRyYWNrKCkgdHJhY2sgJXAsIG9uIHRocmVhZCAlcCIsIG91dHB1dFRyYWNrLmdldCgpLCB0aHJlYWQpOwogICAgICAgICB1cGRhdGVXYWl0VGltZV9sKCk7CiAgICAgfQogfQpAQCAtNDkzMSwxMiArNTQ0OCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbUluICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtUmVhZHkKICNpZmRlZiBURUVfU0lOSwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGNvbnN0IHNwPE5CQUlPX1Npbms+JiB0ZWVTaW5rCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6Ci0gICAgVGhyZWFkQmFzZShhdWRpb0ZsaW5nZXIsIGlkLCBvdXREZXZpY2UsIGluRGV2aWNlLCBSRUNPUkQpLAorICAgIFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCwgb3V0RGV2aWNlLCBpbkRldmljZSwgUkVDT1JELCBzeXN0ZW1SZWFkeSksCiAgICAgbUlucHV0KGlucHV0KSwgbUFjdGl2ZVRyYWNrc0dlbigwKSwgbVJzbXBJbkJ1ZmZlcihOVUxMKSwKICAgICAvLyBtUnNtcEluRnJhbWVzIGFuZCBtUnNtcEluRnJhbWVzUDIgYXJlIHNldCBieSByZWFkSW5wdXRQYXJhbWV0ZXJzX2woKQogICAgIG1Sc21wSW5SZWFyKDApCkBAIC00OTU1LDggKzU0NzMsOCBAQAogICAgIC8vIG1GYXN0Q2FwdHVyZU5CTG9nV3JpdGVyCiAgICAgLCBtRmFzdFRyYWNrQXZhaWwoZmFsc2UpCiB7Ci0gICAgc25wcmludGYobU5hbWUsIGtOYW1lTGVuZ3RoLCAiQXVkaW9Jbl8lWCIsIGlkKTsKLSAgICBtTkJMb2dXcml0ZXIgPSBhdWRpb0ZsaW5nZXItPm5ld1dyaXRlcl9sKGtMb2dTaXplLCBtTmFtZSk7CisgICAgc25wcmludGYobVRocmVhZE5hbWUsIGtUaHJlYWROYW1lTGVuZ3RoLCAiQXVkaW9Jbl8lWCIsIGlkKTsKKyAgICBtTkJMb2dXcml0ZXIgPSBhdWRpb0ZsaW5nZXItPm5ld1dyaXRlcl9sKGtMb2dTaXplLCBtVGhyZWFkTmFtZSk7CiAKICAgICByZWFkSW5wdXRQYXJhbWV0ZXJzX2woKTsKIApAQCAtNDk3NywyNiArNTQ5NSwxMyBAQAogICAgICAgICBpbml0RmFzdENhcHR1cmUgPSB0cnVlOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEZhc3RDYXB0dXJlX1N0YXRpYzoKLSAgICAgICAgdWludDMyX3QgcHJpbWFyeU91dHB1dFNhbXBsZVJhdGU7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEF1dG9NdXRleCBfbChhdWRpb0ZsaW5nZXItPm1IYXJkd2FyZUxvY2spOwotICAgICAgICAgICAgcHJpbWFyeU91dHB1dFNhbXBsZVJhdGUgPSBhdWRpb0ZsaW5nZXItPm1QcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZTsKLSAgICAgICAgfQotICAgICAgICBpbml0RmFzdENhcHR1cmUgPQotICAgICAgICAgICAgICAgIC8vIGVpdGhlciBjYXB0dXJlIHNhbXBsZSByYXRlIGlzIHNhbWUgYXMgKGEgcmVhc29uYWJsZSkgcHJpbWFyeSBvdXRwdXQgc2FtcGxlIHJhdGUKLSAgICAgICAgICAgICAgICAoKChwcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZSA9PSA0NDEwMCB8fCBwcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZSA9PSA0ODAwMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKG1TYW1wbGVSYXRlID09IHByaW1hcnlPdXRwdXRTYW1wbGVSYXRlKSkgfHwKLSAgICAgICAgICAgICAgICAvLyBvciBwcmltYXJ5IG91dHB1dCBzYW1wbGUgcmF0ZSBpcyB1bmtub3duLCBhbmQgY2FwdHVyZSBzYW1wbGUgcmF0ZSBpcyByZWFzb25hYmxlCi0gICAgICAgICAgICAgICAgKChwcmltYXJ5T3V0cHV0U2FtcGxlUmF0ZSA9PSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAoKG1TYW1wbGVSYXRlID09IDQ0MTAwIHx8IG1TYW1wbGVSYXRlID09IDQ4MDAwKSkpKSAmJgotICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgYnVmZmVyIHNpemUgaXMgPCAxMiBtcwotICAgICAgICAgICAgICAgIChtRnJhbWVDb3VudCAqIDEwMDApIC8gbVNhbXBsZVJhdGUgPCAxMjsKKyAgICAgICAgaW5pdEZhc3RDYXB0dXJlID0gKG1GcmFtZUNvdW50ICogMTAwMCkgLyBtU2FtcGxlUmF0ZSA8IGtNaW5Ob3JtYWxDYXB0dXJlQnVmZmVyU2l6ZU1zOwogICAgICAgICBicmVhazsKICAgICAvLyBjYXNlIEZhc3RDYXB0dXJlX0R5bmFtaWM6CiAgICAgfQogCiAgICAgaWYgKGluaXRGYXN0Q2FwdHVyZSkgewotICAgICAgICAvLyBjcmVhdGUgYSBQaXBlIGZvciBGYXN0TWl4ZXIgdG8gd3JpdGUgdG8sIGFuZCBmb3IgdXMgYW5kIGZhc3QgdHJhY2tzIHRvIHJlYWQgZnJvbQorICAgICAgICAvLyBjcmVhdGUgYSBQaXBlIGZvciBGYXN0Q2FwdHVyZSB0byB3cml0ZSB0bywgYW5kIGZvciB1cyBhbmQgZmFzdCB0cmFja3MgdG8gcmVhZCBmcm9tCiAgICAgICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQgPSBtSW5wdXRTb3VyY2UtPmZvcm1hdCgpOwogICAgICAgICBzaXplX3QgcGlwZUZyYW1lc1AyID0gcm91bmR1cChtU2FtcGxlUmF0ZSAvIDI1KTsgICAgLy8gZG91YmxlLWJ1ZmZlcmluZyBvZiAyMCBtcyBlYWNoCiAgICAgICAgIHNpemVfdCBwaXBlU2l6ZSA9IHBpcGVGcmFtZXNQMiAqIEZvcm1hdF9mcmFtZVNpemUoZm9ybWF0KTsKQEAgLTUwNTUsMTIgKzU1NjAsNyBAQAogICAgICAgICAvLyBzdGFydCB0aGUgZmFzdCBjYXB0dXJlCiAgICAgICAgIG1GYXN0Q2FwdHVyZS0+cnVuKCJGYXN0Q2FwdHVyZSIsIEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKICAgICAgICAgcGlkX3QgdGlkID0gbUZhc3RDYXB0dXJlLT5nZXRUaWQoKTsKLSAgICAgICAgaW50IGVyciA9IHJlcXVlc3RQcmlvcml0eShnZXRwaWRfY2FjaGVkLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlcik7Ci0gICAgICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICAgICAgQUxPR1coIlBvbGljeSBTQ0hFRF9GSUZPIHByaW9yaXR5ICVkIGlzIHVuYXZhaWxhYmxlIGZvciBwaWQgJWQgdGlkICVkOyBlcnJvciAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGtQcmlvcml0eUZhc3RDYXB0dXJlLCBnZXRwaWRfY2FjaGVkLCB0aWQsIGVycik7Ci0gICAgICAgIH0KLQorICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZF9jYWNoZWQsIHRpZCwga1ByaW9yaXR5RmFzdE1peGVyKTsKICNpZmRlZiBBVURJT19XQVRDSERPRwogICAgICAgICAvLyBGSVhNRQogI2VuZGlmCkBAIC01MDcyLDcgKzU1NzIsNiBAQAogICAgIC8vIEZJWE1FIG1Ob3JtYWxTb3VyY2UKIH0KIAotCiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6flJlY29yZFRocmVhZCgpCiB7CiAgICAgaWYgKG1GYXN0Q2FwdHVyZSAhPSAwKSB7CkBAIC01MDkyLDEyICs1NTkxLDEyIEBACiAgICAgfQogICAgIG1BdWRpb0ZsaW5nZXItPnVucmVnaXN0ZXJXcml0ZXIobUZhc3RDYXB0dXJlTkJMb2dXcml0ZXIpOwogICAgIG1BdWRpb0ZsaW5nZXItPnVucmVnaXN0ZXJXcml0ZXIobU5CTG9nV3JpdGVyKTsKLSAgICBkZWxldGVbXSBtUnNtcEluQnVmZmVyOworICAgIGZyZWUobVJzbXBJbkJ1ZmZlcik7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6Om9uRmlyc3RSZWYoKQogewotICAgIHJ1bihtTmFtZSwgUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKKyAgICBydW4obVRocmVhZE5hbWUsIFBSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiB9CiAKIGJvb2wgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnRocmVhZExvb3AoKQpAQCAtNTEzOCw3ICs1NjM3LDkgQEAKIAogICAgICAgICAvLyBzbGVlcCB3aXRoIG11dGV4IHVubG9ja2VkCiAgICAgICAgIGlmIChzbGVlcFVzID4gMCkgeworICAgICAgICAgICAgQVRSQUNFX0JFR0lOKCJzbGVlcCIpOwogICAgICAgICAgICAgdXNsZWVwKHNsZWVwVXMpOworICAgICAgICAgICAgQVRSQUNFX0VORCgpOwogICAgICAgICAgICAgc2xlZXBVcyA9IDA7CiAgICAgICAgIH0KIApAQCAtNTI4Miw3ICs1NzgzLDggQEAKICAgICAgICAgICAgICAgICBzdGF0ZS0+bUNvbW1hbmQgPSBGYXN0Q2FwdHVyZVN0YXRlOjpSRUFEX1dSSVRFOwogI2lmIDAgICAvLyBGSVhNRQogICAgICAgICAgICAgICAgIG1GYXN0Q2FwdHVyZUR1bXBTdGF0ZS5pbmNyZWFzZVNhbXBsaW5nTihtQXVkaW9GbGluZ2VyLT5pc0xvd1JhbURldmljZSgpID8KLSAgICAgICAgICAgICAgICAgICAgICAgIEZhc3RDYXB0dXJlRHVtcFN0YXRlOjprU2FtcGxpbmdOZm9yTG93UmFtRGV2aWNlIDogRmFzdE1peGVyRHVtcFN0YXRlOjprU2FtcGxpbmdOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZhc3RUaHJlYWREdW1wU3RhdGU6OmtTYW1wbGluZ05mb3JMb3dSYW1EZXZpY2UgOgorICAgICAgICAgICAgICAgICAgICAgICAgRmFzdFRocmVhZER1bXBTdGF0ZTo6a1NhbXBsaW5nTik7CiAjZW5kaWYKICAgICAgICAgICAgICAgICBkaWRNb2RpZnkgPSB0cnVlOwogICAgICAgICAgICAgfQpAQCAtNTMyMiw3ICs1ODI0LDcgQEAKICAgICAgICAgLy8gSWYgYW4gTkJBSU8gc291cmNlIGlzIHByZXNlbnQsIHVzZSBpdCB0byByZWFkIHRoZSBub3JtYWwgY2FwdHVyZSdzIGRhdGEKICAgICAgICAgaWYgKG1QaXBlU291cmNlICE9IDApIHsKICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNUb1JlYWQgPSBtQnVmZmVyU2l6ZSAvIG1GcmFtZVNpemU7Ci0gICAgICAgICAgICBmcmFtZXNSZWFkID0gbVBpcGVTb3VyY2UtPnJlYWQoJm1Sc21wSW5CdWZmZXJbcmVhciAqIG1DaGFubmVsQ291bnRdLAorICAgICAgICAgICAgZnJhbWVzUmVhZCA9IG1QaXBlU291cmNlLT5yZWFkKCh1aW50OF90KiltUnNtcEluQnVmZmVyICsgcmVhciAqIG1GcmFtZVNpemUsCiAgICAgICAgICAgICAgICAgICAgIGZyYW1lc1RvUmVhZCwgQXVkaW9CdWZmZXJQcm92aWRlcjo6a0ludmFsaWRQVFMpOwogICAgICAgICAgICAgaWYgKGZyYW1lc1JlYWQgPT0gMCkgewogICAgICAgICAgICAgICAgIC8vIHNpbmNlIHBpcGUgaXMgbm9uLWJsb2NraW5nLCBzaW11bGF0ZSBibG9ja2luZyBpbnB1dApAQCAtNTMzMSw3ICs1ODMzLDcgQEAKICAgICAgICAgLy8gb3RoZXJ3aXNlIHVzZSB0aGUgSEFMIC8gQXVkaW9TdHJlYW1JbiBkaXJlY3RseQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3NpemVfdCBieXRlc1JlYWQgPSBtSW5wdXQtPnN0cmVhbS0+cmVhZChtSW5wdXQtPnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgJm1Sc21wSW5CdWZmZXJbcmVhciAqIG1DaGFubmVsQ291bnRdLCBtQnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICh1aW50OF90KiltUnNtcEluQnVmZmVyICsgcmVhciAqIG1GcmFtZVNpemUsIG1CdWZmZXJTaXplKTsKICAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPCAwKSB7CiAgICAgICAgICAgICAgICAgZnJhbWVzUmVhZCA9IGJ5dGVzUmVhZDsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC01MzUxLDEzICs1ODUzLDEzIEBACiAgICAgICAgIEFMT0dfQVNTRVJUKGZyYW1lc1JlYWQgPiAwKTsKIAogICAgICAgICBpZiAobVRlZVNpbmsgIT0gMCkgewotICAgICAgICAgICAgKHZvaWQpIG1UZWVTaW5rLT53cml0ZSgmbVJzbXBJbkJ1ZmZlcltyZWFyICogbUNoYW5uZWxDb3VudF0sIGZyYW1lc1JlYWQpOworICAgICAgICAgICAgKHZvaWQpIG1UZWVTaW5rLT53cml0ZSgodWludDhfdCopbVJzbXBJbkJ1ZmZlciArIHJlYXIgKiBtRnJhbWVTaXplLCBmcmFtZXNSZWFkKTsKICAgICAgICAgfQogICAgICAgICAvLyBJZiBkZXN0aW5hdGlvbiBpcyBub24tY29udGlndW91cywgd2Ugbm93IGNvcnJlY3QgZm9yIHJlYWRpbmcgcGFzdCBlbmQgb2YgYnVmZmVyLgogICAgICAgICB7CiAgICAgICAgICAgICBzaXplX3QgcGFydDEgPSBtUnNtcEluRnJhbWVzUDIgLSByZWFyOwogICAgICAgICAgICAgaWYgKChzaXplX3QpIGZyYW1lc1JlYWQgPiBwYXJ0MSkgewotICAgICAgICAgICAgICAgIG1lbWNweShtUnNtcEluQnVmZmVyLCAmbVJzbXBJbkJ1ZmZlclttUnNtcEluRnJhbWVzUDIgKiBtQ2hhbm5lbENvdW50XSwKKyAgICAgICAgICAgICAgICBtZW1jcHkobVJzbXBJbkJ1ZmZlciwgKHVpbnQ4X3QqKW1Sc21wSW5CdWZmZXIgKyBtUnNtcEluRnJhbWVzUDIgKiBtRnJhbWVTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgKGZyYW1lc1JlYWQgLSBwYXJ0MSkgKiBtRnJhbWVTaXplKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTM3Myw2ICs1ODc1LDkgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBjb2RlIHByb2JhYmx5IHNob3VsZCBiZSBtb3ZlZCB0byBSZWNvcmRUcmFjay4KKyAgICAgICAgICAgIC8vIFRPRE86IFVwZGF0ZSB0aGUgYWN0aXZlVHJhY2sgYnVmZmVyIGNvbnZlcnRlciBpbiBjYXNlIG9mIHJlY29uZmlndXJlLgorCiAgICAgICAgICAgICBlbnVtIHsKICAgICAgICAgICAgICAgICBPVkVSUlVOX1VOS05PV04sCiAgICAgICAgICAgICAgICAgT1ZFUlJVTl9UUlVFLApAQCAtNTM4NywxMzEgKzU4OTIsMjggQEAKICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzT3V0ID0gYWN0aXZlVHJhY2stPm1TaW5rLmZyYW1lQ291bnQ7CiAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigoc3RhdHVzID09IE9LKSAhPSAoZnJhbWVzT3V0ID4gMCkpOwogCi0gICAgICAgICAgICAgICAgaW50MzJfdCBmcm9udCA9IGFjdGl2ZVRyYWNrLT5tUnNtcEluRnJvbnQ7Ci0gICAgICAgICAgICAgICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgYXZhaWxhYmxlIGZyYW1lcyBhbmQgaGFuZGxlIG92ZXJydW4gY29uZGl0aW9ucworICAgICAgICAgICAgICAgIC8vIGlmIHRoZSByZWNvcmQgdHJhY2sgaXNuJ3QgZHJhaW5pbmcgZmFzdCBlbm91Z2guCisgICAgICAgICAgICAgICAgYm9vbCBoYXNPdmVycnVuOwogICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNJbjsKLQotICAgICAgICAgICAgICAgIGlmIChmaWxsZWQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuLCBidXQgdHJlYXQgbGlrZSBhIG1hc3NpdmUgb3ZlcnJ1biBhbmQgcmUtc3luYwotICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUnNtcEluRnJvbnQgPSByZWFyOwotICAgICAgICAgICAgICAgICAgICBvdmVycnVuID0gT1ZFUlJVTl9UUlVFOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHNpemVfdCkgZmlsbGVkIDw9IG1Sc21wSW5GcmFtZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4gPSAoc2l6ZV90KSBmaWxsZWQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IGlzIG5vdCBrZWVwaW5nIHVwIHdpdGggc2VydmVyLCBidXQgZ2l2ZSBpdCBsYXRlc3QgZGF0YQotICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiA9IG1Sc21wSW5GcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUnNtcEluRnJvbnQgPSBmcm9udCA9IHJlYXIgLSBmcmFtZXNJbjsKKyAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLT5zeW5jKCZmcmFtZXNJbiwgJmhhc092ZXJydW4pOworICAgICAgICAgICAgICAgIGlmIChoYXNPdmVycnVuKSB7CiAgICAgICAgICAgICAgICAgICAgIG92ZXJydW4gPSBPVkVSUlVOX1RSVUU7CiAgICAgICAgICAgICAgICAgfQotCiAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCA9PSAwIHx8IGZyYW1lc0luID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5tUmVzYW1wbGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gbm8gcmVzYW1wbGluZwotICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzSW4gPiBmcmFtZXNPdXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luID0gZnJhbWVzT3V0OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gZnJhbWVzSW47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW50OF90ICpkc3QgPSBhY3RpdmVUcmFjay0+bVNpbmsuaTg7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChmcmFtZXNJbiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyb250ICY9IG1Sc21wSW5GcmFtZXNQMiAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGFydDEgPSBtUnNtcEluRnJhbWVzUDIgLSBmcm9udDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0MSA+IGZyYW1lc0luKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydDEgPSBmcmFtZXNJbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCAqc3JjID0gKGludDhfdCAqKW1Sc21wSW5CdWZmZXIgKyAoZnJvbnQgKiBtRnJhbWVTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ2hhbm5lbENvdW50ID09IGFjdGl2ZVRyYWNrLT5tQ2hhbm5lbENvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBwYXJ0MSAqIG1GcmFtZVNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtQ2hhbm5lbENvdW50ID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cG1peF90b19zdGVyZW9faTE2X2Zyb21fbW9ub19pMTYoKGludDE2X3QgKilkc3QsIChjb25zdCBpbnQxNl90ICopc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubWl4X3RvX21vbm9faTE2X2Zyb21fc3RlcmVvX2kxNigoaW50MTZfdCAqKWRzdCwgKGNvbnN0IGludDE2X3QgKilzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3QgKz0gcGFydDEgKiBhY3RpdmVUcmFjay0+bUZyYW1lU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyb250ICs9IHBhcnQxOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4gLT0gcGFydDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1Sc21wSW5Gcm9udCArPSBmcmFtZXNPdXQ7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyByZXNhbXBsaW5nCi0gICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGZyYW1lc0luTmVlZGVkIHNob3VsZCByZWFsbHkgYmUgcGFydCBvZiByZXNhbXBsZXIgQVBJLCBhbmQgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgIGRlcGVuZCBvbiB0aGUgU1JDIHJhdGlvCi0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHRvIGtlZXAgbVJzbXBJbkJ1ZmZlciBmdWxsIHNvIHJlc2FtcGxlciBhbHdheXMgaGFzIHN1ZmZpY2llbnQgaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lc0luTmVlZGVkOwotICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBvbmx5IHJlLWNhbGN1bGF0ZSB3aGVuIGl0IGNoYW5nZXMsIGFuZCBvcHRpbWl6ZSBmb3IgY29tbW9uIHJhdGlvcwotICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgcHJlY29tcHV0ZSBpbi9vdXQgYmVjYXVzZSBmbG9hdGluZyBwb2ludCBpcyBub3QgYXNzb2NpYXRpdmUKLSAgICAgICAgICAgICAgICAgICAgLy8gZS5nLiBhKmIvYyAhPSBhKihiL2MpLgotICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgaW4obVNhbXBsZVJhdGUpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgb3V0KGFjdGl2ZVRyYWNrLT5tU2FtcGxlUmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1lc0luTmVlZGVkID0gY2VpbChmcmFtZXNPdXQgKiBpbiAvIG91dCkgKyAxOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigibmVlZCAldSBmcmFtZXMgaW4gdG8gcHJvZHVjZSAldSBvdXQgZ2l2ZW4gaW4vb3V0IHJhdGlvIG9mICUuNGciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbk5lZWRlZCwgZnJhbWVzT3V0LCBpbiAvIG91dCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFsdGhvdWdoIHdlIHRoZW9yZXRpY2FsbHkgaGF2ZSBmcmFtZXNJbiBpbiBjaXJjdWxhciBidWZmZXIsIHNvbWUgb2YgdGhvc2UgYXJlCi0gICAgICAgICAgICAgICAgICAgIC8vIHVucmVsZWFzZWQgZnJhbWVzLCBhbmQgdGh1cyBtdXN0IGJlIGRpc2NvdW50ZWQgZm9yIHB1cnBvc2Ugb2YgYnVkZ2V0aW5nLgotICAgICAgICAgICAgICAgICAgICBzaXplX3QgdW5yZWxlYXNlZCA9IGFjdGl2ZVRyYWNrLT5tUnNtcEluVW5yZWw7Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1lc0luID0gZnJhbWVzSW4gPiB1bnJlbGVhc2VkID8gZnJhbWVzSW4gLSB1bnJlbGVhc2VkIDogMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc0luIDwgZnJhbWVzSW5OZWVkZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJub3QgZW5vdWdoIHRvIHJlc2FtcGxlOiBoYXZlICV1IGZyYW1lcyBpbiBidXQgbmVlZCAldSBpbiB0byAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9kdWNlICV1IG91dCBnaXZlbiBpbi9vdXQgcmF0aW8gb2YgJS40ZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luLCBmcmFtZXNJbk5lZWRlZCwgZnJhbWVzT3V0LCBpbiAvIG91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmV3RnJhbWVzT3V0ID0gZnJhbWVzSW4gPiAwID8gZmxvb3IoKGZyYW1lc0luIC0gMSkgKiBvdXQgLyBpbikgOiAwOwotICAgICAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihuZXdGcmFtZXNPdXQgPj0gZnJhbWVzT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdGcmFtZXNPdXQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW5OZWVkZWQgPSBjZWlsKG5ld0ZyYW1lc091dCAqIGluIC8gb3V0KSArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigibm93IG5lZWQgJXUgZnJhbWVzIGluIHRvIHByb2R1Y2UgJXUgb3V0IGdpdmVuIG91dC9pbiByYXRpbyBvZiAlLjRnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW5OZWVkZWQsIG5ld0ZyYW1lc091dCwgb3V0IC8gaW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihmcmFtZXNJbiA8IGZyYW1lc0luTmVlZGVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdWNjZXNzIDI6IGhhdmUgJXUgZnJhbWVzIGluIGFuZCBuZWVkICV1IGluIHRvIHByb2R1Y2UgJXUgb3V0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnaXZlbiBpbi9vdXQgcmF0aW8gb2YgJS40ZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiwgZnJhbWVzSW5OZWVkZWQsIG5ld0ZyYW1lc091dCwgaW4gLyBvdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gbmV3RnJhbWVzT3V0OwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInN1Y2Nlc3MgMTogaGF2ZSAldSBpbiBhbmQgbmVlZCAldSBpbiB0byBwcm9kdWNlICV1IG91dCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImdpdmVuIGluL291dCByYXRpbyBvZiAlLjRnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNJbiwgZnJhbWVzSW5OZWVkZWQsIGZyYW1lc091dCwgaW4gLyBvdXQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gcmVhbGxvY2F0ZSBtUnNtcE91dEJ1ZmZlciBhcyBuZWVkZWQ7IHdlIHdpbGwgZ3JvdyBidXQgbmV2ZXIgc2hyaW5rCi0gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bVJzbXBPdXRGcmFtZUNvdW50IDwgZnJhbWVzT3V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSB3aHkgZG9lcyBlYWNoIHRyYWNrIG5lZWQgaXQncyBvd24gbVJzbXBPdXRCdWZmZXI/IGNhbid0IHRoZXkgc2hhcmU/Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVbXSBhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNhbXBsZXIgYWx3YXlzIG91dHB1dHMgc3RlcmVvCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXIgPSBuZXcgaW50MzJfdFtmcmFtZXNPdXQgKiBGQ0NfMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJzbXBPdXRGcmFtZUNvdW50ID0gZnJhbWVzT3V0OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gcmVzYW1wbGVyIGFjY3VtdWxhdGVzLCBidXQgd2Ugb25seSBoYXZlIG9uZSBzb3VyY2UgdHJhY2sKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlciwgMCwgZnJhbWVzT3V0ICogRkNDXzIgKiBzaXplb2YoaW50MzJfdCkpOwotICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJlc2FtcGxlci0+cmVzYW1wbGUoYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyLCBmcmFtZXNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgaG93IGFib3V0IGhhdmluZyBhY3RpdmVUcmFjayBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaXRzZWxmPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRoaXMqLyAvKiBBdWRpb0J1ZmZlclByb3ZpZGVyKiAqLyk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRpdGhlckFuZENsYW1wKCkgd29ya3MgYXMgbG9uZyBhcyBhbGwgYnVmZmVycyByZXR1cm5lZCBieQotICAgICAgICAgICAgICAgICAgICAvLyBhY3RpdmVUcmFjay0+Z2V0TmV4dEJ1ZmZlcigpIGFyZSAzMiBiaXQgYWxpZ25lZCB3aGljaCBzaG91bGQgYmUgYWx3YXlzIHRydWUuCi0gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bUNoYW5uZWxDb3VudCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wb3JhcmlseSB0eXBlIHB1biBtUnNtcE91dEJ1ZmZlciBmcm9tIFE0LjI3IHRvIGludDE2X3QKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpdGhlckFuZENsYW1wKGFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlciwgYWN0aXZlVHJhY2stPm1Sc21wT3V0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlc2FtcGxlciBhbHdheXMgb3V0cHV0cyBzdGVyZW8gc2FtcGxlczoKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIHBvc3Qgc3RlcmVvIHRvIG1vbm8gY29udmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgZG93bm1peF90b19tb25vX2kxNl9mcm9tX3N0ZXJlb19pMTYoYWN0aXZlVHJhY2stPm1TaW5rLmkxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKilhY3RpdmVUcmFjay0+bVJzbXBPdXRCdWZmZXIsIGZyYW1lc091dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXRoZXJBbmRDbGFtcCgoaW50MzJfdCAqKWFjdGl2ZVRyYWNrLT5tU2luay5yYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUnNtcE91dEJ1ZmZlciwgZnJhbWVzT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBub3cgZG9uZSB3aXRoIG1Sc21wT3V0QnVmZmVyCi0KLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYWxsb3cgZnJhbWVzT3V0IHRvIGJlIGxhcmdlciB0aGFuIHdoYXQgaXMgcG9zc2libGUgd2l0aCByZXNhbXBsaW5nCisgICAgICAgICAgICAgICAgLy8gZnJvbSBmcmFtZXNJbi4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzbid0IHN0cmljdGx5IG5lY2Vzc2FyeSBidXQgaGVscHMgbGltaXQgYnVmZmVyIHJlc2l6aW5nIGluCisgICAgICAgICAgICAgICAgLy8gUmVjb3JkQnVmZmVyQ29udmVydGVyLiAgVE9ETzogcmVtb3ZlIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZC4KKyAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSBtaW4oZnJhbWVzT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25GcmFtZXNQb3NzaWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4sIG1TYW1wbGVSYXRlLCBhY3RpdmVUcmFjay0+bVNhbXBsZVJhdGUpKTsKKyAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGZyYW1lcyBmcm9tIHRoZSBSZWNvcmRUaHJlYWQgYnVmZmVyIHByb3ZpZGVyIHRvIHRoZSBSZWNvcmRUcmFjayBidWZmZXIKKyAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSBhY3RpdmVUcmFjay0+bVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+Y29udmVydCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU2luay5yYXcsIGFjdGl2ZVRyYWNrLT5tUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIsIGZyYW1lc091dCk7CiAKICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzT3V0ID4gMCAmJiAob3ZlcnJ1biA9PSBPVkVSUlVOX1VOS05PV04pKSB7CiAgICAgICAgICAgICAgICAgICAgIG92ZXJydW4gPSBPVkVSUlVOX0ZBTFNFOwpAQCAtNTY1Miw4ICs2MDU0LDkgQEAKICAgICAvLyBjbGllbnQgZXhwcmVzc2VzIGEgcHJlZmVyZW5jZSBmb3IgRkFTVCwgYnV0IHdlIGdldCB0aGUgZmluYWwgc2F5CiAgICAgaWYgKCpmbGFncyAmIElBdWRpb0ZsaW5nZXI6OlRSQUNLX0ZBU1QpIHsKICAgICAgIGlmICgKLSAgICAgICAgICAgIC8vIHVzZSBjYXNlOiBjYWxsYmFjayBoYW5kbGVyCi0gICAgICAgICAgICAodGlkICE9IC0xKSAmJgorICAgICAgICAgICAgLy8gd2UgZm9ybWVybHkgY2hlY2tlZCBmb3IgYSBjYWxsYmFjayBoYW5kbGVyIChub24tMCB0aWQpLAorICAgICAgICAgICAgLy8gYnV0IHRoYXQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGZvciBUUkFOU0ZFUl9PQlRBSU4gbW9kZQorICAgICAgICAgICAgLy8KICAgICAgICAgICAgIC8vIGZyYW1lIGNvdW50IGlzIG5vdCBzcGVjaWZpZWQsIG9yIGlzIGV4YWN0bHkgdGhlIHBpcGUgZGVwdGgKICAgICAgICAgICAgICgoZnJhbWVDb3VudCA9PSAwKSB8fCAoZnJhbWVDb3VudCA9PSBtUGlwZUZyYW1lc1AyKSkgJiYKICAgICAgICAgICAgIC8vIFBDTSBkYXRhCkBAIC01ODE5LDEyICs2MjIyLDkgQEAKICAgICAgICAgLy8gd2FzIGluaXRpYWxpemVkIHRvIHNvbWUgdmFsdWUgY2xvc2VyIHRvIHRoZSB0aHJlYWQncyBtUnNtcEluRnJvbnQsIHRoZW4gdGhlIHRyYWNrIGNvdWxkCiAgICAgICAgIC8vIHNlZSBwcmV2aW91c2x5IGJ1ZmZlcmVkIGRhdGEgYmVmb3JlIGl0IGNhbGxlZCBzdGFydCgpLCBidXQgd2l0aCBncmVhdGVyIHJpc2sgb2Ygb3ZlcnJ1bi4KIAotICAgICAgICByZWNvcmRUcmFjay0+bVJzbXBJbkZyb250ID0gbVJzbXBJblJlYXI7Ci0gICAgICAgIHJlY29yZFRyYWNrLT5tUnNtcEluVW5yZWwgPSAwOwotICAgICAgICAvLyBGSVhNRSB3aHkgcmVzZXQ/Ci0gICAgICAgIGlmIChyZWNvcmRUcmFjay0+bVJlc2FtcGxlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICByZWNvcmRUcmFjay0+bVJlc2FtcGxlci0+cmVzZXQoKTsKLSAgICAgICAgfQorICAgICAgICByZWNvcmRUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOworICAgICAgICAvLyBjbGVhciBhbnkgY29udmVydGVyIHN0YXRlIGFzIG5ldyBkYXRhIHdpbGwgYmUgZGlzY29udGludW91cworICAgICAgICByZWNvcmRUcmFjay0+bVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+cmVzZXQoKTsKICAgICAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RBUlRJTkdfMjsKICAgICAgICAgLy8gc2lnbmFsIHRocmVhZCB0byBzdGFydAogICAgICAgICBtV2FpdFdvcmtDVi5icm9hZGNhc3QoKTsKQEAgLTU5NDIsMTUgKzYzNDIsMTcgQEAKIHsKICAgICBkcHJpbnRmKGZkLCAiXG5JbnB1dCB0aHJlYWQgJXA6XG4iLCB0aGlzKTsKIAotICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSA+IDApIHsKLSAgICAgICAgZHByaW50ZihmZCwgIiAgQnVmZmVyIHNpemU6ICV6dSBieXRlc1xuIiwgbUJ1ZmZlclNpemUpOwotICAgIH0gZWxzZSB7CisgICAgZHVtcEJhc2UoZmQsIGFyZ3MpOworCisgICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpID09IDApIHsKICAgICAgICAgZHByaW50ZihmZCwgIiAgTm8gYWN0aXZlIHJlY29yZCBjbGllbnRzXG4iKTsKICAgICB9CiAgICAgZHByaW50ZihmZCwgIiAgRmFzdCBjYXB0dXJlIHRocmVhZDogJXNcbiIsIGhhc0Zhc3RDYXB0dXJlKCkgPyAieWVzIiA6ICJubyIpOwogICAgIGRwcmludGYoZmQsICIgIEZhc3QgdHJhY2sgYXZhaWxhYmxlOiAlc1xuIiwgbUZhc3RUcmFja0F2YWlsID8gInllcyIgOiAibm8iKTsKIAotICAgIGR1bXBCYXNlKGZkLCBhcmdzKTsKKyAgICAvLyAgTWFrZSBhIG5vbi1hdG9taWMgY29weSBvZiBmYXN0IGNhcHR1cmUgZHVtcCBzdGF0ZSBzbyBpdCB3b24ndCBjaGFuZ2UgdW5kZXJuZWF0aCB1cworICAgIGNvbnN0IEZhc3RDYXB0dXJlRHVtcFN0YXRlIGNvcHkobUZhc3RDYXB0dXJlRHVtcFN0YXRlKTsKKyAgICBjb3B5LmR1bXAoZmQpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKQEAgLTU5OTgsMTIgKzY0MDAsNTIgQEAKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIH0KIAorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZXNhbXBsZXJCdWZmZXJQcm92aWRlcjo6cmVzZXQoKQoreworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZEJhc2UgPSBtUmVjb3JkVHJhY2stPm1UaHJlYWQucHJvbW90ZSgpOworICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKSB0aHJlYWRCYXNlLmdldCgpOworICAgIG1Sc21wSW5Gcm9udCA9IHJlY29yZFRocmVhZC0+bVJzbXBJblJlYXI7CisgICAgbVJzbXBJblVucmVsID0gMDsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVzYW1wbGVyQnVmZmVyUHJvdmlkZXI6OnN5bmMoCisgICAgICAgIHNpemVfdCAqZnJhbWVzQXZhaWxhYmxlLCBib29sICpoYXNPdmVycnVuKQoreworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZEJhc2UgPSBtUmVjb3JkVHJhY2stPm1UaHJlYWQucHJvbW90ZSgpOworICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKSB0aHJlYWRCYXNlLmdldCgpOworICAgIGNvbnN0IGludDMyX3QgcmVhciA9IHJlY29yZFRocmVhZC0+bVJzbXBJblJlYXI7CisgICAgY29uc3QgaW50MzJfdCBmcm9udCA9IG1Sc21wSW5Gcm9udDsKKyAgICBjb25zdCBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBmcm9udDsKKworICAgIHNpemVfdCBmcmFtZXNJbjsKKyAgICBib29sIG92ZXJydW4gPSBmYWxzZTsKKyAgICBpZiAoZmlsbGVkIDwgMCkgeworICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IHRyZWF0IGxpa2UgYSBtYXNzaXZlIG92ZXJydW4gYW5kIHJlLXN5bmMKKyAgICAgICAgZnJhbWVzSW4gPSAwOworICAgICAgICBtUnNtcEluRnJvbnQgPSByZWFyOworICAgICAgICBvdmVycnVuID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKChzaXplX3QpIGZpbGxlZCA8PSByZWNvcmRUaHJlYWQtPm1Sc21wSW5GcmFtZXMpIHsKKyAgICAgICAgZnJhbWVzSW4gPSAoc2l6ZV90KSBmaWxsZWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gY2xpZW50IGlzIG5vdCBrZWVwaW5nIHVwIHdpdGggc2VydmVyLCBidXQgZ2l2ZSBpdCBsYXRlc3QgZGF0YQorICAgICAgICBmcmFtZXNJbiA9IHJlY29yZFRocmVhZC0+bVJzbXBJbkZyYW1lczsKKyAgICAgICAgbVJzbXBJbkZyb250ID0gLyogZnJvbnQgPSAqLyByZWFyIC0gZnJhbWVzSW47CisgICAgICAgIG92ZXJydW4gPSB0cnVlOworICAgIH0KKyAgICBpZiAoZnJhbWVzQXZhaWxhYmxlICE9IE5VTEwpIHsKKyAgICAgICAgKmZyYW1lc0F2YWlsYWJsZSA9IGZyYW1lc0luOworICAgIH0KKyAgICBpZiAoaGFzT3ZlcnJ1biAhPSBOVUxMKSB7CisgICAgICAgICpoYXNPdmVycnVuID0gb3ZlcnJ1bjsKKyAgICB9Cit9CisKIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVzYW1wbGVyQnVmZmVyUHJvdmlkZXI6OmdldE5leHRCdWZmZXIoCiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cyBfX3VudXNlZCkKIHsKLSAgICBSZWNvcmRUcmFjayAqYWN0aXZlVHJhY2sgPSBtUmVjb3JkVHJhY2s7Ci0gICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkQmFzZSA9IGFjdGl2ZVRyYWNrLT5tVGhyZWFkLnByb21vdGUoKTsKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWRCYXNlID0gbVJlY29yZFRyYWNrLT5tVGhyZWFkLnByb21vdGUoKTsKICAgICBpZiAodGhyZWFkQmFzZSA9PSAwKSB7CiAgICAgICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7CiAgICAgICAgIGJ1ZmZlci0+cmF3ID0gTlVMTDsKQEAgLTYwMTEsNyArNjQ1Myw3IEBACiAgICAgfQogICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKSB0aHJlYWRCYXNlLmdldCgpOwogICAgIGludDMyX3QgcmVhciA9IHJlY29yZFRocmVhZC0+bVJzbXBJblJlYXI7Ci0gICAgaW50MzJfdCBmcm9udCA9IGFjdGl2ZVRyYWNrLT5tUnNtcEluRnJvbnQ7CisgICAgaW50MzJfdCBmcm9udCA9IG1Sc21wSW5Gcm9udDsKICAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBmcm9udDsKICAgICAvLyBGSVhNRSBzaG91bGQgbm90IGJlIFAyIChkb24ndCB3YW50IHRvIGluY3JlYXNlIGxhdGVuY3kpCiAgICAgLy8gRklYTUUgaWYgY2xpZW50IG5vdCBrZWVwaW5nIHVwLCBkaXNjYXJkCkBAIC02MDI4LDE3ICs2NDcwLDE2IEBACiAgICAgICAgIHBhcnQxID0gYXNrOwogICAgIH0KICAgICBpZiAocGFydDEgPT0gMCkgewotICAgICAgICAvLyBIaWdoZXItbGV2ZWwgc2hvdWxkIGtlZXAgbVJzbXBJbkJ1ZmZlciBmdWxsLCBhbmQgbm90IGNhbGwgcmVzYW1wbGVyIGlmIGVtcHR5Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlJlY29yZFRocmVhZDo6Z2V0TmV4dEJ1ZmZlcigpIHN0YXJ2ZWQiKTsKKyAgICAgICAgLy8gb3V0IG9mIGRhdGEgaXMgZmluZSBzaW5jZSB0aGUgcmVzYW1wbGVyIHdpbGwgcmV0dXJuIGEgc2hvcnQtY291bnQuCiAgICAgICAgIGJ1ZmZlci0+cmF3ID0gTlVMTDsKICAgICAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKLSAgICAgICAgYWN0aXZlVHJhY2stPm1Sc21wSW5VbnJlbCA9IDA7CisgICAgICAgIG1Sc21wSW5VbnJlbCA9IDA7CiAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CiAgICAgfQogCi0gICAgYnVmZmVyLT5yYXcgPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5CdWZmZXIgKyBmcm9udCAqIHJlY29yZFRocmVhZC0+bUNoYW5uZWxDb3VudDsKKyAgICBidWZmZXItPnJhdyA9ICh1aW50OF90KilyZWNvcmRUaHJlYWQtPm1Sc21wSW5CdWZmZXIgKyBmcm9udCAqIHJlY29yZFRocmVhZC0+bUZyYW1lU2l6ZTsKICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBwYXJ0MTsKLSAgICBhY3RpdmVUcmFjay0+bVJzbXBJblVucmVsID0gcGFydDE7CisgICAgbVJzbXBJblVucmVsID0gcGFydDE7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC02MDQ2LDE4ICs2NDg3LDI2NCBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVzYW1wbGVyQnVmZmVyUHJvdmlkZXI6OnJlbGVhc2VCdWZmZXIoCiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewotICAgIFJlY29yZFRyYWNrICphY3RpdmVUcmFjayA9IG1SZWNvcmRUcmFjazsKICAgICBzaXplX3Qgc3RlcENvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OwogICAgIGlmIChzdGVwQ291bnQgPT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIEFMT0dfQVNTRVJUKHN0ZXBDb3VudCA8PSBhY3RpdmVUcmFjay0+bVJzbXBJblVucmVsKTsKLSAgICBhY3RpdmVUcmFjay0+bVJzbXBJblVucmVsIC09IHN0ZXBDb3VudDsKLSAgICBhY3RpdmVUcmFjay0+bVJzbXBJbkZyb250ICs9IHN0ZXBDb3VudDsKKyAgICBBTE9HX0FTU0VSVChzdGVwQ291bnQgPD0gbVJzbXBJblVucmVsKTsKKyAgICBtUnNtcEluVW5yZWwgLT0gc3RlcENvdW50OworICAgIG1Sc21wSW5Gcm9udCArPSBzdGVwQ291bnQ7CiAgICAgYnVmZmVyLT5yYXcgPSBOVUxMOwogICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7CiB9CiAKK0F1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRCdWZmZXJDb252ZXJ0ZXI6OlJlY29yZEJ1ZmZlckNvbnZlcnRlcigKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgc3JjQ2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IHNyY0Zvcm1hdCwKKyAgICAgICAgdWludDMyX3Qgc3JjU2FtcGxlUmF0ZSwKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgZHN0Q2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGRzdEZvcm1hdCwKKyAgICAgICAgdWludDMyX3QgZHN0U2FtcGxlUmF0ZSkgOgorICAgICAgICAgICAgbVNyY0NoYW5uZWxNYXNrKEFVRElPX0NIQU5ORUxfSU5WQUxJRCksIC8vIHVwZGF0ZVBhcmFtZXRlcnMgd2lsbCBzZXQgZm9sbG93aW5nIHZhcnMKKyAgICAgICAgICAgIC8vIG1TcmNGb3JtYXQKKyAgICAgICAgICAgIC8vIG1TcmNTYW1wbGVSYXRlCisgICAgICAgICAgICAvLyBtRHN0Q2hhbm5lbE1hc2sKKyAgICAgICAgICAgIC8vIG1Ec3RGb3JtYXQKKyAgICAgICAgICAgIC8vIG1Ec3RTYW1wbGVSYXRlCisgICAgICAgICAgICAvLyBtU3JjQ2hhbm5lbENvdW50CisgICAgICAgICAgICAvLyBtRHN0Q2hhbm5lbENvdW50CisgICAgICAgICAgICAvLyBtRHN0RnJhbWVTaXplCisgICAgICAgICAgICBtQnVmKE5VTEwpLCBtQnVmRnJhbWVzKDApLCBtQnVmRnJhbWVTaXplKDApLAorICAgICAgICAgICAgbVJlc2FtcGxlcihOVUxMKSwKKyAgICAgICAgICAgIG1Jc0xlZ2FjeURvd25taXgoZmFsc2UpLAorICAgICAgICAgICAgbUlzTGVnYWN5VXBtaXgoZmFsc2UpLAorICAgICAgICAgICAgbVJlcXVpcmVzRmxvYXQoZmFsc2UpLAorICAgICAgICAgICAgbUlucHV0Q29udmVydGVyUHJvdmlkZXIoTlVMTCkKK3sKKyAgICAodm9pZCl1cGRhdGVQYXJhbWV0ZXJzKHNyY0NoYW5uZWxNYXNrLCBzcmNGb3JtYXQsIHNyY1NhbXBsZVJhdGUsCisgICAgICAgICAgICBkc3RDaGFubmVsTWFzaywgZHN0Rm9ybWF0LCBkc3RTYW1wbGVSYXRlKTsKK30KKworQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZEJ1ZmZlckNvbnZlcnRlcjo6flJlY29yZEJ1ZmZlckNvbnZlcnRlcigpIHsKKyAgICBmcmVlKG1CdWYpOworICAgIGRlbGV0ZSBtUmVzYW1wbGVyOworICAgIGRlbGV0ZSBtSW5wdXRDb252ZXJ0ZXJQcm92aWRlcjsKK30KKworc2l6ZV90IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRCdWZmZXJDb252ZXJ0ZXI6OmNvbnZlcnQodm9pZCAqZHN0LAorICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyICpwcm92aWRlciwgc2l6ZV90IGZyYW1lcykKK3sKKyAgICBpZiAobUlucHV0Q29udmVydGVyUHJvdmlkZXIgIT0gTlVMTCkgeworICAgICAgICBtSW5wdXRDb252ZXJ0ZXJQcm92aWRlci0+c2V0QnVmZmVyUHJvdmlkZXIocHJvdmlkZXIpOworICAgICAgICBwcm92aWRlciA9IG1JbnB1dENvbnZlcnRlclByb3ZpZGVyOworICAgIH0KKworICAgIGlmIChtUmVzYW1wbGVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1ZWKCJOTyBSRVNBTVBMSU5HIHNhbXBsZVJhdGU6JXUgbVNyY0Zvcm1hdDolI3ggbURzdEZvcm1hdDolI3giLAorICAgICAgICAgICAgICAgIG1TcmNTYW1wbGVSYXRlLCBtU3JjRm9ybWF0LCBtRHN0Rm9ybWF0KTsKKworICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgYnVmZmVyOworICAgICAgICBmb3IgKHNpemVfdCBpID0gZnJhbWVzOyBpID4gMDsgKSB7CisgICAgICAgICAgICBidWZmZXIuZnJhbWVDb3VudCA9IGk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmYnVmZmVyLCAwKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gT0sgfHwgYnVmZmVyLmZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIGZyYW1lcyAtPSBpOyAvLyBjYW5ub3QgZmlsbCByZXF1ZXN0LgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZm9ybWF0IGNvbnZlcnQgdG8gZGVzdGluYXRpb24gYnVmZmVyCisgICAgICAgICAgICBjb252ZXJ0Tm9SZXNhbXBsZXIoZHN0LCBidWZmZXIucmF3LCBidWZmZXIuZnJhbWVDb3VudCk7CisKKyAgICAgICAgICAgIGRzdCA9IChpbnQ4X3QqKWRzdCArIGJ1ZmZlci5mcmFtZUNvdW50ICogbURzdEZyYW1lU2l6ZTsKKyAgICAgICAgICAgIGkgLT0gYnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgICAgICBwcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICBBTE9HVlYoIlJFU0FNUExJTkcgbVNyY1NhbXBsZVJhdGU6JXUgbURzdFNhbXBsZVJhdGU6JXUgbVNyY0Zvcm1hdDolI3ggbURzdEZvcm1hdDolI3giLAorICAgICAgICAgICAgICAgICBtU3JjU2FtcGxlUmF0ZSwgbURzdFNhbXBsZVJhdGUsIG1TcmNGb3JtYXQsIG1Ec3RGb3JtYXQpOworCisgICAgICAgICAvLyByZWFsbG9jYXRlIGJ1ZmZlciBpZiBuZWVkZWQKKyAgICAgICAgIGlmIChtQnVmRnJhbWVTaXplICE9IDAgJiYgbUJ1ZkZyYW1lcyA8IGZyYW1lcykgeworICAgICAgICAgICAgIGZyZWUobUJ1Zik7CisgICAgICAgICAgICAgbUJ1ZkZyYW1lcyA9IGZyYW1lczsKKyAgICAgICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbUJ1ZiwgMzIsIG1CdWZGcmFtZXMgKiBtQnVmRnJhbWVTaXplKTsKKyAgICAgICAgIH0KKyAgICAgICAgLy8gcmVzYW1wbGVyIGFjY3VtdWxhdGVzLCBidXQgd2Ugb25seSBoYXZlIG9uZSBzb3VyY2UgdHJhY2sKKyAgICAgICAgbWVtc2V0KG1CdWYsIDAsIGZyYW1lcyAqIG1CdWZGcmFtZVNpemUpOworICAgICAgICBmcmFtZXMgPSBtUmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50MzJfdCopbUJ1ZiwgZnJhbWVzLCBwcm92aWRlcik7CisgICAgICAgIC8vIGZvcm1hdCBjb252ZXJ0IHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICAgICAgICBjb252ZXJ0UmVzYW1wbGVyKGRzdCwgbUJ1ZiwgZnJhbWVzKTsKKyAgICB9CisgICAgcmV0dXJuIGZyYW1lczsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZEJ1ZmZlckNvbnZlcnRlcjo6dXBkYXRlUGFyYW1ldGVycygKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgc3JjQ2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IHNyY0Zvcm1hdCwKKyAgICAgICAgdWludDMyX3Qgc3JjU2FtcGxlUmF0ZSwKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgZHN0Q2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGRzdEZvcm1hdCwKKyAgICAgICAgdWludDMyX3QgZHN0U2FtcGxlUmF0ZSkKK3sKKyAgICAvLyBxdWljayBldmFsdWF0aW9uIGlmIHRoZXJlIGlzIGFueSBjaGFuZ2UuCisgICAgaWYgKG1TcmNGb3JtYXQgPT0gc3JjRm9ybWF0CisgICAgICAgICAgICAmJiBtU3JjQ2hhbm5lbE1hc2sgPT0gc3JjQ2hhbm5lbE1hc2sKKyAgICAgICAgICAgICYmIG1TcmNTYW1wbGVSYXRlID09IHNyY1NhbXBsZVJhdGUKKyAgICAgICAgICAgICYmIG1Ec3RGb3JtYXQgPT0gZHN0Rm9ybWF0CisgICAgICAgICAgICAmJiBtRHN0Q2hhbm5lbE1hc2sgPT0gZHN0Q2hhbm5lbE1hc2sKKyAgICAgICAgICAgICYmIG1Ec3RTYW1wbGVSYXRlID09IGRzdFNhbXBsZVJhdGUpIHsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIEFMT0dWKCJSZWNvcmRCdWZmZXJDb252ZXJ0ZXIgdXBkYXRlUGFyYW1ldGVycyBzcmNNYXNrOiUjeCBkc3RNYXNrOiUjeCIKKyAgICAgICAgICAgICIgIHNyY0Zvcm1hdDolI3ggZHN0Rm9ybWF0OiUjeCAgc3JjUmF0ZToldSBkc3RSYXRlOiV1IiwKKyAgICAgICAgICAgIHNyY0NoYW5uZWxNYXNrLCBkc3RDaGFubmVsTWFzaywgc3JjRm9ybWF0LCBkc3RGb3JtYXQsIHNyY1NhbXBsZVJhdGUsIGRzdFNhbXBsZVJhdGUpOworICAgIGNvbnN0IGJvb2wgdmFsaWQgPQorICAgICAgICAgICAgYXVkaW9faXNfaW5wdXRfY2hhbm5lbChzcmNDaGFubmVsTWFzaykKKyAgICAgICAgICAgICYmIGF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoZHN0Q2hhbm5lbE1hc2spCisgICAgICAgICAgICAmJiBhdWRpb19pc192YWxpZF9mb3JtYXQoc3JjRm9ybWF0KSAmJiBhdWRpb19pc19saW5lYXJfcGNtKHNyY0Zvcm1hdCkKKyAgICAgICAgICAgICYmIGF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChkc3RGb3JtYXQpICYmIGF1ZGlvX2lzX2xpbmVhcl9wY20oZHN0Rm9ybWF0KQorICAgICAgICAgICAgJiYgKHNyY1NhbXBsZVJhdGUgPD0gZHN0U2FtcGxlUmF0ZSAqIEFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWCkKKyAgICAgICAgICAgIDsgLy8gbm8gdXBzYW1wbGluZyBjaGVja3MgZm9yIG5vdworICAgIGlmICghdmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtU3JjRm9ybWF0ID0gc3JjRm9ybWF0OworICAgIG1TcmNDaGFubmVsTWFzayA9IHNyY0NoYW5uZWxNYXNrOworICAgIG1TcmNTYW1wbGVSYXRlID0gc3JjU2FtcGxlUmF0ZTsKKyAgICBtRHN0Rm9ybWF0ID0gZHN0Rm9ybWF0OworICAgIG1Ec3RDaGFubmVsTWFzayA9IGRzdENoYW5uZWxNYXNrOworICAgIG1Ec3RTYW1wbGVSYXRlID0gZHN0U2FtcGxlUmF0ZTsKKworICAgIC8vIGNvbXB1dGUgZGVyaXZlZCBwYXJhbWV0ZXJzCisgICAgbVNyY0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKHNyY0NoYW5uZWxNYXNrKTsKKyAgICBtRHN0Q2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soZHN0Q2hhbm5lbE1hc2spOworICAgIG1Ec3RGcmFtZVNpemUgPSBtRHN0Q2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRHN0Rm9ybWF0KTsKKworICAgIC8vIGRvIHdlIG5lZWQgdG8gcmVzYW1wbGU/CisgICAgZGVsZXRlIG1SZXNhbXBsZXI7CisgICAgbVJlc2FtcGxlciA9IE5VTEw7CisgICAgaWYgKG1TcmNTYW1wbGVSYXRlICE9IG1Ec3RTYW1wbGVSYXRlKSB7CisgICAgICAgIG1SZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQsCisgICAgICAgICAgICAgICAgbVNyY0NoYW5uZWxDb3VudCwgbURzdFNhbXBsZVJhdGUpOworICAgICAgICBtUmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKG1TcmNTYW1wbGVSYXRlKTsKKyAgICAgICAgbVJlc2FtcGxlci0+c2V0Vm9sdW1lKEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQsIEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQpOworICAgIH0KKworICAgIC8vIGFyZSB3ZSBydW5uaW5nIGxlZ2FjeSBjaGFubmVsIGNvbnZlcnNpb24gbW9kZXM/CisgICAgbUlzTGVnYWN5RG93bm1peCA9IChtU3JjQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtU3JjQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9CQUNLKQorICAgICAgICAgICAgICAgICAgICYmIG1Ec3RDaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOX01PTk87CisgICAgbUlzTGVnYWN5VXBtaXggPSBtU3JjQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9NT05PCisgICAgICAgICAgICAgICAgICAgJiYgKG1Ec3RDaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOX1NURVJFTworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1Ec3RDaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0spOworCisgICAgLy8gZG8gd2UgbmVlZCB0byBwcm9jZXNzIGluIGZsb2F0PworICAgIG1SZXF1aXJlc0Zsb2F0ID0gbVJlc2FtcGxlciAhPSBOVUxMIHx8IG1Jc0xlZ2FjeURvd25taXggfHwgbUlzTGVnYWN5VXBtaXg7CisKKyAgICAvLyBkbyB3ZSBuZWVkIGEgc3RhZ2luZyBidWZmZXIgdG8gY29udmVydCBmb3IgZGVzdGluYXRpb24gKHdlIGNhbiBzdGlsbCBvcHRpbWl6ZSB0aGlzKT8KKyAgICAvLyB3ZSB1c2UgbUJ1ZkZyYW1lU2l6ZSA+IDAgdG8gaW5kaWNhdGUgYm90aCBmcmFtZSBzaXplIGFzIHdlbGwgYXMgYnVmZmVyIG5lY2Vzc2l0eQorICAgIGlmIChtUmVzYW1wbGVyICE9IE5VTEwpIHsKKyAgICAgICAgbUJ1ZkZyYW1lU2l6ZSA9IG1heChtU3JjQ2hhbm5lbENvdW50LCBGQ0NfMikKKyAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CisgICAgfSBlbHNlIGlmIChtSXNMZWdhY3lVcG1peCB8fCBtSXNMZWdhY3lEb3dubWl4KSB7IC8vIGxlZ2FjeSBtb2RlcyBhbHdheXMgZmxvYXQKKyAgICAgICAgbUJ1ZkZyYW1lU2l6ZSA9IG1Ec3RDaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOworICAgIH0gZWxzZSBpZiAobVNyY0NoYW5uZWxNYXNrICE9IG1Ec3RDaGFubmVsTWFzayAmJiBtRHN0Rm9ybWF0ICE9IG1TcmNGb3JtYXQpIHsKKyAgICAgICAgbUJ1ZkZyYW1lU2l6ZSA9IG1Ec3RDaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1TcmNGb3JtYXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1CdWZGcmFtZVNpemUgPSAwOworICAgIH0KKyAgICBtQnVmRnJhbWVzID0gMDsgLy8gZm9yY2UgdGhlIGJ1ZmZlciB0byBiZSByZXNpemVkLgorCisgICAgLy8gZG8gd2UgbmVlZCBhbiBpbnB1dCBjb252ZXJ0ZXIgYnVmZmVyIHByb3ZpZGVyIHRvIGdpdmUgdXMgZmxvYXQ/CisgICAgZGVsZXRlIG1JbnB1dENvbnZlcnRlclByb3ZpZGVyOworICAgIG1JbnB1dENvbnZlcnRlclByb3ZpZGVyID0gTlVMTDsKKyAgICBpZiAobVJlcXVpcmVzRmxvYXQgJiYgbVNyY0Zvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgIG1JbnB1dENvbnZlcnRlclByb3ZpZGVyID0gbmV3IFJlZm9ybWF0QnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobVNyY0NoYW5uZWxNYXNrKSwKKyAgICAgICAgICAgICAgICBtU3JjRm9ybWF0LAorICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQsCisgICAgICAgICAgICAgICAgMjU2IC8qIHByb3ZpZGVyIGJ1ZmZlciBmcmFtZSBjb3VudCAqLyk7CisgICAgfQorCisgICAgLy8gZG8gd2UgbmVlZCBhIHJlbWl4ZXIgdG8gZG8gY2hhbm5lbCBtYXNrIGNvbnZlcnNpb24KKyAgICBpZiAoIW1Jc0xlZ2FjeURvd25taXggJiYgIW1Jc0xlZ2FjeVVwbWl4ICYmIG1TcmNDaGFubmVsTWFzayAhPSBtRHN0Q2hhbm5lbE1hc2spIHsKKyAgICAgICAgKHZvaWQpIG1lbWNweV9ieV9pbmRleF9hcnJheV9pbml0aWFsaXphdGlvbl9mcm9tX2NoYW5uZWxfbWFzaygKKyAgICAgICAgICAgICAgICBtSWR4QXJ5LCBBUlJBWV9TSVpFKG1JZHhBcnkpLCBtRHN0Q2hhbm5lbE1hc2ssIG1TcmNDaGFubmVsTWFzayk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkQnVmZmVyQ29udmVydGVyOjpjb252ZXJ0Tm9SZXNhbXBsZXIoCisgICAgICAgIHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKQoreworICAgIC8vIHNyYyBpcyBuYXRpdmUgdHlwZSB1bmxlc3MgdGhlcmUgaXMgbGVnYWN5IHVwbWl4IG9yIGRvd25taXgsIHdoZXJldXBvbiBpdCBpcyBmbG9hdC4KKyAgICBpZiAobUJ1ZkZyYW1lU2l6ZSAhPSAwICYmIG1CdWZGcmFtZXMgPCBmcmFtZXMpIHsKKyAgICAgICAgZnJlZShtQnVmKTsKKyAgICAgICAgbUJ1ZkZyYW1lcyA9IGZyYW1lczsKKyAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1CdWYsIDMyLCBtQnVmRnJhbWVzICogbUJ1ZkZyYW1lU2l6ZSk7CisgICAgfQorICAgIC8vIGRvIHdlIG5lZWQgdG8gZG8gbGVnYWN5IHVwbWl4IGFuZCBkb3dubWl4PworICAgIGlmIChtSXNMZWdhY3lVcG1peCB8fCBtSXNMZWdhY3lEb3dubWl4KSB7CisgICAgICAgIHZvaWQgKmRzdEJ1ZiA9IG1CdWYgIT0gTlVMTCA/IG1CdWYgOiBkc3Q7CisgICAgICAgIGlmIChtSXNMZWdhY3lVcG1peCkgeworICAgICAgICAgICAgdXBtaXhfdG9fc3RlcmVvX2Zsb2F0X2Zyb21fbW9ub19mbG9hdCgoZmxvYXQgKilkc3RCdWYsCisgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKXNyYywgZnJhbWVzKTsKKyAgICAgICAgfSBlbHNlIC8qbUlzTGVnYWN5RG93bm1peCAqLyB7CisgICAgICAgICAgICBkb3dubWl4X3RvX21vbm9fZmxvYXRfZnJvbV9zdGVyZW9fZmxvYXQoKGZsb2F0ICopZHN0QnVmLAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKilzcmMsIGZyYW1lcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1CdWYgIT0gTlVMTCkgeworICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChkc3QsIG1Ec3RGb3JtYXQsIG1CdWYsIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lcyAqIG1Ec3RDaGFubmVsQ291bnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gZG8gd2UgbmVlZCB0byBkbyBjaGFubmVsIG1hc2sgY29udmVyc2lvbj8KKyAgICBpZiAobVNyY0NoYW5uZWxNYXNrICE9IG1Ec3RDaGFubmVsTWFzaykgeworICAgICAgICB2b2lkICpkc3RCdWYgPSBtQnVmICE9IE5VTEwgPyBtQnVmIDogZHN0OworICAgICAgICBtZW1jcHlfYnlfaW5kZXhfYXJyYXkoZHN0QnVmLCBtRHN0Q2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgIHNyYywgbVNyY0NoYW5uZWxDb3VudCwgbUlkeEFyeSwgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtU3JjRm9ybWF0KSwgZnJhbWVzKTsKKyAgICAgICAgaWYgKGRzdEJ1ZiA9PSBkc3QpIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gZm9ybWF0IGlzIHRoZSBzYW1lCisgICAgICAgIH0KKyAgICB9CisgICAgLy8gY29udmVydCB0byBkZXN0aW5hdGlvbiBidWZmZXIKKyAgICBjb25zdCB2b2lkICpjb252ZXJ0QnVmID0gbUJ1ZiAhPSBOVUxMID8gbUJ1ZiA6IHNyYzsKKyAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGRzdCwgbURzdEZvcm1hdCwgY29udmVydEJ1ZiwgbVNyY0Zvcm1hdCwKKyAgICAgICAgICAgIGZyYW1lcyAqIG1Ec3RDaGFubmVsQ291bnQpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRCdWZmZXJDb252ZXJ0ZXI6OmNvbnZlcnRSZXNhbXBsZXIoCisgICAgICAgIHZvaWQgKmRzdCwgLypub3QtYS1jb25zdCovIHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykKK3sKKyAgICAvLyBzcmMgYnVmZmVyIGZvcm1hdCBpcyBBTFdBWVMgZmxvYXQgd2hlbiBlbnRlcmluZyB0aGlzIHJvdXRpbmUKKyAgICBpZiAobUlzTGVnYWN5VXBtaXgpIHsKKyAgICAgICAgOyAvLyBtb25vIHRvIHN0ZXJlbyBhbHJlYWR5IGhhbmRsZWQgYnkgcmVzYW1wbGVyCisgICAgfSBlbHNlIGlmIChtSXNMZWdhY3lEb3dubWl4CisgICAgICAgICAgICB8fCAobVNyY0NoYW5uZWxNYXNrID09IG1Ec3RDaGFubmVsTWFzayAmJiBtU3JjQ2hhbm5lbENvdW50ID09IDEpKSB7CisgICAgICAgIC8vIHRoZSByZXNhbXBsZXIgb3V0cHV0cyBzdGVyZW8gZm9yIG1vbm8gaW5wdXQgY2hhbm5lbCAoYSBmZWF0dXJlPykKKyAgICAgICAgLy8gbXVzdCBjb252ZXJ0IHRvIG1vbm8KKyAgICAgICAgZG93bm1peF90b19tb25vX2Zsb2F0X2Zyb21fc3RlcmVvX2Zsb2F0KChmbG9hdCAqKXNyYywKKyAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKilzcmMsIGZyYW1lcyk7CisgICAgfSBlbHNlIGlmIChtU3JjQ2hhbm5lbE1hc2sgIT0gbURzdENoYW5uZWxNYXNrKSB7CisgICAgICAgIC8vIGNvbnZlcnQgdG8gbW9ubyBjaGFubmVsIGFnYWluIGZvciBjaGFubmVsIG1hc2sgY29udmVyc2lvbiAoY291bGQgYmUgc2tpcHBlZAorICAgICAgICAvLyB3aXRoIGZ1cnRoZXIgb3B0aW1pemF0aW9uKS4KKyAgICAgICAgaWYgKG1TcmNDaGFubmVsQ291bnQgPT0gMSkgeworICAgICAgICAgICAgZG93bm1peF90b19tb25vX2Zsb2F0X2Zyb21fc3RlcmVvX2Zsb2F0KChmbG9hdCAqKXNyYywKKyAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKilzcmMsIGZyYW1lcyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gY29udmVydCB0byBkZXN0aW5hdGlvbiBmb3JtYXQgKGluIHBsYWNlLCBPSyBhcyBmbG9hdCBpcyBsYXJnZXIgdGhhbiBvdGhlciB0eXBlcykKKyAgICAgICAgaWYgKG1Ec3RGb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChzcmMsIG1Ec3RGb3JtYXQsIHNyYywgQVVESU9fRk9STUFUX1BDTV9GTE9BVCwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzICogbVNyY0NoYW5uZWxDb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2hhbm5lbCBjb252ZXJ0IGFuZCBzYXZlIHRvIGRzdAorICAgICAgICBtZW1jcHlfYnlfaW5kZXhfYXJyYXkoZHN0LCBtRHN0Q2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgIHNyYywgbVNyY0NoYW5uZWxDb3VudCwgbUlkeEFyeSwgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRHN0Rm9ybWF0KSwgZnJhbWVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBjb252ZXJ0IHRvIGRlc3RpbmF0aW9uIGZvcm1hdCBhbmQgc2F2ZSB0byBkc3QKKyAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGRzdCwgbURzdEZvcm1hdCwgc3JjLCBBVURJT19GT1JNQVRfUENNX0ZMT0FULAorICAgICAgICAgICAgZnJhbWVzICogbURzdENoYW5uZWxDb3VudCk7Cit9CisKIGJvb2wgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmNoZWNrRm9yTmV3UGFyYW1ldGVyX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKQogewpAQCAtNjA2Nyw2ICs2NzU0LDcgQEAKIAogICAgIGF1ZGlvX2Zvcm1hdF90IHJlcUZvcm1hdCA9IG1Gb3JtYXQ7CiAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gbVNhbXBsZVJhdGU7CisgICAgLy8gVE9ETyB0aGlzIG1heSBjaGFuZ2UgaWYgd2Ugd2FudCB0byBzdXBwb3J0IGNhcHR1cmUgZnJvbSBIRE1JIFBDTSBtdWx0aSBjaGFubmVsIChlLmcgb24gVFZzKS4KICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KG1DaGFubmVsQ291bnQpOwogCiAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXIpOwpAQCAtNjA3OSw3ICs2NzY3LDcgQEAKICAgICAgICAgcmVjb25maWcgPSB0cnVlOwogICAgIH0KICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUZvcm1hdCksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICBpZiAoKGF1ZGlvX2Zvcm1hdF90KSB2YWx1ZSAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgeworICAgICAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oKGF1ZGlvX2Zvcm1hdF90KSB2YWx1ZSkpIHsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJlcUZvcm1hdCA9IChhdWRpb19mb3JtYXRfdCkgdmFsdWU7CkBAIC02MDg4LDcgKzY3NzYsOCBAQAogICAgIH0KICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUNoYW5uZWxzKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7CiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1hc2sgPSAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpIHZhbHVlOwotICAgICAgICBpZiAobWFzayAhPSBBVURJT19DSEFOTkVMX0lOX01PTk8gJiYgbWFzayAhPSBBVURJT19DSEFOTkVMX0lOX1NURVJFTykgeworICAgICAgICBpZiAoIWF1ZGlvX2lzX2lucHV0X2NoYW5uZWwobWFzaykgfHwKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtYXNrKSA+IEZDQ184KSB7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjaGFubmVsTWFzayA9IG1hc2s7CkBAIC02MTIwLDYgKzY4MDksOSBAQAogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbUluRGV2aWNlID0gdmFsdWU7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBtUHJldkluRGV2aWNlID0gdmFsdWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBkaXNhYmxlIEFFQyBhbmQgTlMgaWYgdGhlIGRldmljZSBpcyBhIEJUIFNDTyBoZWFkc2V0IHN1cHBvcnRpbmcgdGhvc2UKICAgICAgICAgICAgIC8vIHByZSBwcm9jZXNzaW5ncwogICAgICAgICAgICAgaWYgKG1UcmFja3Muc2l6ZSgpID4gMCkgewpAQCAtNjE1MywxOSArNjg0NSwxNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChyZWNvbmZpZykgewogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBCQURfVkFMVUUgJiYKLSAgICAgICAgICAgICAgICByZXFGb3JtYXQgPT0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfZm9ybWF0KCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKSAmJgotICAgICAgICAgICAgICAgIHJlcUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCAmJgorICAgICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20obUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfZm9ybWF0KCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKSkgJiYKKyAgICAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKHJlcUZvcm1hdCkgJiYKICAgICAgICAgICAgICAgICAobUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfc2FtcGxlX3JhdGUoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pCi0gICAgICAgICAgICAgICAgICAgICAgICA8PSAoMiAqIHNhbXBsaW5nUmF0ZSkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICA8PSAoQVVESU9fUkVTQU1QTEVSX0RPV05fUkFUSU9fTUFYICogc2FtcGxpbmdSYXRlKSkgJiYKICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzaygKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKSkgPD0gRkNDXzIgJiYKLSAgICAgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9NT05PIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOX1NURVJFTykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dC0+c3RyZWFtLT5jb21tb24uZ2V0X2NoYW5uZWxzKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uKSkgPD0gRkNDXzgpIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICByZWFkSW5wdXRQYXJhbWV0ZXJzX2woKTsKLSAgICAgICAgICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEF1ZGlvU3lzdGVtOjpJTlBVVF9DT05GSUdfQ0hBTkdFRCk7CisgICAgICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBVURJT19JTlBVVF9DT05GSUdfQ0hBTkdFRCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC02MTg2LDI2ICs2ODc2LDI3IEBACiAgICAgcmV0dXJuIG91dF9zODsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6YXVkaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgaW50IHBhcmFtIF9fdW51c2VkKSB7Ci0gICAgQXVkaW9TeXN0ZW06Ok91dHB1dERlc2NyaXB0b3IgZGVzYzsKLSAgICBjb25zdCB2b2lkICpwYXJhbTIgPSBOVUxMOwordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkKSB7CisgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGRlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKKworICAgIGRlc2MtPm1Jb0hhbmRsZSA9IG1JZDsKIAogICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICBjYXNlIEF1ZGlvU3lzdGVtOjpJTlBVVF9PUEVORUQ6Ci0gICAgY2FzZSBBdWRpb1N5c3RlbTo6SU5QVVRfQ09ORklHX0NIQU5HRUQ6Ci0gICAgICAgIGRlc2MuY2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2s7Ci0gICAgICAgIGRlc2Muc2FtcGxpbmdSYXRlID0gbVNhbXBsZVJhdGU7Ci0gICAgICAgIGRlc2MuZm9ybWF0ID0gbUZvcm1hdDsKLSAgICAgICAgZGVzYy5mcmFtZUNvdW50ID0gbUZyYW1lQ291bnQ7Ci0gICAgICAgIGRlc2MubGF0ZW5jeSA9IDA7Ci0gICAgICAgIHBhcmFtMiA9ICZkZXNjOworICAgIGNhc2UgQVVESU9fSU5QVVRfT1BFTkVEOgorICAgIGNhc2UgQVVESU9fSU5QVVRfQ09ORklHX0NIQU5HRUQ6CisgICAgICAgIGRlc2MtPm1QYXRjaCA9IG1QYXRjaDsKKyAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrOworICAgICAgICBkZXNjLT5tU2FtcGxpbmdSYXRlID0gbVNhbXBsZVJhdGU7CisgICAgICAgIGRlc2MtPm1Gb3JtYXQgPSBtRm9ybWF0OworICAgICAgICBkZXNjLT5tRnJhbWVDb3VudCA9IG1GcmFtZUNvdW50OworICAgICAgICBkZXNjLT5tTGF0ZW5jeSA9IDA7CiAgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBBdWRpb1N5c3RlbTo6SU5QVVRfQ0xPU0VEOgorICAgIGNhc2UgQVVESU9fSU5QVVRfQ0xPU0VEOgogICAgIGRlZmF1bHQ6CiAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBtQXVkaW9GbGluZ2VyLT5hdWRpb0NvbmZpZ0NoYW5nZWQoZXZlbnQsIG1JZCwgcGFyYW0yKTsKKyAgICBtQXVkaW9GbGluZ2VyLT5pb0NvbmZpZ0NoYW5nZWQoZXZlbnQsIGRlc2MsIHBpZCk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpCkBAIC02MjEzLDEwICs2OTA0LDEzIEBACiAgICAgbVNhbXBsZVJhdGUgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9zYW1wbGVfcmF0ZSgmbUlucHV0LT5zdHJlYW0tPmNvbW1vbik7CiAgICAgbUNoYW5uZWxNYXNrID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfY2hhbm5lbHMoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgIG1DaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtQ2hhbm5lbE1hc2spOworICAgIGlmIChtQ2hhbm5lbENvdW50ID4gRkNDXzgpIHsKKyAgICAgICAgQUxPR0UoIkhBTCBjaGFubmVsIGNvdW50ICVkID4gJWQiLCBtQ2hhbm5lbENvdW50LCBGQ0NfOCk7CisgICAgfQogICAgIG1IQUxGb3JtYXQgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLmdldF9mb3JtYXQoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwogICAgIG1Gb3JtYXQgPSBtSEFMRm9ybWF0OwotICAgIGlmIChtRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7Ci0gICAgICAgIEFMT0dFKCJIQUwgZm9ybWF0ICUjeCBub3Qgc3VwcG9ydGVkOyBtdXN0IGJlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIiwgbUZvcm1hdCk7CisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgIEFMT0dFKCJIQUwgZm9ybWF0ICUjeCBpcyBub3QgbGluZWFyIHBjbSIsIG1Gb3JtYXQpOwogICAgIH0KICAgICBtRnJhbWVTaXplID0gYXVkaW9fc3RyZWFtX2luX2ZyYW1lX3NpemUobUlucHV0LT5zdHJlYW0pOwogICAgIG1CdWZmZXJTaXplID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5nZXRfYnVmZmVyX3NpemUoJm1JbnB1dC0+c3RyZWFtLT5jb21tb24pOwpAQCAtNjIyNyw5ICs2OTIxLDEyIEBACiAgICAgLy8gVGhlIHZhbHVlIGlzIHNvbWV3aGF0IGFyYml0cmFyeSwgYW5kIGNvdWxkIHByb2JhYmx5IGJlIGV2ZW4gbGFyZ2VyLgogICAgIC8vIEEgbGFyZ2VyIHZhbHVlIHNob3VsZCBhbGxvdyBtb3JlIG9sZCBkYXRhIHRvIGJlIHJlYWQgYWZ0ZXIgYSB0cmFjayBjYWxscyBzdGFydCgpLAogICAgIC8vIHdpdGhvdXQgaW5jcmVhc2luZyBsYXRlbmN5LgorICAgIC8vCisgICAgLy8gTm90ZSB0aGlzIGlzIGluZGVwZW5kZW50IG9mIHRoZSBtYXhpbXVtIGRvd25zYW1wbGluZyByYXRpbyBwZXJtaXR0ZWQgZm9yIGNhcHR1cmUuCiAgICAgbVJzbXBJbkZyYW1lcyA9IG1GcmFtZUNvdW50ICogNzsKICAgICBtUnNtcEluRnJhbWVzUDIgPSByb3VuZHVwKG1Sc21wSW5GcmFtZXMpOwotICAgIGRlbGV0ZVtdIG1Sc21wSW5CdWZmZXI7CisgICAgZnJlZShtUnNtcEluQnVmZmVyKTsKKyAgICBtUnNtcEluQnVmZmVyID0gTlVMTDsKIAogICAgIC8vIFRPRE8gb3B0aW1pemUgYXVkaW8gY2FwdHVyZSBidWZmZXIgc2l6ZXMgLi4uCiAgICAgLy8gSGVyZSB3ZSBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHNsaWRpbmcgYnVmZmVyIHVzZWQgYXMgYSBzb3VyY2UKQEAgLTYyMzksOSArNjkzNiw5IEBACiAgICAgLy8gVGhlIGN1cnJlbnQgdmFsdWUgaXMgaGlnaGVyIHRoYW4gbmVjZXNzYXJ5LiAgSG93ZXZlciBpdCBzaG91bGQgbm90IGFkZCB0byBsYXRlbmN5LgogCiAgICAgLy8gT3Zlci1hbGxvY2F0ZSBiZXlvbmQgbVJzbXBJbkZyYW1lc1AyIHRvIHBlcm1pdCBhIEhBTCByZWFkIHBhc3QgZW5kIG9mIGJ1ZmZlcgotICAgIHNpemVfdCBidWZmZXJTaXplSW5TaG9ydHMgPSAobVJzbXBJbkZyYW1lc1AyICsgbUZyYW1lQ291bnQgLSAxKSAqIG1DaGFubmVsQ291bnQ7Ci0gICAgbVJzbXBJbkJ1ZmZlciA9IG5ldyBpbnQxNl90W2J1ZmZlclNpemVJblNob3J0c107Ci0gICAgbWVtc2V0KG1Sc21wSW5CdWZmZXIsIDAsIGJ1ZmZlclNpemVJblNob3J0cyAqIHNpemVvZihtUnNtcEluQnVmZmVyWzBdKSk7CisgICAgc2l6ZV90IGJ1ZmZlclNpemUgPSAobVJzbXBJbkZyYW1lc1AyICsgbUZyYW1lQ291bnQgLSAxKSAqIG1GcmFtZVNpemU7CisgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1Sc21wSW5CdWZmZXIsIDMyLCBidWZmZXJTaXplKTsKKyAgICBtZW1zZXQobVJzbXBJbkJ1ZmZlciwgMCwgYnVmZmVyU2l6ZSk7IC8vIGlmIHBvc2l4X21lbWFsaWduIGZhaWxzLCB3aWxsIHNlZ3YgaGVyZS4KIAogICAgIC8vIEF1ZGlvUmVjb3JkIG1TYW1wbGVSYXRlIGFuZCBtQ2hhbm5lbENvdW50IGFyZSBjb25zdGFudCBkdWUgdG8gQXVkaW9SZWNvcmQgQVBJIGNvbnN0cmFpbnRzLgogICAgIC8vIEJ1dCBpZiB0aHJlYWQncyBtU2FtcGxlUmF0ZSBvciBtQ2hhbm5lbENvdW50IGNoYW5nZXMsIGhvdyB3aWxsIHRoYXQgYWZmZWN0IGFjdGl2ZSB0cmFja3M/CkBAIC02MzQ1LDMzICs3MDQyLDM1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBpZiAobUlucHV0LT5hdWRpb0h3RGV2LT52ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewotICAgICAgICAvLyBzdG9yZSBuZXcgZGV2aWNlIGFuZCBzZW5kIHRvIGVmZmVjdHMKLSAgICAgICAgbUluRGV2aWNlID0gcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS50eXBlOworCisgICAgLy8gc3RvcmUgbmV3IGRldmljZSBhbmQgc2VuZCB0byBlZmZlY3RzCisgICAgbUluRGV2aWNlID0gcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS50eXBlOworICAgIG1QYXRjaCA9ICpwYXRjaDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0RGV2aWNlX2wobUluRGV2aWNlKTsKKyAgICB9CisKKyAgICAvLyBkaXNhYmxlIEFFQyBhbmQgTlMgaWYgdGhlIGRldmljZSBpcyBhIEJUIFNDTyBoZWFkc2V0IHN1cHBvcnRpbmcgdGhvc2UKKyAgICAvLyBwcmUgcHJvY2Vzc2luZ3MKKyAgICBpZiAobVRyYWNrcy5zaXplKCkgPiAwKSB7CisgICAgICAgIGJvb2wgc3VzcGVuZCA9IGF1ZGlvX2lzX2JsdWV0b290aF9zY29fZGV2aWNlKG1JbkRldmljZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLT5idE5yZWNJc09mZigpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CisgICAgICAgICAgICBzZXRFZmZlY3RTdXNwZW5kZWRfbChGWF9JSURfQUVDLCBzdXNwZW5kLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgc2V0RWZmZWN0U3VzcGVuZGVkX2woRlhfSUlEX05TLCBzdXNwZW5kLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gc3RvcmUgbmV3IHNvdXJjZSBhbmQgc2VuZCB0byBlZmZlY3RzCisgICAgaWYgKG1BdWRpb1NvdXJjZSAhPSBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSkgeworICAgICAgICBtQXVkaW9Tb3VyY2UgPSBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbChtSW5EZXZpY2UpOworICAgICAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0QXVkaW9Tb3VyY2VfbChtQXVkaW9Tb3VyY2UpOwogICAgICAgICB9CisgICAgfQogCi0gICAgICAgIC8vIGRpc2FibGUgQUVDIGFuZCBOUyBpZiB0aGUgZGV2aWNlIGlzIGEgQlQgU0NPIGhlYWRzZXQgc3VwcG9ydGluZyB0aG9zZQotICAgICAgICAvLyBwcmUgcHJvY2Vzc2luZ3MKLSAgICAgICAgaWYgKG1UcmFja3Muc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgYm9vbCBzdXNwZW5kID0gYXVkaW9faXNfYmx1ZXRvb3RoX3Njb19kZXZpY2UobUluRGV2aWNlKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLT5idE5yZWNJc09mZigpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbVRyYWNrc1tpXTsKLSAgICAgICAgICAgICAgICBzZXRFZmZlY3RTdXNwZW5kZWRfbChGWF9JSURfQUVDLCBzdXNwZW5kLCB0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgICAgIHNldEVmZmVjdFN1c3BlbmRlZF9sKEZYX0lJRF9OUywgc3VzcGVuZCwgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHN0b3JlIG5ldyBzb3VyY2UgYW5kIHNlbmQgdG8gZWZmZWN0cwotICAgICAgICBpZiAobUF1ZGlvU291cmNlICE9IHBhdGNoLT5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlKSB7Ci0gICAgICAgICAgICBtQXVkaW9Tb3VyY2UgPSBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldEF1ZGlvU291cmNlX2wobUF1ZGlvU291cmNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCisgICAgaWYgKG1JbnB1dC0+YXVkaW9Id0Rldi0+dmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKICAgICAgICAgYXVkaW9faHdfZGV2aWNlX3QgKmh3RGV2aWNlID0gbUlucHV0LT5hdWRpb0h3RGV2LT5od0RldmljZSgpOwogICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+Y3JlYXRlX2F1ZGlvX3BhdGNoKGh3RGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+bnVtX3NvdXJjZXMsCkBAIC02MzgwLDE5ICs3MDc5LDQ3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlKTsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HX0FTU0VSVChmYWxzZSwgImNyZWF0ZUF1ZGlvUGF0Y2hfbCgpIGNhbGxlZCBvbiBhIHByZSAzLjAgSEFMIik7CisgICAgICAgIGNoYXIgKmFkZHJlc3M7CisgICAgICAgIGlmIChzdHJjbXAocGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5hZGRyZXNzLCAiIikgIT0gMCkgeworICAgICAgICAgICAgYWRkcmVzcyA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRyZXNzID0gKGNoYXIgKiljYWxsb2MoMSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihTdHJpbmc4KGFkZHJlc3MpKTsKKyAgICAgICAgZnJlZShhZGRyZXNzKTsKKyAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9ST1VUSU5HKSwKKyAgICAgICAgICAgICAgICAgICAgIChpbnQpcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS50eXBlKTsKKyAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9JTlBVVF9TT1VSQ0UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KXBhdGNoLT5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlKTsKKyAgICAgICAgc3RhdHVzID0gbUlucHV0LT5zdHJlYW0tPmNvbW1vbi5zZXRfcGFyYW1ldGVycygmbUlucHV0LT5zdHJlYW0tPmNvbW1vbiwKKyAgICAgICAgICAgICAgICBwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKKyAgICAgICAgKmhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgIH0KKworICAgIGlmIChtSW5EZXZpY2UgIT0gbVByZXZJbkRldmljZSkgeworICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VEKTsKKyAgICAgICAgbVByZXZJbkRldmljZSA9IG1JbkRldmljZTsKKyAgICB9CisKICAgICByZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6cmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisKKyAgICBtSW5EZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKwogICAgIGlmIChtSW5wdXQtPmF1ZGlvSHdEZXYtPnZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CiAgICAgICAgIGF1ZGlvX2h3X2RldmljZV90ICpod0RldmljZSA9IG1JbnB1dC0+YXVkaW9Id0Rldi0+aHdEZXZpY2UoKTsKICAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPnJlbGVhc2VfYXVkaW9fcGF0Y2goaHdEZXZpY2UsIGhhbmRsZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR19BU1NFUlQoZmFsc2UsICJyZWxlYXNlQXVkaW9QYXRjaF9sKCkgY2FsbGVkIG9uIGEgcHJlIDMuMCBIQUwiKTsKKyAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CisgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUk9VVElORyksIDApOworICAgICAgICBzdGF0dXMgPSBtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLnNldF9wYXJhbWV0ZXJzKCZtSW5wdXQtPnN0cmVhbS0+Y29tbW9uLAorICAgICAgICAgICAgICAgIHBhcmFtLnRvU3RyaW5nKCkuc3RyaW5nKCkpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtNjQxNyw0ICs3MTQ0LDQgQEAKICAgICBjb25maWctPmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBtQXVkaW9Tb3VyY2U7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAppbmRleCA1NmE0MmE4Li40NmFjMzAwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKQEAgLTMyLDggKzMyLDExIEBACiAgICAgICAgIE9GRkxPQUQgICAgICAgICAgICAgLy8gVGhyZWFkIGNsYXNzIGlzIE9mZmxvYWRUaHJlYWQKICAgICB9OwogCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKnRocmVhZFR5cGVUb1N0cmluZyh0eXBlX3QgdHlwZSk7CisKICAgICBUaHJlYWRCYXNlKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgYXVkaW9faW9faGFuZGxlX3QgaWQsCi0gICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlLCB0eXBlX3QgdHlwZSk7CisgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlLCB0eXBlX3QgdHlwZSwKKyAgICAgICAgICAgICAgICBib29sIHN5c3RlbVJlYWR5KTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5UaHJlYWRCYXNlKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHJlYWR5VG9SdW4oKTsKQEAgLTkwLDMwICs5MywzMyBAQAogICAgICAgICBDb25kaXRpb24gbUNvbmQ7IC8vIGNvbmRpdGlvbiBmb3Igc3RhdHVzIHJldHVybgogICAgICAgICBzdGF0dXNfdCBtU3RhdHVzOyAvLyBzdGF0dXMgY29tbXVuaWNhdGVkIHRvIHNlbmRlcgogICAgICAgICBib29sIG1XYWl0U3RhdHVzOyAvLyB0cnVlIGlmIHNlbmRlciBpcyB3YWl0aW5nIGZvciBzdGF0dXMKKyAgICAgICAgYm9vbCBtUmVxdWlyZXNTeXN0ZW1SZWFkeTsgLy8gdHJ1ZSBpZiBtdXN0IHdhaXQgZm9yIHN5c3RlbSByZWFkeSB0byBlbnRlciBldmVudCBxdWV1ZQogICAgICAgICBzcDxDb25maWdFdmVudERhdGE+IG1EYXRhOyAgICAgLy8gZXZlbnQgc3BlY2lmaWMgcGFyYW1ldGVyIGRhdGEKIAogICAgIHByb3RlY3RlZDoKLSAgICAgICAgQ29uZmlnRXZlbnQoaW50IHR5cGUpIDogbVR5cGUodHlwZSksIG1TdGF0dXMoTk9fRVJST1IpLCBtV2FpdFN0YXR1cyhmYWxzZSksIG1EYXRhKE5VTEwpIHt9CisgICAgICAgIENvbmZpZ0V2ZW50KGludCB0eXBlLCBib29sIHJlcXVpcmVzU3lzdGVtUmVhZHkgPSBmYWxzZSkgOgorICAgICAgICAgICAgbVR5cGUodHlwZSksIG1TdGF0dXMoTk9fRVJST1IpLCBtV2FpdFN0YXR1cyhmYWxzZSksCisgICAgICAgICAgICBtUmVxdWlyZXNTeXN0ZW1SZWFkeShyZXF1aXJlc1N5c3RlbVJlYWR5KSwgbURhdGEoTlVMTCkge30KICAgICB9OwogCiAgICAgY2xhc3MgSW9Db25maWdFdmVudERhdGEgOiBwdWJsaWMgQ29uZmlnRXZlbnREYXRhIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIElvQ29uZmlnRXZlbnREYXRhKGludCBldmVudCwgaW50IHBhcmFtKSA6Ci0gICAgICAgICAgICBtRXZlbnQoZXZlbnQpLCBtUGFyYW0ocGFyYW0pIHt9CisgICAgICAgIElvQ29uZmlnRXZlbnREYXRhKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkKSA6CisgICAgICAgICAgICBtRXZlbnQoZXZlbnQpLCBtUGlkKHBpZCkge30KIAogICAgICAgICB2aXJ0dWFsICB2b2lkIGR1bXAoY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiSU8gZXZlbnQ6IGV2ZW50ICVkLCBwYXJhbSAlZFxuIiwgbUV2ZW50LCBtUGFyYW0pOworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiSU8gZXZlbnQ6IGV2ZW50ICVkXG4iLCBtRXZlbnQpOwogICAgICAgICB9CiAKLSAgICAgICAgY29uc3QgaW50IG1FdmVudDsKLSAgICAgICAgY29uc3QgaW50IG1QYXJhbTsKKyAgICAgICAgY29uc3QgYXVkaW9faW9fY29uZmlnX2V2ZW50IG1FdmVudDsKKyAgICAgICAgY29uc3QgcGlkX3QgICAgICAgICAgICAgICAgIG1QaWQ7CiAgICAgfTsKIAogICAgIGNsYXNzIElvQ29uZmlnRXZlbnQgOiBwdWJsaWMgQ29uZmlnRXZlbnQgewogICAgIHB1YmxpYzoKLSAgICAgICAgSW9Db25maWdFdmVudChpbnQgZXZlbnQsIGludCBwYXJhbSkgOgorICAgICAgICBJb0NvbmZpZ0V2ZW50KGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkKSA6CiAgICAgICAgICAgICBDb25maWdFdmVudChDRkdfRVZFTlRfSU8pIHsKLSAgICAgICAgICAgIG1EYXRhID0gbmV3IElvQ29uZmlnRXZlbnREYXRhKGV2ZW50LCBwYXJhbSk7CisgICAgICAgICAgICBtRGF0YSA9IG5ldyBJb0NvbmZpZ0V2ZW50RGF0YShldmVudCwgcGlkKTsKICAgICAgICAgfQogICAgICAgICB2aXJ0dWFsIH5Jb0NvbmZpZ0V2ZW50KCkge30KICAgICB9OwpAQCAtMTM1LDcgKzE0MSw3IEBACiAgICAgY2xhc3MgUHJpb0NvbmZpZ0V2ZW50IDogcHVibGljIENvbmZpZ0V2ZW50IHsKICAgICBwdWJsaWM6CiAgICAgICAgIFByaW9Db25maWdFdmVudChwaWRfdCBwaWQsIHBpZF90IHRpZCwgaW50MzJfdCBwcmlvKSA6Ci0gICAgICAgICAgICBDb25maWdFdmVudChDRkdfRVZFTlRfUFJJTykgeworICAgICAgICAgICAgQ29uZmlnRXZlbnQoQ0ZHX0VWRU5UX1BSSU8sIHRydWUpIHsKICAgICAgICAgICAgIG1EYXRhID0gbmV3IFByaW9Db25maWdFdmVudERhdGEocGlkLCB0aWQsIHByaW8pOwogICAgICAgICB9CiAgICAgICAgIHZpcnR1YWwgflByaW9Db25maWdFdmVudCgpIHt9CkBAIC0yNTAsMTMgKzI1NiwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpID0gMDsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwogICAgIHZpcnR1YWwgICAgIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykgPSAwOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGludCBwYXJhbSA9IDApID0gMDsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwKSA9IDA7CiAgICAgICAgICAgICAgICAgLy8gc2VuZENvbmZpZ0V2ZW50X2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKICAgICAgICAgICAgICAgICAvLyBDYW4gdGVtcG9yYXJpbHkgcmVsZWFzZSB0aGUgbG9jayBpZiB3YWl0aW5nIGZvciBhIHJlcGx5IGZyb20KICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzQ29uZmlnRXZlbnRzX2woKS4KICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZW5kQ29uZmlnRXZlbnRfbChzcDxDb25maWdFdmVudD4mIGV2ZW50KTsKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kSW9Db25maWdFdmVudChpbnQgZXZlbnQsIGludCBwYXJhbSA9IDApOwotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woaW50IGV2ZW50LCBpbnQgcGFyYW0gPSAwKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kSW9Db25maWdFdmVudChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCA9IDApOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwKTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KHBpZF90IHBpZCwgcGlkX3QgdGlkLCBpbnQzMl90IHByaW8pOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnRfbChwaWRfdCBwaWQsIHBpZF90IHRpZCwgaW50MzJfdCBwcmlvKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZW5kU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnRfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIpOwogICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbmRDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQoY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKQEAgLTM1OCw2ICszNjUsOCBAQAogCiAgICAgICAgICAgICAgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBwaXBlTWVtb3J5KCkgY29uc3QgeyByZXR1cm4gMDsgfQogCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIHN5c3RlbVJlYWR5KCk7CisKICAgICBtdXRhYmxlICAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtTG9jazsKIAogcHJvdGVjdGVkOgpAQCAtNDA4LDYgKzQxNyw3IEBACiAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgICAgbUNoYW5uZWxNYXNrOwogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQ7CiAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgbUZyYW1lU2l6ZTsKKyAgICAgICAgICAgICAgICAvLyBub3QgSEFMIGZyYW1lIHNpemUsIHRoaXMgaXMgZm9yIG91dHB1dCBzaW5rICh0byBwaXBlIHRvIGZhc3QgbWl4ZXIpCiAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgbUZvcm1hdDsgICAgICAgICAgIC8vIFNvdXJjZSBmb3JtYXQgZm9yIFJlY29yZGluZyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luayBmb3JtYXQgZm9yIFBsYXliYWNrLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5rIGZvcm1hdCBtYXkgYmUgZGlmZmVyZW50IHRoYW4KQEAgLTQxNiw2ICs0MjYsNyBAQAogICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1CdWZmZXJTaXplOyAgICAgICAvLyBIQUwgYnVmZmVyIHNpemUgZm9yIHJlYWQoKSBvciB3cml0ZSgpCiAKICAgICAgICAgICAgICAgICBWZWN0b3I8IHNwPENvbmZpZ0V2ZW50PiA+ICAgICBtQ29uZmlnRXZlbnRzOworICAgICAgICAgICAgICAgIFZlY3Rvcjwgc3A8Q29uZmlnRXZlbnQ+ID4gICAgIG1QZW5kaW5nQ29uZmlnRXZlbnRzOyAvLyBldmVudHMgYXdhaXRpbmcgc3lzdGVtIHJlYWR5CiAKICAgICAgICAgICAgICAgICAvLyBUaGVzZSBmaWVsZHMgYXJlIHdyaXR0ZW4gYW5kIHJlYWQgYnkgdGhyZWFkIGl0c2VsZiB3aXRob3V0IGxvY2sgb3IgYmFycmllciwKICAgICAgICAgICAgICAgICAvLyBhbmQgcmVhZCBieSBvdGhlciB0aHJlYWRzIHdpdGhvdXQgbG9jayBvciBiYXJyaWVyIHZpYSBzdGFuZGJ5KCksIG91dERldmljZSgpCkBAIC00MjYsMTMgKzQzNywxNiBAQAogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1TdGFuZGJ5OyAgICAgLy8gV2hldGhlciB0aHJlYWQgaXMgY3VycmVudGx5IGluIHN0YW5kYnkuCiAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgbU91dERldmljZTsgICAvLyBvdXRwdXQgZGV2aWNlCiAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgbUluRGV2aWNlOyAgICAvLyBpbnB1dCBkZXZpY2UKLSAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCAgICAgICAgICBtQXVkaW9Tb3VyY2U7IC8vIChzZWUgYXVkaW8uaCwgYXVkaW9fc291cmNlX3QpCisgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgbVByZXZPdXREZXZpY2U7ICAgLy8gcHJldmlvdXMgb3V0cHV0IGRldmljZQorICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgIG1QcmV2SW5EZXZpY2U7ICAgIC8vIHByZXZpb3VzIGlucHV0IGRldmljZQorICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAgICAgIG1QYXRjaDsKKyAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCAgICAgICAgICBtQXVkaW9Tb3VyY2U7CiAKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBtSWQ7CiAgICAgICAgICAgICAgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBtRWZmZWN0Q2hhaW5zOwogCi0gICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCAgICAgICAga05hbWVMZW5ndGggPSAxNjsgICAvLyBwcmN0bChQUl9TRVRfTkFNRSkgbGltaXQKLSAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAgICBtTmFtZVtrTmFtZUxlbmd0aF07CisgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCAgICAgICAga1RocmVhZE5hbWVMZW5ndGggPSAxNjsgLy8gcHJjdGwoUFJfU0VUX05BTUUpIGxpbWl0CisgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgbVRocmVhZE5hbWVba1RocmVhZE5hbWVMZW5ndGhdOyAvLyBndWFyYW50ZWVkIE5VTC10ZXJtaW5hdGVkCiAgICAgICAgICAgICAgICAgc3A8SVBvd2VyTWFuYWdlcj4gICAgICAgbVBvd2VyTWFuYWdlcjsKICAgICAgICAgICAgICAgICBzcDxJQmluZGVyPiAgICAgICAgICAgICBtV2FrZUxvY2tUb2tlbjsKICAgICAgICAgICAgICAgICBjb25zdCBzcDxQTURlYXRoUmVjaXBpZW50PiBtRGVhdGhSZWNpcGllbnQ7CkBAIC00NDIsNiArNDU2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VzcGVuZGVkU2Vzc2lvbnM7CiAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdCAgICAga0xvZ1NpemUgPSA0ICogMTAyNDsKICAgICAgICAgICAgICAgICBzcDxOQkxvZzo6V3JpdGVyPiAgICAgICBtTkJMb2dXcml0ZXI7CisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVJlYWR5OwogfTsKIAogLy8gLS0tIFBsYXliYWNrVGhyZWFkIC0tLQpAQCAtNDY3LDcgKzQ4Miw3IEBACiAgICAgc3RhdGljIGNvbnN0IGludDhfdCBrTWF4VHJhY2tSZXRyaWVzT2ZmbG9hZCA9IDIwOwogCiAgICAgUGxheWJhY2tUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb1N0cmVhbU91dCogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCB0eXBlX3QgdHlwZSk7CisgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHR5cGVfdCB0eXBlLCBib29sIHN5c3RlbVJlYWR5KTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5QbGF5YmFja1RocmVhZCgpOwogCiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwpAQCAtNTU5LDcgKzU3NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmbVN1c3BlbmRlZCkgPiAwOyB9CiAKICAgICB2aXJ0dWFsICAgICBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGF1ZGlvQ29uZmlnQ2hhbmdlZChpbnQgZXZlbnQsIGludCBwYXJhbSA9IDApOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCA9IDApOwogICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpoYWxGcmFtZXMsIHVpbnQzMl90ICpkc3BGcmFtZXMpOwogICAgICAgICAgICAgICAgIC8vIEZJWE1FIHJlbmFtZSBtaXhCdWZmZXIoKSB0byBzaW5rQnVmZmVyKCkgYW5kIHJlbW92ZSBpbnQxNl90KiBkZXBlbmRlbmN5LgogICAgICAgICAgICAgICAgIC8vIENvbnNpZGVyIGFsc28gcmVtb3ZpbmcgYW5kIHBhc3NpbmcgYW4gZXhwbGljaXQgbU1haW5CdWZmZXIgaW5pdGlhbGl6YXRpb24KQEAgLTYwMSw2ICs2MTYsMTEgQEAKICAgICAvLyB1cGRhdGVkIGJ5IHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKQogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQ7ICAvLyBub3JtYWwgbWl4ZXIgYW5kIGVmZmVjdHMKIAorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZFRocm90dGxlOyAgICAgLy8gdGhyb3R0bGUgdGhlIHRocmVhZCBwcm9jZXNzaW5nCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkVGhyb3R0bGVUaW1lTXM7IC8vIHRocm90dGxlIHRpbWUgZm9yIE1JWEVSIHRocmVhZHMKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRUaHJvdHRsZUVuZE1zOyAgLy8gbm90aWZ5IG9uY2UgcGVyIHRocm90dGxpbmcKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIG1IYWxmQnVmZmVyTXM7ICAgICAgIC8vIGhhbGYgdGhlIGJ1ZmZlciBzaXplIGluIG1pbGxpc2Vjb25kcworCiAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICBtU2lua0J1ZmZlcjsgICAgICAgICAvLyBmcmFtZSBzaXplIGFsaWduZWQgc2luayBidWZmZXIKIAogICAgIC8vIFRPRE86CkBAIC03MTIsOCArNzMyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgcmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOwogCi0gICAgICAgICAgICAgICAgYm9vbCAgICAgICAgdXNlc0h3QXZTeW5jKCkgY29uc3QgeyByZXR1cm4gKG1UeXBlID09IERJUkVDVCkgJiYgKG1PdXRwdXQgIT0gTlVMTCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtT3V0cHV0LT5mbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpOyB9CisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgdXNlc0h3QXZTeW5jKCkgY29uc3QgeyByZXR1cm4gKG1UeXBlID09IERJUkVDVCkgJiYgKG1PdXRwdXQgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1Id1N1cHBvcnRzUGF1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChtT3V0cHV0LT5mbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpOyB9CiAKIHByaXZhdGU6CiAKQEAgLTc0MiwxNCArNzYzLDE0IEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5Xcml0ZTsKIAogICAgIC8vIEZJWE1FIHJlbmFtZSB0aGVzZSBmb3JtZXIgbG9jYWwgdmFyaWFibGVzIG9mIHRocmVhZExvb3AgdG8gc3RhbmRhcmQgIm0iIG5hbWVzCi0gICAgbnNlY3NfdCAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGJ5VGltZTsKKyAgICBuc2Vjc190ICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFuZGJ5VGltZU5zOwogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgbVNpbmtCdWZmZXJTaXplOwogCiAgICAgLy8gY2FjaGVkIGNvcGllcyBvZiBhY3RpdmVTbGVlcFRpbWVVcygpIGFuZCBpZGxlU2xlZXBUaW1lVXMoKSBtYWRlIGJ5IGNhY2hlUGFyYW1ldGVyc19sKCkKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNsZWVwVGltZTsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIGlkbGVTbGVlcFRpbWU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlU2xlZXBUaW1lVXM7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBtSWRsZVNsZWVwVGltZVVzOwogCi0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcFRpbWU7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBtU2xlZXBUaW1lVXM7CiAKICAgICAvLyBtaXhlciBzdGF0dXMgcmV0dXJuZWQgYnkgcHJlcGFyZVRyYWNrc19sKCkKICAgICBtaXhlcl9zdGF0ZSAgICAgICAgICAgICAgICAgICAgIG1NaXhlclN0YXR1czsgLy8gY3VycmVudCBjeWNsZQpAQCAtNzYyLDcgKzc4Myw3IEBACiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICBzbGVlcFRpbWVTaGlmdDsKIAogICAgIC8vIHNhbWUgYXMgQXVkaW9GbGluZ2VyOjptU3RhbmRieVRpbWVJbk5zZWNzIGV4Y2VwdCBmb3IgRElSRUNUIHdoaWNoIHVzZXMgYSBzaG9ydGVyIHZhbHVlCi0gICAgbnNlY3NfdCAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGJ5RGVsYXk7CisgICAgbnNlY3NfdCAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhbmRieURlbGF5TnM7CiAKICAgICAvLyBNSVhFUiBvbmx5CiAgICAgbnNlY3NfdCAgICAgICAgICAgICAgICAgICAgICAgICBtYXhQZXJpb2Q7CkBAIC04MzgsNiArODU5LDcgQEAKICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LAogICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgYm9vbCBzeXN0ZW1SZWFkeSwKICAgICAgICAgICAgICAgICB0eXBlX3QgdHlwZSA9IE1JWEVSKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NaXhlclRocmVhZCgpOwogCkBAIC04NjQsNiArODg2LDEwIEBACiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdGhyZWFkTG9vcF9yZW1vdmVUcmFja3MoY29uc3QgVmVjdG9yPCBzcDxUcmFjaz4gPiYgdHJhY2tzVG9SZW1vdmUpOwogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGNvcnJlY3RMYXRlbmN5X2wodWludDMyX3QgbGF0ZW5jeSkgY29uc3Q7CiAKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBjcmVhdGVBdWRpb1BhdGNoX2woY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgcmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlciogbUF1ZGlvTWl4ZXI7ICAgIC8vIG5vcm1hbCBtaXhlcgogcHJpdmF0ZToKICAgICAgICAgICAgICAgICAvLyBvbmUtdGltZSBpbml0aWFsaXphdGlvbiwgbm8gbG9ja3MgcmVxdWlyZWQKQEAgLTg5NSw3ICs5MjEsNyBAQAogcHVibGljOgogCiAgICAgRGlyZWN0T3V0cHV0VGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfkRpcmVjdE91dHB1dFRocmVhZCgpOwogCiAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCkBAIC05MjAsMTYgKzk0NiwyMiBAQAogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRocmVhZExvb3BfZXhpdCgpOwogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHNob3VsZFN0YW5kYnlfbCgpOwogCisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgb25BZGROZXdUcmFja19sKCk7CisKICAgICAvLyB2b2x1bWVzIGxhc3Qgc2VudCB0byBhdWRpbyBIQUwgd2l0aCBzdHJlYW0tPnNldF92b2x1bWUoKQogICAgIGZsb2F0IG1MZWZ0Vm9sRmxvYXQ7CiAgICAgZmxvYXQgbVJpZ2h0Vm9sRmxvYXQ7CiAKICAgICBEaXJlY3RPdXRwdXRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb1N0cmVhbU91dCogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIHVpbnQzMl90IGRldmljZSwgVGhyZWFkQmFzZTo6dHlwZV90IHR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIHVpbnQzMl90IGRldmljZSwgVGhyZWFkQmFzZTo6dHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5c3RlbVJlYWR5KTsKICAgICB2b2lkIHByb2Nlc3NWb2x1bWVfbChUcmFjayAqdHJhY2ssIGJvb2wgbGFzdFRyYWNrKTsKIAogICAgIC8vIHByZXBhcmVUcmFja3NfbCgpIHRlbGxzIHRocmVhZExvb3BfbWl4KCkgdGhlIG5hbWUgb2YgdGhlIHNpbmdsZSBhY3RpdmUgdHJhY2sKICAgICBzcDxUcmFjaz4gICAgICAgICAgICAgICBtQWN0aXZlVHJhY2s7CisKKyAgICB3cDxUcmFjaz4gICAgICAgICAgICAgICBtUHJldmlvdXNUcmFjazsgICAgICAgICAvLyB1c2VkIHRvIGRldGVjdCB0cmFjayBzd2l0Y2gKKwogcHVibGljOgogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGhhc0Zhc3RNaXhlcigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiB9OwpAQCAtOTM4LDcgKzk3MCw3IEBACiBwdWJsaWM6CiAKICAgICBPZmZsb2FkVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCB1aW50MzJfdCBkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIHVpbnQzMl90IGRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfk9mZmxvYWRUaHJlYWQoKSB7fTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBmbHVzaEh3X2woKTsKIApAQCAtOTQ5LDEyICs5ODEsMTAgQEAKIAogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIHdhaXRpbmdBc3luY0NhbGxiYWNrKCk7CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgd2FpdGluZ0FzeW5jQ2FsbGJhY2tfbCgpOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIG9uQWRkTmV3VHJhY2tfbCgpOwogCiBwcml2YXRlOgogICAgIHNpemVfdCAgICAgIG1QYXVzZWRXcml0ZUxlbmd0aDsgICAgIC8vIGxlbmd0aCBpbiBieXRlcyBvZiB3cml0ZSBpbnRlcnJ1cHRlZCBieSBwYXVzZQogICAgIHNpemVfdCAgICAgIG1QYXVzZWRCeXRlc1JlbWFpbmluZzsgIC8vIGJ5dGVzIHN0aWxsIHdhaXRpbmcgaW4gbWl4YnVmZmVyIGFmdGVyIHJlc3VtZQotICAgIHdwPFRyYWNrPiAgIG1QcmV2aW91c1RyYWNrOyAgICAgICAgIC8vIHVzZWQgdG8gZGV0ZWN0IHRyYWNrIHN3aXRjaAogfTsKIAogY2xhc3MgQXN5bmNDYWxsYmFja1RocmVhZCA6IHB1YmxpYyBUaHJlYWQgewpAQCAtOTkzLDcgKzEwMjMsNyBAQAogY2xhc3MgRHVwbGljYXRpbmdUaHJlYWQgOiBwdWJsaWMgTWl4ZXJUaHJlYWQgewogcHVibGljOgogICAgIER1cGxpY2F0aW5nVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgTWl4ZXJUaHJlYWQqIG1haW5UaHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQpOworICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBib29sIHN5c3RlbVJlYWR5KTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+RHVwbGljYXRpbmdUaHJlYWQoKTsKIAogICAgIC8vIFRocmVhZCB2aXJ0dWFscwpAQCAtMTAzNSwxNyArMTA2NSwxMzIgQEAKIHB1YmxpYzoKIAogICAgIGNsYXNzIFJlY29yZFRyYWNrOworCisgICAgLyogVGhlIFJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyIGlzIHVzZWQgdG8gcmV0cmlldmUgcmVjb3JkZWQgaW5wdXQgZGF0YSBmcm9tIHRoZQorICAgICAqIFJlY29yZFRocmVhZC4gIEl0IG1haW50YWlucyBsb2NhbCBzdGF0ZSBvbiB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIHJlYWQKKyAgICAgKiBwb3NpdGlvbiBvZiB0aGUgUmVjb3JkVHJhY2sgY29tcGFyZWQgd2l0aCB0aGUgUmVjb3JkVGhyZWFkLgorICAgICAqLwogICAgIGNsYXNzIFJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyIDogcHVibGljIEF1ZGlvQnVmZmVyUHJvdmlkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlcml2ZXMgZnJvbSBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZSBmb3IgdXNlIGJ5IHJlc2FtcGxlcgogICAgIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIFJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyKFJlY29yZFRyYWNrKiByZWNvcmRUcmFjaykgOiBtUmVjb3JkVHJhY2socmVjb3JkVHJhY2spIHsgfQorICAgICAgICBSZXNhbXBsZXJCdWZmZXJQcm92aWRlcihSZWNvcmRUcmFjayogcmVjb3JkVHJhY2spIDoKKyAgICAgICAgICAgIG1SZWNvcmRUcmFjayhyZWNvcmRUcmFjayksCisgICAgICAgICAgICBtUnNtcEluVW5yZWwoMCksIG1Sc21wSW5Gcm9udCgwKSB7IH0KICAgICAgICAgdmlydHVhbCB+UmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIoKSB7IH0KKworICAgICAgICAvLyBjYWxsZWQgdG8gc2V0IHRoZSBSZXNhbXBsZXJCdWZmZXJQcm92aWRlciB0byBoZWFkIG9mIHRoZSBSZWNvcmRUaHJlYWQgZGF0YSBidWZmZXIsCisgICAgICAgIC8vIHNraXBwaW5nIGFueSBwcmV2aW91cyBkYXRhIHJlYWQgZnJvbSB0aGUgaGFsLgorICAgICAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKworICAgICAgICAvKiBTeW5jaHJvbml6ZXMgUmVjb3JkVHJhY2sgcG9zaXRpb24gd2l0aCB0aGUgUmVjb3JkVGhyZWFkLgorICAgICAgICAgKiBDYWxjdWxhdGVzIGF2YWlsYWJsZSBmcmFtZXMgYW5kIGhhbmRsZSBvdmVycnVucyBpZiB0aGUgUmVjb3JkVGhyZWFkCisgICAgICAgICAqIGhhcyBhZHZhbmNlZCBmYXN0ZXIgdGhhbiB0aGUgUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIgaGFzIHJldHJpZXZlZCBkYXRhLgorICAgICAgICAgKiBUT0RPOiB3aHkgbm90IGRvIHRoaXMgZm9yIGV2ZXJ5IGdldE5leHRCdWZmZXI/CisgICAgICAgICAqCisgICAgICAgICAqIFBhcmFtZXRlcnMKKyAgICAgICAgICogZnJhbWVzQXZhaWxhYmxlOiAgcG9pbnRlciB0byBvcHRpb25hbCBvdXRwdXQgc2l6ZV90IHRvIHN0b3JlIHJlY29yZCB0cmFjaworICAgICAgICAgKiAgICAgICAgICAgICAgICAgICBmcmFtZXMgYXZhaWxhYmxlLgorICAgICAgICAgKiAgICAgIGhhc092ZXJydW46ICBwb2ludGVyIHRvIG9wdGlvbmFsIGJvb2xlYW4sIHJldHVybnMgdHJ1ZSBpZiB0cmFjayBoYXMgb3ZlcnJ1bi4KKyAgICAgICAgICovCisKKyAgICAgICAgdmlydHVhbCB2b2lkIHN5bmMoc2l6ZV90ICpmcmFtZXNBdmFpbGFibGUgPSBOVUxMLCBib29sICpoYXNPdmVycnVuID0gTlVMTCk7CisKICAgICAgICAgLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLCBpbnQ2NF90IHB0cyk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcik7CiAgICAgcHJpdmF0ZToKICAgICAgICAgUmVjb3JkVHJhY2sgKiBjb25zdCBtUmVjb3JkVHJhY2s7CisgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgbVJzbXBJblVucmVsOyAgIC8vIHVucmVsZWFzZWQgZnJhbWVzIHJlbWFpbmluZyBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vc3QgcmVjZW50IGdldE5leHRCdWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGRlYnVnIG9ubHkKKyAgICAgICAgaW50MzJfdCAgICAgICAgICAgICBtUnNtcEluRnJvbnQ7ICAgLy8gbmV4dCBhdmFpbGFibGUgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm9sbGluZyBjb3VudGVyIHRoYXQgaXMgbmV2ZXIgY2xlYXJlZAorICAgIH07CisKKyAgICAvKiBUaGUgUmVjb3JkQnVmZmVyQ29udmVydGVyIGlzIHVzZWQgZm9yIGZvcm1hdCwgY2hhbm5lbCwgYW5kIHNhbXBsZSByYXRlCisgICAgICogY29udmVyc2lvbiBmb3IgYSBSZWNvcmRUcmFjay4KKyAgICAgKgorICAgICAqIFRPRE86IFNlbGYgY29udGFpbmVkLCBzbyBtb3ZlIHRvIGEgc2VwYXJhdGUgZmlsZSBsYXRlci4KKyAgICAgKgorICAgICAqIFJlY29yZEJ1ZmZlckNvbnZlcnRlciB1c2VzIHRoZSBjb252ZXJ0KCkgbWV0aG9kIHJhdGhlciB0aGFuIGV4cG9zaW5nIGEKKyAgICAgKiBidWZmZXIgcHJvdmlkZXIgaW50ZXJmYWNlOyB0aGlzIGlzIHRvIHNhdmUgYSBtZW1vcnkgY29weS4KKyAgICAgKi8KKyAgICBjbGFzcyBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIKKyAgICB7CisgICAgcHVibGljOgorICAgICAgICBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIoCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgc3JjQ2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IHNyY0Zvcm1hdCwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNTYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGRzdENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBkc3RGb3JtYXQsCisgICAgICAgICAgICAgICAgdWludDMyX3QgZHN0U2FtcGxlUmF0ZSk7CisKKyAgICAgICAgflJlY29yZEJ1ZmZlckNvbnZlcnRlcigpOworCisgICAgICAgIC8qIENvbnZlcnRzIGlucHV0IGRhdGEgZnJvbSBhbiBBdWRpb0J1ZmZlclByb3ZpZGVyIGJ5IGZvcm1hdCwgY2hhbm5lbE1hc2ssCisgICAgICAgICAqIGFuZCBzYW1wbGVSYXRlIHRvIGEgZGVzdGluYXRpb24gYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBQYXJhbWV0ZXJzCisgICAgICAgICAqICAgICAgZHN0OiAgYnVmZmVyIHRvIHBsYWNlIHRoZSBjb252ZXJ0ZWQgZGF0YS4KKyAgICAgICAgICogcHJvdmlkZXI6ICBidWZmZXIgcHJvdmlkZXIgdG8gb2J0YWluIHNvdXJjZSBkYXRhLgorICAgICAgICAgKiAgIGZyYW1lczogIG51bWJlciBvZiBmcmFtZXMgdG8gY29udmVydAorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZnJhbWVzIGNvbnZlcnRlZC4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBjb252ZXJ0KHZvaWQgKmRzdCwgQXVkaW9CdWZmZXJQcm92aWRlciAqcHJvdmlkZXIsIHNpemVfdCBmcmFtZXMpOworCisgICAgICAgIC8vIHJldHVybnMgTk9fRVJST1IgaWYgY29uc3RydWN0b3Igd2FzIHN1Y2Nlc3NmdWwKKyAgICAgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgeworICAgICAgICAgICAgLy8gbVNyY0NoYW5uZWxNYXNrIHNldCBvbiBzdWNjZXNzZnVsIHVwZGF0ZVBhcmFtZXRlcnMKKyAgICAgICAgICAgIHJldHVybiBtU3JjQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9JTlZBTElEID8gTk9fRVJST1IgOiBOT19JTklUOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWxsb3dzIGR5bmFtaWMgcmVjb25maWd1cmUgb2YgYWxsIHBhcmFtZXRlcnMKKyAgICAgICAgc3RhdHVzX3QgdXBkYXRlUGFyYW1ldGVycygKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBzcmNDaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3Qgc3JjRm9ybWF0LAorICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY1NhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgZHN0Q2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGRzdEZvcm1hdCwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBkc3RTYW1wbGVSYXRlKTsKKworICAgICAgICAvLyBjYWxsZWQgdG8gcmVzZXQgcmVzYW1wbGVyIGJ1ZmZlcnMgb24gcmVjb3JkIHRyYWNrIGRpc2NvbnRpbnVpdHkKKyAgICAgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIGlmIChtUmVzYW1wbGVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtUmVzYW1wbGVyLT5yZXNldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICAvLyBmb3JtYXQgY29udmVyc2lvbiB3aGVuIG5vdCB1c2luZyByZXNhbXBsZXIKKyAgICAgICAgdm9pZCBjb252ZXJ0Tm9SZXNhbXBsZXIodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpOworCisgICAgICAgIC8vIGZvcm1hdCBjb252ZXJzaW9uIHdoZW4gdXNpbmcgcmVzYW1wbGVyOyBtb2RpZmllcyBzcmMgaW4tcGxhY2UKKyAgICAgICAgdm9pZCBjb252ZXJ0UmVzYW1wbGVyKHZvaWQgKmRzdCwgLypub3QtYS1jb25zdCovIHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcyk7CisKKyAgICAgICAgLy8gdXNlciBwcm92aWRlZCBpbmZvcm1hdGlvbgorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtU3JjQ2hhbm5lbE1hc2s7CisgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgIG1TcmNGb3JtYXQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1TcmNTYW1wbGVSYXRlOworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtRHN0Q2hhbm5lbE1hc2s7CisgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgIG1Ec3RGb3JtYXQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1Ec3RTYW1wbGVSYXRlOworCisgICAgICAgIC8vIGRlcml2ZWQgaW5mb3JtYXRpb24KKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbVNyY0NoYW5uZWxDb3VudDsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbURzdENoYW5uZWxDb3VudDsKKyAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgbURzdEZyYW1lU2l6ZTsKKworICAgICAgICAvLyBmb3JtYXQgY29udmVyc2lvbiBidWZmZXIKKyAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAqbUJ1ZjsKKyAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgbUJ1ZkZyYW1lczsKKyAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgbUJ1ZkZyYW1lU2l6ZTsKKworICAgICAgICAvLyByZXNhbXBsZXIgaW5mbworICAgICAgICBBdWRpb1Jlc2FtcGxlciAgICAgICptUmVzYW1wbGVyOworCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgIG1Jc0xlZ2FjeURvd25taXg7ICAvLyBsZWdhY3kgc3RlcmVvIHRvIG1vbm8gY29udmVyc2lvbiBuZWVkZWQKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgbUlzTGVnYWN5VXBtaXg7ICAgIC8vIGxlZ2FjeSBtb25vIHRvIHN0ZXJlbyBjb252ZXJzaW9uIG5lZWRlZAorICAgICAgICBib29sICAgICAgICAgICAgICAgICBtUmVxdWlyZXNGbG9hdDsgICAgLy8gZGF0YSBwcm9jZXNzaW5nIHJlcXVpcmVzIGZsb2F0IChlLmcuIHJlc2FtcGxlcikKKyAgICAgICAgUGFzc3RocnVCdWZmZXJQcm92aWRlciAqbUlucHV0Q29udmVydGVyUHJvdmlkZXI7ICAgIC8vIGNvbnZlcnRzIGlucHV0IHRvIGZsb2F0CisgICAgICAgIGludDhfdCAgICAgICAgICAgICAgIG1JZHhBcnlbc2l6ZW9mKHVpbnQzMl90KSAqIDhdOyAvLyB1c2VkIGZvciBjaGFubmVsIG1hc2sgY29udmVyc2lvbgogICAgIH07CiAKICNpbmNsdWRlICJSZWNvcmRUcmFja3MuaCIKQEAgLTEwNTQsNyArMTE5OSw4IEBACiAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW4gKmlucHV0LAogICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBzeXN0ZW1SZWFkeQogI2lmZGVmIFRFRV9TSU5LCiAgICAgICAgICAgICAgICAgICAgICwgY29uc3Qgc3A8TkJBSU9fU2luaz4mIHRlZVNpbmsKICNlbmRpZgpAQCAtMTExMCw3ICsxMjU2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cyk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICBjYWNoZVBhcmFtZXRlcnNfbCgpIHt9CiAgICAgdmlydHVhbCBTdHJpbmc4ICAgICBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMpOwotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgYXVkaW9Db25maWdDaGFuZ2VkKGludCBldmVudCwgaW50IHBhcmFtID0gMCk7CisgICAgdmlydHVhbCB2b2lkICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOwpAQCAtMTE1Niw3ICsxMzAyLDcgQEAKICAgICAgICAgICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGFydFN0b3BDb25kOwogCiAgICAgICAgICAgICAvLyByZXNhbXBsZXIgY29udmVydHMgaW5wdXQgYXQgSEFMIEh6IHRvIG91dHB1dCBhdCBBdWRpb1JlY29yZCBjbGllbnQgSHoKLSAgICAgICAgICAgIGludDE2X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptUnNtcEluQnVmZmVyOyAvLyBzZWUgbmV3W10gZm9yIGRldGFpbHMgb24gdGhlIHNpemUKKyAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1Sc21wSW5CdWZmZXI7IC8vCiAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluRnJhbWVzOyAgLy8gc2l6ZSBvZiByZXNhbXBsZXIgaW5wdXQgaW4gZnJhbWVzCiAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluRnJhbWVzUDI7Ly8gc2l6ZSByb3VuZGVkIHVwIHRvIGEgcG93ZXItb2YtMgogCkBAIC0xMTY5LDcgKzEzMTUsOSBAQAogICAgICAgICAgICAgY29uc3Qgc3A8TWVtb3J5RGVhbGVyPiAgICAgICAgICAgICAgbVJlYWRPbmx5SGVhcDsKIAogICAgICAgICAgICAgLy8gb25lLXRpbWUgaW5pdGlhbGl6YXRpb24sIG5vIGxvY2tzIHJlcXVpcmVkCi0gICAgICAgICAgICBzcDxGYXN0Q2FwdHVyZT4gICAgICAgICAgICAgICAgICAgICBtRmFzdENhcHR1cmU7ICAgLy8gbm9uLTAgaWYgdGhlcmUgaXMgYWxzbyBhIGZhc3QgY2FwdHVyZQorICAgICAgICAgICAgc3A8RmFzdENhcHR1cmU+ICAgICAgICAgICAgICAgICAgICAgbUZhc3RDYXB0dXJlOyAgIC8vIG5vbi0wIGlmIHRoZXJlIGlzIGFsc28KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGZhc3QgY2FwdHVyZQorCiAgICAgICAgICAgICAvLyBGSVhNRSBhdWRpbyB3YXRjaGRvZyB0aHJlYWQKIAogICAgICAgICAgICAgLy8gY29udGVudHMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlIGNvbnNpc3RlbnQsIG5vIGxvY2tzIHJlcXVpcmVkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCmluZGV4IGU5NzAwMzYuLmY3ZGEyMDkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTQwMywxMCArNDA0LDcgQEAKICAgICBtSXNJbnZhbGlkKGZhbHNlKSwKICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5KE5VTEwpLAogICAgIG1SZXN1bWVUb1N0b3BwaW5nKGZhbHNlKSwKLSAgICBtRmx1c2hId1BlbmRpbmcoZmFsc2UpLAotICAgIG1QcmV2aW91c1ZhbGlkKGZhbHNlKSwKLSAgICBtUHJldmlvdXNGcmFtZXNXcml0dGVuKDApCi0gICAgLy8gbVByZXZpb3VzVGltZXN0YW1wCisgICAgbUZsdXNoSHdQZW5kaW5nKGZhbHNlKQogewogICAgIC8vIGNsaWVudCA9PSAwIGltcGxpZXMgc2hhcmVkQnVmZmVyID09IDAKICAgICBBTE9HX0FTU0VSVCghKGNsaWVudCA9PSAwICYmIHNoYXJlZEJ1ZmZlciAhPSAwKSk7CkBAIC00NDMsOCArNDQxLDYgQEAKICAgICAgICAgLy8gICAgICAgdGhpcyBtZWFucyB3ZSBhcmUgcG90ZW50aWFsbHkgZGVueWluZyBvdGhlciBtb3JlIGltcG9ydGFudCBmYXN0IHRyYWNrcyBmcm9tCiAgICAgICAgIC8vICAgICAgIGJlaW5nIGNyZWF0ZWQuICBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gYWxsb2NhdGUgdGhlIGluZGV4IGR5bmFtaWNhbGx5LgogICAgICAgICBtRmFzdEluZGV4ID0gaTsKLSAgICAgICAgLy8gUmVhZCB0aGUgaW5pdGlhbCB1bmRlcnJ1bnMgYmVjYXVzZSB0aGlzIGZpZWxkIGlzIG5ldmVyIGNsZWFyZWQgYnkgdGhlIGZhc3QgbWl4ZXIKLSAgICAgICAgbU9ic2VydmVkVW5kZXJydW5zID0gdGhyZWFkLT5nZXRGYXN0VHJhY2tVbmRlcnJ1bnMoaSk7CiAgICAgICAgIHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayAmPSB+KDEgPDwgaSk7CiAgICAgfQogfQpAQCAtNjkzLDYgKzY4OSwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOworICAgICAgICBpZiAoaXNGYXN0VHJhY2soKSkgeworICAgICAgICAgICAgLy8gcmVmcmVzaCBmYXN0IHRyYWNrIHVuZGVycnVucyBvbiBzdGFydCBiZWNhdXNlIHRoYXQgZmllbGQgaXMgbmV2ZXIgY2xlYXJlZAorICAgICAgICAgICAgLy8gYnkgdGhlIGZhc3QgbWl4ZXI7IGZ1cnRoZXJtb3JlLCB0aGUgc2FtZSB0cmFjayBjYW4gYmUgcmVjeWNsZWQsIGkuZS4gc3RhcnQKKyAgICAgICAgICAgIC8vIGFmdGVyIHN0b3AuCisgICAgICAgICAgICBtT2JzZXJ2ZWRVbmRlcnJ1bnMgPSBwbGF5YmFja1RocmVhZC0+Z2V0RmFzdFRyYWNrVW5kZXJydW5zKG1GYXN0SW5kZXgpOworICAgICAgICB9CiAgICAgICAgIHN0YXR1cyA9IHBsYXliYWNrVGhyZWFkLT5hZGRUcmFja19sKHRoaXMpOwogICAgICAgICBpZiAoc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OIHx8IHN0YXR1cyA9PSBQRVJNSVNTSU9OX0RFTklFRCkgewogICAgICAgICAgICAgdHJpZ2dlckV2ZW50cyhBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9QUkVTRU5UQVRJT05fQ09NUExFVEUpOwpAQCAtNzQyLDYgKzc0NCw3IEBACiAgICAgICAgICAgICAgICAgLy8gbW92ZSB0byBTVE9QUElOR18yIHdoZW4gZHJhaW4gY29tcGxldGVzIGFuZCB0aGVuIFNUT1BQRUQKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVE9QUElOR18xOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPmJyb2FkY2FzdF9sKCk7CiAgICAgICAgICAgICBBTE9HVigibm90IHN0b3BwaW5nL3N0b3BwZWQgPT4gc3RvcHBpbmcvc3RvcHBlZCAoJWQpIG9uIHRocmVhZCAlcCIsIG1OYW1lLAogICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1RocmVhZCk7CiAgICAgICAgIH0KQEAgLTg4MCwyNCArODgzLDI3IEBACiB7CiAgICAgLy8gQ2xpZW50IHNob3VsZCBpbXBsZW1lbnQgdGhpcyB1c2luZyBTU1E7IHRoZSB1bnByZXNlbnRlZCBmcmFtZSBjb3VudCBpbiBsYXRjaCBpcyBpcnJlbGV2YW50CiAgICAgaWYgKGlzRmFzdFRyYWNrKCkpIHsKLSAgICAgICAgLy8gRklYTUUgbm8gbG9jayBoZWxkIHRvIHNldCBtUHJldmlvdXNWYWxpZCA9IGZhbHNlCiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgIC8vIEZJWE1FIG5vIGxvY2sgaGVsZCB0byBzZXQgbVByZXZpb3VzVmFsaWQgPSBmYWxzZQogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQorCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOwogICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKKworICAgIHN0YXR1c190IHJlc3VsdCA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgIGlmICghaXNPZmZsb2FkZWQoKSAmJiAhaXNEaXJlY3QoKSkgewogICAgICAgICBpZiAoIXBsYXliYWNrVGhyZWFkLT5tTGF0Y2hRVmFsaWQpIHsKLSAgICAgICAgICAgIG1QcmV2aW91c1ZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KLSAgICAgICAgdWludDMyX3QgdW5wcmVzZW50ZWRGcmFtZXMgPQotICAgICAgICAgICAgICAgICgoaW50NjRfdCkgcGxheWJhY2tUaHJlYWQtPm1MYXRjaFEubVVucHJlc2VudGVkRnJhbWVzICogbVNhbXBsZVJhdGUpIC8KLSAgICAgICAgICAgICAgICBwbGF5YmFja1RocmVhZC0+bVNhbXBsZVJhdGU7CisgICAgICAgIC8vIEZJWE1FIE5vdCBhY2N1cmF0ZSB1bmRlciBkeW5hbWljIGNoYW5nZXMgb2Ygc2FtcGxlIHJhdGUgYW5kIHNwZWVkLgorICAgICAgICAvLyBEbyBub3QgdXNlIHRyYWNrJ3MgbVNhbXBsZVJhdGUgYXMgaXQgaXMgbm90IGN1cnJlbnQgZm9yIG1peGVyIHRyYWNrcy4KKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFNhbXBsZVJhdGUoKTsKKyAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgcGxheWJhY2tSYXRlID0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0UGxheWJhY2tSYXRlKCk7CisgICAgICAgIHVpbnQzMl90IHVucHJlc2VudGVkRnJhbWVzID0gKChkb3VibGUpIHBsYXliYWNrVGhyZWFkLT5tTGF0Y2hRLm1VbnByZXNlbnRlZEZyYW1lcyAqCisgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSAqIHBsYXliYWNrUmF0ZS5tU3BlZWQpLyBwbGF5YmFja1RocmVhZC0+bVNhbXBsZVJhdGU7CiAgICAgICAgIC8vIEZJWE1FIFNpbmNlIHdlJ3JlIHVzaW5nIGEgcmF3IHBvaW50ZXIgYXMgdGhlIGtleSwgaXQgaXMgdGhlb3JldGljYWxseSBwb3NzaWJsZQogICAgICAgICAvLyAgICAgICBmb3IgYSBicmFuZCBuZXcgdHJhY2sgdG8gc2hhcmUgdGhlIHNhbWUgYWRkcmVzcyBhcyBhIHJlY2VudGx5IGRlc3Ryb3llZAogICAgICAgICAvLyAgICAgICB0cmFjaywgYW5kIHRodXMgZm9yIHVzIHRvIGdldCB0aGUgZnJhbWVzIHJlbGVhc2VkIG9mIHRoZSB3cm9uZyB0cmFjay4KQEAgLTkwOCwzNiArOTE0LDE2IEBACiAgICAgICAgIHVpbnQzMl90IGZyYW1lc1dyaXR0ZW4gPSBpID49IDAgPwogICAgICAgICAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5tTGF0Y2hRLm1GcmFtZXNSZWxlYXNlZFtpXSA6CiAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKTsKLSAgICAgICAgYm9vbCBjaGVja1ByZXZpb3VzVGltZXN0YW1wID0gbVByZXZpb3VzVmFsaWQgJiYgZnJhbWVzV3JpdHRlbiA+PSBtUHJldmlvdXNGcmFtZXNXcml0dGVuOwotICAgICAgICBpZiAoZnJhbWVzV3JpdHRlbiA8IHVucHJlc2VudGVkRnJhbWVzKSB7Ci0gICAgICAgICAgICBtUHJldmlvdXNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBpZiAoZnJhbWVzV3JpdHRlbiA+PSB1bnByZXNlbnRlZEZyYW1lcykgeworICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiA9IGZyYW1lc1dyaXR0ZW4gLSB1bnByZXNlbnRlZEZyYW1lczsKKyAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZSA9IHBsYXliYWNrVGhyZWFkLT5tTGF0Y2hRLm1UaW1lc3RhbXAubVRpbWU7CisgICAgICAgICAgICByZXN1bHQgPSBOT19FUlJPUjsKICAgICAgICAgfQotICAgICAgICBtUHJldmlvdXNGcmFtZXNXcml0dGVuID0gZnJhbWVzV3JpdHRlbjsKLSAgICAgICAgdWludDMyX3QgcG9zaXRpb24gPSBmcmFtZXNXcml0dGVuIC0gdW5wcmVzZW50ZWRGcmFtZXM7Ci0gICAgICAgIHN0cnVjdCB0aW1lc3BlYyB0aW1lID0gcGxheWJhY2tUaHJlYWQtPm1MYXRjaFEubVRpbWVzdGFtcC5tVGltZTsKLSAgICAgICAgaWYgKGNoZWNrUHJldmlvdXNUaW1lc3RhbXApIHsKLSAgICAgICAgICAgIGlmICh0aW1lLnR2X3NlYyA8IG1QcmV2aW91c1RpbWVzdGFtcC5tVGltZS50dl9zZWMgfHwKLSAgICAgICAgICAgICAgICAgICAgKHRpbWUudHZfc2VjID09IG1QcmV2aW91c1RpbWVzdGFtcC5tVGltZS50dl9zZWMgJiYKLSAgICAgICAgICAgICAgICAgICAgdGltZS50dl9uc2VjIDwgbVByZXZpb3VzVGltZXN0YW1wLm1UaW1lLnR2X25zZWMpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIlRpbWUgaXMgZ29pbmcgYmFja3dhcmRzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBwb3NpdGlvbiBjYW4gYm9iYmxlIHNsaWdodGx5IGFzIGFuIGFydGlmYWN0OyB0aGlzIGhpZGVzIHRoZSBib2JibGUKLSAgICAgICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNSU5JTVVNX1BPU0lUSU9OX0RFTFRBID0gOHU7Ci0gICAgICAgICAgICBpZiAoKHBvc2l0aW9uIDw9IG1QcmV2aW91c1RpbWVzdGFtcC5tUG9zaXRpb24pIHx8Ci0gICAgICAgICAgICAgICAgICAgIChwb3NpdGlvbiAtIG1QcmV2aW91c1RpbWVzdGFtcC5tUG9zaXRpb24pIDwgTUlOSU1VTV9QT1NJVElPTl9ERUxUQSkgewotICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gbVByZXZpb3VzVGltZXN0YW1wLm1Qb3NpdGlvbjsKLSAgICAgICAgICAgICAgICB0aW1lID0gbVByZXZpb3VzVGltZXN0YW1wLm1UaW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSBwb3NpdGlvbjsKLSAgICAgICAgdGltZXN0YW1wLm1UaW1lID0gdGltZTsKLSAgICAgICAgbVByZXZpb3VzVGltZXN0YW1wID0gdGltZXN0YW1wOwotICAgICAgICBtUHJldmlvdXNWYWxpZCA9IHRydWU7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeyAvLyBvZmZsb2FkZWQgb3IgZGlyZWN0CisgICAgICAgIHJlc3VsdCA9IHBsYXliYWNrVGhyZWFkLT5nZXRUaW1lc3RhbXBfbCh0aW1lc3RhbXApOwogICAgIH0KIAotICAgIHJldHVybiBwbGF5YmFja1RocmVhZC0+Z2V0VGltZXN0YW1wX2wodGltZXN0YW1wKTsKKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXR0YWNoQXV4RWZmZWN0KGludCBFZmZlY3RJZCkKQEAgLTE3MDksMzYgKzE2OTUsMTggQEAKICAgICBtQWN0aXZlID0gZmFsc2U7CiB9CiAKLWJvb2wgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3V0cHV0VHJhY2s6OndyaXRlKGludDE2X3QqIGRhdGEsIHVpbnQzMl90IGZyYW1lcykKK2Jvb2wgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3V0cHV0VHJhY2s6OndyaXRlKHZvaWQqIGRhdGEsIHVpbnQzMl90IGZyYW1lcykKIHsKICAgICBCdWZmZXIgKnBJbkJ1ZmZlcjsKICAgICBCdWZmZXIgaW5CdWZmZXI7Ci0gICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gbUNoYW5uZWxDb3VudDsKICAgICBib29sIG91dHB1dEJ1ZmZlckZ1bGwgPSBmYWxzZTsKICAgICBpbkJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzOwotICAgIGluQnVmZmVyLmkxNiA9IGRhdGE7CisgICAgaW5CdWZmZXIucmF3ID0gZGF0YTsKIAogICAgIHVpbnQzMl90IHdhaXRUaW1lTGVmdE1zID0gbVNvdXJjZVRocmVhZC0+d2FpdFRpbWVNcygpOwogCiAgICAgaWYgKCFtQWN0aXZlICYmIGZyYW1lcyAhPSAwKSB7Ci0gICAgICAgIHN0YXJ0KCk7Ci0gICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwotICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKLSAgICAgICAgICAgIE1peGVyVGhyZWFkICptaXhlclRocmVhZCA9IChNaXhlclRocmVhZCAqKXRocmVhZC5nZXQoKTsKLSAgICAgICAgICAgIGlmIChtRnJhbWVDb3VudCA+IGZyYW1lcykgewotICAgICAgICAgICAgICAgIGlmIChtQnVmZmVyUXVldWUuc2l6ZSgpIDwga01heE92ZXJGbG93QnVmZmVycykgewotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdGFydEZyYW1lcyA9IChtRnJhbWVDb3VudCAtIGZyYW1lcyk7Ci0gICAgICAgICAgICAgICAgICAgIHBJbkJ1ZmZlciA9IG5ldyBCdWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+bUJ1ZmZlciA9IG5ldyBpbnQxNl90W3N0YXJ0RnJhbWVzICogY2hhbm5lbENvdW50XTsKLSAgICAgICAgICAgICAgICAgICAgcEluQnVmZmVyLT5mcmFtZUNvdW50ID0gc3RhcnRGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+aTE2ID0gcEluQnVmZmVyLT5tQnVmZmVyOwotICAgICAgICAgICAgICAgICAgICBtZW1zZXQocEluQnVmZmVyLT5yYXcsIDAsIHN0YXJ0RnJhbWVzICogY2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLmFkZChwSW5CdWZmZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCBubyBtb3JlIGJ1ZmZlcnMgaW4gcXVldWUiLCB0aGlzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgKHZvaWQpIHN0YXJ0KCk7CiAgICAgfQogCiAgICAgd2hpbGUgKHdhaXRUaW1lTGVmdE1zKSB7CkBAIC0xNzczLDIwICsxNzQxLDIwIEBACiAKICAgICAgICAgdWludDMyX3Qgb3V0RnJhbWVzID0gcEluQnVmZmVyLT5mcmFtZUNvdW50ID4gbU91dEJ1ZmZlci5mcmFtZUNvdW50ID8gbU91dEJ1ZmZlci5mcmFtZUNvdW50IDoKICAgICAgICAgICAgICAgICBwSW5CdWZmZXItPmZyYW1lQ291bnQ7Ci0gICAgICAgIG1lbWNweShtT3V0QnVmZmVyLnJhdywgcEluQnVmZmVyLT5yYXcsIG91dEZyYW1lcyAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgIG1lbWNweShtT3V0QnVmZmVyLnJhdywgcEluQnVmZmVyLT5yYXcsIG91dEZyYW1lcyAqIG1GcmFtZVNpemUpOwogICAgICAgICBQcm94eTo6QnVmZmVyIGJ1ZjsKICAgICAgICAgYnVmLm1GcmFtZUNvdW50ID0gb3V0RnJhbWVzOwogICAgICAgICBidWYubVJhdyA9IE5VTEw7CiAgICAgICAgIG1DbGllbnRQcm94eS0+cmVsZWFzZUJ1ZmZlcigmYnVmKTsKICAgICAgICAgcEluQnVmZmVyLT5mcmFtZUNvdW50IC09IG91dEZyYW1lczsKLSAgICAgICAgcEluQnVmZmVyLT5pMTYgKz0gb3V0RnJhbWVzICogY2hhbm5lbENvdW50OworICAgICAgICBwSW5CdWZmZXItPnJhdyA9IChpbnQ4X3QgKilwSW5CdWZmZXItPnJhdyArIG91dEZyYW1lcyAqIG1GcmFtZVNpemU7CiAgICAgICAgIG1PdXRCdWZmZXIuZnJhbWVDb3VudCAtPSBvdXRGcmFtZXM7Ci0gICAgICAgIG1PdXRCdWZmZXIuaTE2ICs9IG91dEZyYW1lcyAqIGNoYW5uZWxDb3VudDsKKyAgICAgICAgbU91dEJ1ZmZlci5yYXcgPSAoaW50OF90ICopbU91dEJ1ZmZlci5yYXcgKyBvdXRGcmFtZXMgKiBtRnJhbWVTaXplOwogCiAgICAgICAgIGlmIChwSW5CdWZmZXItPmZyYW1lQ291bnQgPT0gMCkgewogICAgICAgICAgICAgaWYgKG1CdWZmZXJRdWV1ZS5zaXplKCkpIHsKICAgICAgICAgICAgICAgICBtQnVmZmVyUXVldWUucmVtb3ZlQXQoMCk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIFtdIHBJbkJ1ZmZlci0+bUJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBmcmVlKHBJbkJ1ZmZlci0+bUJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgZGVsZXRlIHBJbkJ1ZmZlcjsKICAgICAgICAgICAgICAgICBBTE9HVigiT3V0cHV0VHJhY2s6OndyaXRlKCkgJXAgdGhyZWFkICVwIHJlbGVhc2VkIG92ZXJmbG93IGJ1ZmZlciAlZCIsIHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkLnVuc2FmZV9nZXQoKSwgbUJ1ZmZlclF1ZXVlLnNpemUoKSk7CkBAIC0xODAyLDExICsxNzcwLDEwIEBACiAgICAgICAgIGlmICh0aHJlYWQgIT0gMCAmJiAhdGhyZWFkLT5zdGFuZGJ5KCkpIHsKICAgICAgICAgICAgIGlmIChtQnVmZmVyUXVldWUuc2l6ZSgpIDwga01heE92ZXJGbG93QnVmZmVycykgewogICAgICAgICAgICAgICAgIHBJbkJ1ZmZlciA9IG5ldyBCdWZmZXI7Ci0gICAgICAgICAgICAgICAgcEluQnVmZmVyLT5tQnVmZmVyID0gbmV3IGludDE2X3RbaW5CdWZmZXIuZnJhbWVDb3VudCAqIGNoYW5uZWxDb3VudF07CisgICAgICAgICAgICAgICAgcEluQnVmZmVyLT5tQnVmZmVyID0gbWFsbG9jKGluQnVmZmVyLmZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKICAgICAgICAgICAgICAgICBwSW5CdWZmZXItPmZyYW1lQ291bnQgPSBpbkJ1ZmZlci5mcmFtZUNvdW50OwotICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+aTE2ID0gcEluQnVmZmVyLT5tQnVmZmVyOwotICAgICAgICAgICAgICAgIG1lbWNweShwSW5CdWZmZXItPnJhdywgaW5CdWZmZXIucmF3LCBpbkJ1ZmZlci5mcmFtZUNvdW50ICogY2hhbm5lbENvdW50ICoKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgcEluQnVmZmVyLT5yYXcgPSBwSW5CdWZmZXItPm1CdWZmZXI7CisgICAgICAgICAgICAgICAgbWVtY3B5KHBJbkJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci5yYXcsIGluQnVmZmVyLmZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKICAgICAgICAgICAgICAgICBtQnVmZmVyUXVldWUuYWRkKHBJbkJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgQUxPR1YoIk91dHB1dFRyYWNrOjp3cml0ZSgpICVwIHRocmVhZCAlcCBhZGRpbmcgb3ZlcmZsb3cgYnVmZmVyICVkIiwgdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWQudW5zYWZlX2dldCgpLCBtQnVmZmVyUXVldWUuc2l6ZSgpKTsKQEAgLTE4MTcsMjMgKzE3ODQsMTAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIENhbGxpbmcgd3JpdGUoKSB3aXRoIGEgMCBsZW5ndGggYnVmZmVyLCBtZWFucyB0aGF0IG5vIG1vcmUgZGF0YSB3aWxsIGJlIHdyaXR0ZW46Ci0gICAgLy8gSWYgbm8gbW9yZSBidWZmZXJzIGFyZSBwZW5kaW5nLCBmaWxsIG91dHB1dCB0cmFjayBidWZmZXIgdG8gbWFrZSBzdXJlIGl0IGlzIHN0YXJ0ZWQKLSAgICAvLyBieSBvdXRwdXQgbWl4ZXIuCi0gICAgaWYgKGZyYW1lcyA9PSAwICYmIG1CdWZmZXJRdWV1ZS5zaXplKCkgPT0gMCkgewotICAgICAgICAvLyBGSVhNRSBib3JrZW4sIHJlcGxhY2UgYnkgZ2V0dGluZyBmcmFtZXNSZWFkeSgpIGZyb20gcHJveHkKLSAgICAgICAgc2l6ZV90IHVzZXIgPSAwOyAgICAvLyB3YXMgbUNibGstPnVzZXIKLSAgICAgICAgaWYgKHVzZXIgPCBtRnJhbWVDb3VudCkgewotICAgICAgICAgICAgZnJhbWVzID0gbUZyYW1lQ291bnQgLSB1c2VyOwotICAgICAgICAgICAgcEluQnVmZmVyID0gbmV3IEJ1ZmZlcjsKLSAgICAgICAgICAgIHBJbkJ1ZmZlci0+bUJ1ZmZlciA9IG5ldyBpbnQxNl90W2ZyYW1lcyAqIGNoYW5uZWxDb3VudF07Ci0gICAgICAgICAgICBwSW5CdWZmZXItPmZyYW1lQ291bnQgPSBmcmFtZXM7Ci0gICAgICAgICAgICBwSW5CdWZmZXItPmkxNiA9IHBJbkJ1ZmZlci0+bUJ1ZmZlcjsKLSAgICAgICAgICAgIG1lbXNldChwSW5CdWZmZXItPnJhdywgMCwgZnJhbWVzICogY2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKLSAgICAgICAgICAgIG1CdWZmZXJRdWV1ZS5hZGQocEluQnVmZmVyKTsKLSAgICAgICAgfSBlbHNlIGlmIChtQWN0aXZlKSB7Ci0gICAgICAgICAgICBzdG9wKCk7Ci0gICAgICAgIH0KKyAgICAvLyBDYWxsaW5nIHdyaXRlKCkgd2l0aCBhIDAgbGVuZ3RoIGJ1ZmZlciBtZWFucyB0aGF0IG5vIG1vcmUgZGF0YSB3aWxsIGJlIHdyaXR0ZW46CisgICAgLy8gV2UgcmVseSBvbiBzdG9wKCkgdG8gc2V0IHRoZSBhcHByb3ByaWF0ZSBmbGFncyB0byBhbGxvdyB0aGUgcmVtYWluaW5nIGZyYW1lcyB0byBwbGF5IG91dC4KKyAgICBpZiAoZnJhbWVzID09IDAgJiYgbUJ1ZmZlclF1ZXVlLnNpemUoKSA9PSAwICYmIG1BY3RpdmUpIHsKKyAgICAgICAgc3RvcCgpOwogICAgIH0KIAogICAgIHJldHVybiBvdXRwdXRCdWZmZXJGdWxsOwpAQCAtMTg1OSw3ICsxODEzLDcgQEAKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgIEJ1ZmZlciAqcEJ1ZmZlciA9IG1CdWZmZXJRdWV1ZS5pdGVtQXQoaSk7Ci0gICAgICAgIGRlbGV0ZSBbXSBwQnVmZmVyLT5tQnVmZmVyOworICAgICAgICBmcmVlKHBCdWZmZXItPm1CdWZmZXIpOwogICAgICAgICBkZWxldGUgcEJ1ZmZlcjsKICAgICB9CiAgICAgbUJ1ZmZlclF1ZXVlLmNsZWFyKCk7CkBAIC0xODY3LDEzICsxODIxLDE0IEBACiAKIAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6UGF0Y2hUcmFjayhQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUF1ZGlvRmxpbmdlcjo6dHJhY2tfZmxhZ3NfdCBmbGFncykKLSAgICA6ICAgVHJhY2socGxheWJhY2tUaHJlYWQsIE5VTEwsIEFVRElPX1NUUkVBTV9QQVRDSCwKKyAgICA6ICAgVHJhY2socGxheWJhY2tUaHJlYWQsIE5VTEwsIHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgIGJ1ZmZlciwgMCwgMCwgZ2V0dWlkKCksIGZsYWdzLCBUWVBFX1BBVENIKSwKICAgICAgICAgICAgICAgbVByb3h5KG5ldyBDbGllbnRQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZSwgdHJ1ZSwgdHJ1ZSkpCkBAIC0xOTk1LDI5ICsxOTUwLDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZmxhZ3MgJiBJQXVkaW9GbGluZ2VyOjpUUkFDS19GQVNUKSA/IEFMTE9DX1BJUEUgOiBBTExPQ19DQkxLKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYnVmZmVyID09IE5VTEwpID8gQUxMT0NfTE9DQUwgOiBBTExPQ19OT05FKSwKICAgICAgICAgICAgICAgICAgIHR5cGUpLAotICAgICAgICBtT3ZlcmZsb3coZmFsc2UpLCBtUmVzYW1wbGVyKE5VTEwpLCBtUnNtcE91dEJ1ZmZlcihOVUxMKSwgbVJzbXBPdXRGcmFtZUNvdW50KDApLAotICAgICAgICAvLyBTZWUgcmVhbCBpbml0aWFsaXphdGlvbiBvZiBtUnNtcEluRnJvbnQgYXQgUmVjb3JkVGhyZWFkOjpzdGFydCgpCi0gICAgICAgIG1Sc21wSW5VbnJlbCgwKSwgbVJzbXBJbkZyb250KDApLCBtRnJhbWVzVG9Ecm9wKDApLCBtUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIoTlVMTCkKKyAgICAgICAgbU92ZXJmbG93KGZhbHNlKSwKKyAgICAgICAgbUZyYW1lc1RvRHJvcCgwKSwKKyAgICAgICAgbVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyKE5VTEwpLCAvLyBpbml0aWFsaXplIGluIGNhc2Ugb2YgZWFybHkgY29uc3RydWN0b3IgZXhpdAorICAgICAgICBtUmVjb3JkQnVmZmVyQ29udmVydGVyKE5VTEwpCiB7CiAgICAgaWYgKG1DYmxrID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIG1SZWNvcmRCdWZmZXJDb252ZXJ0ZXIgPSBuZXcgUmVjb3JkQnVmZmVyQ29udmVydGVyKAorICAgICAgICAgICAgdGhyZWFkLT5tQ2hhbm5lbE1hc2ssIHRocmVhZC0+bUZvcm1hdCwgdGhyZWFkLT5tU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmb3JtYXQsIHNhbXBsZVJhdGUpOworICAgIC8vIENoZWNrIGlmIHRoZSBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIgY29uc3RydWN0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgIC8vIElmIG5vdCwgZG9uJ3QgY29udGludWUgd2l0aCBjb25zdHJ1Y3Rpb24uCisgICAgLy8KKyAgICAvLyBOT1RFOiBJdCB3b3VsZCBiZSBleHRyZW1lbHkgcmFyZSB0aGF0IHRoZSByZWNvcmQgdHJhY2sgY2Fubm90IGJlIGNyZWF0ZWQKKyAgICAvLyBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlLCBidXQgYSBwZW5kaW5nIG9yIGZ1dHVyZSBkZXZpY2UgY2hhbmdlIHdvdWxkIG1ha2UKKyAgICAvLyB0aGUgcmVjb3JkIHRyYWNrIGNvbmZpZ3VyYXRpb24gdmFsaWQuCisgICAgaWYgKG1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJSZWNvcmRUcmFjayB1bmFibGUgdG8gY3JlYXRlIHJlY29yZCBidWZmZXIgY29udmVydGVyIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBtU2VydmVyUHJveHkgPSBuZXcgQXVkaW9SZWNvcmRTZXJ2ZXJQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVTaXplLCAhaXNFeHRlcm5hbFRyYWNrKCkpOwotCi0gICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spOwotICAgIC8vIEZJWE1FIEkgZG9uJ3QgdW5kZXJzdGFuZCBlaXRoZXIgb2YgdGhlIGNoYW5uZWwgY291bnQgY2hlY2tzCi0gICAgaWYgKHRocmVhZC0+bVNhbXBsZVJhdGUgIT0gc2FtcGxlUmF0ZSAmJiB0aHJlYWQtPm1DaGFubmVsQ291bnQgPD0gRkNDXzIgJiYKLSAgICAgICAgICAgIGNoYW5uZWxDb3VudCA8PSBGQ0NfMikgewotICAgICAgICAvLyBzaW5rIFNSCi0gICAgICAgIG1SZXNhbXBsZXIgPSBBdWRpb1Jlc2FtcGxlcjo6Y3JlYXRlKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAotICAgICAgICAgICAgICAgIHRocmVhZC0+bUNoYW5uZWxDb3VudCwgc2FtcGxlUmF0ZSk7Ci0gICAgICAgIC8vIHNvdXJjZSBTUgotICAgICAgICBtUmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKHRocmVhZC0+bVNhbXBsZVJhdGUpOwotICAgICAgICBtUmVzYW1wbGVyLT5zZXRWb2x1bWUoQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9GTE9BVCwgQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9GTE9BVCk7Ci0gICAgICAgIG1SZXNhbXBsZXJCdWZmZXJQcm92aWRlciA9IG5ldyBSZXNhbXBsZXJCdWZmZXJQcm92aWRlcih0aGlzKTsKLSAgICB9CisgICAgbVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyID0gbmV3IFJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyKHRoaXMpOwogCiAgICAgaWYgKGZsYWdzICYgSUF1ZGlvRmxpbmdlcjo6VFJBQ0tfRkFTVCkgewogICAgICAgICBBTE9HX0FTU0VSVCh0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbCk7CkBAIC0yMDI4LDExICsxOTg2LDE5IEBACiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6On5SZWNvcmRUcmFjaygpCiB7CiAgICAgQUxPR1YoIiVzIiwgX19mdW5jX18pOwotICAgIGRlbGV0ZSBtUmVzYW1wbGVyOwotICAgIGRlbGV0ZVtdIG1Sc21wT3V0QnVmZmVyOworICAgIGRlbGV0ZSBtUmVjb3JkQnVmZmVyQ29udmVydGVyOwogICAgIGRlbGV0ZSBtUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXI7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6aW5pdENoZWNrKCkgY29uc3QKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBUcmFja0Jhc2U6OmluaXRDaGVjaygpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgbVNlcnZlclByb3h5ID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCiAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLAogICAgICAgICBpbnQ2NF90IHB0cyBfX3VudXNlZCkKQEAgLTIyMTIsNCArMjE3OCw0IEBACiAgICAgbVByb3h5LT5yZWxlYXNlQnVmZmVyKGJ1ZmZlcik7CiB9CiAKLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdC1yZXNhbXBsZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdC1yZXNhbXBsZS5jcHAKaW5kZXggODRhNjU1YS4uNzg5Mzc3OCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3QtcmVzYW1wbGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0LXJlc2FtcGxlLmNwcApAQCAtNDI3LDYgKzQyNywxNCBAQAogICAgICAgICBwcmludGYoInF1YWxpdHk6ICVkICBjaGFubmVsczogJWQgIG1zZWM6ICUiIFBSSWQ2NCAiICBNZnJtcy9zOiAlLjJsZlxuIiwKICAgICAgICAgICAgICAgICBxdWFsaXR5LCBjaGFubmVscywgdGltZS8xMDAwMDAwLCBvdXRwdXRfZnJhbWVzICogbG9vcGxpbWl0IC8gKHRpbWUgLyAxZTkpIC8gMWU2KTsKICAgICAgICAgcmVzYW1wbGVyLT5yZXNldCgpOworCisgICAgICAgIC8vIFRPRE8gZml4IGxlZ2FjeSBidWc6IHJlc2V0IGRvZXMgbm90IGNsZWFyIGJ1ZmZlcnMuCisgICAgICAgIC8vIGRlbGV0ZSBhbmQgcmVjcmVhdGUgcmVzYW1wbGVyIGhlcmUuCisgICAgICAgIGRlbGV0ZSByZXNhbXBsZXI7CisgICAgICAgIHJlc2FtcGxlciA9IEF1ZGlvUmVzYW1wbGVyOjpjcmVhdGUoZm9ybWF0LCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2ZyZXEsIHF1YWxpdHkpOworICAgICAgICByZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoaW5wdXRfZnJlcSk7CisgICAgICAgIHJlc2FtcGxlci0+c2V0Vm9sdW1lKEF1ZGlvUmVzYW1wbGVyOjpVTklUWV9HQUlOX0ZMT0FULCBBdWRpb1Jlc2FtcGxlcjo6VU5JVFlfR0FJTl9GTE9BVCk7CiAgICAgfQogCiAgICAgbWVtc2V0KG91dHB1dF92YWRkciwgMCwgb3V0cHV0X3NpemUpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvQW5kcm9pZC5tawppbmRleCA4NjA0ZWY1Li5lMTUyNDY4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvQW5kcm9pZC5tawpAQCAtMzAsMjAgKzMwLDE2IEBACiAjCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotIyBDbGFuZysrIGFib3J0cyBvbiBBdWRpb01peGVyLmNwcCwKLSMgYi8xODM3Mzg2NiwgImRvIG5vdCBrbm93IGhvdyB0byBzcGxpdCB0aGlzIG9wZXJhdG9yLiIKLWlmZXEgKCQoZmlsdGVyICQoVEFSR0VUX0FSQ0gpLGFybSBhcm02NCksJChUQVJHRVRfQVJDSCkpCi0gICAgTE9DQUxfQ0xBTkcgOj0gZmFsc2UKLWVuZGlmCi0KIExPQ0FMX1NSQ19GSUxFUzo9IFwKIAl0ZXN0LW1peGVyLmNwcCBcCiAJLi4vQXVkaW9NaXhlci5jcHAuYXJtIFwKKwkuLi9CdWZmZXJQcm92aWRlcnMuY3BwCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKSBcCiAJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0JZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIKKwlmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlciBcCisJZXh0ZXJuYWwvc29uaWMKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCiAJbGlic25kZmlsZQpAQCAtNTcsNyArNTMsOCBAQAogCWxpYmRsIFwKIAlsaWJjdXRpbHMgXAogCWxpYnV0aWxzIFwKLQlsaWJsb2cKKwlsaWJsb2cgXAorCWxpYnNvbmljCiAKIExPQ0FMX01PRFVMRTo9IHRlc3QtbWl4ZXIKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2ggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaAppbmRleCAyYzQ1M2IwLi43ZjRkNDU2IDEwMDc1NQotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApAQCAtMTUsNyArMTUsNyBAQAogZWNobyAid2FpdGluZyBmb3IgZGV2aWNlIgogYWRiIHJvb3QgJiYgYWRiIHdhaXQtZm9yLWRldmljZSByZW1vdW50CiBhZGIgcHVzaCAkT1VUL3N5c3RlbS9saWIvbGliYXVkaW9yZXNhbXBsZXIuc28gL3N5c3RlbS9saWIKLWFkYiBwdXNoICRPVVQvc3lzdGVtL2Jpbi9yZXNhbXBsZXJfdGVzdHMgL3N5c3RlbS9iaW4KK2FkYiBwdXNoICRPVVQvZGF0YS9uYXRpdmV0ZXN0L3Jlc2FtcGxlcl90ZXN0cyAvc3lzdGVtL2JpbgogCiBzaCAkQU5EUk9JRF9CVUlMRF9UT1AvZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvcnVuX2FsbF91bml0X3Rlc3RzLnNoCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9taXhlcl90b193YXZfdGVzdHMuc2ggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvbWl4ZXJfdG9fd2F2X3Rlc3RzLnNoCmluZGV4IDliMzllNzcuLmQwNDgyYTEgMTAwNzU1Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy9taXhlcl90b193YXZfdGVzdHMuc2gKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL21peGVyX3RvX3dhdl90ZXN0cy5zaApAQCAtNjAsMTEgKzYwLDIxIEBACiAgICAgZmkKIAogIyBUZXN0OgorIyBwcm9jZXNzX19nZW5lcmljUmVzYW1wbGluZyB3aXRoIG1peGVkIGludGVnZXIgYW5kIGZsb2F0IHRyYWNrIGlucHV0CisjIHRyYWNrX19SZXNhbXBsZSAvIHRyYWNrX19nZW5lcmljUmVzYW1wbGUKKyAgICBhZGIgc2hlbGwgdGVzdC1taXhlciAkMSAtcyA0ODAwMCBcCisgICAgICAgIC1vIC9zZGNhcmQvdG00ODAwMGdyaWYud2F2IFwKKyAgICAgICAgc2luZToyLDQwMDAsNzUyMCBjaGlycDoyLDkyMDAgc2luZToxLDMwMDAsMTgwMDAgXAorICAgICAgICBzaW5lOmYsNiw2MDAwLDE5MDAwICBjaGlycDppLDQsMzAwMDAKKyAgICBhZGIgcHVsbCAvc2RjYXJkL3RtNDgwMDBncmlmLndhdiAkMgorCisjIFRlc3Q6CiAjIHByb2Nlc3NfX2dlbmVyaWNSZXNhbXBsaW5nCiAjIHRyYWNrX19SZXNhbXBsZSAvIHRyYWNrX19nZW5lcmljUmVzYW1wbGUKICAgICBhZGIgc2hlbGwgdGVzdC1taXhlciAkMSAtcyA0ODAwMCBcCiAgICAgICAgIC1vIC9zZGNhcmQvdG00ODAwMGdyLndhdiBcCi0gICAgICAgIHNpbmU6Miw0MDAwLDc1MjAgY2hpcnA6Miw5MjAwIHNpbmU6MSwzMDAwLDE4MDAwCisgICAgICAgIHNpbmU6Miw0MDAwLDc1MjAgY2hpcnA6Miw5MjAwIHNpbmU6MSwzMDAwLDE4MDAwIFwKKyAgICAgICAgc2luZTo2LDYwMDAsMTkwMDAKICAgICBhZGIgcHVsbCAvc2RjYXJkL3RtNDgwMDBnci53YXYgJDIKIAogIyBUZXN0OgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3Jlc2FtcGxlcl90ZXN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvcmVzYW1wbGVyX3Rlc3RzLmNwcAppbmRleCBkNjIxN2JhLi45ZTM3NWRiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvcmVzYW1wbGVyX3Rlc3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvcmVzYW1wbGVyX3Rlc3RzLmNwcApAQCAtNDgsNyArNDgsMTAgQEAKICAgICAgICAgaWYgKHRoaXNGcmFtZXMgPT0gMCB8fCB0aGlzRnJhbWVzID4gb3V0cHV0RnJhbWVzIC0gaSkgewogICAgICAgICAgICAgdGhpc0ZyYW1lcyA9IG91dHB1dEZyYW1lcyAtIGk7CiAgICAgICAgIH0KLSAgICAgICAgcmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50MzJfdCopIG91dHB1dCArIGNoYW5uZWxzKmksIHRoaXNGcmFtZXMsIHByb3ZpZGVyKTsKKyAgICAgICAgc2l6ZV90IGZyYW1lc1Jlc2FtcGxlZCA9IHJlc2FtcGxlci0+cmVzYW1wbGUoCisgICAgICAgICAgICAgICAgKGludDMyX3QqKSBvdXRwdXQgKyBjaGFubmVscyppLCB0aGlzRnJhbWVzLCBwcm92aWRlcik7CisgICAgICAgIC8vIHdlIHNob3VsZCBoYXZlIGVub3VnaCBidWZmZXIgc3BhY2UsIHNvIHRoZXJlIGlzIG5vIHNob3J0IGNvdW50LgorICAgICAgICBBU1NFUlRfRVEodGhpc0ZyYW1lcywgZnJhbWVzUmVzYW1wbGVkKTsKICAgICAgICAgaSArPSB0aGlzRnJhbWVzOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy90ZXN0LW1peGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci90ZXN0cy90ZXN0LW1peGVyLmNwcAppbmRleCA5YTRmYWQ2Li44ZGE2MjQ1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvdGVzdHMvdGVzdC1taXhlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL3Rlc3RzL3Rlc3QtbWl4ZXIuY3BwCkBAIC0zOSw3ICszOSw3IEBACiAgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWy1mXSBbLW1dIFstYyBjaGFubmVsc10iCiAgICAgICAgICAgICAgICAgICAgICIgWy1zIHNhbXBsZS1yYXRlXSBbLW8gPG91dHB1dC1maWxlPl0gWy1hIDxhdXgtYnVmZmVyLWZpbGU+XSBbLVAgY3N2XSIKICAgICAgICAgICAgICAgICAgICAgIiAoPGlucHV0LWZpbGU+IHwgPGNvbW1hbmQ+KStcbiIsIG5hbWUpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1mICAgIGVuYWJsZSBmbG9hdGluZyBwb2ludCBpbnB1dCB0cmFja1xuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgLWYgICAgZW5hYmxlIGZsb2F0aW5nIHBvaW50IGlucHV0IHRyYWNrIGJ5IGRlZmF1bHRcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1tICAgIGVuYWJsZSBmbG9hdGluZyBwb2ludCBtaXhlciBvdXRwdXRcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1jICAgIG51bWJlciBvZiBtaXhlciBvdXRwdXQgY2hhbm5lbHNcbiIpOwogICAgIGZwcmludGYoc3RkZXJyLCAiICAgIC1zICAgIG1peGVyIHNhbXBsZS1yYXRlXG4iKTsKQEAgLTQ3LDggKzQ3LDggQEAKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAtYSAgICA8YXV4LWJ1ZmZlci1maWxlPlxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgLVAgICAgIyBmcmFtZXMgcHJvdmlkZWQgcGVyIGNhbGwgdG8gcmVzYW1wbGUoKSBpbiBDU1YgZm9ybWF0XG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICA8aW5wdXQtZmlsZT4gaXMgYSBXQVYgZmlsZVxuIik7Ci0gICAgZnByaW50ZihzdGRlcnIsICIgICAgPGNvbW1hbmQ+IGNhbiBiZSAnc2luZTo8Y2hhbm5lbHM+LDxmcmVxdWVuY3k+LDxzYW1wbGVyYXRlPidcbiIpOwotICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICAgICAgICAgJ2NoaXJwOjxjaGFubmVscz4sPHNhbXBsZXJhdGU+J1xuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgPGNvbW1hbmQ+IGNhbiBiZSAnc2luZTpbKGl8ZiksXTxjaGFubmVscz4sPGZyZXF1ZW5jeT4sPHNhbXBsZXJhdGU+J1xuIik7CisgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgICAgICAnY2hpcnA6WyhpfGYpLF08Y2hhbm5lbHM+LDxzYW1wbGVyYXRlPidcbiIpOwogfQogCiBzdGF0aWMgaW50IHdyaXRlRmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3Qgdm9pZCAqYnVmZmVyLApAQCAtNzgsNiArNzgsMTggQEAKICAgICByZXR1cm4gRVhJVF9TVUNDRVNTOwogfQogCitjb25zdCBjaGFyICpwYXJzZUZvcm1hdChjb25zdCBjaGFyICpzLCBib29sICp1c2VGbG9hdCkgeworICAgIGlmICghc3RybmNtcChzLCAiZiwiLCAyKSkgeworICAgICAgICAqdXNlRmxvYXQgPSB0cnVlOworICAgICAgICByZXR1cm4gcyArIDI7CisgICAgfQorICAgIGlmICghc3RybmNtcChzLCAiaSwiLCAyKSkgeworICAgICAgICAqdXNlRmxvYXQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHMgKyAyOworICAgIH0KKyAgICByZXR1cm4gczsKK30KKwogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewogICAgIGNvbnN0IGNoYXIqIGNvbnN0IHByb2duYW1lID0gYXJndlswXTsKICAgICBib29sIHVzZUlucHV0RmxvYXQgPSBmYWxzZTsKQEAgLTg4LDggKzEwMCw5IEBACiAgICAgc3RkOjp2ZWN0b3I8aW50PiBQdmFsdWVzOwogICAgIGNvbnN0IGNoYXIqIG91dHB1dEZpbGVuYW1lID0gTlVMTDsKICAgICBjb25zdCBjaGFyKiBhdXhGaWxlbmFtZSA9IE5VTEw7Ci0gICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gTmFtZXM7Ci0gICAgc3RkOjp2ZWN0b3I8U2lnbmFsUHJvdmlkZXI+IFByb3ZpZGVyczsKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBuYW1lczsKKyAgICBzdGQ6OnZlY3RvcjxTaWduYWxQcm92aWRlcj4gcHJvdmlkZXJzOworICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiBmb3JtYXRzOwogCiAgICAgZm9yIChpbnQgY2g7IChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiZm1jOnM6bzphOlA6IikpICE9IC0xOykgewogICAgICAgICBzd2l0Y2ggKGNoKSB7CkBAIC0xMzgsNTQgKzE1MSw2NSBAQAogICAgIHNpemVfdCBvdXRwdXRGcmFtZXMgPSAwOwogCiAgICAgLy8gY3JlYXRlIHByb3ZpZGVycyBmb3IgZWFjaCB0cmFjawotICAgIFByb3ZpZGVycy5yZXNpemUoYXJnYyk7CisgICAgbmFtZXMucmVzaXplKGFyZ2MpOworICAgIHByb3ZpZGVycy5yZXNpemUoYXJnYyk7CisgICAgZm9ybWF0cy5yZXNpemUoYXJnYyk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdjOyArK2kpIHsKICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgY2hpcnBbXSA9ICJjaGlycDoiOwogICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBzaW5lW10gPSAic2luZToiOwogICAgICAgICBzdGF0aWMgY29uc3QgZG91YmxlIGtTZWNvbmRzID0gMTsKKyAgICAgICAgYm9vbCB1c2VGbG9hdCA9IHVzZUlucHV0RmxvYXQ7CiAKICAgICAgICAgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sIGNoaXJwLCBzdHJsZW4oY2hpcnApKSkgewogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiB2OworICAgICAgICAgICAgY29uc3QgY2hhciAqcyA9IHBhcnNlRm9ybWF0KGFyZ3ZbaV0gKyBzdHJsZW4oY2hpcnApLCAmdXNlRmxvYXQpOwogCi0gICAgICAgICAgICBwYXJzZUNTVihhcmd2W2ldICsgc3RybGVuKGNoaXJwKSwgdik7CisgICAgICAgICAgICBwYXJzZUNTVihzLCB2KTsKICAgICAgICAgICAgIGlmICh2LnNpemUoKSA9PSAyKSB7CiAgICAgICAgICAgICAgICAgcHJpbnRmKCJjcmVhdGluZyBjaGlycCglZCAlZClcbiIsIHZbMF0sIHZbMV0pOwotICAgICAgICAgICAgICAgIGlmICh1c2VJbnB1dEZsb2F0KSB7Ci0gICAgICAgICAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRDaGlycDxmbG9hdD4odlswXSwgMCwgdlsxXS8yLCB2WzFdLCBrU2Vjb25kcyk7CisgICAgICAgICAgICAgICAgaWYgKHVzZUZsb2F0KSB7CisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyc1tpXS5zZXRDaGlycDxmbG9hdD4odlswXSwgMCwgdlsxXS8yLCB2WzFdLCBrU2Vjb25kcyk7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHNbaV0gPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRDaGlycDxpbnQxNl90Pih2WzBdLCAwLCB2WzFdLzIsIHZbMV0sIGtTZWNvbmRzKTsKKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzW2ldLnNldENoaXJwPGludDE2X3Q+KHZbMF0sIDAsIHZbMV0vMiwgdlsxXSwga1NlY29uZHMpOworICAgICAgICAgICAgICAgICAgICBmb3JtYXRzW2ldID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRJbmNyKFB2YWx1ZXMpOworICAgICAgICAgICAgICAgIHByb3ZpZGVyc1tpXS5zZXRJbmNyKFB2YWx1ZXMpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1hbGZvcm1lZCBpbnB1dCAnJXMnXG4iLCBhcmd2W2ldKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCBzaW5lLCBzdHJsZW4oc2luZSkpKSB7CiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHY7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzID0gcGFyc2VGb3JtYXQoYXJndltpXSArIHN0cmxlbihzaW5lKSwgJnVzZUZsb2F0KTsKIAotICAgICAgICAgICAgcGFyc2VDU1YoYXJndltpXSArIHN0cmxlbihzaW5lKSwgdik7CisgICAgICAgICAgICBwYXJzZUNTVihzLCB2KTsKICAgICAgICAgICAgIGlmICh2LnNpemUoKSA9PSAzKSB7CiAgICAgICAgICAgICAgICAgcHJpbnRmKCJjcmVhdGluZyBzaW5lKCVkICVkICVkKVxuIiwgdlswXSwgdlsxXSwgdlsyXSk7Ci0gICAgICAgICAgICAgICAgaWYgKHVzZUlucHV0RmxvYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgUHJvdmlkZXJzW2ldLnNldFNpbmU8ZmxvYXQ+KHZbMF0sIHZbMV0sIHZbMl0sIGtTZWNvbmRzKTsKKyAgICAgICAgICAgICAgICBpZiAodXNlRmxvYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzW2ldLnNldFNpbmU8ZmxvYXQ+KHZbMF0sIHZbMV0sIHZbMl0sIGtTZWNvbmRzKTsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0c1tpXSA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgUHJvdmlkZXJzW2ldLnNldFNpbmU8aW50MTZfdD4odlswXSwgdlsxXSwgdlsyXSwga1NlY29uZHMpOworICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnNbaV0uc2V0U2luZTxpbnQxNl90Pih2WzBdLCB2WzFdLCB2WzJdLCBrU2Vjb25kcyk7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHNbaV0gPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgUHJvdmlkZXJzW2ldLnNldEluY3IoUHZhbHVlcyk7CisgICAgICAgICAgICAgICAgcHJvdmlkZXJzW2ldLnNldEluY3IoUHZhbHVlcyk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFsZm9ybWVkIGlucHV0ICclcydcbiIsIGFyZ3ZbaV0pOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcHJpbnRmKCJjcmVhdGluZyBmaWxlbmFtZSglcylcbiIsIGFyZ3ZbaV0pOwogICAgICAgICAgICAgaWYgKHVzZUlucHV0RmxvYXQpIHsKLSAgICAgICAgICAgICAgICBQcm92aWRlcnNbaV0uc2V0RmlsZTxmbG9hdD4oYXJndltpXSk7CisgICAgICAgICAgICAgICAgcHJvdmlkZXJzW2ldLnNldEZpbGU8ZmxvYXQ+KGFyZ3ZbaV0pOworICAgICAgICAgICAgICAgIGZvcm1hdHNbaV0gPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBQcm92aWRlcnNbaV0uc2V0RmlsZTxzaG9ydD4oYXJndltpXSk7CisgICAgICAgICAgICAgICAgcHJvdmlkZXJzW2ldLnNldEZpbGU8c2hvcnQ+KGFyZ3ZbaV0pOworICAgICAgICAgICAgICAgIGZvcm1hdHNbaV0gPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFByb3ZpZGVyc1tpXS5zZXRJbmNyKFB2YWx1ZXMpOworICAgICAgICAgICAgcHJvdmlkZXJzW2ldLnNldEluY3IoUHZhbHVlcyk7CiAgICAgICAgIH0KICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGZyYW1lcwotICAgICAgICBzaXplX3QgbmZyYW1lcyA9IChpbnQ2NF90KSBQcm92aWRlcnNbaV0uZ2V0TnVtRnJhbWVzKCkgKiBvdXRwdXRTYW1wbGVSYXRlCi0gICAgICAgICAgICAgICAgLyBQcm92aWRlcnNbaV0uZ2V0U2FtcGxlUmF0ZSgpOworICAgICAgICBzaXplX3QgbmZyYW1lcyA9IChpbnQ2NF90KSBwcm92aWRlcnNbaV0uZ2V0TnVtRnJhbWVzKCkgKiBvdXRwdXRTYW1wbGVSYXRlCisgICAgICAgICAgICAgICAgLyBwcm92aWRlcnNbaV0uZ2V0U2FtcGxlUmF0ZSgpOwogICAgICAgICBpZiAoaSA9PSAwIHx8IG91dHB1dEZyYW1lcyA+IG5mcmFtZXMpIHsgLy8gY2hvb3NlIG1pbmltdW0gZm9yIG91dHB1dEZyYW1lcwogICAgICAgICAgICAgb3V0cHV0RnJhbWVzID0gbmZyYW1lczsKICAgICAgICAgfQpAQCAtMjEzLDIyICsyMzcsMjAgQEAKICAgICAvLyBjcmVhdGUgdGhlIG1peGVyLgogICAgIGNvbnN0IHNpemVfdCBtaXhlckZyYW1lQ291bnQgPSAzMjA7IC8vIHR5cGljYWwgbnVtYmVycyBtYXkgcmFuZ2UgZnJvbSAyNDAgb3IgOTYwCiAgICAgQXVkaW9NaXhlciAqbWl4ZXIgPSBuZXcgQXVkaW9NaXhlcihtaXhlckZyYW1lQ291bnQsIG91dHB1dFNhbXBsZVJhdGUpOwotICAgIGF1ZGlvX2Zvcm1hdF90IGlucHV0Rm9ybWF0ID0gdXNlSW5wdXRGbG9hdAotICAgICAgICAgICAgPyBBVURJT19GT1JNQVRfUENNX0ZMT0FUIDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgYXVkaW9fZm9ybWF0X3QgbWl4ZXJGb3JtYXQgPSB1c2VNaXhlckZsb2F0CiAgICAgICAgICAgICA/IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQgOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKLSAgICBmbG9hdCBmID0gQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9GTE9BVCAvIFByb3ZpZGVycy5zaXplKCk7IC8vIG5vcm1hbGl6ZSB2b2x1bWUgYnkgIyB0cmFja3MKKyAgICBmbG9hdCBmID0gQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9GTE9BVCAvIHByb3ZpZGVycy5zaXplKCk7IC8vIG5vcm1hbGl6ZSB2b2x1bWUgYnkgIyB0cmFja3MKICAgICBzdGF0aWMgZmxvYXQgZjA7IC8vIHplcm8KIAogICAgIC8vIHNldCB1cCB0aGUgdHJhY2tzLgotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgUHJvdmlkZXJzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIC8vcHJpbnRmKCJ0cmFjayAlZCBvdXQgb2YgJWRcbiIsIGksIFByb3ZpZGVycy5zaXplKCkpOwotICAgICAgICB1aW50MzJfdCBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChQcm92aWRlcnNbaV0uZ2V0TnVtQ2hhbm5lbHMoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcm92aWRlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgLy9wcmludGYoInRyYWNrICVkIG91dCBvZiAlZFxuIiwgaSwgcHJvdmlkZXJzLnNpemUoKSk7CisgICAgICAgIHVpbnQzMl90IGNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KHByb3ZpZGVyc1tpXS5nZXROdW1DaGFubmVscygpKTsKICAgICAgICAgaW50MzJfdCBuYW1lID0gbWl4ZXItPmdldFRyYWNrTmFtZShjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBpbnB1dEZvcm1hdCwgQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKTsKKyAgICAgICAgICAgICAgICBmb3JtYXRzW2ldLCBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpOwogICAgICAgICBBTE9HX0FTU0VSVChuYW1lID49IDApOwotICAgICAgICBOYW1lcy5wdXNoX2JhY2sobmFtZSk7Ci0gICAgICAgIG1peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCAmUHJvdmlkZXJzW2ldKTsKKyAgICAgICAgbmFtZXNbaV0gPSBuYW1lOworICAgICAgICBtaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgJnByb3ZpZGVyc1tpXSk7CiAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLAogICAgICAgICAgICAgICAgICh2b2lkICopb3V0cHV0QWRkcik7CiAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIoCkBAIC0yNDAsNyArMjYyLDcgQEAKICAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkZPUk1BVCwKLSAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpaW5wdXRGb3JtYXQpOworICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmb3JtYXRzW2ldKTsKICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLApAQCAtMjU1LDcgKzI3Nyw3IEBACiAgICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpSRVNBTVBMRSwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpTQU1QTEVfUkFURSwKLSAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpUHJvdmlkZXJzW2ldLmdldFNhbXBsZVJhdGUoKSk7CisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KXByb3ZpZGVyc1tpXS5nZXRTYW1wbGVSYXRlKCkpOwogICAgICAgICBpZiAodXNlUmFtcCkgewogICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZmMCk7CiAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgJmYwKTsKQEAgLTI3NywxMSArMjk5LDExIEBACiAgICAgLy8gcHVtcCB0aGUgbWl4ZXIgdG8gcHJvY2VzcyBkYXRhLgogICAgIHNpemVfdCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCBvdXRwdXRGcmFtZXMgLSBtaXhlckZyYW1lQ291bnQ7IGkgKz0gbWl4ZXJGcmFtZUNvdW50KSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgTmFtZXMuc2l6ZSgpOyArK2opIHsKLSAgICAgICAgICAgIG1peGVyLT5zZXRQYXJhbWV0ZXIoTmFtZXNbal0sIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBuYW1lcy5zaXplKCk7ICsraikgeworICAgICAgICAgICAgbWl4ZXItPnNldFBhcmFtZXRlcihuYW1lc1tqXSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLAogICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSBvdXRwdXRBZGRyICsgaSAqIG91dHB1dEZyYW1lU2l6ZSk7CiAgICAgICAgICAgICBpZiAoYXV4RmlsZW5hbWUpIHsKLSAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKE5hbWVzW2pdLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6QVVYX0JVRkZFUiwKKyAgICAgICAgICAgICAgICBtaXhlci0+c2V0UGFyYW1ldGVyKG5hbWVzW2pdLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6QVVYX0JVRkZFUiwKICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopIGF1eEFkZHIgKyBpICogYXV4RnJhbWVTaXplKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKaW5kZXggMTg4ZmM4OS4uNWIzOGUxYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCkBAIC0zLDI1ICszLDI3IEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIEF1ZGlvUG9saWN5U2VydmljZS5jcHAgXAotICAgIEF1ZGlvUG9saWN5RWZmZWN0cy5jcHAKKyAgICBzZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAgXAorICAgIHNlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcAogCiBpZmVxICgkKFVTRV9MRUdBQ1lfQVVESU9fUE9MSUNZKSwgMSkKIExPQ0FMX1NSQ19GSUxFUyArPSBcCi0gICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsTGVnYWN5LmNwcCBcCi0gICAgQXVkaW9Qb2xpY3lDbGllbnRJbXBsTGVnYWN5LmNwcAorICAgIHNlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsTGVnYWN5LmNwcCBcCisgICAgc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGxMZWdhY3kuY3BwCiAKICAgICBMT0NBTF9DRkxBR1MgKz0gLURVU0VfTEVHQUNZX0FVRElPX1BPTElDWQogZWxzZQogTE9DQUxfU1JDX0ZJTEVTICs9IFwKLSAgICBBdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwIFwKLSAgICBBdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCisgICAgc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwIFwKKyAgICBzZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKIGVuZGlmCiAKIExPQ0FMX0NfSU5DTFVERVMgOj0gXAogICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyIFwKICAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UgXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJjdXRpbHMgXApAQCAtMzksNyArNDEsOCBAQAogZW5kaWYKIAogTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGlibWVkaWFfaGVscGVyCisgICAgbGlibWVkaWFfaGVscGVyIFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKIAogTE9DQUxfTU9EVUxFOj0gbGliYXVkaW9wb2xpY3lzZXJ2aWNlCiAKQEAgLTUzLDcgKzU2LDcgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcAorICAgIG1hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAgXAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICBsaWJjdXRpbHMgXApAQCAtNjEsOCArNjQsMzAgQEAKICAgICBsaWJsb2cgXAogICAgIGxpYnNvdW5kdHJpZ2dlcgogCitpZmVxICgkKFVTRV9DT05GSUdVUkFCTEVfQVVESU9fUE9MSUNZKSwgMSkKKworTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCisgICAgcGFyYW1ldGVyLWZyYW1ld29yay5wb2xpY3kgXAorICAgIGF1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mIFwKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZSBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmFibGUKKworZWxzZQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmF1ZGlvcG9saWN5ZW5naW5lZGVmYXVsdAorCitlbmRpZgorCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UgXAorCiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJtZWRpYV9oZWxwZXIKKyAgICBsaWJtZWRpYV9oZWxwZXIgXAorICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwogCiBMT0NBTF9NT0RVTEU6PSBsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0CiAKQEAgLTczLDE0ICs5OCwyNiBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICBBdWRpb1BvbGljeUZhY3RvcnkuY3BwCisgICAgbWFuYWdlci9BdWRpb1BvbGljeUZhY3RvcnkuY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgIGxpYmF1ZGlvcG9saWN5bWFuYWdlcmRlZmF1bHQKIAorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUgXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZSBcCisKIExPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvcG9saWN5bWFuYWdlcgogCiBpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCiAKIGVuZGlmCiBlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBSZWN1cnNpdmUgY2FsbCBzdWItZm9sZGVyIEFuZHJvaWQubWsKKyMKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCmluZGV4IDQ1MDhmYTcuLmMxZTdiYzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaApAQCAtNjQsNiArNjQsNyBAQAogICAgICAgICBBUElfSU5QVVRfTUlYX0VYVF9QT0xJQ1lfUkVST1VURSwvLyB1c2VkIGZvciBwbGF0Zm9ybSBhdWRpbyByZXJvdXRpbmcsIHdoZXJlIG1peGVzIGFyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGVkIGJ5IGV4dGVybmFsIGFuZCBkeW5hbWljYWxseSBpbnN0YWxsZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9saWNpZXMgd2hpY2ggcmVyb3V0ZSBhdWRpbyBtaXhlcworICAgICAgICBBUElfSU5QVVRfVEVMRVBIT05ZX1JYLCAvLyB1c2VkIGZvciBjYXB0dXJlIGZyb20gdGVsZXBob255IFJYIHBhdGgKICAgICB9IGlucHV0X3R5cGVfdDsKIAogcHVibGljOgpAQCAtNzUsNyArNzYsOCBAQAogICAgIC8vIGluZGljYXRlIGEgY2hhbmdlIGluIGRldmljZSBjb25uZWN0aW9uIHN0YXR1cwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkgPSAwOwogICAgIC8vIHJldHJpZXZlIGEgZGV2aWNlIGNvbm5lY3Rpb24gc3RhdHVzCiAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKSA9IDA7CkBAIC0xMDUsMTAgKzEwNywxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykgPSAwOwogICAgIC8vIGluZGljYXRlcyB0byB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgdGhhdCB0aGUgb3V0cHV0IHN0YXJ0cyBiZWluZyB1c2VkIGJ5IGNvcnJlc3BvbmRpbmcgc3RyZWFtLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LApAQCAtMTI3LDEwICsxMzEsMTIgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3R5cGVfdCAqaW5wdXRUeXBlKSA9IDA7CiAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdGFydHMgYmVpbmcgdXNlZC4KICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCkBAIC0yMDYsNyArMjEyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBjbGVhckF1ZGlvUGF0Y2hlcyh1aWRfdCB1aWQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZVJlc291cmNlc0ZvclVpZCh1aWRfdCB1aWQpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKQEAgLTIxNiw2ICsyMjIsMTEgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhWZWN0b3I8QXVkaW9NaXg+IG1peGVzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyUG9saWN5TWl4ZXMoVmVjdG9yPEF1ZGlvTWl4PiBtaXhlcykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpoYW5kbGUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUpID0gMDsKIH07CiAKIApAQCAtMzE4LDYgKzMyOSw4IEBACiAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKSA9IDA7CiAKICAgICB2aXJ0dWFsIGF1ZGlvX3VuaXF1ZV9pZF90IG5ld0F1ZGlvVW5pcXVlSWQoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSkgPSAwOwogfTsKIAogZXh0ZXJuICJDIiBBdWRpb1BvbGljeUludGVyZmFjZSogY3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYmQwZWQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgwOTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Qb2xpY3lNYW5hZ2VyIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0vLyNkZWZpbmUgVkVSWV9WRVJCT1NFX0xPR0dJTkcKLSNpZmRlZiBWRVJZX1ZFUkJPU0VfTE9HR0lORwotI2RlZmluZSBBTE9HVlYgQUxPR1YKLSNlbHNlCi0jZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKLSNlbmRpZgotCi0vLyBBIGRldmljZSBtYXNrIGZvciBhbGwgYXVkaW8gaW5wdXQgZGV2aWNlcyB0aGF0IGFyZSBjb25zaWRlcmVkICJ2aXJ0dWFsIiB3aGVuIGV2YWx1YXRpbmcKLS8vIGFjdGl2ZSBpbnB1dHMgaW4gZ2V0QWN0aXZlSW5wdXQoKQotI2RlZmluZSBBUE1fQVVESU9fSU5fREVWSUNFX1ZJUlRVQUxfQUxMICAoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVh8QVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSKQotLy8gQSBkZXZpY2UgbWFzayBmb3IgYWxsIGF1ZGlvIG91dHB1dCBkZXZpY2VzIHRoYXQgYXJlIGNvbnNpZGVyZWQgInJlbW90ZSIgd2hlbiBldmFsdWF0aW5nCi0vLyBhY3RpdmUgb3V0cHV0IGRldmljZXMgaW4gaXNTdHJlYW1BY3RpdmVSZW1vdGVseSgpCi0jZGVmaW5lIEFQTV9BVURJT19PVVRfREVWSUNFX1JFTU9URV9BTEwgIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWAotLy8gQSBkZXZpY2UgbWFzayBmb3IgYWxsIGF1ZGlvIGlucHV0IGFuZCBvdXRwdXQgZGV2aWNlcyB3aGVyZSBtYXRjaGluZyBpbnB1dHMvb3V0cHV0cyBvbiBkZXZpY2UKLS8vIHR5cGUgYWxvbmUgaXMgbm90IGVub3VnaDogdGhlIGFkZHJlc3MgbXVzdCBtYXRjaCB0b28KLSNkZWZpbmUgQVBNX0FVRElPX0RFVklDRV9NQVRDSF9BRERSRVNTX0FMTCAoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVggfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCkKLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvX2VmZmVjdC5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KLSNpbmNsdWRlIDxzb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmg+Ci0jaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCi0jaW5jbHVkZSAiYXVkaW9fcG9saWN5X2NvbmYuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEZWZpbml0aW9ucyBmb3IgYXVkaW9fcG9saWN5LmNvbmYgZmlsZSBwYXJzaW5nCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0cnVjdCBTdHJpbmdUb0VudW0gewotICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgdWludDMyX3QgdmFsdWU7Ci19OwotCi0jZGVmaW5lIFNUUklOR19UT19FTlVNKHN0cmluZykgeyAjc3RyaW5nLCBzdHJpbmcgfQotI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKLQotY29uc3QgU3RyaW5nVG9FbnVtIHNEZXZpY2VOYW1lVG9FbnVtVGFibGVbXSA9IHsKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08pLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FMTF9TQ08pLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFApLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0hETUkpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfTElORSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQyksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9TUERJRiksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9GTSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BVVhfTElORSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0FNQklFTlQpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0FMTF9TQ08pLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQVVYX0RJR0lUQUwpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9IRE1JKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0FOTEdfRE9DS19IRUFEU0VUKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fREdUTF9ET0NLX0hFQURTRVQpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9VU0JfQUNDRVNTT1JZKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fVFZfVFVORVIpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9MSU5FKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fU1BESUYpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0xPT1BCQUNLKSwKLX07Ci0KLWNvbnN0IFN0cmluZ1RvRW51bSBzT3V0cHV0RmxhZ05hbWVUb0VudW1UYWJsZVtdID0gewotICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORyksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyksCi19OwotCi1jb25zdCBTdHJpbmdUb0VudW0gc0lucHV0RmxhZ05hbWVUb0VudW1UYWJsZVtdID0gewotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0lOUFVUX0ZMQUdfRkFTVCksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fSU5QVVRfRkxBR19IV19IT1RXT1JEKSwKLX07Ci0KLWNvbnN0IFN0cmluZ1RvRW51bSBzRm9ybWF0TmFtZVRvRW51bVRhYmxlW10gPSB7Ci0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzhfMjRfQklUKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNX0ZMT0FUKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9NUDMpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUMpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTUFJTiksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQyksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19TU1IpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTFRQKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0hFX1YxKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX1NDQUxBQkxFKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0VSTEMpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEQpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfSEVfVjIpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfRUxEKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfVk9SQklTKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfSEVfQUFDX1YxKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfSEVfQUFDX1YyKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfT1BVUyksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FDMyksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0VfQUMzKSwKLX07Ci0KLWNvbnN0IFN0cmluZ1RvRW51bSBzT3V0Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGVbXSA9IHsKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF9NT05PKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1FVQUQpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEpLAotfTsKLQotY29uc3QgU3RyaW5nVG9FbnVtIHNJbkNoYW5uZWxzTmFtZVRvRW51bVRhYmxlW10gPSB7Ci0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9NT05PKSwKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX0lOX1NURVJFTyksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9CQUNLKSwKLX07Ci0KLWNvbnN0IFN0cmluZ1RvRW51bSBzR2Fpbk1vZGVOYW1lVG9FbnVtVGFibGVbXSA9IHsKLSAgICBTVFJJTkdfVE9fRU5VTShBVURJT19HQUlOX01PREVfSk9JTlQpLAotICAgIFNUUklOR19UT19FTlVNKEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUyksCi0gICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fR0FJTl9NT0RFX1JBTVApLAotfTsKLQotCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0cmluZ1RvRW51bShjb25zdCBzdHJ1Y3QgU3RyaW5nVG9FbnVtICp0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKQotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIGlmIChzdHJjbXAodGFibGVbaV0ubmFtZSwgbmFtZSkgPT0gMCkgewotICAgICAgICAgICAgQUxPR1YoInN0cmluZ1RvRW51bSgpIGZvdW5kICVzIiwgdGFibGVbaV0ubmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGFibGVbaV0udmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWNvbnN0IGNoYXIgKkF1ZGlvUG9saWN5TWFuYWdlcjo6ZW51bVRvU3RyaW5nKGNvbnN0IHN0cnVjdCBTdHJpbmdUb0VudW0gKnRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKQotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIGlmICh0YWJsZVtpXS52YWx1ZSA9PSB2YWx1ZSkgewotICAgICAgICAgICAgcmV0dXJuIHRhYmxlW2ldLm5hbWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuICIiOwotfQotCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RyaW5nVG9Cb29sKGNvbnN0IGNoYXIgKnZhbHVlKQotewotICAgIHJldHVybiAoKHN0cmNhc2VjbXAoInRydWUiLCB2YWx1ZSkgPT0gMCkgfHwgKHN0cmNtcCgiMSIsIHZhbHVlKSA9PSAwKSk7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQXVkaW9Qb2xpY3lJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQotewotICAgIHJldHVybiBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoZGV2aWNlLCBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCi17Ci0gICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZTogJXgsIHN0YXRlICVkLCBhZGRyZXNzICVzIiwKLSAgICAgICAgICAgIGRldmljZSwgc3RhdGUsIGRldmljZV9hZGRyZXNzICE9IE5VTEwgPyBkZXZpY2VfYWRkcmVzcyA6ICIiKTsKLQotICAgIC8vIGNvbm5lY3QvZGlzY29ubmVjdCBvbmx5IDEgZGV2aWNlIGF0IGEgdGltZQotICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBnZXREZXZpY2VEZXNjcmlwdG9yKGRldmljZSwgZGV2aWNlX2FkZHJlc3MpOwotCi0gICAgLy8gaGFuZGxlIG91dHB1dCBkZXZpY2VzCi0gICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgewotICAgICAgICBTb3J0ZWRWZWN0b3IgPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzOwotCi0gICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKGRldkRlc2MpOwotCi0gICAgICAgIC8vIHNhdmUgYSBjb3B5IG9mIHRoZSBvcGVuZWQgb3V0cHV0IGRlc2NyaXB0b3JzIGJlZm9yZSBhbnkgb3V0cHV0IGlzIG9wZW5lZCBvciBjbG9zZWQKLSAgICAgICAgLy8gYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkuIFRoaXMgd2lsbCBiZSBuZWVkZWQgYnkgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKLSAgICAgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOwotICAgICAgICBzd2l0Y2ggKHN0YXRlKQotICAgICAgICB7Ci0gICAgICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlIGNvbm5lY3Rpb24KLSAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRTogewotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIGFscmVhZHkgY29ubmVjdGVkOiAleCIsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNvbm5lY3RpbmcgZGV2aWNlICV4IiwgZGV2aWNlKTsKLQotICAgICAgICAgICAgLy8gcmVnaXN0ZXIgbmV3IGRldmljZSBhcyBhdmFpbGFibGUKLSAgICAgICAgICAgIGluZGV4ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuYWRkKGRldkRlc2MpOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gZ2V0TW9kdWxlRm9yRGV2aWNlKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1vZHVsZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dEKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBjb3VsZCBub3QgZmluZCBIVyBtb2R1bGUgZm9yIGRldmljZSAlMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+bUlkID0gbmV4dFVuaXF1ZUlkKCk7Ci0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5tTW9kdWxlID0gbW9kdWxlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBvdXRwdXRzLCBkZXZEZXNjLT5tQWRkcmVzcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoZGV2RGVzYyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gb3V0cHV0cyBzaG91bGQgbmV2ZXIgYmUgZW1wdHkgaGVyZQotICAgICAgICAgICAgQUxPR19BU1NFUlQob3V0cHV0cy5zaXplKCkgIT0gMCwgInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpOiIKLSAgICAgICAgICAgICAgICAgICAgImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHJldHVybmVkIG5vIG91dHB1dHMgYnV0IHN0YXR1cyBPSyIpOwotICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHJldHVybmVkICV6dSBvdXRwdXRzIiwKLSAgICAgICAgICAgICAgICAgIG91dHB1dHMuc2l6ZSgpKTsKLQotCi0gICAgICAgICAgICAvLyBTZXQgY29ubmVjdCB0byBIQUxzCi0gICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGRldkRlc2MtPm1BZGRyZXNzKTsKLSAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfQ09OTkVDVCksIGRldmljZSk7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwgcGFyYW0udG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlIGRpc2Nvbm5lY3Rpb24KLSAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOiB7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBub3QgY29ubmVjdGVkOiAleCIsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGlzY29ubmVjdGluZyBvdXRwdXQgZGV2aWNlICV4IiwgZGV2aWNlKTsKLQotICAgICAgICAgICAgLy8gU2V0IERpc2Nvbm5lY3QgdG8gSEFMcwotICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihkZXZEZXNjLT5tQWRkcmVzcyk7Ci0gICAgICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBVURJT19QQVJBTUVURVJfREVWSUNFX0RJU0NPTk5FQ1QpLCBkZXZpY2UpOwotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAvLyByZW1vdmUgZGV2aWNlIGZyb20gYXZhaWxhYmxlIG91dHB1dCBkZXZpY2VzCi0gICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoZGV2RGVzYyk7Ci0KLSAgICAgICAgICAgIGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgb3V0cHV0cywgZGV2RGVzYy0+bUFkZHJlc3MpOwotICAgICAgICAgICAgfSBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgc3RhdGU6ICV4Iiwgc3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrQTJkcFN1c3BlbmQgbXVzdCBydW4gYmVmb3JlIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcyBzbyB0aGF0IEEyRFAKLSAgICAgICAgLy8gb3V0cHV0IGlzIHN1c3BlbmRlZCBiZWZvcmUgYW55IHRyYWNrcyBhcmUgbW92ZWQgdG8gaXQKLSAgICAgICAgY2hlY2tBMmRwU3VzcGVuZCgpOwotICAgICAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKLSAgICAgICAgLy8gb3V0cHV0cyBtdXN0IGJlIGNsb3NlZCBhZnRlciBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKSBpcyBleGVjdXRlZAotICAgICAgICBpZiAoIW91dHB1dHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXRzW2ldKTsKLSAgICAgICAgICAgICAgICAvLyBjbG9zZSB1bnVzZWQgb3V0cHV0cyBhZnRlciBkZXZpY2UgZGlzY29ubmVjdGlvbiBvciBkaXJlY3Qgb3V0cHV0cyB0aGF0IGhhdmUgYmVlbgotICAgICAgICAgICAgICAgIC8vIG9wZW5lZCBieSBjaGVja091dHB1dHNGb3JEZXZpY2UoKSB0byBxdWVyeSBkeW5hbWljIHBhcmFtZXRlcnMKLSAgICAgICAgICAgICAgICBpZiAoKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2MtPm1EaXJlY3RPcGVuQ291bnQgPT0gMCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dHNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNoZWNrIGFnYWluIGFmdGVyIGNsb3NpbmcgQTJEUCBvdXRwdXQgdG8gcmVzZXQgbUEyZHBTdXNwZW5kZWQgaWYgbmVlZGVkCi0gICAgICAgICAgICBjaGVja0EyZHBTdXNwZW5kKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOwotICAgICAgICBpZiAobVBob25lU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gbU91dHB1dHMua2V5QXQoaSk7Ci0gICAgICAgICAgICBpZiAoKG1QaG9uZVN0YXRlICE9IEFVRElPX01PREVfSU5fQ0FMTCkgfHwgKG91dHB1dCAhPSBtUHJpbWFyeU91dHB1dCkpIHsKLSAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG1PdXRwdXRzLmtleUF0KGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3QgZm9yY2UgZGV2aWNlIGNoYW5nZSBvbiBkdXBsaWNhdGVkIG91dHB1dCBiZWNhdXNlIGlmIGRldmljZSBpcyAwLCBpdCB3aWxsCi0gICAgICAgICAgICAgICAgLy8gYWxzbyBmb3JjZSBhIGRldmljZSAwIGZvciB0aGUgdHdvIG91dHB1dHMgaXQgaXMgZHVwbGljYXRlZCB0byB3aGljaCBtYXkgb3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAvLyBhIHZhbGlkIGRldmljZSBzZWxlY3Rpb24gb24gdGhvc2Ugb3V0cHV0cy4KLSAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gIW1PdXRwdXRzLnZhbHVlQXQoaSktPmlzRHVwbGljYXRlZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoIWRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoZGV2aWNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHdheXMgZm9yY2Ugd2hlbiBkaXNjb25uZWN0aW5nIChhIG5vbi1kdXBsaWNhdGVkIGRldmljZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpKTsKLSAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0LCBuZXdEZXZpY2UsIGZvcmNlLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0gIC8vIGVuZCBpZiBpcyBvdXRwdXQgZGV2aWNlCi0KLSAgICAvLyBoYW5kbGUgaW5wdXQgZGV2aWNlcwotICAgIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgewotICAgICAgICBTb3J0ZWRWZWN0b3IgPGF1ZGlvX2lvX2hhbmRsZV90PiBpbnB1dHM7Ci0KLSAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihkZXZEZXNjKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkKLSAgICAgICAgewotICAgICAgICAvLyBoYW5kbGUgaW5wdXQgZGV2aWNlIGNvbm5lY3Rpb24KLSAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRTogewotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIGFscmVhZHkgY29ubmVjdGVkOiAlZCIsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IGdldE1vZHVsZUZvckRldmljZShkZXZpY2UpOwotICAgICAgICAgICAgaWYgKG1vZHVsZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpOiBjb3VsZCBub3QgZmluZCBIVyBtb2R1bGUgZm9yIGRldmljZSAlMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjaGVja0lucHV0c0ZvckRldmljZShkZXZpY2UsIHN0YXRlLCBpbnB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW5kZXggPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmFkZChkZXZEZXNjKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpbmRleF0tPm1JZCA9IG5leHRVbmlxdWVJZCgpOwotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5tTW9kdWxlID0gbW9kdWxlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBTZXQgY29ubmVjdCB0byBIQUxzCi0gICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGRldkRlc2MtPm1BZGRyZXNzKTsKLSAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfQ09OTkVDVCksIGRldmljZSk7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwgcGFyYW0udG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICAvLyBoYW5kbGUgaW5wdXQgZGV2aWNlIGRpc2Nvbm5lY3Rpb24KLSAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOiB7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBub3QgY29ubmVjdGVkOiAlZCIsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGlzY29ubmVjdGluZyBpbnB1dCBkZXZpY2UgJXgiLCBkZXZpY2UpOwotCi0gICAgICAgICAgICAvLyBTZXQgRGlzY29ubmVjdCB0byBIQUxzCi0gICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGRldkRlc2MtPm1BZGRyZXNzKTsKLSAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfRElTQ09OTkVDVCksIGRldmljZSk7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwgcGFyYW0udG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIGNoZWNrSW5wdXRzRm9yRGV2aWNlKGRldmljZSwgc3RhdGUsIGlucHV0cywgZGV2RGVzYy0+bUFkZHJlc3MpOwotICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5yZW1vdmUoZGV2RGVzYyk7Ci0KLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgc3RhdGU6ICV4Iiwgc3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotCi0gICAgICAgIGNsb3NlQWxsSW5wdXRzKCk7Ci0KLSAgICAgICAgaWYgKG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfSAvLyBlbmQgaWYgaXMgaW5wdXQgZGV2aWNlCi0KLSAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBkZXZpY2U6ICV4IiwgZGV2aWNlKTsKLSAgICByZXR1cm4gQkFEX1ZBTFVFOwotfQotCi1hdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCi17Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IGdldERldmljZURlc2NyaXB0b3IoZGV2aWNlLCBkZXZpY2VfYWRkcmVzcyk7Ci0gICAgRGV2aWNlVmVjdG9yICpkZXZpY2VWZWN0b3I7Ci0KLSAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7Ci0gICAgICAgIGRldmljZVZlY3RvciA9ICZtQXZhaWxhYmxlT3V0cHV0RGV2aWNlczsKLSAgICB9IGVsc2UgaWYgKGF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UpKSB7Ci0gICAgICAgIGRldmljZVZlY3RvciA9ICZtQXZhaWxhYmxlSW5wdXREZXZpY2VzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIGRldmljZSB0eXBlICUwOHgiLCBkZXZpY2UpOwotICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKLSAgICB9Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gZGV2aWNlVmVjdG9yLT5pbmRleE9mKGRldkRlc2MpOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKLSAgICB9Ci19Ci0KLXNwPEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlRGVzY3JpcHRvcj4gIEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlRGVzY3JpcHRvcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCi17Ci0gICAgU3RyaW5nOCBhZGRyZXNzID0gKGRldmljZV9hZGRyZXNzID09IE5VTEwpID8gU3RyaW5nOCgiIikgOiBTdHJpbmc4KGRldmljZV9hZGRyZXNzKTsKLSAgICAvLyBoYW5kbGUgbGVnYWN5IHJlbW90ZSBzdWJtaXggY2FzZSB3aGVyZSB0aGUgYWRkcmVzcyB3YXMgbm90IGFsd2F5cyBzcGVjaWZpZWQKLSAgICBpZiAoZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhkZXZpY2UpICYmIChhZGRyZXNzLmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0KLSAgICAgICAgICAgICAgICBtSHdNb2R1bGVzW2ldLT5tRGVjbGFyZWREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZUFkZHIoZGV2aWNlLCBhZGRyZXNzKTsKLSAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIGRldmljZUxpc3QuaXRlbUF0KDApOwotICAgICAgICB9Ci0gICAgICAgIGRldmljZUxpc3QgPSBtSHdNb2R1bGVzW2ldLT5tRGVjbGFyZWREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGV2aWNlTGlzdC5pdGVtQXQoMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOCgiIiksIGRldmljZSk7Ci0gICAgZGV2RGVzYy0+bUFkZHJlc3MgPSBhZGRyZXNzOwotICAgIHJldHVybiBkZXZEZXNjOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlQ2FsbFJvdXRpbmcoYXVkaW9fZGV2aWNlc190IHJ4RGV2aWNlLCBpbnQgZGVsYXlNcykKLXsKLSAgICBib29sIGNyZWF0ZVR4UGF0Y2ggPSBmYWxzZTsKLSAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7Ci0gICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGU7Ci0gICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3Q7Ci0KLSAgICBhdWRpb19kZXZpY2VzX3QgdHhEZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTik7Ci0gICAgQUxPR1YoInVwZGF0ZUNhbGxSb3V0aW5nIGRldmljZSByeERldmljZSAlMDh4IHR4RGV2aWNlICUwOHgiLCByeERldmljZSwgdHhEZXZpY2UpOwotCi0gICAgLy8gcmVsZWFzZSBleGlzdGluZyBSWCBwYXRjaCBpZiBhbnkKLSAgICBpZiAobUNhbGxSeFBhdGNoICE9IDApIHsKLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKG1DYWxsUnhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUsIDApOwotICAgICAgICBtQ2FsbFJ4UGF0Y2guY2xlYXIoKTsKLSAgICB9Ci0gICAgLy8gcmVsZWFzZSBUWCBwYXRjaCBpZiBhbnkKLSAgICBpZiAobUNhbGxUeFBhdGNoICE9IDApIHsKLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKG1DYWxsVHhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUsIDApOwotICAgICAgICBtQ2FsbFR4UGF0Y2guY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvLyBJZiB0aGUgUlggZGV2aWNlIGlzIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZSwgdGhlbiB1c2UgbGVnYWN5IHJvdXRpbmcgbWV0aG9kIGZvciB2b2ljZSBjYWxscwotICAgIC8vIHZpYSBzZXRPdXRwdXREZXZpY2UoKSBvbiBwcmltYXJ5IG91dHB1dC4KLSAgICAvLyBPdGhlcndpc2UsIGNyZWF0ZSB0d28gYXVkaW8gcGF0Y2hlcyBmb3IgVFggYW5kIFJYIHBhdGguCi0gICAgaWYgKGF2YWlsYWJsZVByaW1hcnlPdXRwdXREZXZpY2VzKCkgJiByeERldmljZSkgewotICAgICAgICBzZXRPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlLCB0cnVlLCBkZWxheU1zKTsKLSAgICAgICAgLy8gSWYgdGhlIFRYIGRldmljZSBpcyBhbHNvIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZSwgc2V0T3V0cHV0RGV2aWNlKCkgd2lsbCB0YWtlIGNhcmUKLSAgICAgICAgLy8gb2YgaXQgZHVlIHRvIGxlZ2FjeSBpbXBsZW1lbnRhdGlvbi4gSWYgbm90LCBjcmVhdGUgYSBwYXRjaC4KLSAgICAgICAgaWYgKChhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCkgJiB0eERldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKQotICAgICAgICAgICAgICAgID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICBjcmVhdGVUeFBhdGNoID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGNyZWF0ZSBSWCBwYXRoIGF1ZGlvIHBhdGNoCi0gICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUocnhEZXZpY2UpOwotICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCi0gICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIHNlbGVjdGVkIGRldmljZSBub3QgaW4gb3V0cHV0IGRldmljZSBsaXN0Iik7Ci0gICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHJ4U2lua0RldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKLSAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgpOwotICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCi0gICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIG5vIHRlbGVwaG9ueSBSWCBkZXZpY2UiKTsKLSAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gcnhTb3VyY2VEZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7Ci0KLSAgICAgICAgcnhTb3VyY2VEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1swXSk7Ci0gICAgICAgIHJ4U2lua0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1swXSk7Ci0KLSAgICAgICAgLy8gcmVxdWVzdCB0byByZXVzZSBleGlzdGluZyBvdXRwdXQgc3RyZWFtIGlmIG9uZSBpcyBhbHJlYWR5IG9wZW5lZCB0byByZWFjaCB0aGUgUlggZGV2aWNlCi0gICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2UocnhEZXZpY2UsIG1PdXRwdXRzKTsKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQpOwotICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgICAgICAgICAgQUxPR19BU1NFUlQoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgInVwZGF0ZUNhbGxSb3V0aW5nKCkgUlggZGV2aWNlIG91dHB1dCBpcyBkdXBsaWNhdGVkIik7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1sxXSk7Ci0gICAgICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDI7Ci0gICAgICAgIH0KLQotICAgICAgICBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmFmUGF0Y2hIYW5kbGUsIDApOwotICAgICAgICBBTE9HV19JRihzdGF0dXMgIT0gTk9fRVJST1IsICJ1cGRhdGVDYWxsUm91dGluZygpIGVycm9yICVkIGNyZWF0aW5nIFJYIGF1ZGlvIHBhdGNoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbUNhbGxSeFBhdGNoID0gbmV3IEF1ZGlvUGF0Y2goKGF1ZGlvX3BhdGNoX2hhbmRsZV90KW5leHRVbmlxdWVJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGNoLCBtVWlkQ2FjaGVkKTsKLSAgICAgICAgICAgIG1DYWxsUnhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgbUNhbGxSeFBhdGNoLT5tVWlkID0gbVVpZENhY2hlZDsKLSAgICAgICAgfQotICAgICAgICBjcmVhdGVUeFBhdGNoID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGNyZWF0ZVR4UGF0Y2gpIHsKLQotICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7Ci0gICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICAgICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKLSAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKHR4RGV2aWNlKTsKLSAgICAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAotICAgICAgICAgICAgICAgICAgICAidXBkYXRlQ2FsbFJvdXRpbmcoKSBzZWxlY3RlZCBkZXZpY2Ugbm90IGluIGlucHV0IGRldmljZSBsaXN0Iik7Ci0gICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHR4U291cmNlRGV2aWNlRGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOwotICAgICAgICB0eFNvdXJjZURldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzBdKTsKLSAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCk7Ci0gICAgICAgIEFMT0dfQVNTRVJUKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSwKLSAgICAgICAgICAgICAgICAgICAgInVwZGF0ZUNhbGxSb3V0aW5nKCkgbm8gdGVsZXBob255IFRYIGRldmljZSIpOwotICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiB0eFNpbmtEZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7Ci0gICAgICAgIHR4U2lua0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1swXSk7Ci0KLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0c0ZvckRldmljZShBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCwgbU91dHB1dHMpOwotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfSU5WQUxJRCk7Ci0gICAgICAgIC8vIHJlcXVlc3QgdG8gcmV1c2UgZXhpc3Rpbmcgb3V0cHV0IHN0cmVhbSBpZiBvbmUgaXMgYWxyZWFkeSBvcGVuZWQgdG8gcmVhY2ggdGhlIFRYCi0gICAgICAgIC8vIHBhdGggb3V0cHV0IGRldmljZQotICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgICAgICAgICAgQUxPR19BU1NFUlQoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgInVwZGF0ZUNhbGxSb3V0aW5nKCkgUlggZGV2aWNlIG91dHB1dCBpcyBkdXBsaWNhdGVkIik7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1sxXSk7Ci0gICAgICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDI7Ci0gICAgICAgIH0KLQotICAgICAgICBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmFmUGF0Y2hIYW5kbGUsIDApOwotICAgICAgICBBTE9HV19JRihzdGF0dXMgIT0gTk9fRVJST1IsICJzZXRQaG9uZVN0YXRlKCkgZXJyb3IgJWQgY3JlYXRpbmcgVFggYXVkaW8gcGF0Y2giLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtQ2FsbFR4UGF0Y2ggPSBuZXcgQXVkaW9QYXRjaCgoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpbmV4dFVuaXF1ZUlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0Y2gsIG1VaWRDYWNoZWQpOwotICAgICAgICAgICAgbUNhbGxUeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICBtQ2FsbFR4UGF0Y2gtPm1VaWQgPSBtVWlkQ2FjaGVkOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpCi17Ci0gICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBzdGF0ZSAlZCIsIHN0YXRlKTsKLSAgICBpZiAoc3RhdGUgPCAwIHx8IHN0YXRlID49IEFVRElPX01PREVfQ05UKSB7Ci0gICAgICAgIEFMT0dXKCJzZXRQaG9uZVN0YXRlKCkgaW52YWxpZCBzdGF0ZSAlZCIsIHN0YXRlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChzdGF0ZSA9PSBtUGhvbmVTdGF0ZSApIHsKLSAgICAgICAgQUxPR1coInNldFBob25lU3RhdGUoKSBzZXR0aW5nIHNhbWUgc3RhdGUgJWQiLCBzdGF0ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBpZiBsZWF2aW5nIGNhbGwgc3RhdGUsIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgYWN0aXZlIHN0cmVhbXMKLSAgICAvLyBwZXJ0YWluaW5nIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBzZWUgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkKLSAgICBpZiAoaXNJbkNhbGwoKSkgewotICAgICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIGluIGNhbGwgc3RhdGUgbWFuYWdlbWVudDogbmV3IHN0YXRlIGlzICVkIiwgc3RhdGUpOwotICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgewotICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIGZhbHNlLCB0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZvcmNlIHJlZXZhbHVhdGluZyBhY2Nlc3NpYmlsaXR5IHJvdXRpbmcgd2hlbiBjYWxsIHN0YXJ0cwotICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSk7Ci0gICAgfQotCi0gICAgLy8gc3RvcmUgcHJldmlvdXMgcGhvbmUgc3RhdGUgZm9yIG1hbmFnZW1lbnQgb2Ygc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGJlbG93Ci0gICAgaW50IG9sZFN0YXRlID0gbVBob25lU3RhdGU7Ci0gICAgbVBob25lU3RhdGUgPSBzdGF0ZTsKLSAgICBib29sIGZvcmNlID0gZmFsc2U7Ci0KLSAgICAvLyBhcmUgd2UgZW50ZXJpbmcgb3Igc3RhcnRpbmcgYSBjYWxsCi0gICAgaWYgKCFpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSAmJiBpc1N0YXRlSW5DYWxsKHN0YXRlKSkgewotICAgICAgICBBTE9HVigiICBFbnRlcmluZyBjYWxsIGluIHNldFBob25lU3RhdGUoKSIpOwotICAgICAgICAvLyBmb3JjZSByb3V0aW5nIGNvbW1hbmQgdG8gYXVkaW8gaGFyZHdhcmUgd2hlbiBzdGFydGluZyBhIGNhbGwKLSAgICAgICAgLy8gZXZlbiBpZiBubyBkZXZpY2UgY2hhbmdlIGlzIG5lZWRlZAotICAgICAgICBmb3JjZSA9IHRydWU7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgREVWSUNFX0NBVEVHT1JZX0NOVDsgaisrKSB7Ci0gICAgICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fRFRNRl0ubVZvbHVtZUN1cnZlW2pdID0KLSAgICAgICAgICAgICAgICAgICAgc1ZvbHVtZVByb2ZpbGVzW0FVRElPX1NUUkVBTV9WT0lDRV9DQUxMXVtqXTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoaXNTdGF0ZUluQ2FsbChvbGRTdGF0ZSkgJiYgIWlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7Ci0gICAgICAgIEFMT0dWKCIgIEV4aXRpbmcgY2FsbCBpbiBzZXRQaG9uZVN0YXRlKCkiKTsKLSAgICAgICAgLy8gZm9yY2Ugcm91dGluZyBjb21tYW5kIHRvIGF1ZGlvIGhhcmR3YXJlIHdoZW4gZXhpdGluZyBhIGNhbGwKLSAgICAgICAgLy8gZXZlbiBpZiBubyBkZXZpY2UgY2hhbmdlIGlzIG5lZWRlZAotICAgICAgICBmb3JjZSA9IHRydWU7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgREVWSUNFX0NBVEVHT1JZX0NOVDsgaisrKSB7Ci0gICAgICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fRFRNRl0ubVZvbHVtZUN1cnZlW2pdID0KLSAgICAgICAgICAgICAgICAgICAgc1ZvbHVtZVByb2ZpbGVzW0FVRElPX1NUUkVBTV9EVE1GXVtqXTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoaXNTdGF0ZUluQ2FsbChzdGF0ZSkgJiYgKHN0YXRlICE9IG9sZFN0YXRlKSkgewotICAgICAgICBBTE9HVigiICBTd2l0Y2hpbmcgYmV0d2VlbiB0ZWxlcGhvbnkgYW5kIFZvSVAgaW4gc2V0UGhvbmVTdGF0ZSgpIik7Ci0gICAgICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIHRlbGVwaG9ueSBhbmQgVm9JUAotICAgICAgICAvLyBldmVuIGlmIG5vIGRldmljZSBjaGFuZ2UgaXMgbmVlZGVkCi0gICAgICAgIGZvcmNlID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBjaGVjayBmb3IgZGV2aWNlIGFuZCBvdXRwdXQgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgbmV3IHBob25lIHN0YXRlCi0gICAgY2hlY2tBMmRwU3VzcGVuZCgpOwotICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwotICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7Ci0KLSAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGh3T3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG1QcmltYXJ5T3V0cHV0KTsKLQotICAgIGludCBkZWxheU1zID0gMDsKLSAgICBpZiAoaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKLSAgICAgICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgLy8gbXV0ZSBtZWRpYSBhbmQgc29uaWZpY2F0aW9uIHN0cmF0ZWdpZXMgYW5kIGRlbGF5IGRldmljZSBzd2l0Y2ggYnkgdGhlIGxhcmdlc3QKLSAgICAgICAgICAgIC8vIGxhdGVuY3kgb2YgYW55IG91dHB1dCB3aGVyZSBlaXRoZXIgc3RyYXRlZ3kgaXMgYWN0aXZlLgotICAgICAgICAgICAgLy8gVGhpcyBhdm9pZCBzZW5kaW5nIHRoZSByaW5nIHRvbmUgb3IgbXVzaWMgdGFpbCBpbnRvIHRoZSBlYXJwaWVjZSBvciBoZWFkc2V0LgotICAgICAgICAgICAgaWYgKChkZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX01FRElBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c1RpbWUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzVGltZSkpICYmCi0gICAgICAgICAgICAgICAgICAgIChkZWxheU1zIDwgKGludClkZXNjLT5tTGF0ZW5jeSoyKSkgewotICAgICAgICAgICAgICAgIGRlbGF5TXMgPSBkZXNjLT5tTGF0ZW5jeSoyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLCB0cnVlLCBtT3V0cHV0cy5rZXlBdChpKSk7Ci0gICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfTUVESUEsIGZhbHNlLCBtT3V0cHV0cy5rZXlBdChpKSwgTVVURV9USU1FX01TLAotICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBLCB0cnVlIC8qZnJvbUNhY2hlKi8pKTsKLSAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9TT05JRklDQVRJT04sIHRydWUsIG1PdXRwdXRzLmtleUF0KGkpKTsKLSAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZhbHNlLCBtT3V0cHV0cy5rZXlBdChpKSwgTVVURV9USU1FX01TLAotICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgdHJ1ZSAvKmZyb21DYWNoZSovKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBOb3RlIHRoYXQgZGVzcGl0ZSB0aGUgZmFjdCB0aGF0IGdldE5ld091dHB1dERldmljZSgpIGlzIGNhbGxlZCBvbiB0aGUgcHJpbWFyeSBvdXRwdXQsCi0gICAgLy8gdGhlIGRldmljZSByZXR1cm5lZCBpcyBub3QgbmVjZXNzYXJpbHkgcmVhY2hhYmxlIHZpYSB0aGlzIG91dHB1dAotICAgIGF1ZGlvX2RldmljZXNfdCByeERldmljZSA9IGdldE5ld091dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgLy8gZm9yY2Ugcm91dGluZyBjb21tYW5kIHRvIGF1ZGlvIGhhcmR3YXJlIHdoZW4gZW5kaW5nIGNhbGwKLSAgICAvLyBldmVuIGlmIG5vIGRldmljZSBjaGFuZ2UgaXMgbmVlZGVkCi0gICAgaWYgKGlzU3RhdGVJbkNhbGwob2xkU3RhdGUpICYmIHJ4RGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgIHJ4RGV2aWNlID0gaHdPdXRwdXREZXNjLT5kZXZpY2UoKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7Ci0gICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKHJ4RGV2aWNlLCBkZWxheU1zKTsKLSAgICB9IGVsc2UgaWYgKG9sZFN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgewotICAgICAgICBpZiAobUNhbGxSeFBhdGNoICE9IDApIHsKLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChtQ2FsbFJ4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCAwKTsKLSAgICAgICAgICAgIG1DYWxsUnhQYXRjaC5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ2FsbFR4UGF0Y2ggIT0gMCkgewotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKG1DYWxsVHhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUsIDApOwotICAgICAgICAgICAgbUNhbGxUeFBhdGNoLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCByeERldmljZSwgZm9yY2UsIDApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNldE91dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2UsIGZvcmNlLCAwKTsKLSAgICB9Ci0gICAgLy8gaWYgZW50ZXJpbmcgaW4gY2FsbCBzdGF0ZSwgaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBhY3RpdmUgc3RyZWFtcwotICAgIC8vIHBlcnRhaW5pbmcgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHNlZSBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKQotICAgIGlmIChpc1N0YXRlSW5DYWxsKHN0YXRlKSkgewotICAgICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIGluIGNhbGwgc3RhdGUgbWFuYWdlbWVudDogbmV3IHN0YXRlIGlzICVkIiwgc3RhdGUpOwotICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgewotICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sIHRydWUsIHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gRmxhZyB0aGF0IHJpbmd0b25lIHZvbHVtZSBtdXN0IGJlIGxpbWl0ZWQgdG8gbXVzaWMgdm9sdW1lIHVudGlsIHdlIGV4aXQgTU9ERV9SSU5HVE9ORQotICAgIGlmIChzdGF0ZSA9PSBBVURJT19NT0RFX1JJTkdUT05FICYmCi0gICAgICAgIGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVkpKSB7Ci0gICAgICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtTGltaXRSaW5ndG9uZVZvbHVtZSA9IGZhbHNlOwotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCi17Ci0gICAgQUxPR1YoInNldEZvcmNlVXNlKCkgdXNhZ2UgJWQsIGNvbmZpZyAlZCwgbVBob25lU3RhdGUgJWQiLCB1c2FnZSwgY29uZmlnLCBtUGhvbmVTdGF0ZSk7Ci0KLSAgICBib29sIGZvcmNlVm9sdW1lUmVldmFsID0gZmFsc2U7Ci0gICAgc3dpdGNoKHVzYWdlKSB7Ci0gICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT046Ci0gICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVIgJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYKLSAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkgewotICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9DT01NVU5JQ0FUSU9OIiwgY29uZmlnKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3JjZVZvbHVtZVJlZXZhbCA9IHRydWU7Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQToKLSAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfSEVBRFBIT05FUyAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX0EyRFAgJiYKLSAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfV0lSRURfQUNDRVNTT1JZICYmCi0gICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0FOQUxPR19ET0NLICYmCi0gICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0RJR0lUQUxfRE9DSyAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUgJiYKLSAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVIgKSB7Ci0gICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX01FRElBIiwgY29uZmlnKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEOgotICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9XSVJFRF9BQ0NFU1NPUlkgJiYKLSAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkgewotICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9SRUNPUkQiLCBjb25maWcpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLOgotICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfQ0FSX0RPQ0sgJiYKLSAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfREVTS19ET0NLICYmCi0gICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1dJUkVEX0FDQ0VTU09SWSAmJgotICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9BTkFMT0dfRE9DSyAmJgotICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9ESUdJVEFMX0RPQ0spIHsKLSAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfRE9DSyIsIGNvbmZpZyk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yY2VWb2x1bWVSZWV2YWwgPSB0cnVlOwotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNOgotICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmCi0gICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgewotICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9TWVNURU0iLCBjb25maWcpOwotICAgICAgICB9Ci0gICAgICAgIGZvcmNlVm9sdW1lUmVldmFsID0gdHJ1ZTsKLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPOgotICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmCi0gICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0hETUlfU1lTVEVNX0FVRElPX0VORk9SQ0VEKSB7Ci0gICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3JIRE1JX1NZU1RFTV9BVURJTyIsIGNvbmZpZyk7Ci0gICAgICAgIH0KLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCB1c2FnZSAlZCIsIHVzYWdlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gY2hlY2sgZm9yIGRldmljZSBhbmQgb3V0cHV0IGNoYW5nZXMgdHJpZ2dlcmVkIGJ5IG5ldyBmb3JjZSB1c2FnZQotICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKLSAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKLSAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOwotICAgIGlmIChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlKTsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBtT3V0cHV0cy5rZXlBdChpKTsKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXQsIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIGlmICgobVBob25lU3RhdGUgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSB8fCAob3V0cHV0ICE9IG1QcmltYXJ5T3V0cHV0KSkgewotICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwgbmV3RGV2aWNlLCAobmV3RGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZvcmNlVm9sdW1lUmVldmFsICYmIChuZXdEZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpKSB7Ci0gICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0LCBuZXdEZXZpY2UsIDAsIHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXVkaW9faW9faGFuZGxlX3QgYWN0aXZlSW5wdXQgPSBnZXRBY3RpdmVJbnB1dCgpOwotICAgIGlmIChhY3RpdmVJbnB1dCAhPSAwKSB7Ci0gICAgICAgIHNldElucHV0RGV2aWNlKGFjdGl2ZUlucHV0LCBnZXROZXdJbnB1dERldmljZShhY3RpdmVJbnB1dCkpOwotICAgIH0KLQotfQotCi1hdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKQotewotICAgIHJldHVybiBtRm9yY2VVc2VbdXNhZ2VdOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3lzdGVtUHJvcGVydHkoY29uc3QgY2hhciogcHJvcGVydHksIGNvbnN0IGNoYXIqIHZhbHVlKQotewotICAgIEFMT0dWKCJzZXRTeXN0ZW1Qcm9wZXJ0eSgpIHByb3BlcnR5ICVzLCB2YWx1ZSAlcyIsIHByb3BlcnR5LCB2YWx1ZSk7Ci19Ci0KLS8vIEZpbmQgYSBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgY29tcGF0aWJsZSB3aXRoIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCwgZXZlbiBpZiB0aGUgaW5wdXQgZmxhZ3MgZG8KLS8vIG5vdCBleHBsaWNpdGx5IHJlcXVlc3QgYSBkaXJlY3Qgb3V0cHV0Ci1zcDxBdWRpb1BvbGljeU1hbmFnZXI6OklPUHJvZmlsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCi17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXNbal07Ci0gICAgICAgICAgICBib29sIGZvdW5kID0gcHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2UsIFN0cmluZzgoIiIpLCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgIE5VTEwgLyp1cGRhdGVkU2FtcGxpbmdSYXRlKi8sIGZvcm1hdCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEIDogQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKLSAgICAgICAgICAgIGlmIChmb3VuZCAmJiAobUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKLXsKLSAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgIEFMT0dWKCJnZXRPdXRwdXQoKSBkZXZpY2UgJWQsIHN0cmVhbSAlZCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJXgsIGNoYW5uZWxNYXNrICV4LCBmbGFncyAleCIsCi0gICAgICAgICAgZGV2aWNlLCBzdHJlYW0sIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MpOwotCi0gICAgcmV0dXJuIGdldE91dHB1dEZvckRldmljZShkZXZpY2UsIEFVRElPX1NFU1NJT05fQUxMT0NBVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIHNhbXBsaW5nUmF0ZSxmb3JtYXQsIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIG9mZmxvYWRJbmZvKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKLXsKLSAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlczsKLSAgICBpZiAoYXR0ciAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICghaXNWYWxpZEF0dHJpYnV0ZXMoYXR0cikpIHsKLSAgICAgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyKCkgaW52YWxpZCBhdHRyaWJ1dGVzOiB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKLSAgICAgICAgICAgICAgICAgIGF0dHItPnVzYWdlLCBhdHRyLT5jb250ZW50X3R5cGUsIGF0dHItPmZsYWdzLAotICAgICAgICAgICAgICAgICAgYXR0ci0+dGFncyk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGF0dHJpYnV0ZXMgPSAqYXR0cjsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoKnN0cmVhbSA8IEFVRElPX1NUUkVBTV9NSU4gfHwgKnN0cmVhbSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewotICAgICAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHIoKTogIGludmFsaWQgc3RyZWFtIHR5cGUiKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyZWFtX3R5cGVfdG9fYXVkaW9fYXR0cmlidXRlcygqc3RyZWFtLCAmYXR0cmlidXRlcyk7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUG9saWN5TWl4ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjOwotICAgICAgICBpZiAobVBvbGljeU1peGVzW2ldLT5tTWl4Lm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbVBvbGljeU1peGVzW2ldLT5tTWl4Lm1Dcml0ZXJpYS5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgIGlmICgoUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0UgPT0gbVBvbGljeU1peGVzW2ldLT5tTWl4Lm1Dcml0ZXJpYVtqXS5tUnVsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeU1peGVzW2ldLT5tTWl4Lm1Dcml0ZXJpYVtqXS5tQXR0ci5tVXNhZ2UgPT0gYXR0cmlidXRlcy51c2FnZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKFJVTEVfRVhDTFVERV9BVFRSSUJVVEVfVVNBR0UgPT0gbVBvbGljeU1peGVzW2ldLT5tTWl4Lm1Dcml0ZXJpYVtqXS5tUnVsZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeU1peGVzW2ldLT5tTWl4Lm1Dcml0ZXJpYVtqXS5tQXR0ci5tVXNhZ2UgIT0gYXR0cmlidXRlcy51c2FnZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzYyA9IG1Qb2xpY3lNaXhlc1tpXS0+bU91dHB1dDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKGF0dHJpYnV0ZXMudGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJuY21wKGF0dHJpYnV0ZXMudGFncyArIHN0cmxlbigiYWRkcj0iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeU1peGVzW2ldLT5tTWl4Lm1SZWdpc3RyYXRpb25JZC5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gc3RybGVuKCJhZGRyPSIpIC0gMSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBkZXNjID0gbVBvbGljeU1peGVzW2ldLT5tT3V0cHV0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobVBvbGljeU1peGVzW2ldLT5tTWl4Lm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgewotICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMudXNhZ2UgPT0gQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UgJiYKLSAgICAgICAgICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCAmJgotICAgICAgICAgICAgICAgICAgICBzdHJuY21wKGF0dHJpYnV0ZXMudGFncyArIHN0cmxlbigiYWRkcj0iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5TWl4ZXNbaV0tPm1NaXgubVJlZ2lzdHJhdGlvbklkLnN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIHN0cmxlbigiYWRkcj0iKSAtIDEpID09IDApIHsKLSAgICAgICAgICAgICAgICBkZXNjID0gbVBvbGljeU1peGVzW2ldLT5tT3V0cHV0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXNjICE9IDApIHsKLSAgICAgICAgICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc2MtPm1Qb2xpY3lNaXggPSAmbVBvbGljeU1peGVzW2ldLT5tTWl4OwotICAgICAgICAgICAgKnN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICAqb3V0cHV0ID0gZGVzYy0+bUlvSGFuZGxlOwotICAgICAgICAgICAgQUxPR1YoImdldE91dHB1dEZvckF0dHIoKSByZXR1cm5zIG91dHB1dCAlZCIsICpvdXRwdXQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChhdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFKSB7Ci0gICAgICAgIEFMT0dXKCJnZXRPdXRwdXRGb3JBdHRyKCkgbm8gcG9saWN5IG1peCBmb3VuZCBmb3IgdXNhZ2UgQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UiKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIHVzYWdlPSVkLCBjb250ZW50PSVkLCB0YWc9JXMgZmxhZ3M9JTA4eCIsCi0gICAgICAgICAgICBhdHRyaWJ1dGVzLnVzYWdlLCBhdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSwgYXR0cmlidXRlcy50YWdzLCBhdHRyaWJ1dGVzLmZsYWdzKTsKLQotICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSAocm91dGluZ19zdHJhdGVneSkgZ2V0U3RyYXRlZ3lGb3JBdHRyKCZhdHRyaWJ1dGVzKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotCi0gICAgaWYgKChhdHRyaWJ1dGVzLmZsYWdzICYgQVVESU9fRkxBR19IV19BVl9TWU5DKSAhPSAwKSB7Ci0gICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpOwotICAgIH0KLQotICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgZGV2aWNlIDB4JXgsIHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICV4LCBjaGFubmVsTWFzayAleCwgZmxhZ3MgJXgiLAotICAgICAgICAgIGRldmljZSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncyk7Ci0KLSAgICAqc3RyZWFtID0gc3RyZWFtVHlwZWZyb21BdHRyaWJ1dGVzSW50KCZhdHRyaWJ1dGVzKTsKLSAgICAqb3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRGV2aWNlKGRldmljZSwgc2Vzc2lvbiwgKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBvZmZsb2FkSW5mbyk7Ci0gICAgaWYgKCpvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0Rm9yRGV2aWNlKAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiBfX3VudXNlZCwKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKLXsKLSAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICB1aW50MzJfdCBsYXRlbmN5ID0gMDsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0KLSNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAotICAgIGlmIChtQ3VyT3V0cHV0ICE9IDApIHsKLSAgICAgICAgQUxPR1YoImdldE91dHB1dCgpIHRlc3Qgb3V0cHV0IG1DdXJPdXRwdXQgJWQsIHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICVkLCBjaGFubmVsTWFzayAleCwgbURpcmVjdE91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgbUN1ck91dHB1dCwgbVRlc3RTYW1wbGluZ1JhdGUsIG1UZXN0Rm9ybWF0LCBtVGVzdENoYW5uZWxzLCBtRGlyZWN0T3V0cHV0KTsKLQotICAgICAgICBpZiAobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdID09IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSBvcGVuaW5nIHRlc3Qgb3V0cHV0Iik7Ci0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKE5VTEwpOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IG1UZXN0RGV2aWNlOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUxhdGVuY3kgPSBtVGVzdExhdGVuY3lNczsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyA9Ci0gICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkobURpcmVjdE91dHB1dCA/IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCA6IDApOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPSAwOwotICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOwotICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gbVRlc3RTYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gbVRlc3RDaGFubmVsczsKLSAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBtVGVzdEZvcm1hdDsKLSAgICAgICAgICAgIGlmIChvZmZsb2FkSW5mbyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mbyA9ICpvZmZsb2FkSW5mbzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKLSAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRDbWQgPSBBdWRpb1BhcmFtZXRlcigpOwotICAgICAgICAgICAgICAgIG91dHB1dENtZC5hZGRJbnQoU3RyaW5nOCgic2V0X2lkIiksbUN1ck91dHB1dCk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLG91dHB1dENtZC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBhZGRPdXRwdXQobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXREZXNjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdOwotICAgIH0KLSNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCi0KLSAgICAvLyBvcGVuIGEgZGlyZWN0IG91dHB1dCBpZiByZXF1aXJlZCBieSBzcGVjaWZpZWQgcGFyYW1ldGVycwotICAgIC8vZm9yY2UgZGlyZWN0IGZsYWcgaWYgb2ZmbG9hZCBmbGFnIGlzIHNldDogb2ZmbG9hZGluZyBpbXBsaWVzIGEgZGlyZWN0IG91dHB1dCBzdHJlYW0KLSAgICAvLyBhbmQgYWxsIGNvbW1vbiBiZWhhdmlvcnMgYXJlIGRyaXZlbiBieSBjaGVja2luZyBvbmx5IHRoZSBkaXJlY3QgZmxhZwotICAgIC8vIHRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIHNldCBhcHByb3ByaWF0ZWx5IGluIHRoZSBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlCi0gICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKLSAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKLSAgICB9Ci0gICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpICE9IDApIHsKLSAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKLSAgICB9Ci0gICAgLy8gb25seSBhbGxvdyBkZWVwIGJ1ZmZlcmluZyBmb3IgbXVzaWMgc3RyZWFtIHR5cGUKLSAgICBpZiAoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9NVVNJQykgewotICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgJn5BVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUik7Ci0gICAgfQotCi0gICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlOwotCi0gICAgLy8gc2tpcCBkaXJlY3Qgb3V0cHV0IHNlbGVjdGlvbiBpZiB0aGUgcmVxdWVzdCBjYW4gb2J2aW91c2x5IGJlIGF0dGFjaGVkIHRvIGEgbWl4ZWQgb3V0cHV0Ci0gICAgLy8gYW5kIG5vdCBleHBsaWNpdGx5IHJlcXVlc3RlZAotICAgIGlmICgoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSA9PSAwKSAmJgotICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmIHNhbXBsaW5nUmF0ZSA8PSBNQVhfTUlYRVJfU0FNUExJTkdfUkFURSAmJgotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKSA8PSAyKSB7Ci0gICAgICAgIGdvdG8gbm9uX2RpcmVjdF9vdXRwdXQ7Ci0gICAgfQotCi0gICAgLy8gRG8gbm90IGFsbG93IG9mZmxvYWRpbmcgaWYgb25lIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QgaXMgZW5hYmxlZC4gVGhpcyBwcmV2ZW50cyBmcm9tCi0gICAgLy8gY3JlYXRpbmcgYW4gb2ZmbG9hZGVkIHRyYWNrIGFuZCB0ZWFyaW5nIGl0IGRvd24gaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnQgd2hlbiBhdWRpb2ZsaW5nZXIKLSAgICAvLyBkZXRlY3RzIHRoZXJlIGlzIGFuIGFjdGl2ZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0LgotICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgY2hlY2sgdGhlIGF1ZGlvIHNlc3Npb24gaGVyZSBidXQgd2UgZG8gbm90IGhhdmUgaXQgaW4gdGhpcyBjb250ZXh0LgotICAgIC8vIFRoaXMgbWF5IHByZXZlbnQgb2ZmbG9hZGluZyBpbiByYXJlIHNpdHVhdGlvbnMgd2hlcmUgZWZmZWN0cyBhcmUgbGVmdCBhY3RpdmUgYnkgYXBwcwotICAgIC8vIGluIHRoZSBiYWNrZ3JvdW5kLgotCi0gICAgaWYgKCgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSA9PSAwKSB8fAotICAgICAgICAgICAgIWlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkpIHsKLSAgICAgICAgcHJvZmlsZSA9IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KWZsYWdzKTsKLSAgICB9Ci0KLSAgICBpZiAocHJvZmlsZSAhPSAwKSB7Ci0gICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IE5VTEw7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgKHByb2ZpbGUgPT0gZGVzYy0+bVByb2ZpbGUpKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYyA9IGRlc2M7Ci0gICAgICAgICAgICAgICAgLy8gcmV1c2UgZGlyZWN0IG91dHB1dCBpZiBjdXJyZW50bHkgb3BlbiBhbmQgY29uZmlndXJlZCB3aXRoIHNhbWUgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgIGlmICgoc2FtcGxpbmdSYXRlID09IG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoZm9ybWF0ID09IG91dHB1dERlc2MtPm1Gb3JtYXQpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrKSkgewotICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGlyZWN0T3BlbkNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSByZXVzaW5nIGRpcmVjdCBvdXRwdXQgJWQiLCBtT3V0cHV0cy5rZXlBdChpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtT3V0cHV0cy5rZXlBdChpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY2xvc2UgZGlyZWN0IG91dHB1dCBpZiBjdXJyZW50bHkgb3BlbiBhbmQgY29uZmlndXJlZCB3aXRoIGRpZmZlcmVudCBwYXJhbWV0ZXJzCi0gICAgICAgIGlmIChvdXRwdXREZXNjICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0cHV0RGVzYyA9IG5ldyBBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSk7Ci0gICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgIG91dHB1dERlc2MtPm1MYXRlbmN5ID0gMDsKLSAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzID0oYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIChvdXRwdXREZXNjLT5tRmxhZ3MgfCBmbGFncyk7Ci0gICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKLSAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gc2FtcGxpbmdSYXRlOwotICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7Ci0gICAgICAgIGNvbmZpZy5mb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgIGlmIChvZmZsb2FkSW5mbyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvID0gKm9mZmxvYWRJbmZvOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KHByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOwotCi0gICAgICAgIC8vIG9ubHkgYWNjZXB0IGFuIG91dHB1dCB3aXRoIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVycwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8Ci0gICAgICAgICAgICAoc2FtcGxpbmdSYXRlICE9IDAgJiYgc2FtcGxpbmdSYXRlICE9IGNvbmZpZy5zYW1wbGVfcmF0ZSkgfHwKLSAgICAgICAgICAgIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX0RFRkFVTFQgJiYgZm9ybWF0ICE9IGNvbmZpZy5mb3JtYXQpIHx8Ci0gICAgICAgICAgICAoY2hhbm5lbE1hc2sgIT0gMCAmJiBjaGFubmVsTWFzayAhPSBjb25maWcuY2hhbm5lbF9tYXNrKSkgewotICAgICAgICAgICAgQUxPR1YoImdldE91dHB1dCgpIGZhaWxlZCBvcGVuaW5nIGRpcmVjdCBvdXRwdXQ6IG91dHB1dCAlZCBzYW1wbGluZ1JhdGUgJWQgJWQsIgotICAgICAgICAgICAgICAgICAgICAiZm9ybWF0ICVkICVkLCBjaGFubmVsTWFzayAlMDR4ICUwNHgiLCBvdXRwdXQsIHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBvdXRwdXREZXNjLT5tRm9ybWF0LCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGZhbGwgYmFjayB0byBtaXhlciBvdXRwdXQgaWYgcG9zc2libGUgd2hlbiB0aGUgZGlyZWN0IG91dHB1dCBjb3VsZCBub3QgYmUgb3BlbgotICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSAmJiBzYW1wbGluZ1JhdGUgPD0gTUFYX01JWEVSX1NBTVBMSU5HX1JBVEUpIHsKLSAgICAgICAgICAgICAgICBnb3RvIG5vbl9kaXJlY3Rfb3V0cHV0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICB9Ci0gICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7Ci0gICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7Ci0gICAgICAgIG91dHB1dERlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OwotICAgICAgICBvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9IDA7Ci0gICAgICAgIG91dHB1dERlc2MtPm1TdG9wVGltZVtzdHJlYW1dID0gMDsKLSAgICAgICAgb3V0cHV0RGVzYy0+bURpcmVjdE9wZW5Db3VudCA9IDE7Ci0KLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRWZmZWN0KCk7Ci0gICAgICAgIGFkZE91dHB1dChvdXRwdXQsIG91dHB1dERlc2MpOwotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQgPSBnZXRPdXRwdXRGb3JFZmZlY3QoKTsKLSAgICAgICAgaWYgKGRzdE91dHB1dCA9PSBvdXRwdXQpIHsKLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5tb3ZlRWZmZWN0cyhBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsIHNyY091dHB1dCwgZHN0T3V0cHV0KTsKLSAgICAgICAgfQotICAgICAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7Ci0gICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSByZXR1cm5zIG5ldyBkaXJlY3Qgb3V0cHV0ICVkIiwgb3V0cHV0KTsKLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwotICAgICAgICByZXR1cm4gb3V0cHV0OwotICAgIH0KLQotbm9uX2RpcmVjdF9vdXRwdXQ6Ci0KLSAgICAvLyBpZ25vcmluZyBjaGFubmVsIG1hc2sgZHVlIHRvIGRvd25taXggY2FwYWJpbGl0eSBpbiBtaXhlcgotCi0gICAgLy8gb3BlbiBhIG5vbiBkaXJlY3Qgb3V0cHV0Ci0KLSAgICAvLyBmb3Igbm9uIGRpcmVjdCBvdXRwdXRzLCBvbmx5IFBDTSBpcyBzdXBwb3J0ZWQKLSAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7Ci0gICAgICAgIC8vIGdldCB3aGljaCBvdXRwdXQgaXMgc3VpdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgc3RyZWFtLiBUaGUgYWN0dWFsCi0gICAgICAgIC8vIHJvdXRpbmcgY2hhbmdlIHdpbGwgaGFwcGVuIHdoZW4gc3RhcnRPdXRwdXQoKSB3aWxsIGJlIGNhbGxlZAotICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgbU91dHB1dHMpOwotCi0gICAgICAgIC8vIGF0IHRoaXMgc3RhZ2Ugd2Ugc2hvdWxkIGlnbm9yZSB0aGUgRElSRUNUIGZsYWcgYXMgbm8gZGlyZWN0IG91dHB1dCBjb3VsZCBiZSBmb3VuZCBlYXJsaWVyCi0gICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOwotICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywgZmxhZ3MsIGZvcm1hdCk7Ci0gICAgfQotICAgIEFMT0dXX0lGKChvdXRwdXQgPT0gMCksICJnZXRPdXRwdXQoKSBjb3VsZCBub3QgZmluZCBvdXRwdXQgZm9yIHN0cmVhbSAlZCwgc2FtcGxpbmdSYXRlICVkLCIKLSAgICAgICAgICAgICJmb3JtYXQgJWQsIGNoYW5uZWxzICV4LCBmbGFncyAleCIsIHN0cmVhbSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncyk7Ci0KLSAgICBBTE9HVigiZ2V0T3V0cHV0KCkgcmV0dXJucyBvdXRwdXQgJWQiLCBvdXRwdXQpOwotCi0gICAgcmV0dXJuIG91dHB1dDsKLX0KLQotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZWxlY3RPdXRwdXQoY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpCi17Ci0gICAgLy8gc2VsZWN0IG9uZSBvdXRwdXQgYW1vbmcgc2V2ZXJhbCB0aGF0IHByb3ZpZGUgYSBwYXRoIHRvIGEgcGFydGljdWxhciBkZXZpY2Ugb3Igc2V0IG9mCi0gICAgLy8gZGV2aWNlcyAodGhlIGxpc3Qgd2FzIHByZXZpb3VzbHkgYnVpbGQgYnkgZ2V0T3V0cHV0c0ZvckRldmljZSgpKS4KLSAgICAvLyBUaGUgcHJpb3JpdHkgaXMgYXMgZm9sbG93czoKLSAgICAvLyAxOiB0aGUgb3V0cHV0IHdpdGggdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIHJlcXVlc3RlZCBwb2xpY3kgZmxhZ3MKLSAgICAvLyAyOiB0aGUgcHJpbWFyeSBvdXRwdXQKLSAgICAvLyAzOiB0aGUgZmlyc3Qgb3V0cHV0IGluIHRoZSBsaXN0Ci0KLSAgICBpZiAob3V0cHV0cy5zaXplKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKG91dHB1dHMuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgcmV0dXJuIG91dHB1dHNbMF07Ci0gICAgfQotCi0gICAgaW50IG1heENvbW1vbkZsYWdzID0gMDsKLSAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRGbGFncyA9IDA7Ci0gICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0UHJpbWFyeSA9IDA7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7Ci0gICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgICAgIC8vIGlmIGEgdmFsaWQgZm9ybWF0IGlzIHNwZWNpZmllZCwgc2tpcCBvdXRwdXQgaWYgbm90IGNvbXBhdGlibGUKLSAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX0lOVkFMSUQpIHsKLSAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gb3V0cHV0RGVzYy0+bUZvcm1hdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgY29tbW9uRmxhZ3MgPSBwb3Bjb3VudChvdXRwdXREZXNjLT5tUHJvZmlsZS0+bUZsYWdzICYgZmxhZ3MpOwotICAgICAgICAgICAgaWYgKGNvbW1vbkZsYWdzID4gbWF4Q29tbW9uRmxhZ3MpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRGbGFncyA9IG91dHB1dHNbaV07Ci0gICAgICAgICAgICAgICAgbWF4Q29tbW9uRmxhZ3MgPSBjb21tb25GbGFnczsKLSAgICAgICAgICAgICAgICBBTE9HVigic2VsZWN0T3V0cHV0KCkgY29tbW9uRmxhZ3MgZm9yIG91dHB1dCAlZCwgJTA0eCIsIG91dHB1dHNbaV0sIGNvbW1vbkZsYWdzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUHJvZmlsZS0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkgewotICAgICAgICAgICAgICAgIG91dHB1dFByaW1hcnkgPSBvdXRwdXRzW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG91dHB1dEZsYWdzICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG91dHB1dEZsYWdzOwotICAgIH0KLSAgICBpZiAob3V0cHV0UHJpbWFyeSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBvdXRwdXRQcmltYXJ5OwotICAgIH0KLQotICAgIHJldHVybiBvdXRwdXRzWzBdOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgQUxPR1YoInN0YXJ0T3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLCBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdGFydE91dHB1dCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICAvLyBjYW5ub3Qgc3RhcnQgcGxheWJhY2sgb2YgU1RSRUFNX1RUUyBpZiBhbnkgb3RoZXIgb3V0cHV0IGlzIGJlaW5nIHVzZWQKLSAgICB1aW50MzJfdCBiZWFjb25NdXRlTGF0ZW5jeSA9IDA7Ci0gICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVFRTKSB7Ci0gICAgICAgIEFMT0dWKCJcdCBmb3VuZCBCRUFDT04gc3RyZWFtIik7Ci0gICAgICAgIGlmIChpc0FueU91dHB1dEFjdGl2ZShBVURJT19TVFJFQU1fVFRTIC8qc3RyZWFtVG9JZ25vcmUqLykpIHsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJlYWNvbk11dGVMYXRlbmN5ID0gaGFuZGxlRXZlbnRGb3JCZWFjb24oU1RBUlRJTkdfQkVBQ09OKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIHNvbWUgcGxheWJhY2sgb3RoZXIgdGhhbiBiZWFjb24gc3RhcnRzCi0gICAgICAgIGJlYWNvbk11dGVMYXRlbmN5ID0gaGFuZGxlRXZlbnRGb3JCZWFjb24oU1RBUlRJTkdfT1VUUFVUKTsKLSAgICB9Ci0KLSAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKLQotICAgIC8vIGluY3JlbWVudCB1c2FnZSBjb3VudCBmb3IgdGhpcyBzdHJlYW0gb24gdGhlIHJlcXVlc3RlZCBvdXRwdXQ6Ci0gICAgLy8gTk9URSB0aGF0IHRoZSB1c2FnZSBjb3VudCBpcyB0aGUgc2FtZSBmb3IgZHVwbGljYXRlZCBvdXRwdXQgYW5kIGhhcmR3YXJlIG91dHB1dCB3aGljaCBpcwotICAgIC8vIG5lY2Vzc2FyeSBmb3IgYSBjb3JyZWN0IGNvbnRyb2wgb2YgaGFyZHdhcmUgb3V0cHV0IHJvdXRpbmcgYnkgc3RhcnRPdXRwdXQoKSBhbmQgc3RvcE91dHB1dCgpCi0gICAgb3V0cHV0RGVzYy0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCAxKTsKLQotICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9PSAxKSB7Ci0gICAgICAgIC8vIHN0YXJ0aW5nIGFuIG91dHB1dCBiZWluZyByZXJvdXRlZD8KLSAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCkgewotICAgICAgICAgICAgbmV3RGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIH0KLSAgICAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7Ci0gICAgICAgIGJvb2wgc2hvdWxkV2FpdCA9IChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZWFjb25NdXRlTGF0ZW5jeSA+IDApOwotICAgICAgICB1aW50MzJfdCB3YWl0TXMgPSBiZWFjb25NdXRlTGF0ZW5jeTsKLSAgICAgICAgYm9vbCBmb3JjZSA9IGZhbHNlOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKGRlc2MgIT0gb3V0cHV0RGVzYykgewotICAgICAgICAgICAgICAgIC8vIGZvcmNlIGEgZGV2aWNlIGNoYW5nZSBpZiBhbnkgb3RoZXIgb3V0cHV0IGlzIG1hbmFnZWQgYnkgdGhlIHNhbWUgaHcKLSAgICAgICAgICAgICAgICAvLyBtb2R1bGUgYW5kIGhhcyBhIGN1cnJlbnQgZGV2aWNlIHNlbGVjdGlvbiB0aGF0IGRpZmZlcnMgZnJvbSBzZWxlY3RlZCBkZXZpY2UuCi0gICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgYXVkaW8gSEFMIG11c3QgcmVjZWl2ZSB0aGUgbmV3IGRldmljZSBzZWxlY3Rpb24gc28gdGhhdCBpdCBjYW4KLSAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIGRldmljZSBjdXJyZW50bHkgc2VsZWN0ZWQgYnkgdGhlIG90aGVyIGFjdGl2ZSBvdXRwdXQuCi0gICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPnNoYXJlc0h3TW9kdWxlV2l0aChkZXNjKSAmJgotICAgICAgICAgICAgICAgICAgICBkZXNjLT5kZXZpY2UoKSAhPSBuZXdEZXZpY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yY2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBhdWRpbyBvbiBvdGhlciBhY3RpdmUgb3V0cHV0cyB0byBiZSBwcmVzZW50ZWQgd2hlbiBzdGFydGluZwotICAgICAgICAgICAgICAgIC8vIGEgbm90aWZpY2F0aW9uIHNvIHRoYXQgYXVkaW8gZm9jdXMgZWZmZWN0IGNhbiBwcm9wYWdhdGUsIG9yIHRoYXQgYSBtdXRlL3VubXV0ZQotICAgICAgICAgICAgICAgIC8vIGV2ZW50IG9jY3VycmVkIGZvciBiZWFjb24KLSAgICAgICAgICAgICAgICB1aW50MzJfdCBsYXRlbmN5ID0gZGVzYy0+bGF0ZW5jeSgpOwotICAgICAgICAgICAgICAgIGlmIChzaG91bGRXYWl0ICYmIGRlc2MtPmlzQWN0aXZlKGxhdGVuY3kgKiAyKSAmJiAod2FpdE1zIDwgbGF0ZW5jeSkpIHsKLSAgICAgICAgICAgICAgICAgICAgd2FpdE1zID0gbGF0ZW5jeTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdWludDMyX3QgbXV0ZVdhaXRNcyA9IHNldE91dHB1dERldmljZShvdXRwdXQsIG5ld0RldmljZSwgZm9yY2UpOwotCi0gICAgICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIHNvbmlmaWNhdGlvbiB3aGlsZSBpbiBjYWxsCi0gICAgICAgIGlmIChpc0luQ2FsbCgpKSB7Ci0gICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oc3RyZWFtLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhcHBseSB2b2x1bWUgcnVsZXMgZm9yIGN1cnJlbnQgc3RyZWFtIGFuZCBkZXZpY2UgaWYgbmVjZXNzYXJ5Ci0gICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbXNbc3RyZWFtXS5nZXRWb2x1bWVJbmRleChuZXdEZXZpY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RldmljZSk7Ci0KLSAgICAgICAgLy8gdXBkYXRlIHRoZSBvdXRwdXRzIGlmIHN0YXJ0aW5nIGFuIG91dHB1dCB3aXRoIGEgc3RyZWFtIHRoYXQgY2FuIGFmZmVjdCBub3RpZmljYXRpb24KLSAgICAgICAgLy8gcm91dGluZwotICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKHN0cmVhbSk7Ci0KLSAgICAgICAgLy8gQXV0b21hdGljYWxseSBlbmFibGUgdGhlIHJlbW90ZSBzdWJtaXggaW5wdXQgd2hlbiBvdXRwdXQgaXMgc3RhcnRlZCBvbiBhIHJlIHJvdXRpbmcgbWl4Ci0gICAgICAgIC8vIG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCi0gICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShuZXdEZXZpY2UpICYmIG91dHB1dERlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCAmJgotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgewotICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVBvbGljeU1peC0+bVJlZ2lzdHJhdGlvbklkKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZvcmNlIHJlZXZhbHVhdGluZyBhY2Nlc3NpYmlsaXR5IHJvdXRpbmcgd2hlbiByaW5ndG9uZSBvciBhbGFybSBzdGFydHMKLSAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgewotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHdhaXRNcyA+IG11dGVXYWl0TXMpIHsKLSAgICAgICAgICAgIHVzbGVlcCgod2FpdE1zIC0gbXV0ZVdhaXRNcykgKiAyICogMTAwMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICBBTE9HVigic3RvcE91dHB1dCgpIG91dHB1dCAlZCwgc3RyZWFtICVkLCBzZXNzaW9uICVkIiwgb3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOwotICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygic3RvcE91dHB1dCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKLQotICAgIC8vIGFsd2F5cyBoYW5kbGUgc3RyZWFtIHN0b3AsIGNoZWNrIHdoaWNoIHN0cmVhbSB0eXBlIGlzIHN0b3BwaW5nCi0gICAgaGFuZGxlRXZlbnRGb3JCZWFjb24oc3RyZWFtID09IEFVRElPX1NUUkVBTV9UVFMgPyBTVE9QUElOR19CRUFDT04gOiBTVE9QUElOR19PVVRQVVQpOwotCi0gICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZSBmb3Igc29uaWZpY2F0aW9uIHdoaWxlIGluIGNhbGwKLSAgICBpZiAoaXNJbkNhbGwoKSkgewotICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oc3RyZWFtLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KLQotICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA+IDApIHsKLSAgICAgICAgLy8gZGVjcmVtZW50IHVzYWdlIGNvdW50IG9mIHRoaXMgc3RyZWFtIG9uIHRoZSBvdXRwdXQKLSAgICAgICAgb3V0cHV0RGVzYy0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCAtMSk7Ci0gICAgICAgIC8vIHN0b3JlIHRpbWUgYXQgd2hpY2ggdGhlIHN0cmVhbSB3YXMgc3RvcHBlZCAtIHNlZSBpc1N0cmVhbUFjdGl2ZSgpCi0gICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IGRpc2FibGUgdGhlIHJlbW90ZSBzdWJtaXggaW5wdXQgd2hlbiBvdXRwdXQgaXMgc3RvcHBlZCBvbiBhCi0gICAgICAgICAgICAvLyByZSByb3V0aW5nIG1peCBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUwotICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKG91dHB1dERlc2MtPm1EZXZpY2UpICYmCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCAmJgotICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKLSAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVBvbGljeU1peC0+bVJlZ2lzdHJhdGlvbklkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVN0b3BUaW1lW3N0cmVhbV0gPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICAvLyBkZWxheSB0aGUgZGV2aWNlIHN3aXRjaCBieSB0d2ljZSB0aGUgbGF0ZW5jeSBiZWNhdXNlIHN0b3BPdXRwdXQoKSBpcyBleGVjdXRlZCB3aGVuCi0gICAgICAgICAgICAvLyB0aGUgdHJhY2sgc3RvcCgpIGNvbW1hbmQgaXMgcmVjZWl2ZWQgYW5kIGF0IHRoYXQgdGltZSB0aGUgYXVkaW8gdHJhY2sgYnVmZmVyIGNhbgotICAgICAgICAgICAgLy8gc3RpbGwgY29udGFpbiBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgZHJhaW5lZC4gVGhlIGxhdGVuY3kgb25seSBjb3ZlcnMgdGhlIGF1ZGlvIEhBTAotICAgICAgICAgICAgLy8gYW5kIGtlcm5lbCBidWZmZXJzLiBBbHNvIHRoZSBsYXRlbmN5IGRvZXMgbm90IGFsd2F5cyBpbmNsdWRlIGFkZGl0aW9uYWwgZGVsYXkgaW4gdGhlCi0gICAgICAgICAgICAvLyBhdWRpbyBwYXRoIChhdWRpbyBEU1AsIENPREVDIC4uLikKLSAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXQsIG5ld0RldmljZSwgZmFsc2UsIG91dHB1dERlc2MtPm1MYXRlbmN5KjIpOwotCi0gICAgICAgICAgICAvLyBmb3JjZSByZXN0b3JpbmcgdGhlIGRldmljZSBzZWxlY3Rpb24gb24gb3RoZXIgYWN0aXZlIG91dHB1dHMgaWYgaXQgZGlmZmVycyBmcm9tIHRoZQotICAgICAgICAgICAgLy8gb25lIGJlaW5nIHNlbGVjdGVkIGZvciB0aGlzIG91dHB1dAotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGN1ck91dHB1dCA9IG1PdXRwdXRzLmtleUF0KGkpOwotICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ck91dHB1dCAhPSBvdXRwdXQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmlzQWN0aXZlKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPnNoYXJlc0h3TW9kdWxlV2l0aChkZXNjKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKG5ld0RldmljZSAhPSBkZXNjLT5kZXZpY2UoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKGN1ck91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld091dHB1dERldmljZShjdXJPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1MYXRlbmN5KjIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgb3V0cHV0cyBpZiBzdG9wcGluZyBvbmUgd2l0aCBhIHN0cmVhbSB0aGF0IGNhbiBhZmZlY3Qgbm90aWZpY2F0aW9uIHJvdXRpbmcKLSAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvblJvdXRpbmdGb3JTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coInN0b3BPdXRwdXQoKSByZWZjb3VudCBpcyBhbHJlYWR5IDAgZm9yIG91dHB1dCAlZCIsIG91dHB1dCk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtIF9fdW51c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gX191bnVzZWQpCi17Ci0gICAgQUxPR1YoInJlbGVhc2VPdXRwdXQoKSAlZCIsIG91dHB1dCk7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJyZWxlYXNlT3V0cHV0KCkgcmVsZWFzaW5nIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgaW50IHRlc3RJbmRleCA9IHRlc3RPdXRwdXRJbmRleChvdXRwdXQpOwotICAgIGlmICh0ZXN0SW5kZXggIT0gMCkgewotICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOwotICAgICAgICAgICAgbU91dHB1dHMucmVtb3ZlSXRlbShvdXRwdXQpOwotICAgICAgICAgICAgbVRlc3RPdXRwdXRzW3Rlc3RJbmRleF0gPSAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotCi0gICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7Ci0gICAgaWYgKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgewotICAgICAgICBpZiAoZGVzYy0+bURpcmVjdE9wZW5Db3VudCA8PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygicmVsZWFzZU91dHB1dCgpIGludmFsaWQgb3BlbiBjb3VudCAlZCBmb3Igb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bURpcmVjdE9wZW5Db3VudCwgb3V0cHV0KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoLS1kZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApIHsKLSAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dCk7Ci0gICAgICAgICAgICAvLyBJZiBlZmZlY3RzIHdoZXJlIHByZXNlbnQgb24gdGhlIG91dHB1dCwgYXVkaW9mbGluZ2VyIG1vdmVkIHRoZW0gdG8gdGhlIHByaW1hcnkKLSAgICAgICAgICAgIC8vIG91dHB1dCBieSBkZWZhdWx0OiBtb3ZlIHRoZW0gYmFjayB0byB0aGUgYXBwcm9wcmlhdGUgb3V0cHV0LgotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRWZmZWN0KCk7Ci0gICAgICAgICAgICBpZiAoZHN0T3V0cHV0ICE9IG1QcmltYXJ5T3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm1vdmVFZmZlY3RzKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwgbVByaW1hcnlPdXRwdXQsIGRzdE91dHB1dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF90eXBlX3QgKmlucHV0VHlwZSkKLXsKLSAgICBBTE9HVigiZ2V0SW5wdXRGb3JBdHRyKCkgc291cmNlICVkLCBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAlZCwgY2hhbm5lbE1hc2sgJXgsIgotICAgICAgICAgICAgInNlc3Npb24gJWQsIGZsYWdzICUjeCIsCi0gICAgICAgICAgYXR0ci0+c291cmNlLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIHNlc3Npb24sIGZsYWdzKTsKLQotICAgICppbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfSU5WQUxJRDsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlOwotICAgIC8vIGhhbmRsZSBsZWdhY3kgcmVtb3RlIHN1Ym1peCBjYXNlIHdoZXJlIHRoZSBhZGRyZXNzIHdhcyBub3QgYWx3YXlzIHNwZWNpZmllZAotICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgoIiIpOwotICAgIGJvb2wgaXNTb3VuZFRyaWdnZXIgPSBmYWxzZTsKLSAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSA9IGF0dHItPnNvdXJjZTsKLSAgICBhdWRpb19zb3VyY2VfdCBoYWxJbnB1dFNvdXJjZTsKLSAgICBBdWRpb01peCAqcG9saWN5TWl4ID0gTlVMTDsKLQotICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCkgewotICAgICAgICBpbnB1dFNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUM7Ci0gICAgfQotICAgIGhhbElucHV0U291cmNlID0gaW5wdXRTb3VyY2U7Ci0KLSAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVggJiYKLSAgICAgICAgICAgIHN0cm5jbXAoYXR0ci0+dGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSA9PSAwKSB7Ci0gICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYOwotICAgICAgICBhZGRyZXNzID0gU3RyaW5nOChhdHRyLT50YWdzICsgc3RybGVuKCJhZGRyPSIpKTsKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IG1Qb2xpY3lNaXhlcy5pbmRleE9mS2V5KGFkZHJlc3MpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgbm8gcG9saWN5IGZvciBhZGRyZXNzICVzIiwgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUG9saWN5TWl4ZXNbaW5kZXhdLT5tTWl4Lm1NaXhUeXBlICE9IE1JWF9UWVBFX1BMQVlFUlMpIHsKLSAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSBiYWQgcG9saWN5IG1peCB0eXBlIGZvciBhZGRyZXNzICVzIiwgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIHBvbGljeU1peCA9ICZtUG9saWN5TWl4ZXNbaW5kZXhdLT5tTWl4OwotICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX01JWF9FWFRfUE9MSUNZX1JFUk9VVEU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UsICZwb2xpY3lNaXgpOwotICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgY291bGQgbm90IGZpbmQgZGV2aWNlIGZvciBzb3VyY2UgJWQiLCBpbnB1dFNvdXJjZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwb2xpY3lNaXggIT0gTlVMTCkgewotICAgICAgICAgICAgYWRkcmVzcyA9IHBvbGljeU1peC0+bVJlZ2lzdHJhdGlvbklkOwotICAgICAgICAgICAgaWYgKHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYW4gZXh0ZXJuYWwgcG9saWN5LCBidXQgdGhpcyBpbnB1dCBpcyBhdHRhY2hlZCB0byBhIG1peCBvZiByZWNvcmRlcnMsCi0gICAgICAgICAgICAgICAgLy8gbWVhbmluZyBpdCByZWNlaXZlcyBhdWRpbyBpbmplY3RlZCBpbnRvIHRoZSBmcmFtZXdvcmssIHNvIHRoZSByZWNvcmRlciBkb2Vzbid0Ci0gICAgICAgICAgICAgICAgLy8ga25vdyBhYm91dCBpdCBhbmQgaXMgdGhlcmVmb3JlIGNvbnNpZGVyZWQgImxlZ2FjeSIKLSAgICAgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0xFR0FDWTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3JkaW5nIGEgbWl4IG9mIHBsYXllcnMgZGVmaW5lZCBieSBhbiBleHRlcm5hbCBwb2xpY3ksIHdlJ3JlIHJlcm91dGluZyBmb3IKLSAgICAgICAgICAgICAgICAvLyBhbiBleHRlcm5hbCBwb2xpY3kKLSAgICAgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX01JWF9FWFRfUE9MSUNZX1JFUk9VVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKLSAgICAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTUlYX0NBUFRVUkU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0xFR0FDWTsKLSAgICAgICAgfQotICAgICAgICAvLyBhZGFwdCBjaGFubmVsIHNlbGVjdGlvbiB0byBpbnB1dCBzb3VyY2UKLSAgICAgICAgc3dpdGNoIChpbnB1dFNvdXJjZSkgewotICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTks6Ci0gICAgICAgICAgICBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfVVBMSU5LOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LOgotICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOSzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMOgotICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOSyB8IEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgKmlucHV0ID0gbVNvdW5kVHJpZ2dlclNlc3Npb25zLnZhbHVlRm9yKHNlc3Npb24pOwotICAgICAgICAgICAgICAgIGlzU291bmRUcmlnZ2VyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBmbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX0lOUFVUX0ZMQUdfSFdfSE9UV09SRCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlNvdW5kVHJpZ2dlciBjYXB0dXJlIG9uIHNlc3Npb24gJWQgaW5wdXQgJWQiLCBzZXNzaW9uLCAqaW5wdXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBoYWxJbnB1dFNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGdldElucHV0UHJvZmlsZShkZXZpY2UsIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotICAgIGlmIChwcm9maWxlID09IDApIHsKLSAgICAgICAgLy9yZXRyeSB3aXRob3V0IGZsYWdzCi0gICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgbG9nX2ZsYWdzID0gZmxhZ3M7Ci0gICAgICAgIGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FOwotICAgICAgICBwcm9maWxlID0gZ2V0SW5wdXRQcm9maWxlKGRldmljZSwgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotICAgICAgICBpZiAocHJvZmlsZSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgY291bGQgbm90IGZpbmQgcHJvZmlsZSBmb3IgZGV2aWNlIDB4JVgsIHNhbXBsaW5nUmF0ZSAldSwiCi0gICAgICAgICAgICAgICAgICAgICJmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAweCVYLCBmbGFncyAlI3giLAotICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgbG9nX2ZsYWdzKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJnZXRJbnB1dEZvckF0dHIoKTogSFcgbW9kdWxlICVzIG5vdCBvcGVuZWQiLCBwcm9maWxlLT5tTW9kdWxlLT5tTmFtZSk7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKLSAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBzYW1wbGluZ1JhdGU7Ci0gICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOwotICAgIGNvbmZpZy5mb3JtYXQgPSBmb3JtYXQ7Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbklucHV0KHByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbElucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotCi0gICAgLy8gb25seSBhY2NlcHQgaW5wdXQgd2l0aCB0aGUgZXhhY3QgcmVxdWVzdGVkIHNldCBvZiBwYXJhbWV0ZXJzCi0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCAqaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUgfHwKLSAgICAgICAgKHNhbXBsaW5nUmF0ZSAhPSBjb25maWcuc2FtcGxlX3JhdGUpIHx8Ci0gICAgICAgIChmb3JtYXQgIT0gY29uZmlnLmZvcm1hdCkgfHwKLSAgICAgICAgKGNoYW5uZWxNYXNrICE9IGNvbmZpZy5jaGFubmVsX21hc2spKSB7Ci0gICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSBmYWlsZWQgb3BlbmluZyBpbnB1dDogc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJWQsIGNoYW5uZWxNYXNrICV4IiwKLSAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOwotICAgICAgICBpZiAoKmlucHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dCgqaW5wdXQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG5ldyBBdWRpb0lucHV0RGVzY3JpcHRvcihwcm9maWxlKTsKLSAgICBpbnB1dERlc2MtPm1JbnB1dFNvdXJjZSA9IGlucHV0U291cmNlOwotICAgIGlucHV0RGVzYy0+bVJlZkNvdW50ID0gMDsKLSAgICBpbnB1dERlc2MtPm1PcGVuUmVmQ291bnQgPSAxOwotICAgIGlucHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKLSAgICBpbnB1dERlc2MtPm1Gb3JtYXQgPSBmb3JtYXQ7Ci0gICAgaW5wdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKLSAgICBpbnB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgaW5wdXREZXNjLT5tU2Vzc2lvbnMuYWRkKHNlc3Npb24pOwotICAgIGlucHV0RGVzYy0+bUlzU291bmRUcmlnZ2VyID0gaXNTb3VuZFRyaWdnZXI7Ci0gICAgaW5wdXREZXNjLT5tUG9saWN5TWl4ID0gcG9saWN5TWl4OwotCi0gICAgQUxPR1YoImdldElucHV0Rm9yQXR0cigpIHJldHVybnMgaW5wdXQgdHlwZSA9ICVkIiwgaW5wdXRUeXBlKTsKLQotICAgIGFkZElucHV0KCppbnB1dCwgaW5wdXREZXNjKTsKLSAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgQUxPR1YoInN0YXJ0SW5wdXQoKSBpbnB1dCAlZCIsIGlucHV0KTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdGFydElucHV0KCkgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7Ci0KLSAgICBpbmRleCA9IGlucHV0RGVzYy0+bVNlc3Npb25zLmluZGV4T2Yoc2Vzc2lvbik7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygic3RhcnRJbnB1dCgpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sIGlucHV0KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICAvLyB2aXJ0dWFsIGlucHV0IGRldmljZXMgYXJlIGNvbXBhdGlibGUgd2l0aCBvdGhlciBpbnB1dCBkZXZpY2VzCi0gICAgaWYgKCFpc1ZpcnR1YWxJbnB1dERldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7Ci0KLSAgICAgICAgLy8gZm9yIGEgbm9uLXZpcnR1YWwgaW5wdXQgZGV2aWNlLCBjaGVjayBpZiB0aGVyZSBpcyBhbm90aGVyIChub24tdmlydHVhbCkgYWN0aXZlIGlucHV0Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGFjdGl2ZUlucHV0ID0gZ2V0QWN0aXZlSW5wdXQoKTsKLSAgICAgICAgaWYgKGFjdGl2ZUlucHV0ICE9IDAgJiYgYWN0aXZlSW5wdXQgIT0gaW5wdXQpIHsKLQotICAgICAgICAgICAgLy8gSWYgdGhlIGFscmVhZHkgYWN0aXZlIGlucHV0IHVzZXMgQVVESU9fU09VUkNFX0hPVFdPUkQgdGhlbiBpdCBpcyBjbG9zZWQsCi0gICAgICAgICAgICAvLyBvdGhlcndpc2UgdGhlIGFjdGl2ZSBpbnB1dCBjb250aW51ZXMgYW5kIHRoZSBuZXcgaW5wdXQgY2Fubm90IGJlIHN0YXJ0ZWQuCi0gICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gYWN0aXZlRGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoYWN0aXZlSW5wdXQpOwotICAgICAgICAgICAgaWYgKGFjdGl2ZURlc2MtPm1JbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCVkKSBwcmVlbXB0aW5nIGxvdy1wcmlvcml0eSBpbnB1dCAlZCIsIGlucHV0LCBhY3RpdmVJbnB1dCk7Ci0gICAgICAgICAgICAgICAgc3RvcElucHV0KGFjdGl2ZUlucHV0LCBhY3RpdmVEZXNjLT5tU2Vzc2lvbnMuaXRlbUF0KDApKTsKLSAgICAgICAgICAgICAgICByZWxlYXNlSW5wdXQoYWN0aXZlSW5wdXQsIGFjdGl2ZURlc2MtPm1TZXNzaW9ucy5pdGVtQXQoMCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgic3RhcnRJbnB1dCglZCkgZmFpbGVkOiBvdGhlciBpbnB1dCAlZCBhbHJlYWR5IHN0YXJ0ZWQiLCBpbnB1dCwgYWN0aXZlSW5wdXQpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChpbnB1dERlc2MtPm1SZWZDb3VudCA9PSAwKSB7Ci0gICAgICAgIGlmIChhY3RpdmVJbnB1dHNDb3VudCgpID09IDApIHsKLSAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0LCBnZXROZXdJbnB1dERldmljZShpbnB1dCksIHRydWUgLyogZm9yY2UgKi8pOwotCi0gICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSByZW1vdGUgc3VibWl4IG91dHB1dCB3aGVuIGlucHV0IGlzIHN0YXJ0ZWQgaWYgbm90Ci0gICAgICAgIC8vIHVzZWQgYnkgYSBwb2xpY3kgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCi0gICAgICAgIC8vIEZvciByZW1vdGUgc3VibWl4IChhIHZpcnR1YWwgZGV2aWNlKSwgd2Ugb3BlbiBvbmx5IG9uZSBpbnB1dCBwZXIgY2FwdHVyZSByZXF1ZXN0LgotICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoaW5wdXREZXNjLT5tRGV2aWNlKSkgewotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7Ci0gICAgICAgICAgICBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBhZGRyZXNzID0gU3RyaW5nOCgiMCIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKLSAgICAgICAgICAgICAgICBhZGRyZXNzID0gaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tUmVnaXN0cmF0aW9uSWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYWRkcmVzcyAhPSAiIikgewotICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQUxPR1YoIkF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dCgpIGlucHV0IHNvdXJjZSA9ICVkIiwgaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UpOwotCi0gICAgaW5wdXREZXNjLT5tUmVmQ291bnQrKzsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgQUxPR1YoInN0b3BJbnB1dCgpIGlucHV0ICVkIiwgaW5wdXQpOwotICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotCi0gICAgaW5kZXggPSBpbnB1dERlc2MtPm1TZXNzaW9ucy5pbmRleE9mKHNlc3Npb24pOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sIGlucHV0KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBpZiAoaW5wdXREZXNjLT5tUmVmQ291bnQgPT0gMCkgewotICAgICAgICBBTE9HVygic3RvcElucHV0KCkgaW5wdXQgJWQgYWxyZWFkeSBzdG9wcGVkIiwgaW5wdXQpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgaW5wdXREZXNjLT5tUmVmQ291bnQtLTsKLSAgICBpZiAoaW5wdXREZXNjLT5tUmVmQ291bnQgPT0gMCkgewotCi0gICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgZGlzYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdG9wcGVkIGlmIG5vdAotICAgICAgICAvLyB1c2VkIGJ5IGEgcG9saWN5IG1peCBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUwotICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoaW5wdXREZXNjLT5tRGV2aWNlKSkgewotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7Ci0gICAgICAgICAgICBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBhZGRyZXNzID0gU3RyaW5nOCgiMCIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKLSAgICAgICAgICAgICAgICBhZGRyZXNzID0gaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tUmVnaXN0cmF0aW9uSWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYWRkcmVzcyAhPSAiIikgewotICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmVzZXRJbnB1dERldmljZShpbnB1dCk7Ci0KLSAgICAgICAgaWYgKGFjdGl2ZUlucHV0c0NvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpICVkIiwgaW5wdXQpOwotICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIHJlbGVhc2luZyB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgIEFMT0dfQVNTRVJUKGlucHV0RGVzYyAhPSAwKTsKLQotICAgIGluZGV4ID0gaW5wdXREZXNjLT5tU2Vzc2lvbnMuaW5kZXhPZihzZXNzaW9uKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJyZWxlYXNlSW5wdXQoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW5wdXREZXNjLT5tU2Vzc2lvbnMucmVtb3ZlKHNlc3Npb24pOwotICAgIGlmIChpbnB1dERlc2MtPm1PcGVuUmVmQ291bnQgPT0gMCkgewotICAgICAgICBBTE9HVygicmVsZWFzZUlucHV0KCkgaW52YWxpZCBvcGVuIHJlZiBjb3VudCAlZCIsIGlucHV0RGVzYy0+bU9wZW5SZWZDb3VudCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW5wdXREZXNjLT5tT3BlblJlZkNvdW50LS07Ci0gICAgaWYgKGlucHV0RGVzYy0+bU9wZW5SZWZDb3VudCA+IDApIHsKLSAgICAgICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpIGV4aXQgPiAwIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBjbG9zZUlucHV0KGlucHV0KTsKLSAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7Ci0gICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpIGV4aXQiKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsb3NlQWxsSW5wdXRzKCkgewotICAgIGJvb2wgcGF0Y2hSZW1vdmVkID0gZmFsc2U7Ci0KLSAgICBmb3Ioc2l6ZV90IGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgewotICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGlucHV0X2luZGV4KTsKLSAgICAgICAgc3NpemVfdCBwYXRjaF9pbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSk7Ci0gICAgICAgIGlmIChwYXRjaF9pbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQocGF0Y2hfaW5kZXgpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOwotICAgICAgICAgICAgbUF1ZGlvUGF0Y2hlcy5yZW1vdmVJdGVtc0F0KHBhdGNoX2luZGV4KTsKLSAgICAgICAgICAgIHBhdGNoUmVtb3ZlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQobUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOwotICAgIH0KLSAgICBtSW5wdXRzLmNsZWFyKCk7Ci0gICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLQotICAgIGlmIChwYXRjaFJlbW92ZWQpIHsKLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCkKLXsKLSAgICBBTE9HVigiaW5pdFN0cmVhbVZvbHVtZSgpIHN0cmVhbSAlZCwgbWluICVkLCBtYXggJWQiLCBzdHJlYW0gLCBpbmRleE1pbiwgaW5kZXhNYXgpOwotICAgIGlmIChpbmRleE1pbiA8IDAgfHwgaW5kZXhNaW4gPj0gaW5kZXhNYXgpIHsKLSAgICAgICAgQUxPR1coImluaXRTdHJlYW1Wb2x1bWUoKSBpbnZhbGlkIGluZGV4IGxpbWl0cyBmb3Igc3RyZWFtICVkLCBtaW4gJWQsIG1heCAlZCIsIHN0cmVhbSAsIGluZGV4TWluLCBpbmRleE1heCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNaW4gPSBpbmRleE1pbjsKLSAgICBtU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1heCA9IGluZGV4TWF4OwotICAgIC8vRklYTUU6IEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIHZvbHVtZSBmb2xsb3dzIEFVRElPX1NUUkVBTV9NVVNJQyBmb3Igbm93Ci0gICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fTVVTSUMpIHsKLSAgICAgICAgbVN0cmVhbXNbQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFldLm1JbmRleE1pbiA9IGluZGV4TWluOwotICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWV0ubUluZGV4TWF4ID0gaW5kZXhNYXg7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKLQotICAgIGlmICgoaW5kZXggPCBtU3RyZWFtc1tzdHJlYW1dLm1JbmRleE1pbikgfHwgKGluZGV4ID4gbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNYXgpKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgLy8gRm9yY2UgbWF4IHZvbHVtZSBpZiBzdHJlYW0gY2Fubm90IGJlIG11dGVkCi0gICAgaWYgKCFtU3RyZWFtc1tzdHJlYW1dLm1DYW5CZU11dGVkKSBpbmRleCA9IG1TdHJlYW1zW3N0cmVhbV0ubUluZGV4TWF4OwotCi0gICAgQUxPR1YoInNldFN0cmVhbVZvbHVtZUluZGV4KCkgc3RyZWFtICVkLCBkZXZpY2UgJTA0eCwgaW5kZXggJWQiLAotICAgICAgICAgIHN0cmVhbSwgZGV2aWNlLCBpbmRleCk7Ci0KLSAgICAvLyBpZiBkZXZpY2UgaXMgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUIHNldCBkZWZhdWx0IHZhbHVlIGFuZAotICAgIC8vIGNsZWFyIGFsbCBkZXZpY2Ugc3BlY2lmaWMgdmFsdWVzCi0gICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQpIHsKLSAgICAgICAgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhDdXIuY2xlYXIoKTsKLSAgICB9Ci0gICAgbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhDdXIuYWRkKGRldmljZSwgaW5kZXgpOwotCi0gICAgLy8gdXBkYXRlIHZvbHVtZSBvbiBhbGwgb3V0cHV0cyB3aG9zZSBjdXJyZW50IGRldmljZSBpcyBhbHNvIHNlbGVjdGVkIGJ5IHRoZSBzYW1lCi0gICAgLy8gc3RyYXRlZ3kgYXMgdGhlIGRldmljZSBzcGVjaWZpZWQgYnkgdGhlIGNhbGxlcgotICAgIGF1ZGlvX2RldmljZXNfdCBzdHJhdGVneURldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KGdldFN0cmF0ZWd5KHN0cmVhbSksIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0KLQotICAgIC8vRklYTUU6IEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIHZvbHVtZSBmb2xsb3dzIEFVRElPX1NUUkVBTV9NVVNJQyBmb3Igbm93Ci0gICAgYXVkaW9fZGV2aWNlc190IGFjY2Vzc2liaWxpdHlEZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9NVVNJQykgewotICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWV0ubUluZGV4Q3VyLmFkZChkZXZpY2UsIGluZGV4KTsKLSAgICAgICAgYWNjZXNzaWJpbGl0eURldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0FDQ0VTU0lCSUxJVFksIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0gICAgfQotICAgIGlmICgoZGV2aWNlICE9IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCkgJiYKLSAgICAgICAgICAgIChkZXZpY2UgJiAoc3RyYXRlZ3lEZXZpY2UgfCBhY2Nlc3NpYmlsaXR5RGV2aWNlKSkgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1ckRldmljZSA9Ci0gICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yVm9sdW1lKG1PdXRwdXRzLnZhbHVlQXQoaSktPmRldmljZSgpKTsKLSAgICAgICAgaWYgKChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUKSB8fCAoKGN1ckRldmljZSAmIHN0cmF0ZWd5RGV2aWNlKSAhPSAwKSkgewotICAgICAgICAgICAgc3RhdHVzX3Qgdm9sU3RhdHVzID0gY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLCBpbmRleCwgbU91dHB1dHMua2V5QXQoaSksIGN1ckRldmljZSk7Ci0gICAgICAgICAgICBpZiAodm9sU3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gdm9sU3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICgoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCkgfHwgKChjdXJEZXZpY2UgJiBhY2Nlc3NpYmlsaXR5RGV2aWNlKSAhPSAwKSkgewotICAgICAgICAgICAgc3RhdHVzX3Qgdm9sU3RhdHVzID0gY2hlY2tBbmRTZXRWb2x1bWUoQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgbU91dHB1dHMua2V5QXQoaSksIGN1ckRldmljZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQotewotICAgIGlmIChpbmRleCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIC8vIGlmIGRldmljZSBpcyBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQsIHJldHVybiB2b2x1bWUgZm9yIGRldmljZSBjb3JyZXNwb25kaW5nIHRvCi0gICAgLy8gdGhlIHN0cmF0ZWd5IHRoZSBzdHJlYW0gYmVsb25ncyB0by4KLSAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShnZXRTdHJhdGVneShzdHJlYW0pLCB0cnVlIC8qZnJvbUNhY2hlKi8pOwotICAgIH0KLSAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKLQotICAgICppbmRleCA9ICBtU3RyZWFtc1tzdHJlYW1dLmdldFZvbHVtZUluZGV4KGRldmljZSk7Ci0gICAgQUxPR1YoImdldFN0cmVhbVZvbHVtZUluZGV4KCkgc3RyZWFtICVkIGRldmljZSAlMDh4IGluZGV4ICVkIiwgc3RyZWFtLCBkZXZpY2UsICppbmRleCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNlbGVjdE91dHB1dEZvckVmZmVjdHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMpCi17Ci0gICAgLy8gc2VsZWN0IG9uZSBvdXRwdXQgYW1vbmcgc2V2ZXJhbCBzdWl0YWJsZSBmb3IgZ2xvYmFsIGVmZmVjdHMuCi0gICAgLy8gVGhlIHByaW9yaXR5IGlzIGFzIGZvbGxvd3M6Ci0gICAgLy8gMTogQW4gb2ZmbG9hZGVkIG91dHB1dC4gSWYgdGhlIGVmZmVjdCBlbmRzIHVwIG5vdCBiZWluZyBvZmZsb2FkYWJsZSwKLSAgICAvLyAgICBBdWRpb0ZsaW5nZXIgd2lsbCBpbnZhbGlkYXRlIHRoZSB0cmFjayBhbmQgdGhlIG9mZmxvYWRlZCBvdXRwdXQKLSAgICAvLyAgICB3aWxsIGJlIGNsb3NlZCBjYXVzaW5nIHRoZSBlZmZlY3QgdG8gYmUgbW92ZWQgdG8gYSBQQ00gb3V0cHV0LgotICAgIC8vIDI6IEEgZGVlcCBidWZmZXIgb3V0cHV0Ci0gICAgLy8gMzogdGhlIGZpcnN0IG91dHB1dCBpbiB0aGUgbGlzdAotCi0gICAgaWYgKG91dHB1dHMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0T2ZmbG9hZGVkID0gMDsKLSAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXREZWVwQnVmZmVyID0gMDsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXRzW2ldKTsKLSAgICAgICAgQUxPR1YoInNlbGVjdE91dHB1dEZvckVmZmVjdHMgb3V0cHV0c1slenVdIGZsYWdzICV4IiwgaSwgZGVzYy0+bUZsYWdzKTsKLSAgICAgICAgaWYgKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwKSB7Ci0gICAgICAgICAgICBvdXRwdXRPZmZsb2FkZWQgPSBvdXRwdXRzW2ldOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIpICE9IDApIHsKLSAgICAgICAgICAgIG91dHB1dERlZXBCdWZmZXIgPSBvdXRwdXRzW2ldOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQUxPR1YoInNlbGVjdE91dHB1dEZvckVmZmVjdHMgb3V0cHV0T2ZmbG9hZGVkICVkIG91dHB1dERlZXBCdWZmZXIgJWQiLAotICAgICAgICAgIG91dHB1dE9mZmxvYWRlZCwgb3V0cHV0RGVlcEJ1ZmZlcik7Ci0gICAgaWYgKG91dHB1dE9mZmxvYWRlZCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBvdXRwdXRPZmZsb2FkZWQ7Ci0gICAgfQotICAgIGlmIChvdXRwdXREZWVwQnVmZmVyICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG91dHB1dERlZXBCdWZmZXI7Ci0gICAgfQotCi0gICAgcmV0dXJuIG91dHB1dHNbMF07Ci19Ci0KLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpCi17Ci0gICAgLy8gYXBwbHkgc2ltcGxlIHJ1bGUgd2hlcmUgZ2xvYmFsIGVmZmVjdHMgYXJlIGF0dGFjaGVkIHRvIHRoZSBzYW1lIG91dHB1dCBhcyBNVVNJQyBzdHJlYW1zCi0KLSAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koQVVESU9fU1RSRUFNX01VU0lDKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZHN0T3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBtT3V0cHV0cyk7Ci0KLSAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXRGb3JFZmZlY3RzKGRzdE91dHB1dHMpOwotICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JFZmZlY3QoKSBnb3Qgb3V0cHV0ICVkIGZvciBmeCAlcyBmbGFncyAleCIsCi0gICAgICAgICAgb3V0cHV0LCAoZGVzYyA9PSBOVUxMKSA/ICJ1bnNwZWNpZmllZCIgOiBkZXNjLT5uYW1lLCAgKGRlc2MgPT0gTlVMTCkgPyAwIDogZGVzYy0+ZmxhZ3MpOwotCi0gICAgcmV0dXJuIG91dHB1dDsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpCi17Ci0gICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkoaW8pOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW8pOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICBBTE9HVygicmVnaXN0ZXJFZmZlY3QoKSB1bmtub3duIGlvICVkIiwgaW8pOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgKyBkZXNjLT5tZW1vcnlVc2FnZSA+IGdldE1heEVmZmVjdHNNZW1vcnkoKSkgewotICAgICAgICBBTE9HVygicmVnaXN0ZXJFZmZlY3QoKSBtZW1vcnkgbGltaXQgZXhjZWVkZWQgZm9yIEZ4ICVzLCBNZW1vcnkgJWQgS0IiLAotICAgICAgICAgICAgICAgIGRlc2MtPm5hbWUsIGRlc2MtPm1lbW9yeVVzYWdlKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBtVG90YWxFZmZlY3RzTWVtb3J5ICs9IGRlc2MtPm1lbW9yeVVzYWdlOwotICAgIEFMT0dWKCJyZWdpc3RlckVmZmVjdCgpIGVmZmVjdCAlcywgaW8gJWQsIHN0cmF0ZWd5ICVkIHNlc3Npb24gJWQgaWQgJWQiLAotICAgICAgICAgICAgZGVzYy0+bmFtZSwgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7Ci0gICAgQUxPR1YoInJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5ICVkLCB0b3RhbCBtZW1vcnkgJWQiLCBkZXNjLT5tZW1vcnlVc2FnZSwgbVRvdGFsRWZmZWN0c01lbW9yeSk7Ci0KLSAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gbmV3IEVmZmVjdERlc2NyaXB0b3IoKTsKLSAgICBtZW1jcHkgKCZlZmZlY3REZXNjLT5tRGVzYywgZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKLSAgICBlZmZlY3REZXNjLT5tSW8gPSBpbzsKLSAgICBlZmZlY3REZXNjLT5tU3RyYXRlZ3kgPSAocm91dGluZ19zdHJhdGVneSlzdHJhdGVneTsKLSAgICBlZmZlY3REZXNjLT5tU2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgZWZmZWN0RGVzYy0+bUVuYWJsZWQgPSBmYWxzZTsKLQotICAgIG1FZmZlY3RzLmFkZChpZCwgZWZmZWN0RGVzYyk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCi17Ci0gICAgc3NpemVfdCBpbmRleCA9IG1FZmZlY3RzLmluZGV4T2ZLZXkoaWQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInVucmVnaXN0ZXJFZmZlY3QoKSB1bmtub3duIGVmZmVjdCBJRCAlZCIsIGlkKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSBtRWZmZWN0cy52YWx1ZUF0KGluZGV4KTsKLQotICAgIHNldEVmZmVjdEVuYWJsZWQoZWZmZWN0RGVzYywgZmFsc2UpOwotCi0gICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgPCBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSkgewotICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIG1lbW9yeSAlZCB0b28gYmlnIGZvciB0b3RhbCAlZCIsCi0gICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOwotICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSA9IG1Ub3RhbEVmZmVjdHNNZW1vcnk7Ci0gICAgfQotICAgIG1Ub3RhbEVmZmVjdHNNZW1vcnkgLT0gZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2U7Ci0gICAgQUxPR1YoInVucmVnaXN0ZXJFZmZlY3QoKSBlZmZlY3QgJXMsIElEICVkLCBtZW1vcnkgJWQgdG90YWwgbWVtb3J5ICVkIiwKLSAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLm5hbWUsIGlkLCBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSwgbVRvdGFsRWZmZWN0c01lbW9yeSk7Ci0KLSAgICBtRWZmZWN0cy5yZW1vdmVJdGVtKGlkKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKQotewotICAgIHNzaXplX3QgaW5kZXggPSBtRWZmZWN0cy5pbmRleE9mS2V5KGlkKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJ1bnJlZ2lzdGVyRWZmZWN0KCkgdW5rbm93biBlZmZlY3QgSUQgJWQiLCBpZCk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICByZXR1cm4gc2V0RWZmZWN0RW5hYmxlZChtRWZmZWN0cy52YWx1ZUF0KGluZGV4KSwgZW5hYmxlZCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiYgZWZmZWN0RGVzYywgYm9vbCBlbmFibGVkKQotewotICAgIGlmIChlbmFibGVkID09IGVmZmVjdERlc2MtPm1FbmFibGVkKSB7Ci0gICAgICAgIEFMT0dWKCJzZXRFZmZlY3RFbmFibGVkKCVzKSBlZmZlY3QgYWxyZWFkeSAlcyIsCi0gICAgICAgICAgICAgZW5hYmxlZD8idHJ1ZSI6ImZhbHNlIiwgZW5hYmxlZD8iZW5hYmxlZCI6ImRpc2FibGVkIik7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICBpZiAobVRvdGFsRWZmZWN0c0NwdUxvYWQgKyBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkID4gZ2V0TWF4RWZmZWN0c0NwdUxvYWQoKSkgewotICAgICAgICAgICAgQUxPR1coInNldEVmZmVjdEVuYWJsZWQodHJ1ZSkgQ1BVIExvYWQgbGltaXQgZXhjZWVkZWQgZm9yIEZ4ICVzLCBDUFUgJWYgTUlQUyIsCi0gICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLm5hbWUsIChmbG9hdCllZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkLzEwKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgICAgICBtVG90YWxFZmZlY3RzQ3B1TG9hZCArPSBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkOwotICAgICAgICBBTE9HVigic2V0RWZmZWN0RW5hYmxlZCh0cnVlKSB0b3RhbCBDUFUgJWQiLCBtVG90YWxFZmZlY3RzQ3B1TG9hZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1Ub3RhbEVmZmVjdHNDcHVMb2FkIDwgZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZCkgewotICAgICAgICAgICAgQUxPR1coInNldEVmZmVjdEVuYWJsZWQoZmFsc2UpIENQVSBsb2FkICVkIHRvbyBoaWdoIGZvciB0b3RhbCAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLmNwdUxvYWQsIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKTsKLSAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLmNwdUxvYWQgPSBtVG90YWxFZmZlY3RzQ3B1TG9hZDsKLSAgICAgICAgfQotICAgICAgICBtVG90YWxFZmZlY3RzQ3B1TG9hZCAtPSBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkOwotICAgICAgICBBTE9HVigic2V0RWZmZWN0RW5hYmxlZChmYWxzZSkgdG90YWwgQ1BVICVkIiwgbVRvdGFsRWZmZWN0c0NwdUxvYWQpOwotICAgIH0KLSAgICBlZmZlY3REZXNjLT5tRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKQotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IG1FZmZlY3RzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChlZmZlY3REZXNjLT5tRW5hYmxlZCAmJiAoZWZmZWN0RGVzYy0+bVN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSAmJgotICAgICAgICAgICAgICAgICgoZWZmZWN0RGVzYy0+bURlc2MuZmxhZ3MgJiBFRkZFQ1RfRkxBR19PRkZMT0FEX1NVUFBPUlRFRCkgPT0gMCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCJpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QgJXMgZW5hYmxlZCBvbiBzZXNzaW9uICVkIiwKLSAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLm5hbWUsIGVmZmVjdERlc2MtPm1TZXNzaW9uKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKLXsKLSAgICBuc2Vjc190IHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcywgc3lzVGltZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Ci17Ci0gICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKCgob3V0cHV0RGVzYy0+ZGV2aWNlKCkgJiBBUE1fQVVESU9fT1VUX0RFVklDRV9SRU1PVEVfQUxMKSAhPSAwKSAmJgotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7Ci0gICAgICAgICAgICAvLyBkbyBub3QgY29uc2lkZXIgcmUgcm91dGluZyAod2hlbiB0aGUgb3V0cHV0IGlzIGdvaW5nIHRvIGEgZHluYW1pYyBwb2xpY3kpCi0gICAgICAgICAgICAvLyBhcyAicmVtb3RlIHBsYXliYWNrIgotICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1Qb2xpY3lNaXggPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dERlc2NyaXB0b3IgPSBtSW5wdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChpbnB1dERlc2NyaXB0b3ItPm1SZWZDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXREZXNjcmlwdG9yLT5tSW5wdXRTb3VyY2UgPT0gKGludClzb3VyY2UpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIEFVRElPX1NPVVJDRV9IT1RXT1JEIGlzIGVxdWl2YWxlbnQgdG8gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIG9ubHkgaWYgaXQKLSAgICAgICAgLy8gY29ycmVzcG9uZHMgdG8gYW4gYWN0aXZlIGNhcHR1cmUgdHJpZ2dlcmVkIGJ5IGEgaGFyZHdhcmUgaG90d29yZCByZWNvZ25pdGlvbgotICAgICAgICBpZiAoKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pICYmCi0gICAgICAgICAgICAgICAgIChpbnB1dERlc2NyaXB0b3ItPm1JbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FOiB3ZSBzaG91bGQgbm90IGFzc3VtZSB0aGF0IHRoZSBmaXJzdCBzZXNzaW9uIGlzIHRoZSBhY3RpdmUgb25lIGFuZCBrZWVwCi0gICAgICAgICAgICAvLyBhY3Rpdml0eSBjb3VudCBwZXIgc2Vzc2lvbi4gU2FtZSBpbiBzdGFydElucHV0KCkuCi0gICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVNvdW5kVHJpZ2dlclNlc3Npb25zLmluZGV4T2ZLZXkoaW5wdXREZXNjcmlwdG9yLT5tU2Vzc2lvbnMuaXRlbUF0KDApKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBSZWdpc3RlciBhIGxpc3Qgb2YgY3VzdG9tIG1peGVzIHdpdGggdGhlaXIgYXR0cmlidXRlcyBhbmQgZm9ybWF0LgotLy8gV2hlbiBhIG1peCBpcyByZWdpc3RlcmVkLCBjb3JyZXNwb25kaW5nIGlucHV0IGFuZCBvdXRwdXQgcHJvZmlsZXMgYXJlCi0vLyBhZGRlZCB0byB0aGUgcmVtb3RlIHN1Ym1peCBodyBtb2R1bGUuIFRoZSBwcm9maWxlIGNvbnRhaW5zIG9ubHkgdGhlCi0vLyBwYXJhbWV0ZXJzIChzYW1wbGluZyByYXRlLCBmb3JtYXQuLi4pIHNwZWNpZmllZCBieSB0aGUgbWl4LgotLy8gVGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQgcmVtb3RlIHN1Ym1peCBkZXZpY2UgaXMgYWxzbyBjb25uZWN0ZWQuCi0vLwotLy8gV2hlbiBhIHJlbW90ZSBzdWJtaXggZGV2aWNlIGlzIGNvbm5lY3RlZCwgdGhlIGFkZHJlc3MgaXMgY2hlY2tlZCB0byBzZWxlY3QgdGhlCi0vLyBhcHByb3ByaWF0ZSBwcm9maWxlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBpbnB1dCBvciBvdXRwdXQgc3RyZWFtIGlzIG9wZW5lZC4KLS8vCi0vLyBXaGVuIGNhcHR1cmUgc3RhcnRzLCBnZXRJbnB1dEZvckF0dHIoKSB3aWxsOgotLy8gIC0gMSBsb29rIGZvciBhIG1peCBtYXRjaGluZyB0aGUgYWRkcmVzcyBwYXNzZWQgaW4gYXR0cmlidHV0ZXMgdGFncyBpZiBhbnkKLS8vICAtIDIgaWYgbm9uZSBmb3VuZCwgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoKSB3aWxsOgotLy8gICAgIC0gMi4xIGxvb2sgZm9yIGEgbWl4IG1hdGNoaW5nIHRoZSBhdHRyaWJ1dGVzIHNvdXJjZQotLy8gICAgIC0gMi4yIGlmIG5vbmUgZm91bmQsIGRlZmF1bHQgdG8gZGV2aWNlIHNlbGVjdGlvbiBieSBwb2xpY3kgcnVsZXMKLS8vIEF0IHRoaXMgdGltZSwgdGhlIGNvcnJlc3BvbmRpbmcgb3V0cHV0IHJlbW90ZSBzdWJtaXggZGV2aWNlIGlzIGFsc28gY29ubmVjdGVkCi0vLyBhbmQgYWN0aXZlIHBsYXliYWNrIHVzZSBjYXNlcyBjYW4gYmUgdHJhbnNmZXJyZWQgdG8gdGhpcyBtaXggaWYgbmVlZGVkIHdoZW4gcmVjb25uZWN0aW5nCi0vLyBhZnRlciBBdWRpb1RyYWNrcyBhcmUgaW52YWxpZGF0ZWQKLS8vCi0vLyBXaGVuIHBsYXliYWNrIHN0YXJ0cywgZ2V0T3V0cHV0Rm9yQXR0cigpIHdpbGw6Ci0vLyAgLSAxIGxvb2sgZm9yIGEgbWl4IG1hdGNoaW5nIHRoZSBhZGRyZXNzIHBhc3NlZCBpbiBhdHRyaWJ0dXRlcyB0YWdzIGlmIGFueQotLy8gIC0gMiBpZiBub25lIGZvdW5kLCBsb29rIGZvciBhIG1peCBtYXRjaGluZyB0aGUgYXR0cmlidXRlcyB1c2FnZQotLy8gIC0gMyBpZiBub25lIGZvdW5kLCBkZWZhdWx0IHRvIGRldmljZSBhbmQgb3V0cHV0IHNlbGVjdGlvbiBieSBwb2xpY3kgcnVsZXMuCi0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVnaXN0ZXJQb2xpY3lNaXhlcyhWZWN0b3I8QXVkaW9NaXg+IG1peGVzKQotewotICAgIHNwPEh3TW9kdWxlPiBtb2R1bGU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1JFTU9URV9TVUJNSVgsIG1Id01vZHVsZXNbaV0tPm1OYW1lKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgbUh3TW9kdWxlc1tpXS0+bUhhbmRsZSAhPSAwKSB7Ci0gICAgICAgICAgICBtb2R1bGUgPSBtSHdNb2R1bGVzW2ldOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobW9kdWxlID09IDApIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIEFMT0dWKCJyZWdpc3RlclBvbGljeU1peGVzKCkgbnVtIG1peGVzICVkIiwgbWl4ZXMuc2l6ZSgpKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWl4ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gbWl4ZXNbaV0ubVJlZ2lzdHJhdGlvbklkOwotICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVBvbGljeU1peGVzLmluZGV4T2ZLZXkoYWRkcmVzcyk7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgicmVnaXN0ZXJQb2xpY3lNaXhlcygpOiBtaXggZm9yIGFkZHJlc3MgJXMgYWxyZWFkeSByZWdpc3RlcmVkIiwgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBhdWRpb19jb25maWdfdCBvdXRwdXRDb25maWcgPSBtaXhlc1tpXS5tRm9ybWF0OwotICAgICAgICBhdWRpb19jb25maWdfdCBpbnB1dENvbmZpZyA9IG1peGVzW2ldLm1Gb3JtYXQ7Ci0gICAgICAgIC8vIE5PVEU6IGF1ZGlvIGZsaW5nZXIgbWl4ZXIgZG9lcyBub3Qgc3VwcG9ydCBtb25vIG91dHB1dDogY29uZmlndXJlIHJlbW90ZSBzdWJtaXggSEFMIGluCi0gICAgICAgIC8vIHN0ZXJlbyBhbmQgbGV0IGF1ZGlvIGZsaW5nZXIgZG8gdGhlIGNoYW5uZWwgY29udmVyc2lvbiBpZiBuZWVkZWQuCi0gICAgICAgIG91dHB1dENvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgICAgIGlucHV0Q29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPOwotICAgICAgICBtb2R1bGUtPmFkZE91dHB1dFByb2ZpbGUoYWRkcmVzcywgJm91dHB1dENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwgYWRkcmVzcyk7Ci0gICAgICAgIG1vZHVsZS0+YWRkSW5wdXRQcm9maWxlKGFkZHJlc3MsICZpbnB1dENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLCBhZGRyZXNzKTsKLSAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peCA9IG5ldyBBdWRpb1BvbGljeU1peCgpOwotICAgICAgICBwb2xpY3lNaXgtPm1NaXggPSBtaXhlc1tpXTsKLSAgICAgICAgbVBvbGljeU1peGVzLmFkZChhZGRyZXNzLCBwb2xpY3lNaXgpOwotICAgICAgICBpZiAobWl4ZXNbaV0ubU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgewotICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6dW5yZWdpc3RlclBvbGljeU1peGVzKFZlY3RvcjxBdWRpb01peD4gbWl4ZXMpCi17Ci0gICAgc3A8SHdNb2R1bGU+IG1vZHVsZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUkVNT1RFX1NVQk1JWCwgbUh3TW9kdWxlc1tpXS0+bU5hbWUpID09IDAgJiYKLSAgICAgICAgICAgICAgICBtSHdNb2R1bGVzW2ldLT5tSGFuZGxlICE9IDApIHsKLSAgICAgICAgICAgIG1vZHVsZSA9IG1Id01vZHVsZXNbaV07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtb2R1bGUgPT0gMCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgQUxPR1YoInVucmVnaXN0ZXJQb2xpY3lNaXhlcygpIG51bSBtaXhlcyAlZCIsIG1peGVzLnNpemUoKSk7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1peGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG1peGVzW2ldLm1SZWdpc3RyYXRpb25JZDsKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IG1Qb2xpY3lNaXhlcy5pbmRleE9mS2V5KGFkZHJlc3MpOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgidW5yZWdpc3RlclBvbGljeU1peGVzKCk6IG1peCBmb3IgYWRkcmVzcyAlcyBub3QgcmVnaXN0ZXJlZCIsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBtUG9saWN5TWl4ZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0KLSAgICAgICAgaWYgKGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwgYWRkcmVzcy5zdHJpbmcoKSkgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKQotICAgICAgICB7Ci0gICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLCBhZGRyZXNzLnN0cmluZygpKSA9PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBtb2R1bGUtPnJlbW92ZU91dHB1dFByb2ZpbGUoYWRkcmVzcyk7Ci0gICAgICAgIG1vZHVsZS0+cmVtb3ZlSW5wdXRQcm9maWxlKGFkZHJlc3MpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkdW1wKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuQXVkaW9Qb2xpY3lNYW5hZ2VyIER1bXA6ICVwXG4iLCB0aGlzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgUHJpbWFyeSBPdXRwdXQ6ICVkXG4iLCBtUHJpbWFyeU91dHB1dCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBQaG9uZSBzdGF0ZTogJWRcbiIsIG1QaG9uZVN0YXRlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgY29tbXVuaWNhdGlvbnMgJWRcbiIsCi0gICAgICAgICAgICAgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0pOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBtZWRpYSAlZFxuIiwgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgcmVjb3JkICVkXG4iLCBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgZG9jayAlZFxuIiwgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DS10pOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBzeXN0ZW0gJWRcbiIsIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0pOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBoZG1pIHN5c3RlbSBhdWRpbyAlZFxuIiwKLSAgICAgICAgICAgIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPXSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlczpcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT5kdW1wKGZkLCAyLCBpKTsKLSAgICB9Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG4gQXZhaWxhYmxlIGlucHV0IGRldmljZXM6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPmR1bXAoZmQsIDIsIGkpOwotICAgIH0KLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuSFcgTW9kdWxlcyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIEhXIE1vZHVsZSAlenU6XG4iLCBpICsgMSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgbUh3TW9kdWxlc1tpXS0+ZHVtcChmZCk7Ci0gICAgfQotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5PdXRwdXRzIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIE91dHB1dCAlZCBkdW1wOlxuIiwgbU91dHB1dHMua2V5QXQoaSkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIG1PdXRwdXRzLnZhbHVlQXQoaSktPmR1bXAoZmQpOwotICAgIH0KLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuSW5wdXRzIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gSW5wdXQgJWQgZHVtcDpcbiIsIG1JbnB1dHMua2V5QXQoaSkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIG1JbnB1dHMudmFsdWVBdChpKS0+ZHVtcChmZCk7Ci0gICAgfQotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5TdHJlYW1zIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAotICAgICAgICAgICAgICIgU3RyZWFtICBDYW4gYmUgbXV0ZWQgIEluZGV4IE1pbiAgSW5kZXggTWF4ICBJbmRleCBDdXIgW2RldmljZSA6IGluZGV4XS4uLlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlMDJ6dSAgICAgICIsIGkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIG1TdHJlYW1zW2ldLmR1bXAoZmQpOwotICAgIH0KLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuVG90YWwgRWZmZWN0cyBDUFU6ICVmIE1JUFMsIFRvdGFsIEVmZmVjdHMgbWVtb3J5OiAlZCBLQlxuIiwKLSAgICAgICAgICAgIChmbG9hdCltVG90YWxFZmZlY3RzQ3B1TG9hZC8xMCwgbVRvdGFsRWZmZWN0c01lbW9yeSk7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUmVnaXN0ZXJlZCBlZmZlY3RzOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBFZmZlY3QgJWQgZHVtcDpcbiIsIG1FZmZlY3RzLmtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICBtRWZmZWN0cy52YWx1ZUF0KGkpLT5kdW1wKGZkKTsKLSAgICB9Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkF1ZGlvIFBhdGNoZXM6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9QYXRjaGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1BdWRpb1BhdGNoZXNbaV0tPmR1bXAoZmQsIDIsIGkpOwotICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gVGhpcyBmdW5jdGlvbiBjaGVja3MgZm9yIHRoZSBwYXJhbWV0ZXJzIHdoaWNoIGNhbiBiZSBvZmZsb2FkZWQuCi0vLyBUaGlzIGNhbiBiZSBlbmhhbmNlZCBkZXBlbmRpbmcgb24gdGhlIGNhcGFiaWxpdHkgb2YgdGhlIERTUCBhbmQgcG9saWN5Ci0vLyBvZiB0aGUgc3lzdGVtLgotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgb2ZmbG9hZEluZm8pCi17Ci0gICAgQUxPR1YoImlzT2ZmbG9hZFN1cHBvcnRlZDogU1I9JXUsIENNPTB4JXgsIEZvcm1hdD0weCV4LCBTdHJlYW1UeXBlPSVkLCIKLSAgICAgIiBCaXRSYXRlPSV1LCBkdXJhdGlvbj0lIiBQUklkNjQgIiB1cywgaGFzX3ZpZGVvPSVkIiwKLSAgICAgb2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUsIG9mZmxvYWRJbmZvLmNoYW5uZWxfbWFzaywKLSAgICAgb2ZmbG9hZEluZm8uZm9ybWF0LAotICAgICBvZmZsb2FkSW5mby5zdHJlYW1fdHlwZSwgb2ZmbG9hZEluZm8uYml0X3JhdGUsIG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzLAotICAgICBvZmZsb2FkSW5mby5oYXNfdmlkZW8pOwotCi0gICAgLy8gQ2hlY2sgaWYgb2ZmbG9hZCBoYXMgYmVlbiBkaXNhYmxlZAotICAgIGNoYXIgcHJvcFZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgaWYgKHByb3BlcnR5X2dldCgiYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIiwgcHJvcFZhbHVlLCAiMCIpKSB7Ci0gICAgICAgIGlmIChhdG9pKHByb3BWYWx1ZSkgIT0gMCkgewotICAgICAgICAgICAgQUxPR1YoIm9mZmxvYWQgZGlzYWJsZWQgYnkgYXVkaW8ub2ZmbG9hZC5kaXNhYmxlPSVzIiwgcHJvcFZhbHVlICk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDaGVjayBpZiBzdHJlYW0gdHlwZSBpcyBtdXNpYywgdGhlbiBvbmx5IGFsbG93IG9mZmxvYWQgYXMgb2Ygbm93LgotICAgIGlmIChvZmZsb2FkSW5mby5zdHJlYW1fdHlwZSAhPSBBVURJT19TVFJFQU1fTVVTSUMpCi0gICAgewotICAgICAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkOiBzdHJlYW1fdHlwZSAhPSBNVVNJQywgcmV0dXJuaW5nIGZhbHNlIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvL1RPRE86IGVuYWJsZSBhdWRpbyBvZmZsb2FkaW5nIHdpdGggdmlkZW8gd2hlbiByZWFkeQotICAgIGlmIChvZmZsb2FkSW5mby5oYXNfdmlkZW8pCi0gICAgewotICAgICAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkOiBoYXNfdmlkZW8gPT0gdHJ1ZSwgcmV0dXJuaW5nIGZhbHNlIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvL0lmIGR1cmF0aW9uIGlzIGxlc3MgdGhhbiBtaW5pbXVtIHZhbHVlIGRlZmluZWQgaW4gcHJvcGVydHksIHJldHVybiBmYWxzZQotICAgIGlmIChwcm9wZXJ0eV9nZXQoImF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MiLCBwcm9wVmFsdWUsIE5VTEwpKSB7Ci0gICAgICAgIGlmIChvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA8IChhdG9pKHByb3BWYWx1ZSkgKiAxMDAwMDAwICkpIHsKLSAgICAgICAgICAgIEFMT0dWKCJPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MoPSVzKSIsIHByb3BWYWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzIDwgT0ZGTE9BRF9ERUZBVUxUX01JTl9EVVJBVElPTl9TRUNTICogMTAwMDAwMCkgewotICAgICAgICBBTE9HVigiT2ZmbG9hZCBkZW5pZWQgYnkgZHVyYXRpb24gPCBkZWZhdWx0IG1pbig9JXUpIiwgT0ZGTE9BRF9ERUZBVUxUX01JTl9EVVJBVElPTl9TRUNTKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIERvIG5vdCBhbGxvdyBvZmZsb2FkaW5nIGlmIG9uZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0IGlzIGVuYWJsZWQuIFRoaXMgcHJldmVudHMgZnJvbQotICAgIC8vIGNyZWF0aW5nIGFuIG9mZmxvYWRlZCB0cmFjayBhbmQgdGVhcmluZyBpdCBkb3duIGltbWVkaWF0ZWx5IGFmdGVyIHN0YXJ0IHdoZW4gYXVkaW9mbGluZ2VyCi0gICAgLy8gZGV0ZWN0cyB0aGVyZSBpcyBhbiBhY3RpdmUgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdC4KLSAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGNoZWNrIHRoZSBhdWRpbyBzZXNzaW9uIGhlcmUgYnV0IHdlIGRvIG5vdCBoYXZlIGl0IGluIHRoaXMgY29udGV4dC4KLSAgICAvLyBUaGlzIG1heSBwcmV2ZW50IG9mZmxvYWRpbmcgaW4gcmFyZSBzaXR1YXRpb25zIHdoZXJlIGVmZmVjdHMgYXJlIGxlZnQgYWN0aXZlIGJ5IGFwcHMKLSAgICAvLyBpbiB0aGUgYmFja2dyb3VuZC4KLSAgICBpZiAoaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gU2VlIGlmIHRoZXJlIGlzIGEgcHJvZmlsZSB0byBzdXBwb3J0IHRoaXMuCi0gICAgLy8gQVVESU9fREVWSUNFX05PTkUKLSAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KEFVRElPX0RFVklDRV9OT05FIC8qaWdub3JlIGRldmljZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uY2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKTsKLSAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkKCkgcHJvZmlsZSAlc2ZvdW5kIiwgcHJvZmlsZSAhPSAwID8gIiIgOiAiTk9UICIpOwotICAgIHJldHVybiAocHJvZmlsZSAhPSAwKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pCi17Ci0gICAgaWYgKG51bV9wb3J0cyA9PSBOVUxMIHx8ICgqbnVtX3BvcnRzICE9IDAgJiYgcG9ydHMgPT0gTlVMTCkgfHwKLSAgICAgICAgICAgIGdlbmVyYXRpb24gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBBTE9HVigibGlzdEF1ZGlvUG9ydHMoKSByb2xlICVkIHR5cGUgJWQgbnVtX3BvcnRzICVkIHBvcnRzICVwIiwgcm9sZSwgdHlwZSwgKm51bV9wb3J0cywgcG9ydHMpOwotICAgIGlmIChwb3J0cyA9PSBOVUxMKSB7Ci0gICAgICAgICpudW1fcG9ydHMgPSAwOwotICAgIH0KLQotICAgIHNpemVfdCBwb3J0c1dyaXR0ZW4gPSAwOwotICAgIHNpemVfdCBwb3J0c01heCA9ICpudW1fcG9ydHM7Ci0gICAgKm51bV9wb3J0cyA9IDA7Ci0gICAgaWYgKHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX05PTkUgfHwgdHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgIGlmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LIHx8IHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX05PTkUpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOwotICAgICAgICAgICAgICAgICAgICBpICA8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKSAmJiBwb3J0c1dyaXR0ZW4gPCBwb3J0c01heDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPnRvQXVkaW9Qb3J0KCZwb3J0c1twb3J0c1dyaXR0ZW4rK10pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKm51bV9wb3J0cyArPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5zaXplKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSB8fCByb2xlID09IEFVRElPX1BPUlRfUk9MRV9OT05FKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaSAgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKSAmJiBwb3J0c1dyaXR0ZW4gPCBwb3J0c01heDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+dG9BdWRpb1BvcnQoJnBvcnRzW3BvcnRzV3JpdHRlbisrXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqbnVtX3BvcnRzICs9IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICh0eXBlID09IEFVRElPX1BPUlRfVFlQRV9OT05FIHx8IHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgewotICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSyB8fCByb2xlID09IEFVRElPX1BPUlRfUk9MRV9OT05FKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpICYmIHBvcnRzV3JpdHRlbiA8IHBvcnRzTWF4OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtSW5wdXRzW2ldLT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpudW1fcG9ydHMgKz0gbUlucHV0cy5zaXplKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSB8fCByb2xlID09IEFVRElPX1BPUlRfUk9MRV9OT05FKSB7Ci0gICAgICAgICAgICBzaXplX3QgbnVtT3V0cHV0cyA9IDA7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtT3V0cHV0c1tpXS0+aXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbnVtT3V0cHV0cysrOwotICAgICAgICAgICAgICAgICAgICBpZiAocG9ydHNXcml0dGVuIDwgcG9ydHNNYXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzW2ldLT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpudW1fcG9ydHMgKz0gbnVtT3V0cHV0czsKLSAgICAgICAgfQotICAgIH0KLSAgICAqZ2VuZXJhdGlvbiA9IGN1ckF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLSAgICBBTE9HVigibGlzdEF1ZGlvUG9ydHMoKSBnb3QgJXp1IHBvcnRzIG5lZWRlZCAlZCIsIHBvcnRzV3JpdHRlbiwgKm51bV9wb3J0cyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCBfX3VudXNlZCkKLXsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXNwPEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZyb21JZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3QKLXsKLSAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBOVUxMOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5tSWQgPT0gaWQpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBvdXRwdXREZXNjOwotfQotCi1zcDxBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvSW5wdXREZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0RnJvbUlkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdAotewotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBOVUxMOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChpbnB1dERlc2MtPm1JZCA9PSBpZCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGlucHV0RGVzYzsKLX0KLQotc3AgPEF1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TW9kdWxlRm9yRGV2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAotewotICAgIHNwIDxId01vZHVsZT4gbW9kdWxlOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSGFuZGxlID09IDApIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXNbal0tPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiBkZXZpY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Id01vZHVsZXNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlc1tqXS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUh3TW9kdWxlc1tpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1vZHVsZTsKLX0KLQotc3AgPEF1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TW9kdWxlRnJvbU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QKLXsKLSAgICBzcCA8SHdNb2R1bGU+IG1vZHVsZTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChzdHJjbXAobUh3TW9kdWxlc1tpXS0+bU5hbWUsIG5hbWUpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBtSHdNb2R1bGVzW2ldOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtb2R1bGU7Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmF2YWlsYWJsZVByaW1hcnlPdXRwdXREZXZpY2VzKCkKLXsKLSAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtUHJpbWFyeU91dHB1dCk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBvdXRwdXREZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKTsKLSAgICByZXR1cm4gZGV2aWNlcyAmIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKQotewotICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBwcmltYXJ5SGFuZGxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpLT5tUHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IEFVRElPX0RFVklDRV9OT05FOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bU1vZHVsZS0+bUhhbmRsZSA9PSBwcmltYXJ5SGFuZGxlKSB7Ci0gICAgICAgICAgICBkZXZpY2VzIHw9IG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPm1EZXZpY2VUeXBlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBkZXZpY2VzOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQotewotICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkiKTsKLQotICAgIGlmIChoYW5kbGUgPT0gTlVMTCB8fCBwYXRjaCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgbnVtIHNvdXJjZXMgJWQgbnVtIHNpbmtzICVkIiwgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzKTsKLQotICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPT0gMCB8fCBwYXRjaC0+bnVtX3NvdXJjZXMgPiBBVURJT19QQVRDSF9QT1JUU19NQVggfHwKLSAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MgPT0gMCB8fCBwYXRjaC0+bnVtX3NpbmtzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIC8vIG9ubHkgb25lIHNvdXJjZSBwZXIgYXVkaW8gcGF0Y2ggc3VwcG9ydGVkIGZvciBub3cKLSAgICBpZiAocGF0Y2gtPm51bV9zb3VyY2VzID4gMSkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLnJvbGUgIT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7Ci0gICAgICAgIGlmIChwYXRjaC0+c2lua3NbaV0ucm9sZSAhPSBBVURJT19QT1JUX1JPTEVfU0lOSykgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjOwotICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKmhhbmRsZSk7Ci0KLSAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCBzb3VyY2UgaWQgJWQgcm9sZSAlZCB0eXBlICVkIiwgcGF0Y2gtPnNvdXJjZXNbMF0uaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLnJvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUpOwotI2lmIExPR19OREVCVUcgPT0gMAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7Ci0gICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoIHNpbmsgJWQ6IGlkICVkIHJvbGUgJWQgdHlwZSAlZCIsIGksIHBhdGNoLT5zaW5rc1tpXS5pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0ucm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0udHlwZSk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG1VaWRDYWNoZWQgJWQgcGF0Y2hEZXNjLT5tVWlkICVkIHVpZCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVWlkQ2FjaGVkLCBwYXRjaERlc2MtPm1VaWQsIHVpZCk7Ci0gICAgICAgIGlmIChwYXRjaERlc2MtPm1VaWQgIT0gbVVpZENhY2hlZCAmJiB1aWQgIT0gcGF0Y2hEZXNjLT5tVWlkKSB7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAqaGFuZGxlID0gMDsKLSAgICB9Ci0KLSAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7Ci0gICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IGdldE91dHB1dEZyb21JZChwYXRjaC0+c291cmNlc1swXS5pZCk7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgb3V0cHV0IG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBwYXRjaC0+c291cmNlc1swXS5pZCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwiZHVwbGljYXRlZCBvdXRwdXQgJWQgaW4gc291cmNlIGluIHBvcnRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCkgewotICAgICAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVBhdGNoLnNvdXJjZXNbMF0uaWQgIT0gcGF0Y2gtPnNvdXJjZXNbMF0uaWQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHNvdXJjZSBpZCBkaWZmZXJzIGZvciBwYXRjaCBjdXJyZW50IGlkICVkIG5ldyBpZCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaC5zb3VyY2VzWzBdLmlkLCBwYXRjaC0+c291cmNlc1swXS5pZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKLSAgICAgICAgICAgIC8vIE9ubHkgc3VwcG9ydCBtaXggdG8gZGV2aWNlcyBjb25uZWN0aW9uCi0gICAgICAgICAgICAvLyBUT0RPIGFkZCBzdXBwb3J0IGZvciBtaXggdG8gbWl4IGNvbm5lY3Rpb24KLSAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbaV0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzb3VyY2UgbWl4IGJ1dCBzaW5rIGlzIG5vdCBhIGRldmljZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQotICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocGF0Y2gtPnNpbmtzW2ldLmlkKTsKLSAgICAgICAgICAgIGlmIChkZXZEZXNjID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG91dCBkZXZpY2Ugbm90IGZvdW5kIGZvciBpZCAlZCIsIHBhdGNoLT5zaW5rc1tpXS5pZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5tUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZEZXNjLT5tRGV2aWNlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+bUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgIC8vIHVwZGF0ZWRTYW1wbGluZ1JhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmNoYW5uZWxfbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUgLypGSVhNRSovKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgcHJvZmlsZSBub3Qgc3VwcG9ydGVkIGZvciBkZXZpY2UgJTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+bURldmljZVR5cGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRldmljZXMuYWRkKGRldkRlc2MpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXZpY2VzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiByZWNvbmZpZ3VyZSBvdXRwdXQgZm9ybWF0IGFuZCBjaGFubmVscyBoZXJlCi0gICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0dGluZyBkZXZpY2UgJTA4eCBvbiBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICBkZXZpY2VzLnR5cGVzKCksIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLT5tSW9IYW5kbGUsIGRldmljZXMudHlwZXMoKSwgdHJ1ZSwgMCwgaGFuZGxlKTsKLSAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKmhhbmRsZSk7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBpZiAocGF0Y2hEZXNjICE9IDAgJiYgcGF0Y2hEZXNjICE9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIHNldE91dHB1dERldmljZSgpIGRpZCBub3QgcmV1c2UgdGhlIHBhdGNoIHByb3ZpZGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICAgICAgcGF0Y2hEZXNjLT5tVWlkID0gdWlkOwotICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzdWNjZXNzIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIHNldE91dHB1dERldmljZSgpIGZhaWxlZCB0byBjcmVhdGUgYSBwYXRjaCIpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChwYXRjaC0+c291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKLSAgICAgICAgICAgIC8vIGlucHV0IGRldmljZSB0byBpbnB1dCBtaXggY29ubmVjdGlvbgotICAgICAgICAgICAgLy8gb25seSBvbmUgc2luayBzdXBwb3J0ZWQgd2hlbiBjb25uZWN0aW5nIGFuIGlucHV0IGRldmljZSB0byBhIG1peAotICAgICAgICAgICAgaWYgKHBhdGNoLT5udW1fc2lua3MgPiAxKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IGdldElucHV0RnJvbUlkKHBhdGNoLT5zaW5rc1swXS5pZCk7Ci0gICAgICAgICAgICBpZiAoaW5wdXREZXNjID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVBhdGNoLnNpbmtzWzBdLmlkICE9IHBhdGNoLT5zaW5rc1swXS5pZCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQotICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c291cmNlc1swXS5pZCk7Ci0gICAgICAgICAgICBpZiAoZGV2RGVzYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFpbnB1dERlc2MtPm1Qcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldkRlc2MtPm1EZXZpY2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5zYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAvKnVwZGF0ZWRTYW1wbGVSYXRlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgZm9yIHRoZSBwYXJhbWV0ZXIgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIE5PTkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVE9ETzogcmVjb25maWd1cmUgb3V0cHV0IGZvcm1hdCBhbmQgY2hhbm5lbHMgaGVyZQotICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXR0aW5nIGRldmljZSAlMDh4IG9uIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1EZXZpY2VUeXBlLCBpbnB1dERlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dERlc2MtPm1Jb0hhbmRsZSwgZGV2RGVzYy0+bURldmljZVR5cGUsIHRydWUsIGhhbmRsZSk7Ci0gICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqaGFuZGxlKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwICYmIHBhdGNoRGVzYyAhPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0SW5wdXREZXZpY2UoKSBkaWQgbm90IHJldXNlIHRoZSBwYXRjaCBwcm92aWRlZCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVVpZCA9IHVpZDsKLSAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHN1Y2Nlc3MiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXRJbnB1dERldmljZSgpIGZhaWxlZCB0byBjcmVhdGUgYSBwYXRjaCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgICAgICAvLyBkZXZpY2UgdG8gZGV2aWNlIGNvbm5lY3Rpb24KLSAgICAgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChwYXRjaERlc2MtPm1QYXRjaC5zb3VyY2VzWzBdLmlkICE9IHBhdGNoLT5zb3VyY2VzWzBdLmlkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKLSAgICAgICAgICAgIGlmIChzcmNEZXZpY2VEZXNjID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL3VwZGF0ZSBzb3VyY2UgYW5kIHNpbmsgd2l0aCBvdXIgb3duIGRhdGEgYXMgdGhlIGRhdGEgcGFzc2VkIGluIHRoZSBwYXRjaCBtYXkKLSAgICAgICAgICAgIC8vIGJlIGluY29tcGxldGUuCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbmV3UGF0Y2ggPSAqcGF0Y2g7Ci0gICAgICAgICAgICBzcmNEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc291cmNlc1swXSwgJnBhdGNoLT5zb3VyY2VzWzBdKTsKLQotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHNvdXJjZSBkZXZpY2UgYnV0IG9uZSBzaW5rIGlzIG5vdCBhIGRldmljZSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZURlc2MgPQotICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zaW5rc1tpXS5pZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNpbmtEZXZpY2VEZXNjID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2lua0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZuZXdQYXRjaC5zaW5rc1tpXSwgJnBhdGNoLT5zaW5rc1tpXSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3JjRGV2aWNlRGVzYy0+bU1vZHVsZSAhPSBzaW5rRGV2aWNlRGVzYy0+bU1vZHVsZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IG9uZSBzaW5rIHN1cHBvcnRlZCB3aGVuIGNvbm5lY3RlZCBkZXZpY2VzIGFjcm9zcyBIVyBtb2R1bGVzCi0gICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+bnVtX3NpbmtzID4gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2Uoc2lua0RldmljZURlc2MtPm1EZXZpY2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHNpbmsgZGV2aWNlIGlzIHJlYWNoYWJsZSB2aWEgYW4gb3BlbmVkIG91dHB1dCBzdHJlYW0sIHJlcXVlc3QgdG8gZ28gdmlhCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgb3V0cHV0IHN0cmVhbSBieSBhZGRpbmcgYSBzZWNvbmQgc291cmNlIHRvIHRoZSBwYXRjaCBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfSU5WQUxJRCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc291cmNlc1sxXSwgJnBhdGNoLT5zb3VyY2VzWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLm51bV9zb3VyY2VzID0gMjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIGZyb20gcm91dGluZyBjYXBhYmlsaXRpZXMgaW4gY29uZmlnIGZpbGUgYW5kIG90aGVyIGNvbmZsaWN0aW5nIHBhdGNoZXMKLQotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJm5ld1BhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgcGF0Y2ggcGFuZWwgcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKChhdWRpb19wYXRjaF9oYW5kbGVfdCluZXh0VW5pcXVlSWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld1BhdGNoLCB1aWQpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9IG5ld1BhdGNoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgICAgICAqaGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOwotICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBwYXRjaCBwYW5lbCBjb3VsZCBub3QgY29ubmVjdCBkZXZpY2UgcGF0Y2gsIGVycm9yICVkIiwKLSAgICAgICAgICAgICAgICBzdGF0dXMpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCi17Ci0gICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoKCkgcGF0Y2ggJWQiLCBoYW5kbGUpOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShoYW5kbGUpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwotICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIG1VaWRDYWNoZWQgJWQgcGF0Y2hEZXNjLT5tVWlkICVkIHVpZCAlZCIsCi0gICAgICAgICAgbVVpZENhY2hlZCwgcGF0Y2hEZXNjLT5tVWlkLCB1aWQpOwotICAgIGlmIChwYXRjaERlc2MtPm1VaWQgIT0gbVVpZENhY2hlZCAmJiB1aWQgIT0gcGF0Y2hEZXNjLT5tVWlkKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoID0gJnBhdGNoRGVzYy0+bVBhdGNoOwotICAgIHBhdGNoRGVzYy0+bVVpZCA9IG1VaWRDYWNoZWQ7Ci0gICAgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgewotICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBnZXRPdXRwdXRGcm9tSWQocGF0Y2gtPnNvdXJjZXNbMF0uaWQpOwotICAgICAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBvdXRwdXQgbm90IGZvdW5kIGZvciBpZCAlZCIsIHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+bUlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPm1Jb0hhbmRsZSwgdHJ1ZSAvKmZyb21DYWNoZSovKSwKLSAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgfSBlbHNlIGlmIChwYXRjaC0+c291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBnZXRJbnB1dEZyb21JZChwYXRjaC0+c2lua3NbMF0uaWQpOwotICAgICAgICAgICAgaWYgKGlucHV0RGVzYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoKCkgaW5wdXQgbm90IGZvdW5kIGZvciBpZCAlZCIsIHBhdGNoLT5zaW5rc1swXS5pZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0RGVzYy0+bUlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXREZXNjLT5tSW9IYW5kbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgICAgICB9IGVsc2UgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOwotICAgICAgICAgICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoKCkgcGF0Y2ggcGFuZWwgcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgcmVtb3ZlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUpOwotICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Omxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQotewotICAgIGlmIChudW1fcGF0Y2hlcyA9PSBOVUxMIHx8ICgqbnVtX3BhdGNoZXMgIT0gMCAmJiBwYXRjaGVzID09IE5VTEwpIHx8Ci0gICAgICAgICAgICBnZW5lcmF0aW9uID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgQUxPR1YoImxpc3RBdWRpb1BhdGNoZXMoKSBudW1fcGF0Y2hlcyAlZCBwYXRjaGVzICVwIGF2YWlsYWJsZSBwYXRjaGVzICV6dSIsCi0gICAgICAgICAgKm51bV9wYXRjaGVzLCBwYXRjaGVzLCBtQXVkaW9QYXRjaGVzLnNpemUoKSk7Ci0gICAgaWYgKHBhdGNoZXMgPT0gTlVMTCkgewotICAgICAgICAqbnVtX3BhdGNoZXMgPSAwOwotICAgIH0KLQotICAgIHNpemVfdCBwYXRjaGVzV3JpdHRlbiA9IDA7Ci0gICAgc2l6ZV90IHBhdGNoZXNNYXggPSAqbnVtX3BhdGNoZXM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7Ci0gICAgICAgICAgICBpICA8IG1BdWRpb1BhdGNoZXMuc2l6ZSgpICYmIHBhdGNoZXNXcml0dGVuIDwgcGF0Y2hlc01heDsgaSsrKSB7Ci0gICAgICAgIHBhdGNoZXNbcGF0Y2hlc1dyaXR0ZW5dID0gbUF1ZGlvUGF0Y2hlc1tpXS0+bVBhdGNoOwotICAgICAgICBwYXRjaGVzW3BhdGNoZXNXcml0dGVuKytdLmlkID0gbUF1ZGlvUGF0Y2hlc1tpXS0+bUhhbmRsZTsKLSAgICAgICAgQUxPR1YoImxpc3RBdWRpb1BhdGNoZXMoKSBwYXRjaCAlenUgbnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIiwKLSAgICAgICAgICAgICAgaSwgbUF1ZGlvUGF0Y2hlc1tpXS0+bVBhdGNoLm51bV9zb3VyY2VzLCBtQXVkaW9QYXRjaGVzW2ldLT5tUGF0Y2gubnVtX3NpbmtzKTsKLSAgICB9Ci0gICAgKm51bV9wYXRjaGVzID0gbUF1ZGlvUGF0Y2hlcy5zaXplKCk7Ci0KLSAgICAqZ2VuZXJhdGlvbiA9IGN1ckF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLSAgICBBTE9HVigibGlzdEF1ZGlvUGF0Y2hlcygpIGdvdCAlenUgcGF0Y2hlcyBuZWVkZWQgJWQiLCBwYXRjaGVzV3JpdHRlbiwgKm51bV9wYXRjaGVzKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQotewotICAgIEFMT0dWKCJzZXRBdWRpb1BvcnRDb25maWcoKSIpOwotCi0gICAgaWYgKGNvbmZpZyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIEFMT0dWKCJzZXRBdWRpb1BvcnRDb25maWcoKSBvbiBwb3J0IGhhbmRsZSAlZCIsIGNvbmZpZy0+aWQpOwotICAgIC8vIE9ubHkgc3VwcG9ydCBnYWluIGNvbmZpZ3VyYXRpb24gZm9yIG5vdwotICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICE9IEFVRElPX1BPUlRfQ09ORklHX0dBSU4pIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHNwPEF1ZGlvUG9ydENvbmZpZz4gYXVkaW9Qb3J0Q29uZmlnOwotICAgIGlmIChjb25maWctPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgewotICAgICAgICBpZiAoY29uZmlnLT5yb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IGdldE91dHB1dEZyb21JZChjb25maWctPmlkKTsKLSAgICAgICAgICAgIGlmIChvdXRwdXREZXNjID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR19BU1NFUlQoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgInNldEF1ZGlvUG9ydENvbmZpZygpIGNhbGxlZCBvbiBkdXBsaWNhdGVkIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgYXVkaW9Qb3J0Q29uZmlnID0gb3V0cHV0RGVzYzsKLSAgICAgICAgfSBlbHNlIGlmIChjb25maWctPnJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBnZXRJbnB1dEZyb21JZChjb25maWctPmlkKTsKLSAgICAgICAgICAgIGlmIChpbnB1dERlc2MgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdWRpb1BvcnRDb25maWcgPSBpbnB1dERlc2M7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChjb25maWctPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjOwotICAgICAgICBpZiAoY29uZmlnLT5yb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpIHsKLSAgICAgICAgICAgIGRldmljZURlc2MgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZChjb25maWctPmlkKTsKLSAgICAgICAgfSBlbHNlIGlmIChjb25maWctPnJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKLSAgICAgICAgICAgIGRldmljZURlc2MgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoY29uZmlnLT5pZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXZpY2VEZXNjID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgYXVkaW9Qb3J0Q29uZmlnID0gZGV2aWNlRGVzYzsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBiYWNrdXBDb25maWc7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb3J0Q29uZmlnLT5hcHBseUF1ZGlvUG9ydENvbmZpZyhjb25maWcsICZiYWNrdXBDb25maWcpOwotICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIG5ld0NvbmZpZzsKLSAgICAgICAgYXVkaW9Qb3J0Q29uZmlnLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3Q29uZmlnLCBjb25maWcpOwotICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKCZuZXdDb25maWcsIDApOwotICAgIH0KLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIGF1ZGlvUG9ydENvbmZpZy0+YXBwbHlBdWRpb1BvcnRDb25maWcoJmJhY2t1cENvbmZpZyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsZWFyQXVkaW9QYXRjaGVzKHVpZF90IHVpZCkKLXsKLSAgICBmb3IgKHNzaXplX3QgaSA9IChzc2l6ZV90KW1BdWRpb1BhdGNoZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pICB7Ci0gICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVVpZCA9PSB1aWQpIHsKLSAgICAgICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoKG1BdWRpb1BhdGNoZXMua2V5QXQoaSksIHVpZCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6YWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpCi17Ci0gICAgKnNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KW1wQ2xpZW50SW50ZXJmYWNlLT5uZXdBdWRpb1VuaXF1ZUlkKCk7Ci0gICAgKmlvSGFuZGxlID0gKGF1ZGlvX2lvX2hhbmRsZV90KW1wQ2xpZW50SW50ZXJmYWNlLT5uZXdBdWRpb1VuaXF1ZUlkKCk7Ci0gICAgKmRldmljZSA9IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKEFVRElPX1NPVVJDRV9IT1RXT1JEKTsKLQotICAgIG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy5hZGQoKnNlc3Npb24sICppb0hhbmRsZSk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgc3NpemVfdCBpbmRleCA9IG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy5pbmRleE9mS2V5KHNlc3Npb24pOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coImFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKCkgc2Vzc2lvbiAlZCBub3QgcmVnaXN0ZXJlZCIsIHNlc3Npb24pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy5yZW1vdmVJdGVtKHNlc3Npb24pOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphZGRBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1BhdGNoPiYgcGF0Y2gpCi17Ci0gICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShoYW5kbGUpOwotCi0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgQUxPR1coImFkZEF1ZGlvUGF0Y2goKSBwYXRjaCAlZCBhbHJlYWR5IGluIiwgaGFuZGxlKTsKLSAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOwotICAgIH0KLSAgICBtQXVkaW9QYXRjaGVzLmFkZChoYW5kbGUsIHBhdGNoKTsKLSAgICBBTE9HVigiYWRkQXVkaW9QYXRjaCgpIGhhbmRsZSAlZCBhZiBoYW5kbGUgJWQgbnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIHNvdXJjZSBoYW5kbGUgJWQiCi0gICAgICAgICAgICAic2luayBoYW5kbGUgJWQiLAotICAgICAgICAgIGhhbmRsZSwgcGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCBwYXRjaC0+bVBhdGNoLm51bV9zb3VyY2VzLCBwYXRjaC0+bVBhdGNoLm51bV9zaW5rcywKLSAgICAgICAgICBwYXRjaC0+bVBhdGNoLnNvdXJjZXNbMF0uaWQsIHBhdGNoLT5tUGF0Y2guc2lua3NbMF0uaWQpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZW1vdmVBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKLXsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGhhbmRsZSk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJyZW1vdmVBdWRpb1BhdGNoKCkgcGF0Y2ggJWQgbm90IGluIiwgaGFuZGxlKTsKLSAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOwotICAgIH0KLSAgICBBTE9HVigicmVtb3ZlQXVkaW9QYXRjaCgpIGhhbmRsZSAlZCBhZiBoYW5kbGUgJWQiLCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KS0+bUFmUGF0Y2hIYW5kbGUpOwotICAgIG1BdWRpb1BhdGNoZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBdWRpb1BvbGljeU1hbmFnZXIKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpuZXh0VW5pcXVlSWQoKQotewotICAgIHJldHVybiBhbmRyb2lkX2F0b21pY19pbmMoJm1OZXh0VW5pcXVlSWQpOwotfQotCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6Om5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCkKLXsKLSAgICByZXR1cm4gYW5kcm9pZF9hdG9taWNfaW5jKCZtQXVkaW9Qb3J0R2VuZXJhdGlvbik7Ci19Ci0KLUF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCi0gICAgOgotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgVGhyZWFkKGZhbHNlKSwKLSNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCi0gICAgbVByaW1hcnlPdXRwdXQoKGF1ZGlvX2lvX2hhbmRsZV90KTApLAotICAgIG1QaG9uZVN0YXRlKEFVRElPX01PREVfTk9STUFMKSwKLSAgICBtTGltaXRSaW5ndG9uZVZvbHVtZShmYWxzZSksIG1MYXN0Vm9pY2VWb2x1bWUoLTEuMGYpLAotICAgIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKDApLCBtVG90YWxFZmZlY3RzTWVtb3J5KDApLAotICAgIG1BMmRwU3VzcGVuZGVkKGZhbHNlKSwKLSAgICBtU3BlYWtlckRyY0VuYWJsZWQoZmFsc2UpLCBtTmV4dFVuaXF1ZUlkKDEpLAotICAgIG1BdWRpb1BvcnRHZW5lcmF0aW9uKDEpLAotICAgIG1CZWFjb25NdXRlUmVmQ291bnQoMCksCi0gICAgbUJlYWNvblBsYXlpbmdSZWZDb3VudCgwKSwKLSAgICBtQmVhY29uTXV0ZWQoZmFsc2UpCi17Ci0gICAgbVVpZENhY2hlZCA9IGdldHVpZCgpOwotICAgIG1wQ2xpZW50SW50ZXJmYWNlID0gY2xpZW50SW50ZXJmYWNlOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVDsgaSsrKSB7Ci0gICAgICAgIG1Gb3JjZVVzZVtpXSA9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FOwotICAgIH0KLQotICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOCgiIiksIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUik7Ci0gICAgaWYgKGxvYWRBdWRpb1BvbGljeUNvbmZpZyhBVURJT19QT0xJQ1lfVkVORE9SX0NPTkZJR19GSUxFKSAhPSBOT19FUlJPUikgewotICAgICAgICBpZiAobG9hZEF1ZGlvUG9saWN5Q29uZmlnKEFVRElPX1BPTElDWV9DT05GSUdfRklMRSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgbG9hZCBhdWRpbyBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlLCBzZXR0aW5nIGRlZmF1bHRzIik7Ci0gICAgICAgICAgICBkZWZhdWx0QXVkaW9Qb2xpY3lDb25maWcoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBhbmQgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyBub3cgY29udGFpbiBhbGwgYXR0YWNoZWQgZGV2aWNlcwotCi0gICAgLy8gbXVzdCBiZSBkb25lIGFmdGVyIHJlYWRpbmcgdGhlIHBvbGljeQotICAgIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoKTsKLQotICAgIC8vIG9wZW4gYWxsIG91dHB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcwotICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGlucHV0RGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5sb2FkSHdNb2R1bGUobUh3TW9kdWxlc1tpXS0+bU5hbWUpOwotICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiY291bGQgbm90IG9wZW4gSFcgbW9kdWxlICVzIiwgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gb3BlbiBhbGwgb3V0cHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzCi0gICAgICAgIC8vIGV4Y2VwdCBmb3IgZGlyZWN0IG91dHB1dCBzdHJlYW1zIHRoYXQgYXJlIG9ubHkgb3BlbmVkIHdoZW4gdGhleSBhcmUgYWN0dWFsbHkKLSAgICAgICAgLy8gcmVxdWlyZWQgYnkgYW4gYXBwLgotICAgICAgICAvLyBUaGlzIGFsc28gdmFsaWRhdGVzIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzIGxpc3QKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gb3V0UHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXTsKLQotICAgICAgICAgICAgaWYgKG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJPdXRwdXQgcHJvZmlsZSBjb250YWlucyBubyBkZXZpY2Ugb24gbW9kdWxlICVzIiwgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKG91dFByb2ZpbGUtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByb2ZpbGVUeXBlID0gb3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKTsKLSAgICAgICAgICAgIGlmICgocHJvZmlsZVR5cGUgJiBtRGVmYXVsdE91dHB1dERldmljZS0+bURldmljZVR5cGUpICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUgPSBtRGVmYXVsdE91dHB1dERldmljZS0+bURldmljZVR5cGU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGNob3NlIGZpcnN0IGRldmljZSBwcmVzZW50IGluIG1TdXBwb3J0ZWREZXZpY2VzIGFsc28gcGFydCBvZgotICAgICAgICAgICAgICAgIC8vIG91dHB1dERldmljZVR5cGVzCi0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgIDwgb3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUgPSBvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1trXS0+bURldmljZVR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgocHJvZmlsZVR5cGUgJiBvdXRwdXREZXZpY2VUeXBlcykgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKHByb2ZpbGVUeXBlICYgb3V0cHV0RGV2aWNlVHlwZXMpID09IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG5ldyBBdWRpb091dHB1dERlc2NyaXB0b3Iob3V0UHJvZmlsZSk7Ci0KLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBwcm9maWxlVHlwZTsKLSAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKLSAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrOwotICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG91dHB1dERlc2MtPm1Gb3JtYXQ7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KG91dFByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRmxhZ3MpOwotCi0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkNhbm5vdCBvcGVuIG91dHB1dCBzdHJlYW0gZm9yIGRldmljZSAlMDh4IG9uIGh3IG1vZHVsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICBtSHdNb2R1bGVzW2ldLT5tTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKLQotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrICA8IG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnNpemUoKTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gb3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNba10tPm1EZXZpY2VUeXBlOwotICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSBhIHZhbGlkIElEIHRvIGFuIGF0dGFjaGVkIGRldmljZSBvbmNlIGNvbmZpcm1lZCBpdCBpcyByZWFjaGFibGUKLSAgICAgICAgICAgICAgICAgICAgaWYgKChpbmRleCA+PSAwKSAmJiAobUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5tSWQgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+bUlkID0gbmV4dFVuaXF1ZUlkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPm1Nb2R1bGUgPSBtSHdNb2R1bGVzW2ldOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUHJpbWFyeU91dHB1dCA9PSAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRQcm9maWxlLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0ID0gb3V0cHV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBvdXRwdXREZXNjKTsKLSAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBvcGVuIGlucHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzIHRvIHZhbGlkYXRlCi0gICAgICAgIC8vIG1BdmFpbGFibGVJbnB1dERldmljZXMgbGlzdAotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IGluUHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1JbnB1dFByb2ZpbGVzW2pdOwotCi0gICAgICAgICAgICBpZiAoaW5Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiSW5wdXQgcHJvZmlsZSBjb250YWlucyBubyBkZXZpY2Ugb24gbW9kdWxlICVzIiwgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY2hvc2UgZmlyc3QgZGV2aWNlIHByZXNlbnQgaW4gbVN1cHBvcnRlZERldmljZXMgYWxzbyBwYXJ0IG9mCi0gICAgICAgICAgICAvLyBpbnB1dERldmljZVR5cGVzCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJvZmlsZVR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrICA8IGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuc2l6ZSgpOyBrKyspIHsKLSAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSA9IGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNba10tPm1EZXZpY2VUeXBlOwotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlVHlwZSAmIGlucHV0RGV2aWNlVHlwZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIGlucHV0RGV2aWNlVHlwZXMpID09IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IoaW5Qcm9maWxlKTsKLQotICAgICAgICAgICAgaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOwotICAgICAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlID0gcHJvZmlsZVR5cGU7Ci0KLSAgICAgICAgICAgIC8vIGZpbmQgdGhlIGFkZHJlc3MKLSAgICAgICAgICAgIERldmljZVZlY3RvciBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShwcm9maWxlVHlwZSk7Ci0gICAgICAgICAgICAvLyAgIHRoZSBpbnB1dHMgdmVjdG9yIG11c3QgYmUgb2Ygc2l6ZSAxLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBoZXJlCi0gICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBpbnB1dERldmljZXMuc2l6ZSgpID4gMCA/IGlucHV0RGV2aWNlcy5pdGVtQXQoMCktPm1BZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgIDogU3RyaW5nOCgiIik7Ci0gICAgICAgICAgICBBTE9HVigiICBmb3IgaW5wdXQgZGV2aWNlIDB4JXggdXNpbmcgYWRkcmVzcyAlcyIsIHByb2ZpbGVUeXBlLCBhZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgICAgIEFMT0dFX0lGKGlucHV0RGV2aWNlcy5zaXplKCkgPT0gMCwgIklucHV0IGRldmljZSBsaXN0IGlzIGVtcHR5ISIpOwotCi0gICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7Ci0gICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBpbnB1dERlc2MtPm1TYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gaW5wdXREZXNjLT5tQ2hhbm5lbE1hc2s7Ci0gICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gaW5wdXREZXNjLT5tRm9ybWF0OwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuSW5wdXQoaW5Qcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dERlc2MtPm1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSk7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayAgPCBpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnNpemUoKTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gaW5Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1trXS0+bURldmljZVR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSBhIHZhbGlkIElEIHRvIGFuIGF0dGFjaGVkIGRldmljZSBvbmNlIGNvbmZpcm1lZCBpdCBpcyByZWFjaGFibGUKLSAgICAgICAgICAgICAgICAgICAgaWYgKChpbmRleCA+PSAwKSAmJiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpbmRleF0tPm1JZCA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpbmRleF0tPm1JZCA9IG5leHRVbmlxdWVJZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpbmRleF0tPm1Nb2R1bGUgPSBtSHdNb2R1bGVzW2ldOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KGlucHV0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkNhbm5vdCBvcGVuIGlucHV0IHN0cmVhbSBmb3IgZGV2aWNlICUwOHggb24gaHcgbW9kdWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8vIG1ha2Ugc3VyZSBhbGwgYXR0YWNoZWQgZGV2aWNlcyBoYXZlIGJlZW4gYWxsb2NhdGVkIGEgdW5pcXVlIElECi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIDwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpOykgewotICAgICAgICBpZiAobUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPm1JZCA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiSW5wdXQgZGV2aWNlICUwOHggdW5yZWFjaGFibGUiLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXS0+bURldmljZVR5cGUpOwotICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGkrKzsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7KSB7Ci0gICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5tSWQgPT0gMCkgewotICAgICAgICAgICAgQUxPR1coIklucHV0IGRldmljZSAlMDh4IHVucmVhY2hhYmxlIiwgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bURldmljZVR5cGUpOwotICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5yZW1vdmUobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpKys7Ci0gICAgfQotICAgIC8vIG1ha2Ugc3VyZSBkZWZhdWx0IGRldmljZSBpcyByZWFjaGFibGUKLSAgICBpZiAobUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihtRGVmYXVsdE91dHB1dERldmljZSkgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJEZWZhdWx0IGRldmljZSAlMDh4IGlzIHVucmVhY2hhYmxlIiwgbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlKTsKLSAgICB9Ci0KLSAgICBBTE9HRV9JRigobVByaW1hcnlPdXRwdXQgPT0gMCksICJGYWlsZWQgdG8gb3BlbiBwcmltYXJ5IG91dHB1dCIpOwotCi0gICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKLQotI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCi0gICAgaWYgKG1QcmltYXJ5T3V0cHV0ICE9IDApIHsKLSAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0Q21kID0gQXVkaW9QYXJhbWV0ZXIoKTsKLSAgICAgICAgb3V0cHV0Q21kLmFkZEludChTdHJpbmc4KCJzZXRfaWQiKSwgMCk7Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1QcmltYXJ5T3V0cHV0LCBvdXRwdXRDbWQudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgbVRlc3REZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgIG1UZXN0U2FtcGxpbmdSYXRlID0gNDQxMDA7Ci0gICAgICAgIG1UZXN0Rm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci0gICAgICAgIG1UZXN0Q2hhbm5lbHMgPSAgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgICAgICBtVGVzdExhdGVuY3lNcyA9IDA7Ci0gICAgICAgIG1DdXJPdXRwdXQgPSAwOwotICAgICAgICBtRGlyZWN0T3V0cHV0ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1RFU1RfT1VUUFVUUzsgaSsrKSB7Ci0gICAgICAgICAgICBtVGVzdE91dHB1dHNbaV0gPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJBdWRpb1BvbGljeU1hbmFnZXJUZXN0Iik7Ci0gICAgICAgIHJ1bihidWZmZXIsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwotICAgIH0KLSNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCi19Ci0KLUF1ZGlvUG9saWN5TWFuYWdlcjo6fkF1ZGlvUG9saWN5TWFuYWdlcigpCi17Ci0jaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKLSAgICBleGl0KCk7Ci0jZW5kaWYgLy9BVURJT19QT0xJQ1lfVEVTVAotICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQobU91dHB1dHMua2V5QXQoaSkpOwotICAgfQotICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KG1JbnB1dHMua2V5QXQoaSkpOwotICAgfQotICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuY2xlYXIoKTsKLSAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuY2xlYXIoKTsKLSAgIG1PdXRwdXRzLmNsZWFyKCk7Ci0gICBtSW5wdXRzLmNsZWFyKCk7Ci0gICBtSHdNb2R1bGVzLmNsZWFyKCk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdENoZWNrKCkKLXsKLSAgICByZXR1cm4gKG1QcmltYXJ5T3V0cHV0ID09IDApID8gTk9fSU5JVCA6IE5PX0VSUk9SOwotfQotCi0jaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp0aHJlYWRMb29wKCkKLXsKLSAgICBBTE9HVigiZW50ZXJpbmcgdGhyZWFkTG9vcCgpIik7Ci0gICAgd2hpbGUgKCFleGl0UGVuZGluZygpKQotICAgIHsKLSAgICAgICAgU3RyaW5nOCBjb21tYW5kOwotICAgICAgICBpbnQgdmFsdWVJbnQ7Ci0gICAgICAgIFN0cmluZzggdmFsdWU7Ci0KLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgbVdhaXRXb3JrQ1Yud2FpdFJlbGF0aXZlKG1Mb2NrLCBtaWxsaXNlY29uZHMoNTApKTsKLQotICAgICAgICBjb21tYW5kID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoMCwgU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5IikpOwotICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGNvbW1hbmQpOwotCi0gICAgICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5IiksIHZhbHVlSW50KSA9PSBOT19FUlJPUiAmJgotICAgICAgICAgICAgdmFsdWVJbnQgIT0gMCkgewotICAgICAgICAgICAgQUxPR1YoIlRlc3QgY29tbWFuZCAlcyByZWNlaXZlZCIsIGNvbW1hbmQuc3RyaW5nKCkpOwotICAgICAgICAgICAgU3RyaW5nOCB0YXJnZXQ7Ci0gICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRhcmdldCIpLCB0YXJnZXQpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0ID0gIk1hbmFnZXIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfb3V0cHV0IiksIHZhbHVlSW50KSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfb3V0cHV0IikpOwotICAgICAgICAgICAgICAgIG1DdXJPdXRwdXQgPSB2YWx1ZUludDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2RpcmVjdCIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2RpcmVjdCIpKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gImZhbHNlIikgewotICAgICAgICAgICAgICAgICAgICBtRGlyZWN0T3V0cHV0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAidHJ1ZSIpIHsKLSAgICAgICAgICAgICAgICAgICAgbURpcmVjdE91dHB1dCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfaW5wdXQiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9pbnB1dCIpKTsKLSAgICAgICAgICAgICAgICBtVGVzdElucHV0ID0gdmFsdWVJbnQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2Zvcm1hdCIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2Zvcm1hdCIpKTsKLSAgICAgICAgICAgICAgICBpbnQgZm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09ICJQQ00gMTYgYml0cyIpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAiUENNIDggYml0cyIpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV84X0JJVDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJDb21wcmVzc2VkIE1QMyIpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQVVESU9fRk9STUFUX01QMzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRCkgewotICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09ICJNYW5hZ2VyIikgewotICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RGb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dFBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhcmFtLmFkZEludChTdHJpbmc4KCJmb3JtYXQiKSwgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSwgb3V0cHV0UGFyYW0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9jaGFubmVscyIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2NoYW5uZWxzIikpOwotICAgICAgICAgICAgICAgIGludCBjaGFubmVscyA9IDA7Ci0KLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gIkNoYW5uZWxzIFN0ZXJlbyIpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSAgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gIkNoYW5uZWxzIE1vbm8iKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gIEFVRElPX0NIQU5ORUxfT1VUX01PTk87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjaGFubmVscyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gIk1hbmFnZXIiKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVGVzdENoYW5uZWxzID0gY2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dFBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhcmFtLmFkZEludChTdHJpbmc4KCJjaGFubmVscyIpLCBjaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sIG91dHB1dFBhcmFtLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfc2FtcGxlUmF0ZSIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X3NhbXBsZVJhdGUiKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlSW50ID49IDAgJiYgdmFsdWVJbnQgPD0gOTYwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsaW5nUmF0ZSA9IHZhbHVlSW50OwotICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0ID09ICJNYW5hZ2VyIikgewotICAgICAgICAgICAgICAgICAgICAgICAgbVRlc3RTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dFBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFBhcmFtLmFkZEludChTdHJpbmc4KCJzYW1wbGluZ19yYXRlIiksIHNhbXBsaW5nUmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sIG91dHB1dFBhcmFtLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGFyYW0uZ2V0KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9yZW9wZW4iKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9yZW9wZW4iKSk7Ci0KLSAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihtUHJpbWFyeU91dHB1dCk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG1QcmltYXJ5T3V0cHV0KTsKLQotICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUgPSBvdXRwdXREZXNjLT5tTW9kdWxlLT5tSGFuZGxlOwotCi0gICAgICAgICAgICAgICAgbU91dHB1dHMucmVtb3ZlSXRlbShtUHJpbWFyeU91dHB1dCk7Ci0KLSAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKE5VTEwpOwotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOwotICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IG91dHB1dERlc2MtPm1DaGFubmVsTWFzazsKLSAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gb3V0cHV0RGVzYy0+bUZvcm1hdDsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChtb2R1bGVIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1QcmltYXJ5T3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlb3BlbiBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAic2FtcGxpbmdSYXRlOiAlZCwgZm9ybWF0ICVkLCBjaGFubmVscyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlLCBvdXRwdXREZXNjLT5tRm9ybWF0LCBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OwotICAgICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBvdXRwdXRDbWQgPSBBdWRpb1BhcmFtZXRlcigpOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXRDbWQuYWRkSW50KFN0cmluZzgoInNldF9pZCIpLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVByaW1hcnlPdXRwdXQsIG91dHB1dENtZC50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkT3V0cHV0KG1QcmltYXJ5T3V0cHV0LCBvdXRwdXREZXNjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoMCwgU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5PSIpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpleGl0KCkKLXsKLSAgICB7Ci0gICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7Ci0gICAgICAgIHJlcXVlc3RFeGl0KCk7Ci0gICAgICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOwotICAgIH0KLSAgICByZXF1ZXN0RXhpdEFuZFdhaXQoKTsKLX0KLQotaW50IEF1ZGlvUG9saWN5TWFuYWdlcjo6dGVzdE91dHB1dEluZGV4KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9URVNUX09VVFBVVFM7IGkrKykgewotICAgICAgICBpZiAob3V0cHV0ID09IG1UZXN0T3V0cHV0c1tpXSkgcmV0dXJuIGk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKLQotLy8gLS0tCi0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphZGRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MpCi17Ci0gICAgb3V0cHV0RGVzYy0+bUlvSGFuZGxlID0gb3V0cHV0OwotICAgIG91dHB1dERlc2MtPm1JZCA9IG5leHRVbmlxdWVJZCgpOwotICAgIG1PdXRwdXRzLmFkZChvdXRwdXQsIG91dHB1dERlc2MpOwotICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphZGRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYykKLXsKLSAgICBpbnB1dERlc2MtPm1Jb0hhbmRsZSA9IGlucHV0OwotICAgIGlucHV0RGVzYy0+bUlkID0gbmV4dFVuaXF1ZUlkKCk7Ci0gICAgbUlucHV0cy5hZGQoaW5wdXQsIGlucHV0RGVzYyk7Ci0gICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmZpbmRJb0hhbmRsZXNCeUFkZHJlc3Moc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjIC8qaW4qLywKLSAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZSAvKmluKi8sCi0gICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcyAvKmluKi8sCi0gICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMgLypvdXQqLykgewotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQotICAgICAgICBkZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuZ2V0RGV2aWNlKGRldmljZSwgYWRkcmVzcyk7Ci0gICAgaWYgKGRldkRlc2MgIT0gMCkgewotICAgICAgICBBTE9HVigiZmluZElvSGFuZGxlc0J5QWRkcmVzcygpOiBhZGRpbmcgb3BlbmVkIG91dHB1dCAlZCBvbiBzYW1lIGFkZHJlc3MgJXMiLAotICAgICAgICAgICAgICBkZXNjLT5tSW9IYW5kbGUsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICBvdXRwdXRzLmFkZChkZXNjLT5tSW9IYW5kbGUpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MpCi17Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGRldkRlc2MtPm1EZXZpY2VUeXBlOwotICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYzsKLSAgICAvLyBlcmFzZSBhbGwgY3VycmVudCBzYW1wbGUgcmF0ZXMsIGZvcm1hdHMgYW5kIGNoYW5uZWwgbWFza3MKLSAgICBkZXZEZXNjLT5jbGVhckNhcGFiaWxpdGllcygpOwotCi0gICAgaWYgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKSB7Ci0gICAgICAgIC8vIGZpcnN0IGxpc3QgYWxyZWFkeSBvcGVuIG91dHB1dHMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiAoZGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiBkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VEaXN0aW5ndWlzaGVzT25BZGRyZXNzKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3BlbmVkIG91dHB1dCAlZCIsIG1PdXRwdXRzLmtleUF0KGkpKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobU91dHB1dHMua2V5QXQoaSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgIGNoZWNraW5nIGFkZHJlc3MgbWF0Y2ggZHVlIHRvIGRldmljZSAweCV4IiwgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgZmluZElvSGFuZGxlc0J5QWRkcmVzcyhkZXNjLCBkZXZpY2UsIGFkZHJlc3MsIG91dHB1dHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyB0aGVuIGxvb2sgZm9yIG91dHB1dCBwcm9maWxlcyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKLSAgICAgICAgU29ydGVkVmVjdG9yPCBzcDxJT1Byb2ZpbGU+ID4gcHJvZmlsZXM7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdOwotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhkZXZpY2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9PSBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1swXS0+bUFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChwcm9maWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJXp1IGZyb20gbW9kdWxlICV6dSIsIGosIGkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQUxPR1YoIiAgZm91bmQgJWQgcHJvZmlsZXMsICVkIG91dHB1dHMiLCBwcm9maWxlcy5zaXplKCksIG91dHB1dHMuc2l6ZSgpKTsKLQotICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpICYmIG91dHB1dHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IE5vIG91dHB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAlMDR4IiwgZGV2aWNlKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBvcGVuIG91dHB1dHMgZm9yIG1hdGNoaW5nIHByb2ZpbGVzIGlmIG5lZWRlZC4gRGlyZWN0IG91dHB1dHMgYXJlIGFsc28gb3BlbmVkIHRvCi0gICAgICAgIC8vIHF1ZXJ5IGZvciBkeW5hbWljIHBhcmFtZXRlcnMgYW5kIHdpbGwgYmUgY2xvc2VkIGxhdGVyIGJ5IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpCi0gICAgICAgIGZvciAoc3NpemVfdCBwcm9maWxlX2luZGV4ID0gMDsgcHJvZmlsZV9pbmRleCA8IChzc2l6ZV90KXByb2ZpbGVzLnNpemUoKTsgcHJvZmlsZV9pbmRleCsrKSB7Ci0gICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBwcm9maWxlc1twcm9maWxlX2luZGV4XTsKLQotICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyBpZiBvbmUgb3V0cHV0IGlzIGFscmVhZHkgb3BlbmVkIGZvciB0aGlzIHByb2ZpbGUKLSAgICAgICAgICAgIHNpemVfdCBqOwotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG91dHB1dHMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0cy5pdGVtQXQoaikpOwotICAgICAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgZGVzYy0+bVByb2ZpbGUgPT0gcHJvZmlsZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaGluZyBwcm9maWxlOiBzYXZlIHRoZSBzYW1wbGUgcmF0ZXMsIGZvcm1hdCBhbmQgY2hhbm5lbCBtYXNrcyBzdXBwb3J0ZWQKLSAgICAgICAgICAgICAgICAgICAgLy8gYnkgdGhlIHByb2ZpbGUgaW4gb3VyIGRldmljZSBkZXNjcmlwdG9yCi0gICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGogIT0gb3V0cHV0cy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQUxPR1YoIm9wZW5pbmcgb3V0cHV0IGZvciBkZXZpY2UgJTA4eCB3aXRoIHBhcmFtcyAlcyBwcm9maWxlICVwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSwgcHJvZmlsZS5nZXQoKSk7Ci0gICAgICAgICAgICBkZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihwcm9maWxlKTsKLSAgICAgICAgICAgIGRlc2MtPm1EZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7Ci0gICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBkZXNjLT5tU2FtcGxpbmdSYXRlOwotICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGRlc2MtPm1DaGFubmVsTWFzazsKLSAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBkZXNjLT5tRm9ybWF0OwotICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5zYW1wbGVfcmF0ZSA9IGRlc2MtPm1TYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmNoYW5uZWxfbWFzayA9IGRlc2MtPm1DaGFubmVsTWFzazsKLSAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uZm9ybWF0ID0gZGVzYy0+bUZvcm1hdDsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQocHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPm1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPm1MYXRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUZsYWdzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBkZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOwotICAgICAgICAgICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7Ci0gICAgICAgICAgICAgICAgZGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7Ci0KLSAgICAgICAgICAgICAgICAvLyBIZXJlIGlzIHdoZXJlIHRoZSBvdXRfc2V0X3BhcmFtZXRlcnMoKSBmb3IgY2FyZCAmIGRldmljZSBnZXRzIGNhbGxlZAotICAgICAgICAgICAgICAgIGlmICghYWRkcmVzcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoZGV2aWNlLCBhZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMob3V0cHV0LCBTdHJpbmc4KHBhcmFtKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZyZWUocGFyYW0pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIEhlcmUgaXMgd2hlcmUgd2Ugc3RlcCB0aHJvdWdoIGFuZCByZXNvbHZlIGFueSAiZHluYW1pYyIgZmllbGRzCi0gICAgICAgICAgICAgICAgU3RyaW5nOCByZXBseTsKLSAgICAgICAgICAgICAgICBjaGFyICp2YWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9TQU1QTElOR19SQVRFUykpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJwYnJrKChjaGFyICopcmVwbHkuc3RyaW5nKCksICI9Iik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5sb2FkU2FtcGxpbmdSYXRlcyh2YWx1ZSArIDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tRm9ybWF0c1swXSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgewotICAgICAgICAgICAgICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfRk9STUFUUykpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgc3VwcG9ydGVkIGZvcm1hdHMgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnBicmsoKGNoYXIgKilyZXBseS5zdHJpbmcoKSwgIj0iKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRGb3JtYXRzKHZhbHVlICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9DSEFOTkVMUykpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgc3VwcG9ydGVkIGNoYW5uZWwgbWFza3MgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnBicmsoKGNoYXIgKilyZXBseS5zdHJpbmcoKSwgIj0iKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRPdXRDaGFubmVscyh2YWx1ZSArIDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLnNpemUoKSA8IDIpKSB8fAotICAgICAgICAgICAgICAgICAgICAgKChwcm9maWxlLT5tRm9ybWF0c1swXSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZmlsZS0+bUZvcm1hdHMuc2l6ZSgpIDwgMikpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAoKHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgPCAyKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIG1pc3NpbmcgcGFyYW0iKTsKLSAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCB8fCBwcm9maWxlLT5tRm9ybWF0c1swXSA9PSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBwcm9maWxlLT5waWNrU2FtcGxpbmdSYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBwcm9maWxlLT5waWNrQ2hhbm5lbE1hc2soKTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IHByb2ZpbGUtPnBpY2tGb3JtYXQoKTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5zYW1wbGVfcmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5jaGFubmVsX21hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOwotICAgICAgICAgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KHByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYy0+bUxhdGVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1GbGFncyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgZGVzYyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2VEaXN0aW5ndWlzaGVzT25BZGRyZXNzKGRldmljZSkgJiYgYWRkcmVzcyAhPSAiMCIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtUG9saWN5TWl4ZXMuaW5kZXhPZktleShhZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvbGljeU1peGVzW2luZGV4XS0+bU91dHB1dCA9IGRlc2M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bVBvbGljeU1peCA9ICZtUG9saWN5TWl4ZXNbaW5kZXhdLT5tTWl4OwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgY2Fubm90IGZpbmQgcG9saWN5IGZvciBhZGRyZXNzICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBkdXBsaWNhdGVkIG91dHB1dCBmb3IgZGlyZWN0IG91dHB1dHMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRwdXRzIHVzZWQgYnkgZHluYW1pYyBwb2xpY3kgbWl4ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGR1cGxpY2F0ZWRPdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGluaXRpYWwgc3RyZWFtIHZvbHVtZSBmb3IgZGV2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0LCBkZXZpY2UsIDAsIHRydWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE86IGNvbmZpZ3VyZSBhdWRpbyBlZmZlY3Qgb3V0cHV0IHN0YWdlIGhlcmUKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3BlbiBhIGR1cGxpY2F0aW5nIG91dHB1dCB0aHJlYWQgZm9yIHRoZSBuZXcgb3V0cHV0IGFuZCB0aGUgcHJpbWFyeSBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZWRPdXRwdXQgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbkR1cGxpY2F0ZU91dHB1dChvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZWRPdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgZHVwbGljYXRlZCBvdXRwdXQgZGVzY3JpcHRvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZHVwT3V0cHV0RGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXVkaW9PdXRwdXREZXNjcmlwdG9yKE5VTEwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1PdXRwdXQxID0gbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1PdXRwdXQyID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gZGVzYy0+bVNhbXBsaW5nUmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tRm9ybWF0ID0gZGVzYy0+bUZvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBkZXNjLT5tQ2hhbm5lbE1hc2s7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bUxhdGVuY3kgPSBkZXNjLT5tTGF0ZW5jeTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRPdXRwdXQoZHVwbGljYXRlZE91dHB1dCwgZHVwT3V0cHV0RGVzYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKGR1cGxpY2F0ZWRPdXRwdXQsIGRldmljZSwgMCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBkdXAgb3V0cHV0IGZvciAlZCBhbmQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQsIG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMucmVtb3ZlSXRlbShvdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBvdXRwdXQgZm9yIGRldmljZSAleCIsIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZXMucmVtb3ZlQXQocHJvZmlsZV9pbmRleCk7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleC0tOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChvdXRwdXQpOwotICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKLQotICAgICAgICAgICAgICAgIGlmIChkZXZpY2VEaXN0aW5ndWlzaGVzT25BZGRyZXNzKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBzZXRPdXRwdXREZXZpY2UoZGV2PTB4JXgsIGFkZHI9JXMpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0LCBkZXZpY2UsIHRydWUvKmZvcmNlKi8sIDAvKmRlbGF5Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTC8qcGF0Y2ggaGFuZGxlKi8sIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBvdXRwdXQgJWQiLCBvdXRwdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBObyBvdXRwdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJTA0eCIsIGRldmljZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsgLy8gRGlzY29ubmVjdAotICAgICAgICAvLyBjaGVjayBpZiBvbmUgb3BlbmVkIG91dHB1dCBpcyBub3QgbmVlZGVkIGFueSBtb3JlIGFmdGVyIGRpc2Nvbm5lY3Rpbmcgb25lIGRldmljZQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBleGFjdCBtYXRjaCBvbiBkZXZpY2UKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhkZXZpY2UpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgPT0gZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICBmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKGRlc2MsIGRldmljZSwgYWRkcmVzcywgb3V0cHV0cyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKGRlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAmIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogZGlzY29ubmVjdGluZyBhZGRpbmcgb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cy5rZXlBdChpKSk7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2xlYXIgYW55IHByb2ZpbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlzY29ubmVjdGVkIGRldmljZS4KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXNbal07Ci0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiBkZXZpY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsZWFyaW5nIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSAlenUgb24gbW9kdWxlICV6dSIsIGosIGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmFkZCgwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0RFRkFVTFQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuYWRkKDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0lucHV0c0ZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgaW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzKQotewotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBkZXNjOwotICAgIGlmIChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkgewotICAgICAgICAvLyBmaXJzdCBsaXN0IGFscmVhZHkgb3BlbiBpbnB1dHMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCi0gICAgICAgIGZvciAoc2l6ZV90IGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgewotICAgICAgICAgICAgZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7Ci0gICAgICAgICAgICBpZiAoZGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiAoZGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBvcGVuZWQgaW5wdXQgJWQiLCBtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7Ci0gICAgICAgICAgICAgICBpbnB1dHMuYWRkKG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoZW4gbG9vayBmb3IgaW5wdXQgcHJvZmlsZXMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCi0gICAgICAgIFNvcnRlZFZlY3Rvcjwgc3A8SU9Qcm9maWxlPiA+IHByb2ZpbGVzOwotICAgICAgICBmb3IgKHNpemVfdCBtb2R1bGVfaWR4ID0gMDsgbW9kdWxlX2lkeCA8IG1Id01vZHVsZXMuc2l6ZSgpOyBtb2R1bGVfaWR4KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtSHdNb2R1bGVzW21vZHVsZV9pZHhdLT5tSGFuZGxlID09IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IHByb2ZpbGVfaW5kZXggPSAwOwotICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4IDwgbUh3TW9kdWxlc1ttb2R1bGVfaWR4XS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1ttb2R1bGVfaWR4XS0+bUlucHV0UHJvZmlsZXNbcHJvZmlsZV9pbmRleF07Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIChkZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VEaXN0aW5ndWlzaGVzT25BZGRyZXNzKGRldmljZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID09IHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzWzBdLT5tQWRkcmVzcykgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMuYWRkKHByb2ZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBwcm9maWxlICV6dSBmcm9tIG1vZHVsZSAlenUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCwgbW9kdWxlX2lkeCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpICYmIGlucHV0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBObyBpbnB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAweCVYIiwgZGV2aWNlKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBvcGVuIGlucHV0cyBmb3IgbWF0Y2hpbmcgcHJvZmlsZXMgaWYgbmVlZGVkLiBEaXJlY3QgaW5wdXRzIGFyZSBhbHNvIG9wZW5lZCB0bwotICAgICAgICAvLyBxdWVyeSBmb3IgZHluYW1pYyBwYXJhbWV0ZXJzIGFuZCB3aWxsIGJlIGNsb3NlZCBsYXRlciBieSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKQotICAgICAgICBmb3IgKHNzaXplX3QgcHJvZmlsZV9pbmRleCA9IDA7IHByb2ZpbGVfaW5kZXggPCAoc3NpemVfdClwcm9maWxlcy5zaXplKCk7IHByb2ZpbGVfaW5kZXgrKykgewotCi0gICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBwcm9maWxlc1twcm9maWxlX2luZGV4XTsKLSAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaWYgb25lIGlucHV0IGlzIGFscmVhZHkgb3BlbmVkIGZvciB0aGlzIHByb2ZpbGUKLSAgICAgICAgICAgIHNpemVfdCBpbnB1dF9pbmRleDsKLSAgICAgICAgICAgIGZvciAoaW5wdXRfaW5kZXggPSAwOyBpbnB1dF9pbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbnB1dF9pbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc2MtPm1Qcm9maWxlID09IHByb2ZpbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlucHV0X2luZGV4ICE9IG1JbnB1dHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFMT0dWKCJvcGVuaW5nIGlucHV0IGZvciBkZXZpY2UgMHglWCB3aXRoIHBhcmFtcyAlcyIsIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBkZXNjID0gbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKHByb2ZpbGUpOwotICAgICAgICAgICAgZGVzYy0+bURldmljZSA9IGRldmljZTsKLSAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKLSAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IGRlc2MtPm1TYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gZGVzYy0+bUNoYW5uZWxNYXNrOwotICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IGRlc2MtPm1Gb3JtYXQ7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5JbnB1dChwcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUgLypGSVhNRSovKTsKLQotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGRlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7Ci0gICAgICAgICAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKLSAgICAgICAgICAgICAgICBkZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKLQotICAgICAgICAgICAgICAgIGlmICghYWRkcmVzcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoZGV2aWNlLCBhZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXQsIFN0cmluZzgocGFyYW0pKTsKLSAgICAgICAgICAgICAgICAgICAgZnJlZShwYXJhbSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gSGVyZSBpcyB3aGVyZSB3ZSBzdGVwIHRocm91Z2ggYW5kIHJlc29sdmUgYW55ICJkeW5hbWljIiBmaWVsZHMKLSAgICAgICAgICAgICAgICBTdHJpbmc4IHJlcGx5OwotICAgICAgICAgICAgICAgIGNoYXIgKnZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfU0FNUExJTkdfUkFURVMpKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgZGlyZWN0IGlucHV0IHN1cCBzYW1wbGluZyByYXRlcyAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZFNhbXBsaW5nUmF0ZXModmFsdWUgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfRk9STUFUUykpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBkaXJlY3QgaW5wdXQgc3VwIGZvcm1hdHMgJXMiLCByZXBseS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEZvcm1hdHModmFsdWUgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfQ0hBTk5FTFMpKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgZGlyZWN0IGlucHV0IHN1cCBjaGFubmVsIG1hc2tzICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJwYnJrKChjaGFyICopcmVwbHkuc3RyaW5nKCksICI9Iik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5sb2FkSW5DaGFubmVscyh2YWx1ZSArIDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApICYmIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgPCAyKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICgocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gMCkgJiYgKHByb2ZpbGUtPm1Gb3JtYXRzLnNpemUoKSA8IDIpKSB8fAotICAgICAgICAgICAgICAgICAgICAgKChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApICYmIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLnNpemUoKSA8IDIpKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBkaXJlY3QgaW5wdXQgbWlzc2luZyBwYXJhbSIpOwotICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VJbnB1dChpbnB1dCk7Ci0gICAgICAgICAgICAgICAgICAgIGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlucHV0ICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkSW5wdXQoaW5wdXQsIGRlc2MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gLy8gZW5kaWYgaW5wdXQgIT0gMAotCi0gICAgICAgICAgICBpZiAoaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBpbnB1dCBmb3IgZGV2aWNlIDB4JVgiLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJlbW92ZUF0KHByb2ZpbGVfaW5kZXgpOwotICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgtLTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW5wdXRzLmFkZChpbnB1dCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBpbnB1dCAlZCIsIGlucHV0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAvLyBlbmQgc2NhbiBwcm9maWxlcwotCi0gICAgICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBObyBpbnB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAweCVYIiwgZGV2aWNlKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBEaXNjb25uZWN0Ci0gICAgICAgIC8vIGNoZWNrIGlmIG9uZSBvcGVuZWQgaW5wdXQgaXMgbm90IG5lZWRlZCBhbnkgbW9yZSBhZnRlciBkaXNjb25uZWN0aW5nIG9uZSBkZXZpY2UKLSAgICAgICAgZm9yIChzaXplX3QgaW5wdXRfaW5kZXggPSAwOyBpbnB1dF9pbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbnB1dF9pbmRleCsrKSB7Ci0gICAgICAgICAgICBkZXNjID0gbUlucHV0cy52YWx1ZUF0KGlucHV0X2luZGV4KTsKLSAgICAgICAgICAgIGlmICghKGRlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYKLSAgICAgICAgICAgICAgICAgICAgfkFVRElPX0RFVklDRV9CSVRfSU4pKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGRpc2Nvbm5lY3RpbmcgYWRkaW5nIGlucHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7Ci0gICAgICAgICAgICAgICAgaW5wdXRzLmFkZChtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2xlYXIgYW55IHByb2ZpbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGlzY29ubmVjdGVkIGRldmljZS4KLSAgICAgICAgZm9yIChzaXplX3QgbW9kdWxlX2luZGV4ID0gMDsgbW9kdWxlX2luZGV4IDwgbUh3TW9kdWxlcy5zaXplKCk7IG1vZHVsZV9pbmRleCsrKSB7Ci0gICAgICAgICAgICBpZiAobUh3TW9kdWxlc1ttb2R1bGVfaW5kZXhdLT5tSGFuZGxlID09IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoc2l6ZV90IHByb2ZpbGVfaW5kZXggPSAwOwotICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4IDwgbUh3TW9kdWxlc1ttb2R1bGVfaW5kZXhdLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgrKykgewotICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG1Id01vZHVsZXNbbW9kdWxlX2luZGV4XS0+bUlucHV0UHJvZmlsZXNbcHJvZmlsZV9pbmRleF07Ci0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiBkZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogY2xlYXJpbmcgZGlyZWN0IGlucHV0IHByb2ZpbGUgJXp1IG9uIG1vZHVsZSAlenUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LCBtb2R1bGVfaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmFkZCgwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0RFRkFVTFQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuYWRkKDApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSAvLyBlbmQgZGlzY29ubmVjdAotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCi17Ci0gICAgQUxPR1YoImNsb3NlT3V0cHV0KCVkKSIsIG91dHB1dCk7Ci0KLSAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgIGlmIChvdXRwdXREZXNjID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coImNsb3NlT3V0cHV0KCkgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUG9saWN5TWl4ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1Qb2xpY3lNaXhlc1tpXS0+bU91dHB1dCA9PSBvdXRwdXREZXNjKSB7Ci0gICAgICAgICAgICBtUG9saWN5TWl4ZXNbaV0tPm1PdXRwdXQuY2xlYXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGxvb2sgZm9yIGR1cGxpY2F0ZWQgb3V0cHV0cyBjb25uZWN0ZWQgdG8gdGhlIG91dHB1dCBiZWluZyByZW1vdmVkLgotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkdXBPdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKGR1cE91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpICYmCi0gICAgICAgICAgICAgICAgKGR1cE91dHB1dERlc2MtPm1PdXRwdXQxID09IG91dHB1dERlc2MgfHwKLSAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MiA9PSBvdXRwdXREZXNjKSkgewotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjMjsKLSAgICAgICAgICAgIGlmIChkdXBPdXRwdXREZXNjLT5tT3V0cHV0MSA9PSBvdXRwdXREZXNjKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYzIgPSBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYzIgPSBkdXBPdXRwdXREZXNjLT5tT3V0cHV0MTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEFzIGFsbCBhY3RpdmUgdHJhY2tzIG9uIGR1cGxpY2F0ZWQgb3V0cHV0IHdpbGwgYmUgZGVsZXRlZCwKLSAgICAgICAgICAgIC8vIGFuZCBhcyB0aGV5IHdlcmUgYWxzbyByZWZlcmVuY2VkIG9uIHRoZSBvdGhlciBvdXRwdXQsIHRoZSByZWZlcmVuY2UKLSAgICAgICAgICAgIC8vIGNvdW50IGZvciB0aGVpciBzdHJlYW0gdHlwZSBtdXN0IGJlIGFkanVzdGVkIGFjY29yZGluZ2x5IG9uCi0gICAgICAgICAgICAvLyB0aGUgb3RoZXIgb3V0cHV0LgotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBBVURJT19TVFJFQU1fQ05UOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgcmVmQ291bnQgPSBkdXBPdXRwdXREZXNjLT5tUmVmQ291bnRbal07Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYzItPmNoYW5nZVJlZkNvdW50KChhdWRpb19zdHJlYW1fdHlwZV90KWosLXJlZkNvdW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGR1cGxpY2F0ZWRPdXRwdXQgPSBtT3V0cHV0cy5rZXlBdChpKTsKLSAgICAgICAgICAgIEFMT0dWKCJjbG9zZU91dHB1dCgpIGNsb3NpbmcgYWxzbyBkdXBsaWNhdGVkIG91dHB1dCAlZCIsIGR1cGxpY2F0ZWRPdXRwdXQpOwotCi0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQoZHVwbGljYXRlZE91dHB1dCk7Ci0gICAgICAgICAgICBtT3V0cHV0cy5yZW1vdmVJdGVtKGR1cGxpY2F0ZWRPdXRwdXQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkob3V0cHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7Ci0gICAgICAgIG1BdWRpb1BhdGNoZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7Ci0gICAgfQotCi0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07Ci0gICAgcGFyYW0uYWRkKFN0cmluZzgoImNsb3NpbmciKSwgU3RyaW5nOCgidHJ1ZSIpKTsKLSAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhvdXRwdXQsIHBhcmFtLnRvU3RyaW5nKCkpOwotCi0gICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7Ci0gICAgbU91dHB1dHMucmVtb3ZlSXRlbShvdXRwdXQpOwotICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCi17Ci0gICAgQUxPR1YoImNsb3NlSW5wdXQoJWQpIiwgaW5wdXQpOwotCi0gICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoaW5wdXQpOwotICAgIGlmIChpbnB1dERlc2MgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygiY2xvc2VJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOwotICAgICAgICBtQXVkaW9QYXRjaGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgIH0KLQotICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KGlucHV0KTsKLSAgICBtSW5wdXRzLnJlbW92ZUl0ZW0oaW5wdXQpOwotfQotCi1Tb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0c0ZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+ID4gb3Blbk91dHB1dHMpCi17Ci0gICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzOwotCi0gICAgQUxPR1ZWKCJnZXRPdXRwdXRzRm9yRGV2aWNlKCkgZGV2aWNlICUwNHgiLCBkZXZpY2UpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3Blbk91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgQUxPR1ZWKCJvdXRwdXQgJWQgaXNEdXBsaWNhdGVkPSVkIGRldmljZT0lMDR4IiwKLSAgICAgICAgICAgICAgICBpLCBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5pc0R1cGxpY2F0ZWQoKSwgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+c3VwcG9ydGVkRGV2aWNlcygpKTsKLSAgICAgICAgaWYgKChkZXZpY2UgJiBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5zdXBwb3J0ZWREZXZpY2VzKCkpID09IGRldmljZSkgewotICAgICAgICAgICAgQUxPR1ZWKCJnZXRPdXRwdXRzRm9yRGV2aWNlKCkgZm91bmQgb3V0cHV0ICVkIiwgb3Blbk91dHB1dHMua2V5QXQoaSkpOwotICAgICAgICAgICAgb3V0cHV0cy5hZGQob3Blbk91dHB1dHMua2V5QXQoaSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBvdXRwdXRzOwotfQotCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6dmVjdG9yc0VxdWFsKFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMikKLXsKLSAgICBpZiAob3V0cHV0czEuc2l6ZSgpICE9IG91dHB1dHMyLnNpemUoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0czEuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG91dHB1dHMxW2ldICE9IG91dHB1dHMyW2ldKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dEZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCi17Ci0gICAgYXVkaW9fZGV2aWNlc190IG9sZERldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCB0cnVlIC8qZnJvbUNhY2hlKi8pOwotICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzcmNPdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShvbGREZXZpY2UsIG1QcmV2aW91c091dHB1dHMpOwotICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZHN0T3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UobmV3RGV2aWNlLCBtT3V0cHV0cyk7Ci0KLSAgICAvLyBhbHNvIHRha2UgaW50byBhY2NvdW50IGV4dGVybmFsIHBvbGljeS1yZWxhdGVkIGNoYW5nZXM6IGFkZCBhbGwgb3V0cHV0cyB3aGljaCBhcmUKLSAgICAvLyBhc3NvY2lhdGVkIHdpdGggcG9saWNpZXMgaW4gdGhlICJiZWZvcmUiIGFuZCAiYWZ0ZXIiIG91dHB1dCB2ZWN0b3JzCi0gICAgQUxPR1ZWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCk6IHBvbGljeSByZWxhdGVkIG91dHB1dHMiKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMCA7IGkgPCBtUHJldmlvdXNPdXRwdXRzLnNpemUoKSA7IGkrKykgewotICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtUHJldmlvdXNPdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChkZXNjICE9IDAgJiYgZGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzcmNPdXRwdXRzLmFkZChkZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgQUxPR1ZWKCIgcHJldmlvdXMgb3V0cHV0czogYWRkaW5nICVkIiwgZGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMCA7IGkgPCBtT3V0cHV0cy5zaXplKCkgOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKGRlc2MgIT0gMCAmJiBkZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRzdE91dHB1dHMuYWRkKGRlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICBBTE9HVlYoIiBuZXcgb3V0cHV0czogYWRkaW5nICVkIiwgZGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghdmVjdG9yc0VxdWFsKHNyY091dHB1dHMsZHN0T3V0cHV0cykpIHsKLSAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBzdHJhdGVneSAlZCwgbW92aW5nIGZyb20gb3V0cHV0ICVkIHRvIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgIHN0cmF0ZWd5LCBzcmNPdXRwdXRzWzBdLCBkc3RPdXRwdXRzWzBdKTsKLSAgICAgICAgLy8gbXV0ZSBzdHJhdGVneSB3aGlsZSBtb3ZpbmcgdHJhY2tzIGZyb20gb25lIG91dHB1dCB0byBhbm90aGVyCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3JjT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Ioc3JjT3V0cHV0c1tpXSk7Ci0gICAgICAgICAgICBpZiAoZGVzYy0+aXNTdHJhdGVneUFjdGl2ZShzdHJhdGVneSkpIHsKLSAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyYXRlZ3ksIHRydWUsIHNyY091dHB1dHNbaV0pOwotICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzdHJhdGVneSwgZmFsc2UsIHNyY091dHB1dHNbaV0sIE1VVEVfVElNRV9NUywgbmV3RGV2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1vdmUgZWZmZWN0cyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyYXRlZ3kgZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAotICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEpIHsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGZ4T3V0cHV0ID0gc2VsZWN0T3V0cHV0Rm9yRWZmZWN0cyhkc3RPdXRwdXRzKTsKLSAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gbW92ZWQ7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IG1FZmZlY3RzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVmZmVjdERlc2MtPm1TZXNzaW9uID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bUlvICE9IGZ4T3V0cHV0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtb3ZlZC5pbmRleE9mKGVmZmVjdERlc2MtPm1JbykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIG1vdmluZyBlZmZlY3QgJWQgdG8gb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZmZlY3RzLmtleUF0KGkpLCBmeE91dHB1dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+bW92ZUVmZmVjdHMoQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCBlZmZlY3REZXNjLT5tSW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnhPdXRwdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbW92ZWQuYWRkKGVmZmVjdERlc2MtPm1Jbyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bUlvID0gZnhPdXRwdXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIE1vdmUgdHJhY2tzIGFzc29jaWF0ZWQgdG8gdGhpcyBzdHJhdGVneSBmcm9tIHByZXZpb3VzIG91dHB1dCB0byBuZXcgb3V0cHV0Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpKSA9PSBzdHJhdGVneSkgewotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKChhdWRpb19zdHJlYW1fdHlwZV90KWkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKLXsKLSAgICBpZiAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKQotICAgICAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUpOwotICAgIGlmIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dICE9IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpCi0gICAgICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSk7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04pOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfQUNDRVNTSUJJTElUWSk7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSk7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9EVE1GKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1JFUk9VVElORyk7Ci19Ci0KLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0QTJkcE91dHB1dCgpCi17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpICYmIG91dHB1dERlc2MtPmRldmljZSgpICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCkgewotICAgICAgICAgICAgcmV0dXJuIG1PdXRwdXRzLmtleUF0KGkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0EyZHBTdXNwZW5kKCkKLXsKLSAgICBhdWRpb19pb19oYW5kbGVfdCBhMmRwT3V0cHV0ID0gZ2V0QTJkcE91dHB1dCgpOwotICAgIGlmIChhMmRwT3V0cHV0ID09IDApIHsKLSAgICAgICAgbUEyZHBTdXNwZW5kZWQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGJvb2wgaXNTY29Db25uZWN0ZWQgPQotICAgICAgICAgICAgKChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUICYKLSAgICAgICAgICAgICAgICAgICAgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApIHx8Ci0gICAgICAgICAgICAoKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9TQ08pICE9IDApOwotICAgIC8vIHN1c3BlbmQgQTJEUCBvdXRwdXQgaWY6Ci0gICAgLy8gICAgICAoTk9UIGFscmVhZHkgc3VzcGVuZGVkKSAmJgotICAgIC8vICAgICAgKChTQ08gZGV2aWNlIGlzIGNvbm5lY3RlZCAmJgotICAgIC8vICAgICAgIChmb3JjZWQgdXNhZ2UgZm9yIGNvbW11bmljYXRpb24gfHwgZm9yIHJlY29yZCBpcyBTQ08pKSkgfHwKLSAgICAvLyAgICAgIChwaG9uZSBzdGF0ZSBpcyByaW5naW5nIHx8IGluIGNhbGwpCi0gICAgLy8KLSAgICAvLyByZXN0b3JlIEEyRFAgb3V0cHV0IGlmOgotICAgIC8vICAgICAgKEFscmVhZHkgc3VzcGVuZGVkKSAmJgotICAgIC8vICAgICAgKChTQ08gZGV2aWNlIGlzIE5PVCBjb25uZWN0ZWQgfHwKLSAgICAvLyAgICAgICAoZm9yY2VkIHVzYWdlIE5PVCBmb3IgY29tbXVuaWNhdGlvbiAmJiBOT1QgZm9yIHJlY29yZCBpcyBTQ08pKSkgJiYKLSAgICAvLyAgICAgIChwaG9uZSBzdGF0ZSBpcyBOT1QgcmluZ2luZyAmJiBOT1QgaW4gY2FsbCkKLSAgICAvLwotICAgIGlmIChtQTJkcFN1c3BlbmRlZCkgewotICAgICAgICBpZiAoKCFpc1Njb0Nvbm5lY3RlZCB8fAotICAgICAgICAgICAgICgobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgJiYKLSAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRF0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykpKSAmJgotICAgICAgICAgICAgICgobVBob25lU3RhdGUgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSAmJgotICAgICAgICAgICAgICAobVBob25lU3RhdGUgIT0gQVVESU9fTU9ERV9SSU5HVE9ORSkpKSB7Ci0KLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZXN0b3JlT3V0cHV0KGEyZHBPdXRwdXQpOwotICAgICAgICAgICAgbUEyZHBTdXNwZW5kZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICgoaXNTY29Db25uZWN0ZWQgJiYKLSAgICAgICAgICAgICAoKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHx8Ci0gICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pKSkgfHwKLSAgICAgICAgICAgICAoKG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgfHwKLSAgICAgICAgICAgICAgKG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfUklOR1RPTkUpKSkgewotCi0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3VzcGVuZE91dHB1dChhMmRwT3V0cHV0KTsKLSAgICAgICAgICAgIG1BMmRwU3VzcGVuZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TmV3T3V0cHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgYm9vbCBmcm9tQ2FjaGUpCi17Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwotCi0gICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkob3V0cHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQpIHsKLSAgICAgICAgICAgIEFMT0dWKCJnZXROZXdPdXRwdXREZXZpY2UoKSBkZXZpY2UgJTA4eCBmb3JjZWQgYnkgcGF0Y2ggJWQiLAotICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlKCksIG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICByZXR1cm4gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBjaGVjayB0aGUgZm9sbG93aW5nIGJ5IG9yZGVyIG9mIHByaW9yaXR5IHRvIHJlcXVlc3QgYSByb3V0aW5nIGNoYW5nZSBpZiBuZWNlc3Nhcnk6Ci0gICAgLy8gMTogdGhlIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUgaXMgYWN0aXZlIGFuZCBlbmZvcmNlZCBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgZW5mb3JjZWQgYXVkaWJsZQotICAgIC8vIDI6IHdlIGFyZSBpbiBjYWxsIG9yIHRoZSBzdHJhdGVneSBwaG9uZSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IHBob25lCi0gICAgLy8gMzogdGhlIHN0cmF0ZWd5IGZvciBlbmZvcmNlZCBhdWRpYmxlIGlzIGFjdGl2ZSBidXQgbm90IGVuZm9yY2VkIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgdGhlIGRldmljZSBmb3Igc3RyYXRlZ3kgZW5mb3JjZWQgYXVkaWJsZQotICAgIC8vIDQ6IHRoZSBzdHJhdGVneSBzb25pZmljYXRpb24gaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBzb25pZmljYXRpb24KLSAgICAvLyA1OiB0aGUgc3RyYXRlZ3kgInJlc3BlY3RmdWwiIHNvbmlmaWNhdGlvbiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5ICJyZXNwZWN0ZnVsIiBzb25pZmljYXRpb24KLSAgICAvLyA2OiB0aGUgc3RyYXRlZ3kgYWNjZXNzaWJpbGl0eSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGFjY2Vzc2liaWxpdHkKLSAgICAvLyA3OiB0aGUgc3RyYXRlZ3kgbWVkaWEgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBtZWRpYQotICAgIC8vIDg6IHRoZSBzdHJhdGVneSBEVE1GIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgRFRNRgotICAgIC8vIDk6IHRoZSBzdHJhdGVneSBmb3IgYmVhY29uLCBhLmsuYS4gInRyYW5zbWl0dGVkIHRocm91Z2ggc3BlYWtlciIgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSB0LXQtcwotICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpICYmCi0gICAgICAgIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNJbkNhbGwoKSB8fAotICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX1BIT05FKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSkpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfQUNDRVNTSUJJTElUWSkpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfQUNDRVNTSUJJTElUWSwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfTUVESUEpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9EVE1GKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9EVE1GLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAob3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoU1RSQVRFR1lfUkVST1VUSU5HKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9SRVJPVVRJTkcsIGZyb21DYWNoZSk7Ci0gICAgfQotCi0gICAgQUxPR1YoImdldE5ld091dHB1dERldmljZSgpIHNlbGVjdGVkIGRldmljZSAleCIsIGRldmljZSk7Ci0gICAgcmV0dXJuIGRldmljZTsKLX0KLQotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TmV3SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpCi17Ci0gICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoaW5wdXQpOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVVpZCAhPSBtVWlkQ2FjaGVkKSB7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0TmV3SW5wdXREZXZpY2UoKSBkZXZpY2UgJTA4eCBmb3JjZWQgYnkgcGF0Y2ggJWQiLAotICAgICAgICAgICAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlLCBpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICByZXR1cm4gaW5wdXREZXNjLT5tRGV2aWNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGlucHV0RGVzYy0+bUlucHV0U291cmNlKTsKLQotICAgIEFMT0dWKCJnZXROZXdJbnB1dERldmljZSgpIHNlbGVjdGVkIGRldmljZSAleCIsIGRldmljZSk7Ci0gICAgcmV0dXJuIGRldmljZTsKLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgewotICAgIHJldHVybiAodWludDMyX3QpZ2V0U3RyYXRlZ3koc3RyZWFtKTsKLX0KLQotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgewotICAgIC8vIEJ5IGNoZWNraW5nIHRoZSByYW5nZSBvZiBzdHJlYW0gYmVmb3JlIGNhbGxpbmcgZ2V0U3RyYXRlZ3ksIHdlIGF2b2lkCi0gICAgLy8gZ2V0U3RyYXRlZ3kncyBiZWhhdmlvciBmb3IgaW52YWxpZCBzdHJlYW1zLiAgZ2V0U3RyYXRlZ3kgd291bGQgZG8gYSBBTE9HRQotICAgIC8vIGFuZCB0aGVuIHJldHVybiBTVFJBVEVHWV9NRURJQSwgYnV0IHdlIHdhbnQgdG8gcmV0dXJuIHRoZSBlbXB0eSBzZXQuCi0gICAgaWYgKHN0cmVhbSA8IChhdWRpb19zdHJlYW1fdHlwZV90KSAwIHx8IHN0cmVhbSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewotICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgfQotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzOwotICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6cm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7Ci0gICAgZGV2aWNlcyA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCB0cnVlIC8qZnJvbUNhY2hlKi8pOwotICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UoZGV2aWNlcywgbU91dHB1dHMpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXRzW2ldKTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoc3RyYXRlZ3kpKSB7Ci0gICAgICAgICAgICBkZXZpY2VzID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qRmlsdGVyIFNQRUFLRVJfU0FGRSBvdXQgb2YgcmVzdWx0cywgYXMgQXVkaW9TZXJ2aWNlIGRvZXNuJ3Qga25vdyBhYm91dCBpdAotICAgICAgYW5kIGRvZXNuJ3QgcmVhbGx5IG5lZWQgdG8uKi8KLSAgICBpZiAoZGV2aWNlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSB7Ci0gICAgICAgIGRldmljZXMgfD0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwotICAgICAgICBkZXZpY2VzICY9IH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZGV2aWNlczsKLX0KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyb3V0aW5nX3N0cmF0ZWd5IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyYXRlZ3koCi0gICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7Ci0KLSAgICBBTE9HX0FTU0VSVChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX1BBVENILCJnZXRTdHJhdGVneSgpIGNhbGxlZCBmb3IgQVVESU9fU1RSRUFNX1BBVENIIik7Ci0KLSAgICAvLyBzdHJlYW0gdG8gc3RyYXRlZ3kgbWFwcGluZwotICAgIHN3aXRjaCAoc3RyZWFtKSB7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDoKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfUEhPTkU7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fUklORzoKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9BTEFSTToKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX1NPTklGSUNBVElPTjsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT046Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9EVE1GOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfRFRNRjsKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HRSgidW5rbm93biBzdHJlYW0gdHlwZSAlZCIsIHN0cmVhbSk7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fU1lTVEVNOgotICAgICAgICAvLyBOT1RFOiBTWVNURU0gc3RyZWFtIHVzZXMgTUVESUEgc3RyYXRlZ3kgYmVjYXVzZSBtdXRpbmcgbXVzaWMgYW5kIHN3aXRjaGluZyBvdXRwdXRzCi0gICAgICAgIC8vIHdoaWxlIGtleSBjbGlja3MgYXJlIHBsYXllZCBwcm9kdWNlcyBhIHBvb3IgcmVzdWx0Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9NRURJQTsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRTsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9UVFM6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVI7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWToKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFk7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fUkVST1VUSU5HOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfUkVST1VUSU5HOwotICAgIH0KLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJhdGVneUZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKSB7Ci0gICAgLy8gZmxhZ3MgdG8gc3RyYXRlZ3kgbWFwcGluZwotICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0JFQUNPTikgPT0gQVVESU9fRkxBR19CRUFDT04pIHsKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSOwotICAgIH0KLSAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSA9PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpIHsKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRTsKLSAgICB9Ci0KLSAgICAvLyB1c2FnZSB0byBzdHJhdGVneSBtYXBwaW5nCi0gICAgc3dpdGNoIChhdHRyLT51c2FnZSkgewotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgotICAgICAgICBpZiAoaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX1JJTkcpIHx8IGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9BTEFSTSkpIHsKLSAgICAgICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX1NPTklGSUNBVElPTjsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNJbkNhbGwoKSkgewotICAgICAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfUEhPTkU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfQUNDRVNTSUJJTElUWTsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046Ci0gICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX01FRElBOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgotICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9QSE9ORTsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgotICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9EVE1GOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6Ci0gICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX1NPTklGSUNBVElPTjsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgotICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gKHVpbnQzMl90KSBTVFJBVEVHWV9NRURJQTsKLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7Ci0gICAgc3dpdGNoKHN0cmVhbSkgewotICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgotICAgICAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKTsKLSAgICAgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNBbnlPdXRwdXRBY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1Ub0lnbm9yZSkgewotICAgIGZvciAoc2l6ZV90IHMgPSAwIDsgcyA8IEFVRElPX1NUUkVBTV9DTlQgOyBzKyspIHsKLSAgICAgICAgaWYgKHMgPT0gKHNpemVfdCkgc3RyZWFtVG9JZ25vcmUpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3NdICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlRXZlbnRGb3JCZWFjb24oaW50IGV2ZW50KSB7Ci0gICAgc3dpdGNoKGV2ZW50KSB7Ci0gICAgY2FzZSBTVEFSVElOR19PVVRQVVQ6Ci0gICAgICAgIG1CZWFjb25NdXRlUmVmQ291bnQrKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTVE9QUElOR19PVVRQVVQ6Ci0gICAgICAgIGlmIChtQmVhY29uTXV0ZVJlZkNvdW50ID4gMCkgewotICAgICAgICAgICAgbUJlYWNvbk11dGVSZWZDb3VudC0tOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU1RBUlRJTkdfQkVBQ09OOgotICAgICAgICBtQmVhY29uUGxheWluZ1JlZkNvdW50Kys7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgU1RPUFBJTkdfQkVBQ09OOgotICAgICAgICBpZiAobUJlYWNvblBsYXlpbmdSZWZDb3VudCA+IDApIHsKLSAgICAgICAgICAgIG1CZWFjb25QbGF5aW5nUmVmQ291bnQtLTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAobUJlYWNvbk11dGVSZWZDb3VudCA+IDApIHsKLSAgICAgICAgLy8gYW55IHBsYXliYWNrIGNhdXNlcyBiZWFjb24gdG8gYmUgbXV0ZWQKLSAgICAgICAgcmV0dXJuIHNldEJlYWNvbk11dGUodHJ1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gbm8gb3RoZXIgcGxheWJhY2s6IHVubXV0ZSB3aGVuIGJlYWNvbiBzdGFydHMgcGxheWluZywgbXV0ZSB3aGVuIGl0IHN0b3BzCi0gICAgICAgIHJldHVybiBzZXRCZWFjb25NdXRlKG1CZWFjb25QbGF5aW5nUmVmQ291bnQgPT0gMCk7Ci0gICAgfQotfQotCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEJlYWNvbk11dGUoYm9vbCBtdXRlKSB7Ci0gICAgQUxPR1YoInNldEJlYWNvbk11dGUoJWQpIG1CZWFjb25NdXRlUmVmQ291bnQ9JWQgbUJlYWNvblBsYXlpbmdSZWZDb3VudD0lZCIsCi0gICAgICAgICAgICBtdXRlLCBtQmVhY29uTXV0ZVJlZkNvdW50LCBtQmVhY29uUGxheWluZ1JlZkNvdW50KTsKLSAgICAvLyBrZWVwIHRyYWNrIG9mIG11dGVkIHN0YXRlIHRvIGF2b2lkIHJlcGVhdGluZyBtdXRlL3VubXV0ZSBvcGVyYXRpb25zCi0gICAgaWYgKG1CZWFjb25NdXRlZCAhPSBtdXRlKSB7Ci0gICAgICAgIC8vIG11dGUvdW5tdXRlIEFVRElPX1NUUkVBTV9UVFMgb24gYWxsIG91dHB1dHMKLSAgICAgICAgQUxPR1YoIlx0IG11dGluZyAlZCIsIG11dGUpOwotICAgICAgICB1aW50MzJfdCBtYXhMYXRlbmN5ID0gMDsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgIHNldFN0cmVhbU11dGUoQVVESU9fU1RSRUFNX1RUUywgbXV0ZS8qb24qLywKLSAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAwIC8qZGVsYXkqLywgQVVESU9fREVWSUNFX05PTkUpOwotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbGF0ZW5jeSA9IGRlc2MtPmxhdGVuY3koKSAqIDI7Ci0gICAgICAgICAgICBpZiAobGF0ZW5jeSA+IG1heExhdGVuY3kpIHsKLSAgICAgICAgICAgICAgICBtYXhMYXRlbmN5ID0gbGF0ZW5jeTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtQmVhY29uTXV0ZWQgPSBtdXRlOwotICAgICAgICByZXR1cm4gbWF4TGF0ZW5jeTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpCi17Ci0gICAgdWludDMyX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7Ci0KLSAgICBpZiAoZnJvbUNhY2hlKSB7Ci0gICAgICAgIEFMT0dWVigiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBmcm9tIGNhY2hlIHN0cmF0ZWd5ICVkLCBkZXZpY2UgJXgiLAotICAgICAgICAgICAgICBzdHJhdGVneSwgbURldmljZUZvclN0cmF0ZWd5W3N0cmF0ZWd5XSk7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlRm9yU3RyYXRlZ3lbc3RyYXRlZ3ldOwotICAgIH0KLSAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOwotICAgIHN3aXRjaCAoc3RyYXRlZ3kpIHsKLQotICAgIGNhc2UgU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSOgotICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKLSAgICAgICAgaWYgKCFkZXZpY2UpIHsKLSAgICAgICAgICAgIEFMT0dFKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIG5vIGRldmljZSBmb3VuZCBmb3IgIlwKLSAgICAgICAgICAgICAgICAgICAgIlNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiIpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTDoKLSAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoaXNTdHJlYW1BY3RpdmVSZW1vdGVseShBVURJT19TVFJFQU1fTVVTSUMsCi0gICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpKSB7Ci0gICAgICAgICAgICAvLyB3aGlsZSBtZWRpYSBpcyBwbGF5aW5nIG9uIGEgcmVtb3RlIGRldmljZSwgdXNlIHRoZSB0aGUgc29uaWZpY2F0aW9uIGJlaGF2aW9yLgotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIHRlc3QgdGhpcyB1c2VjYXNlIGJlZm9yZSB0ZXN0aW5nIGlmIG1lZGlhIGlzIHBsYXlpbmcgYmVjYXVzZQotICAgICAgICAgICAgLy8gICB0aGUgaXNTdHJlYW1BY3RpdmUoKSBtZXRob2Qgb25seSBpbmZvcm1zIGFib3V0IHRoZSBhY3Rpdml0eSBvZiBhIHN0cmVhbSwgbm90Ci0gICAgICAgICAgICAvLyAgIGlmIGl0J3MgZm9yIGxvY2FsIHBsYXliYWNrLiBOb3RlIGFsc28gdGhhdCB3ZSB1c2UgdGhlIHNhbWUgZGVsYXkgYmV0d2VlbiBib3RoIHRlc3RzCi0gICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICAgICAgLy91c2VyICJzYWZlIiBzcGVha2VyIGlmIGF2YWlsYWJsZSBpbnN0ZWFkIG9mIG5vcm1hbCBzcGVha2VyIHRvIGF2b2lkIHRyaWdnZXJpbmcKLSAgICAgICAgICAgIC8vb3RoZXIgYWNvdXN0aWMgc2FmZXR5IG1lY2hhbmlzbXMgZm9yIG5vdGlmaWNhdGlvbgotICAgICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIgJiYgKGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpKQotICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFOwotICAgICAgICB9IGVsc2UgaWYgKGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpKSB7Ci0gICAgICAgICAgICAvLyB3aGlsZSBtZWRpYSBpcyBwbGF5aW5nIChvciBoYXMgcmVjZW50bHkgcGxheWVkKSwgdXNlIHRoZSBzYW1lIGRldmljZQotICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gd2hlbiBtZWRpYSBpcyBub3QgcGxheWluZyBhbnltb3JlLCBmYWxsIGJhY2sgb24gdGhlIHNvbmlmaWNhdGlvbiBiZWhhdmlvcgotICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgICAgIC8vdXNlciAic2FmZSIgc3BlYWtlciBpZiBhdmFpbGFibGUgaW5zdGVhZCBvZiBub3JtYWwgc3BlYWtlciB0byBhdm9pZCB0cmlnZ2VyaW5nCi0gICAgICAgICAgICAvL290aGVyIGFjb3VzdGljIHNhZmV0eSBtZWNoYW5pc21zIGZvciBub3RpZmljYXRpb24KLSAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSICYmIChhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSkKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRTsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBTVFJBVEVHWV9EVE1GOgotICAgICAgICBpZiAoIWlzSW5DYWxsKCkpIHsKLSAgICAgICAgICAgIC8vIHdoZW4gb2ZmIGNhbGwsIERUTUYgc3RyYXRlZ3kgZm9sbG93cyB0aGUgc2FtZSBydWxlcyBhcyBNRURJQSBzdHJhdGVneQotICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gd2hlbiBpbiBjYWxsLCBEVE1GIGFuZCBQSE9ORSBzdHJhdGVnaWVzIGZvbGxvdyB0aGUgc2FtZSBydWxlcwotICAgICAgICAvLyBGQUxMIFRIUk9VR0gKLQotICAgIGNhc2UgU1RSQVRFR1lfUEhPTkU6Ci0gICAgICAgIC8vIEZvcmNlIHVzZSBvZiBvbmx5IGRldmljZXMgb24gcHJpbWFyeSBvdXRwdXQgaWY6Ci0gICAgICAgIC8vIC0gaW4gY2FsbCBBTkQKLSAgICAgICAgLy8gICAtIGNhbm5vdCByb3V0ZSBmcm9tIHZvaWNlIGNhbGwgUlggT1IKLSAgICAgICAgLy8gICAtIGF1ZGlvIEhBTCB2ZXJzaW9uIGlzIDwgMy4wIGFuZCBUWCBkZXZpY2UgaXMgb24gdGhlIHByaW1hcnkgSFcgbW9kdWxlCi0gICAgICAgIGlmIChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eERldmljZSA9Ci0gICAgICAgICAgICAgICAgICAgIGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OKTsKLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gaHdPdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IobVByaW1hcnlPdXRwdXQpOwotICAgICAgICAgICAgaWYgKCgobUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSA9PSAwKSB8fAotICAgICAgICAgICAgICAgICAgICAoKCh0eERldmljZSAmIGF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIChod091dHB1dERlc2MtPmdldEF1ZGlvUG9ydCgpLT5tTW9kdWxlLT5tSGFsVmVyc2lvbiA8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApKSkgewotICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzID0gYXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBmb3IgcGhvbmUgc3RyYXRlZ3ksIHdlIGZpcnN0IGNvbnNpZGVyIHRoZSBmb3JjZWQgdXNlIGFuZCB0aGVuIHRoZSBhdmFpbGFibGUgZGV2aWNlcyBieSBvcmRlcgotICAgICAgICAvLyBvZiBwcmlvcml0eQotICAgICAgICBzd2l0Y2ggKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dKSB7Ci0gICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTzoKLSAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSB8fCBzdHJhdGVneSAhPSBTVFJBVEVHWV9EVE1GKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVDsKLSAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ087Ci0gICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIC8vIGlmIFNDTyBkZXZpY2UgaXMgcmVxdWVzdGVkIGJ1dCBubyBTQ08gZGV2aWNlIGlzIGF2YWlsYWJsZSwgZmFsbCBiYWNrIHRvIGRlZmF1bHQgY2FzZQotICAgICAgICAgICAgLy8gRkFMTCBUSFJPVUdICi0KLSAgICAgICAgZGVmYXVsdDogICAgLy8gRk9SQ0VfTk9ORQotICAgICAgICAgICAgLy8gd2hlbiBub3QgaW4gYSBwaG9uZSBjYWxsLCBwaG9uZSBzdHJhdGVneSBzaG91bGQgcm91dGUgU1RSRUFNX1ZPSUNFX0NBTEwgdG8gQTJEUAotICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpICYmCi0gICAgICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCi0gICAgICAgICAgICAgICAgICAgIChnZXRBMmRwT3V0cHV0KCkgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOwotICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVDsKLSAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIGlmIChtUGhvbmVTdGF0ZSAhPSBBVURJT19NT0RFX0lOX0NBTEwpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWTsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQ7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVDsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRTsKLSAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgZGV2aWNlID0gbURlZmF1bHRPdXRwdXREZXZpY2UtPm1EZXZpY2VUeXBlOwotICAgICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIG5vIGRldmljZSBmb3VuZCBmb3IgU1RSQVRFR1lfUEhPTkUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVI6Ci0gICAgICAgICAgICAvLyB3aGVuIG5vdCBpbiBhIHBob25lIGNhbGwsIHBob25lIHN0cmF0ZWd5IHNob3VsZCByb3V0ZSBTVFJFQU1fVk9JQ0VfQ0FMTCB0bwotICAgICAgICAgICAgLy8gQTJEUCBzcGVha2VyIHdoZW4gZm9yY2luZyB0byBzcGVha2VyIG91dHB1dAotICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpICYmCi0gICAgICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCi0gICAgICAgICAgICAgICAgICAgIChnZXRBMmRwT3V0cHV0KCkgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUjsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSkgewotICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVDsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUw7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0xJTkU7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwotICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICBkZXZpY2UgPSBtRGVmYXVsdE91dHB1dERldmljZS0+bURldmljZVR5cGU7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImdldERldmljZUZvclN0cmF0ZWd5KCkgbm8gZGV2aWNlIGZvdW5kIGZvciBTVFJBVEVHWV9QSE9ORSwgRk9SQ0VfU1BFQUtFUiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICBicmVhazsKLQotICAgIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OOgotCi0gICAgICAgIC8vIElmIGluY2FsbCwganVzdCBzZWxlY3QgdGhlIFNUUkFURUdZX1BIT05FIGRldmljZTogVGhlIHJlc3Qgb2YgdGhlIGJlaGF2aW9yIGlzIGhhbmRsZWQgYnkKLSAgICAgICAgLy8gaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkuCi0gICAgICAgIGlmIChpc0luQ2FsbCgpKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICAvLyBGQUxMIFRIUk9VR0gKLQotICAgIGNhc2UgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRToKLSAgICAgICAgLy8gc3RyYXRlZ3kgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSB1c2VzIHNhbWUgcm91dGluZyBwb2xpY3kgYXMgU1RSQVRFR1lfU09OSUZJQ0FUSU9OCi0gICAgICAgIC8vIGV4Y2VwdDoKLSAgICAgICAgLy8gICAtIHdoZW4gaW4gY2FsbCB3aGVyZSBpdCBkb2Vzbid0IGRlZmF1bHQgdG8gU1RSQVRFR1lfUEhPTkUgYmVoYXZpb3IKLSAgICAgICAgLy8gICAtIGluIGNvdW50cmllcyB3aGVyZSBub3QgZW5mb3JjZWQgaW4gd2hpY2ggY2FzZSBpdCBmb2xsb3dzIFNUUkFURUdZX01FRElBCi0KLSAgICAgICAgaWYgKChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHx8Ci0gICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkpIHsKLSAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwotICAgICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIHNwZWFrZXIgZGV2aWNlIG5vdCBmb3VuZCBmb3IgU1RSQVRFR1lfU09OSUZJQ0FUSU9OIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVGhlIHNlY29uZCBkZXZpY2UgdXNlZCBmb3Igc29uaWZpY2F0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBkZXZpY2UgdXNlZCBieSBtZWRpYSBzdHJhdGVneQotICAgICAgICAvLyBGQUxMIFRIUk9VR0gKLQotICAgIC8vIEZJWE1FOiBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZIGFuZCBTVFJBVEVHWV9SRVJPVVRJTkcgZm9sbG93IFNUUkFURUdZX01FRElBIGZvciBub3cKLSAgICBjYXNlIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFk6Ci0gICAgICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZKSB7Ci0gICAgICAgICAgICAvLyBkbyBub3Qgcm91dGUgYWNjZXNzaWJpbGl0eSBwcm9tcHRzIHRvIGEgZGlnaXRhbCBvdXRwdXQgY3VycmVudGx5IGNvbmZpZ3VyZWQgd2l0aCBhCi0gICAgICAgICAgICAvLyBjb21wcmVzc2VkIGZvcm1hdCBhcyB0aGV5IHdvdWxkIGxpa2VseSBub3QgYmUgbWl4ZWQgYW5kIGRyb3BwZWQuCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IGRlc2MtPmRldmljZSgpICYKLSAgICAgICAgICAgICAgICAgICAgKEFVRElPX0RFVklDRV9PVVRfSERNSSB8IEFVRElPX0RFVklDRV9PVVRfU1BESUYgfCBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVzYy0+aXNBY3RpdmUoKSAmJiAhYXVkaW9faXNfbGluZWFyX3BjbShkZXNjLT5tRm9ybWF0KSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcyAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgfmRldmljZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIEZBTEwgVEhST1VHSAotCi0gICAgY2FzZSBTVFJBVEVHWV9SRVJPVVRJTkc6Ci0gICAgY2FzZSBTVFJBVEVHWV9NRURJQTogewotICAgICAgICB1aW50MzJfdCBkZXZpY2UyID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgICAgIGlmIChzdHJhdGVneSAhPSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHsKLSAgICAgICAgICAgIC8vIG5vIHNvbmlmaWNhdGlvbiBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKLSAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLCBTdHJpbmc4KCIwIikpICE9IDApIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSAmJgotICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCi0gICAgICAgICAgICAgICAgKGdldEEyZHBPdXRwdXQoKSAhPSAwKSkgewotICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUDsKLSAgICAgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSAmJgotICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1BFQUtFUikpIHsKLSAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSkgewotICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9MSU5FOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYgKHN0cmF0ZWd5ICE9IFNUUkFURUdZX1NPTklGSUNBVElPTikpIHsKLSAgICAgICAgICAgIC8vIG5vIHNvbmlmaWNhdGlvbiBvbiBhdXggZGlnaXRhbCAoZS5nLiBIRE1JKQotICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZVR5cGVzICYgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTDsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmCi0gICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0tdID09IEFVRElPX1BPTElDWV9GT1JDRV9BTkFMT0dfRE9DSykpIHsKLSAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKLSAgICAgICAgfQotICAgICAgICBpbnQgZGV2aWNlMyA9IEFVRElPX0RFVklDRV9OT05FOwotICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEpIHsKLSAgICAgICAgICAgIC8vIEFSQywgU1BESUYgYW5kIEFVWF9MSU5FIGNhbiBjby1leGlzdCB3aXRoIG90aGVycy4KLSAgICAgICAgICAgIGRldmljZTMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkM7Ci0gICAgICAgICAgICBkZXZpY2UzIHw9IChhdmFpbGFibGVPdXRwdXREZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BESUYpOwotICAgICAgICAgICAgZGV2aWNlMyB8PSAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FKTsKLSAgICAgICAgfQotCi0gICAgICAgIGRldmljZTIgfD0gZGV2aWNlMzsKLSAgICAgICAgLy8gZGV2aWNlIGlzIERFVklDRV9PVVRfU1BFQUtFUiBpZiB3ZSBjb21lIGZyb20gY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT04gb3IKLSAgICAgICAgLy8gU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwgQVVESU9fREVWSUNFX05PTkUgb3RoZXJ3aXNlCi0gICAgICAgIGRldmljZSB8PSBkZXZpY2UyOwotCi0gICAgICAgIC8vIElmIGhkbWkgc3lzdGVtIGF1ZGlvIG1vZGUgaXMgb24sIHJlbW92ZSBzcGVha2VyIG91dCBvZiBvdXRwdXQgbGlzdC4KLSAgICAgICAgaWYgKChzdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgJiYKLSAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJT10gPT0KLSAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfSERNSV9TWVNURU1fQVVESU9fRU5GT1JDRUQpKSB7Ci0gICAgICAgICAgICBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICBkZXZpY2UgPSBtRGVmYXVsdE91dHB1dERldmljZS0+bURldmljZVR5cGU7Ci0gICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIG5vIGRldmljZSBmb3VuZCBmb3IgU1RSQVRFR1lfTUVESUEiKTsKLSAgICAgICAgfQotICAgICAgICB9IGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1coImdldERldmljZUZvclN0cmF0ZWd5KCkgdW5rbm93biBzdHJhdGVneTogJWQiLCBzdHJhdGVneSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIEFMT0dWVigiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBzdHJhdGVneSAlZCwgZGV2aWNlICV4Iiwgc3RyYXRlZ3ksIGRldmljZSk7Ci0gICAgcmV0dXJuIGRldmljZTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9TVFJBVEVHSUVTOyBpKyspIHsKLSAgICAgICAgbURldmljZUZvclN0cmF0ZWd5W2ldID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKHJvdXRpbmdfc3RyYXRlZ3kpaSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgfQotICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJldkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zKQotewotICAgIC8vIG11dGUvdW5tdXRlIHN0cmF0ZWdpZXMgdXNpbmcgYW4gaW5jb21wYXRpYmxlIGRldmljZSBjb21iaW5hdGlvbgotICAgIC8vIGlmIG11dGluZywgd2FpdCBmb3IgdGhlIGF1ZGlvIGluIHBjbSBidWZmZXIgdG8gYmUgZHJhaW5lZCBiZWZvcmUgcHJvY2VlZGluZwotICAgIC8vIGlmIHVubXV0aW5nLCB1bm11dGUgb25seSBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5Ci0gICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHVpbnQzMl90IG11dGVXYWl0TXMgPSAwOwotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKLSAgICBib29sIHNob3VsZE11dGUgPSBvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmIChwb3Bjb3VudChkZXZpY2UpID49IDIpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgY3VyRGV2aWNlID0gY3VyRGV2aWNlICYgb3V0cHV0RGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCk7Ci0gICAgICAgIGJvb2wgbXV0ZSA9IHNob3VsZE11dGUgJiYgKGN1ckRldmljZSAmIGRldmljZSkgJiYgKGN1ckRldmljZSAhPSBkZXZpY2UpOwotICAgICAgICBib29sIGRvTXV0ZSA9IGZhbHNlOwotCi0gICAgICAgIGlmIChtdXRlICYmICFvdXRwdXREZXNjLT5tU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldKSB7Ci0gICAgICAgICAgICBkb011dGUgPSB0cnVlOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIW11dGUgJiYgb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSl7Ci0gICAgICAgICAgICBkb011dGUgPSB0cnVlOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkb011dGUpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbU91dHB1dHMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGopOwotICAgICAgICAgICAgICAgIC8vIHNraXAgb3V0cHV0IGlmIGl0IGRvZXMgbm90IHNoYXJlIGFueSBkZXZpY2Ugd2l0aCBjdXJyZW50IG91dHB1dAotICAgICAgICAgICAgICAgIGlmICgoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpICYgb3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKQotICAgICAgICAgICAgICAgICAgICAgICAgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGN1ck91dHB1dCA9IG1PdXRwdXRzLmtleUF0KGopOwotICAgICAgICAgICAgICAgIEFMT0dWVigiY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcygpICVzIHN0cmF0ZWd5ICVkIChjdXJEZXZpY2UgJTA0eCkgb24gb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICBtdXRlID8gIm11dGluZyIgOiAidW5tdXRpbmciLCBpLCBjdXJEZXZpY2UsIGN1ck91dHB1dCk7Ci0gICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKChyb3V0aW5nX3N0cmF0ZWd5KWksIG11dGUsIGN1ck91dHB1dCwgbXV0ZSA/IDAgOiBkZWxheU1zKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVzYy0+aXNTdHJhdGVneUFjdGl2ZSgocm91dGluZ19zdHJhdGVneSlpKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobXV0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IHNob3VsZCBub3QgbmVlZCB0byBkb3VibGUgbGF0ZW5jeSBpZiB2b2x1bWUgY291bGQgYmUgYXBwbGllZAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgYnkgdGhlIGF1ZGlvZmxpbmdlciBtaXhlci4gV2UgbXVzdCBhY2NvdW50IGZvciB0aGUgZGVsYXkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJldHdlZW4gbm93IGFuZCB0aGUgbmV4dCB0aW1lIHRoZSBhdWRpb2ZsaW5nZXIgdGhyZWFkIGZvciB0aGlzIG91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBwcm9jZXNzIGEgYnVmZmVyICh3aGljaCBjb3JyZXNwb25kcyB0byBvbmUgYnVmZmVyIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB1c3VhbGx5IDEvMiBvciAxLzQgb2YgdGhlIGxhdGVuY3kpLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG11dGVXYWl0TXMgPCBkZXNjLT5sYXRlbmN5KCkgKiAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZVdhaXRNcyA9IGRlc2MtPmxhdGVuY3koKSAqIDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyB0ZW1wb3JhcnkgbXV0ZSBvdXRwdXQgaWYgZGV2aWNlIHNlbGVjdGlvbiBjaGFuZ2VzIHRvIGF2b2lkIHZvbHVtZSBidXJzdHMgZHVlIHRvCi0gICAgLy8gZGlmZmVyZW50IHBlciBkZXZpY2Ugdm9sdW1lcwotICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmIChkZXZpY2UgIT0gcHJldkRldmljZSkpIHsKLSAgICAgICAgaWYgKG11dGVXYWl0TXMgPCBvdXRwdXREZXNjLT5sYXRlbmN5KCkgKiAyKSB7Ci0gICAgICAgICAgICBtdXRlV2FpdE1zID0gb3V0cHV0RGVzYy0+bGF0ZW5jeSgpICogMjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE5VTV9TVFJBVEVHSUVTOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKChyb3V0aW5nX3N0cmF0ZWd5KWkpKSB7Ci0gICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKChyb3V0aW5nX3N0cmF0ZWd5KWksIHRydWUsIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgLy8gZG8gdGVtcE11dGUgdW5tdXRlIGFmdGVyIHR3aWNlIHRoZSBtdXRlIHdhaXQgdGltZQotICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSwgb3V0cHV0RGVzYy0+bUlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRlV2FpdE1zICoyLCBkZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gd2FpdCBmb3IgdGhlIFBDTSBvdXRwdXQgYnVmZmVycyB0byBlbXB0eSBiZWZvcmUgcHJvY2VlZGluZyB3aXRoIHRoZSByZXN0IG9mIHRoZSBjb21tYW5kCi0gICAgaWYgKG11dGVXYWl0TXMgPiBkZWxheU1zKSB7Ci0gICAgICAgIG11dGVXYWl0TXMgLT0gZGVsYXlNczsKLSAgICAgICAgdXNsZWVwKG11dGVXYWl0TXMgKiAxMDAwKTsKLSAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldE91dHB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYWRkcmVzcykKLXsKLSAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgb3V0cHV0ICVkIGRldmljZSAlMDR4IGRlbGF5TXMgJWQiLCBvdXRwdXQsIGRldmljZSwgZGVsYXlNcyk7Ci0gICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKLSAgICB1aW50MzJfdCBtdXRlV2FpdE1zOwotCi0gICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgIG11dGVXYWl0TXMgPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+bU91dHB1dDEtPm1Jb0hhbmRsZSwgZGV2aWNlLCBmb3JjZSwgZGVsYXlNcyk7Ci0gICAgICAgIG11dGVXYWl0TXMgKz0gc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPm1PdXRwdXQyLT5tSW9IYW5kbGUsIGRldmljZSwgZm9yY2UsIGRlbGF5TXMpOwotICAgICAgICByZXR1cm4gbXV0ZVdhaXRNczsKLSAgICB9Ci0gICAgLy8gbm8gbmVlZCB0byBwcm9jZWVkIGlmIG5ldyBkZXZpY2UgaXMgbm90IEFVRElPX0RFVklDRV9OT05FIGFuZCBub3Qgc3VwcG9ydGVkIGJ5IGN1cnJlbnQKLSAgICAvLyBvdXRwdXQgcHJvZmlsZQotICAgIGlmICgoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSAmJgotICAgICAgICAgICAgKChkZXZpY2UgJiBvdXRwdXREZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSkgPT0gMCkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gZmlsdGVyIGRldmljZXMgYWNjb3JkaW5nIHRvIG91dHB1dCBzZWxlY3RlZAotICAgIGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpKGRldmljZSAmIG91dHB1dERlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpKTsKLQotICAgIGF1ZGlvX2RldmljZXNfdCBwcmV2RGV2aWNlID0gb3V0cHV0RGVzYy0+bURldmljZTsKLQotICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBwcmV2RGV2aWNlICUwNHgiLCBwcmV2RGV2aWNlKTsKLQotICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKLSAgICB9Ci0gICAgbXV0ZVdhaXRNcyA9IGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMob3V0cHV0RGVzYywgcHJldkRldmljZSwgZGVsYXlNcyk7Ci0KLSAgICAvLyBEbyBub3QgY2hhbmdlIHRoZSByb3V0aW5nIGlmOgotICAgIC8vICAgICAgdGhlIHJlcXVlc3RlZCBkZXZpY2UgaXMgQVVESU9fREVWSUNFX05PTkUKLSAgICAvLyAgICAgIE9SIHRoZSByZXF1ZXN0ZWQgZGV2aWNlIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQgZGV2aWNlCi0gICAgLy8gIEFORCBmb3JjZSBpcyBub3Qgc3BlY2lmaWVkCi0gICAgLy8gIEFORCB0aGUgb3V0cHV0IGlzIGNvbm5lY3RlZCBieSBhIHZhbGlkIGF1ZGlvIHBhdGNoLgotICAgIC8vIERvaW5nIHRoaXMgY2hlY2sgaGVyZSBhbGxvd3MgdGhlIGNhbGxlciB0byBjYWxsIHNldE91dHB1dERldmljZSgpIHdpdGhvdXQgY29uZGl0aW9ucwotICAgIGlmICgoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FIHx8IGRldmljZSA9PSBwcmV2RGV2aWNlKSAmJiAhZm9yY2UgJiYKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSAhPSAwKSB7Ci0gICAgICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBzZXR0aW5nIHNhbWUgZGV2aWNlICUwNHggb3IgbnVsbCBkZXZpY2UgZm9yIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgIGRldmljZSwgb3V0cHV0KTsKLSAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7Ci0gICAgfQotCi0gICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIGNoYW5naW5nIGRldmljZSIpOwotCi0gICAgLy8gZG8gdGhlIHJvdXRpbmcKLSAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgIHJlc2V0T3V0cHV0RGV2aWNlKG91dHB1dCwgZGVsYXlNcywgTlVMTCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSAoYWRkcmVzcyA9PSBOVUxMKSA/Ci0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSkKLSAgICAgICAgICAgICAgICA6IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZUFkZHIoZGV2aWNlLCBTdHJpbmc4KGFkZHJlc3MpKTsKLSAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOwotICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOwotICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgICAgICAgICAgcGF0Y2gubnVtX3NpbmtzID0gMDsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGV2aWNlTGlzdC5zaXplKCkgJiYgaSA8IEFVRElPX1BBVENIX1BPUlRTX01BWDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlTGlzdC5pdGVtQXQoaSktPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1tpXSk7Ci0gICAgICAgICAgICAgICAgcGF0Y2gubnVtX3NpbmtzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4OwotICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlICYmICpwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpwYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjOwotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7Ci0gICAgICAgICAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgY3JlYXRlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIKLSAgICAgICAgICAgICAgICAgICAgIm51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUsIHBhdGNoLm51bV9zb3VyY2VzLCBwYXRjaC5udW1fc2lua3MpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goKGF1ZGlvX3BhdGNoX2hhbmRsZV90KW5leHRVbmlxdWVJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGF0Y2gsIG1VaWRDYWNoZWQpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9IHBhdGNoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1VaWQgPSBtVWlkQ2FjaGVkOwotICAgICAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSkgewotICAgICAgICAgICAgICAgICAgICAqcGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKLSAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpbmZvcm0gYWxsIGlucHV0IGFzIHdlbGwKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gIGlucHV0RGVzY3JpcHRvciA9IG1JbnB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmICghaXNWaXJ0dWFsSW5wdXREZXZpY2UoaW5wdXREZXNjcmlwdG9yLT5tRGV2aWNlKSkgewotICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIGlucHV0Q21kID0gQXVkaW9QYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiJXM6IGluZm9ybSBpbnB1dCAlZCBvZiBkZXZpY2U6JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICBpbnB1dERlc2NyaXB0b3ItPm1Jb0hhbmRsZSwgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBpbnB1dENtZC5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhpbnB1dERlc2NyaXB0b3ItPm1Jb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dENtZC50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gdXBkYXRlIHN0cmVhbSB2b2x1bWVzIGFjY29yZGluZyB0byBuZXcgZGV2aWNlCi0gICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dCwgZGV2aWNlLCBkZWxheU1zKTsKLQotICAgIHJldHVybiBtdXRlV2FpdE1zOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSkKLXsKLSAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgIHNzaXplX3QgaW5kZXg7Ci0gICAgaWYgKHBhdGNoSGFuZGxlKSB7Ci0gICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpwYXRjaEhhbmRsZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkob3V0cHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKLSAgICB9Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIHNwPCBBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCBkZWxheU1zKTsKLSAgICBBTE9HVigicmVzZXRPdXRwdXREZXZpY2UoKSByZWxlYXNlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCIsIHN0YXR1cyk7Ci0gICAgb3V0cHV0RGVzYy0+bVBhdGNoSGFuZGxlID0gMDsKLSAgICByZW1vdmVBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSk7Ci0gICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLSAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSkKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLQotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGlucHV0KTsKLSAgICBpZiAoKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgJiYgKChkZXZpY2UgIT0gaW5wdXREZXNjLT5tRGV2aWNlKSB8fCBmb3JjZSkpIHsKLSAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOwotCi0gICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKLSAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOwotICAgICAgICAgICAgaW5wdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc2lua3NbMF0pOwotICAgICAgICAgICAgLy8gQVVESU9fU09VUkNFX0hPVFdPUkQgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5OgotICAgICAgICAgICAgLy8gaGFuZGxlZCBhcyBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04gYnkgdGhlIGF1ZGlvIEhBTAotICAgICAgICAgICAgaWYgKHBhdGNoLnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQgJiYKLSAgICAgICAgICAgICAgICAgICAgIWlucHV0RGVzYy0+bUlzU291bmRUcmlnZ2VyKSB7Ci0gICAgICAgICAgICAgICAgcGF0Y2guc2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7Ci0gICAgICAgICAgICAvL29ubHkgb25lIGlucHV0IGRldmljZSBmb3Igbm93Ci0gICAgICAgICAgICBkZXZpY2VMaXN0Lml0ZW1BdCgwKS0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOwotICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgICAgICAgICAgc3NpemVfdCBpbmRleDsKLSAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSAmJiAqcGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjOwotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZQYXRjaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICAgICAgQUxPR1YoInNldElucHV0RGV2aWNlKCkgY3JlYXRlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpbmV4dFVuaXF1ZUlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXRjaCwgbVVpZENhY2hlZCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVBhdGNoID0gcGF0Y2g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVVpZCA9IG1VaWRDYWNoZWQ7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7Ci0gICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVzZXRJbnB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUpCi17Ci0gICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoaW5wdXQpOwotICAgIHNzaXplX3QgaW5kZXg7Ci0gICAgaWYgKHBhdGNoSGFuZGxlKSB7Ci0gICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpwYXRjaEhhbmRsZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOwotICAgIH0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOwotICAgIEFMT0dWKCJyZXNldElucHV0RGV2aWNlKCkgcmVsZWFzZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQiLCBzdGF0dXMpOwotICAgIGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlID0gMDsKLSAgICByZW1vdmVBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSk7Ci0gICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLSAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXNwPEF1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0UHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKLXsKLSAgICAvLyBDaG9vc2UgYW4gaW5wdXQgcHJvZmlsZSBiYXNlZCBvbiB0aGUgcmVxdWVzdGVkIGNhcHR1cmUgcGFyYW1ldGVyczogc2VsZWN0IHRoZSBmaXJzdCBhdmFpbGFibGUKLSAgICAvLyBwcm9maWxlIHN1cHBvcnRpbmcgYWxsIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLgotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7IGorKykKLSAgICAgICAgewotICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXNbal07Ci0gICAgICAgICAgICAvLyBwcm9maWxlLT5sb2coKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldmljZSwgYWRkcmVzcywgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsaW5nUmF0ZSAvKnVwZGF0ZWRTYW1wbGluZ1JhdGUqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgY2hhbm5lbE1hc2ssIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgZmxhZ3MpKSB7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gcHJvZmlsZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ICoqcG9saWN5TWl4KQotewotICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVEZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5BVURJT19ERVZJQ0VfQklUX0lOOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUG9saWN5TWl4ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tTWl4VHlwZSAhPSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbVBvbGljeU1peGVzW2ldLT5tTWl4Lm1Dcml0ZXJpYS5zaXplKCk7IGorKykgewotICAgICAgICAgICAgaWYgKChSVUxFX01BVENIX0FUVFJJQlVURV9DQVBUVVJFX1BSRVNFVCA9PSBtUG9saWN5TWl4ZXNbaV0tPm1NaXgubUNyaXRlcmlhW2pdLm1SdWxlICYmCi0gICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tQ3JpdGVyaWFbal0ubUF0dHIubVNvdXJjZSA9PSBpbnB1dFNvdXJjZSkgfHwKLSAgICAgICAgICAgICAgIChSVUxFX0VYQ0xVREVfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUID09IG1Qb2xpY3lNaXhlc1tpXS0+bU1peC5tQ3JpdGVyaWFbal0ubVJ1bGUgJiYKLSAgICAgICAgICAgICAgICAgICAgbVBvbGljeU1peGVzW2ldLT5tTWl4Lm1Dcml0ZXJpYVtqXS5tQXR0ci5tU291cmNlICE9IGlucHV0U291cmNlKSkgewotICAgICAgICAgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb2xpY3lNaXggIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgKnBvbGljeU1peCA9ICZtUG9saWN5TWl4ZXNbaV0tPm1NaXg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSk7Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKQotewotICAgIHVpbnQzMl90IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwotICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVEZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH5BVURJT19ERVZJQ0VfQklUX0lOOwotCi0gICAgc3dpdGNoIChpbnB1dFNvdXJjZSkgewotICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSzoKLSAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMKSB7Ci0gICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgQVVESU9fU09VUkNFX0RFRkFVTFQ6Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfTUlDOgotICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgewotICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFA7Ci0gICAgfSBlbHNlIGlmICgobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSAmJgotICAgICAgICAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSkgewotICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUOwotICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCkgewotICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVDsKLSAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UpIHsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0U7Ci0gICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgewotICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7Ci0gICAgfQotICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKLSAgICAgICAgLy8gQWxsb3cgb25seSB1c2Ugb2YgZGV2aWNlcyBvbiBwcmltYXJ5IGlucHV0IGlmIGluIGNhbGwgYW5kIEhBTCBkb2VzIG5vdCBzdXBwb3J0IHJvdXRpbmcKLSAgICAgICAgLy8gdG8gdm9pY2UgY2FsbCBwYXRoLgotICAgICAgICBpZiAoKG1QaG9uZVN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgJiYKLSAgICAgICAgICAgICAgICAobUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKSA9PSAwKSB7Ci0gICAgICAgICAgICBhdmFpbGFibGVEZXZpY2VUeXBlcyA9IGF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSkgewotICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ086Ci0gICAgICAgICAgICAvLyBpZiBTQ08gZGV2aWNlIGlzIHJlcXVlc3RlZCBidXQgbm8gU0NPIGRldmljZSBpcyBhdmFpbGFibGUsIGZhbGwgYmFjayB0byBkZWZhdWx0IGNhc2UKLSAgICAgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gRkFMTCBUSFJPVUdICi0KLSAgICAgICAgZGVmYXVsdDogICAgLy8gRk9SQ0VfTk9ORQotICAgICAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSkgewotICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgewotICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVI6Ci0gICAgICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUM7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjoKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9IT1RXT1JEOgotICAgICAgICBpZiAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmCi0gICAgICAgICAgICAgICAgYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUOwotICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQpIHsKLSAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUOwotICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UpIHsKLSAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFOwotICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfQ0FNQ09SREVSOgotICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMpIHsKLSAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CQUNLX01JQzsKLSAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgewotICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LOgotICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NBTEw6Ci0gICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYOgotICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCkgewotICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgQVVESU9fU09VUkNFX0ZNX1RVTkVSOgotICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIpIHsKLSAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVygiZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoKSBpbnZhbGlkIGlucHV0IHNvdXJjZSAlZCIsIGlucHV0U291cmNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIEFMT0dWKCJnZXREZXZpY2VGb3JJbnB1dFNvdXJjZSgpaW5wdXQgc291cmNlICVkLCBkZXZpY2UgJTA4eCIsIGlucHV0U291cmNlLCBkZXZpY2UpOwotICAgIHJldHVybiBkZXZpY2U7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1ZpcnR1YWxJbnB1dERldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQotewotICAgIGlmICgoZGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgewotICAgICAgICBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47Ci0gICAgICAgIGlmICgocG9wY291bnQoZGV2aWNlKSA9PSAxKSAmJiAoKGRldmljZSAmIH5BUE1fQVVESU9fSU5fREVWSUNFX1ZJUlRVQUxfQUxMKSA9PSAwKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkZXZpY2VEaXN0aW5ndWlzaGVzT25BZGRyZXNzKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIHsKLSAgICByZXR1cm4gKChkZXZpY2UgJiBBUE1fQVVESU9fREVWSUNFX01BVENIX0FERFJFU1NfQUxMICYgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApOwotfQotCi1hdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEFjdGl2ZUlucHV0KGJvb2wgaWdub3JlVmlydHVhbElucHV0cykKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dF9kZXNjcmlwdG9yID0gbUlucHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoKGlucHV0X2Rlc2NyaXB0b3ItPm1SZWZDb3VudCA+IDApCi0gICAgICAgICAgICAgICAgJiYgKCFpZ25vcmVWaXJ0dWFsSW5wdXRzIHx8ICFpc1ZpcnR1YWxJbnB1dERldmljZShpbnB1dF9kZXNjcmlwdG9yLT5tRGV2aWNlKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBtSW5wdXRzLmtleUF0KGkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmFjdGl2ZUlucHV0c0NvdW50KCkgY29uc3QKLXsKLSAgICB1aW50MzJfdCBjb3VudCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKGRlc2MtPm1SZWZDb3VudCA+IDApIHsKLSAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGNvdW50OwotfQotCi0KLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUZvclZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQotewotICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgLy8gdGhpcyBoYXBwZW5zIHdoZW4gZm9yY2luZyBhIHJvdXRlIHVwZGF0ZSBhbmQgbm8gdHJhY2sgaXMgYWN0aXZlIG9uIGFuIG91dHB1dC4KLSAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHRoZSByZXR1cm5lZCBjYXRlZ29yeSBpcyBub3QgaW1wb3J0YW50LgotICAgICAgICBkZXZpY2UgPSAgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwotICAgIH0gZWxzZSBpZiAocG9wY291bnQoZGV2aWNlKSA+IDEpIHsKLSAgICAgICAgLy8gTXVsdGlwbGUgZGV2aWNlIHNlbGVjdGlvbiBpcyBlaXRoZXI6Ci0gICAgICAgIC8vICAtIHNwZWFrZXIgKyBvbmUgb3RoZXIgZGV2aWNlOiBnaXZlIHByaW9yaXR5IHRvIHNwZWFrZXIgaW4gdGhpcyBjYXNlLgotICAgICAgICAvLyAgLSBvbmUgQTJEUCBkZXZpY2UgKyBhbm90aGVyIGRldmljZTogaGFwcGVucyB3aXRoIGR1cGxpY2F0ZWQgb3V0cHV0LiBJbiB0aGlzIGNhc2UKLSAgICAgICAgLy8gcmV0YWluIHRoZSBkZXZpY2Ugb24gdGhlIEEyRFAgb3V0cHV0IGFzIHRoZSBvdGhlciBtdXN0IG5vdCBjb3JyZXNwb25kIHRvIGFuIGFjdGl2ZQotICAgICAgICAvLyBzZWxlY3Rpb24gaWYgbm90IHRoZSBzcGVha2VyLgotICAgICAgICAvLyAgLSBIRE1JLUNFQyBzeXN0ZW0gYXVkaW8gbW9kZSBvbmx5IG91dHB1dDogZ2l2ZSBwcmlvcml0eSB0byBhdmFpbGFibGUgaXRlbSBpbiBvcmRlci4KLSAgICAgICAgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgewotICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwotICAgICAgICB9IGVsc2UgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkMpIHsKLSAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkM7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BVVhfTElORSkgewotICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9BVVhfTElORTsKLSAgICAgICAgfSBlbHNlIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1NQRElGKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRElGOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKlNQRUFLRVJfU0FGRSBpcyBhbiBhbGlhcyBvZiBTUEVBS0VSIGZvciBwdXJwb3NlcyBvZiB2b2x1bWUgY29udHJvbCovCi0gICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwotCi0gICAgQUxPR1dfSUYocG9wY291bnQoZGV2aWNlKSAhPSAxLAotICAgICAgICAgICAgImdldERldmljZUZvclZvbHVtZSgpIGludmFsaWQgZGV2aWNlIGNvbWJpbmF0aW9uOiAlMDh4IiwKLSAgICAgICAgICAgIGRldmljZSk7Ci0KLSAgICByZXR1cm4gZGV2aWNlOwotfQotCi1BdWRpb1BvbGljeU1hbmFnZXI6OmRldmljZV9jYXRlZ29yeSBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUNhdGVnb3J5KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi17Ci0gICAgc3dpdGNoKGdldERldmljZUZvclZvbHVtZShkZXZpY2UpKSB7Ci0gICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRToKLSAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0U7Ci0gICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUOgotICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOgotICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTzoKLSAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVDoKLSAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOgotICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzoKLSAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVDsKLSAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0xJTkU6Ci0gICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTDoKLSAgICAgICAgLypVU0I/ICBSZW1vdGUgc3VibWl4PyovCi0gICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQTsKLSAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI6Ci0gICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVDoKLSAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI6Ci0gICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZOgotICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRToKLSAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVI7Ci0gICAgfQotfQotCi0vKiBzdGF0aWMgKi8KLWZsb2F0IEF1ZGlvUG9saWN5TWFuYWdlcjo6dm9sSW5kZXhUb0FtcGwoYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgU3RyZWFtRGVzY3JpcHRvciYgc3RyZWFtRGVzYywKLSAgICAgICAgaW50IGluZGV4SW5VaSkKLXsKLSAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkgPSBnZXREZXZpY2VDYXRlZ29yeShkZXZpY2UpOwotICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKmN1cnZlID0gc3RyZWFtRGVzYy5tVm9sdW1lQ3VydmVbZGV2aWNlQ2F0ZWdvcnldOwotCi0gICAgLy8gdGhlIHZvbHVtZSBpbmRleCBpbiB0aGUgVUkgaXMgcmVsYXRpdmUgdG8gdGhlIG1pbiBhbmQgbWF4IHZvbHVtZSBpbmRpY2VzIGZvciB0aGlzIHN0cmVhbSB0eXBlCi0gICAgaW50IG5iU3RlcHMgPSAxICsgY3VydmVbVk9MTUFYXS5tSW5kZXggLQotICAgICAgICAgICAgY3VydmVbVk9MTUlOXS5tSW5kZXg7Ci0gICAgaW50IHZvbElkeCA9IChuYlN0ZXBzICogKGluZGV4SW5VaSAtIHN0cmVhbURlc2MubUluZGV4TWluKSkgLwotICAgICAgICAgICAgKHN0cmVhbURlc2MubUluZGV4TWF4IC0gc3RyZWFtRGVzYy5tSW5kZXhNaW4pOwotCi0gICAgLy8gZmluZCB3aGF0IHBhcnQgb2YgdGhlIGN1cnZlIHRoaXMgaW5kZXggdm9sdW1lIGJlbG9uZ3MgdG8sIG9yIGlmIGl0J3Mgb3V0IG9mIGJvdW5kcwotICAgIGludCBzZWdtZW50ID0gMDsKLSAgICBpZiAodm9sSWR4IDwgY3VydmVbVk9MTUlOXS5tSW5kZXgpIHsgICAgICAgICAvLyBvdXQgb2YgYm91bmRzCi0gICAgICAgIHJldHVybiAwLjBmOwotICAgIH0gZWxzZSBpZiAodm9sSWR4IDwgY3VydmVbVk9MS05FRTFdLm1JbmRleCkgewotICAgICAgICBzZWdtZW50ID0gMDsKLSAgICB9IGVsc2UgaWYgKHZvbElkeCA8IGN1cnZlW1ZPTEtORUUyXS5tSW5kZXgpIHsKLSAgICAgICAgc2VnbWVudCA9IDE7Ci0gICAgfSBlbHNlIGlmICh2b2xJZHggPD0gY3VydmVbVk9MTUFYXS5tSW5kZXgpIHsKLSAgICAgICAgc2VnbWVudCA9IDI7Ci0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXQgb2YgYm91bmRzCi0gICAgICAgIHJldHVybiAxLjBmOwotICAgIH0KLQotICAgIC8vIGxpbmVhciBpbnRlcnBvbGF0aW9uIGluIHRoZSBhdHRlbnVhdGlvbiB0YWJsZSBpbiBkQgotICAgIGZsb2F0IGRlY2liZWxzID0gY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24gKwotICAgICAgICAgICAgKChmbG9hdCkodm9sSWR4IC0gY3VydmVbc2VnbWVudF0ubUluZGV4KSkgKgotICAgICAgICAgICAgICAgICggKGN1cnZlW3NlZ21lbnQrMV0ubURCQXR0ZW51YXRpb24gLQotICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24pIC8KLSAgICAgICAgICAgICAgICAgICAgKChmbG9hdCkoY3VydmVbc2VnbWVudCsxXS5tSW5kZXggLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1JbmRleCkpICk7Ci0KLSAgICBmbG9hdCBhbXBsaWZpY2F0aW9uID0gZXhwKCBkZWNpYmVscyAqIDAuMTE1MTI5Zik7IC8vIGV4cCggZEIgKiBsbigxMCkgLyAyMCApCi0KLSAgICBBTE9HVlYoIlZPTFVNRSB2b2wgaW5kZXg9WyVkICVkICVkXSwgZEI9WyUuMWYgJS4xZiAlLjFmXSBhbXBsPSUuNWYiLAotICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubUluZGV4LCB2b2xJZHgsCi0gICAgICAgICAgICBjdXJ2ZVtzZWdtZW50KzFdLm1JbmRleCwKLSAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1EQkF0dGVudWF0aW9uLAotICAgICAgICAgICAgZGVjaWJlbHMsCi0gICAgICAgICAgICBjdXJ2ZVtzZWdtZW50KzFdLm1EQkF0dGVudWF0aW9uLAotICAgICAgICAgICAgYW1wbGlmaWNhdGlvbik7Ci0KLSAgICByZXR1cm4gYW1wbGlmaWNhdGlvbjsKLX0KLQotY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50Ci0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzRGVmYXVsdFZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTQ5LjVmfSwgezMzLCAtMzMuNWZ9LCB7NjYsIC0xNy4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKLSAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7Ci0gICAgezEsIC01OC4wZn0sIHsyMCwgLTQwLjBmfSwgezYwLCAtMTcuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50Ci0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7Ci0gICAgezEsIC01OC4wZn0sIHsyMCwgLTQwLjBmfSwgezYwLCAtMjEuMGZ9LCB7MTAwLCAtMTAuMGZ9Ci19OwotCi1jb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKLSAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7Ci0gICAgezEsIC01Ni4wZn0sIHsyMCwgLTM0LjBmfSwgezYwLCAtMTEuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50Ci0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmNbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0gewotICAgIHsxLCAtNTUuMGZ9LCB7MjAsIC00My4wZn0sIHs4NiwgLTEyLjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAotICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7Ci0gICAgezEsIC0yOS43Zn0sIHszMywgLTIwLjFmfSwgezY2LCAtMTAuMmZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50Ci0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTM1LjdmfSwgezMzLCAtMjYuMWZ9LCB7NjYsIC0xMy4yZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi0vLyBBVURJT19TVFJFQU1fU1lTVEVNLCBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSBhbmQgQVVESU9fU1RSRUFNX0RUTUYgdm9sdW1lIHRyYWNrcwotLy8gQVVESU9fU1RSRUFNX1JJTkcgb24gcGhvbmVzIGFuZCBBVURJT19TVFJFQU1fTVVTSUMgb24gdGFibGV0cy4KLS8vIEFVRElPX1NUUkVBTV9EVE1GIHRyYWNrcyBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCB3aGlsZSBpbiBjYWxsIChTZWUgQXVkaW9TZXJ2aWNlLmphdmEpLgotLy8gVGhlIHJhbmdlIGlzIGNvbnN0cmFpbmVkIGJldHdlZW4gLTI0ZEIgYW5kIC02ZEIgb3ZlciBzcGVha2VyIGFuZCAtMzBkQiBhbmQgLTE4ZEIgb3ZlciBoZWFkc2V0LgotCi1jb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKLSAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0gewotICAgIHsxLCAtMjQuMGZ9LCB7MzMsIC0xOC4wZn0sIHs2NiwgLTEyLjBmfSwgezEwMCwgLTYuMGZ9Ci19OwotCi1jb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKLSAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVEcmNbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0gewotICAgIHsxLCAtMzQuMGZ9LCB7MzMsIC0yNC4wZn0sIHs2NiwgLTE1LjBmfSwgezEwMCwgLTYuMGZ9Ci19OwotCi1jb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKLSAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0gewotICAgIHsxLCAtMzAuMGZ9LCB7MzMsIC0yNi4wZn0sIHs2NiwgLTIyLjBmfSwgezEwMCwgLTE4LjBmfQotfTsKLQotY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50Ci0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0gewotICAgIHswLCAtNDIuMGZ9LCB7MzMsIC0yOC4wZn0sIHs2NiwgLTE0LjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAotICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKLSAgICB7MCwgLTI0LjBmfSwgezMzLCAtMTYuMGZ9LCB7NjYsIC04LjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Vm9sdW1lQ3VydmVQb2ludAotICAgIEF1ZGlvUG9saWN5TWFuYWdlcjo6c0xpbmVhclZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXSA9IHsKLSAgICB7MCwgLTk2LjBmfSwgezMzLCAtNjguMGZ9LCB7NjYsIC0zNC4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKLSAgICBBdWRpb1BvbGljeU1hbmFnZXI6OnNTaWxlbnRWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF0gPSB7Ci0gICAgezAsIC05Ni4wZn0sIHsxLCAtOTYuMGZ9LCB7MiwgLTk2LjBmfSwgezEwMCwgLTk2LjBmfQotfTsKLQotY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWb2x1bWVDdXJ2ZVBvaW50Ci0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdID0gewotICAgIHswLCAwLjBmfSwgezEsIDAuMGZ9LCB7MiwgMC4wZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBBdWRpb1BvbGljeU1hbmFnZXI6OlZvbHVtZUN1cnZlUG9pbnQKLSAgICAgICAgICAgICpBdWRpb1BvbGljeU1hbmFnZXI6OnNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fQ05UXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0F1ZGlvUG9saWN5TWFuYWdlcjo6REVWSUNFX0NBVEVHT1JZX0NOVF0gPSB7Ci0gICAgeyAvLyBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTAotICAgICAgICBzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIHNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgc0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9TWVNURU0KLSAgICAgICAgc0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fUklORwotICAgICAgICBzRGVmYXVsdFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBzRGVmYXVsdFZvbHVtZUN1cnZlLCAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIHNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9NVVNJQwotICAgICAgICBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9BTEFSTQotICAgICAgICBzRGVmYXVsdFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBzRGVmYXVsdFZvbHVtZUN1cnZlLCAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIHNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04KLSAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgc0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTwotICAgICAgICBzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIHNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgc0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgc0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFCi0gICAgICAgIHNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgIH0sCi0gICAgeyAgLy8gQVVESU9fU1RSRUFNX0RUTUYKLSAgICAgICAgc0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgc0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIHNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9UVFMKLSAgICAgIC8vICJUcmFuc21pdHRlZCBUaHJvdWdoIFNwZWFrZXIiOiBhbHdheXMgc2lsZW50IGV4Y2VwdCBvbiBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBzU2lsZW50Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIHNMaW5lYXJWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgc1NpbGVudFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgc1NpbGVudFZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZCi0gICAgICAgIHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICB9LAotICAgIHsgLy8gQVVESU9fU1RSRUFNX1JFUk9VVElORwotICAgICAgICBzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIHNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgc0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgc0Z1bGxTY2FsZVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9QQVRDSAotICAgICAgICBzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIHNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgc0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgc0Z1bGxTY2FsZVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgfSwKLX07Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0aWFsaXplVm9sdW1lQ3VydmVzKCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IERFVklDRV9DQVRFR09SWV9DTlQ7IGorKykgewotICAgICAgICAgICAgbVN0cmVhbXNbaV0ubVZvbHVtZUN1cnZlW2pdID0KLSAgICAgICAgICAgICAgICAgICAgc1ZvbHVtZVByb2ZpbGVzW2ldW2pdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgYXZhaWxhYmlsaXR5IG9mIERSQyBvbiBzcGVha2VyIHBhdGg6IGlmIGF2YWlsYWJsZSwgb3ZlcnJpZGUgc29tZSBvZiB0aGUgc3BlYWtlciBjdXJ2ZXMKLSAgICBpZiAobVNwZWFrZXJEcmNFbmFibGVkKSB7Ci0gICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9TWVNURU1dLm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl0gPQotICAgICAgICAgICAgICAgIHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVEcmM7Ci0gICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9SSU5HXS5tVm9sdW1lQ3VydmVbREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJdID0KLSAgICAgICAgICAgICAgICBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjOwotICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fQUxBUk1dLm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl0gPQotICAgICAgICAgICAgICAgIHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmM7Ci0gICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9OT1RJRklDQVRJT05dLm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl0gPQotICAgICAgICAgICAgICAgIHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmM7Ci0gICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9NVVNJQ10ubVZvbHVtZUN1cnZlW0RFVklDRV9DQVRFR09SWV9TUEVBS0VSXSA9Ci0gICAgICAgICAgICAgICAgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlRHJjOwotICAgICAgICBtU3RyZWFtc1tBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWV0ubVZvbHVtZUN1cnZlW0RFVklDRV9DQVRFR09SWV9TUEVBS0VSXSA9Ci0gICAgICAgICAgICAgICAgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlRHJjOwotICAgIH0KLX0KLQotZmxvYXQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb21wdXRlVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKLSAgICBmbG9hdCB2b2x1bWUgPSAxLjA7Ci0gICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICBTdHJlYW1EZXNjcmlwdG9yICZzdHJlYW1EZXNjID0gbVN0cmVhbXNbc3RyZWFtXTsKLQotICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7Ci0gICAgfQotCi0gICAgdm9sdW1lID0gdm9sSW5kZXhUb0FtcGwoZGV2aWNlLCBzdHJlYW1EZXNjLCBpbmRleCk7Ci0KLSAgICAvLyBpZiBhIGhlYWRzZXQgaXMgY29ubmVjdGVkLCBhcHBseSB0aGUgZm9sbG93aW5nIHJ1bGVzIHRvIHJpbmcgdG9uZXMgYW5kIG5vdGlmaWNhdGlvbnMKLSAgICAvLyB0byBhdm9pZCBzb3VuZCBsZXZlbCBidXJzdHMgaW4gdXNlcidzIGVhcnM6Ci0gICAgLy8gLSBhbHdheXMgYXR0ZW51YXRlIHJpbmcgdG9uZXMgYW5kIG5vdGlmaWNhdGlvbnMgdm9sdW1lIGJ5IDZkQgotICAgIC8vIC0gaWYgbXVzaWMgaXMgcGxheWluZywgYWx3YXlzIGxpbWl0IHRoZSB2b2x1bWUgdG8gY3VycmVudCBtdXNpYyB2b2x1bWUsCi0gICAgLy8gd2l0aCBhIG1pbmltdW0gdGhyZXNob2xkIGF0IC0zNmRCIHNvIHRoYXQgbm90aWZpY2F0aW9uIGlzIGFsd2F5cyBwZXJjZWl2ZWQuCi0gICAgY29uc3Qgcm91dGluZ19zdHJhdGVneSBzdHJlYW1fc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOwotICAgIGlmICgoZGV2aWNlICYgKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAgfAotICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTIHwKLSAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVCB8Ci0gICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSkpICYmCi0gICAgICAgICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikKLSAgICAgICAgICAgICAgICB8fCAoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKQotICAgICAgICAgICAgICAgIHx8IChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1NZU1RFTSkKLSAgICAgICAgICAgICAgICB8fCAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSAmJgotICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkpKSAmJgotICAgICAgICBzdHJlYW1EZXNjLm1DYW5CZU11dGVkKSB7Ci0gICAgICAgIHZvbHVtZSAqPSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfRkFDVE9SOwotICAgICAgICAvLyB3aGVuIHRoZSBwaG9uZSBpcyByaW5naW5nIHdlIG11c3QgY29uc2lkZXIgdGhhdCBtdXNpYyBjb3VsZCBoYXZlIGJlZW4gcGF1c2VkIGp1c3QgYmVmb3JlCi0gICAgICAgIC8vIGJ5IHRoZSBtdXNpYyBhcHBsaWNhdGlvbiBhbmQgYmVoYXZlIGFzIGlmIG11c2ljIHdhcyBhY3RpdmUgaWYgdGhlIGxhc3QgbXVzaWMgdHJhY2sgd2FzCi0gICAgICAgIC8vIGp1c3Qgc3RvcHBlZAotICAgICAgICBpZiAoaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX01VU0lDLCBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSkgfHwKLSAgICAgICAgICAgICAgICBtTGltaXRSaW5ndG9uZVZvbHVtZSkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG11c2ljRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICBmbG9hdCBtdXNpY1ZvbCA9IGNvbXB1dGVWb2x1bWUoQVVESU9fU1RSRUFNX01VU0lDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1zW0FVRElPX1NUUkVBTV9NVVNJQ10uZ2V0Vm9sdW1lSW5kZXgobXVzaWNEZXZpY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXNpY0RldmljZSk7Ci0gICAgICAgICAgICBmbG9hdCBtaW5Wb2wgPSAobXVzaWNWb2wgPiBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljVm9sIDogU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX01JTjsKLSAgICAgICAgICAgIGlmICh2b2x1bWUgPiBtaW5Wb2wpIHsKLSAgICAgICAgICAgICAgICB2b2x1bWUgPSBtaW5Wb2w7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNvbXB1dGVWb2x1bWUgbGltaXRpbmcgdm9sdW1lIHRvICVmIG11c2ljVm9sICVmIiwgbWluVm9sLCBtdXNpY1ZvbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdm9sdW1lOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrQW5kU2V0Vm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKLXsKLQotICAgIC8vIGRvIG5vdCBjaGFuZ2UgYWN0dWFsIHN0cmVhbSB2b2x1bWUgaWYgdGhlIHN0cmVhbSBpcyBtdXRlZAotICAgIGlmIChtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpLT5tTXV0ZUNvdW50W3N0cmVhbV0gIT0gMCkgewotICAgICAgICBBTE9HVlYoImNoZWNrQW5kU2V0Vm9sdW1lKCkgc3RyZWFtICVkIG11dGVkIGNvdW50ICVkIiwKLSAgICAgICAgICAgICAgc3RyZWFtLCBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpLT5tTXV0ZUNvdW50W3N0cmVhbV0pOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgLy8gZG8gbm90IGNoYW5nZSBpbiBjYWxsIHZvbHVtZSBpZiBibHVldG9vdGggaXMgY29ubmVjdGVkIGFuZCB2aWNlIHZlcnNhCi0gICAgaWYgKChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgJiYKLSAgICAgICAgICAgIG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHx8Ci0gICAgICAgIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08gJiYKLSAgICAgICAgICAgICAgICBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSkgewotICAgICAgICBBTE9HVigiY2hlY2tBbmRTZXRWb2x1bWUoKSBjYW5ub3Qgc2V0IHN0cmVhbSAlZCB2b2x1bWUgd2l0aCBmb3JjZSB1c2UgPSAlZCBmb3IgY29tbSIsCi0gICAgICAgICAgICAgc3RyZWFtLCBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBmbG9hdCB2b2x1bWUgPSBjb21wdXRlVm9sdW1lKHN0cmVhbSwgaW5kZXgsIG91dHB1dCwgZGV2aWNlKTsKLSAgICAvLyB1bml0IGdhaW4gaWYgcmVyb3V0aW5nIHRvIGV4dGVybmFsIHBvbGljeQotICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSB7Ci0gICAgICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigibWF4IGdhaW4gd2hlbiByZXJvdXRpbmcgZm9yIG91dHB1dD0lZCIsIG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgdm9sdW1lID0gMS4wZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfQotICAgIC8vIFdlIGFjdHVhbGx5IGNoYW5nZSB0aGUgdm9sdW1lIGlmOgotICAgIC8vIC0gdGhlIGZsb2F0IHZhbHVlIHJldHVybmVkIGJ5IGNvbXB1dGVWb2x1bWUoKSBjaGFuZ2VkCi0gICAgLy8gLSB0aGUgZm9yY2UgZmxhZyBpcyBzZXQKLSAgICBpZiAodm9sdW1lICE9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCktPm1DdXJWb2x1bWVbc3RyZWFtXSB8fAotICAgICAgICAgICAgZm9yY2UpIHsKLSAgICAgICAgbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KS0+bUN1clZvbHVtZVtzdHJlYW1dID0gdm9sdW1lOwotICAgICAgICBBTE9HVlYoImNoZWNrQW5kU2V0Vm9sdW1lKCkgZm9yIG91dHB1dCAlZCBzdHJlYW0gJWQsIHZvbHVtZSAlZiwgZGVsYXkgJWQiLCBvdXRwdXQsIHN0cmVhbSwgdm9sdW1lLCBkZWxheU1zKTsKLSAgICAgICAgLy8gRm9yY2UgVk9JQ0VfQ0FMTCB0byB0cmFjayBCTFVFVE9PVEhfU0NPIHN0cmVhbSB2b2x1bWUgd2hlbiBibHVldG9vdGggYXVkaW8gaXMKLSAgICAgICAgLy8gZW5hYmxlZAotICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPKSB7Ci0gICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCB2b2x1bWUsIG91dHB1dCwgZGVsYXlNcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZSwgb3V0cHV0LCBkZWxheU1zKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIHx8Ci0gICAgICAgIHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgewotICAgICAgICBmbG9hdCB2b2ljZVZvbHVtZTsKLSAgICAgICAgLy8gRm9yY2Ugdm9pY2Ugdm9sdW1lIHRvIG1heCBmb3IgYmx1ZXRvb3RoIFNDTyBhcyB2b2x1bWUgaXMgbWFuYWdlZCBieSB0aGUgaGVhZHNldAotICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSB7Ci0gICAgICAgICAgICB2b2ljZVZvbHVtZSA9IChmbG9hdClpbmRleC8oZmxvYXQpbVN0cmVhbXNbc3RyZWFtXS5tSW5kZXhNYXg7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2b2ljZVZvbHVtZSA9IDEuMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh2b2ljZVZvbHVtZSAhPSBtTGFzdFZvaWNlVm9sdW1lICYmIG91dHB1dCA9PSBtUHJpbWFyeU91dHB1dCkgewotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFZvaWNlVm9sdW1lKHZvaWNlVm9sdW1lLCBkZWxheU1zKTsKLSAgICAgICAgICAgIG1MYXN0Vm9pY2VWb2x1bWUgPSB2b2ljZVZvbHVtZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmFwcGx5U3RyZWFtVm9sdW1lcyhhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQotewotICAgIEFMT0dWVigiYXBwbHlTdHJlYW1Wb2x1bWVzKCkgZm9yIG91dHB1dCAlZCBhbmQgZGV2aWNlICV4Iiwgb3V0cHV0LCBkZXZpY2UpOwotCi0gICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0NOVDsgc3RyZWFtKyspIHsKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbXNbc3RyZWFtXS5nZXRWb2x1bWVJbmRleChkZXZpY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2UpOwotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN0cmF0ZWd5TXV0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKLSAgICBBTE9HVlYoInNldFN0cmF0ZWd5TXV0ZSgpIHN0cmF0ZWd5ICVkLCBtdXRlICVkLCBvdXRwdXQgJWQiLCBzdHJhdGVneSwgb24sIG91dHB1dCk7Ci0gICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0NOVDsgc3RyZWFtKyspIHsKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pID09IHN0cmF0ZWd5KSB7Ci0gICAgICAgICAgICBzZXRTdHJlYW1NdXRlKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgb24sIG91dHB1dCwgZGVsYXlNcywgZGV2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN0cmVhbU11dGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKLSAgICBTdHJlYW1EZXNjcmlwdG9yICZzdHJlYW1EZXNjID0gbVN0cmVhbXNbc3RyZWFtXTsKLSAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7Ci0gICAgfQotCi0gICAgQUxPR1ZWKCJzZXRTdHJlYW1NdXRlKCkgc3RyZWFtICVkLCBtdXRlICVkLCBvdXRwdXQgJWQsIG1NdXRlQ291bnQgJWQgZGV2aWNlICUwNHgiLAotICAgICAgICAgIHN0cmVhbSwgb24sIG91dHB1dCwgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dLCBkZXZpY2UpOwotCi0gICAgaWYgKG9uKSB7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0gPT0gMCkgewotICAgICAgICAgICAgaWYgKHN0cmVhbURlc2MubUNhbkJlTXV0ZWQgJiYKLSAgICAgICAgICAgICAgICAgICAgKChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkpKSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLCAwLCBvdXRwdXQsIGRldmljZSwgZGVsYXlNcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gaW5jcmVtZW50IG1NdXRlQ291bnQgYWZ0ZXIgY2FsbGluZyBjaGVja0FuZFNldFZvbHVtZSgpIHNvIHRoYXQgdm9sdW1lIGNoYW5nZSBpcyBub3QgaWdub3JlZAotICAgICAgICBvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0rKzsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAob3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJzZXRTdHJlYW1NdXRlKCkgdW5tdXRpbmcgbm9uIG11dGVkIHN0cmVhbSEiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoLS1vdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0gPT0gMCkgewotICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzYy5nZXRWb2x1bWVJbmRleChkZXZpY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0YXJ0aW5nLCBib29sIHN0YXRlQ2hhbmdlKQotewotICAgIC8vIGlmIHRoZSBzdHJlYW0gcGVydGFpbnMgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGFuZCB3ZSBhcmUgaW4gY2FsbCB3ZSBtdXN0Ci0gICAgLy8gbXV0ZSB0aGUgc3RyZWFtIGlmIGl0IGlzIGxvdyB2aXNpYmlsaXR5LiBJZiBpdCBpcyBoaWdoIHZpc2liaWxpdHksIHdlIG11c3QgcGxheSBhIHRvbmUKLSAgICAvLyBpbiB0aGUgZGV2aWNlIHVzZWQgZm9yIHBob25lIHN0cmF0ZWd5IGFuZCBwbGF5IHRoZSB0b25lIGlmIHRoZSBzZWxlY3RlZCBkZXZpY2UgZG9lcyBub3QKLSAgICAvLyBpbnRlcmZlcmUgd2l0aCB0aGUgZGV2aWNlIHVzZWQgZm9yIHBob25lIHN0cmF0ZWd5Ci0gICAgLy8gaWYgc3RhdGVDaGFuZ2UgaXMgdHJ1ZSwgd2UgYXJlIGNhbGxlZCBmcm9tIHNldFBob25lU3RhdGUoKSBhbmQgd2UgbXVzdCBtdXRlIG9yIHVubXV0ZSBhcwotICAgIC8vIG1hbnkgdGltZXMgYXMgdGhlcmUgYXJlIGFjdGl2ZSB0cmFja3Mgb24gdGhlIG91dHB1dAotICAgIGNvbnN0IHJvdXRpbmdfc3RyYXRlZ3kgc3RyZWFtX3N0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKLSAgICBpZiAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHx8Ci0gICAgICAgICAgICAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkpKSB7Ci0gICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG1QcmltYXJ5T3V0cHV0KTsKLSAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIHN0cmVhbSAlZCBzdGFydGluZyAlZCBkZXZpY2UgJXggc3RhdGVDaGFuZ2UgJWQiLAotICAgICAgICAgICAgICAgIHN0cmVhbSwgc3RhcnRpbmcsIG91dHB1dERlc2MtPm1EZXZpY2UsIHN0YXRlQ2hhbmdlKTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dKSB7Ci0gICAgICAgICAgICBpbnQgbXV0ZUNvdW50ID0gMTsKLSAgICAgICAgICAgIGlmIChzdGF0ZUNoYW5nZSkgewotICAgICAgICAgICAgICAgIG11dGVDb3VudCA9IG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX2xvd192aXNpYmlsaXR5KHN0cmVhbSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgbG93IHZpc2liaWxpdHksIG11dGVDb3VudCAlZCIsIG11dGVDb3VudCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtdXRlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1NdXRlKHN0cmVhbSwgc3RhcnRpbmcsIG1QcmltYXJ5T3V0cHV0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBoaWdoIHZpc2liaWxpdHkiKTsKLSAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+ZGV2aWNlKCkgJgotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUsIHRydWUgLypmcm9tQ2FjaGUqLykpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGhpZ2ggdmlzaWJpbGl0eSBtdXRlZCwgbXV0ZUNvdW50ICVkIiwgbXV0ZUNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtdXRlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHN0YXJ0aW5nLCBtUHJpbWFyeU91dHB1dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0aW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zdGFydFRvbmUoQVVESU9fUE9MSUNZX1RPTkVfSU5fQ0FMTF9OT1RJRklDQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zdG9wVG9uZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzSW5DYWxsKCkKLXsKLSAgICByZXR1cm4gaXNTdGF0ZUluQ2FsbChtUGhvbmVTdGF0ZSk7Ci19Ci0KLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0YXRlSW5DYWxsKGludCBzdGF0ZSkgewotICAgIHJldHVybiAoKHN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgfHwKLSAgICAgICAgICAgIChzdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NPTU1VTklDQVRJT04pKTsKLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNYXhFZmZlY3RzQ3B1TG9hZCgpCi17Ci0gICAgcmV0dXJuIE1BWF9FRkZFQ1RTX0NQVV9MT0FEOwotfQotCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1heEVmZmVjdHNNZW1vcnkoKQotewotICAgIHJldHVybiBNQVhfRUZGRUNUU19NRU1PUlk7Ci19Ci0KLQotLy8gLS0tIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciBjbGFzcyBpbXBsZW1lbnRhdGlvbgotCi1BdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yKAotICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlKQotICAgIDogbUlkKDApLCBtSW9IYW5kbGUoMCksIG1MYXRlbmN5KDApLAotICAgIG1GbGFncygoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpMCksIG1EZXZpY2UoQVVESU9fREVWSUNFX05PTkUpLCBtUG9saWN5TWl4KE5VTEwpLAotICAgIG1QYXRjaEhhbmRsZSgwKSwKLSAgICBtT3V0cHV0MSgwKSwgbU91dHB1dDIoMCksIG1Qcm9maWxlKHByb2ZpbGUpLCBtRGlyZWN0T3BlbkNvdW50KDApCi17Ci0gICAgLy8gY2xlYXIgdXNhZ2UgY291bnQgZm9yIGFsbCBzdHJlYW0gdHlwZXMKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICBtUmVmQ291bnRbaV0gPSAwOwotICAgICAgICBtQ3VyVm9sdW1lW2ldID0gLTEuMDsKLSAgICAgICAgbU11dGVDb3VudFtpXSA9IDA7Ci0gICAgICAgIG1TdG9wVGltZVtpXSA9IDA7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgewotICAgICAgICBtU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldID0gZmFsc2U7Ci0gICAgfQotICAgIGlmIChwcm9maWxlICE9IE5VTEwpIHsKLSAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KXByb2ZpbGUtPm1GbGFnczsKLSAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IHByb2ZpbGUtPnBpY2tTYW1wbGluZ1JhdGUoKTsKLSAgICAgICAgbUZvcm1hdCA9IHByb2ZpbGUtPnBpY2tGb3JtYXQoKTsKLSAgICAgICAgbUNoYW5uZWxNYXNrID0gcHJvZmlsZS0+cGlja0NoYW5uZWxNYXNrKCk7Ci0gICAgICAgIGlmIChwcm9maWxlLT5tR2FpbnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgcHJvZmlsZS0+bUdhaW5zWzBdLT5nZXREZWZhdWx0Q29uZmlnKCZtR2Fpbik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZGV2aWNlKCkgY29uc3QKLXsKLSAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgcmV0dXJuIChhdWRpb19kZXZpY2VzX3QpKG1PdXRwdXQxLT5tRGV2aWNlIHwgbU91dHB1dDItPm1EZXZpY2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlOwotICAgIH0KLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OmxhdGVuY3koKQotewotICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICByZXR1cm4gKG1PdXRwdXQxLT5tTGF0ZW5jeSA+IG1PdXRwdXQyLT5tTGF0ZW5jeSkgPyBtT3V0cHV0MS0+bUxhdGVuY3kgOiBtT3V0cHV0Mi0+bUxhdGVuY3k7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1MYXRlbmN5OwotICAgIH0KLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2hhcmVzSHdNb2R1bGVXaXRoKAotICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MpCi17Ci0gICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgIHJldHVybiBtT3V0cHV0MS0+c2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MpIHx8IG1PdXRwdXQyLT5zaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYyk7Ci0gICAgfSBlbHNlIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSl7Ci0gICAgICAgIHJldHVybiBzaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYy0+bU91dHB1dDEpIHx8IHNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjLT5tT3V0cHV0Mik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIChtUHJvZmlsZS0+bU1vZHVsZSA9PSBvdXRwdXREZXNjLT5tUHJvZmlsZS0+bU1vZHVsZSk7Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEpCi17Ci0gICAgLy8gZm9yd2FyZCB1c2FnZSBjb3VudCBjaGFuZ2UgdG8gYXR0YWNoZWQgb3V0cHV0cwotICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICBtT3V0cHV0MS0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCBkZWx0YSk7Ci0gICAgICAgIG1PdXRwdXQyLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIGRlbHRhKTsKLSAgICB9Ci0gICAgaWYgKChkZWx0YSArIChpbnQpbVJlZkNvdW50W3N0cmVhbV0pIDwgMCkgewotICAgICAgICBBTE9HVygiY2hhbmdlUmVmQ291bnQoKSBpbnZhbGlkIGRlbHRhICVkIGZvciBzdHJlYW0gJWQsIHJlZkNvdW50ICVkIiwKLSAgICAgICAgICAgICAgZGVsdGEsIHN0cmVhbSwgbVJlZkNvdW50W3N0cmVhbV0pOwotICAgICAgICBtUmVmQ291bnRbc3RyZWFtXSA9IDA7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbVJlZkNvdW50W3N0cmVhbV0gKz0gZGVsdGE7Ci0gICAgQUxPR1YoImNoYW5nZVJlZkNvdW50KCkgc3RyZWFtICVkLCBjb3VudCAlZCIsIHN0cmVhbSwgbVJlZkNvdW50W3N0cmVhbV0pOwotfQotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OnN1cHBvcnRlZERldmljZXMoKQotewotICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICByZXR1cm4gKGF1ZGlvX2RldmljZXNfdCkobU91dHB1dDEtPnN1cHBvcnRlZERldmljZXMoKSB8IG1PdXRwdXQyLT5zdXBwb3J0ZWREZXZpY2VzKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSA7Ci0gICAgfQotfQotCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0FjdGl2ZSh1aW50MzJfdCBpblBhc3RNcykgY29uc3QKLXsKLSAgICByZXR1cm4gaXNTdHJhdGVneUFjdGl2ZShOVU1fU1RSQVRFR0lFUywgaW5QYXN0TXMpOwotfQotCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc1N0cmF0ZWd5QWN0aXZlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUpIGNvbnN0Ci17Ci0gICAgaWYgKChzeXNUaW1lID09IDApICYmIChpblBhc3RNcyAhPSAwKSkgewotICAgICAgICBzeXNUaW1lID0gc3lzdGVtVGltZSgpOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7Ci0gICAgICAgIGlmIChpID09IEFVRElPX1NUUkVBTV9QQVRDSCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCgoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSkgPT0gc3RyYXRlZ3kpIHx8Ci0gICAgICAgICAgICAgICAgKE5VTV9TVFJBVEVHSUVTID09IHN0cmF0ZWd5KSkgJiYKLSAgICAgICAgICAgICAgICBpc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpLCBpblBhc3RNcywgc3lzVGltZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUpIGNvbnN0Ci17Ci0gICAgaWYgKG1SZWZDb3VudFtzdHJlYW1dICE9IDApIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmIChpblBhc3RNcyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHN5c1RpbWUgPT0gMCkgewotICAgICAgICBzeXNUaW1lID0gc3lzdGVtVGltZSgpOwotICAgIH0KLSAgICBpZiAobnMybXMoc3lzVGltZSAtIG1TdG9wVGltZVtzdHJlYW1dKSA8IGluUGFzdE1zKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAotewotICAgIEFMT0dfQVNTRVJUKCFpc0R1cGxpY2F0ZWQoKSwgInRvQXVkaW9Qb3J0Q29uZmlnKCkgY2FsbGVkIG9uIGR1cGxpY2F0ZWQgb3V0cHV0ICVkIiwgbUlvSGFuZGxlKTsKLQotICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURXxBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0t8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUfEFVRElPX1BPUlRfQ09ORklHX0dBSU47Ci0gICAgaWYgKHNyY0NvbmZpZyAhPSBOVUxMKSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gc3JjQ29uZmlnLT5jb25maWdfbWFzazsKLSAgICB9Ci0gICAgQXVkaW9Qb3J0Q29uZmlnOjp0b0F1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7Ci0KLSAgICBkc3RDb25maWctPmlkID0gbUlkOwotICAgIGRzdENvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7Ci0gICAgZHN0Q29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKLSAgICBkc3RDb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gbVByb2ZpbGUtPm1Nb2R1bGUtPm1IYW5kbGU7Ci0gICAgZHN0Q29uZmlnLT5leHQubWl4LmhhbmRsZSA9IG1Jb0hhbmRsZTsKLSAgICBkc3RDb25maWctPmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVDsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0Ci17Ci0gICAgQUxPR19BU1NFUlQoIWlzRHVwbGljYXRlZCgpLCAidG9BdWRpb1BvcnQoKSBjYWxsZWQgb24gZHVwbGljYXRlZCBvdXRwdXQgJWQiLCBtSW9IYW5kbGUpOwotICAgIG1Qcm9maWxlLT50b0F1ZGlvUG9ydChwb3J0KTsKLSAgICBwb3J0LT5pZCA9IG1JZDsKLSAgICB0b0F1ZGlvUG9ydENvbmZpZygmcG9ydC0+YWN0aXZlX2NvbmZpZyk7Ci0gICAgcG9ydC0+ZXh0Lm1peC5od19tb2R1bGUgPSBtUHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZTsKLSAgICBwb3J0LT5leHQubWl4LmhhbmRsZSA9IG1Jb0hhbmRsZTsKLSAgICBwb3J0LT5leHQubWl4LmxhdGVuY3lfY2xhc3MgPQotICAgICAgICAgICAgbUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCA/IEFVRElPX0xBVEVOQ1lfTE9XIDogQVVESU9fTEFURU5DWV9OT1JNQUw7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJRDogJWRcbiIsIG1JZCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JtYXQ6ICUwOHhcbiIsIG1Gb3JtYXQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBMYXRlbmN5OiAlZFxuIiwgbUxhdGVuY3kpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRmxhZ3MgJTA4eFxuIiwgbUZsYWdzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIERldmljZXMgJTA4eFxuIiwgZGV2aWNlKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU3RyZWFtIHZvbHVtZSByZWZDb3VudCBtdXRlQ291bnRcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlMDJkICAgICAlLjAzZiAgICAgJTAyZCAgICAgICAlMDJkXG4iLAotICAgICAgICAgICAgICAgICBpLCBtQ3VyVm9sdW1lW2ldLCBtUmVmQ291bnRbaV0sIG1NdXRlQ291bnRbaV0pOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyAtLS0gQXVkaW9JbnB1dERlc2NyaXB0b3IgY2xhc3MgaW1wbGVtZW50YXRpb24KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb0lucHV0RGVzY3JpcHRvcjo6QXVkaW9JbnB1dERlc2NyaXB0b3IoY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSkKLSAgICA6IG1JZCgwKSwgbUlvSGFuZGxlKDApLAotICAgICAgbURldmljZShBVURJT19ERVZJQ0VfTk9ORSksIG1Qb2xpY3lNaXgoTlVMTCksIG1QYXRjaEhhbmRsZSgwKSwgbVJlZkNvdW50KDApLAotICAgICAgbUlucHV0U291cmNlKEFVRElPX1NPVVJDRV9ERUZBVUxUKSwgbVByb2ZpbGUocHJvZmlsZSksIG1Jc1NvdW5kVHJpZ2dlcihmYWxzZSkKLXsKLSAgICBpZiAocHJvZmlsZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1TYW1wbGluZ1JhdGUgPSBwcm9maWxlLT5waWNrU2FtcGxpbmdSYXRlKCk7Ci0gICAgICAgIG1Gb3JtYXQgPSBwcm9maWxlLT5waWNrRm9ybWF0KCk7Ci0gICAgICAgIG1DaGFubmVsTWFzayA9IHByb2ZpbGUtPnBpY2tDaGFubmVsTWFzaygpOwotICAgICAgICBpZiAocHJvZmlsZS0+bUdhaW5zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHByb2ZpbGUtPm1HYWluc1swXS0+Z2V0RGVmYXVsdENvbmZpZygmbUdhaW4pOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9JbnB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKLXsKLSAgICBBTE9HX0FTU0VSVChtUHJvZmlsZSAhPSAwLAotICAgICAgICAgICAgICAgICJ0b0F1ZGlvUG9ydENvbmZpZygpIGNhbGxlZCBvbiBpbnB1dCB3aXRoIG51bGwgcHJvZmlsZSAlZCIsIG1Jb0hhbmRsZSk7Ci0gICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFfEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTS3wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX0NPTkZJR19GT1JNQVR8QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKLSAgICBpZiAoc3JjQ29uZmlnICE9IE5VTEwpIHsKLSAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayB8PSBzcmNDb25maWctPmNvbmZpZ19tYXNrOwotICAgIH0KLQotICAgIEF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOwotCi0gICAgZHN0Q29uZmlnLT5pZCA9IG1JZDsKLSAgICBkc3RDb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSzsKLSAgICBkc3RDb25maWctPnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYOwotICAgIGRzdENvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBtUHJvZmlsZS0+bU1vZHVsZS0+bUhhbmRsZTsKLSAgICBkc3RDb25maWctPmV4dC5taXguaGFuZGxlID0gbUlvSGFuZGxlOwotICAgIGRzdENvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IG1JbnB1dFNvdXJjZTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvSW5wdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKLXsKLSAgICBBTE9HX0FTU0VSVChtUHJvZmlsZSAhPSAwLCAidG9BdWRpb1BvcnQoKSBjYWxsZWQgb24gaW5wdXQgd2l0aCBudWxsIHByb2ZpbGUgJWQiLCBtSW9IYW5kbGUpOwotCi0gICAgbVByb2ZpbGUtPnRvQXVkaW9Qb3J0KHBvcnQpOwotICAgIHBvcnQtPmlkID0gbUlkOwotICAgIHRvQXVkaW9Qb3J0Q29uZmlnKCZwb3J0LT5hY3RpdmVfY29uZmlnKTsKLSAgICBwb3J0LT5leHQubWl4Lmh3X21vZHVsZSA9IG1Qcm9maWxlLT5tTW9kdWxlLT5tSGFuZGxlOwotICAgIHBvcnQtPmV4dC5taXguaGFuZGxlID0gbUlvSGFuZGxlOwotICAgIHBvcnQtPmV4dC5taXgubGF0ZW5jeV9jbGFzcyA9IEFVRElPX0xBVEVOQ1lfTk9STUFMOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvSW5wdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJRDogJWRcbiIsIG1JZCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JtYXQ6ICVkXG4iLCBtRm9ybWF0KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRGV2aWNlcyAlMDh4XG4iLCBtRGV2aWNlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFJlZiBDb3VudCAlZFxuIiwgbVJlZkNvdW50KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIE9wZW4gUmVmIENvdW50ICVkXG4iLCBtT3BlblJlZkNvdW50KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gLS0tIFN0cmVhbURlc2NyaXB0b3IgY2xhc3MgaW1wbGVtZW50YXRpb24KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpTdHJlYW1EZXNjcmlwdG9yOjpTdHJlYW1EZXNjcmlwdG9yKCkKLSAgICA6ICAgbUluZGV4TWluKDApLCBtSW5kZXhNYXgoMSksIG1DYW5CZU11dGVkKHRydWUpCi17Ci0gICAgbUluZGV4Q3VyLmFkZChBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQsIDApOwotfQotCi1pbnQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpTdHJlYW1EZXNjcmlwdG9yOjpnZXRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQotewotICAgIGRldmljZSA9IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7Ci0gICAgLy8gdGhlcmUgaXMgYWx3YXlzIGEgdmFsaWQgZW50cnkgZm9yIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVAotICAgIGlmIChtSW5kZXhDdXIuaW5kZXhPZktleShkZXZpY2UpIDwgMCkgewotICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQ7Ci0gICAgfQotICAgIHJldHVybiBtSW5kZXhDdXIudmFsdWVGb3IoZGV2aWNlKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OlN0cmVhbURlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXMgICAgICAgICAlMDJkICAgICAgICAgJTAyZCAgICAgICAgICIsCi0gICAgICAgICAgICAgbUNhbkJlTXV0ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwgbUluZGV4TWluLCBtSW5kZXhNYXgpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbmRleEN1ci5zaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlMDR4IDogJTAyZCwgIiwKLSAgICAgICAgICAgICAgICAgbUluZGV4Q3VyLmtleUF0KGkpLAotICAgICAgICAgICAgICAgICBtSW5kZXhDdXIudmFsdWVBdChpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotfQotCi0vLyAtLS0gRWZmZWN0RGVzY3JpcHRvciBjbGFzcyBpbXBsZW1lbnRhdGlvbgotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkVmZmVjdERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEkvTzogJWRcbiIsIG1Jbyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTdHJhdGVneTogJWRcbiIsIG1TdHJhdGVneSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTZXNzaW9uOiAlZFxuIiwgbVNlc3Npb24pOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgTmFtZTogJXNcbiIsICBtRGVzYy5uYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICVzXG4iLCAgbUVuYWJsZWQgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIC0tLSBId01vZHVsZSBjbGFzcyBpbXBsZW1lbnRhdGlvbgotCi1BdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlOjpId01vZHVsZShjb25zdCBjaGFyICpuYW1lKQotICAgIDogbU5hbWUoc3RybmR1cChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTUFYX0xFTikpLAotICAgICAgbUhhbFZlcnNpb24oQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OX01JTiksIG1IYW5kbGUoMCkKLXsKLX0KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6fkh3TW9kdWxlKCkKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICBtT3V0cHV0UHJvZmlsZXNbaV0tPm1TdXBwb3J0ZWREZXZpY2VzLmNsZWFyKCk7Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbUlucHV0UHJvZmlsZXNbaV0tPm1TdXBwb3J0ZWREZXZpY2VzLmNsZWFyKCk7Ci0gICAgfQotICAgIGZyZWUoKHZvaWQgKiltTmFtZSk7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU6OmxvYWRJbnB1dChjbm9kZSAqcm9vdCkKLXsKLSAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotCi0gICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbmV3IElPUHJvZmlsZShTdHJpbmc4KHJvb3QtPm5hbWUpLCBBVURJT19QT1JUX1JPTEVfU0lOSywgdGhpcyk7Ci0KLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIFNBTVBMSU5HX1JBVEVTX1RBRykgPT0gMCkgewotICAgICAgICAgICAgcHJvZmlsZS0+bG9hZFNhbXBsaW5nUmF0ZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZPUk1BVFNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBwcm9maWxlLT5sb2FkRm9ybWF0cygoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQ0hBTk5FTFNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBwcm9maWxlLT5sb2FkSW5DaGFubmVscygoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgREVWSUNFU19UQUcpID09IDApIHsKLSAgICAgICAgICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmxvYWREZXZpY2VzRnJvbU5hbWUoKGNoYXIgKilub2RlLT52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlY2xhcmVkRGV2aWNlcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZMQUdTX1RBRykgPT0gMCkgewotICAgICAgICAgICAgcHJvZmlsZS0+bUZsYWdzID0gcGFyc2VJbnB1dEZsYWdOYW1lcygoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTlNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBwcm9maWxlLT5sb2FkR2FpbnMobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSwKLSAgICAgICAgICAgICJsb2FkSW5wdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBkZXZpY2VzIik7Ci0gICAgQUxPR1dfSUYocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgPT0gMCwKLSAgICAgICAgICAgICJsb2FkSW5wdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBjaGFubmVsIG1hc2tzIik7Ci0gICAgQUxPR1dfSUYocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuc2l6ZSgpID09IDAsCi0gICAgICAgICAgICAibG9hZElucHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMiKTsKLSAgICBBTE9HV19JRihwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgPT0gMCwKLSAgICAgICAgICAgICJsb2FkSW5wdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBmb3JtYXRzIik7Ci0gICAgaWYgKCFwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCkgJiYKLSAgICAgICAgICAgIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLnNpemUoKSAhPSAwKSAmJgotICAgICAgICAgICAgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLnNpemUoKSAhPSAwKSAmJgotICAgICAgICAgICAgKHByb2ZpbGUtPm1Gb3JtYXRzLnNpemUoKSAhPSAwKSkgewotCi0gICAgICAgIEFMT0dWKCJsb2FkSW5wdXQoKSBhZGRpbmcgaW5wdXQgU3VwcG9ydGVkIERldmljZXMgJTA0eCIsCi0gICAgICAgICAgICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkpOwotCi0gICAgICAgIG1JbnB1dFByb2ZpbGVzLmFkZChwcm9maWxlKTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlOjpsb2FkT3V0cHV0KGNub2RlICpyb290KQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0KLSAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBuZXcgSU9Qcm9maWxlKFN0cmluZzgocm9vdC0+bmFtZSksIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIHRoaXMpOwotCi0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBTQU1QTElOR19SQVRFU19UQUcpID09IDApIHsKLSAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRTYW1wbGluZ1JhdGVzKChjaGFyICopbm9kZS0+dmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBGT1JNQVRTX1RBRykgPT0gMCkgewotICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEZvcm1hdHMoKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIENIQU5ORUxTX1RBRykgPT0gMCkgewotICAgICAgICAgICAgcHJvZmlsZS0+bG9hZE91dENoYW5uZWxzKChjaGFyICopbm9kZS0+dmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBERVZJQ0VTX1RBRykgPT0gMCkgewotICAgICAgICAgICAgcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMubG9hZERldmljZXNGcm9tTmFtZSgoY2hhciAqKW5vZGUtPnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVjbGFyZWREZXZpY2VzKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgRkxBR1NfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBwcm9maWxlLT5tRmxhZ3MgPSBwYXJzZU91dHB1dEZsYWdOYW1lcygoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTlNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBwcm9maWxlLT5sb2FkR2FpbnMobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSwKLSAgICAgICAgICAgICJsb2FkT3V0cHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgZGV2aWNlcyIpOwotICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpID09IDAsCi0gICAgICAgICAgICAibG9hZE91dHB1dCgpIGludmFsaWQgc3VwcG9ydGVkIGNoYW5uZWwgbWFza3MiKTsKLSAgICBBTE9HV19JRihwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgPT0gMCwKLSAgICAgICAgICAgICJsb2FkT3V0cHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMiKTsKLSAgICBBTE9HV19JRihwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgPT0gMCwKLSAgICAgICAgICAgICJsb2FkT3V0cHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgZm9ybWF0cyIpOwotICAgIGlmICghcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpICYmCi0gICAgICAgICAgICAocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgIT0gMCkgJiYKLSAgICAgICAgICAgIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgIT0gMCkgJiYKLSAgICAgICAgICAgIChwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgIT0gMCkpIHsKLQotICAgICAgICBBTE9HVigibG9hZE91dHB1dCgpIGFkZGluZyBvdXRwdXQgU3VwcG9ydGVkIERldmljZXMgJTA0eCwgbUZsYWdzICUwNHgiLAotICAgICAgICAgICAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpLCBwcm9maWxlLT5tRmxhZ3MpOwotCi0gICAgICAgIG1PdXRwdXRQcm9maWxlcy5hZGQocHJvZmlsZSk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6bG9hZERldmljZShjbm9kZSAqcm9vdCkKLXsKLSAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotCi0gICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIERFVklDRV9UWVBFKSA9PSAwKSB7Ci0gICAgICAgICAgICB0eXBlID0gcGFyc2VEZXZpY2VOYW1lcygoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICBpZiAodHlwZSA9PSBBVURJT19ERVZJQ0VfTk9ORSB8fAotICAgICAgICAgICAgKCFhdWRpb19pc19pbnB1dF9kZXZpY2UodHlwZSkgJiYgIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UodHlwZSkpKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkRGV2aWNlKCkgYmFkIHR5cGUgJTA4eCIsIHR5cGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOChyb290LT5uYW1lKSwgdHlwZSk7Ci0gICAgZGV2aWNlRGVzYy0+bU1vZHVsZSA9IHRoaXM7Ci0KLSAgICBub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBERVZJQ0VfQUREUkVTUykgPT0gMCkgewotICAgICAgICAgICAgZGV2aWNlRGVzYy0+bUFkZHJlc3MgPSBTdHJpbmc4KChjaGFyICopbm9kZS0+dmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBDSEFOTkVMU19UQUcpID09IDApIHsKLSAgICAgICAgICAgIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UodHlwZSkpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VEZXNjLT5sb2FkSW5DaGFubmVscygoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlRGVzYy0+bG9hZE91dENoYW5uZWxzKChjaGFyICopbm9kZS0+dmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOU19UQUcpID09IDApIHsKLSAgICAgICAgICAgIGRldmljZURlc2MtPmxvYWRHYWlucyhub2RlKTsKLSAgICAgICAgfQotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0KLSAgICBBTE9HVigibG9hZERldmljZSgpIGFkZGluZyBkZXZpY2UgbmFtZSAlcyB0eXBlICUwOHggYWRkcmVzcyAlcyIsCi0gICAgICAgICAgZGV2aWNlRGVzYy0+bU5hbWUuc3RyaW5nKCksIHR5cGUsIGRldmljZURlc2MtPm1BZGRyZXNzLnN0cmluZygpKTsKLQotICAgIG1EZWNsYXJlZERldmljZXMuYWRkKGRldmljZURlc2MpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlOjphZGRPdXRwdXRQcm9maWxlKFN0cmluZzggbmFtZSwgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgU3RyaW5nOCBhZGRyZXNzKQotewotICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUobmFtZSwgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSwgdGhpcyk7Ci0KLSAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoY29uZmlnLT5zYW1wbGVfcmF0ZSk7Ci0gICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoY29uZmlnLT5jaGFubmVsX21hc2spOwotICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmFkZChjb25maWctPmZvcm1hdCk7Ci0KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOCgiIiksIGRldmljZSk7Ci0gICAgZGV2RGVzYy0+bUFkZHJlc3MgPSBhZGRyZXNzOwotICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmFkZChkZXZEZXNjKTsKLQotICAgIG1PdXRwdXRQcm9maWxlcy5hZGQocHJvZmlsZSk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6SHdNb2R1bGU6OnJlbW92ZU91dHB1dFByb2ZpbGUoU3RyaW5nOCBuYW1lKQotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtT3V0cHV0UHJvZmlsZXNbaV0tPm1OYW1lID09IG5hbWUpIHsKLSAgICAgICAgICAgIG1PdXRwdXRQcm9maWxlcy5yZW1vdmVBdChpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlOjphZGRJbnB1dFByb2ZpbGUoU3RyaW5nOCBuYW1lLCBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBTdHJpbmc4IGFkZHJlc3MpCi17Ci0gICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbmV3IElPUHJvZmlsZShuYW1lLCBBVURJT19QT1JUX1JPTEVfU0lOSywgdGhpcyk7Ci0KLSAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoY29uZmlnLT5zYW1wbGVfcmF0ZSk7Ci0gICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoY29uZmlnLT5jaGFubmVsX21hc2spOwotICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmFkZChjb25maWctPmZvcm1hdCk7Ci0KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOCgiIiksIGRldmljZSk7Ci0gICAgZGV2RGVzYy0+bUFkZHJlc3MgPSBhZGRyZXNzOwotICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmFkZChkZXZEZXNjKTsKLQotICAgIEFMT0dWKCJhZGRJbnB1dFByb2ZpbGUoKSBuYW1lICVzIHJhdGUgJWQgbWFzayAweDA4IiwgbmFtZS5zdHJpbmcoKSwgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5jaGFubmVsX21hc2spOwotCi0gICAgbUlucHV0UHJvZmlsZXMuYWRkKHByb2ZpbGUpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Okh3TW9kdWxlOjpyZW1vdmVJbnB1dFByb2ZpbGUoU3RyaW5nOCBuYW1lKQotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1JbnB1dFByb2ZpbGVzW2ldLT5tTmFtZSA9PSBuYW1lKSB7Ci0gICAgICAgICAgICBtSW5wdXRQcm9maWxlcy5yZW1vdmVBdChpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpId01vZHVsZTo6ZHVtcChpbnQgZmQpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIC0gbmFtZTogJXNcbiIsIG1OYW1lKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAtIGhhbmRsZTogJWRcbiIsIG1IYW5kbGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIC0gdmVyc2lvbjogJXUuJXVcbiIsIG1IYWxWZXJzaW9uID4+IDgsIG1IYWxWZXJzaW9uICYgMHhGRik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIGlmIChtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpKSB7Ci0gICAgICAgIHdyaXRlKGZkLCAiICAtIG91dHB1dHM6XG4iLCBzdHJsZW4oIiAgLSBvdXRwdXRzOlxuIikpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIG91dHB1dCAlenU6XG4iLCBpKTsKLSAgICAgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgICAgIG1PdXRwdXRQcm9maWxlc1tpXS0+ZHVtcChmZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1JbnB1dFByb2ZpbGVzLnNpemUoKSkgewotICAgICAgICB3cml0ZShmZCwgIiAgLSBpbnB1dHM6XG4iLCBzdHJsZW4oIiAgLSBpbnB1dHM6XG4iKSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICBpbnB1dCAlenU6XG4iLCBpKTsKLSAgICAgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgICAgIG1JbnB1dFByb2ZpbGVzW2ldLT5kdW1wKGZkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobURlY2xhcmVkRGV2aWNlcy5zaXplKCkpIHsKLSAgICAgICAgd3JpdGUoZmQsICIgIC0gZGV2aWNlczpcbiIsIHN0cmxlbigiICAtIGRldmljZXM6XG4iKSk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbURlY2xhcmVkRGV2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgbURlY2xhcmVkRGV2aWNlc1tpXS0+ZHVtcChmZCwgNCwgaSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIC0tLSBBdWRpb1BvcnQgY2xhc3MgaW1wbGVtZW50YXRpb24KLQotCi1BdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6QXVkaW9Qb3J0KGNvbnN0IFN0cmluZzgmIG5hbWUsIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCi0gICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwgY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpIDoKLSAgICBtTmFtZShuYW1lKSwgbVR5cGUodHlwZSksIG1Sb2xlKHJvbGUpLCBtTW9kdWxlKG1vZHVsZSksIG1GbGFncygwKQotewotICAgIG1Vc2VJbkNoYW5uZWxNYXNrID0gKCh0eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpICYmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpKSB8fAotICAgICAgICAgICAgICAgICAgICAoKHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgJiYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0Ci17Ci0gICAgcG9ydC0+cm9sZSA9IG1Sb2xlOwotICAgIHBvcnQtPnR5cGUgPSBtVHlwZTsKLSAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpICYmIGkgPCBBVURJT19QT1JUX01BWF9TQU1QTElOR19SQVRFUzsgaSsrKSB7Ci0gICAgICAgIGlmIChtU2FtcGxpbmdSYXRlc1tpXSAhPSAwKSB7Ci0gICAgICAgICAgICBwb3J0LT5zYW1wbGVfcmF0ZXNbaV0gPSBtU2FtcGxpbmdSYXRlc1tpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwb3J0LT5udW1fc2FtcGxlX3JhdGVzID0gaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCkgJiYgaSA8IEFVRElPX1BPUlRfTUFYX0NIQU5ORUxfTUFTS1M7IGkrKykgewotICAgICAgICBpZiAobUNoYW5uZWxNYXNrc1tpXSAhPSAwKSB7Ci0gICAgICAgICAgICBwb3J0LT5jaGFubmVsX21hc2tzW2ldID0gbUNoYW5uZWxNYXNrc1tpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwb3J0LT5udW1fY2hhbm5lbF9tYXNrcyA9IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKSAmJiBpIDwgQVVESU9fUE9SVF9NQVhfRk9STUFUUzsgaSsrKSB7Ci0gICAgICAgIGlmIChtRm9ybWF0c1tpXSAhPSAwKSB7Ci0gICAgICAgICAgICBwb3J0LT5mb3JtYXRzW2ldID0gbUZvcm1hdHNbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcG9ydC0+bnVtX2Zvcm1hdHMgPSBpOwotCi0gICAgQUxPR1YoIkF1ZGlvUG9ydDo6dG9BdWRpb1BvcnQoKSBudW0gZ2FpbnMgJXp1IiwgbUdhaW5zLnNpemUoKSk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbUdhaW5zLnNpemUoKSAmJiBpIDwgQVVESU9fUE9SVF9NQVhfR0FJTlM7IGkrKykgewotICAgICAgICBwb3J0LT5nYWluc1tpXSA9IG1HYWluc1tpXS0+bUdhaW47Ci0gICAgfQotICAgIHBvcnQtPm51bV9nYWlucyA9IGk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmltcG9ydEF1ZGlvUG9ydChjb25zdCBzcDxBdWRpb1BvcnQ+IHBvcnQpIHsKLSAgICBmb3IgKHNpemVfdCBrID0gMCA7IGsgPCBwb3J0LT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgOyBrKyspIHsKLSAgICAgICAgY29uc3QgdWludDMyX3QgcmF0ZSA9IHBvcnQtPm1TYW1wbGluZ1JhdGVzLml0ZW1BdChrKTsKLSAgICAgICAgaWYgKHJhdGUgIT0gMCkgeyAvLyBza2lwICJkeW5hbWljIiByYXRlcwotICAgICAgICAgICAgYm9vbCBoYXNSYXRlID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBsID0gMCA7IGwgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCkgOyBsKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocmF0ZSA9PSBtU2FtcGxpbmdSYXRlcy5pdGVtQXQobCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFzUmF0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaGFzUmF0ZSkgeyAvLyBuZXZlciBpbXBvcnQgYSBzYW1wbGluZyByYXRlIHR3aWNlCi0gICAgICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZXMuYWRkKHJhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGsgPSAwIDsgayA8IHBvcnQtPm1DaGFubmVsTWFza3Muc2l6ZSgpIDsgaysrKSB7Ci0gICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IG1hc2sgPSBwb3J0LT5tQ2hhbm5lbE1hc2tzLml0ZW1BdChrKTsKLSAgICAgICAgaWYgKG1hc2sgIT0gMCkgeyAvLyBza2lwICJkeW5hbWljIiBtYXNrcwotICAgICAgICAgICAgYm9vbCBoYXNNYXNrID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBsID0gMCA7IGwgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKSA7IGwrKykgewotICAgICAgICAgICAgICAgIGlmIChtYXNrID09IG1DaGFubmVsTWFza3MuaXRlbUF0KGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhhc01hc2sgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWhhc01hc2spIHsgLy8gbmV2ZXIgaW1wb3J0IGEgY2hhbm5lbCBtYXNrIHR3aWNlCi0gICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrcy5hZGQobWFzayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChzaXplX3QgayA9IDAgOyBrIDwgcG9ydC0+bUZvcm1hdHMuc2l6ZSgpIDsgaysrKSB7Ci0gICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IHBvcnQtPm1Gb3JtYXRzLml0ZW1BdChrKTsKLSAgICAgICAgaWYgKGZvcm1hdCAhPSAwKSB7IC8vIHNraXAgImR5bmFtaWMiIGZvcm1hdHMKLSAgICAgICAgICAgIGJvb2wgaGFzRm9ybWF0ID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBsID0gMCA7IGwgPCBtRm9ybWF0cy5zaXplKCkgOyBsKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ID09IG1Gb3JtYXRzLml0ZW1BdChsKSkgewotICAgICAgICAgICAgICAgICAgICBoYXNGb3JtYXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWhhc0Zvcm1hdCkgeyAvLyBuZXZlciBpbXBvcnQgYSBjaGFubmVsIG1hc2sgdHdpY2UKLSAgICAgICAgICAgICAgICBtRm9ybWF0cy5hZGQoZm9ybWF0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKHNpemVfdCBrID0gMCA7IGsgPCBwb3J0LT5tR2FpbnMuc2l6ZSgpIDsgaysrKSB7Ci0gICAgICAgIHNwPEF1ZGlvR2Fpbj4gZ2FpbiA9IHBvcnQtPm1HYWlucy5pdGVtQXQoayk7Ci0gICAgICAgIGlmIChnYWluICE9IDApIHsKLSAgICAgICAgICAgIGJvb2wgaGFzR2FpbiA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChzaXplX3QgbCA9IDAgOyBsIDwgbUdhaW5zLnNpemUoKSA7IGwrKykgewotICAgICAgICAgICAgICAgIGlmIChnYWluID09IG1HYWlucy5pdGVtQXQobCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaGFzR2FpbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaGFzR2FpbikgeyAvLyBuZXZlciBpbXBvcnQgYSBnYWluIHR3aWNlCi0gICAgICAgICAgICAgICAgbUdhaW5zLmFkZChnYWluKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6Y2xlYXJDYXBhYmlsaXRpZXMoKSB7Ci0gICAgbUNoYW5uZWxNYXNrcy5jbGVhcigpOwotICAgIG1Gb3JtYXRzLmNsZWFyKCk7Ci0gICAgbVNhbXBsaW5nUmF0ZXMuY2xlYXIoKTsKLSAgICBtR2FpbnMuY2xlYXIoKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6bG9hZFNhbXBsaW5nUmF0ZXMoY2hhciAqbmFtZSkKLXsKLSAgICBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKLQotICAgIC8vIGJ5IGNvbnZlbnRpb24sICIwJyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gbVNhbXBsaW5nUmF0ZXMgaW5kaWNhdGVzIHRoZSBzdXBwb3J0ZWQgc2FtcGxpbmcKLSAgICAvLyByYXRlcyBzaG91bGQgYmUgcmVhZCBmcm9tIHRoZSBvdXRwdXQgc3RyZWFtIGFmdGVyIGl0IGlzIG9wZW5lZCBmb3IgdGhlIGZpcnN0IHRpbWUKLSAgICBpZiAoc3RyICE9IE5VTEwgJiYgc3RyY21wKHN0ciwgRFlOQU1JQ19WQUxVRV9UQUcpID09IDApIHsKLSAgICAgICAgbVNhbXBsaW5nUmF0ZXMuYWRkKDApOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgd2hpbGUgKHN0ciAhPSBOVUxMKSB7Ci0gICAgICAgIHVpbnQzMl90IHJhdGUgPSBhdG9pKHN0cik7Ci0gICAgICAgIGlmIChyYXRlICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkU2FtcGxpbmdSYXRlcygpIGFkZGluZyByYXRlICVkIiwgcmF0ZSk7Ci0gICAgICAgICAgICBtU2FtcGxpbmdSYXRlcy5hZGQocmF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyID0gc3RydG9rKE5VTEwsICJ8Iik7Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojpsb2FkRm9ybWF0cyhjaGFyICpuYW1lKQotewotICAgIGNoYXIgKnN0ciA9IHN0cnRvayhuYW1lLCAifCIpOwotCi0gICAgLy8gYnkgY29udmVudGlvbiwgIjAnIGluIHRoZSBmaXJzdCBlbnRyeSBpbiBtRm9ybWF0cyBpbmRpY2F0ZXMgdGhlIHN1cHBvcnRlZCBmb3JtYXRzCi0gICAgLy8gc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgb3V0cHV0IHN0cmVhbSBhZnRlciBpdCBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lCi0gICAgaWYgKHN0ciAhPSBOVUxMICYmIHN0cmNtcChzdHIsIERZTkFNSUNfVkFMVUVfVEFHKSA9PSAwKSB7Ci0gICAgICAgIG1Gb3JtYXRzLmFkZChBVURJT19GT1JNQVRfREVGQVVMVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB3aGlsZSAoc3RyICE9IE5VTEwpIHsKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KXN0cmluZ1RvRW51bShzRm9ybWF0TmFtZVRvRW51bVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0Zvcm1hdE5hbWVUb0VudW1UYWJsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKLSAgICAgICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCkgewotICAgICAgICAgICAgbUZvcm1hdHMuYWRkKGZvcm1hdCk7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyID0gc3RydG9rKE5VTEwsICJ8Iik7Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojpsb2FkSW5DaGFubmVscyhjaGFyICpuYW1lKQotewotICAgIGNvbnN0IGNoYXIgKnN0ciA9IHN0cnRvayhuYW1lLCAifCIpOwotCi0gICAgQUxPR1YoImxvYWRJbkNoYW5uZWxzKCkgJXMiLCBuYW1lKTsKLQotICAgIGlmIChzdHIgIT0gTlVMTCAmJiBzdHJjbXAoc3RyLCBEWU5BTUlDX1ZBTFVFX1RBRykgPT0gMCkgewotICAgICAgICBtQ2hhbm5lbE1hc2tzLmFkZCgwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHdoaWxlIChzdHIgIT0gTlVMTCkgewotICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9Ci0gICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KXN0cmluZ1RvRW51bShzSW5DaGFubmVsc05hbWVUb0VudW1UYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0luQ2hhbm5lbHNOYW1lVG9FbnVtVGFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKLSAgICAgICAgaWYgKGNoYW5uZWxNYXNrICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkSW5DaGFubmVscygpIGFkZGluZyBjaGFubmVsTWFzayAlMDR4IiwgY2hhbm5lbE1hc2spOwotICAgICAgICAgICAgbUNoYW5uZWxNYXNrcy5hZGQoY2hhbm5lbE1hc2spOwotICAgICAgICB9Ci0gICAgICAgIHN0ciA9IHN0cnRvayhOVUxMLCAifCIpOwotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6bG9hZE91dENoYW5uZWxzKGNoYXIgKm5hbWUpCi17Ci0gICAgY29uc3QgY2hhciAqc3RyID0gc3RydG9rKG5hbWUsICJ8Iik7Ci0KLSAgICBBTE9HVigibG9hZE91dENoYW5uZWxzKCkgJXMiLCBuYW1lKTsKLQotICAgIC8vIGJ5IGNvbnZlbnRpb24sICIwJyBpbiB0aGUgZmlyc3QgZW50cnkgaW4gbUNoYW5uZWxNYXNrcyBpbmRpY2F0ZXMgdGhlIHN1cHBvcnRlZCBjaGFubmVsCi0gICAgLy8gbWFza3Mgc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgb3V0cHV0IHN0cmVhbSBhZnRlciBpdCBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lCi0gICAgaWYgKHN0ciAhPSBOVUxMICYmIHN0cmNtcChzdHIsIERZTkFNSUNfVkFMVUVfVEFHKSA9PSAwKSB7Ci0gICAgICAgIG1DaGFubmVsTWFza3MuYWRkKDApOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgd2hpbGUgKHN0ciAhPSBOVUxMKSB7Ci0gICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0KLSAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3Qpc3RyaW5nVG9FbnVtKHNPdXRDaGFubmVsc05hbWVUb0VudW1UYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc091dENoYW5uZWxzTmFtZVRvRW51bVRhYmxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cik7Ci0gICAgICAgIGlmIChjaGFubmVsTWFzayAhPSAwKSB7Ci0gICAgICAgICAgICBtQ2hhbm5lbE1hc2tzLmFkZChjaGFubmVsTWFzayk7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyID0gc3RydG9rKE5VTEwsICJ8Iik7Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQotYXVkaW9fZ2Fpbl9tb2RlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmxvYWRHYWluTW9kZShjaGFyICpuYW1lKQotewotICAgIGNvbnN0IGNoYXIgKnN0ciA9IHN0cnRvayhuYW1lLCAifCIpOwotCi0gICAgQUxPR1YoImxvYWRHYWluTW9kZSgpICVzIiwgbmFtZSk7Ci0gICAgYXVkaW9fZ2Fpbl9tb2RlX3QgbW9kZSA9IDA7Ci0gICAgd2hpbGUgKHN0ciAhPSBOVUxMKSB7Ci0gICAgICAgIG1vZGUgfD0gKGF1ZGlvX2dhaW5fbW9kZV90KXN0cmluZ1RvRW51bShzR2Fpbk1vZGVOYW1lVG9FbnVtVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNHYWluTW9kZU5hbWVUb0VudW1UYWJsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOwotICAgICAgICBzdHIgPSBzdHJ0b2soTlVMTCwgInwiKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1vZGU7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmxvYWRHYWluKGNub2RlICpyb290LCBpbnQgaW5kZXgpCi17Ci0gICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKLQotICAgIHNwPEF1ZGlvR2Fpbj4gZ2FpbiA9IG5ldyBBdWRpb0dhaW4oaW5kZXgsIG1Vc2VJbkNoYW5uZWxNYXNrKTsKLQotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NT0RFKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5tR2Fpbi5tb2RlID0gbG9hZEdhaW5Nb2RlKChjaGFyICopbm9kZS0+dmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX0NIQU5ORUxTKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKLSAgICAgICAgICAgICAgICBnYWluLT5tR2Fpbi5jaGFubmVsX21hc2sgPQotICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KXN0cmluZ1RvRW51bShzSW5DaGFubmVsc05hbWVUb0VudW1UYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzSW5DaGFubmVsc05hbWVUb0VudW1UYWJsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyICopbm9kZS0+dmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBnYWluLT5tR2Fpbi5jaGFubmVsX21hc2sgPQotICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KXN0cmluZ1RvRW51bShzT3V0Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc091dENoYW5uZWxzTmFtZVRvRW51bVRhYmxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUlOX1ZBTFVFKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5tR2Fpbi5taW5fdmFsdWUgPSBhdG9pKChjaGFyICopbm9kZS0+dmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01BWF9WQUxVRSkgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+bUdhaW4ubWF4X3ZhbHVlID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9ERUZBVUxUX1ZBTFVFKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5tR2Fpbi5kZWZhdWx0X3ZhbHVlID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9TVEVQX1ZBTFVFKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5tR2Fpbi5zdGVwX3ZhbHVlID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NSU5fUkFNUF9NUykgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+bUdhaW4ubWluX3JhbXBfbXMgPSBhdG9pKChjaGFyICopbm9kZS0+dmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01BWF9SQU1QX01TKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5tR2Fpbi5tYXhfcmFtcF9tcyA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotCi0gICAgQUxPR1YoImxvYWRHYWluKCkgYWRkaW5nIG5ldyBnYWluIG1vZGUgJTA4eCBjaGFubmVsIG1hc2sgJTA4eCBtaW4gbUIgJWQgbWF4IG1CICVkIiwKLSAgICAgICAgICBnYWluLT5tR2Fpbi5tb2RlLCBnYWluLT5tR2Fpbi5jaGFubmVsX21hc2ssIGdhaW4tPm1HYWluLm1pbl92YWx1ZSwgZ2Fpbi0+bUdhaW4ubWF4X3ZhbHVlKTsKLQotICAgIGlmIChnYWluLT5tR2Fpbi5tb2RlID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtR2FpbnMuYWRkKGdhaW4pOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojpsb2FkR2FpbnMoY25vZGUgKnJvb3QpCi17Ci0gICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIEFMT0dWKCJsb2FkR2FpbnMoKSBsb2FkaW5nIGdhaW4gJXMiLCBub2RlLT5uYW1lKTsKLSAgICAgICAgbG9hZEdhaW4obm9kZSwgaW5kZXgrKyk7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmNoZWNrRXhhY3RTYW1wbGluZ1JhdGUodWludDMyX3Qgc2FtcGxpbmdSYXRlKSBjb25zdAotewotICAgIGlmIChtU2FtcGxpbmdSYXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIGlmIChtU2FtcGxpbmdSYXRlc1tpXSA9PSBzYW1wbGluZ1JhdGUpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQkFEX1ZBTFVFOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6Y2hlY2tDb21wYXRpYmxlU2FtcGxpbmdSYXRlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgdWludDMyX3QgKnVwZGF0ZWRTYW1wbGluZ1JhdGUpIGNvbnN0Ci17Ci0gICAgaWYgKG1TYW1wbGluZ1JhdGVzLmlzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgLy8gU2VhcmNoIGZvciB0aGUgY2xvc2VzdCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZSB0aGF0IGlzIGFib3ZlIChwcmVmZXJyZWQpCi0gICAgLy8gb3IgYmVsb3cgKGFjY2VwdGFibGUpIHRoZSBkZXNpcmVkIHNhbXBsaW5nIHJhdGUsIHdpdGhpbiBhIHBlcm1pdHRlZCByYXRpby4KLSAgICAvLyBUaGUgc2FtcGxpbmcgcmF0ZXMgZG8gbm90IG5lZWQgdG8gYmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4KLSAgICBzc2l6ZV90IG1heEJlbG93ID0gLTE7Ci0gICAgc3NpemVfdCBtaW5BYm92ZSA9IC0xOwotICAgIHVpbnQzMl90IGNhbmRpZGF0ZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNhbmRpZGF0ZSA9IG1TYW1wbGluZ1JhdGVzW2ldOwotICAgICAgICBpZiAoY2FuZGlkYXRlID09IHNhbXBsaW5nUmF0ZSkgewotICAgICAgICAgICAgaWYgKHVwZGF0ZWRTYW1wbGluZ1JhdGUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICp1cGRhdGVkU2FtcGxpbmdSYXRlID0gY2FuZGlkYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNhbmRpZGF0ZSA8IGRlc2lyZWQKLSAgICAgICAgaWYgKGNhbmRpZGF0ZSA8IHNhbXBsaW5nUmF0ZSkgewotICAgICAgICAgICAgaWYgKG1heEJlbG93IDwgMCB8fCBjYW5kaWRhdGUgPiBtU2FtcGxpbmdSYXRlc1ttYXhCZWxvd10pIHsKLSAgICAgICAgICAgICAgICBtYXhCZWxvdyA9IGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIC8vIGNhbmRpZGF0ZSA+IGRlc2lyZWQKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtaW5BYm92ZSA8IDAgfHwgY2FuZGlkYXRlIDwgbVNhbXBsaW5nUmF0ZXNbbWluQWJvdmVdKSB7Ci0gICAgICAgICAgICAgICAgbWluQWJvdmUgPSBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8vIFRoaXMgdXNlcyBoYXJkLWNvZGVkIGtub3dsZWRnZSBhYm91dCBBdWRpb0ZsaW5nZXIgcmVzYW1wbGluZyByYXRpb3MuCi0gICAgLy8gVE9ETyBNb3ZlIHRoZXNlIGFzc3VtcHRpb25zIG91dC4KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga01heERvd25TYW1wbGVSYXRpbyA9IDY7ICAvLyBiZXlvbmQgdGhpcyBhbGlhc2luZyBvY2N1cnMKLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga01heFVwU2FtcGxlUmF0aW8gPSAyNTY7ICAvLyBiZXlvbmQgdGhpcyBzYW1wbGUgcmF0ZSBpbmFjY3VyYWNpZXMgb2NjdXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkdWUgdG8gYXBwcm94aW1hdGlvbiBieSBhbiBpbnQzMl90IG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBoYXNlIGluY3JlbWVudHMKLSAgICAvLyBQcmVmZXIgdG8gZG93bi1zYW1wbGUgZnJvbSBhIGhpZ2hlciBzYW1wbGluZyByYXRlLCBhcyB3ZSBnZXQgdGhlIGRlc2lyZWQgZnJlcXVlbmN5IHNwZWN0cnVtLgotICAgIGlmIChtaW5BYm92ZSA+PSAwKSB7Ci0gICAgICAgIGNhbmRpZGF0ZSA9IG1TYW1wbGluZ1JhdGVzW21pbkFib3ZlXTsKLSAgICAgICAgaWYgKGNhbmRpZGF0ZSAvIGtNYXhEb3duU2FtcGxlUmF0aW8gPD0gc2FtcGxpbmdSYXRlKSB7Ci0gICAgICAgICAgICBpZiAodXBkYXRlZFNhbXBsaW5nUmF0ZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgKnVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gQnV0IGlmIHdlIGhhdmUgdG8gdXAtc2FtcGxlIGZyb20gYSBsb3dlciBzYW1wbGluZyByYXRlLCB0aGF0J3MgT0suCi0gICAgaWYgKG1heEJlbG93ID49IDApIHsKLSAgICAgICAgY2FuZGlkYXRlID0gbVNhbXBsaW5nUmF0ZXNbbWF4QmVsb3ddOwotICAgICAgICBpZiAoY2FuZGlkYXRlICoga01heFVwU2FtcGxlUmF0aW8gPj0gc2FtcGxpbmdSYXRlKSB7Ci0gICAgICAgICAgICBpZiAodXBkYXRlZFNhbXBsaW5nUmF0ZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgKnVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gbGVhdmUgdXBkYXRlZFNhbXBsaW5nUmF0ZSB1bm1vZGlmaWVkCi0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmNoZWNrRXhhY3RDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgY29uc3QKLXsKLSAgICBpZiAobUNoYW5uZWxNYXNrcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobUNoYW5uZWxNYXNrc1tpXSA9PSBjaGFubmVsTWFzaykgewotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBCQURfVkFMVUU7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpjaGVja0NvbXBhdGlibGVDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykKLSAgICAgICAgY29uc3QKLXsKLSAgICBpZiAobUNoYW5uZWxNYXNrcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIGNvbnN0IGJvb2wgaXNSZWNvcmRUaHJlYWQgPSBtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYICYmIG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkgKyspIHsKLSAgICAgICAgLy8gRklYTUUgRG9lcyBub3QgaGFuZGxlIG11bHRpLWNoYW5uZWwgYXV0b21hdGljIGNvbnZlcnNpb25zIHlldAotICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBzdXBwb3J0ZWQgPSBtQ2hhbm5lbE1hc2tzW2ldOwotICAgICAgICBpZiAoc3VwcG9ydGVkID09IGNoYW5uZWxNYXNrKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzUmVjb3JkVGhyZWFkKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIHVzZXMgaGFyZC1jb2RlZCBrbm93bGVkZ2UgdGhhdCBBdWRpb0ZsaW5nZXIgY2FuIHNpbGVudGx5IGRvd24tbWl4IGFuZCB1cC1taXguCi0gICAgICAgICAgICAvLyBGSVhNRSBBYnN0cmFjdCB0aGlzIG91dCB0byBhIHRhYmxlLgotICAgICAgICAgICAgaWYgKCgoc3VwcG9ydGVkID09IEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSyB8fCBzdXBwb3J0ZWQgPT0gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8pCi0gICAgICAgICAgICAgICAgICAgICYmIGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fTU9OTykgfHwKLSAgICAgICAgICAgICAgICAoc3VwcG9ydGVkID09IEFVRElPX0NIQU5ORUxfSU5fTU9OTyAmJiAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9CQUNLCi0gICAgICAgICAgICAgICAgICAgIHx8IGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OmNoZWNrRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKLXsKLSAgICBpZiAobUZvcm1hdHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Gb3JtYXRzLnNpemUoKTsgaSArKykgewotICAgICAgICBpZiAobUZvcm1hdHNbaV0gPT0gZm9ybWF0KSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQotCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6cGlja1NhbXBsaW5nUmF0ZSgpIGNvbnN0Ci17Ci0gICAgLy8gc3BlY2lhbCBjYXNlIGZvciB1bmluaXRpYWxpemVkIGR5bmFtaWMgcHJvZmlsZQotICAgIGlmIChtU2FtcGxpbmdSYXRlcy5zaXplKCkgPT0gMSAmJiBtU2FtcGxpbmdSYXRlc1swXSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8vIEZvciBkaXJlY3Qgb3V0cHV0cywgcGljayBtaW5pbXVtIHNhbXBsaW5nIHJhdGU6IHRoaXMgaGVscHMgZW5zdXJpbmcgdGhhdCB0aGUKLSAgICAvLyBjaGFubmVsIGNvdW50IC8gc2FtcGxpbmcgcmF0ZSBjb21iaW5hdGlvbiBjaG9zZW4gd2lsbCBiZSBzdXBwb3J0ZWQgYnkgdGhlIGNvbm5lY3RlZAotICAgIC8vIHNpbmsKLSAgICBpZiAoKG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpICYmIChtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSAmJgotICAgICAgICAgICAgKG1GbGFncyAmIChBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSkpIHsKLSAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gVUlOVF9NQVg7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgICAgICBpZiAoKG1TYW1wbGluZ1JhdGVzW2ldIDwgc2FtcGxpbmdSYXRlKSAmJiAobVNhbXBsaW5nUmF0ZXNbaV0gPiAwKSkgewotICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSA9IG1TYW1wbGluZ1JhdGVzW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoc2FtcGxpbmdSYXRlID09IFVJTlRfTUFYKSA/IDAgOiBzYW1wbGluZ1JhdGU7Ci0gICAgfQotCi0gICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMDsKLSAgICB1aW50MzJfdCBtYXhSYXRlID0gTUFYX01JWEVSX1NBTVBMSU5HX1JBVEU7Ci0KLSAgICAvLyBGb3IgbWl4ZWQgb3V0cHV0IGFuZCBpbnB1dHMsIHVzZSBtYXggbWl4ZXIgc2FtcGxpbmcgcmF0ZXMuIERvIG5vdAotICAgIC8vIGxpbWl0IHNhbXBsaW5nIHJhdGUgb3RoZXJ3aXNlCi0gICAgaWYgKG1UeXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKLSAgICAgICAgbWF4UmF0ZSA9IFVJTlRfTUFYOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSArKykgewotICAgICAgICBpZiAoKG1TYW1wbGluZ1JhdGVzW2ldID4gc2FtcGxpbmdSYXRlKSAmJiAobVNhbXBsaW5nUmF0ZXNbaV0gPD0gbWF4UmF0ZSkpIHsKLSAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSA9IG1TYW1wbGluZ1JhdGVzW2ldOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzYW1wbGluZ1JhdGU7Ci19Ci0KLWF1ZGlvX2NoYW5uZWxfbWFza190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpwaWNrQ2hhbm5lbE1hc2soKSBjb25zdAotewotICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgdW5pbml0aWFsaXplZCBkeW5hbWljIHByb2ZpbGUKLSAgICBpZiAobUNoYW5uZWxNYXNrcy5zaXplKCkgPT0gMSAmJiBtQ2hhbm5lbE1hc2tzWzBdID09IDApIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfTk9ORTsKLSAgICB9Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7Ci0KLSAgICAvLyBGb3IgZGlyZWN0IG91dHB1dHMsIHBpY2sgbWluaW11bSBjaGFubmVsIGNvdW50OiB0aGlzIGhlbHBzIGVuc3VyaW5nIHRoYXQgdGhlCi0gICAgLy8gY2hhbm5lbCBjb3VudCAvIHNhbXBsaW5nIHJhdGUgY29tYmluYXRpb24gY2hvc2VuIHdpbGwgYmUgc3VwcG9ydGVkIGJ5IHRoZSBjb25uZWN0ZWQKLSAgICAvLyBzaW5rCi0gICAgaWYgKChtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSAmJiAobVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgJiYKLSAgICAgICAgICAgIChtRmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkpKSB7Ci0gICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IFVJTlRfTUFYOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBjbmxDb3VudDsKLSAgICAgICAgICAgIGlmIChtVXNlSW5DaGFubmVsTWFzaykgewotICAgICAgICAgICAgICAgIGNubENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUNoYW5uZWxNYXNrc1tpXSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNubENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1DaGFubmVsTWFza3NbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChjbmxDb3VudCA8IGNoYW5uZWxDb3VudCkgJiYgKGNubENvdW50ID4gMCkpIHsKLSAgICAgICAgICAgICAgICBjaGFubmVsTWFzayA9IG1DaGFubmVsTWFza3NbaV07Ci0gICAgICAgICAgICAgICAgY2hhbm5lbENvdW50ID0gY25sQ291bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNoYW5uZWxNYXNrOwotICAgIH0KLQotICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IDA7Ci0gICAgdWludDMyX3QgbWF4Q291bnQgPSBNQVhfTUlYRVJfQ0hBTk5FTF9DT1VOVDsKLQotICAgIC8vIEZvciBtaXhlZCBvdXRwdXQgYW5kIGlucHV0cywgdXNlIG1heCBtaXhlciBjaGFubmVsIGNvdW50LiBEbyBub3QKLSAgICAvLyBsaW1pdCBjaGFubmVsIGNvdW50IG90aGVyd2lzZQotICAgIGlmIChtVHlwZSAhPSBBVURJT19QT1JUX1RZUEVfTUlYKSB7Ci0gICAgICAgIG1heENvdW50ID0gVUlOVF9NQVg7Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkgKyspIHsKLSAgICAgICAgdWludDMyX3QgY25sQ291bnQ7Ci0gICAgICAgIGlmIChtVXNlSW5DaGFubmVsTWFzaykgewotICAgICAgICAgICAgY25sQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtQ2hhbm5lbE1hc2tzW2ldKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNubENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1DaGFubmVsTWFza3NbaV0pOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoY25sQ291bnQgPiBjaGFubmVsQ291bnQpICYmIChjbmxDb3VudCA8PSBtYXhDb3VudCkpIHsKLSAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrc1tpXTsKLSAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IGNubENvdW50OwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjaGFubmVsTWFzazsKLX0KLQotLyogZm9ybWF0IGluIG9yZGVyIG9mIGluY3JlYXNpbmcgcHJlZmVyZW5jZSAqLwotY29uc3QgYXVkaW9fZm9ybWF0X3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OnNQY21Gb3JtYXRDb21wYXJlVGFibGVbXSA9IHsKLSAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQsCi0gICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAotICAgICAgICBBVURJT19GT1JNQVRfUENNXzhfMjRfQklULAotICAgICAgICBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQsCi0gICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklULAotICAgICAgICBBVURJT19GT1JNQVRfUENNX0ZMT0FULAotfTsKLQotaW50IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Ojpjb21wYXJlRm9ybWF0cyhhdWRpb19mb3JtYXRfdCBmb3JtYXQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQyKQotewotICAgIC8vIE5PVEU6IEFVRElPX0ZPUk1BVF9JTlZBTElEIGlzIGFsc28gY29uc2lkZXJlZCBub3QgUENNIGFuZCB3aWxsIGJlIGNvbXBhcmVkIGVxdWFsIHRvIGFueQotICAgIC8vIGNvbXByZXNzZWQgZm9ybWF0IGFuZCBiZXR0ZXIgdGhhbiBhbnkgUENNIGZvcm1hdC4gVGhpcyBpcyBieSBkZXNpZ24gb2YgcGlja0Zvcm1hdCgpCi0gICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdDEpKSB7Ci0gICAgICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQyKSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQyKSkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaW50IGluZGV4MSA9IC0xLCBpbmRleDIgPSAtMTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsKLSAgICAgICAgICAgIChpIDwgQVJSQVlfU0laRShzUGNtRm9ybWF0Q29tcGFyZVRhYmxlKSkgJiYgKChpbmRleDEgPT0gLTEpIHx8IChpbmRleDIgPT0gLTEpKTsKLSAgICAgICAgICAgIGkgKyspIHsKLSAgICAgICAgaWYgKHNQY21Gb3JtYXRDb21wYXJlVGFibGVbaV0gPT0gZm9ybWF0MSkgewotICAgICAgICAgICAgaW5kZXgxID0gaTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc1BjbUZvcm1hdENvbXBhcmVUYWJsZVtpXSA9PSBmb3JtYXQyKSB7Ci0gICAgICAgICAgICBpbmRleDIgPSBpOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIGZvcm1hdDEgbm90IGZvdW5kID0+IGluZGV4MSA8IDAgPT4gZm9ybWF0MiA+IGZvcm1hdDEKLSAgICAvLyBmb3JtYXQyIG5vdCBmb3VuZCA9PiBpbmRleDIgPCAwID0+IGZvcm1hdDIgPCBmb3JtYXQxCi0gICAgcmV0dXJuIGluZGV4MSAtIGluZGV4MjsKLX0KLQotYXVkaW9fZm9ybWF0X3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvcnQ6OnBpY2tGb3JtYXQoKSBjb25zdAotewotICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgdW5pbml0aWFsaXplZCBkeW5hbWljIHByb2ZpbGUKLSAgICBpZiAobUZvcm1hdHMuc2l6ZSgpID09IDEgJiYgbUZvcm1hdHNbMF0gPT0gMCkgewotICAgICAgICByZXR1cm4gQVVESU9fRk9STUFUX0RFRkFVTFQ7Ci0gICAgfQotCi0gICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7Ci0gICAgYXVkaW9fZm9ybWF0X3QgYmVzdEZvcm1hdCA9Ci0gICAgICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydDo6c1BjbUZvcm1hdENvbXBhcmVUYWJsZVsKLSAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpzUGNtRm9ybWF0Q29tcGFyZVRhYmxlKSAtIDFdOwotICAgIC8vIEZvciBtaXhlZCBvdXRwdXQgYW5kIGlucHV0cywgdXNlIGJlc3QgbWl4ZXIgb3V0cHV0IGZvcm1hdC4gRG8gbm90Ci0gICAgLy8gbGltaXQgZm9ybWF0IG90aGVyd2lzZQotICAgIGlmICgobVR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX01JWCkgfHwKLSAgICAgICAgICAgICgobVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgJiYKLSAgICAgICAgICAgICAoKChtRmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkpICE9IDApKSkpIHsKLSAgICAgICAgYmVzdEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZvcm1hdHMuc2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIGlmICgoY29tcGFyZUZvcm1hdHMobUZvcm1hdHNbaV0sIGZvcm1hdCkgPiAwKSAmJgotICAgICAgICAgICAgICAgIChjb21wYXJlRm9ybWF0cyhtRm9ybWF0c1tpXSwgYmVzdEZvcm1hdCkgPD0gMCkpIHsKLSAgICAgICAgICAgIGZvcm1hdCA9IG1Gb3JtYXRzW2ldOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmb3JtYXQ7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpjaGVja0dhaW4oY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpnYWluQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgaWYgKGluZGV4IDwgMCB8fCAoc2l6ZV90KWluZGV4ID49IG1HYWlucy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmV0dXJuIG1HYWluc1tpbmRleF0tPmNoZWNrQ29uZmlnKGdhaW5Db25maWcpOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0OjpkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIGlmIChtTmFtZS5zaXplKCkgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0KLSAgICBpZiAobVNhbXBsaW5nUmF0ZXMuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBzYW1wbGluZyByYXRlczogIiwgc3BhY2VzLCAiIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGkgPT0gMCAmJiBtU2FtcGxpbmdSYXRlc1tpXSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiRHluYW1pYyIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlZCIsIG1TYW1wbGluZ1JhdGVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaSA9PSAobVNhbXBsaW5nUmF0ZXMuc2l6ZSgpIC0gMSkgPyAiIiA6ICIsICIpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgfQotCi0gICAgaWYgKG1DaGFubmVsTWFza3Muc2l6ZSgpICE9IDApIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBjaGFubmVsIG1hc2tzOiAiLCBzcGFjZXMsICIiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEFMT0dWKCJBdWRpb1BvcnQ6OmR1bXAgbUNoYW5uZWxNYXNrcyAlenUgJTA4eCIsIGksIG1DaGFubmVsTWFza3NbaV0pOwotCi0gICAgICAgICAgICBpZiAoaSA9PSAwICYmIG1DaGFubmVsTWFza3NbaV0gPT0gMCkgewotICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkR5bmFtaWMiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiMHglMDR4IiwgbUNoYW5uZWxNYXNrc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1DaGFubmVsTWFza3Muc2l6ZSgpIC0gMSkgPyAiIiA6ICIsICIpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgfQotCi0gICAgaWYgKG1Gb3JtYXRzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZm9ybWF0czogIiwgc3BhY2VzLCAiIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRm9ybWF0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0U3RyID0gZW51bVRvU3RyaW5nKHNGb3JtYXROYW1lVG9FbnVtVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRm9ybWF0TmFtZVRvRW51bVRhYmxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0c1tpXSk7Ci0gICAgICAgICAgICBpZiAoaSA9PSAwICYmIHN0cmNtcChmb3JtYXRTdHIsICIiKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiRHluYW1pYyIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlcyIsIGZvcm1hdFN0cik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1Gb3JtYXRzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBpZiAobUdhaW5zLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZ2FpbnM6XG4iLCBzcGFjZXMsICIiKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikgKyAxKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1HYWlucy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgbUdhaW5zW2ldLT5kdW1wKGZkLCBzcGFjZXMgKyAyLCBpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gLS0tIEF1ZGlvR2FpbiBjbGFzcyBpbXBsZW1lbnRhdGlvbgotCi1BdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvR2Fpbjo6QXVkaW9HYWluKGludCBpbmRleCwgYm9vbCB1c2VJbkNoYW5uZWxNYXNrKQotewotICAgIG1JbmRleCA9IGluZGV4OwotICAgIG1Vc2VJbkNoYW5uZWxNYXNrID0gdXNlSW5DaGFubmVsTWFzazsKLSAgICBtZW1zZXQoJm1HYWluLCAwLCBzaXplb2Yoc3RydWN0IGF1ZGlvX2dhaW4pKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvR2Fpbjo6Z2V0RGVmYXVsdENvbmZpZyhzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZykKLXsKLSAgICBjb25maWctPmluZGV4ID0gbUluZGV4OwotICAgIGNvbmZpZy0+bW9kZSA9IG1HYWluLm1vZGU7Ci0gICAgY29uZmlnLT5jaGFubmVsX21hc2sgPSBtR2Fpbi5jaGFubmVsX21hc2s7Ci0gICAgaWYgKChtR2Fpbi5tb2RlICYgQVVESU9fR0FJTl9NT0RFX0pPSU5UKSA9PSBBVURJT19HQUlOX01PREVfSk9JTlQpIHsKLSAgICAgICAgY29uZmlnLT52YWx1ZXNbMF0gPSBtR2Fpbi5kZWZhdWx0X3ZhbHVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHVpbnQzMl90IG51bVZhbHVlczsKLSAgICAgICAgaWYgKG1Vc2VJbkNoYW5uZWxNYXNrKSB7Ci0gICAgICAgICAgICBudW1WYWx1ZXMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtR2Fpbi5jaGFubmVsX21hc2spOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbnVtVmFsdWVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1HYWluLmNoYW5uZWxfbWFzayk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1WYWx1ZXM7IGkrKykgewotICAgICAgICAgICAgY29uZmlnLT52YWx1ZXNbaV0gPSBtR2Fpbi5kZWZhdWx0X3ZhbHVlOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICgobUdhaW4ubW9kZSAmIEFVRElPX0dBSU5fTU9ERV9SQU1QKSA9PSBBVURJT19HQUlOX01PREVfUkFNUCkgewotICAgICAgICBjb25maWctPnJhbXBfZHVyYXRpb25fbXMgPSBtR2Fpbi5taW5fcmFtcF9tczsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9HYWluOjpjaGVja0NvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZykKLXsKLSAgICBpZiAoKGNvbmZpZy0+bW9kZSAmIH5tR2Fpbi5tb2RlKSAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGlmICgoY29uZmlnLT5tb2RlICYgQVVESU9fR0FJTl9NT0RFX0pPSU5UKSA9PSBBVURJT19HQUlOX01PREVfSk9JTlQpIHsKLSAgICAgICAgaWYgKChjb25maWctPnZhbHVlc1swXSA8IG1HYWluLm1pbl92YWx1ZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+dmFsdWVzWzBdID4gbUdhaW4ubWF4X3ZhbHVlKSkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICgoY29uZmlnLT5jaGFubmVsX21hc2sgJiB+bUdhaW4uY2hhbm5lbF9tYXNrKSAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQzMl90IG51bVZhbHVlczsKLSAgICAgICAgaWYgKG1Vc2VJbkNoYW5uZWxNYXNrKSB7Ci0gICAgICAgICAgICBudW1WYWx1ZXMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjb25maWctPmNoYW5uZWxfbWFzayk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBudW1WYWx1ZXMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY29uZmlnLT5jaGFubmVsX21hc2spOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHsKLSAgICAgICAgICAgIGlmICgoY29uZmlnLT52YWx1ZXNbaV0gPCBtR2Fpbi5taW5fdmFsdWUpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChjb25maWctPnZhbHVlc1tpXSA+IG1HYWluLm1heF92YWx1ZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmICgoY29uZmlnLT5tb2RlICYgQVVESU9fR0FJTl9NT0RFX1JBTVApID09IEFVRElPX0dBSU5fTU9ERV9SQU1QKSB7Ci0gICAgICAgIGlmICgoY29uZmlnLT5yYW1wX2R1cmF0aW9uX21zIDwgbUdhaW4ubWluX3JhbXBfbXMpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChjb25maWctPnJhbXBfZHVyYXRpb25fbXMgPiBtR2Fpbi5tYXhfcmFtcF9tcykpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9HYWluOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzR2FpbiAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1vZGU6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1vZGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGNoYW5uZWxfbWFzazogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uY2hhbm5lbF9tYXNrKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtaW5fdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5taW5fdmFsdWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1heF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1heF92YWx1ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZGVmYXVsdF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLmRlZmF1bHRfdmFsdWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHN0ZXBfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5zdGVwX3ZhbHVlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtaW5fcmFtcF9tczogJWQgbXNcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1pbl9yYW1wX21zKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtYXhfcmFtcF9tczogJWQgbXNcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1heF9yYW1wX21zKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLX0KLQotLy8gLS0tIEF1ZGlvUG9ydENvbmZpZyBjbGFzcyBpbXBsZW1lbnRhdGlvbgotCi1BdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydENvbmZpZzo6QXVkaW9Qb3J0Q29uZmlnKCkKLXsKLSAgICBtU2FtcGxpbmdSYXRlID0gMDsKLSAgICBtQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7Ci0gICAgbUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwotICAgIG1HYWluLmluZGV4ID0gLTE7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb3J0Q29uZmlnOjphcHBseUF1ZGlvUG9ydENvbmZpZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqYmFja3VwQ29uZmlnKQotewotICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBsb2NhbEJhY2t1cENvbmZpZzsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLQotICAgIGxvY2FsQmFja3VwQ29uZmlnLmNvbmZpZ19tYXNrID0gY29uZmlnLT5jb25maWdfbWFzazsKLSAgICB0b0F1ZGlvUG9ydENvbmZpZygmbG9jYWxCYWNrdXBDb25maWcpOwotCi0gICAgc3A8QXVkaW9Qb3J0PiBhdWRpb3BvcnQgPSBnZXRBdWRpb1BvcnQoKTsKLSAgICBpZiAoYXVkaW9wb3J0ID09IDApIHsKLSAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKLSAgICAgICAgZ290byBleGl0OwotICAgIH0KLSAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFKSB7Ci0gICAgICAgIHN0YXR1cyA9IGF1ZGlvcG9ydC0+Y2hlY2tFeGFjdFNhbXBsaW5nUmF0ZShjb25maWctPnNhbXBsZV9yYXRlKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgZ290byBleGl0OwotICAgICAgICB9Ci0gICAgICAgIG1TYW1wbGluZ1JhdGUgPSBjb25maWctPnNhbXBsZV9yYXRlOwotICAgIH0KLSAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgewotICAgICAgICBzdGF0dXMgPSBhdWRpb3BvcnQtPmNoZWNrRXhhY3RDaGFubmVsTWFzayhjb25maWctPmNoYW5uZWxfbWFzayk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgfQotICAgICAgICBtQ2hhbm5lbE1hc2sgPSBjb25maWctPmNoYW5uZWxfbWFzazsKLSAgICB9Ci0gICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpIHsKLSAgICAgICAgc3RhdHVzID0gYXVkaW9wb3J0LT5jaGVja0Zvcm1hdChjb25maWctPmZvcm1hdCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgfQotICAgICAgICBtRm9ybWF0ID0gY29uZmlnLT5mb3JtYXQ7Ci0gICAgfQotICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfR0FJTikgewotICAgICAgICBzdGF0dXMgPSBhdWRpb3BvcnQtPmNoZWNrR2FpbigmY29uZmlnLT5nYWluLCBjb25maWctPmdhaW4uaW5kZXgpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgIH0KLSAgICAgICAgbUdhaW4gPSBjb25maWctPmdhaW47Ci0gICAgfQotCi1leGl0OgotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgYXBwbHlBdWRpb1BvcnRDb25maWcoJmxvY2FsQmFja3VwQ29uZmlnKTsKLSAgICB9Ci0gICAgaWYgKGJhY2t1cENvbmZpZyAhPSBOVUxMKSB7Ci0gICAgICAgICpiYWNrdXBDb25maWcgPSBsb2NhbEJhY2t1cENvbmZpZzsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0Ci17Ci0gICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkgewotICAgICAgICBkc3RDb25maWctPnNhbXBsZV9yYXRlID0gbVNhbXBsaW5nUmF0ZTsKLSAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkpIHsKLSAgICAgICAgICAgIGRzdENvbmZpZy0+c2FtcGxlX3JhdGUgPSBzcmNDb25maWctPnNhbXBsZV9yYXRlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0Q29uZmlnLT5zYW1wbGVfcmF0ZSA9IDA7Ci0gICAgfQotICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLKSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Y2hhbm5lbF9tYXNrID0gbUNoYW5uZWxNYXNrOwotICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBOVUxMKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykpIHsKLSAgICAgICAgICAgIGRzdENvbmZpZy0+Y2hhbm5lbF9tYXNrID0gc3JjQ29uZmlnLT5jaGFubmVsX21hc2s7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKLSAgICB9Ci0gICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpIHsKLSAgICAgICAgZHN0Q29uZmlnLT5mb3JtYXQgPSBtRm9ybWF0OwotICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBOVUxMKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCkpIHsKLSAgICAgICAgICAgIGRzdENvbmZpZy0+Zm9ybWF0ID0gc3JjQ29uZmlnLT5mb3JtYXQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBkc3RDb25maWctPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwotICAgIH0KLSAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pIHsKLSAgICAgICAgZHN0Q29uZmlnLT5nYWluID0gbUdhaW47Ci0gICAgICAgIGlmICgoc3JjQ29uZmlnICE9IE5VTEwpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfR0FJTikpIHsKLSAgICAgICAgICAgIGRzdENvbmZpZy0+Z2FpbiA9IHNyY0NvbmZpZy0+Z2FpbjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Z2Fpbi5pbmRleCA9IC0xOwotICAgIH0KLSAgICBpZiAoZHN0Q29uZmlnLT5nYWluLmluZGV4ICE9IC0xKSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfR0FJTjsKLSAgICB9IGVsc2UgewotICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrICY9IH5BVURJT19QT1JUX0NPTkZJR19HQUlOOwotICAgIH0KLX0KLQotLy8gLS0tIElPUHJvZmlsZSBjbGFzcyBpbXBsZW1lbnRhdGlvbgotCi1BdWRpb1BvbGljeU1hbmFnZXI6OklPUHJvZmlsZTo6SU9Qcm9maWxlKGNvbnN0IFN0cmluZzgmIG5hbWUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKQotICAgIDogQXVkaW9Qb3J0KG5hbWUsIEFVRElPX1BPUlRfVFlQRV9NSVgsIHJvbGUsIG1vZHVsZSkKLXsKLX0KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGU6On5JT1Byb2ZpbGUoKQotewotfQotCi0vLyBjaGVja3MgaWYgdGhlIElPIHByb2ZpbGUgaXMgY29tcGF0aWJsZSB3aXRoIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgotLy8gU2FtcGxpbmcgcmF0ZSwgZm9ybWF0IGFuZCBjaGFubmVsIG1hc2sgbXVzdCBiZSBzcGVjaWZpZWQgaW4gb3JkZXIgdG8KLS8vIGdldCBhIHZhbGlkIGEgbWF0Y2gKLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGU6OmlzQ29tcGF0aWJsZVByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp1cGRhdGVkU2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncykgY29uc3QKLXsKLSAgICBjb25zdCBib29sIGlzUGxheWJhY2tUaHJlYWQgPSBtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYICYmIG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7Ci0gICAgY29uc3QgYm9vbCBpc1JlY29yZFRocmVhZCA9IG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVggJiYgbVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTks7Ci0gICAgQUxPR19BU1NFUlQoaXNQbGF5YmFja1RocmVhZCAhPSBpc1JlY29yZFRocmVhZCk7Ci0KLSAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FICYmIG1TdXBwb3J0ZWREZXZpY2VzLmdldERldmljZShkZXZpY2UsIGFkZHJlc3MpID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChzYW1wbGluZ1JhdGUgPT0gMCkgewotICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICB1aW50MzJfdCBteVVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGU7Ci0gICAgaWYgKGlzUGxheWJhY2tUaHJlYWQgJiYgY2hlY2tFeGFjdFNhbXBsaW5nUmF0ZShzYW1wbGluZ1JhdGUpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChpc1JlY29yZFRocmVhZCAmJiBjaGVja0NvbXBhdGlibGVTYW1wbGluZ1JhdGUoc2FtcGxpbmdSYXRlLCAmbXlVcGRhdGVkU2FtcGxpbmdSYXRlKSAhPQotICAgICAgICAgICAgTk9fRVJST1IpIHsKLSAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpIHx8IGNoZWNrRm9ybWF0KGZvcm1hdCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChpc1BsYXliYWNrVGhyZWFkICYmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spIHx8Ci0gICAgICAgICAgICBjaGVja0V4YWN0Q2hhbm5lbE1hc2soY2hhbm5lbE1hc2spICE9IE5PX0VSUk9SKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChpc1JlY29yZFRocmVhZCAmJiAoIWF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spIHx8Ci0gICAgICAgICAgICBjaGVja0NvbXBhdGlibGVDaGFubmVsTWFzayhjaGFubmVsTWFzaykgIT0gTk9fRVJST1IpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoaXNQbGF5YmFja1RocmVhZCAmJiAobUZsYWdzICYgZmxhZ3MpICE9IGZsYWdzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLy8gVGhlIG9ubHkgaW5wdXQgZmxhZyB0aGF0IGlzIGFsbG93ZWQgdG8gYmUgZGlmZmVyZW50IGlzIHRoZSBmYXN0IGZsYWcuCi0gICAgLy8gQW4gZXhpc3RpbmcgZmFzdCBzdHJlYW0gaXMgY29tcGF0aWJsZSB3aXRoIGEgbm9ybWFsIHRyYWNrIHJlcXVlc3QuCi0gICAgLy8gQW4gZXhpc3Rpbmcgbm9ybWFsIHN0cmVhbSBpcyBjb21wYXRpYmxlIHdpdGggYSBmYXN0IHRyYWNrIHJlcXVlc3QsCi0gICAgLy8gYnV0IHRoZSBmYXN0IHJlcXVlc3Qgd2lsbCBiZSBkZW5pZWQgYnkgQXVkaW9GbGluZ2VyIGFuZCBjb252ZXJ0ZWQgdG8gbm9ybWFsIHRyYWNrLgotICAgIGlmIChpc1JlY29yZFRocmVhZCAmJiAoKG1GbGFncyBeIGZsYWdzKSAmCi0gICAgICAgICAgICB+QVVESU9fSU5QVVRfRkxBR19GQVNUKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHVwZGF0ZWRTYW1wbGluZ1JhdGUgIT0gTlVMTCkgewotICAgICAgICAqdXBkYXRlZFNhbXBsaW5nUmF0ZSA9IG15VXBkYXRlZFNhbXBsaW5nUmF0ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpJT1Byb2ZpbGU6OmR1bXAoaW50IGZkKQotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgQXVkaW9Qb3J0OjpkdW1wKGZkLCA0KTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAtIGZsYWdzOiAweCUwNHhcbiIsIG1GbGFncyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAtIGRldmljZXM6XG4iKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICBtU3VwcG9ydGVkRGV2aWNlc1tpXS0+ZHVtcChmZCwgNiwgaSk7Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6SU9Qcm9maWxlOjpsb2coKQotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgQUxPR1YoIiAgICAtIHNhbXBsaW5nIHJhdGVzOiAiKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIEFMT0dWKCIgICVkIiwgbVNhbXBsaW5nUmF0ZXNbaV0pOwotICAgIH0KLQotICAgIEFMT0dWKCIgICAgLSBjaGFubmVsIG1hc2tzOiAiKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgQUxPR1YoIiAgMHglMDR4IiwgbUNoYW5uZWxNYXNrc1tpXSk7Ci0gICAgfQotCi0gICAgQUxPR1YoIiAgICAtIGZvcm1hdHM6ICIpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgQUxPR1YoIiAgMHglMDh4IiwgbUZvcm1hdHNbaV0pOwotICAgIH0KLQotICAgIEFMT0dWKCIgICAgLSBkZXZpY2VzOiAweCUwNHhcbiIsIG1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkpOwotICAgIEFMT0dWKCIgICAgLSBmbGFnczogMHglMDR4XG4iLCBtRmxhZ3MpOwotfQotCi0KLS8vIC0tLSBEZXZpY2VEZXNjcmlwdG9yIGltcGxlbWVudGF0aW9uCi0KLQotQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yOjpEZXZpY2VEZXNjcmlwdG9yKGNvbnN0IFN0cmluZzgmIG5hbWUsIGF1ZGlvX2RldmljZXNfdCB0eXBlKSA6Ci0gICAgICAgICAgICAgICAgICAgICBBdWRpb1BvcnQobmFtZSwgQVVESU9fUE9SVF9UWVBFX0RFVklDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pc19vdXRwdXRfZGV2aWNlKHR5cGUpID8gQVVESU9fUE9SVF9ST0xFX1NJTksgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU09VUkNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSwKLSAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VUeXBlKHR5cGUpLCBtQWRkcmVzcygiIiksIG1JZCgwKQotewotfQotCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlRGVzY3JpcHRvcjo6ZXF1YWxzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBvdGhlcikgY29uc3QKLXsKLSAgICAvLyBEZXZpY2VzIGFyZSBjb25zaWRlcmVkIGVxdWFsIGlmIHRoZXk6Ci0gICAgLy8gLSBhcmUgb2YgdGhlIHNhbWUgdHlwZSAoYSBkZXZpY2UgdHlwZSBjYW5ub3QgYmUgQVVESU9fREVWSUNFX05PTkUpCi0gICAgLy8gLSBoYXZlIHRoZSBzYW1lIGFkZHJlc3Mgb3Igb25lIGRldmljZSBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBhZGRyZXNzCi0gICAgLy8gLSBoYXZlIHRoZSBzYW1lIGNoYW5uZWwgbWFzayBvciBvbmUgZGV2aWNlIGRvZXMgbm90IHNwZWNpZnkgdGhlIGNoYW5uZWwgbWFzawotICAgIHJldHVybiAobURldmljZVR5cGUgPT0gb3RoZXItPm1EZXZpY2VUeXBlKSAmJgotICAgICAgICAgICAobUFkZHJlc3MgPT0gIiIgfHwgb3RoZXItPm1BZGRyZXNzID09ICIiIHx8IG1BZGRyZXNzID09IG90aGVyLT5tQWRkcmVzcykgJiYKLSAgICAgICAgICAgKG1DaGFubmVsTWFzayA9PSAwIHx8IG90aGVyLT5tQ2hhbm5lbE1hc2sgPT0gMCB8fAotICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzayA9PSBvdGhlci0+bUNoYW5uZWxNYXNrKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I6OmxvYWRHYWlucyhjbm9kZSAqcm9vdCkKLXsKLSAgICBBdWRpb1BvcnQ6OmxvYWRHYWlucyhyb290KTsKLSAgICBpZiAobUdhaW5zLnNpemUoKSA+IDApIHsKLSAgICAgICAgbUdhaW5zWzBdLT5nZXREZWZhdWx0Q29uZmlnKCZtR2Fpbik7Ci0gICAgfQotfQotCi0KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OnJlZnJlc2hUeXBlcygpCi17Ci0gICAgbURldmljZVR5cGVzID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1EZXZpY2VUeXBlcyB8PSBpdGVtQXQoaSktPm1EZXZpY2VUeXBlOwotICAgIH0KLSAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjpyZWZyZXNoVHlwZXMoKSBtRGV2aWNlVHlwZXMgJTA4eCIsIG1EZXZpY2VUeXBlcyk7Ci19Ci0KLXNzaXplX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OmluZGV4T2YoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0Ci17Ci0gICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtLT5lcXVhbHMoaXRlbUF0KGkpKSkgewotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCi1zc2l6ZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjphZGQoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pCi17Ci0gICAgc3NpemVfdCByZXQgPSBpbmRleE9mKGl0ZW0pOwotCi0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgcmV0ID0gU29ydGVkVmVjdG9yOjphZGQoaXRlbSk7Ci0gICAgICAgIGlmIChyZXQgPj0gMCkgewotICAgICAgICAgICAgcmVmcmVzaFR5cGVzKCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiRGV2aWNlVmVjdG9yOjphZGQgZGV2aWNlICUwOHggYWxyZWFkeSBpbiIsIGl0ZW0tPm1EZXZpY2VUeXBlKTsKLSAgICAgICAgcmV0ID0gLTE7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXNzaXplX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VWZWN0b3I6OnJlbW92ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkKLXsKLSAgICBzaXplX3QgaTsKLSAgICBzc2l6ZV90IHJldCA9IGluZGV4T2YoaXRlbSk7Ci0KLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICBBTE9HVygiRGV2aWNlVmVjdG9yOjpyZW1vdmUgZGV2aWNlICUwOHggbm90IGluIiwgaXRlbS0+bURldmljZVR5cGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldCA9IFNvcnRlZFZlY3Rvcjo6cmVtb3ZlQXQocmV0KTsKLSAgICAgICAgaWYgKHJldCA+PSAwKSB7Ci0gICAgICAgICAgICByZWZyZXNoVHlwZXMoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpsb2FkRGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlcykKLXsKLSAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdDsKLQotICAgIHVpbnQzMl90IHJvbGVfYml0ID0gQVVESU9fREVWSUNFX0JJVF9JTiAmIHR5cGVzOwotICAgIHR5cGVzICY9IH5yb2xlX2JpdDsKLQotICAgIHdoaWxlICh0eXBlcykgewotICAgICAgICB1aW50MzJfdCBpID0gMzEgLSBfX2J1aWx0aW5fY2x6KHR5cGVzKTsKLSAgICAgICAgdWludDMyX3QgdHlwZSA9IDEgPDwgaTsKLSAgICAgICAgdHlwZXMgJj0gfnR5cGU7Ci0gICAgICAgIGFkZChuZXcgRGV2aWNlRGVzY3JpcHRvcihTdHJpbmc4KCIiKSwgdHlwZSB8IHJvbGVfYml0KSk7Ci0gICAgfQotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpsb2FkRGV2aWNlc0Zyb21OYW1lKGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGVjbGFyZWREZXZpY2VzKQotewotICAgIGNoYXIgKmRldk5hbWUgPSBzdHJ0b2sobmFtZSwgInwiKTsKLSAgICB3aGlsZSAoZGV2TmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChzdHJsZW4oZGV2TmFtZSkgIT0gMCkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBzdHJpbmdUb0VudW0oc0RldmljZU5hbWVUb0VudW1UYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZU5hbWVUb0VudW1UYWJsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZOYW1lKTsKLSAgICAgICAgICAgIGlmICh0eXBlICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2ID0gbmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOCgiIiksIHR5cGUpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCApIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2LT5tQWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkKGRldik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPQotICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWREZXZpY2VzLmdldERldmljZUZyb21OYW1lKFN0cmluZzgoZGV2TmFtZSkpOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2VEZXNjICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkKGRldmljZURlc2MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIGRldk5hbWUgPSBzdHJ0b2soTlVMTCwgInwiKTsKLSAgICAgfQotfQotCi1zcDxBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpnZXREZXZpY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlLCBTdHJpbmc4IGFkZHJlc3MpIGNvbnN0Ci17Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW1BdChpKS0+bURldmljZVR5cGUgPT0gdHlwZSkgewotICAgICAgICAgICAgaWYgKGFkZHJlc3MgPT0gIiIgfHwgaXRlbUF0KGkpLT5tQWRkcmVzcyA9PSBhZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gaXRlbUF0KGkpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPm1BZGRyZXNzID09IGFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OmdldERldmljZSgpIGZvciB0eXBlICUwOHggYWRkcmVzcyAlcyBmb3VuZCAlcCIsCi0gICAgICAgICAgdHlwZSwgYWRkcmVzcy5zdHJpbmcoKSwgZGV2aWNlLmdldCgpKTsKLSAgICByZXR1cm4gZGV2aWNlOwotfQotCi1zcDxBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpnZXREZXZpY2VGcm9tSWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0Ci17Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlRnJvbUlkKCVkKSBpdGVtQXQoJXp1KS0+bUlkICVkIiwgaWQsIGksIGl0ZW1BdChpKS0+bUlkKTsKLSAgICAgICAgaWYgKGl0ZW1BdChpKS0+bUlkID09IGlkKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZGV2aWNlOwotfQotCi1BdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3RvciBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUpIGNvbnN0Ci17Ci0gICAgRGV2aWNlVmVjdG9yIGRldmljZXM7Ci0gICAgYm9vbCBpc091dHB1dCA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKHR5cGUpOwotICAgIHR5cGUgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IChpIDwgc2l6ZSgpKSAmJiAodHlwZSAhPSBBVURJT19ERVZJQ0VfTk9ORSk7IGkrKykgewotICAgICAgICBib29sIGN1cklzT3V0cHV0ID0gYXVkaW9faXNfb3V0cHV0X2RldmljZXMoaXRlbUF0KGkpLT5tRGV2aWNlVHlwZSk7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJUeXBlID0gaXRlbUF0KGkpLT5tRGV2aWNlVHlwZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgICAgICBpZiAoKGlzT3V0cHV0ID09IGN1cklzT3V0cHV0KSAmJiAoKHR5cGUgJiBjdXJUeXBlKSAhPSAwKSkgewotICAgICAgICAgICAgZGV2aWNlcy5hZGQoaXRlbUF0KGkpKTsKLSAgICAgICAgICAgIHR5cGUgJj0gfmN1clR5cGU7Ci0gICAgICAgICAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGUoKSBmb3IgdHlwZSAleCBmb3VuZCAlcCIsCi0gICAgICAgICAgICAgICAgICBpdGVtQXQoaSktPm1EZXZpY2VUeXBlLCBpdGVtQXQoaSkuZ2V0KCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBkZXZpY2VzOwotfQotCi1BdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3RvciBBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlQWRkcigKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUsIFN0cmluZzggYWRkcmVzcykgY29uc3QKLXsKLSAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChpdGVtQXQoaSktPm1EZXZpY2VUeXBlID09IHR5cGUpIHsKLSAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPm1BZGRyZXNzID09IGFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VzLmFkZChpdGVtQXQoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBkZXZpY2VzOwotfQotCi1zcDxBdWRpb1BvbGljeU1hbmFnZXI6OkRldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlVmVjdG9yOjpnZXREZXZpY2VGcm9tTmFtZSgKLSAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSkgY29uc3QKLXsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbUF0KGkpLT5tTmFtZSA9PSBuYW1lKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZGV2aWNlOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnRDb25maWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0Ci17Ci0gICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTS3xBVURJT19QT1JUX0NPTkZJR19HQUlOOwotICAgIGlmIChzcmNDb25maWcgIT0gTlVMTCkgewotICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrIHw9IHNyY0NvbmZpZy0+Y29uZmlnX21hc2s7Ci0gICAgfQotCi0gICAgQXVkaW9Qb3J0Q29uZmlnOjp0b0F1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7Ci0KLSAgICBkc3RDb25maWctPmlkID0gbUlkOwotICAgIGRzdENvbmZpZy0+cm9sZSA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2UobURldmljZVR5cGUpID8KLSAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TSU5LIDogQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKLSAgICBkc3RDb25maWctPnR5cGUgPSBBVURJT19QT1JUX1RZUEVfREVWSUNFOwotICAgIGRzdENvbmZpZy0+ZXh0LmRldmljZS50eXBlID0gbURldmljZVR5cGU7Ci0gICAgZHN0Q29uZmlnLT5leHQuZGV2aWNlLmh3X21vZHVsZSA9IG1Nb2R1bGUtPm1IYW5kbGU7Ci0gICAgc3RybmNweShkc3RDb25maWctPmV4dC5kZXZpY2UuYWRkcmVzcywgbUFkZHJlc3Muc3RyaW5nKCksIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6RGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0Ci17Ci0gICAgQUxPR1YoIkRldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KCkgaGFuZGxlICVkIHR5cGUgJXgiLCBtSWQsIG1EZXZpY2VUeXBlKTsKLSAgICBBdWRpb1BvcnQ6OnRvQXVkaW9Qb3J0KHBvcnQpOwotICAgIHBvcnQtPmlkID0gbUlkOwotICAgIHRvQXVkaW9Qb3J0Q29uZmlnKCZwb3J0LT5hY3RpdmVfY29uZmlnKTsKLSAgICBwb3J0LT5leHQuZGV2aWNlLnR5cGUgPSBtRGV2aWNlVHlwZTsKLSAgICBwb3J0LT5leHQuZGV2aWNlLmh3X21vZHVsZSA9IG1Nb2R1bGUtPm1IYW5kbGU7Ci0gICAgc3RybmNweShwb3J0LT5leHQuZGV2aWNlLmFkZHJlc3MsIG1BZGRyZXNzLnN0cmluZygpLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpEZXZpY2VEZXNjcmlwdG9yOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzRGV2aWNlICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGlmIChtSWQgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1JZCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSB0eXBlOiAlLTQ4c1xuIiwgc3BhY2VzLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtVG9TdHJpbmcoc0RldmljZU5hbWVUb0VudW1UYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRGV2aWNlTmFtZVRvRW51bVRhYmxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZVR5cGUpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgaWYgKG1BZGRyZXNzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gYWRkcmVzczogJS0zMnNcbiIsIHNwYWNlcywgIiIsIG1BZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBBdWRpb1BvcnQ6OmR1bXAoZmQsIHNwYWNlcyk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9QYXRjaDo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzQXVkaW8gcGF0Y2ggJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBoYW5kbGU6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUhhbmRsZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gYXVkaW8gZmxpbmdlciBoYW5kbGU6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbUFmUGF0Y2hIYW5kbGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG93bmVyIHVpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtVWlkKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSAlZCBzb3VyY2VzOlxuIiwgc3BhY2VzLCAiIiwgbVBhdGNoLm51bV9zb3VyY2VzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGF0Y2gubnVtX3NvdXJjZXM7IGkrKykgewotICAgICAgICBpZiAobVBhdGNoLnNvdXJjZXNbaV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIERldmljZSBJRCAlZCAlc1xuIiwgc3BhY2VzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc291cmNlc1tpXS5pZCwgZW51bVRvU3RyaW5nKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZU5hbWVUb0VudW1UYWJsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zb3VyY2VzW2ldLmV4dC5kZXZpY2UudHlwZSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBNaXggSUQgJWQgSS9PIGhhbmRsZSAlZFxuIiwgc3BhY2VzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc291cmNlc1tpXS5pZCwgbVBhdGNoLnNvdXJjZXNbaV0uZXh0Lm1peC5oYW5kbGUpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSAlZCBzaW5rczpcbiIsIHNwYWNlcywgIiIsIG1QYXRjaC5udW1fc2lua3MpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYXRjaC5udW1fc2lua3M7IGkrKykgewotICAgICAgICBpZiAobVBhdGNoLnNpbmtzW2ldLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBEZXZpY2UgSUQgJWQgJXNcbiIsIHNwYWNlcyArIDIsICIiLAotICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNpbmtzW2ldLmlkLCBlbnVtVG9TdHJpbmcoc0RldmljZU5hbWVUb0VudW1UYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRGV2aWNlTmFtZVRvRW51bVRhYmxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBNaXggSUQgJWQgSS9PIGhhbmRsZSAlZFxuIiwgc3BhY2VzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc2lua3NbaV0uaWQsIG1QYXRjaC5zaW5rc1tpXS5leHQubWl4LmhhbmRsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIH0KLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gLS0tIGF1ZGlvX3BvbGljeS5jb25mIGZpbGUgcGFyc2luZwotCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnBhcnNlT3V0cHV0RmxhZ05hbWVzKGNoYXIgKm5hbWUpCi17Ci0gICAgdWludDMyX3QgZmxhZyA9IDA7Ci0KLSAgICAvLyBpdCBpcyBPSyB0byBjYXN0IG5hbWUgdG8gbm9uIGNvbnN0IGhlcmUgYXMgd2UgYXJlIG5vdCBnb2luZyB0byB1c2UgaXQgYWZ0ZXIKLSAgICAvLyBzdHJ0b2soKSBtb2RpZmllcyBpdAotICAgIGNoYXIgKmZsYWdOYW1lID0gc3RydG9rKG5hbWUsICJ8Iik7Ci0gICAgd2hpbGUgKGZsYWdOYW1lICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHN0cmxlbihmbGFnTmFtZSkgIT0gMCkgewotICAgICAgICAgICAgZmxhZyB8PSBzdHJpbmdUb0VudW0oc091dHB1dEZsYWdOYW1lVG9FbnVtVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzT3V0cHV0RmxhZ05hbWVUb0VudW1UYWJsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ05hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGZsYWdOYW1lID0gc3RydG9rKE5VTEwsICJ8Iik7Ci0gICAgfQotICAgIC8vZm9yY2UgZGlyZWN0IGZsYWcgaWYgb2ZmbG9hZCBmbGFnIGlzIHNldDogb2ZmbG9hZGluZyBpbXBsaWVzIGEgZGlyZWN0IG91dHB1dCBzdHJlYW0KLSAgICAvLyBhbmQgYWxsIGNvbW1vbiBiZWhhdmlvcnMgYXJlIGRyaXZlbiBieSBjaGVja2luZyBvbmx5IHRoZSBkaXJlY3QgZmxhZwotICAgIC8vIHRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIHNldCBhcHByb3ByaWF0ZWx5IGluIHRoZSBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlCi0gICAgaWYgKChmbGFnICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgewotICAgICAgICBmbGFnIHw9IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmxhZzsKLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpwYXJzZUlucHV0RmxhZ05hbWVzKGNoYXIgKm5hbWUpCi17Ci0gICAgdWludDMyX3QgZmxhZyA9IDA7Ci0KLSAgICAvLyBpdCBpcyBPSyB0byBjYXN0IG5hbWUgdG8gbm9uIGNvbnN0IGhlcmUgYXMgd2UgYXJlIG5vdCBnb2luZyB0byB1c2UgaXQgYWZ0ZXIKLSAgICAvLyBzdHJ0b2soKSBtb2RpZmllcyBpdAotICAgIGNoYXIgKmZsYWdOYW1lID0gc3RydG9rKG5hbWUsICJ8Iik7Ci0gICAgd2hpbGUgKGZsYWdOYW1lICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHN0cmxlbihmbGFnTmFtZSkgIT0gMCkgewotICAgICAgICAgICAgZmxhZyB8PSBzdHJpbmdUb0VudW0oc0lucHV0RmxhZ05hbWVUb0VudW1UYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNJbnB1dEZsYWdOYW1lVG9FbnVtVGFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdOYW1lKTsKLSAgICAgICAgfQotICAgICAgICBmbGFnTmFtZSA9IHN0cnRvayhOVUxMLCAifCIpOwotICAgIH0KLSAgICByZXR1cm4gZmxhZzsKLX0KLQotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6cGFyc2VEZXZpY2VOYW1lcyhjaGFyICpuYW1lKQotewotICAgIHVpbnQzMl90IGRldmljZSA9IDA7Ci0KLSAgICBjaGFyICpkZXZOYW1lID0gc3RydG9rKG5hbWUsICJ8Iik7Ci0gICAgd2hpbGUgKGRldk5hbWUgIT0gTlVMTCkgewotICAgICAgICBpZiAoc3RybGVuKGRldk5hbWUpICE9IDApIHsKLSAgICAgICAgICAgIGRldmljZSB8PSBzdHJpbmdUb0VudW0oc0RldmljZU5hbWVUb0VudW1UYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZU5hbWVUb0VudW1UYWJsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZOYW1lKTsKLSAgICAgICAgIH0KLSAgICAgICAgZGV2TmFtZSA9IHN0cnRvayhOVUxMLCAifCIpOwotICAgICB9Ci0gICAgcmV0dXJuIGRldmljZTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmxvYWRId01vZHVsZShjbm9kZSAqcm9vdCkKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOQU1FX05PVF9GT1VORDsKLSAgICBjbm9kZSAqbm9kZTsKLSAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbmV3IEh3TW9kdWxlKHJvb3QtPm5hbWUpOwotCi0gICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIERFVklDRVNfVEFHKTsKLSAgICBpZiAobm9kZSAhPSBOVUxMKSB7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICAgICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIGRldmljZSAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbW9kdWxlLT5sb2FkRGV2aWNlKG5vZGUpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOQU1FX05PVF9GT1VORCB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB0bXBTdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgfQotICAgIH0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgT1VUUFVUU19UQUcpOwotICAgIGlmIChub2RlICE9IE5VTEwpIHsKLSAgICAgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgICAgICB3aGlsZSAobm9kZSkgewotICAgICAgICAgICAgQUxPR1YoImxvYWRId01vZHVsZSgpIGxvYWRpbmcgb3V0cHV0ICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCB0bXBTdGF0dXMgPSBtb2R1bGUtPmxvYWRPdXRwdXQobm9kZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5BTUVfTk9UX0ZPVU5EIHx8IHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRtcFN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgICAgICB9Ci0gICAgfQotICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBJTlBVVFNfVEFHKTsKLSAgICBpZiAobm9kZSAhPSBOVUxMKSB7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICAgICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIGlucHV0ICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCB0bXBTdGF0dXMgPSBtb2R1bGUtPmxvYWRJbnB1dChub2RlKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTkFNRV9OT1RfRk9VTkQgfHwgc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gdG1wU3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbG9hZEdsb2JhbENvbmZpZyhyb290LCBtb2R1bGUpOwotCi0gICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBtSHdNb2R1bGVzLmFkZChtb2R1bGUpOwotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmxvYWRId01vZHVsZXMoY25vZGUgKnJvb3QpCi17Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBBVURJT19IV19NT0RVTEVfVEFHKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgQUxPR1YoImxvYWRId01vZHVsZXMoKSBsb2FkaW5nIG1vZHVsZSAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICBsb2FkSHdNb2R1bGUobm9kZSk7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmxvYWRHbG9iYWxDb25maWcoY25vZGUgKnJvb3QsIGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKQotewotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgR0xPQkFMX0NPTkZJR19UQUcpOwotCi0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIERldmljZVZlY3RvciBkZWNsYXJlZERldmljZXM7Ci0gICAgaWYgKG1vZHVsZSAhPSBOVUxMKSB7Ci0gICAgICAgIGRlY2xhcmVkRGV2aWNlcyA9IG1vZHVsZS0+bURlY2xhcmVkRGV2aWNlczsKLSAgICB9Ci0KLSAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKHN0cmNtcChBVFRBQ0hFRF9PVVRQVVRfREVWSUNFU19UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmxvYWREZXZpY2VzRnJvbU5hbWUoKGNoYXIgKilub2RlLT52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWREZXZpY2VzKTsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgQXR0YWNoZWQgT3V0cHV0IERldmljZXMgJTA4eCIsCi0gICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoREVGQVVMVF9PVVRQVVRfREVWSUNFX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3Qpc3RyaW5nVG9FbnVtKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRGV2aWNlTmFtZVRvRW51bVRhYmxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKFN0cmluZzgoIiIpLCBkZXZpY2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVygibG9hZEdsb2JhbENvbmZpZygpIGRlZmF1bHQgZGV2aWNlIG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgbURlZmF1bHRPdXRwdXREZXZpY2UgJTA4eCIsIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5tRGV2aWNlVHlwZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKEFUVEFDSEVEX0lOUFVUX0RFVklDRVNfVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmxvYWREZXZpY2VzRnJvbU5hbWUoKGNoYXIgKilub2RlLT52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZERldmljZXMpOwotICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBBdmFpbGFibGUgSW5wdXREZXZpY2VzICUwOHgiLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChTUEVBS0VSX0RSQ19FTkFCTEVEX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgewotICAgICAgICAgICAgbVNwZWFrZXJEcmNFbmFibGVkID0gc3RyaW5nVG9Cb29sKChjaGFyICopbm9kZS0+dmFsdWUpOwotICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBtU3BlYWtlckRyY0VuYWJsZWQgPSAlZCIsIG1TcGVha2VyRHJjRW5hYmxlZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKEFVRElPX0hBTF9WRVJTSU9OX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgewotICAgICAgICAgICAgdWludDMyX3QgbWFqb3IsIG1pbm9yOwotICAgICAgICAgICAgc3NjYW5mKChjaGFyICopbm9kZS0+dmFsdWUsICIldS4ldSIsICZtYWpvciwgJm1pbm9yKTsKLSAgICAgICAgICAgIG1vZHVsZS0+bUhhbFZlcnNpb24gPSBIQVJEV0FSRV9ERVZJQ0VfQVBJX1ZFUlNJT04obWFqb3IsIG1pbm9yKTsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgbUhhbFZlcnNpb24gPSAlMDR4IG1ham9yICV1IG1pbm9yICV1IiwKLSAgICAgICAgICAgICAgICAgIG1vZHVsZS0+bUhhbFZlcnNpb24sIG1ham9yLCBtaW5vcik7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmxvYWRBdWRpb1BvbGljeUNvbmZpZyhjb25zdCBjaGFyICpwYXRoKQotewotICAgIGNub2RlICpyb290OwotICAgIGNoYXIgKmRhdGE7Ci0KLSAgICBkYXRhID0gKGNoYXIgKilsb2FkX2ZpbGUocGF0aCwgTlVMTCk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcm9vdCA9IGNvbmZpZ19ub2RlKCIiLCAiIik7Ci0gICAgY29uZmlnX2xvYWQocm9vdCwgZGF0YSk7Ci0KLSAgICBsb2FkSHdNb2R1bGVzKHJvb3QpOwotICAgIC8vIGxlZ2FjeSBhdWRpb19wb2xpY3kuY29uZiBmaWxlcyBoYXZlIG9uZSBnbG9iYWxfY29uZmlndXJhdGlvbiBzZWN0aW9uCi0gICAgbG9hZEdsb2JhbENvbmZpZyhyb290LCBnZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSkpOwotICAgIGNvbmZpZ19mcmVlKHJvb3QpOwotICAgIGZyZWUocm9vdCk7Ci0gICAgZnJlZShkYXRhKTsKLQotICAgIEFMT0dJKCJsb2FkQXVkaW9Qb2xpY3lDb25maWcoKSBsb2FkZWQgJXNcbiIsIHBhdGgpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZGVmYXVsdEF1ZGlvUG9saWN5Q29uZmlnKHZvaWQpCi17Ci0gICAgc3A8SHdNb2R1bGU+IG1vZHVsZTsKLSAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGU7Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGVmYXVsdElucHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoU3RyaW5nOCgiIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKTsKLSAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5hZGQobURlZmF1bHRPdXRwdXREZXZpY2UpOwotICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuYWRkKGRlZmF1bHRJbnB1dERldmljZSk7Ci0KLSAgICBtb2R1bGUgPSBuZXcgSHdNb2R1bGUoInByaW1hcnkiKTsKLQotICAgIHByb2ZpbGUgPSBuZXcgSU9Qcm9maWxlKFN0cmluZzgoInByaW1hcnkiKSwgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSwgbW9kdWxlKTsKLSAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoNDQxMDApOwotICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmFkZChBVURJT19GT1JNQVRfUENNXzE2X0JJVCk7Ci0gICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKLSAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5hZGQobURlZmF1bHRPdXRwdXREZXZpY2UpOwotICAgIHByb2ZpbGUtPm1GbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlk7Ci0gICAgbW9kdWxlLT5tT3V0cHV0UHJvZmlsZXMuYWRkKHByb2ZpbGUpOwotCi0gICAgcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUoU3RyaW5nOCgicHJpbWFyeSIpLCBBVURJT19QT1JUX1JPTEVfU0lOSywgbW9kdWxlKTsKLSAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoODAwMCk7Ci0gICAgcHJvZmlsZS0+bUZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKLSAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmFkZChBVURJT19DSEFOTkVMX0lOX01PTk8pOwotICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmFkZChkZWZhdWx0SW5wdXREZXZpY2UpOwotICAgIG1vZHVsZS0+bUlucHV0UHJvZmlsZXMuYWRkKHByb2ZpbGUpOwotCi0gICAgbUh3TW9kdWxlcy5hZGQobW9kdWxlKTsKLX0KLQotYXVkaW9fc3RyZWFtX3R5cGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpCi17Ci0gICAgLy8gZmxhZ3MgdG8gc3RyZWFtIHR5cGUgbWFwcGluZwotICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpID09IEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgewotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU7Ci0gICAgfQotICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX1NDTykgPT0gQVVESU9fRkxBR19TQ08pIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOwotICAgIH0KLSAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19CRUFDT04pID09IEFVRElPX0ZMQUdfQkVBQ09OKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVFRTOwotICAgIH0KLQotICAgIC8vIHVzYWdlIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKLSAgICBzd2l0Y2ggKGF0dHItPnVzYWdlKSB7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6Ci0gICAgICAgIGlmIChpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fQUxBUk0pKSB7Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FMQVJNOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fUklORykpIHsKLSAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fUklORzsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNJbkNhbGwoKSkgewotICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1NZU1RFTTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0RUTUY7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FMQVJNOwotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9SSU5HOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgfQotfQotCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNWYWxpZEF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICpwYWEpIHsKLSAgICAvLyBoYXMgZmxhZ3MgdGhhdCBtYXAgdG8gYSBzdHJhdGVneT8KLSAgICBpZiAoKHBhYS0+ZmxhZ3MgJiAoQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEIHwgQVVESU9fRkxBR19TQ08gfCBBVURJT19GTEFHX0JFQUNPTikpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gaGFzIGtub3duIHVzYWdlPwotICAgIHN3aXRjaCAocGFhLT51c2FnZSkgewotICAgIGNhc2UgQVVESU9fVVNBR0VfVU5LTk9XTjoKLSAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgotICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFOgotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lNYW5hZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeU1hbmFnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JkYWZhNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeU1hbmFnZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDkzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgotI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgotI2luY2x1ZGUgIkF1ZGlvUG9saWN5SW50ZXJmYWNlLmgiCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEF0dGVudWF0aW9uIGFwcGxpZWQgdG8gU1RSQVRFR1lfU09OSUZJQ0FUSU9OIHN0cmVhbXMgd2hlbiBhIGhlYWRzZXQgaXMgY29ubmVjdGVkOiA2ZEIKLSNkZWZpbmUgU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX0ZBQ1RPUiAwLjUKLS8vIE1pbiB2b2x1bWUgZm9yIFNUUkFURUdZX1NPTklGSUNBVElPTiBzdHJlYW1zIHdoZW4gbGltaXRlZCBieSBtdXNpYyB2b2x1bWU6IC0zNmRCCi0jZGVmaW5lIFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9NSU4gIDAuMDE2Ci0vLyBUaW1lIGluIG1pbGxpc2Vjb25kcyBkdXJpbmcgd2hpY2ggd2UgY29uc2lkZXIgdGhhdCBtdXNpYyBpcyBzdGlsbCBhY3RpdmUgYWZ0ZXIgYSBtdXNpYwotLy8gdHJhY2sgd2FzIHN0b3BwZWQgLSBzZWUgY29tcHV0ZVZvbHVtZSgpCi0jZGVmaW5lIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZICA1MDAwCi0vLyBUaW1lIGluIG1pbGxpc2Vjb25kcyBhZnRlciBtZWRpYSBzdG9wcGVkIHBsYXlpbmcgZHVyaW5nIHdoaWNoIHdlIGNvbnNpZGVyIHRoYXQgdGhlCi0vLyBzb25pZmljYXRpb24gc2hvdWxkIGJlIGFzIHVub2J0cnVzaXZlIGFzIGR1cmluZyB0aGUgdGltZSBtZWRpYSB3YXMgcGxheWluZy4KLSNkZWZpbmUgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkgNTAwMAotLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgZHVyaW5nIHdpdGNoIHNvbWUgc3RyZWFtcyBhcmUgbXV0ZWQgd2hpbGUgdGhlIGF1ZGlvIHBhdGgKLS8vIGlzIHN3aXRjaGVkCi0jZGVmaW5lIE1VVEVfVElNRV9NUyAyMDAwCi0KLSNkZWZpbmUgTlVNX1RFU1RfT1VUUFVUUyA1Ci0KLSNkZWZpbmUgTlVNX1ZPTF9DVVJWRV9LTkVFUyAyCi0KLS8vIERlZmF1bHQgbWluaW11bSBsZW5ndGggYWxsb3dlZCBmb3Igb2ZmbG9hZGluZyBhIGNvbXByZXNzZWQgdHJhY2sKLS8vIENhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSBhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzIHByb3BlcnR5Ci0jZGVmaW5lIE9GRkxPQURfREVGQVVMVF9NSU5fRFVSQVRJT05fU0VDUyA2MAotCi0jZGVmaW5lIE1BWF9NSVhFUl9TQU1QTElOR19SQVRFIDQ4MDAwCi0jZGVmaW5lIE1BWF9NSVhFUl9DSEFOTkVMX0NPVU5UIDgKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQXVkaW9Qb2xpY3lNYW5hZ2VyIGltcGxlbWVudHMgYXVkaW8gcG9saWN5IG1hbmFnZXIgYmVoYXZpb3IgY29tbW9uIHRvIGFsbCBwbGF0Zm9ybXMuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIEF1ZGlvUG9saWN5TWFuYWdlcjogcHVibGljIEF1ZGlvUG9saWN5SW50ZXJmYWNlCi0jaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKLSAgICAsIHB1YmxpYyBUaHJlYWQKLSNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCi17Ci0KLXB1YmxpYzoKLSAgICAgICAgICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7Ci0gICAgICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5TWFuYWdlcigpOwotCi0gICAgICAgIC8vIEF1ZGlvUG9saWN5SW50ZXJmYWNlCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKLSAgICAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0U3lzdGVtUHJvcGVydHkoY29uc3QgY2hhciogcHJvcGVydHksIGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKLSAgICAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3R5cGVfdCAqaW5wdXRUeXBlKTsKLQotICAgICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0YXJ0cyBiZWluZyB1c2VkLgotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0KLSAgICAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdG9wcyBiZWluZyB1c2VkLgotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGNsb3NlQWxsSW5wdXRzKCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwotCi0gICAgICAgIC8vIHJldHVybiB0aGUgc3RyYXRlZ3kgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHN0cmVhbSB0eXBlCi0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMKLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKTsKLQotICAgICAgICAvLyByZXR1cm4gdGhlIGVuYWJsZWQgb3V0cHV0IGRldmljZXMgZm9yIHRoZSBnaXZlbiBzdHJlYW0gdHlwZQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjID0gTlVMTCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKTsKLQotICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7Ci0gICAgICAgIC8vIHJldHVybiB3aGV0aGVyIGEgc3RyZWFtIGlzIHBsYXlpbmcgcmVtb3RlbHksIG92ZXJyaWRlIHRvIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZgotICAgICAgICAvLyAgIGxvY2FsL3JlbW90ZSBwbGF5YmFjaywgdXNlZCBmb3IgaW5zdGFuY2UgYnkgbm90aWZpY2F0aW9uIG1hbmFnZXIgdG8gbm90IG1ha2UKLSAgICAgICAgLy8gICBtZWRpYSBwbGF5ZXJzIGxvc2UgYXVkaW8gZm9jdXMgd2hlbiBub3QgcGxheWluZyBsb2NhbGx5Ci0gICAgICAgIC8vICAgRm9yIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uLCAicmVtb3RlbHkiIG1lYW5zIHBsYXlpbmcgZHVyaW5nIHNjcmVlbiBtaXJyb3Jpbmcgd2hpY2gKLSAgICAgICAgLy8gICB1c2VzIGFuIG91dHB1dCBmb3IgcGxheWJhY2sgd2l0aCBhIG5vbi1lbXB0eSwgbm9uICIwIiBhZGRyZXNzLgotICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBib29sIGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3Q7Ci0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0KLSAgICAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgb2ZmbG9hZEluZm8pOwotCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBjbGVhckF1ZGlvUGF0Y2hlcyh1aWRfdCB1aWQpOwotCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKTsKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyUG9saWN5TWl4ZXMoVmVjdG9yPEF1ZGlvTWl4PiBtaXhlcyk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlclBvbGljeU1peGVzKFZlY3RvcjxBdWRpb01peD4gbWl4ZXMpOwotCi1wcm90ZWN0ZWQ6Ci0KLSAgICAgICAgZW51bSByb3V0aW5nX3N0cmF0ZWd5IHsKLSAgICAgICAgICAgIFNUUkFURUdZX01FRElBLAotICAgICAgICAgICAgU1RSQVRFR1lfUEhPTkUsCi0gICAgICAgICAgICBTVFJBVEVHWV9TT05JRklDQVRJT04sCi0gICAgICAgICAgICBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCwKLSAgICAgICAgICAgIFNUUkFURUdZX0RUTUYsCi0gICAgICAgICAgICBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLAotICAgICAgICAgICAgU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSLAotICAgICAgICAgICAgU1RSQVRFR1lfQUNDRVNTSUJJTElUWSwKLSAgICAgICAgICAgIFNUUkFURUdZX1JFUk9VVElORywKLSAgICAgICAgICAgIE5VTV9TVFJBVEVHSUVTCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gNCBwb2ludHMgdG8gZGVmaW5lIHRoZSB2b2x1bWUgYXR0ZW51YXRpb24gY3VydmUsIGVhY2ggY2hhcmFjdGVyaXplZCBieSB0aGUgdm9sdW1lCi0gICAgICAgIC8vIGluZGV4IChmcm9tIDAgdG8gMTAwKSBhdCB3aGljaCB0aGV5IGFwcGx5LCBhbmQgdGhlIGF0dGVudWF0aW9uIGluIGRCIGF0IHRoYXQgaW5kZXguCi0gICAgICAgIC8vIHdlIHVzZSAxMDAgc3RlcHMgdG8gYXZvaWQgcm91bmRpbmcgZXJyb3JzIHdoZW4gY29tcHV0aW5nIHRoZSB2b2x1bWUgaW4gdm9sSW5kZXhUb0FtcGwoKQotCi0gICAgICAgIGVudW0geyBWT0xNSU4gPSAwLCBWT0xLTkVFMSA9IDEsIFZPTEtORUUyID0gMiwgVk9MTUFYID0gMywgVk9MQ05UID0gNH07Ci0KLSAgICAgICAgY2xhc3MgVm9sdW1lQ3VydmVQb2ludAotICAgICAgICB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIGludCBtSW5kZXg7Ci0gICAgICAgICAgICBmbG9hdCBtREJBdHRlbnVhdGlvbjsKLSAgICAgICAgfTsKLQotICAgICAgICAvLyBkZXZpY2UgY2F0ZWdvcmllcyB1c2VkIGZvciB2b2x1bWUgY3VydmUgbWFuYWdlbWVudC4KLSAgICAgICAgZW51bSBkZXZpY2VfY2F0ZWdvcnkgewotICAgICAgICAgICAgREVWSUNFX0NBVEVHT1JZX0hFQURTRVQsCi0gICAgICAgICAgICBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKLSAgICAgICAgICAgIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRSwKLSAgICAgICAgICAgIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEsCi0gICAgICAgICAgICBERVZJQ0VfQ0FURUdPUllfQ05UCi0gICAgICAgIH07Ci0KLSAgICAgICAgY2xhc3MgSHdNb2R1bGU7Ci0KLSAgICAgICAgY2xhc3MgQXVkaW9HYWluOiBwdWJsaWMgUmVmQmFzZQotICAgICAgICB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIEF1ZGlvR2FpbihpbnQgaW5kZXgsIGJvb2wgdXNlSW5DaGFubmVsTWFzayk7Ci0gICAgICAgICAgICB2aXJ0dWFsIH5BdWRpb0dhaW4oKSB7fQotCi0gICAgICAgICAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OwotCi0gICAgICAgICAgICB2b2lkIGdldERlZmF1bHRDb25maWcoc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpOwotICAgICAgICAgICAgc3RhdHVzX3QgY2hlY2tDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpOwotICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgbUluZGV4OwotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2dhaW4gbUdhaW47Ci0gICAgICAgICAgICBib29sICAgICAgICAgICAgICBtVXNlSW5DaGFubmVsTWFzazsKLSAgICAgICAgfTsKLQotICAgICAgICBjbGFzcyBBdWRpb1BvcnQ6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBBdWRpb1BvcnQoY29uc3QgU3RyaW5nOCYgbmFtZSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCByb2xlLCBjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSk7Ci0gICAgICAgICAgICB2aXJ0dWFsIH5BdWRpb1BvcnQoKSB7fQotCi0gICAgICAgICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OwotCi0gICAgICAgICAgICB2b2lkIGltcG9ydEF1ZGlvUG9ydChjb25zdCBzcDxBdWRpb1BvcnQ+IHBvcnQpOwotICAgICAgICAgICAgdm9pZCBjbGVhckNhcGFiaWxpdGllcygpOwotCi0gICAgICAgICAgICB2b2lkIGxvYWRTYW1wbGluZ1JhdGVzKGNoYXIgKm5hbWUpOwotICAgICAgICAgICAgdm9pZCBsb2FkRm9ybWF0cyhjaGFyICpuYW1lKTsKLSAgICAgICAgICAgIHZvaWQgbG9hZE91dENoYW5uZWxzKGNoYXIgKm5hbWUpOwotICAgICAgICAgICAgdm9pZCBsb2FkSW5DaGFubmVscyhjaGFyICpuYW1lKTsKLQotICAgICAgICAgICAgYXVkaW9fZ2Fpbl9tb2RlX3QgbG9hZEdhaW5Nb2RlKGNoYXIgKm5hbWUpOwotICAgICAgICAgICAgdm9pZCBsb2FkR2Fpbihjbm9kZSAqcm9vdCwgaW50IGluZGV4KTsKLSAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBsb2FkR2FpbnMoY25vZGUgKnJvb3QpOwotCi0gICAgICAgICAgICAvLyBzZWFyY2hlcyBmb3IgYW4gZXhhY3QgbWF0Y2gKLSAgICAgICAgICAgIHN0YXR1c190IGNoZWNrRXhhY3RTYW1wbGluZ1JhdGUodWludDMyX3Qgc2FtcGxpbmdSYXRlKSBjb25zdDsKLSAgICAgICAgICAgIC8vIHNlYXJjaGVzIGZvciBhIGNvbXBhdGlibGUgbWF0Y2gsIGFuZCByZXR1cm5zIHRoZSBiZXN0IG1hdGNoIHZpYSB1cGRhdGVkU2FtcGxpbmdSYXRlCi0gICAgICAgICAgICBzdGF0dXNfdCBjaGVja0NvbXBhdGlibGVTYW1wbGluZ1JhdGUodWludDMyX3Qgc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdXBkYXRlZFNhbXBsaW5nUmF0ZSkgY29uc3Q7Ci0gICAgICAgICAgICAvLyBzZWFyY2hlcyBmb3IgYW4gZXhhY3QgbWF0Y2gKLSAgICAgICAgICAgIHN0YXR1c190IGNoZWNrRXhhY3RDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgY29uc3Q7Ci0gICAgICAgICAgICAvLyBzZWFyY2hlcyBmb3IgYSBjb21wYXRpYmxlIG1hdGNoLCBjdXJyZW50bHkgaW1wbGVtZW50ZWQgZm9yIGlucHV0IGNoYW5uZWwgbWFza3Mgb25seQotICAgICAgICAgICAgc3RhdHVzX3QgY2hlY2tDb21wYXRpYmxlQ2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIGNvbnN0OwotICAgICAgICAgICAgc3RhdHVzX3QgY2hlY2tGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKLSAgICAgICAgICAgIHN0YXR1c190IGNoZWNrR2Fpbihjb25zdCBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmdhaW5Db25maWcsIGludCBpbmRleCkgY29uc3Q7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHBpY2tTYW1wbGluZ1JhdGUoKSBjb25zdDsKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHBpY2tDaGFubmVsTWFzaygpIGNvbnN0OwotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgcGlja0Zvcm1hdCgpIGNvbnN0OwotCi0gICAgICAgICAgICBzdGF0aWMgY29uc3QgYXVkaW9fZm9ybWF0X3Qgc1BjbUZvcm1hdENvbXBhcmVUYWJsZVtdOwotICAgICAgICAgICAgc3RhdGljIGludCBjb21wYXJlRm9ybWF0cyhhdWRpb19mb3JtYXRfdCBmb3JtYXQxLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQyKTsKLQotICAgICAgICAgICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3Q7Ci0KLSAgICAgICAgICAgIFN0cmluZzggICAgICAgICAgIG1OYW1lOwotICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgbVR5cGU7Ci0gICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCBtUm9sZTsKLSAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgIG1Vc2VJbkNoYW5uZWxNYXNrOwotICAgICAgICAgICAgLy8gYnkgY29udmVudGlvbiwgIjAnIGluIHRoZSBmaXJzdCBlbnRyeSBpbiBtU2FtcGxpbmdSYXRlcywgbUNoYW5uZWxNYXNrcyBvciBtRm9ybWF0cwotICAgICAgICAgICAgLy8gaW5kaWNhdGVzIHRoZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBzaG91bGQgYmUgcmVhZCBmcm9tIHRoZSBvdXRwdXQgc3RyZWFtCi0gICAgICAgICAgICAvLyBhZnRlciBpdCBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lCi0gICAgICAgICAgICBWZWN0b3IgPHVpbnQzMl90PiBtU2FtcGxpbmdSYXRlczsgLy8gc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzCi0gICAgICAgICAgICBWZWN0b3IgPGF1ZGlvX2NoYW5uZWxfbWFza190PiBtQ2hhbm5lbE1hc2tzOyAvLyBzdXBwb3J0ZWQgY2hhbm5lbCBtYXNrcwotICAgICAgICAgICAgVmVjdG9yIDxhdWRpb19mb3JtYXRfdD4gbUZvcm1hdHM7IC8vIHN1cHBvcnRlZCBhdWRpbyBmb3JtYXRzCi0gICAgICAgICAgICBWZWN0b3IgPCBzcDxBdWRpb0dhaW4+ID4gbUdhaW5zOyAvLyBnYWluIGNvbnRyb2xsZXJzCi0gICAgICAgICAgICBzcDxId01vZHVsZT4gbU1vZHVsZTsgICAgICAgICAgICAgICAgIC8vIGF1ZGlvIEhXIG1vZHVsZSBleHBvc2luZyB0aGlzIEkvTyBzdHJlYW0KLSAgICAgICAgICAgIHVpbnQzMl90IG1GbGFnczsgLy8gYXR0cmlidXRlIGZsYWdzIChlLmcgcHJpbWFyeSBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3Qgb3V0cHV0Li4uKS4KLSAgICAgICAgfTsKLQotICAgICAgICBjbGFzcyBBdWRpb1BvcnRDb25maWc6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBBdWRpb1BvcnRDb25maWcoKTsKLSAgICAgICAgICAgIHZpcnR1YWwgfkF1ZGlvUG9ydENvbmZpZygpIHt9Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGFwcGx5QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpiYWNrdXBDb25maWcgPSBOVUxMKTsKLSAgICAgICAgICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdCA9IDA7Ci0gICAgICAgICAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgPSAwOwotICAgICAgICAgICAgdWludDMyX3QgbVNhbXBsaW5nUmF0ZTsKLSAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7Ci0gICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtQ2hhbm5lbE1hc2s7Ci0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgbUdhaW47Ci0gICAgICAgIH07Ci0KLQotICAgICAgICBjbGFzcyBBdWRpb1BhdGNoOiBwdWJsaWMgUmVmQmFzZQotICAgICAgICB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIEF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLCB1aWRfdCB1aWQpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IYW5kbGUoaGFuZGxlKSwgbVBhdGNoKCpwYXRjaCksIG1VaWQodWlkKSwgbUFmUGF0Y2hIYW5kbGUoMCkge30KLQotICAgICAgICAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7Ci0KLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1IYW5kbGU7Ci0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbVBhdGNoOwotICAgICAgICAgICAgdWlkX3QgbVVpZDsKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1BZlBhdGNoSGFuZGxlOwotICAgICAgICB9OwotCi0gICAgICAgIGNsYXNzIERldmljZURlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnQsIHB1YmxpYyBBdWRpb1BvcnRDb25maWcKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBEZXZpY2VEZXNjcmlwdG9yKGNvbnN0IFN0cmluZzgmIG5hbWUsIGF1ZGlvX2RldmljZXNfdCB0eXBlKTsKLQotICAgICAgICAgICAgdmlydHVhbCB+RGV2aWNlRGVzY3JpcHRvcigpIHt9Ci0KLSAgICAgICAgICAgIGJvb2wgZXF1YWxzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBvdGhlcikgY29uc3Q7Ci0KLSAgICAgICAgICAgIC8vIEF1ZGlvUG9ydENvbmZpZwotICAgICAgICAgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0IHsgcmV0dXJuIChBdWRpb1BvcnQqKSB0aGlzOyB9Ci0gICAgICAgICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7Ci0KLSAgICAgICAgICAgIC8vIEF1ZGlvUG9ydAotICAgICAgICAgICAgdmlydHVhbCB2b2lkIGxvYWRHYWlucyhjbm9kZSAqcm9vdCk7Ci0gICAgICAgICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OwotCi0gICAgICAgICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKLQotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2VUeXBlOwotICAgICAgICAgICAgU3RyaW5nOCBtQWRkcmVzczsKLSAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUlkOwotICAgICAgICB9OwotCi0gICAgICAgIGNsYXNzIERldmljZVZlY3RvciA6IHB1YmxpYyBTb3J0ZWRWZWN0b3I8IHNwPERldmljZURlc2NyaXB0b3I+ID4KLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBEZXZpY2VWZWN0b3IoKSA6IFNvcnRlZFZlY3RvcigpLCBtRGV2aWNlVHlwZXMoQVVESU9fREVWSUNFX05PTkUpIHt9Ci0KLSAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBhZGQoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pOwotICAgICAgICAgICAgc3NpemVfdCAgICAgICAgIHJlbW92ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSk7Ci0gICAgICAgICAgICBzc2l6ZV90ICAgICAgICAgaW5kZXhPZihjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkgY29uc3Q7Ci0KLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlcygpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlczsgfQotCi0gICAgICAgICAgICB2b2lkIGxvYWREZXZpY2VzRnJvbVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGVzKTsKLSAgICAgICAgICAgIHZvaWQgbG9hZERldmljZXNGcm9tTmFtZShjaGFyICpuYW1lLCBjb25zdCBEZXZpY2VWZWN0b3ImIGRlY2xhcmVkRGV2aWNlcyk7Ci0KLSAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgU3RyaW5nOCBhZGRyZXNzKSBjb25zdDsKLSAgICAgICAgICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGVzKSBjb25zdDsKLSAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZUZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdDsKLSAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZUZyb21OYW1lKGNvbnN0IFN0cmluZzgmIG5hbWUpIGNvbnN0OwotICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGcm9tVHlwZUFkZHIoYXVkaW9fZGV2aWNlc190IHR5cGUsIFN0cmluZzggYWRkcmVzcykKLSAgICAgICAgICAgICAgICAgICAgY29uc3Q7Ci0KLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgIHZvaWQgcmVmcmVzaFR5cGVzKCk7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbURldmljZVR5cGVzOwotICAgICAgICB9OwotCi0gICAgICAgIC8vIHRoZSBJT1Byb2ZpbGUgY2xhc3MgZGVzY3JpYmVzIHRoZSBjYXBhYmlsaXRpZXMgb2YgYW4gb3V0cHV0IG9yIGlucHV0IHN0cmVhbS4KLSAgICAgICAgLy8gSXQgaXMgY3VycmVudGx5IGFzc3VtZWQgdGhhdCBhbGwgY29tYmluYXRpb24gb2YgbGlzdGVkIHBhcmFtZXRlcnMgYXJlIHN1cHBvcnRlZC4KLSAgICAgICAgLy8gSXQgaXMgdXNlZCBieSB0aGUgcG9saWN5IG1hbmFnZXIgdG8gZGV0ZXJtaW5lIGlmIGFuIG91dHB1dCBvciBpbnB1dCBpcyBzdWl0YWJsZSBmb3IKLSAgICAgICAgLy8gYSBnaXZlbiB1c2UgY2FzZSwgIG9wZW4vY2xvc2UgaXQgYWNjb3JkaW5nbHkgYW5kIGNvbm5lY3QvZGlzY29ubmVjdCBhdWRpbyB0cmFja3MKLSAgICAgICAgLy8gdG8vZnJvbSBpdC4KLSAgICAgICAgY2xhc3MgSU9Qcm9maWxlIDogcHVibGljIEF1ZGlvUG9ydAotICAgICAgICB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIElPUHJvZmlsZShjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlLCBjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSk7Ci0gICAgICAgICAgICB2aXJ0dWFsIH5JT1Byb2ZpbGUoKTsKLQotICAgICAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgYm90aCBvdXRwdXQgYW5kIGlucHV0LgotICAgICAgICAgICAgLy8gSWYgcGFyYW1ldGVyIHVwZGF0ZWRTYW1wbGluZ1JhdGUgaXMgbm9uLU5VTEwsIGl0IGlzIGFzc2lnbmVkIHRoZSBhY3R1YWwgc2FtcGxlIHJhdGUuCi0gICAgICAgICAgICAvLyBGb3IgaW5wdXQsIGZsYWdzIGlzIGludGVycHJldGVkIGFzIGF1ZGlvX2lucHV0X2ZsYWdzX3QuCi0gICAgICAgICAgICAvLyBUT0RPOiBtZXJnZSBhdWRpb19vdXRwdXRfZmxhZ3NfdCBhbmQgYXVkaW9faW5wdXRfZmxhZ3NfdC4KLSAgICAgICAgICAgIGJvb2wgaXNDb21wYXRpYmxlUHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnVwZGF0ZWRTYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKSBjb25zdDsKLQotICAgICAgICAgICAgdm9pZCBkdW1wKGludCBmZCk7Ci0gICAgICAgICAgICB2b2lkIGxvZygpOwotCi0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgIG1TdXBwb3J0ZWREZXZpY2VzOyAvLyBzdXBwb3J0ZWQgZGV2aWNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGRldmljZXMgdGhpcyBvdXRwdXQgY2FuIGJlIHJvdXRlZCB0bykKLSAgICAgICAgfTsKLQotICAgICAgICBjbGFzcyBId01vZHVsZSA6IHB1YmxpYyBSZWZCYXNlCi0gICAgICAgIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgICAgICAgICBId01vZHVsZShjb25zdCBjaGFyICpuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfkh3TW9kdWxlKCk7Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGxvYWRPdXRwdXQoY25vZGUgKnJvb3QpOwotICAgICAgICAgICAgc3RhdHVzX3QgbG9hZElucHV0KGNub2RlICpyb290KTsKLSAgICAgICAgICAgIHN0YXR1c190IGxvYWREZXZpY2UoY25vZGUgKnJvb3QpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBhZGRPdXRwdXRQcm9maWxlKFN0cmluZzggbmFtZSwgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgU3RyaW5nOCBhZGRyZXNzKTsKLSAgICAgICAgICAgIHN0YXR1c190IHJlbW92ZU91dHB1dFByb2ZpbGUoU3RyaW5nOCBuYW1lKTsKLSAgICAgICAgICAgIHN0YXR1c190IGFkZElucHV0UHJvZmlsZShTdHJpbmc4IG5hbWUsIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIFN0cmluZzggYWRkcmVzcyk7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZW1vdmVJbnB1dFByb2ZpbGUoU3RyaW5nOCBuYW1lKTsKLQotICAgICAgICAgICAgdm9pZCBkdW1wKGludCBmZCk7Ci0KLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0ICAgICAgICBtTmFtZTsgLy8gYmFzZSBuYW1lIG9mIHRoZSBhdWRpbyBIVyBtb2R1bGUgKHByaW1hcnksIGEyZHAgLi4uKQotICAgICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgIG1IYWxWZXJzaW9uOyAvLyBhdWRpbyBIQUwgQVBJIHZlcnNpb24KLSAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCAgICBtSGFuZGxlOwotICAgICAgICAgICAgVmVjdG9yIDwgc3A8SU9Qcm9maWxlPiA+IG1PdXRwdXRQcm9maWxlczsgLy8gb3V0cHV0IHByb2ZpbGVzIGV4cG9zZWQgYnkgdGhpcyBtb2R1bGUKLSAgICAgICAgICAgIFZlY3RvciA8IHNwPElPUHJvZmlsZT4gPiBtSW5wdXRQcm9maWxlczsgIC8vIGlucHV0IHByb2ZpbGVzIGV4cG9zZWQgYnkgdGhpcyBtb2R1bGUKLSAgICAgICAgICAgIERldmljZVZlY3RvciAgICAgICAgICAgICBtRGVjbGFyZWREZXZpY2VzOyAvLyBkZXZpY2VzIGRlY2xhcmVkIGluIGF1ZGlvX3BvbGljeS5jb25mCi0KLSAgICAgICAgfTsKLQotICAgICAgICAvLyBkZWZhdWx0IHZvbHVtZSBjdXJ2ZQotICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKLSAgICAgICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmUgZm9yIG1lZGlhIHN0cmF0ZWd5Ci0gICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07Ci0gICAgICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3Igbm9uLW1lZGlhIGF1ZGlvIG9uIGV4dCBtZWRpYSBvdXRwdXRzIChIRE1JLCBMaW5lLCBldGMpCi0gICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKLSAgICAgICAgLy8gdm9sdW1lIGN1cnZlIGZvciBtZWRpYSBzdHJhdGVneSBvbiBzcGVha2VycwotICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOwotICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmNbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOwotICAgICAgICAvLyB2b2x1bWUgY3VydmUgZm9yIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBvbiBzcGVha2VycwotICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyY1tBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07Ci0gICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVbQXVkaW9Qb2xpY3lNYW5hZ2VyOjpWT0xDTlRdOwotICAgICAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlRHJjW0F1ZGlvUG9saWN5TWFuYWdlcjo6Vk9MQ05UXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07Ci0gICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07Ci0gICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07Ci0gICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNMaW5lYXJWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07Ci0gICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTaWxlbnRWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07Ci0gICAgICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNGdWxsU2NhbGVWb2x1bWVDdXJ2ZVtBdWRpb1BvbGljeU1hbmFnZXI6OlZPTENOVF07Ci0gICAgICAgIC8vIGRlZmF1bHQgdm9sdW1lIGN1cnZlcyBwZXIgc3RyZWFtIGFuZCBkZXZpY2UgY2F0ZWdvcnkuIFNlZSBpbml0aWFsaXplVm9sdW1lQ3VydmVzKCkKLSAgICAgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fQ05UXVtERVZJQ0VfQ0FURUdPUllfQ05UXTsKLQotICAgICAgICAvLyBkZXNjcmlwdG9yIGZvciBhdWRpbyBvdXRwdXRzLiBVc2VkIHRvIG1haW50YWluIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiBlYWNoIG9wZW5lZCBhdWRpbyBvdXRwdXQKLSAgICAgICAgLy8gYW5kIGtlZXAgdHJhY2sgb2YgdGhlIHVzYWdlIG9mIHRoaXMgb3V0cHV0IGJ5IGVhY2ggYXVkaW8gc3RyZWFtIHR5cGUuCi0gICAgICAgIGNsYXNzIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvUG9ydENvbmZpZwotICAgICAgICB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpOwotCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKCkgY29uc3Q7Ci0gICAgICAgICAgICB2b2lkIGNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgZGVsdGEpOwotCi0gICAgICAgICAgICBib29sIGlzRHVwbGljYXRlZCgpIGNvbnN0IHsgcmV0dXJuIChtT3V0cHV0MSAhPSBOVUxMICYmIG1PdXRwdXQyICE9IE5VTEwpOyB9Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgc3VwcG9ydGVkRGV2aWNlcygpOwotICAgICAgICAgICAgdWludDMyX3QgbGF0ZW5jeSgpOwotICAgICAgICAgICAgYm9vbCBzaGFyZXNId01vZHVsZVdpdGgoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjKTsKLSAgICAgICAgICAgIGJvb2wgaXNBY3RpdmUodWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKLSAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3Q7Ci0gICAgICAgICAgICBib29sIGlzU3RyYXRlZ3lBY3RpdmUocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUgPSAwKSBjb25zdDsKLQotICAgICAgICAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OwotICAgICAgICAgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0IHsgcmV0dXJuIG1Qcm9maWxlOyB9Ci0gICAgICAgICAgICB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKLQotICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtSWQ7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtSW9IYW5kbGU7ICAgICAgICAgICAgICAvLyBvdXRwdXQgaGFuZGxlCi0gICAgICAgICAgICB1aW50MzJfdCBtTGF0ZW5jeTsgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbUZsYWdzOyAgIC8vCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbURldmljZTsgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBkZXZpY2UgdGhpcyBvdXRwdXQgaXMgcm91dGVkIHRvCi0gICAgICAgICAgICBBdWRpb01peCAqbVBvbGljeU1peDsgICAgICAgICAgICAgLy8gbm9uIE5VTEwgd2hlbiB1c2VkIGJ5IGEgZHluYW1pYyBwb2xpY3kKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIHVpbnQzMl90IG1SZWZDb3VudFtBVURJT19TVFJFQU1fQ05UXTsgLy8gbnVtYmVyIG9mIHN0cmVhbXMgb2YgZWFjaCB0eXBlIHVzaW5nIHRoaXMgb3V0cHV0Ci0gICAgICAgICAgICBuc2Vjc190IG1TdG9wVGltZVtBVURJT19TVFJFQU1fQ05UXTsKLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbU91dHB1dDE7ICAgIC8vIHVzZWQgYnkgZHVwbGljYXRlZCBvdXRwdXRzOiBmaXJzdCBvdXRwdXQKLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbU91dHB1dDI7ICAgIC8vIHVzZWQgYnkgZHVwbGljYXRlZCBvdXRwdXRzOiBzZWNvbmQgb3V0cHV0Ci0gICAgICAgICAgICBmbG9hdCBtQ3VyVm9sdW1lW0FVRElPX1NUUkVBTV9DTlRdOyAgIC8vIGN1cnJlbnQgc3RyZWFtIHZvbHVtZQotICAgICAgICAgICAgaW50IG1NdXRlQ291bnRbQVVESU9fU1RSRUFNX0NOVF07ICAgICAvLyBtdXRlIHJlcXVlc3QgY291bnRlcgotICAgICAgICAgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiBtUHJvZmlsZTsgICAgICAgICAgLy8gSS9PIHByb2ZpbGUgdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tCi0gICAgICAgICAgICBib29sIG1TdHJhdGVneU11dGVkQnlEZXZpY2VbTlVNX1NUUkFURUdJRVNdOyAvLyBzdHJhdGVnaWVzIG11dGVkIGJlY2F1c2Ugb2YgaW5jb21wYXRpYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXZpY2Ugc2VsZWN0aW9uLiBTZWUgY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcygpCi0gICAgICAgICAgICB1aW50MzJfdCBtRGlyZWN0T3BlbkNvdW50OyAvLyBudW1iZXIgb2YgY2xpZW50cyB1c2luZyB0aGlzIG91dHB1dCAoZGlyZWN0IG91dHB1dHMgb25seSkKLSAgICAgICAgfTsKLQotICAgICAgICAvLyBkZXNjcmlwdG9yIGZvciBhdWRpbyBpbnB1dHMuIFVzZWQgdG8gbWFpbnRhaW4gY3VycmVudCBjb25maWd1cmF0aW9uIG9mIGVhY2ggb3BlbmVkIGF1ZGlvIGlucHV0Ci0gICAgICAgIC8vIGFuZCBrZWVwIHRyYWNrIG9mIHRoZSB1c2FnZSBvZiB0aGlzIGlucHV0LgotICAgICAgICBjbGFzcyBBdWRpb0lucHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvUG9ydENvbmZpZwotICAgICAgICB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIEF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7Ci0KLSAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgICAgICAgIG1JZDsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgICAgICAgIG1Jb0hhbmRsZTsgICAgICAgLy8gaW5wdXQgaGFuZGxlCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICAgICAgICBtRGV2aWNlOyAgICAgICAgIC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgaW5wdXQgaXMgcm91dGVkIHRvCi0gICAgICAgICAgICBBdWRpb01peCAgICAgICAgICAgICAgICAgICAgICAqbVBvbGljeU1peDsgICAgIC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICBtUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICBtUmVmQ291bnQ7ICAgICAgIC8vIG51bWJlciBvZiBBdWRpb1JlY29yZCBjbGllbnRzIHVzaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaW5wdXQKLSAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgIG1PcGVuUmVmQ291bnQ7Ci0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCAgICAgICAgICAgICAgICBtSW5wdXRTb3VyY2U7ICAgIC8vIGlucHV0IHNvdXJjZSBzZWxlY3RlZCBieSBhcHBsaWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyhtZWRpYXJlY29yZGVyLmgpCi0gICAgICAgICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+ICAgICAgICAgICBtUHJvZmlsZTsgICAgICAgIC8vIEkvTyBwcm9maWxlIHRoaXMgb3V0cHV0IGRlcml2ZXMgZnJvbQotICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdD4gbVNlc3Npb25zOyAgICAgICAvLyBhdWRpbyBzZXNzaW9ucyBhdHRhY2hlZCB0byB0aGlzIGlucHV0Ci0gICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNTb3VuZFRyaWdnZXI7IC8vIHVzZWQgYnkgYSBzb3VuZHRyaWdnZXIgY2FwdHVyZQotCi0gICAgICAgICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7Ci0gICAgICAgICAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgeyByZXR1cm4gbVByb2ZpbGU7IH0KLSAgICAgICAgICAgIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OwotICAgICAgICB9OwotCi0gICAgICAgIC8vIHN0cmVhbSBkZXNjcmlwdG9yIHVzZWQgZm9yIHZvbHVtZSBjb250cm9sCi0gICAgICAgIGNsYXNzIFN0cmVhbURlc2NyaXB0b3IKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBTdHJlYW1EZXNjcmlwdG9yKCk7Ci0KLSAgICAgICAgICAgIGludCBnZXRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKLSAgICAgICAgICAgIHZvaWQgZHVtcChpbnQgZmQpOwotCi0gICAgICAgICAgICBpbnQgbUluZGV4TWluOyAgICAgIC8vIG1pbiB2b2x1bWUgaW5kZXgKLSAgICAgICAgICAgIGludCBtSW5kZXhNYXg7ICAgICAgLy8gbWF4IHZvbHVtZSBpbmRleAotICAgICAgICAgICAgS2V5ZWRWZWN0b3I8YXVkaW9fZGV2aWNlc190LCBpbnQ+IG1JbmRleEN1cjsgICAvLyBjdXJyZW50IHZvbHVtZSBpbmRleCBwZXIgZGV2aWNlCi0gICAgICAgICAgICBib29sIG1DYW5CZU11dGVkOyAgIC8vIHRydWUgaXMgdGhlIHN0cmVhbSBjYW4gYmUgbXV0ZWQKLQotICAgICAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqbVZvbHVtZUN1cnZlW0RFVklDRV9DQVRFR09SWV9DTlRdOwotICAgICAgICB9OwotCi0gICAgICAgIC8vIHN0cmVhbSBkZXNjcmlwdG9yIHVzZWQgZm9yIHZvbHVtZSBjb250cm9sCi0gICAgICAgIGNsYXNzIEVmZmVjdERlc2NyaXB0b3IgOiBwdWJsaWMgUmVmQmFzZQotICAgICAgICB7Ci0gICAgICAgIHB1YmxpYzoKLQotICAgICAgICAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgICAgICAgICBpbnQgbUlvOyAgICAgICAgICAgICAgICAvLyBpbyB0aGUgZWZmZWN0IGlzIGF0dGFjaGVkIHRvCi0gICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IG1TdHJhdGVneTsgLy8gcm91dGluZyBzdHJhdGVneSB0aGUgZWZmZWN0IGlzIGFzc29jaWF0ZWQgdG8KLSAgICAgICAgICAgIGludCBtU2Vzc2lvbjsgICAgICAgICAgICAgICAvLyBhdWRpbyBzZXNzaW9uIHRoZSBlZmZlY3QgaXMgb24KLSAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgbURlc2M7ICAvLyBlZmZlY3QgZGVzY3JpcHRvcgotICAgICAgICAgICAgYm9vbCBtRW5hYmxlZDsgICAgICAgICAgICAgIC8vIGVuYWJsZWQgc3RhdGU6IENQVSBsb2FkIGJlaW5nIHVzZWQgb3Igbm90Ci0gICAgICAgIH07Ci0KLSAgICAgICAgdm9pZCBhZGRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MpOwotICAgICAgICB2b2lkIGFkZElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjKTsKLQotICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQotICAgICAgICBzdGF0aWMgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0KLSAgICAgICAgLy8gcmV0dXJuIGFwcHJvcHJpYXRlIGRldmljZSBmb3Igc3RyZWFtcyBoYW5kbGVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyYXRlZ3kgYWNjb3JkaW5nIHRvIGN1cnJlbnQKLSAgICAgICAgLy8gcGhvbmUgc3RhdGUsIGNvbm5lY3RlZCBkZXZpY2VzLi4uCi0gICAgICAgIC8vIGlmIGZyb21DYWNoZSBpcyB0cnVlLCB0aGUgZGV2aWNlIGlzIHJldHVybmVkIGZyb20gbURldmljZUZvclN0cmF0ZWd5W10sCi0gICAgICAgIC8vIG90aGVyd2lzZSBpdCBpcyBkZXRlcm1pbmUgYnkgY3VycmVudCBzdGF0ZQotICAgICAgICAvLyAoZGV2aWNlIGNvbm5lY3RlZCxwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLCBhMmRwIG91dHB1dC4uLikKLSAgICAgICAgLy8gVGhpcyBhbGxvd3MgdG86Ci0gICAgICAgIC8vICAxIHNwZWVkIHVwIHByb2Nlc3Mgd2hlbiB0aGUgc3RhdGUgaXMgc3RhYmxlICh3aGVuIHN0YXJ0aW5nIG9yIHN0b3BwaW5nIGFuIG91dHB1dCkKLSAgICAgICAgLy8gIDIgYWNjZXNzIHRvIGVpdGhlciBjdXJyZW50IGRldmljZSBzZWxlY3Rpb24gKGZyb21DYWNoZSA9PSB0cnVlKSBvcgotICAgICAgICAvLyAiZnV0dXJlIiBkZXZpY2Ugc2VsZWN0aW9uIChmcm9tQ2FjaGUgPT0gZmFsc2UpIHdoZW4gY2FsbGVkIGZyb20gYSBjb250ZXh0Ci0gICAgICAgIC8vICB3aGVyZSBjb25kaXRpb25zIGFyZSBjaGFuZ2luZyAoc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCksIHNldFBob25lU3RhdGUoKS4uLikgQU5ECi0gICAgICAgIC8vICBiZWZvcmUgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKSBpcyBjYWxsZWQuCi0gICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKTsKLQotICAgICAgICAvLyBjaGFuZ2UgdGhlIHJvdXRlIG9mIHRoZSBzcGVjaWZpZWQgb3V0cHV0LiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbXMgd2UgaGF2ZSBzbGVwdCB0bwotICAgICAgICAvLyBhbGxvdyBuZXcgcm91dGluZyB0byB0YWtlIGVmZmVjdCBpbiBjZXJ0YWluIGNhc2VzLgotICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IHNldE91dHB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhZGRyZXNzID0gTlVMTCk7Ci0gICAgICAgIHN0YXR1c190IHJlc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUgPSBOVUxMKTsKLSAgICAgICAgc3RhdHVzX3Qgc2V0SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCk7Ci0gICAgICAgIHN0YXR1c190IHJlc2V0SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCk7Ci0KLSAgICAgICAgLy8gc2VsZWN0IGlucHV0IGRldmljZSBjb3JyZXNwb25kaW5nIHRvIHJlcXVlc3RlZCBhdWRpbyBzb3VyY2UKLSAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpOwotCi0gICAgICAgIC8vIHJldHVybiBpbyBoYW5kbGUgb2YgYWN0aXZlIGlucHV0IG9yIDAgaWYgbm8gaW5wdXQgaXMgYWN0aXZlCi0gICAgICAgIC8vICAgIE9ubHkgY29uc2lkZXJzIGlucHV0cyBmcm9tIHBoeXNpY2FsIGRldmljZXMgKGUuZy4gbWFpbiBtaWMsIGhlYWRzZXQgbWljKSB3aGVuCi0gICAgICAgIC8vICAgIGlnbm9yZVZpcnR1YWxJbnB1dHMgaXMgdHJ1ZS4KLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0QWN0aXZlSW5wdXQoYm9vbCBpZ25vcmVWaXJ0dWFsSW5wdXRzID0gdHJ1ZSk7Ci0KLSAgICAgICAgdWludDMyX3QgYWN0aXZlSW5wdXRzQ291bnQoKSBjb25zdDsKLQotICAgICAgICAvLyBpbml0aWFsaXplIHZvbHVtZSBjdXJ2ZXMgZm9yIGVhY2ggc3RyYXRlZ3kgYW5kIGRldmljZSBjYXRlZ29yeQotICAgICAgICB2b2lkIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoKTsKLQotICAgICAgICAvLyBjb21wdXRlIHRoZSBhY3R1YWwgdm9sdW1lIGZvciBhIGdpdmVuIHN0cmVhbSBhY2NvcmRpbmcgdG8gdGhlIHJlcXVlc3RlZCBpbmRleCBhbmQgYSBwYXJ0aWN1bGFyCi0gICAgICAgIC8vIGRldmljZQotICAgICAgICB2aXJ0dWFsIGZsb2F0IGNvbXB1dGVWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgYXVkaW9fZGV2aWNlc190IGRldmljZSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgdGhhdCB2b2x1bWUgY2hhbmdlIGlzIHBlcm1pdHRlZCwgY29tcHV0ZSBhbmQgc2VuZCBuZXcgdm9sdW1lIHRvIGF1ZGlvIGhhcmR3YXJlCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2hlY2tBbmRTZXRWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsIGJvb2wgZm9yY2UgPSBmYWxzZSk7Ci0KLSAgICAgICAgLy8gYXBwbHkgYWxsIHN0cmVhbSB2b2x1bWVzIHRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IGFuZCBkZXZpY2UKLSAgICAgICAgdm9pZCBhcHBseVN0cmVhbVZvbHVtZXMoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgZGVsYXlNcyA9IDAsIGJvb2wgZm9yY2UgPSBmYWxzZSk7Ci0KLSAgICAgICAgLy8gTXV0ZSBvciB1bm11dGUgYWxsIHN0cmVhbXMgaGFuZGxlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmF0ZWd5IG9uIHRoZSBzcGVjaWZpZWQgb3V0cHV0Ci0gICAgICAgIHZvaWQgc2V0U3RyYXRlZ3lNdXRlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkwKTsKLQotICAgICAgICAvLyBNdXRlIG9yIHVubXV0ZSB0aGUgc3RyZWFtIG9uIHRoZSBzcGVjaWZpZWQgb3V0cHV0Ci0gICAgICAgIHZvaWQgc2V0U3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkwKTsKLQotICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlcyBmb3Igc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHdoaWxlIGluIGNhbGw6IG11dGUgc3RyZWFtcyBvciByZXBsYWNlIGJ5Ci0gICAgICAgIC8vIGEgc3BlY2lhbCB0b25lIGluIHRoZSBkZXZpY2UgdXNlZCBmb3IgY29tbXVuaWNhdGlvbgotICAgICAgICB2b2lkIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBzdGFydGluZywgYm9vbCBzdGF0ZUNoYW5nZSk7Ci0KLSAgICAgICAgLy8gdHJ1ZSBpZiBkZXZpY2UgaXMgaW4gYSB0ZWxlcGhvbnkgb3IgVm9JUCBjYWxsCi0gICAgICAgIHZpcnR1YWwgYm9vbCBpc0luQ2FsbCgpOwotCi0gICAgICAgIC8vIHRydWUgaWYgZ2l2ZW4gc3RhdGUgcmVwcmVzZW50cyBhIGRldmljZSBpbiBhIHRlbGVwaG9ueSBvciBWb0lQIGNhbGwKLSAgICAgICAgdmlydHVhbCBib29sIGlzU3RhdGVJbkNhbGwoaW50IHN0YXRlKTsKLQotICAgICAgICAvLyB3aGVuIGEgZGV2aWNlIGlzIGNvbm5lY3RlZCwgY2hlY2tzIGlmIGFuIG9wZW4gb3V0cHV0IGNhbiBiZSByb3V0ZWQKLSAgICAgICAgLy8gdG8gdGhpcyBkZXZpY2UuIElmIG5vbmUgaXMgb3BlbiwgdHJpZXMgdG8gb3BlbiBvbmUgb2YgdGhlIGF2YWlsYWJsZSBvdXRwdXRzLgotICAgICAgICAvLyBSZXR1cm5zIGFuIG91dHB1dCBzdWl0YWJsZSB0byB0aGlzIGRldmljZSBvciAwLgotICAgICAgICAvLyB3aGVuIGEgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCwgY2hlY2tzIGlmIGFuIG91dHB1dCBpcyBub3QgdXNlZCBhbnkgbW9yZSBhbmQKLSAgICAgICAgLy8gcmV0dXJucyBpdHMgaGFuZGxlIGlmIGFueS4KLSAgICAgICAgLy8gdHJhbnNmZXJzIHRoZSBhdWRpbyB0cmFja3MgYW5kIGVmZmVjdHMgZnJvbSBvbmUgb3V0cHV0IHRocmVhZCB0byBhbm90aGVyIGFjY29yZGluZ2x5LgotICAgICAgICBzdGF0dXNfdCBjaGVja091dHB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MpOwotCi0gICAgICAgIHN0YXR1c190IGNoZWNrSW5wdXRzRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgaW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MpOwotCi0gICAgICAgIC8vIGNsb3NlIGFuIG91dHB1dCBhbmQgaXRzIGNvbXBhbmlvbiBkdXBsaWNhdGluZyBvdXRwdXQuCi0gICAgICAgIHZvaWQgY2xvc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKLQotICAgICAgICAvLyBjbG9zZSBhbiBpbnB1dC4KLSAgICAgICAgdm9pZCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKLQotICAgICAgICAvLyBjaGVja3MgYW5kIGlmIG5lY2Vzc2FyeSBjaGFuZ2VzIG91dHB1dHMgdXNlZCBmb3IgYWxsIHN0cmF0ZWdpZXMuCi0gICAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBvdXRwdXQgY2hvaWNlIGZvciBhIGdpdmVuIHN0cmF0ZWd5Ci0gICAgICAgIC8vIGNoYW5nZXM6IGNvbm5lY3RlZCBkZXZpY2UsIHBob25lIHN0YXRlLCBmb3JjZSB1c2UuLi4KLSAgICAgICAgLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkKLSAgICAgICAgdm9pZCBjaGVja091dHB1dEZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpOwotCi0gICAgICAgIC8vIFNhbWUgYXMgY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIGJ1dCBmb3IgYSBhbGwgc3RyYXRlZ2llcyBpbiBvcmRlciBvZiBwcmlvcml0eQotICAgICAgICB2b2lkIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwotCi0gICAgICAgIC8vIG1hbmFnZXMgQTJEUCBvdXRwdXQgc3VzcGVuZC9yZXN0b3JlIGFjY29yZGluZyB0byBwaG9uZSBzdGF0ZSBhbmQgQlQgU0NPIHVzYWdlCi0gICAgICAgIHZvaWQgY2hlY2tBMmRwU3VzcGVuZCgpOwotCi0gICAgICAgIC8vIHJldHVybnMgdGhlIEEyRFAgb3V0cHV0IGhhbmRsZSBpZiBpdCBpcyBvcGVuIG9yIDAgb3RoZXJ3aXNlCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldEEyZHBPdXRwdXQoKTsKLQotICAgICAgICAvLyBzZWxlY3RzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGRldmljZSBvbiBvdXRwdXQgZm9yIGN1cnJlbnQgc3RhdGUKLSAgICAgICAgLy8gbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIGNvbmRpdGlvbiB0aGF0IGFmZmVjdHMgdGhlIGRldmljZSBjaG9pY2UgZm9yIGEgZ2l2ZW4gb3V0cHV0IGlzCi0gICAgICAgIC8vIGNoYW5nZWQ6IGNvbm5lY3RlZCBkZXZpY2UsIHBob25lIHN0YXRlLCBmb3JjZSB1c2UsIG91dHB1dCBzdGFydCwgb3V0cHV0IHN0b3AuLgotICAgICAgICAvLyBzZWUgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBmb3IgdGhlIHVzZSBvZiBmcm9tQ2FjaGUgcGFyYW1ldGVyCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXROZXdPdXRwdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBib29sIGZyb21DYWNoZSk7Ci0KLSAgICAgICAgLy8gdXBkYXRlcyBjYWNoZSBvZiBkZXZpY2UgdXNlZCBieSBhbGwgc3RyYXRlZ2llcyAobURldmljZUZvclN0cmF0ZWd5W10pCi0gICAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBkZXZpY2UgY2hvaWNlIGZvciBhIGdpdmVuIHN0cmF0ZWd5IGlzCi0gICAgICAgIC8vIGNoYW5nZWQ6IGNvbm5lY3RlZCBkZXZpY2UsIHBob25lIHN0YXRlLCBmb3JjZSB1c2UuLi4KLSAgICAgICAgLy8gY2FjaGVkIHZhbHVlcyBhcmUgdXNlZCBieSBnZXREZXZpY2VGb3JTdHJhdGVneSgpIGlmIHBhcmFtZXRlciBmcm9tQ2FjaGUgaXMgdHJ1ZS4KLSAgICAgICAgIC8vIE11c3QgYmUgY2FsbGVkIGFmdGVyIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpCi0gICAgICAgIHZvaWQgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKLQotICAgICAgICAvLyBzZWxlY3RzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGRldmljZSBvbiBpbnB1dCBmb3IgY3VycmVudCBzdGF0ZQotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0TmV3SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOwotCi0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0TWF4RWZmZWN0c0NwdUxvYWQoKTsKLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRNYXhFZmZlY3RzTWVtb3J5KCk7Ci0jaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKLSAgICAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBleGl0KCk7Ci0gICAgICAgIGludCB0ZXN0T3V0cHV0SW5kZXgoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKLSNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCi0KLSAgICAgICAgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiYgZWZmZWN0RGVzYywgYm9vbCBlbmFibGVkKTsKLQotICAgICAgICAvLyByZXR1cm5zIHRoZSBjYXRlZ29yeSB0aGUgZGV2aWNlIGJlbG9uZ3MgdG8gd2l0aCByZWdhcmQgdG8gdm9sdW1lIGN1cnZlIG1hbmFnZW1lbnQKLSAgICAgICAgc3RhdGljIGRldmljZV9jYXRlZ29yeSBnZXREZXZpY2VDYXRlZ29yeShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKLQotICAgICAgICAvLyBleHRyYWN0IG9uZSBkZXZpY2UgcmVsZXZhbnQgZm9yIHZvbHVtZSBjb250cm9sIGZyb20gbXVsdGlwbGUgZGV2aWNlIHNlbGVjdGlvbgotICAgICAgICBzdGF0aWMgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKLQotICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IGdldE91dHB1dHNGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiA+IG9wZW5PdXRwdXRzKTsKLSAgICAgICAgYm9vbCB2ZWN0b3JzRXF1YWwoU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0czEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0czIpOwotCi0gICAgICAgIC8vIG11dGUvdW5tdXRlIHN0cmF0ZWdpZXMgdXNpbmcgYW4gaW5jb21wYXRpYmxlIGRldmljZSBjb21iaW5hdGlvbgotICAgICAgICAvLyBpZiBtdXRpbmcsIHdhaXQgZm9yIHRoZSBhdWRpbyBpbiBwY20gYnVmZmVyIHRvIGJlIGRyYWluZWQgYmVmb3JlIHByb2NlZWRpbmcKLSAgICAgICAgLy8gaWYgdW5tdXRpbmcsIHVubXV0ZSBvbmx5IGFmdGVyIHRoZSBzcGVjaWZpZWQgZGVsYXkKLSAgICAgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1zIHdhaXRlZAotICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByZXZEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpOwotCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNlbGVjdE91dHB1dChjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpOwotICAgICAgICAvLyBzYW1wbGluZ1JhdGUgcGFyYW1ldGVyIGlzIGFuIGluL291dCBhbmQgc28gbWF5IGJlIG1vZGlmaWVkCi0gICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0SW5wdXRQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyk7Ci0gICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOwotCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNlbGVjdE91dHB1dEZvckVmZmVjdHMoY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyk7Ci0KLSAgICAgICAgYm9vbCBpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpOwotCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9QYXRjaD4mIHBhdGNoKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7Ci0KLSAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBnZXRPdXRwdXRGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7Ci0gICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBnZXRJbnB1dEZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdDsKLSAgICAgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZUZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdDsKLSAgICAgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZUZyb21OYW1lKGNvbnN0IGNoYXIgKm5hbWUpIGNvbnN0OwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKTsKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKTsKLQotICAgICAgICB2b2lkIHVwZGF0ZUNhbGxSb3V0aW5nKGF1ZGlvX2RldmljZXNfdCByeERldmljZSwgaW50IGRlbGF5TXMgPSAwKTsKLQotICAgICAgICAvLwotICAgICAgICAvLyBBdWRpbyBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlIHBhcnNpbmcgKGF1ZGlvX3BvbGljeS5jb25mKQotICAgICAgICAvLwotICAgICAgICBzdGF0aWMgdWludDMyX3Qgc3RyaW5nVG9FbnVtKGNvbnN0IHN0cnVjdCBTdHJpbmdUb0VudW0gKnRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqZW51bVRvU3RyaW5nKGNvbnN0IHN0cnVjdCBTdHJpbmdUb0VudW0gKnRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpOwotICAgICAgICBzdGF0aWMgYm9vbCBzdHJpbmdUb0Jvb2woY29uc3QgY2hhciAqdmFsdWUpOwotICAgICAgICBzdGF0aWMgdWludDMyX3QgcGFyc2VPdXRwdXRGbGFnTmFtZXMoY2hhciAqbmFtZSk7Ci0gICAgICAgIHN0YXRpYyB1aW50MzJfdCBwYXJzZUlucHV0RmxhZ05hbWVzKGNoYXIgKm5hbWUpOwotICAgICAgICBzdGF0aWMgYXVkaW9fZGV2aWNlc190IHBhcnNlRGV2aWNlTmFtZXMoY2hhciAqbmFtZSk7Ci0gICAgICAgIHZvaWQgbG9hZEh3TW9kdWxlKGNub2RlICpyb290KTsKLSAgICAgICAgdm9pZCBsb2FkSHdNb2R1bGVzKGNub2RlICpyb290KTsKLSAgICAgICAgdm9pZCBsb2FkR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSk7Ci0gICAgICAgIHN0YXR1c190IGxvYWRBdWRpb1BvbGljeUNvbmZpZyhjb25zdCBjaGFyICpwYXRoKTsKLSAgICAgICAgdm9pZCBkZWZhdWx0QXVkaW9Qb2xpY3lDb25maWcodm9pZCk7Ci0KLQotICAgICAgICB1aWRfdCBtVWlkQ2FjaGVkOwotICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqbXBDbGllbnRJbnRlcmZhY2U7ICAvLyBhdWRpbyBwb2xpY3kgY2xpZW50IGludGVyZmFjZQotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtUHJpbWFyeU91dHB1dDsgICAgICAgICAgICAgIC8vIHByaW1hcnkgb3V0cHV0IGhhbmRsZQotICAgICAgICAvLyBsaXN0IG9mIGRlc2NyaXB0b3JzIGZvciBvdXRwdXRzIGN1cnJlbnRseSBvcGVuZWQKLSAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+ID4gbU91dHB1dHM7Ci0gICAgICAgIC8vIGNvcHkgb2YgbU91dHB1dHMgYmVmb3JlIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIG9wZW5zIG5ldyBvdXRwdXRzCi0gICAgICAgIC8vIHJlc2V0IHRvIG1PdXRwdXRzIHdoZW4gdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKSBpcyBjYWxsZWQuCi0gICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiA+IG1QcmV2aW91c091dHB1dHM7Ci0gICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gbUlucHV0czsgICAgIC8vIGxpc3Qgb2YgaW5wdXQgZGVzY3JpcHRvcnMKLSAgICAgICAgRGV2aWNlVmVjdG9yICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlczsgLy8gYWxsIGF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlcwotICAgICAgICBEZXZpY2VWZWN0b3IgIG1BdmFpbGFibGVJbnB1dERldmljZXM7ICAvLyBhbGwgYXZhaWxhYmxlIGlucHV0IGRldmljZXMKLSAgICAgICAgaW50IG1QaG9uZVN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IHBob25lIHN0YXRlCi0gICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgbUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UXTsgICAvLyBjdXJyZW50IGZvcmNlZCB1c2UgY29uZmlndXJhdGlvbgotCi0gICAgICAgIFN0cmVhbURlc2NyaXB0b3IgbVN0cmVhbXNbQVVESU9fU1RSRUFNX0NOVF07ICAgICAgICAgICAvLyBzdHJlYW0gZGVzY3JpcHRvcnMgZm9yIHZvbHVtZSBjb250cm9sCi0gICAgICAgIGJvb2wgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGltaXQgcmluZ3RvbmUgdm9sdW1lIHRvIG11c2ljIHZvbHVtZSBpZiBoZWFkc2V0IGNvbm5lY3RlZAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgbURldmljZUZvclN0cmF0ZWd5W05VTV9TVFJBVEVHSUVTXTsKLSAgICAgICAgZmxvYXQgICBtTGFzdFZvaWNlVm9sdW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXN0IHZvaWNlIHZvbHVtZSB2YWx1ZSBzZW50IHRvIGF1ZGlvIEhBTAotCi0gICAgICAgIC8vIE1heGltdW0gQ1BVIGxvYWQgYWxsb2NhdGVkIHRvIGF1ZGlvIGVmZmVjdHMgaW4gMC4xIE1JUFMgKEFSTXY1VEUsIDAgV1MgbWVtb3J5KSB1bml0cwotICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX0VGRkVDVFNfQ1BVX0xPQUQgPSAxMDAwOwotICAgICAgICAvLyBNYXhpbXVtIG1lbW9yeSBhbGxvY2F0ZWQgdG8gYXVkaW8gZWZmZWN0cyBpbiBLQgotICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX0VGRkVDVFNfTUVNT1JZID0gNTEyOwotICAgICAgICB1aW50MzJfdCBtVG90YWxFZmZlY3RzQ3B1TG9hZDsgLy8gY3VycmVudCBDUFUgbG9hZCB1c2VkIGJ5IGVmZmVjdHMKLSAgICAgICAgdWludDMyX3QgbVRvdGFsRWZmZWN0c01lbW9yeTsgIC8vIGN1cnJlbnQgbWVtb3J5IHVzZWQgYnkgZWZmZWN0cwotICAgICAgICBLZXllZFZlY3RvcjxpbnQsIHNwPEVmZmVjdERlc2NyaXB0b3I+ID4gbUVmZmVjdHM7ICAvLyBsaXN0IG9mIHJlZ2lzdGVyZWQgYXVkaW8gZWZmZWN0cwotICAgICAgICBib29sICAgIG1BMmRwU3VzcGVuZGVkOyAgLy8gdHJ1ZSBpZiBBMkRQIG91dHB1dCBpcyBzdXNwZW5kZWQKLSAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbURlZmF1bHRPdXRwdXREZXZpY2U7IC8vIG91dHB1dCBkZXZpY2Ugc2VsZWN0ZWQgYnkgZGVmYXVsdCBhdCBib290IHRpbWUKLSAgICAgICAgYm9vbCBtU3BlYWtlckRyY0VuYWJsZWQ7Ly8gdHJ1ZSBvbiBkZXZpY2VzIHRoYXQgdXNlIERSQyBvbiB0aGUgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIgcGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBib29zdCBzb2Z0IHNvdW5kcywgdXNlZCB0byBhZGp1c3Qgdm9sdW1lIGN1cnZlcyBhY2NvcmRpbmdseQotCi0gICAgICAgIFZlY3RvciA8IHNwPEh3TW9kdWxlPiA+IG1Id01vZHVsZXM7Ci0gICAgICAgIHZvbGF0aWxlIGludDMyX3QgbU5leHRVbmlxdWVJZDsKLSAgICAgICAgdm9sYXRpbGUgaW50MzJfdCBtQXVkaW9Qb3J0R2VuZXJhdGlvbjsKLQotICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fcGF0Y2hfaGFuZGxlX3QsIHNwPEF1ZGlvUGF0Y2g+ID4gbUF1ZGlvUGF0Y2hlczsKLQotICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90LCBhdWRpb19pb19oYW5kbGVfdD4gbVNvdW5kVHJpZ2dlclNlc3Npb25zOwotCi0gICAgICAgIHNwPEF1ZGlvUGF0Y2g+IG1DYWxsVHhQYXRjaDsKLSAgICAgICAgc3A8QXVkaW9QYXRjaD4gbUNhbGxSeFBhdGNoOwotCi0gICAgICAgIC8vIGZvciBzdXBwb3J0aW5nICJiZWFjb24iIHN0cmVhbXMsIGkuZS4gc3RyZWFtcyB0aGF0IG9ubHkgcGxheSBvbiBzcGVha2VyLCBhbmQgbmV2ZXIKLSAgICAgICAgLy8gd2hlbiBzb21ldGhpbmcgb3RoZXIgdGhhbiBTVFJFQU1fVFRTIChhLmsuYS4gIlRyYW5zbWl0dGVkIFRocm91Z2ggU3BlYWtlciIpIGlzIHBsYXlpbmcKLSAgICAgICAgZW51bSB7Ci0gICAgICAgICAgICBTVEFSVElOR19PVVRQVVQsCi0gICAgICAgICAgICBTVEFSVElOR19CRUFDT04sCi0gICAgICAgICAgICBTVE9QUElOR19PVVRQVVQsCi0gICAgICAgICAgICBTVE9QUElOR19CRUFDT04KLSAgICAgICAgfTsKLSAgICAgICAgdWludDMyX3QgbUJlYWNvbk11dGVSZWZDb3VudDsgICAvLyByZWYgY291bnQgZm9yIHN0cmVhbSB0aGF0IHdvdWxkIG11dGUgYmVhY29uCi0gICAgICAgIHVpbnQzMl90IG1CZWFjb25QbGF5aW5nUmVmQ291bnQ7Ly8gcmVmIGNvdW50IGZvciB0aGUgcGxheWluZyBiZWFjb24gc3RyZWFtcwotICAgICAgICBib29sIG1CZWFjb25NdXRlZDsgICAgICAgICAgICAgIC8vIGhhcyBTVFJFQU1fVFRTIGJlZW4gbXV0ZWQKLQotICAgICAgICAvLyBjdXN0b20gbWl4IGVudHJ5IGluIG1Qb2xpY3lNaXhlcwotICAgICAgICBjbGFzcyBBdWRpb1BvbGljeU1peCA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgQXVkaW9Qb2xpY3lNaXgoKSB7fQotCi0gICAgICAgICAgICBBdWRpb01peCAgICBtTWl4OyAgICAgICAgICAgICAgICAgICAvLyBBdWRpbyBwb2xpY3kgbWl4IGRlc2NyaXB0b3IKLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbU91dHB1dDsgIC8vIENvcnJlc3BvbmRpbmcgb3V0cHV0IHN0cmVhbQotICAgICAgICB9OwotICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8U3RyaW5nOCwgc3A8QXVkaW9Qb2xpY3lNaXg+ID4gbVBvbGljeU1peGVzOyAvLyBsaXN0IG9mIHJlZ2lzdGVyZWQgbWl4ZXMKLQotCi0jaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKLSAgICAgICAgTXV0ZXggICBtTG9jazsKLSAgICAgICAgQ29uZGl0aW9uIG1XYWl0V29ya0NWOwotCi0gICAgICAgIGludCAgICAgICAgICAgICBtQ3VyT3V0cHV0OwotICAgICAgICBib29sICAgICAgICAgICAgbURpcmVjdE91dHB1dDsKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbVRlc3RPdXRwdXRzW05VTV9URVNUX09VVFBVVFNdOwotICAgICAgICBpbnQgICAgICAgICAgICAgbVRlc3RJbnB1dDsKLSAgICAgICAgdWludDMyX3QgICAgICAgIG1UZXN0RGV2aWNlOwotICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3RTYW1wbGluZ1JhdGU7Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdEZvcm1hdDsKLSAgICAgICAgdWludDMyX3QgICAgICAgIG1UZXN0Q2hhbm5lbHM7Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdExhdGVuY3lNczsKLSNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCi0gICAgICAgIHN0YXRpYyBmbG9hdCB2b2xJbmRleFRvQW1wbChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBTdHJlYW1EZXNjcmlwdG9yJiBzdHJlYW1EZXNjLAotICAgICAgICAgICAgICAgIGludCBpbmRleEluVWkpOwotICAgICAgICBzdGF0aWMgYm9vbCBpc1ZpcnR1YWxJbnB1dERldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKLSAgICAgICAgdWludDMyX3QgbmV4dFVuaXF1ZUlkKCk7Ci0gICAgICAgIHVpbnQzMl90IG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci1wcml2YXRlOgotICAgICAgICAvLyB1cGRhdGVzIGRldmljZSBjYWNoaW5nIGFuZCBvdXRwdXQgZm9yIHN0cmVhbXMgdGhhdCBjYW4gaW5mbHVlbmNlIHRoZQotICAgICAgICAvLyAgICByb3V0aW5nIG9mIG5vdGlmaWNhdGlvbnMKLSAgICAgICAgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICAgICAgc3RhdGljIGJvb2wgZGV2aWNlRGlzdGluZ3Vpc2hlc09uQWRkcmVzcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKLSAgICAgICAgLy8gZmluZCB0aGUgb3V0cHV0cyBvbiBhIGdpdmVuIG91dHB1dCBkZXNjcmlwdG9yIHRoYXQgaGF2ZSB0aGUgZ2l2ZW4gYWRkcmVzcy4KLSAgICAgICAgLy8gdG8gYmUgY2FsbGVkIG9uIGFuIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciB3aG9zZSBzdXBwb3J0ZWQgZGV2aWNlcyAoYXMgZGVmaW5lZAotICAgICAgICAvLyAgIGluIG1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcykgbWF0Y2hlcyB0aGUgZGV2aWNlIHdob3NlIGFkZHJlc3MgaXMgdG8gYmUgbWF0Y2hlZC4KLSAgICAgICAgLy8gc2VlIGRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoYXVkaW9fZGV2aWNlc190KSBmb3Igd2hldGhlciB0aGUgZGV2aWNlIHR5cGUgaXMgb25lCi0gICAgICAgIC8vICAgd2hlcmUgYWRkcmVzc2VzIGFyZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gb25lIGNvbm5lY3RlZCBkZXZpY2UgYW5kIGFub3RoZXIuCi0gICAgICAgIHZvaWQgZmluZElvSGFuZGxlc0J5QWRkcmVzcyhzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgLyppbiovLAotICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgLyppbiovLAotICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcyAvKmluKi8sCi0gICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyAvKm91dCovKTsKLSAgICAgICAgdWludDMyX3QgY3VyQXVkaW9Qb3J0R2VuZXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1BdWRpb1BvcnRHZW5lcmF0aW9uOyB9Ci0gICAgICAgIC8vIGludGVybmFsIG1ldGhvZCB0byByZXR1cm4gdGhlIG91dHB1dCBoYW5kbGUgZm9yIHRoZSBnaXZlbiBkZXZpY2UgYW5kIGZvcm1hdAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JEZXZpY2UoCi0gICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyk7Ci0gICAgICAgIC8vIGludGVybmFsIGZ1bmN0aW9uIHRvIGRlcml2ZSBhIHN0cmVhbSB0eXBlIHZhbHVlIGZyb20gYXVkaW8gYXR0cmlidXRlcwotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpOwotICAgICAgICAvLyByZXR1cm4gdHJ1ZSBpZiBhbnkgb3V0cHV0IGlzIHBsYXlpbmcgYW55dGhpbmcgYmVzaWRlcyB0aGUgc3RyZWFtIHRvIGlnbm9yZQotICAgICAgICBib29sIGlzQW55T3V0cHV0QWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVG9JZ25vcmUpOwotICAgICAgICAvLyBldmVudCBpcyBvbmUgb2YgU1RBUlRJTkdfT1VUUFVULCBTVEFSVElOR19CRUFDT04sIFNUT1BQSU5HX09VVFBVVCwgU1RPUFBJTkdfQkVBQ09OCi0gICAgICAgIC8vIHJldHVybnMgMCBpZiBubyBtdXRlL3VubXV0ZSBldmVudCBoYXBwZW5lZCwgdGhlIGxhcmdlc3QgbGF0ZW5jeSBvZiB0aGUgZGV2aWNlIHdoZXJlCi0gICAgICAgIC8vICAgdGhlIG11dGUvdW5tdXRlIGhhcHBlbmVkCi0gICAgICAgIHVpbnQzMl90IGhhbmRsZUV2ZW50Rm9yQmVhY29uKGludCBldmVudCk7Ci0gICAgICAgIHVpbnQzMl90IHNldEJlYWNvbk11dGUoYm9vbCBtdXRlKTsKLSAgICAgICAgYm9vbCAgICAgaXNWYWxpZEF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICpwYWEpOwotCi0gICAgICAgIC8vIHNlbGVjdCBpbnB1dCBkZXZpY2UgY29ycmVzcG9uZGluZyB0byByZXF1ZXN0ZWQgYXVkaW8gc291cmNlIGFuZCByZXR1cm4gYXNzb2NpYXRlZCBwb2xpY3kKLSAgICAgICAgLy8gbWl4IGlmIGFueS4gQ2FsbHMgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoKS4KLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCAqKnBvbGljeU1peCA9IE5VTEwpOwotCi0gICAgICAgIC8vIENhbGxlZCBieSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKS4KLSAgICAgICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKLSAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gIGdldERldmljZURlc2NyaXB0b3IoY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwotCi19OwotCi19OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2NlOGUzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQubWsKQEAgLTAsMCArMSw5IEBACisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBSZWN1cnNpdmUgY2FsbCBzdWItZm9sZGVyIEFuZHJvaWQubWsKKyMKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvUm91dGluZ1N0cmF0ZWd5LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Sb3V0aW5nU3RyYXRlZ3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzg5NjdlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvUm91dGluZ1N0cmF0ZWd5LmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIG1lZGlhIHN0b3BwZWQgcGxheWluZyBkdXJpbmcgd2hpY2ggd2UgY29uc2lkZXIgdGhhdCB0aGUKKy8vIHNvbmlmaWNhdGlvbiBzaG91bGQgYmUgYXMgdW5vYnRydXNpdmUgYXMgZHVyaW5nIHRoZSB0aW1lIG1lZGlhIHdhcyBwbGF5aW5nLgorI2RlZmluZSBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSA1MDAwCisKK2VudW0gcm91dGluZ19zdHJhdGVneSB7CisgICAgU1RSQVRFR1lfTUVESUEsCisgICAgU1RSQVRFR1lfUEhPTkUsCisgICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OLAorICAgIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMLAorICAgIFNUUkFURUdZX0RUTUYsCisgICAgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwKKyAgICBTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIsCisgICAgU1RSQVRFR1lfQUNDRVNTSUJJTElUWSwKKyAgICBTVFJBVEVHWV9SRVJPVVRJTkcsCisgICAgTlVNX1NUUkFURUdJRVMKK307CisKK307IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1ZvbHVtZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzEyZjdhNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1ZvbHVtZS5oCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKy8vIEFic29sdXRlIG1pbiB2b2x1bWUgaW4gZEIgKGNhbiBiZSByZXByZXNlbnRlZCBpbiBzaW5nbGUgcHJlY2lzaW9uIG5vcm1hbCBmbG9hdCB2YWx1ZSkKKyNkZWZpbmUgVk9MVU1FX01JTl9EQiAoLTc1OCkKKworY2xhc3MgVm9sdW1lQ3VydmVQb2ludAoreworcHVibGljOgorICAgIGludCBtSW5kZXg7CisgICAgZmxvYXQgbURCQXR0ZW51YXRpb247Cit9OworCitjbGFzcyBWb2x1bWUKK3sKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiA0IHBvaW50cyB0byBkZWZpbmUgdGhlIHZvbHVtZSBhdHRlbnVhdGlvbiBjdXJ2ZSwgZWFjaCBjaGFyYWN0ZXJpemVkIGJ5IHRoZSB2b2x1bWUKKyAgICAgKiBpbmRleCAoZnJvbSAwIHRvIDEwMCkgYXQgd2hpY2ggdGhleSBhcHBseSwgYW5kIHRoZSBhdHRlbnVhdGlvbiBpbiBkQiBhdCB0aGF0IGluZGV4LgorICAgICAqIHdlIHVzZSAxMDAgc3RlcHMgdG8gYXZvaWQgcm91bmRpbmcgZXJyb3JzIHdoZW4gY29tcHV0aW5nIHRoZSB2b2x1bWUgaW4gdm9sSW5kZXhUb0RiKCkKKyAgICAgKgorICAgICAqIEB0b2RvIHNoYWxsIGJlY29tZSBjb25maWd1cmFibGUKKyAgICAgKi8KKyAgICBlbnVtIHsKKyAgICAgICAgVk9MTUlOID0gMCwKKyAgICAgICAgVk9MS05FRTEgPSAxLAorICAgICAgICBWT0xLTkVFMiA9IDIsCisgICAgICAgIFZPTE1BWCA9IDMsCisKKyAgICAgICAgVk9MQ05UID0gNAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBkZXZpY2UgY2F0ZWdvcmllcyB1c2VkIGZvciB2b2x1bWUgY3VydmUgbWFuYWdlbWVudC4KKyAgICAgKi8KKyAgICBlbnVtIGRldmljZV9jYXRlZ29yeSB7CisgICAgICAgIERFVklDRV9DQVRFR09SWV9IRUFEU0VULAorICAgICAgICBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKKyAgICAgICAgREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFLAorICAgICAgICBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBLAorICAgICAgICBERVZJQ0VfQ0FURUdPUllfQ05UCisgICAgfTsKKworICAgIC8qKgorICAgICAqIGV4dHJhY3Qgb25lIGRldmljZSByZWxldmFudCBmb3Igdm9sdW1lIGNvbnRyb2wgZnJvbSBtdWx0aXBsZSBkZXZpY2Ugc2VsZWN0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGRldmljZSBmb3Igd2hpY2ggdGhlIHZvbHVtZSBjYXRlZ29yeSBpcyBhc3NvY2lhdGVkCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHN1YnNldCBvZiBkZXZpY2UgcmVxdWlyZWQgdG8gbGltaXQgdGhlIG51bWJlciBvZiB2b2x1bWUgY2F0ZWdvcnkgcGVyIGRldmljZQorICAgICAqLworICAgIHN0YXRpYyBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yVm9sdW1lKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCisgICAgeworICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAvLyB0aGlzIGhhcHBlbnMgd2hlbiBmb3JjaW5nIGEgcm91dGUgdXBkYXRlIGFuZCBubyB0cmFjayBpcyBhY3RpdmUgb24gYW4gb3V0cHV0LgorICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHRoZSByZXR1cm5lZCBjYXRlZ29yeSBpcyBub3QgaW1wb3J0YW50LgorICAgICAgICAgICAgZGV2aWNlID0gIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgfSBlbHNlIGlmIChwb3Bjb3VudChkZXZpY2UpID4gMSkgeworICAgICAgICAgICAgLy8gTXVsdGlwbGUgZGV2aWNlIHNlbGVjdGlvbiBpcyBlaXRoZXI6CisgICAgICAgICAgICAvLyAgLSBzcGVha2VyICsgb25lIG90aGVyIGRldmljZTogZ2l2ZSBwcmlvcml0eSB0byBzcGVha2VyIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgIC8vICAtIG9uZSBBMkRQIGRldmljZSArIGFub3RoZXIgZGV2aWNlOiBoYXBwZW5zIHdpdGggZHVwbGljYXRlZCBvdXRwdXQuIEluIHRoaXMgY2FzZQorICAgICAgICAgICAgLy8gcmV0YWluIHRoZSBkZXZpY2Ugb24gdGhlIEEyRFAgb3V0cHV0IGFzIHRoZSBvdGhlciBtdXN0IG5vdCBjb3JyZXNwb25kIHRvIGFuIGFjdGl2ZQorICAgICAgICAgICAgLy8gc2VsZWN0aW9uIGlmIG5vdCB0aGUgc3BlYWtlci4KKyAgICAgICAgICAgIC8vICAtIEhETUktQ0VDIHN5c3RlbSBhdWRpbyBtb2RlIG9ubHkgb3V0cHV0OiBnaXZlIHByaW9yaXR5IHRvIGF2YWlsYWJsZSBpdGVtIGluIG9yZGVyLgorICAgICAgICAgICAgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgeworICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQykgeworICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0xJTkUpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FOworICAgICAgICAgICAgfSBlbHNlIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1NQRElGKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUERJRjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKlNQRUFLRVJfU0FGRSBpcyBhbiBhbGlhcyBvZiBTUEVBS0VSIGZvciBwdXJwb3NlcyBvZiB2b2x1bWUgY29udHJvbCovCisgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpCisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisKKyAgICAgICAgQUxPR1dfSUYocG9wY291bnQoZGV2aWNlKSAhPSAxLAorICAgICAgICAgICAgICAgICAiZ2V0RGV2aWNlRm9yVm9sdW1lKCkgaW52YWxpZCBkZXZpY2UgY29tYmluYXRpb246ICUwOHgiLAorICAgICAgICAgICAgICAgICBkZXZpY2UpOworCisgICAgICAgIHJldHVybiBkZXZpY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogcmV0dXJucyB0aGUgY2F0ZWdvcnkgdGhlIGRldmljZSBiZWxvbmdzIHRvIHdpdGggcmVnYXJkIHRvIHZvbHVtZSBjdXJ2ZSBtYW5hZ2VtZW50CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGRldmljZSB0byBjaGVjayB1cG9uIHRoZSBjYXRlZ29yeSB0byB3aG9tIGl0IGJlbG9uZ3MgdG8uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGRldmljZSBjYXRlZ29yeS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZGV2aWNlX2NhdGVnb3J5IGdldERldmljZUNhdGVnb3J5KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCisgICAgeworICAgICAgICBzd2l0Y2goZ2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSkpIHsKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFOgorICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRTsKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQ6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOgorICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9IRUFEU0VUOworICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfTElORToKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMOgorICAgICAgICAgICAgLypVU0I/ICBSZW1vdGUgc3VibWl4PyovCisgICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQTsKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVDoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZOgorICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRToKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgaW5saW5lIGZsb2F0IERiVG9BbXBsKGZsb2F0IGRlY2liZWxzKQorICAgIHsKKyAgICAgICAgaWYgKGRlY2liZWxzIDw9IFZPTFVNRV9NSU5fREIpIHsKKyAgICAgICAgICAgIHJldHVybiAwLjBmOworICAgICAgICB9CisgICAgICAgIHJldHVybiBleHAoIGRlY2liZWxzICogMC4xMTUxMjlmKTsgLy8gZXhwKCBkQiAqIGxuKDEwKSAvIDIwICkKKyAgICB9CisKKyAgICBzdGF0aWMgaW5saW5lIGZsb2F0IEFtcGxUb0RiKGZsb2F0IGFtcGxpZmljYXRpb24pCisgICAgeworICAgICAgICBpZiAoYW1wbGlmaWNhdGlvbiA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gVk9MVU1FX01JTl9EQjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMjAgKiBsb2cxMChhbXBsaWZpY2F0aW9uKTsKKyAgICB9CisKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL3BvbGljeS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRiNzNlM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworLy8gRm9yIG1peGVkIG91dHB1dCBhbmQgaW5wdXRzLCB0aGUgcG9saWN5IHdpbGwgdXNlIG1heCBtaXhlciBzYW1wbGluZyByYXRlcy4KKy8vIERvIG5vdCBsaW1pdCBzYW1wbGluZyByYXRlIG90aGVyd2lzZQorI2RlZmluZSBNQVhfTUlYRVJfU0FNUExJTkdfUkFURSAxOTIwMDAKKworLy8gRm9yIG1peGVkIG91dHB1dCBhbmQgaW5wdXRzLCB0aGUgcG9saWN5IHdpbGwgdXNlIG1heCBtaXhlciBjaGFubmVsIGNvdW50LgorLy8gRG8gbm90IGxpbWl0IGNoYW5uZWwgY291bnQgb3RoZXJ3aXNlCisjZGVmaW5lIE1BWF9NSVhFUl9DSEFOTkVMX0NPVU5UIDgKKworLyoqCisgKiBBIGRldmljZSBtYXNrIGZvciBhbGwgYXVkaW8gaW5wdXQgZGV2aWNlcyB0aGF0IGFyZSBjb25zaWRlcmVkICJ2aXJ0dWFsIiB3aGVuIGV2YWx1YXRpbmcKKyAqIGFjdGl2ZSBpbnB1dHMgaW4gZ2V0QWN0aXZlSW5wdXQoKQorICovCisjZGVmaW5lIEFQTV9BVURJT19JTl9ERVZJQ0VfVklSVFVBTF9BTEwgIChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWHxBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIpCisKKworLyoqCisgKiBBIGRldmljZSBtYXNrIGZvciBhbGwgYXVkaW8gaW5wdXQgYW5kIG91dHB1dCBkZXZpY2VzIHdoZXJlIG1hdGNoaW5nIGlucHV0cy9vdXRwdXRzIG9uIGRldmljZQorICogdHlwZSBhbG9uZSBpcyBub3QgZW5vdWdoOiB0aGUgYWRkcmVzcyBtdXN0IG1hdGNoIHRvbworICovCisjZGVmaW5lIEFQTV9BVURJT19ERVZJQ0VfT1VUX01BVENIX0FERFJFU1NfQUxMIChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpCisKKyNkZWZpbmUgQVBNX0FVRElPX0RFVklDRV9JTl9NQVRDSF9BRERSRVNTX0FMTCAoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpCisKKy8qKgorICogQ2hlY2sgaWYgdGhlIHN0YXRlIGdpdmVuIGNvcnJlc3BvbmQgdG8gYW4gaW4gY2FsbCBzdGF0ZS4KKyAqIEBUT0RPIGZpbmQgYSBiZXR0ZXIgbmFtZSBmb3Igd2lkZWx5IGNhbGwgc3RhdGUKKyAqCisgKiBAcGFyYW1baW5dIHN0YXRlIHRvIGNvbnNpZGVyCisgKgorICogQHJldHVybiB0cnVlIGlmIGdpdmVuIHN0YXRlIHJlcHJlc2VudHMgYSBkZXZpY2UgaW4gYSB0ZWxlcGhvbnkgb3IgVm9JUCBjYWxsCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19zdGF0ZV9pbl9jYWxsKGludCBzdGF0ZSkKK3sKKyAgICByZXR1cm4gKHN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgfHwgKHN0YXRlID09IEFVRElPX01PREVfSU5fQ09NTVVOSUNBVElPTik7Cit9CisKKy8qKgorICogQ2hlY2sgaWYgdGhlIGlucHV0IGRldmljZSBnaXZlbiBpcyBjb25zaWRlcmVkIGFzIGEgdmlydHVhbCBkZXZpY2UuCisgKgorICogQHBhcmFtW2luXSBkZXZpY2UgdG8gY29uc2lkZXIKKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRldmljZSBpcyBhIHZpcnR1YWwgb25lLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc192aXJ0dWFsX2lucHV0X2RldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmICgoZGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgeworICAgICAgICBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgICAgIGlmICgocG9wY291bnQoZGV2aWNlKSA9PSAxKSAmJiAoKGRldmljZSAmIH5BUE1fQVVESU9fSU5fREVWSUNFX1ZJUlRVQUxfQUxMKSA9PSAwKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogQ2hlY2sgd2hldGhlciB0aGUgZGV2aWNlIHR5cGUgaXMgb25lCisgKiB3aGVyZSBhZGRyZXNzZXMgYXJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBvbmUgY29ubmVjdGVkIGRldmljZSBhbmQgYW5vdGhlcgorICoKKyAqIEBwYXJhbVtpbl0gZGV2aWNlIHRvIGNvbnNpZGVyCisgKgorICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2UgbmVlZHMgZGlzdGluZ3Vpc2ggb24gYWRkcmVzcywgZmFsc2Ugb3RoZXJ3aXNlLi4KKyAqLworc3RhdGljIGlubGluZSBib29sIGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICByZXR1cm4gKCgoZGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgJiYKKyAgICAgICAgICAgICgofkFVRElPX0RFVklDRV9CSVRfSU4gJiBkZXZpY2UgJiBBUE1fQVVESU9fREVWSUNFX0lOX01BVENIX0FERFJFU1NfQUxMKSAhPSAwKSkgfHwKKyAgICAgICAgICAgKCgoZGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgPT0gMCkgJiYKKyAgICAgICAgICAgICgoZGV2aWNlICYgQVBNX0FVRElPX0RFVklDRV9PVVRfTUFUQ0hfQUREUkVTU19BTEwpICE9IDApKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzI4ZmYzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzYgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICAgIHNyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcCBcCisgICAgc3JjL0F1ZGlvR2Fpbi5jcHAgXAorICAgIHNyYy9TdHJlYW1EZXNjcmlwdG9yLmNwcCBcCisgICAgc3JjL0h3TW9kdWxlLmNwcCBcCisgICAgc3JjL0lPUHJvZmlsZS5jcHAgXAorICAgIHNyYy9BdWRpb1BvcnQuY3BwIFwKKyAgICBzcmMvQXVkaW9Qb2xpY3lNaXguY3BwIFwKKyAgICBzcmMvQXVkaW9QYXRjaC5jcHAgXAorICAgIHNyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAgXAorICAgIHNyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwIFwKKyAgICBzcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAgXAorICAgIHNyYy9Db25maWdQYXJzaW5nVXRpbHMuY3BwIFwKKyAgICBzcmMvU291bmRUcmlnZ2VyU2Vzc2lvbi5jcHAgXAorICAgIHNyYy9TZXNzaW9uUm91dGUuY3BwIFwKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliY3V0aWxzIFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGlibG9nIFwKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5CisKK0xPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSBcCisgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvR2Fpbi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvR2Fpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZmJmOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9HYWluLmgKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEF1ZGlvR2FpbjogcHVibGljIFJlZkJhc2UKK3sKK3B1YmxpYzoKKyAgICBBdWRpb0dhaW4oaW50IGluZGV4LCBib29sIHVzZUluQ2hhbm5lbE1hc2spOworICAgIHZpcnR1YWwgfkF1ZGlvR2FpbigpIHt9CisKKyAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OworCisgICAgdm9pZCBnZXREZWZhdWx0Q29uZmlnKHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKTsKKyAgICBzdGF0dXNfdCBjaGVja0NvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZyk7CisgICAgaW50ICAgICAgICAgICAgICAgbUluZGV4OworICAgIHN0cnVjdCBhdWRpb19nYWluIG1HYWluOworICAgIGJvb2wgICAgICAgICAgICAgIG1Vc2VJbkNoYW5uZWxNYXNrOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThiY2ZkYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSU9Qcm9maWxlOworY2xhc3MgQXVkaW9NaXg7CisKKy8vIGRlc2NyaXB0b3IgZm9yIGF1ZGlvIGlucHV0cy4gVXNlZCB0byBtYWludGFpbiBjdXJyZW50IGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBvcGVuZWQgYXVkaW8gaW5wdXQKKy8vIGFuZCBrZWVwIHRyYWNrIG9mIHRoZSB1c2FnZSBvZiB0aGlzIGlucHV0LgorY2xhc3MgQXVkaW9JbnB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnRDb25maWcKK3sKK3B1YmxpYzoKKyAgICBBdWRpb0lucHV0RGVzY3JpcHRvcihjb25zdCBzcDxJT1Byb2ZpbGU+JiBwcm9maWxlKTsKKyAgICB2b2lkIHNldElvSGFuZGxlKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlKTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldElkKCkgY29uc3Q7CisgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGdldE1vZHVsZUhhbmRsZSgpIGNvbnN0OworCisgICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpOworCisgICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgICAgICAgbUlvSGFuZGxlOyAgICAgICAvLyBpbnB1dCBoYW5kbGUKKyAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICAgICAgICBtRGV2aWNlOyAgICAgICAgIC8vIGN1cnJlbnQgZGV2aWNlIHRoaXMgaW5wdXQgaXMgcm91dGVkIHRvCisgICAgQXVkaW9NaXggICAgICAgICAgICAgICAgICAgICAgKm1Qb2xpY3lNaXg7ICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQorICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgIG1QYXRjaEhhbmRsZTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICBtUmVmQ291bnQ7ICAgICAgIC8vIG51bWJlciBvZiBBdWRpb1JlY29yZCBjbGllbnRzIHVzaW5nCisgICAgLy8gdGhpcyBpbnB1dAorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgIG1PcGVuUmVmQ291bnQ7CisgICAgYXVkaW9fc291cmNlX3QgICAgICAgICAgICAgICAgbUlucHV0U291cmNlOyAgICAvLyBpbnB1dCBzb3VyY2Ugc2VsZWN0ZWQgYnkgYXBwbGljYXRpb24KKyAgICAvLyhtZWRpYXJlY29yZGVyLmgpCisgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiAgICAgICAgICAgbVByb2ZpbGU7ICAgICAgICAvLyBJL08gcHJvZmlsZSB0aGlzIG91dHB1dCBkZXJpdmVzIGZyb20KKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90PiBtU2Vzc2lvbnM7ICAgICAgIC8vIGF1ZGlvIHNlc3Npb25zIGF0dGFjaGVkIHRvIHRoaXMgaW5wdXQKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNTb3VuZFRyaWdnZXI7IC8vIHVzZWQgYnkgYSBzb3VuZHRyaWdnZXIgY2FwdHVyZQorCisgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgeyByZXR1cm4gbVByb2ZpbGU7IH0KKyAgICB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICAgICAgICBtSWQ7Cit9OworCitjbGFzcyBBdWRpb0lucHV0Q29sbGVjdGlvbiA6CisgICAgICAgIHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPgoreworcHVibGljOgorICAgIGJvb2wgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdDsKKworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBnZXRJbnB1dEZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdDsKKworICAgIHVpbnQzMl90IGFjdGl2ZUlucHV0c0NvdW50KCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiByZXR1cm4gaW8gaGFuZGxlIG9mIGFjdGl2ZSBpbnB1dCBvciAwIGlmIG5vIGlucHV0IGlzIGFjdGl2ZQorICAgICAqIE9ubHkgY29uc2lkZXJzIGlucHV0cyBmcm9tIHBoeXNpY2FsIGRldmljZXMgKGUuZy4gbWFpbiBtaWMsIGhlYWRzZXQgbWljKSB3aGVuCisgICAgICogaWdub3JlVmlydHVhbElucHV0cyBpcyB0cnVlLgorICAgICAqLworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldEFjdGl2ZUlucHV0KGJvb2wgaWdub3JlVmlydHVhbElucHV0cyA9IHRydWUpOworCisgICAgYXVkaW9fZGV2aWNlc190IGdldFN1cHBvcnRlZERldmljZXMoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdDsKKworICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKK307CisKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGY2MjJkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJBdWRpb1BvcnQuaCIKKyNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElPUHJvZmlsZTsKK2NsYXNzIEF1ZGlvTWl4OworY2xhc3MgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2U7CisKKy8vIGRlc2NyaXB0b3IgZm9yIGF1ZGlvIG91dHB1dHMuIFVzZWQgdG8gbWFpbnRhaW4gY3VycmVudCBjb25maWd1cmF0aW9uIG9mIGVhY2ggb3BlbmVkIGF1ZGlvIG91dHB1dAorLy8gYW5kIGtlZXAgdHJhY2sgb2YgdGhlIHVzYWdlIG9mIHRoaXMgb3V0cHV0IGJ5IGVhY2ggYXVkaW8gc3RyZWFtIHR5cGUuCitjbGFzcyBBdWRpb091dHB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnRDb25maWcKK3sKK3B1YmxpYzoKKyAgICBBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8QXVkaW9Qb3J0PiYgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CisgICAgdmlydHVhbCB+QXVkaW9PdXRwdXREZXNjcmlwdG9yKCkge30KKworICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKyAgICB2b2lkICAgICAgICBsb2coY29uc3QgY2hhciogaW5kZW50KTsKKworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0SWQoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgc2hhcmVzSHdNb2R1bGVXaXRoKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyk7CisgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3Qgc3VwcG9ydGVkRGV2aWNlcygpOworICAgIHZpcnR1YWwgYm9vbCBpc0R1cGxpY2F0ZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgdWludDMyX3QgbGF0ZW5jeSgpIHsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIGJvb2wgaXNGaXhlZFZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICB2aXJ0dWFsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3ViT3V0cHV0MSgpIHsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3ViT3V0cHV0MigpIHsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKTsKKyAgICB2aXJ0dWFsIHZvaWQgY2hhbmdlUmVmQ291bnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBkZWx0YSk7CisKKyAgICBib29sIGlzQWN0aXZlKHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisgICAgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgeyByZXR1cm4gbVBvcnQ7IH0KKyAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OworCisgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGdldE1vZHVsZUhhbmRsZSgpIGNvbnN0OworCisgICAgc3A8QXVkaW9Qb3J0PiAgICAgICBtUG9ydDsKKyAgICBhdWRpb19kZXZpY2VzX3QgbURldmljZTsgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBkZXZpY2UgdGhpcyBvdXRwdXQgaXMgcm91dGVkIHRvCisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlOworICAgIHVpbnQzMl90IG1SZWZDb3VudFtBVURJT19TVFJFQU1fQ05UXTsgLy8gbnVtYmVyIG9mIHN0cmVhbXMgb2YgZWFjaCB0eXBlIHVzaW5nIHRoaXMgb3V0cHV0CisgICAgbnNlY3NfdCBtU3RvcFRpbWVbQVVESU9fU1RSRUFNX0NOVF07CisgICAgZmxvYXQgbUN1clZvbHVtZVtBVURJT19TVFJFQU1fQ05UXTsgICAvLyBjdXJyZW50IHN0cmVhbSB2b2x1bWUgaW4gZEIKKyAgICBpbnQgbU11dGVDb3VudFtBVURJT19TVFJFQU1fQ05UXTsgICAgIC8vIG11dGUgcmVxdWVzdCBjb3VudGVyCisgICAgYm9vbCBtU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW05VTV9TVFJBVEVHSUVTXTsgLy8gc3RyYXRlZ2llcyBtdXRlZCBiZWNhdXNlIG9mIGluY29tcGF0aWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRldmljZSBzZWxlY3Rpb24uIFNlZSBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKCkKKyAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqbUNsaWVudEludGVyZmFjZTsKKworcHJvdGVjdGVkOgorICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbUlkOworfTsKKworLy8gQXVkaW8gb3V0cHV0IGRyaXZlbiBieSBhIHNvZnR3YXJlIG1peGVyIGluIGF1ZGlvIGZsaW5nZXIuCitjbGFzcyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcgoreworcHVibGljOgorICAgIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CisgICAgdmlydHVhbCB+U3dBdWRpb091dHB1dERlc2NyaXB0b3IoKSB7fQorCisgICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpOworCisgICAgdm9pZCBzZXRJb0hhbmRsZShhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSk7CisKKyAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgc2hhcmVzSHdNb2R1bGVXaXRoKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyk7CisgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3Qgc3VwcG9ydGVkRGV2aWNlcygpOworICAgIHZpcnR1YWwgdWludDMyX3QgbGF0ZW5jeSgpOworICAgIHZpcnR1YWwgYm9vbCBpc0R1cGxpY2F0ZWQoKSBjb25zdCB7IHJldHVybiAobU91dHB1dDEgIT0gTlVMTCAmJiBtT3V0cHV0MiAhPSBOVUxMKTsgfQorICAgIHZpcnR1YWwgYm9vbCBpc0ZpeGVkVm9sdW1lKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworICAgIHZpcnR1YWwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzdWJPdXRwdXQxKCkgeyByZXR1cm4gbU91dHB1dDE7IH0KKyAgICB2aXJ0dWFsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3ViT3V0cHV0MigpIHsgcmV0dXJuIG1PdXRwdXQyOyB9CisgICAgdmlydHVhbCB2b2lkIGNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgZGVsdGEpOworICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpOworCisgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OworCisgICAgY29uc3Qgc3A8SU9Qcm9maWxlPiBtUHJvZmlsZTsgICAgICAgICAgLy8gSS9PIHByb2ZpbGUgdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tCisgICAgYXVkaW9faW9faGFuZGxlX3QgbUlvSGFuZGxlOyAgICAgICAgICAgLy8gb3V0cHV0IGhhbmRsZQorICAgIHVpbnQzMl90IG1MYXRlbmN5OyAgICAgICAgICAgICAgICAgIC8vCisgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgbUZsYWdzOyAgIC8vCisgICAgQXVkaW9NaXggKm1Qb2xpY3lNaXg7ICAgICAgICAgICAgIC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5CisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1PdXRwdXQxOyAgICAvLyB1c2VkIGJ5IGR1cGxpY2F0ZWQgb3V0cHV0czogZmlyc3Qgb3V0cHV0CisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1PdXRwdXQyOyAgICAvLyB1c2VkIGJ5IGR1cGxpY2F0ZWQgb3V0cHV0czogc2Vjb25kIG91dHB1dAorICAgIHVpbnQzMl90IG1EaXJlY3RPcGVuQ291bnQ7IC8vIG51bWJlciBvZiBjbGllbnRzIHVzaW5nIHRoaXMgb3V0cHV0IChkaXJlY3Qgb3V0cHV0cyBvbmx5KQorICAgIHVpbnQzMl90IG1HbG9iYWxSZWZDb3VudDsgIC8vIG5vbi1zdHJlYW0tc3BlY2lmaWMgcmVmIGNvdW50Cit9OworCitjbGFzcyBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiA6CisgICAgICAgIHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gPgoreworcHVibGljOgorICAgIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiByZXR1cm4gd2hldGhlciBhIHN0cmVhbSBpcyBwbGF5aW5nIHJlbW90ZWx5LCBvdmVycmlkZSB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YKKyAgICAgKiBsb2NhbC9yZW1vdGUgcGxheWJhY2ssIHVzZWQgZm9yIGluc3RhbmNlIGJ5IG5vdGlmaWNhdGlvbiBtYW5hZ2VyIHRvIG5vdCBtYWtlCisgICAgICogbWVkaWEgcGxheWVycyBsb3NlIGF1ZGlvIGZvY3VzIHdoZW4gbm90IHBsYXlpbmcgbG9jYWxseQorICAgICAqIEZvciB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbiwgInJlbW90ZWx5IiBtZWFucyBwbGF5aW5nIGR1cmluZyBzY3JlZW4gbWlycm9yaW5nIHdoaWNoCisgICAgICogdXNlcyBhbiBvdXRwdXQgZm9yIHBsYXliYWNrIHdpdGggYSBub24tZW1wdHksIG5vbiAiMCIgYWRkcmVzcy4KKyAgICAgKi8KKyAgICBib29sIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiByZXR1cm5zIHRoZSBBMkRQIG91dHB1dCBoYW5kbGUgaWYgaXQgaXMgb3BlbiBvciAwIG90aGVyd2lzZQorICAgICAqLworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldEEyZHBPdXRwdXQoKSBjb25zdDsKKworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBnZXRPdXRwdXRGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7CisKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZ2V0UHJpbWFyeU91dHB1dCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogcmV0dXJuIHRydWUgaWYgYW55IG91dHB1dCBpcyBwbGF5aW5nIGFueXRoaW5nIGJlc2lkZXMgdGhlIHN0cmVhbSB0byBpZ25vcmUKKyAgICAgKi8KKyAgICBib29sIGlzQW55T3V0cHV0QWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVG9JZ25vcmUpIGNvbnN0OworCisgICAgYXVkaW9fZGV2aWNlc190IGdldFN1cHBvcnRlZERldmljZXMoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdDsKKworICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9QYXRjaC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODVmMjU3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBdWRpb1BhdGNoIDogcHVibGljIFJlZkJhc2UKK3sKK3B1YmxpYzoKKyAgICBBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsIHVpZF90IHVpZCk7CisKKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1IYW5kbGU7CisgICAgc3RydWN0IGF1ZGlvX3BhdGNoIG1QYXRjaDsKKyAgICB1aWRfdCBtVWlkOworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1BZlBhdGNoSGFuZGxlOworCitwcml2YXRlOgorICAgIHN0YXRpYyB2b2xhdGlsZSBpbnQzMl90IG1OZXh0VW5pcXVlSWQ7Cit9OworCitjbGFzcyBBdWRpb1BhdGNoQ29sbGVjdGlvbiA6IHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fcGF0Y2hfaGFuZGxlX3QsIHNwPEF1ZGlvUGF0Y2g+ID4KK3sKK3B1YmxpYzoKKyAgICBzdGF0dXNfdCBhZGRBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwgY29uc3Qgc3A8QXVkaW9QYXRjaD4mIHBhdGNoKTsKKworICAgIHN0YXR1c190IHJlbW92ZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKworICAgIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzKSBjb25zdDsKKworICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MWY0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaApAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOworCisvKioKKyAqIGN1c3RvbSBtaXggZW50cnkgaW4gbVBvbGljeU1peGVzCisgKi8KK2NsYXNzIEF1ZGlvUG9saWN5TWl4IDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIEF1ZGlvUG9saWN5TWl4KCkge30KKworICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmZ2V0T3V0cHV0KCkgY29uc3Q7CisKKyAgICB2b2lkIHNldE91dHB1dChzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJm91dHB1dCk7CisKKyAgICB2b2lkIGNsZWFyT3V0cHV0KCk7CisKKyAgICBhbmRyb2lkOjpBdWRpb01peCAqZ2V0TWl4KCk7CisKKyAgICB2b2lkIHNldE1peChBdWRpb01peCAmbWl4KTsKKworcHJpdmF0ZToKKyAgICBBdWRpb01peCAgICBtTWl4OyAgICAgICAgICAgICAgICAgICAvLyBBdWRpbyBwb2xpY3kgbWl4IGRlc2NyaXB0b3IKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbU91dHB1dDsgIC8vIENvcnJlc3BvbmRpbmcgb3V0cHV0IHN0cmVhbQorfTsKKworCitjbGFzcyBBdWRpb1BvbGljeU1peENvbGxlY3Rpb24gOiBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPFN0cmluZzgsIHNwPEF1ZGlvUG9saWN5TWl4PiA+Cit7CitwdWJsaWM6CisgICAgc3RhdHVzX3QgZ2V0QXVkaW9Qb2xpY3lNaXgoU3RyaW5nOCBhZGRyZXNzLCBzcDxBdWRpb1BvbGljeU1peD4gJnBvbGljeU1peCkgY29uc3Q7CisKKyAgICBzdGF0dXNfdCByZWdpc3Rlck1peChTdHJpbmc4IGFkZHJlc3MsIEF1ZGlvTWl4IG1peCk7CisKKyAgICBzdGF0dXNfdCB1bnJlZ2lzdGVyTWl4KFN0cmluZzggYWRkcmVzcyk7CisKKyAgICB2b2lkIGNsb3NlT3V0cHV0KHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmZGVzYyk7CisKKyAgICAvKioKKyAgICAgKiBUcnkgdG8gZmluZCBhbiBvdXRwdXQgZGVzY3JpcHRvciBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGF0dHJpYnV0ZXMgdG8gY29uc2lkZXIgZm93ciB0aGUgcmVzZWFyY2ggb2Ygb3V0cHV0IGRlc2NyaXB0b3IuCisgICAgICogQHBhcmFtW291dF0gZGVzYyB0byByZXR1cm4gaWYgYW4gb3V0cHV0IGNvdWxkIGJlIGZvdW5kLgorICAgICAqCisgICAgICogQHJldHVybiBOT19FUlJPUiBpZiBhbiBvdXRwdXQgd2FzIGZvdW5kIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlIChpbiB0aGlzIGNhc2UsIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciBvdXRwdXQgcGFyYW0gaXMgaW5pdGlhbGl6ZWQpLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJmRlc2MpOworCisgICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlRGV2aWNlVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ICoqcG9saWN5TWl4KTsKKworICAgIHN0YXR1c190IGdldElucHV0TWl4Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciwgQXVkaW9NaXggKipwb2xpY3lNaXgpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmRmNWI0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9ydC5oCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBId01vZHVsZTsKK2NsYXNzIEF1ZGlvR2FpbjsKKworY2xhc3MgQXVkaW9Qb3J0IDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQoreworcHVibGljOgorICAgIEF1ZGlvUG9ydChjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAorICAgICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCByb2xlKTsKKyAgICB2aXJ0dWFsIH5BdWRpb1BvcnQoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIGF0dGFjaChjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSk7CisgICAgYm9vbCBpc0F0dGFjaGVkKCkgeyByZXR1cm4gbU1vZHVsZSAhPSAwOyB9CisKKyAgICBzdGF0aWMgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXROZXh0VW5pcXVlSWQoKTsKKworICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgaW1wb3J0QXVkaW9Qb3J0KGNvbnN0IHNwPEF1ZGlvUG9ydD4gcG9ydCk7CisgICAgdm9pZCBjbGVhckNhcGFiaWxpdGllcygpOworCisgICAgdm9pZCBsb2FkU2FtcGxpbmdSYXRlcyhjaGFyICpuYW1lKTsKKyAgICB2b2lkIGxvYWRGb3JtYXRzKGNoYXIgKm5hbWUpOworICAgIHZvaWQgbG9hZE91dENoYW5uZWxzKGNoYXIgKm5hbWUpOworICAgIHZvaWQgbG9hZEluQ2hhbm5lbHMoY2hhciAqbmFtZSk7CisKKyAgICBhdWRpb19nYWluX21vZGVfdCBsb2FkR2Fpbk1vZGUoY2hhciAqbmFtZSk7CisgICAgdm9pZCBsb2FkR2Fpbihjbm9kZSAqcm9vdCwgaW50IGluZGV4KTsKKyAgICB2aXJ0dWFsIHZvaWQgbG9hZEdhaW5zKGNub2RlICpyb290KTsKKworICAgIC8vIHNlYXJjaGVzIGZvciBhbiBleGFjdCBtYXRjaAorICAgIHN0YXR1c190IGNoZWNrRXhhY3RTYW1wbGluZ1JhdGUodWludDMyX3Qgc2FtcGxpbmdSYXRlKSBjb25zdDsKKyAgICAvLyBzZWFyY2hlcyBmb3IgYSBjb21wYXRpYmxlIG1hdGNoLCBhbmQgcmV0dXJucyB0aGUgYmVzdCBtYXRjaCB2aWEgdXBkYXRlZFNhbXBsaW5nUmF0ZQorICAgIHN0YXR1c190IGNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICB1aW50MzJfdCAqdXBkYXRlZFNhbXBsaW5nUmF0ZSkgY29uc3Q7CisgICAgLy8gc2VhcmNoZXMgZm9yIGFuIGV4YWN0IG1hdGNoCisgICAgc3RhdHVzX3QgY2hlY2tFeGFjdENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdDsKKyAgICAvLyBzZWFyY2hlcyBmb3IgYSBjb21wYXRpYmxlIG1hdGNoLCBjdXJyZW50bHkgaW1wbGVtZW50ZWQgZm9yIGlucHV0IGNoYW5uZWwgbWFza3Mgb25seQorICAgIHN0YXR1c190IGNoZWNrQ29tcGF0aWJsZUNoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnVwZGF0ZWRDaGFubmVsTWFzaykgY29uc3Q7CisKKyAgICBzdGF0dXNfdCBjaGVja0V4YWN0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7CisgICAgLy8gc2VhcmNoZXMgZm9yIGEgY29tcGF0aWJsZSBtYXRjaCwgY3VycmVudGx5IGltcGxlbWVudGVkIGZvciBpbnB1dCBmb3JtYXRzIG9ubHkKKyAgICBzdGF0dXNfdCBjaGVja0NvbXBhdGlibGVGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBhdWRpb19mb3JtYXRfdCAqdXBkYXRlZEZvcm1hdCkgY29uc3Q7CisgICAgc3RhdHVzX3QgY2hlY2tHYWluKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqZ2FpbkNvbmZpZywgaW50IGluZGV4KSBjb25zdDsKKworICAgIHVpbnQzMl90IHBpY2tTYW1wbGluZ1JhdGUoKSBjb25zdDsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBwaWNrQ2hhbm5lbE1hc2soKSBjb25zdDsKKyAgICBhdWRpb19mb3JtYXRfdCBwaWNrRm9ybWF0KCkgY29uc3Q7CisKKyAgICBzdGF0aWMgY29uc3QgYXVkaW9fZm9ybWF0X3Qgc1BjbUZvcm1hdENvbXBhcmVUYWJsZVtdOworICAgIHN0YXRpYyBpbnQgY29tcGFyZUZvcm1hdHMoY29uc3QgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdDEsIGNvbnN0IGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQyKSB7CisgICAgICAgIHJldHVybiBjb21wYXJlRm9ybWF0cygqZm9ybWF0MSwgKmZvcm1hdDIpOworICAgIH0KKyAgICBzdGF0aWMgaW50IGNvbXBhcmVGb3JtYXRzKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDEsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDIpOworCisgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGdldE1vZHVsZUhhbmRsZSgpIGNvbnN0OworICAgIHVpbnQzMl90IGdldE1vZHVsZVZlcnNpb24oKSBjb25zdDsKKyAgICBjb25zdCBjaGFyICpnZXRNb2R1bGVOYW1lKCkgY29uc3Q7CisKKyAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdDsKKyAgICB2b2lkIGxvZyhjb25zdCBjaGFyKiBpbmRlbnQpIGNvbnN0OworCisgICAgU3RyaW5nOCAgICAgICAgICAgbU5hbWU7CisgICAgYXVkaW9fcG9ydF90eXBlX3QgbVR5cGU7CisgICAgYXVkaW9fcG9ydF9yb2xlX3QgbVJvbGU7CisgICAgYm9vbCAgICAgICAgICAgICAgbVVzZUluQ2hhbm5lbE1hc2s7CisgICAgLy8gYnkgY29udmVudGlvbiwgIjAnIGluIHRoZSBmaXJzdCBlbnRyeSBpbiBtU2FtcGxpbmdSYXRlcywgbUNoYW5uZWxNYXNrcyBvciBtRm9ybWF0cworICAgIC8vIGluZGljYXRlcyB0aGUgc3VwcG9ydGVkIHBhcmFtZXRlcnMgc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgb3V0cHV0IHN0cmVhbQorICAgIC8vIGFmdGVyIGl0IGlzIG9wZW5lZCBmb3IgdGhlIGZpcnN0IHRpbWUKKyAgICBWZWN0b3IgPHVpbnQzMl90PiBtU2FtcGxpbmdSYXRlczsgLy8gc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzCisgICAgVmVjdG9yIDxhdWRpb19jaGFubmVsX21hc2tfdD4gbUNoYW5uZWxNYXNrczsgLy8gc3VwcG9ydGVkIGNoYW5uZWwgbWFza3MKKyAgICBWZWN0b3IgPGF1ZGlvX2Zvcm1hdF90PiBtRm9ybWF0czsgLy8gc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdHMKKyAgICBWZWN0b3IgPCBzcDxBdWRpb0dhaW4+ID4gbUdhaW5zOyAvLyBnYWluIGNvbnRyb2xsZXJzCisgICAgc3A8SHdNb2R1bGU+IG1Nb2R1bGU7ICAgICAgICAgICAgICAgICAvLyBhdWRpbyBIVyBtb2R1bGUgZXhwb3NpbmcgdGhpcyBJL08gc3RyZWFtCisgICAgdWludDMyX3QgbUZsYWdzOyAvLyBhdHRyaWJ1dGUgZmxhZ3MgKGUuZyBwcmltYXJ5IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdCBvdXRwdXQuLi4pLgorCitwcml2YXRlOgorICAgIHN0YXRpYyB2b2xhdGlsZSBpbnQzMl90IG1OZXh0VW5pcXVlSWQ7Cit9OworCitjbGFzcyBBdWRpb1BvcnRDb25maWcgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlCit7CitwdWJsaWM6CisgICAgQXVkaW9Qb3J0Q29uZmlnKCk7CisgICAgdmlydHVhbCB+QXVkaW9Qb3J0Q29uZmlnKCkge30KKworICAgIHN0YXR1c190IGFwcGx5QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpiYWNrdXBDb25maWcgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCisgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgPSAwOworICAgIHVpbnQzMl90IG1TYW1wbGluZ1JhdGU7CisgICAgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtQ2hhbm5lbE1hc2s7CisgICAgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnIG1HYWluOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Db25maWdQYXJzaW5nVXRpbHMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Db25maWdQYXJzaW5nVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGQyY2RmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NvbmZpZ1BhcnNpbmdVdGlscy5oCkBAIC0wLDAgKzEsMjc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlICJhdWRpb19wb2xpY3lfY29uZi5oIgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlZmluaXRpb25zIGZvciBhdWRpb19wb2xpY3kuY29uZiBmaWxlIHBhcnNpbmcKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IFN0cmluZ1RvRW51bSB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICB1aW50MzJfdCB2YWx1ZTsKK307CisKKy8vIFRPRE86IG1vdmUgdG8gYSBzZXBhcmF0ZSBmaWxlLiBTaG91bGQgYmUgaW4gc3luYyB3aXRoIGF1ZGlvLmguCisjZGVmaW5lIFNUUklOR19UT19FTlVNKHN0cmluZykgeyAjc3RyaW5nLCAodWludDMyX3Qpc3RyaW5nIH0gLy8gdWludDMyX3QgY2FzdCByZW1vdmVzIHdhcm5pbmcKKyNkZWZpbmUgTkFNRV9UT19FTlVNKG5hbWUsIHZhbHVlKSB7IG5hbWUsIHZhbHVlIH0KKyNpZm5kZWYgQVJSQVlfU0laRQorI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKKyNlbmRpZgorCitjb25zdCBTdHJpbmdUb0VudW0gc0RldmljZVR5cGVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0UpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQUxMX1NDTyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUwpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfSERNSSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0UpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9PVVRfQUxMX1VTQiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX09VVF9MSU5FKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX1NQRElGKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0ZNKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfT1VUX0lQKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQU1CSUVOVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQUxMX1NDTyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9BVVhfRElHSVRBTCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0hETUkpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fQU5MR19ET0NLX0hFQURTRVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9ER1RMX0RPQ0tfSEVBRFNFVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX1VTQl9BQ0NFU1NPUlkpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9UVl9UVU5FUiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0xJTkUpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9TUERJRiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19ERVZJQ0VfSU5fTE9PUEJBQ0spLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0RFVklDRV9JTl9JUCksCit9OworCitjb25zdCBTdHJpbmdUb0VudW0gc0RldmljZU5hbWVUb0VudW1UYWJsZVtdID0geworICAgIE5BTUVfVE9fRU5VTSgiRWFycGllY2UiLCBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKSwKKyAgICBOQU1FX1RPX0VOVU0oIlNwZWFrZXIiLCBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpLAorICAgIE5BTUVfVE9fRU5VTSgiU3BlYWtlciBQcm90ZWN0ZWQiLCBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSksCisgICAgTkFNRV9UT19FTlVNKCJXaXJlZCBIZWFkc2V0IiwgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUKSwKKyAgICBOQU1FX1RPX0VOVU0oIldpcmVkIEhlYWRwaG9uZXMiLCBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSksCisgICAgTkFNRV9UT19FTlVNKCJCVCBTQ08iLCBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08pLAorICAgIE5BTUVfVE9fRU5VTSgiQlQgU0NPIEhlYWRzZXQiLCBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVCksCisgICAgTkFNRV9UT19FTlVNKCJCVCBTQ08gQ2FyIEtpdCIsIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQpLAorICAgIE5BTUVfVE9fRU5VTSgiIiwgQVVESU9fREVWSUNFX09VVF9BTExfU0NPKSwKKyAgICBOQU1FX1RPX0VOVU0oIkJUIEEyRFAgT3V0IiwgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCksCisgICAgTkFNRV9UT19FTlVNKCJCVCBBMkRQIEhlYWRwaG9uZXMiLCBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMpLAorICAgIE5BTUVfVE9fRU5VTSgiQlQgQTJEUCBTcGVha2VyIiwgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSKSwKKyAgICBOQU1FX1RPX0VOVU0oIiIsIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApLAorICAgIE5BTUVfVE9fRU5VTSgiSERNSSBPdXQiLCBBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMKSwKKyAgICBOQU1FX1RPX0VOVU0oIkhETUkgT3V0IiwgQVVESU9fREVWSUNFX09VVF9IRE1JKSwKKyAgICBOQU1FX1RPX0VOVU0oIkFuYWxvZyBEb2NrIE91dCIsIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQpLAorICAgIE5BTUVfVE9fRU5VTSgiRGlnaXRhbCBEb2NrIE91dCIsIEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQpLAorICAgIE5BTUVfVE9fRU5VTSgiVVNCIEhvc3QgT3V0IiwgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZKSwKKyAgICBOQU1FX1RPX0VOVU0oIlVTQiBEZXZpY2UgT3V0IiwgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFKSwKKyAgICBOQU1FX1RPX0VOVU0oIiIsIEFVRElPX0RFVklDRV9PVVRfQUxMX1VTQiksCisgICAgTkFNRV9UT19FTlVNKCJSZXJvdXRlIFN1Ym1peCBPdXQiLCBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpLAorICAgIE5BTUVfVE9fRU5VTSgiVGVsZXBob255IFR4IiwgQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgpLAorICAgIE5BTUVfVE9fRU5VTSgiTGluZSBPdXQiLCBBVURJT19ERVZJQ0VfT1VUX0xJTkUpLAorICAgIE5BTUVfVE9fRU5VTSgiSERNSSBBUkMgT3V0IiwgQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQyksCisgICAgTkFNRV9UT19FTlVNKCJTL1BESUYgT3V0IiwgQVVESU9fREVWSUNFX09VVF9TUERJRiksCisgICAgTkFNRV9UT19FTlVNKCJGTSB0cmFuc2NlaXZlciBPdXQiLCBBVURJT19ERVZJQ0VfT1VUX0ZNKSwKKyAgICBOQU1FX1RPX0VOVU0oIkF1eCBMaW5lIE91dCIsIEFVRElPX0RFVklDRV9PVVRfQVVYX0xJTkUpLAorICAgIE5BTUVfVE9fRU5VTSgiSVAgT3V0IiwgQVVESU9fREVWSUNFX09VVF9JUCksCisgICAgTkFNRV9UT19FTlVNKCJBbWJpZW50IE1pYyIsIEFVRElPX0RFVklDRV9JTl9BTUJJRU5UKSwKKyAgICBOQU1FX1RPX0VOVU0oIkJ1aWx0LUluIE1pYyIsIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyksCisgICAgTkFNRV9UT19FTlVNKCJCVCBTQ08gSGVhZHNldCBNaWMiLCBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSwKKyAgICBOQU1FX1RPX0VOVU0oIiIsIEFVRElPX0RFVklDRV9JTl9BTExfU0NPKSwKKyAgICBOQU1FX1RPX0VOVU0oIldpcmVkIEhlYWRzZXQgTWljIiwgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQpLAorICAgIE5BTUVfVE9fRU5VTSgiSERNSSBJbiIsIEFVRElPX0RFVklDRV9JTl9BVVhfRElHSVRBTCksCisgICAgTkFNRV9UT19FTlVNKCJIRE1JIEluIiwgQVVESU9fREVWSUNFX0lOX0hETUkpLAorICAgIE5BTUVfVE9fRU5VTSgiVGVsZXBob255IFJ4IiwgQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCksCisgICAgTkFNRV9UT19FTlVNKCJUZWxlcGhvbnkgUngiLCBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCksCisgICAgTkFNRV9UT19FTlVNKCJCdWlsdC1JbiBCYWNrIE1pYyIsIEFVRElPX0RFVklDRV9JTl9CQUNLX01JQyksCisgICAgTkFNRV9UT19FTlVNKCJSZXJvdXRlIFN1Ym1peCBJbiIsIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSwKKyAgICBOQU1FX1RPX0VOVU0oIkFuYWxvZyBEb2NrIEluIiwgQVVESU9fREVWSUNFX0lOX0FOTEdfRE9DS19IRUFEU0VUKSwKKyAgICBOQU1FX1RPX0VOVU0oIkRpZ2l0YWwgRG9jayBJbiIsIEFVRElPX0RFVklDRV9JTl9ER1RMX0RPQ0tfSEVBRFNFVCksCisgICAgTkFNRV9UT19FTlVNKCJVU0IgSG9zdCBJbiIsIEFVRElPX0RFVklDRV9JTl9VU0JfQUNDRVNTT1JZKSwKKyAgICBOQU1FX1RPX0VOVU0oIlVTQiBEZXZpY2UgSW4iLCBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSksCisgICAgTkFNRV9UT19FTlVNKCJGTSBUdW5lciBJbiIsIEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUiksCisgICAgTkFNRV9UT19FTlVNKCJUViBUdW5lciBJbiIsIEFVRElPX0RFVklDRV9JTl9UVl9UVU5FUiksCisgICAgTkFNRV9UT19FTlVNKCJMaW5lIEluIiwgQVVESU9fREVWSUNFX0lOX0xJTkUpLAorICAgIE5BTUVfVE9fRU5VTSgiUy9QRElGIEluIiwgQVVESU9fREVWSUNFX0lOX1NQRElGKSwKKyAgICBOQU1FX1RPX0VOVU0oIkJUIEEyRFAgSW4iLCBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApLAorICAgIE5BTUVfVE9fRU5VTSgiTG9vcGJhY2sgSW4iLCBBVURJT19ERVZJQ0VfSU5fTE9PUEJBQ0spLAorICAgIE5BTUVfVE9fRU5VTSgiSVAgSW4iLCBBVURJT19ERVZJQ0VfSU5fSVApLAorfTsKKworY29uc3QgU3RyaW5nVG9FbnVtIHNPdXRwdXRGbGFnTmFtZVRvRW51bVRhYmxlW10gPSB7CisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19GQVNUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfTk9OX0JMT0NLSU5HKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19PVVRQVVRfRkxBR19UVFMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX09VVFBVVF9GTEFHX1JBVyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfU1lOQyksCit9OworCitjb25zdCBTdHJpbmdUb0VudW0gc0lucHV0RmxhZ05hbWVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX0lOUFVUX0ZMQUdfRkFTVCksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fSU5QVVRfRkxBR19IV19IT1RXT1JEKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19JTlBVVF9GTEFHX1JBVyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fSU5QVVRfRkxBR19TWU5DKSwKK307CisKK2NvbnN0IFN0cmluZ1RvRW51bSBzRm9ybWF0TmFtZVRvRW51bVRhYmxlW10gPSB7CisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzhfMjRfQklUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNX0ZMT0FUKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9NUDMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTUFJTiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FBQ19TU1IpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTFRQKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0hFX1YxKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX1NDQUxBQkxFKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfQUFDX0VSTEMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfSEVfVjIpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0ZPUk1BVF9BQUNfRUxEKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfVk9SQklTKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfSEVfQUFDX1YxKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfSEVfQUFDX1YyKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfT1BVUyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0FDMyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fRk9STUFUX0VfQUMzKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfRFRTKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19GT1JNQVRfRFRTX0hEKSwKK307CisKK2NvbnN0IFN0cmluZ1RvRW51bSBzT3V0Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGVbXSA9IHsKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF9NT05PKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1FVQUQpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEpLAorfTsKKworY29uc3QgU3RyaW5nVG9FbnVtIHNJbkNoYW5uZWxzTmFtZVRvRW51bVRhYmxlW10gPSB7CisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9NT05PKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX0lOX1NURVJFTyksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9CQUNLKSwKK307CisKK2NvbnN0IFN0cmluZ1RvRW51bSBzSW5kZXhDaGFubmVsc05hbWVUb0VudW1UYWJsZVtdID0geworICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMiksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS180KSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNSksCisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzYpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS183KSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19DSEFOTkVMX0lOREVYX01BU0tfOCksCit9OworCitjb25zdCBTdHJpbmdUb0VudW0gc0dhaW5Nb2RlTmFtZVRvRW51bVRhYmxlW10gPSB7CisgICAgU1RSSU5HX1RPX0VOVU0oQVVESU9fR0FJTl9NT0RFX0pPSU5UKSwKKyAgICBTVFJJTkdfVE9fRU5VTShBVURJT19HQUlOX01PREVfQ0hBTk5FTFMpLAorICAgIFNUUklOR19UT19FTlVNKEFVRElPX0dBSU5fTU9ERV9SQU1QKSwKK307CisKK2NsYXNzIENvbmZpZ1BhcnNpbmdVdGlscworeworcHVibGljOgorICAgIHN0YXRpYyB1aW50MzJfdCBzdHJpbmdUb0VudW0oY29uc3Qgc3RydWN0IFN0cmluZ1RvRW51bSAqdGFibGUsCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOworICAgIHN0YXRpYyBjb25zdCBjaGFyICplbnVtVG9TdHJpbmcoY29uc3Qgc3RydWN0IFN0cmluZ1RvRW51bSAqdGFibGUsCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKTsKKyAgICBzdGF0aWMgYm9vbCBzdHJpbmdUb0Jvb2woY29uc3QgY2hhciAqdmFsdWUpOworICAgIHN0YXRpYyB1aW50MzJfdCBwYXJzZU91dHB1dEZsYWdOYW1lcyhjaGFyICpuYW1lKTsKKyAgICBzdGF0aWMgdWludDMyX3QgcGFyc2VJbnB1dEZsYWdOYW1lcyhjaGFyICpuYW1lKTsKKyAgICBzdGF0aWMgYXVkaW9fZGV2aWNlc190IHBhcnNlRGV2aWNlTmFtZXMoY2hhciAqbmFtZSk7CisKKyAgICBzdGF0aWMgdm9pZCBsb2FkSHdNb2R1bGVzKGNub2RlICpyb290LCBId01vZHVsZUNvbGxlY3Rpb24gJmh3TW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlSW5wdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRlZmF1bHRPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmaXNTcGVha2VyRHJjRW5hYmxlZCk7CisKKyAgICBzdGF0aWMgdm9pZCBsb2FkR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlSW5wdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRlZmF1bHRPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmaXNTcGVha2VyRHJjRW5hYmxlZCk7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgbG9hZEF1ZGlvUG9saWN5Q29uZmlnKGNvbnN0IGNoYXIgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBId01vZHVsZUNvbGxlY3Rpb24gJmh3TW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlSW5wdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRlZmF1bHRPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmaXNTcGVha2VyRHJjRW5hYmxlZCk7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIHZvaWQgbG9hZEh3TW9kdWxlKGNub2RlICpyb290LCBId01vZHVsZUNvbGxlY3Rpb24gJmh3TW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVJbnB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRlZmF1bHRPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZpc1NwZWFrZXJEcmNFbmFibGVkKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDJlY2U2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaApAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJBdWRpb1BvcnQuaCIKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEZXZpY2VEZXNjcmlwdG9yIDogcHVibGljIEF1ZGlvUG9ydCwgcHVibGljIEF1ZGlvUG9ydENvbmZpZworeworcHVibGljOgorICAgIERldmljZURlc2NyaXB0b3IoYXVkaW9fZGV2aWNlc190IHR5cGUpOworCisgICAgdmlydHVhbCB+RGV2aWNlRGVzY3JpcHRvcigpIHt9CisKKyAgICBib29sIGVxdWFscyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgb3RoZXIpIGNvbnN0OworCisgICAgLy8gQXVkaW9Qb3J0Q29uZmlnCisgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0IHsgcmV0dXJuIChBdWRpb1BvcnQqKSB0aGlzOyB9CisgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKKworICAgIC8vIEF1ZGlvUG9ydAorICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpOworICAgIHZpcnR1YWwgdm9pZCBsb2FkR2FpbnMoY25vZGUgKnJvb3QpOworICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIGltcG9ydEF1ZGlvUG9ydChjb25zdCBzcDxBdWRpb1BvcnQ+IHBvcnQpOworCisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRJZCgpIGNvbnN0OworICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbURldmljZVR5cGU7IH0KKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKyAgICB2b2lkIGxvZygpIGNvbnN0OworCisgICAgU3RyaW5nOCBtVGFnOworICAgIFN0cmluZzggbUFkZHJlc3M7CisKK3ByaXZhdGU6CisgICAgYXVkaW9fZGV2aWNlc190ICAgICBtRGV2aWNlVHlwZTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1JZDsKKworZnJpZW5kIGNsYXNzIERldmljZVZlY3RvcjsKK307CisKK2NsYXNzIERldmljZVZlY3RvciA6IHB1YmxpYyBTb3J0ZWRWZWN0b3I8IHNwPERldmljZURlc2NyaXB0b3I+ID4KK3sKK3B1YmxpYzoKKyAgICBEZXZpY2VWZWN0b3IoKSA6IFNvcnRlZFZlY3RvcigpLCBtRGV2aWNlVHlwZXMoQVVESU9fREVWSUNFX05PTkUpIHt9CisKKyAgICBzc2l6ZV90IGFkZChjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSk7CisgICAgc3NpemVfdCByZW1vdmUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pOworICAgIHNzaXplX3QgaW5kZXhPZihjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkgY29uc3Q7CisKKyAgICBhdWRpb19kZXZpY2VzX3QgdHlwZXMoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZXM7IH0KKworICAgIHZvaWQgbG9hZERldmljZXNGcm9tVHlwZShhdWRpb19kZXZpY2VzX3QgdHlwZXMpOworICAgIHZvaWQgbG9hZERldmljZXNGcm9tVGFnKGNoYXIgKnRhZywgY29uc3QgRGV2aWNlVmVjdG9yJiBkZWNsYXJlZERldmljZXMpOworCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBTdHJpbmc4IGFkZHJlc3MpIGNvbnN0OworICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGVzKSBjb25zdDsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlRnJvbVRhZyhjb25zdCBTdHJpbmc4JiB0YWcpIGNvbnN0OworICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbVR5cGVBZGRyKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBTdHJpbmc4IGFkZHJlc3MpIGNvbnN0OworCisgICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGcm9tSHdNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSkgY29uc3Q7CisKKyAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZEZXNjKSBjb25zdDsKKworICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBTdHJpbmc4ICZkaXJlY3Rpb24pIGNvbnN0OworCitwcml2YXRlOgorICAgIHZvaWQgcmVmcmVzaFR5cGVzKCk7CisgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2VUeXBlczsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRWZmZWN0RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTc4M2ExCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpb19lZmZlY3QuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisKK2NsYXNzIEVmZmVjdERlc2NyaXB0b3IgOiBwdWJsaWMgUmVmQmFzZQoreworcHVibGljOgorICAgIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICAgIGludCBtSW87ICAgICAgICAgICAgICAgIC8vIGlvIHRoZSBlZmZlY3QgaXMgYXR0YWNoZWQgdG8KKyAgICByb3V0aW5nX3N0cmF0ZWd5IG1TdHJhdGVneTsgLy8gcm91dGluZyBzdHJhdGVneSB0aGUgZWZmZWN0IGlzIGFzc29jaWF0ZWQgdG8KKyAgICBpbnQgbVNlc3Npb247ICAgICAgICAgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiB0aGUgZWZmZWN0IGlzIG9uCisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBtRGVzYzsgIC8vIGVmZmVjdCBkZXNjcmlwdG9yCisgICAgYm9vbCBtRW5hYmxlZDsgICAgICAgICAgICAgIC8vIGVuYWJsZWQgc3RhdGU6IENQVSBsb2FkIGJlaW5nIHVzZWQgb3Igbm90Cit9OworCitjbGFzcyBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiA6IHB1YmxpYyBLZXllZFZlY3RvcjxpbnQsIHNwPEVmZmVjdERlc2NyaXB0b3I+ID4KK3sKK3B1YmxpYzoKKyAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbigpOworCisgICAgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgYXVkaW9faW9faGFuZGxlX3QgaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksIGludCBzZXNzaW9uLCBpbnQgaWQpOworICAgIHN0YXR1c190IHVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKTsKKyAgICBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKTsKKyAgICB1aW50MzJfdCBnZXRNYXhFZmZlY3RzQ3B1TG9hZCgpIGNvbnN0OworICAgIHVpbnQzMl90IGdldE1heEVmZmVjdHNNZW1vcnkoKSBjb25zdDsKKyAgICBib29sIGlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCk7CisKKyAgICBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKK3ByaXZhdGU6CisgICAgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiAmZWZmZWN0RGVzYywgYm9vbCBlbmFibGVkKTsKKworICAgIHVpbnQzMl90IG1Ub3RhbEVmZmVjdHNDcHVMb2FkOyAvLyBjdXJyZW50IENQVSBsb2FkIHVzZWQgYnkgZWZmZWN0cworICAgIHVpbnQzMl90IG1Ub3RhbEVmZmVjdHNNZW1vcnk7ICAvLyBjdXJyZW50IG1lbW9yeSB1c2VkIGJ5IGVmZmVjdHMKKworICAgIC8qKgorICAgICAqIE1heGltdW0gQ1BVIGxvYWQgYWxsb2NhdGVkIHRvIGF1ZGlvIGVmZmVjdHMgaW4gMC4xIE1JUFMgKEFSTXY1VEUsIDAgV1MgbWVtb3J5KSB1bml0cworICAgICAqLworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBNQVhfRUZGRUNUU19DUFVfTE9BRCA9IDEwMDA7CisgICAgLyoqCisgICAgICogTWF4aW11bSBtZW1vcnkgYWxsb2NhdGVkIHRvIGF1ZGlvIGVmZmVjdHMgaW4gS0IKKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX0VGRkVDVFNfTUVNT1JZID0gNTEyOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJjM2VhMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJT1Byb2ZpbGU7CisKK2NsYXNzIEh3TW9kdWxlIDogcHVibGljIFJlZkJhc2UKK3sKK3B1YmxpYzoKKyAgICBId01vZHVsZShjb25zdCBjaGFyICpuYW1lKTsKKyAgICB+SHdNb2R1bGUoKTsKKworICAgIHN0YXR1c190IGxvYWRPdXRwdXQoY25vZGUgKnJvb3QpOworICAgIHN0YXR1c190IGxvYWRJbnB1dChjbm9kZSAqcm9vdCk7CisgICAgc3RhdHVzX3QgbG9hZERldmljZShjbm9kZSAqcm9vdCk7CisKKyAgICBzdGF0dXNfdCBhZGRPdXRwdXRQcm9maWxlKFN0cmluZzggbmFtZSwgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIFN0cmluZzggYWRkcmVzcyk7CisgICAgc3RhdHVzX3QgcmVtb3ZlT3V0cHV0UHJvZmlsZShTdHJpbmc4IG5hbWUpOworICAgIHN0YXR1c190IGFkZElucHV0UHJvZmlsZShTdHJpbmc4IG5hbWUsIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBTdHJpbmc4IGFkZHJlc3MpOworICAgIHN0YXR1c190IHJlbW92ZUlucHV0UHJvZmlsZShTdHJpbmc4IG5hbWUpOworCisgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGdldEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1IYW5kbGU7IH0KKworICAgIHZvaWQgZHVtcChpbnQgZmQpOworCisgICAgY29uc3QgY2hhciAqY29uc3QgICAgICAgIG1OYW1lOyAvLyBiYXNlIG5hbWUgb2YgdGhlIGF1ZGlvIEhXIG1vZHVsZSAocHJpbWFyeSwgYTJkcCAuLi4pCisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgIG1IYWxWZXJzaW9uOyAvLyBhdWRpbyBIQUwgQVBJIHZlcnNpb24KKyAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgICAgbUhhbmRsZTsKKyAgICBWZWN0b3IgPCBzcDxJT1Byb2ZpbGU+ID4gbU91dHB1dFByb2ZpbGVzOyAvLyBvdXRwdXQgcHJvZmlsZXMgZXhwb3NlZCBieSB0aGlzIG1vZHVsZQorICAgIFZlY3RvciA8IHNwPElPUHJvZmlsZT4gPiBtSW5wdXRQcm9maWxlczsgIC8vIGlucHV0IHByb2ZpbGVzIGV4cG9zZWQgYnkgdGhpcyBtb2R1bGUKKyAgICBEZXZpY2VWZWN0b3IgICAgICAgICAgICAgbURlY2xhcmVkRGV2aWNlczsgLy8gZGV2aWNlcyBkZWNsYXJlZCBpbiBhdWRpb19wb2xpY3kuY29uZgorfTsKKworY2xhc3MgSHdNb2R1bGVDb2xsZWN0aW9uIDogcHVibGljIFZlY3Rvcjwgc3A8SHdNb2R1bGU+ID4KK3sKK3B1YmxpYzoKKyAgICBzcDxId01vZHVsZT4gZ2V0TW9kdWxlRnJvbU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3Q7CisKKyAgICBzcCA8SHdNb2R1bGU+IGdldE1vZHVsZUZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdDsKKworICAgIHNwPERldmljZURlc2NyaXB0b3I+ICBnZXREZXZpY2VEZXNjcmlwdG9yKGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpIGNvbnN0OworCisgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjZmY2MxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lPUHJvZmlsZS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgorI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSHdNb2R1bGU7CisKKy8vIHRoZSBJT1Byb2ZpbGUgY2xhc3MgZGVzY3JpYmVzIHRoZSBjYXBhYmlsaXRpZXMgb2YgYW4gb3V0cHV0IG9yIGlucHV0IHN0cmVhbS4KKy8vIEl0IGlzIGN1cnJlbnRseSBhc3N1bWVkIHRoYXQgYWxsIGNvbWJpbmF0aW9uIG9mIGxpc3RlZCBwYXJhbWV0ZXJzIGFyZSBzdXBwb3J0ZWQuCisvLyBJdCBpcyB1c2VkIGJ5IHRoZSBwb2xpY3kgbWFuYWdlciB0byBkZXRlcm1pbmUgaWYgYW4gb3V0cHV0IG9yIGlucHV0IGlzIHN1aXRhYmxlIGZvcgorLy8gYSBnaXZlbiB1c2UgY2FzZSwgIG9wZW4vY2xvc2UgaXQgYWNjb3JkaW5nbHkgYW5kIGNvbm5lY3QvZGlzY29ubmVjdCBhdWRpbyB0cmFja3MKKy8vIHRvL2Zyb20gaXQuCitjbGFzcyBJT1Byb2ZpbGUgOiBwdWJsaWMgQXVkaW9Qb3J0Cit7CitwdWJsaWM6CisgICAgSU9Qcm9maWxlKGNvbnN0IFN0cmluZzgmIG5hbWUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpOworICAgIHZpcnR1YWwgfklPUHJvZmlsZSgpOworCisgICAgLy8gVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgYm90aCBvdXRwdXQgYW5kIGlucHV0LgorICAgIC8vIElmIHBhcmFtZXRlciB1cGRhdGVkU2FtcGxpbmdSYXRlIGlzIG5vbi1OVUxMLCBpdCBpcyBhc3NpZ25lZCB0aGUgYWN0dWFsIHNhbXBsZSByYXRlLgorICAgIC8vIEZvciBpbnB1dCwgZmxhZ3MgaXMgaW50ZXJwcmV0ZWQgYXMgYXVkaW9faW5wdXRfZmxhZ3NfdC4KKyAgICAvLyBUT0RPOiBtZXJnZSBhdWRpb19vdXRwdXRfZmxhZ3NfdCBhbmQgYXVkaW9faW5wdXRfZmxhZ3NfdC4KKyAgICBib29sIGlzQ29tcGF0aWJsZVByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICp1cGRhdGVkU2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICp1cGRhdGVkRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnVwZGF0ZWRDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpIGNvbnN0OworCisgICAgdm9pZCBkdW1wKGludCBmZCk7CisgICAgdm9pZCBsb2coKTsKKworICAgIERldmljZVZlY3RvciAgbVN1cHBvcnRlZERldmljZXM7IC8vIHN1cHBvcnRlZCBkZXZpY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGRldmljZXMgdGhpcyBvdXRwdXQgY2FuIGJlIHJvdXRlZCB0bykKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2Vzc2lvblJvdXRlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2Vzc2lvblJvdXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmZWFmMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXNzaW9uUm91dGUuaApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGV2aWNlRGVzY3JpcHRvcjsKKworY2xhc3MgU2Vzc2lvblJvdXRlIDogcHVibGljIFJlZkJhc2UKK3sKK3B1YmxpYzoKKyAgICAvLyBGb3IgSW5wdXQgKFNvdXJjZSkgcm91dGVzLCB1c2UgU1RSRUFNX1RZUEVfTkEgKCJOQSIgPSAibm90IGFwcGxpY2FibGUpZm9yIHRoZQorICAgIC8vIHN0cmVhbVR5cGUgYXJndW1lbnQKKyAgICBzdGF0aWMgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCBTVFJFQU1fVFlQRV9OQSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworCisgICAgLy8gRm9yIE91dHB1dCAoU2luaykgcm91dGVzLCB1c2UgU09VUkNFX1RZUEVfTkEgKCJOQSIgPSAibm90IGFwcGxpY2FibGUiKSBmb3IgdGhlCisgICAgLy8gc291cmNlIGFyZ3VtZW50CisKKyAgICBzdGF0aWMgY29uc3QgYXVkaW9fc291cmNlX3QgU09VUkNFX1RZUEVfTkEgPSBBVURJT19TT1VSQ0VfREVGQVVMVDsKKworICAgIFNlc3Npb25Sb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKKyAgICAgICAgOiBtVWlkKHVpZCksCisgICAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksCisgICAgICAgICAgbURldmljZURlc2NyaXB0b3IoZGV2aWNlRGVzY3JpcHRvciksCisgICAgICAgICAgbVJlZkNvdW50KDApLAorICAgICAgICAgIG1BY3Rpdml0eUNvdW50KDApLAorICAgICAgICAgIG1DaGFuZ2VkKGZhbHNlKSwKKyAgICAgICAgICBtU3RyZWFtVHlwZShzdHJlYW1UeXBlKSwKKyAgICAgICAgICBtU291cmNlKHNvdXJjZSkKKyAgICB7fQorCisgICAgdm9pZCBsb2coY29uc3QgY2hhciogcHJlZml4KTsKKworICAgIGJvb2wgaXNBY3RpdmUoKSB7CisgICAgICAgIHJldHVybiAobURldmljZURlc2NyaXB0b3IgIT0gMCkgJiYgKG1DaGFuZ2VkIHx8IChtQWN0aXZpdHlDb3VudCA+IDApKTsKKyAgICB9CisKKyAgICB1aWRfdCAgICAgICAgICAgICAgICAgICAgICAgbVVpZDsKKyAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICAgICAgbVNlc3Npb247CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gICAgICAgIG1EZXZpY2VEZXNjcmlwdG9yOworCisgICAgLy8gInJlZmVyZW5jZSIgY291bnRpbmcKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbVJlZkNvdW50OyAgICAgIC8vICsvLSBvbiByZWZlcmVuY2VzCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1BY3Rpdml0eUNvdW50OyAvLyArLy0gb24gc3RhcnQvc3RvcAorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbmdlZDsKKyAgICAvLyBmb3Igb3V0cHV0cworICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgICBtU3RyZWFtVHlwZTsKKyAgICAvLyBmb3IgaW5wdXRzCisgICAgY29uc3QgYXVkaW9fc291cmNlX3QgICAgICAgIG1Tb3VyY2U7Cit9OworCitjbGFzcyBTZXNzaW9uUm91dGVNYXA6IHB1YmxpYyBLZXllZFZlY3RvcjxhdWRpb19zZXNzaW9uX3QsIHNwPFNlc3Npb25Sb3V0ZT4gPgoreworcHVibGljOgorICAgIC8vIFRoZXNlIGNvbnN0YW50cyBpZGVudGlmeSB0aGUgU2Vzc2lvblJvdXRNYXAgYXMgaG9sZGluZyBFSVRIRVIgaW5wdXQgcm91dGVzLAorICAgIC8vIG9yIG91dHB1dCByb3V0ZXMuICBBbiBlcnJvciB3aWxsIG9jY3VyIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBhZGQgYSBTZXNzaW9uUm91dGUKKyAgICAvLyBvYmplY3Qgd2l0aCBtU3RyZWFtVHlwZSA9PSBTVFJFQU1fVFlQRV9OQSAoaS5lLiBhbiBpbnB1dCBTZXNzaW9uUm91dGUpIHRvIGEKKyAgICAvLyBTZXNzaW9uUm91dE1hcCB0aGF0IGlzIG1hcmtlZCBmb3Igb3V0cHV0IChpLmUuIG1NYXBUeXBlID09IFNFU1NJT05fUk9VVEVfTUFQX09VVFBVVCkKKyAgICAvLyBhbmQgc2ltaWxhcmx5ICBmb3Igb3V0cHV0IFNlc3Npb25Sb3V0ZXMgYW5kIElucHV0IFNlc3Npb25Sb3V0ZU1hcHMuCisgICAgdHlwZWRlZiBlbnVtCisgICAgeworICAgICAgICBNQVBUWVBFX0lOUFVUID0gMCwKKyAgICAgICAgTUFQVFlQRV9PVVRQVVQgPSAxCisgICAgfSBzZXNzaW9uX3JvdXRlX21hcF90eXBlX3Q7CisKKyAgICBTZXNzaW9uUm91dGVNYXAoc2Vzc2lvbl9yb3V0ZV9tYXBfdHlwZV90IG1hcFR5cGUpIDoKKyAgICAgICAgbU1hcFR5cGUobWFwVHlwZSkKKyAgICB7fQorCisgICAgYm9vbCBoYXNSb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisKKyAgICB2b2lkIHJlbW92ZVJvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKworICAgIGludCBpbmNSb3V0ZUFjdGl2aXR5KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICBpbnQgZGVjUm91dGVBY3Rpdml0eShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgYm9vbCBoYXNSb3V0ZUNoYW5nZWQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOyAvLyBhbHNvIGNsZWFycyB0aGUgY2hhbmdlZCBmbGFnCisgICAgdm9pZCBsb2coY29uc3QgY2hhciogY2FwdGlvbik7CisKKyAgICAvLyBTcGVjaWZ5IGFuIE91dHB1dChTaW5rKSByb3V0ZSBieSBwYXNzaW5nIFNlc3Npb25Sb3V0ZTo6U09VUkNFX1RZUEVfTkEgaW4gdGhlCisgICAgLy8gc291cmNlIGFyZ3VtZW50LgorICAgIC8vIFNwZWNpZnkgYW4gSW5wdXQoU291cmNlKSByb3V0IGJ5IHBhc3NpbmcgU2Vzc2lvblJvdXRlOjpBVURJT19TVFJFQU1fREVGQVVMVAorICAgIC8vIGluIHRoZSBzdHJlYW1UeXBlIGFyZ3VtZW50LgorICAgIHZvaWQgYWRkUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKKworcHJpdmF0ZToKKyAgICAvLyBVc2VkIHRvIG1hcmsgYSBTZXNzaW9uUm91dGUgYXMgZm9yIGVpdGhlciBpbnB1dHMgKG1NYXBUeXBlID09IGtTZXNzaW9uUm91dGVNYXBfSW5wdXQpCisgICAgLy8gb3Igb3V0cHV0cyAobU1hcFR5cGUgPT0ga1Nlc3Npb25Sb3V0ZU1hcF9PdXRwdXQpCisgICAgY29uc3Qgc2Vzc2lvbl9yb3V0ZV9tYXBfdHlwZV90IG1NYXBUeXBlOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU291bmRUcmlnZ2VyU2Vzc2lvbi5oCnNpbWlsYXJpdHkgaW5kZXggNjAlCmNvcHkgZnJvbSBzZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUZhY3RvcnkuY3BwCmNvcHkgdG8gc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NvdW5kVHJpZ2dlclNlc3Npb24uaAppbmRleCAyYWU3YmMxLi40MjBlNmQ3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUZhY3RvcnkuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Tb3VuZFRyaWdnZXJTZXNzaW9uLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxOSArMTQsMjAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJBdWRpb1BvbGljeU1hbmFnZXIuaCIKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1leHRlcm4gIkMiIEF1ZGlvUG9saWN5SW50ZXJmYWNlKiBjcmVhdGVBdWRpb1BvbGljeU1hbmFnZXIoCi0gICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCitjbGFzcyBTb3VuZFRyaWdnZXJTZXNzaW9uQ29sbGVjdGlvbiA6IHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90LCBhdWRpb19pb19oYW5kbGVfdD4KIHsKLSAgICByZXR1cm4gbmV3IEF1ZGlvUG9saWN5TWFuYWdlcihjbGllbnRJbnRlcmZhY2UpOwotfQorcHVibGljOgorICAgIHN0YXR1c190IHJlbGVhc2VTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKIAotZXh0ZXJuICJDIiB2b2lkIGRlc3Ryb3lBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lJbnRlcmZhY2UgKmludGVyZmFjZSkKLXsKLSAgICBkZWxldGUgaW50ZXJmYWNlOwotfQorICAgIHN0YXR1c190IGFjcXVpcmVTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSk7Cit9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1N0cmVhbURlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TdHJlYW1EZXNjcmlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRkYjVhYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TdHJlYW1EZXNjcmlwdG9yLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Vm9sdW1lLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdHJlYW0gZGVzY3JpcHRvciB1c2VkIGZvciB2b2x1bWUgY29udHJvbAorY2xhc3MgU3RyZWFtRGVzY3JpcHRvcgoreworcHVibGljOgorICAgIFN0cmVhbURlc2NyaXB0b3IoKTsKKworICAgIGludCBnZXRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdDsKKyAgICBib29sIGNhbkJlTXV0ZWQoKSBjb25zdCB7IHJldHVybiBtQ2FuQmVNdXRlZDsgfQorICAgIHZvaWQgY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoKTsKKyAgICB2b2lkIGFkZEN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgaW5kZXgpOworICAgIGludCBnZXRWb2x1bWVJbmRleE1pbigpIGNvbnN0IHsgcmV0dXJuIG1JbmRleE1pbjsgfQorICAgIGludCBnZXRWb2x1bWVJbmRleE1heCgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleE1heDsgfQorICAgIHZvaWQgc2V0Vm9sdW1lSW5kZXhNaW4oaW50IHZvbEluZGV4TWluKTsKKyAgICB2b2lkIHNldFZvbHVtZUluZGV4TWF4KGludCB2b2xJbmRleE1heCk7CisKKyAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdDsKKworICAgIHZvaWQgc2V0Vm9sdW1lQ3VydmVQb2ludChWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqcG9pbnQpOworICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKmdldFZvbHVtZUN1cnZlUG9pbnQoVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbVZvbHVtZUN1cnZlW2RldmljZUNhdGVnb3J5XTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqbVZvbHVtZUN1cnZlW1ZvbHVtZTo6REVWSUNFX0NBVEVHT1JZX0NOVF07CisgICAgS2V5ZWRWZWN0b3I8YXVkaW9fZGV2aWNlc190LCBpbnQ+IG1JbmRleEN1cjsgLyoqPCBjdXJyZW50IHZvbHVtZSBpbmRleCBwZXIgZGV2aWNlLiAqLworICAgIGludCBtSW5kZXhNaW47IC8qKjwgbWluIHZvbHVtZSBpbmRleC4gKi8KKyAgICBpbnQgbUluZGV4TWF4OyAvKio8IG1heCB2b2x1bWUgaW5kZXguICovCisgICAgYm9vbCBtQ2FuQmVNdXRlZDsgLyoqPCB0cnVlIGlzIHRoZSBzdHJlYW0gY2FuIGJlIG11dGVkLiAqLworfTsKKworLyoqCisgKiBzdHJlYW0gZGVzY3JpcHRvcnMgY29sbGVjdGlvbiBmb3Igdm9sdW1lIGNvbnRyb2wKKyAqLworY2xhc3MgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24gOiBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX3N0cmVhbV90eXBlX3QsIFN0cmVhbURlc2NyaXB0b3I+Cit7CitwdWJsaWM6CisgICAgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24oKTsKKworICAgIHZvaWQgY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgIHZvaWQgYWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgaW5kZXgpOworCisgICAgYm9vbCBjYW5CZU11dGVkKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKworICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKworICAgIHZvaWQgc2V0Vm9sdW1lQ3VydmVQb2ludChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnBvaW50KTsKKworICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKmdldFZvbHVtZUN1cnZlUG9pbnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSkgY29uc3Q7CisKKyAgICB2b2lkIHNldFZvbHVtZUluZGV4TWluKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLGludCB2b2xJbmRleE1pbik7CisgICAgdm9pZCBzZXRWb2x1bWVJbmRleE1heChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSxpbnQgdm9sSW5kZXhNYXgpOworCit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvYXVkaW9fcG9saWN5X2NvbmYuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9hdWRpb19wb2xpY3lfY29uZi5oCnNpbWlsYXJpdHkgaW5kZXggOTElCnJlbmFtZSBmcm9tIHNlcnZpY2VzL2F1ZGlvcG9saWN5L2F1ZGlvX3BvbGljeV9jb25mLmgKcmVuYW1lIHRvIHNlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9hdWRpb19wb2xpY3lfY29uZi5oCmluZGV4IDI1MzVhNjcuLmEzOTNlM2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2F1ZGlvX3BvbGljeV9jb25mLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL2F1ZGlvX3BvbGljeV9jb25mLmgKQEAgLTE0LDkgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLQotI2lmbmRlZiBBTkRST0lEX0FVRElPX1BPTElDWV9DT05GX0gKLSNkZWZpbmUgQU5EUk9JRF9BVURJT19QT0xJQ1lfQ09ORl9ICisjcHJhZ21hIG9uY2UKIAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC01Myw5ICs1MSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAiZm9ybWF0cyIgaW4gb3V0cHV0cyBkZXNjcmlwdG9ycyBpbmRpY2F0aW5nIHRoYXQgc3VwcG9ydGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgc2hvdWxkIGJlIHF1ZXJpZWQgYWZ0ZXIgb3BlbmluZyB0aGUgb3V0cHV0LgogCi0jZGVmaW5lIERFVklDRVNfVEFHICJkZXZpY2VzIgotI2RlZmluZSBERVZJQ0VfVFlQRSAidHlwZSIKLSNkZWZpbmUgREVWSUNFX0FERFJFU1MgImFkZHJlc3MiCisjZGVmaW5lIEFQTV9ERVZJQ0VTX1RBRyAiZGV2aWNlcyIKKyNkZWZpbmUgQVBNX0RFVklDRV9UWVBFICJ0eXBlIgorI2RlZmluZSBBUE1fREVWSUNFX0FERFJFU1MgImFkZHJlc3MiCiAKICNkZWZpbmUgTUlYRVJTX1RBRyAibWl4ZXJzIgogI2RlZmluZSBNSVhFUl9UWVBFICJ0eXBlIgpAQCAtNzEsNyArNjksMyBAQAogI2RlZmluZSBHQUlOX1NURVBfVkFMVUUgInN0ZXBfdmFsdWVfbUIiCiAjZGVmaW5lIEdBSU5fTUlOX1JBTVBfTVMgIm1pbl9yYW1wX21zIgogI2RlZmluZSBHQUlOX01BWF9SQU1QX01TICJtYXhfcmFtcF9tcyIKLQotCi0KLSNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19QT0xJQ1lfQ09ORl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0dhaW4uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9HYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzdiMGNjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9HYWluLmNwcApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb0dhaW4iCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKy8vI2RlZmluZSBWRVJZX1ZFUkJPU0VfTE9HR0lORworI2lmZGVmIFZFUllfVkVSQk9TRV9MT0dHSU5HCisjZGVmaW5lIEFMT0dWViBBTE9HVgorI2Vsc2UKKyNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKyNpbmNsdWRlICJBdWRpb0dhaW4uaCIKKyNpbmNsdWRlICJTdHJlYW1EZXNjcmlwdG9yLmgiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSA8bWF0aC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0F1ZGlvR2Fpbjo6QXVkaW9HYWluKGludCBpbmRleCwgYm9vbCB1c2VJbkNoYW5uZWxNYXNrKQoreworICAgIG1JbmRleCA9IGluZGV4OworICAgIG1Vc2VJbkNoYW5uZWxNYXNrID0gdXNlSW5DaGFubmVsTWFzazsKKyAgICBtZW1zZXQoJm1HYWluLCAwLCBzaXplb2Yoc3RydWN0IGF1ZGlvX2dhaW4pKTsKK30KKwordm9pZCBBdWRpb0dhaW46OmdldERlZmF1bHRDb25maWcoc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpCit7CisgICAgY29uZmlnLT5pbmRleCA9IG1JbmRleDsKKyAgICBjb25maWctPm1vZGUgPSBtR2Fpbi5tb2RlOworICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrID0gbUdhaW4uY2hhbm5lbF9tYXNrOworICAgIGlmICgobUdhaW4ubW9kZSAmIEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgPT0gQVVESU9fR0FJTl9NT0RFX0pPSU5UKSB7CisgICAgICAgIGNvbmZpZy0+dmFsdWVzWzBdID0gbUdhaW4uZGVmYXVsdF92YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50MzJfdCBudW1WYWx1ZXM7CisgICAgICAgIGlmIChtVXNlSW5DaGFubmVsTWFzaykgeworICAgICAgICAgICAgbnVtVmFsdWVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUdhaW4uY2hhbm5lbF9tYXNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bVZhbHVlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtR2Fpbi5jaGFubmVsX21hc2spOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHsKKyAgICAgICAgICAgIGNvbmZpZy0+dmFsdWVzW2ldID0gbUdhaW4uZGVmYXVsdF92YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKG1HYWluLm1vZGUgJiBBVURJT19HQUlOX01PREVfUkFNUCkgPT0gQVVESU9fR0FJTl9NT0RFX1JBTVApIHsKKyAgICAgICAgY29uZmlnLT5yYW1wX2R1cmF0aW9uX21zID0gbUdhaW4ubWluX3JhbXBfbXM7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb0dhaW46OmNoZWNrQ29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKQoreworICAgIGlmICgoY29uZmlnLT5tb2RlICYgfm1HYWluLm1vZGUpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKChjb25maWctPm1vZGUgJiBBVURJT19HQUlOX01PREVfSk9JTlQpID09IEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgeworICAgICAgICBpZiAoKGNvbmZpZy0+dmFsdWVzWzBdIDwgbUdhaW4ubWluX3ZhbHVlKSB8fAorICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT52YWx1ZXNbMF0gPiBtR2Fpbi5tYXhfdmFsdWUpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChjb25maWctPmNoYW5uZWxfbWFzayAmIH5tR2Fpbi5jaGFubmVsX21hc2spICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgdWludDMyX3QgbnVtVmFsdWVzOworICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgIG51bVZhbHVlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bVZhbHVlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWctPmNoYW5uZWxfbWFzayk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1WYWx1ZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKChjb25maWctPnZhbHVlc1tpXSA8IG1HYWluLm1pbl92YWx1ZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+dmFsdWVzW2ldID4gbUdhaW4ubWF4X3ZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKChjb25maWctPm1vZGUgJiBBVURJT19HQUlOX01PREVfUkFNUCkgPT0gQVVESU9fR0FJTl9NT0RFX1JBTVApIHsKKyAgICAgICAgaWYgKChjb25maWctPnJhbXBfZHVyYXRpb25fbXMgPCBtR2Fpbi5taW5fcmFtcF9tcykgfHwKKyAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+cmFtcF9kdXJhdGlvbl9tcyA+IG1HYWluLm1heF9yYW1wX21zKSkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9HYWluOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzR2FpbiAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1vZGU6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1vZGUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGNoYW5uZWxfbWFzazogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uY2hhbm5lbF9tYXNrKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtaW5fdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5taW5fdmFsdWUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1heF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1heF92YWx1ZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZGVmYXVsdF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLmRlZmF1bHRfdmFsdWUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHN0ZXBfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5zdGVwX3ZhbHVlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtaW5fcmFtcF9tczogJWQgbXNcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1pbl9yYW1wX21zKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtYXhfcmFtcF9tczogJWQgbXNcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1heF9yYW1wX21zKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzcxNjBiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvSW5wdXREZXNjcmlwdG9yIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiQXVkaW9JbnB1dERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKKyNpbmNsdWRlICJBdWRpb0dhaW4uaCIKKyNpbmNsdWRlICJId01vZHVsZS5oIgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CisjaW5jbHVkZSA8cG9saWN5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQXVkaW9JbnB1dERlc2NyaXB0b3I6OkF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUpCisgICAgOiBtSW9IYW5kbGUoMCksCisgICAgICBtRGV2aWNlKEFVRElPX0RFVklDRV9OT05FKSwgbVBvbGljeU1peChOVUxMKSwgbVBhdGNoSGFuZGxlKDApLCBtUmVmQ291bnQoMCksCisgICAgICBtSW5wdXRTb3VyY2UoQVVESU9fU09VUkNFX0RFRkFVTFQpLCBtUHJvZmlsZShwcm9maWxlKSwgbUlzU291bmRUcmlnZ2VyKGZhbHNlKSwgbUlkKDApCit7CisgICAgaWYgKHByb2ZpbGUgIT0gTlVMTCkgeworICAgICAgICBtU2FtcGxpbmdSYXRlID0gcHJvZmlsZS0+cGlja1NhbXBsaW5nUmF0ZSgpOworICAgICAgICBtRm9ybWF0ID0gcHJvZmlsZS0+cGlja0Zvcm1hdCgpOworICAgICAgICBtQ2hhbm5lbE1hc2sgPSBwcm9maWxlLT5waWNrQ2hhbm5lbE1hc2soKTsKKyAgICAgICAgaWYgKHByb2ZpbGUtPm1HYWlucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5tR2FpbnNbMF0tPmdldERlZmF1bHRDb25maWcoJm1HYWluKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c2V0SW9IYW5kbGUoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpCit7CisgICAgbUlkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKKyAgICBtSW9IYW5kbGUgPSBpb0hhbmRsZTsKK30KKworYXVkaW9fbW9kdWxlX2hhbmRsZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRNb2R1bGVIYW5kbGUoKSBjb25zdAoreworICAgIGlmIChtUHJvZmlsZSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gbVByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpOworfQorCithdWRpb19wb3J0X2hhbmRsZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRJZCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1JZDsKK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKK3sKKyAgICBBTE9HX0FTU0VSVChtUHJvZmlsZSAhPSAwLAorICAgICAgICAgICAgICAgICJ0b0F1ZGlvUG9ydENvbmZpZygpIGNhbGxlZCBvbiBpbnB1dCB3aXRoIG51bGwgcHJvZmlsZSAlZCIsIG1Jb0hhbmRsZSk7CisgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFfEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTS3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX0NPTkZJR19GT1JNQVR8QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKKyAgICBpZiAoc3JjQ29uZmlnICE9IE5VTEwpIHsKKyAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayB8PSBzcmNDb25maWctPmNvbmZpZ19tYXNrOworICAgIH0KKworICAgIEF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOworCisgICAgZHN0Q29uZmlnLT5pZCA9IG1JZDsKKyAgICBkc3RDb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSzsKKyAgICBkc3RDb25maWctPnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYOworICAgIGRzdENvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBnZXRNb2R1bGVIYW5kbGUoKTsKKyAgICBkc3RDb25maWctPmV4dC5taXguaGFuZGxlID0gbUlvSGFuZGxlOworICAgIGRzdENvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IG1JbnB1dFNvdXJjZTsKK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0Cit7CisgICAgQUxPR19BU1NFUlQobVByb2ZpbGUgIT0gMCwgInRvQXVkaW9Qb3J0KCkgY2FsbGVkIG9uIGlucHV0IHdpdGggbnVsbCBwcm9maWxlICVkIiwgbUlvSGFuZGxlKTsKKworICAgIG1Qcm9maWxlLT50b0F1ZGlvUG9ydChwb3J0KTsKKyAgICBwb3J0LT5pZCA9IG1JZDsKKyAgICB0b0F1ZGlvUG9ydENvbmZpZygmcG9ydC0+YWN0aXZlX2NvbmZpZyk7CisgICAgcG9ydC0+ZXh0Lm1peC5od19tb2R1bGUgPSBnZXRNb2R1bGVIYW5kbGUoKTsKKyAgICBwb3J0LT5leHQubWl4LmhhbmRsZSA9IG1Jb0hhbmRsZTsKKyAgICBwb3J0LT5leHQubWl4LmxhdGVuY3lfY2xhc3MgPSBBVURJT19MQVRFTkNZX05PUk1BTDsKK30KKworc3RhdHVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIElEOiAlZFxuIiwgZ2V0SWQoKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JtYXQ6ICVkXG4iLCBtRm9ybWF0KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRGV2aWNlcyAlMDh4XG4iLCBtRGV2aWNlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFJlZiBDb3VudCAlZFxuIiwgbVJlZkNvdW50KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIE9wZW4gUmVmIENvdW50ICVkXG4iLCBtT3BlblJlZkNvdW50KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYm9vbCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dERlc2NyaXB0b3IgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAoaW5wdXREZXNjcmlwdG9yLT5tUmVmQ291bnQgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0RGVzY3JpcHRvci0+bUlucHV0U291cmNlID09IChpbnQpc291cmNlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3NwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBBdWRpb0lucHV0Q29sbGVjdGlvbjo6Z2V0SW5wdXRGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3QKK3sKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gTlVMTDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlucHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmIChpbnB1dERlc2MtPmdldElkKCkgPT0gaWQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbnB1dERlc2M7Cit9CisKK3VpbnQzMl90IEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjphY3RpdmVJbnB1dHNDb3VudCgpIGNvbnN0Cit7CisgICAgdWludDMyX3QgY291bnQgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBkZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGRlc2MtPm1SZWZDb3VudCA+IDApIHsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6Z2V0QWN0aXZlSW5wdXQoYm9vbCBpZ25vcmVWaXJ0dWFsSW5wdXRzKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dF9kZXNjcmlwdG9yID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKChpbnB1dF9kZXNjcmlwdG9yLT5tUmVmQ291bnQgPiAwKQorICAgICAgICAgICAgICAgICYmICghaWdub3JlVmlydHVhbElucHV0cyB8fCAhaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoaW5wdXRfZGVzY3JpcHRvci0+bURldmljZSkpKSB7CisgICAgICAgICAgICByZXR1cm4ga2V5QXQoaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6Z2V0U3VwcG9ydGVkRGV2aWNlcyhhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUpIGNvbnN0Cit7CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IHZhbHVlRm9yKGhhbmRsZSk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBpbnB1dERlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpOworICAgIHJldHVybiBkZXZpY2VzOworfQorCitzdGF0dXNfdCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Cit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbklucHV0cyBkdW1wOlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBJbnB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOworICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3ODM3NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKQEAgLTAsMCArMSw0OTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9PdXRwdXREZXNjcmlwdG9yIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJBdWRpb091dHB1dERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKKyNpbmNsdWRlICJBdWRpb0dhaW4uaCIKKyNpbmNsdWRlICJWb2x1bWUuaCIKKyNpbmNsdWRlICJId01vZHVsZS5oIgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CisKKy8vIEEgZGV2aWNlIG1hc2sgZm9yIGFsbCBhdWRpbyBvdXRwdXQgZGV2aWNlcyB0aGF0IGFyZSBjb25zaWRlcmVkICJyZW1vdGUiIHdoZW4gZXZhbHVhdGluZworLy8gYWN0aXZlIG91dHB1dCBkZXZpY2VzIGluIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoKQorI2RlZmluZSBBUE1fQVVESU9fT1VUX0RFVklDRV9SRU1PVEVfQUxMICBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBdWRpb091dHB1dERlc2NyaXB0b3I6OkF1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxBdWRpb1BvcnQ+JiBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKKyAgICA6IG1Qb3J0KHBvcnQpLCBtRGV2aWNlKEFVRElPX0RFVklDRV9OT05FKSwKKyAgICAgIG1QYXRjaEhhbmRsZSgwKSwgbUNsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpLCBtSWQoMCkKK3sKKyAgICAvLyBjbGVhciB1c2FnZSBjb3VudCBmb3IgYWxsIHN0cmVhbSB0eXBlcworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgIG1SZWZDb3VudFtpXSA9IDA7CisgICAgICAgIG1DdXJWb2x1bWVbaV0gPSAtMS4wOworICAgICAgICBtTXV0ZUNvdW50W2ldID0gMDsKKyAgICAgICAgbVN0b3BUaW1lW2ldID0gMDsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7CisgICAgICAgIG1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKHBvcnQgIT0gTlVMTCkgeworICAgICAgICBtU2FtcGxpbmdSYXRlID0gcG9ydC0+cGlja1NhbXBsaW5nUmF0ZSgpOworICAgICAgICBtRm9ybWF0ID0gcG9ydC0+cGlja0Zvcm1hdCgpOworICAgICAgICBtQ2hhbm5lbE1hc2sgPSBwb3J0LT5waWNrQ2hhbm5lbE1hc2soKTsKKyAgICAgICAgaWYgKHBvcnQtPm1HYWlucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBwb3J0LT5tR2FpbnNbMF0tPmdldERlZmF1bHRDb25maWcoJm1HYWluKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYXVkaW9fbW9kdWxlX2hhbmRsZV90IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Z2V0TW9kdWxlSGFuZGxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVBvcnQtPmdldE1vZHVsZUhhbmRsZSgpOworfQorCithdWRpb19wb3J0X2hhbmRsZV90IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Z2V0SWQoKSBjb25zdAoreworICAgIHJldHVybiBtSWQ7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmRldmljZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1EZXZpY2U7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnN1cHBvcnRlZERldmljZXMoKQoreworICAgIHJldHVybiBtRGV2aWNlOworfQorCitib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2hhcmVzSHdNb2R1bGVXaXRoKAorICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MpCit7CisgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIHJldHVybiBzaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYy0+c3ViT3V0cHV0MSgpKSB8fAorICAgICAgICAgICAgICAgICAgICBzaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYy0+c3ViT3V0cHV0MigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKGdldE1vZHVsZUhhbmRsZSgpID09IG91dHB1dERlc2MtPmdldE1vZHVsZUhhbmRsZSgpKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEpCit7CisgICAgaWYgKChkZWx0YSArIChpbnQpbVJlZkNvdW50W3N0cmVhbV0pIDwgMCkgeworICAgICAgICBBTE9HVygiY2hhbmdlUmVmQ291bnQoKSBpbnZhbGlkIGRlbHRhICVkIGZvciBzdHJlYW0gJWQsIHJlZkNvdW50ICVkIiwKKyAgICAgICAgICAgICAgZGVsdGEsIHN0cmVhbSwgbVJlZkNvdW50W3N0cmVhbV0pOworICAgICAgICBtUmVmQ291bnRbc3RyZWFtXSA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVJlZkNvdW50W3N0cmVhbV0gKz0gZGVsdGE7CisgICAgQUxPR1YoImNoYW5nZVJlZkNvdW50KCkgc3RyZWFtICVkLCBjb3VudCAlZCIsIHN0cmVhbSwgbVJlZkNvdW50W3N0cmVhbV0pOworfQorCitib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNBY3RpdmUodWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Cit7CisgICAgbnNlY3NfdCBzeXNUaW1lID0gMDsKKyAgICBpZiAoaW5QYXN0TXMgIT0gMCkgeworICAgICAgICBzeXNUaW1lID0gc3lzdGVtVGltZSgpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgIGlmIChpID09IEFVRElPX1NUUkVBTV9QQVRDSCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzU3RyZWFtQWN0aXZlKChhdWRpb19zdHJlYW1fdHlwZV90KWksIGluUGFzdE1zLCBzeXNUaW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAoreworICAgIGlmIChtUmVmQ291bnRbc3RyZWFtXSAhPSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoaW5QYXN0TXMgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChzeXNUaW1lID09IDApIHsKKyAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICB9CisgICAgaWYgKG5zMm1zKHN5c1RpbWUgLSBtU3RvcFRpbWVbc3RyZWFtXSkgPCBpblBhc3RNcykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisKK2Jvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0ZpeGVkVm9sdW1lKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgX191bnVzZWQpCit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCit7CisgICAgLy8gV2UgYWN0dWFsbHkgY2hhbmdlIHRoZSB2b2x1bWUgaWY6CisgICAgLy8gLSB0aGUgZmxvYXQgdmFsdWUgcmV0dXJuZWQgYnkgY29tcHV0ZVZvbHVtZSgpIGNoYW5nZWQKKyAgICAvLyAtIHRoZSBmb3JjZSBmbGFnIGlzIHNldAorICAgIGlmICh2b2x1bWUgIT0gbUN1clZvbHVtZVtzdHJlYW1dIHx8IGZvcmNlKSB7CisgICAgICAgIEFMT0dWKCJzZXRWb2x1bWUoKSBmb3Igc3RyZWFtICVkLCB2b2x1bWUgJWYsIGRlbGF5ICVkIiwgc3RyZWFtLCB2b2x1bWUsIGRlbGF5TXMpOworICAgICAgICBtQ3VyVm9sdW1lW3N0cmVhbV0gPSB2b2x1bWU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKK3sKKyAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEV8QVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVHxBVURJT19QT1JUX0NPTkZJR19HQUlOOworICAgIGlmIChzcmNDb25maWcgIT0gTlVMTCkgeworICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrIHw9IHNyY0NvbmZpZy0+Y29uZmlnX21hc2s7CisgICAgfQorICAgIEF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOworCisgICAgZHN0Q29uZmlnLT5pZCA9IG1JZDsKKyAgICBkc3RDb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFOworICAgIGRzdENvbmZpZy0+dHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVg7CisgICAgZHN0Q29uZmlnLT5leHQubWl4Lmh3X21vZHVsZSA9IGdldE1vZHVsZUhhbmRsZSgpOworICAgIGRzdENvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworfQorCit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0Cit7CisgICAgbVBvcnQtPnRvQXVkaW9Qb3J0KHBvcnQpOworICAgIHBvcnQtPmlkID0gbUlkOworICAgIHBvcnQtPmV4dC5taXguaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7Cit9CisKK3N0YXR1c190IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSUQ6ICVkXG4iLCBtSWQpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlMDh4XG4iLCBtRm9ybWF0KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRGV2aWNlcyAlMDh4XG4iLCBkZXZpY2UoKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTdHJlYW0gdm9sdW1lIHJlZkNvdW50IG11dGVDb3VudFxuIik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMmQgICAgICUuMDNmICAgICAlMDJkICAgICAgICUwMmRcbiIsCisgICAgICAgICAgICAgICAgIGksIG1DdXJWb2x1bWVbaV0sIG1SZWZDb3VudFtpXSwgbU11dGVDb3VudFtpXSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpsb2coY29uc3QgY2hhciogaW5kZW50KQoreworICAgIEFMT0dJKCIlc0lEOiAlZCwweCVYLCBbcnQ6JWQgZm10OjB4JVggY2g6MHglWF0iLAorICAgICAgICAgIGluZGVudCwgbUlkLCBtSWQsIG1TYW1wbGluZ1JhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzayk7Cit9CisKKy8vIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yIGltcGxlbWVudGF0aW9uCitTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6U3dBdWRpb091dHB1dERlc2NyaXB0b3IoCisgICAgICAgIGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUsIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCisgICAgOiBBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgY2xpZW50SW50ZXJmYWNlKSwKKyAgICBtUHJvZmlsZShwcm9maWxlKSwgbUlvSGFuZGxlKDApLCBtTGF0ZW5jeSgwKSwKKyAgICBtRmxhZ3MoKGF1ZGlvX291dHB1dF9mbGFnc190KTApLCBtUG9saWN5TWl4KE5VTEwpLAorICAgIG1PdXRwdXQxKDApLCBtT3V0cHV0MigwKSwgbURpcmVjdE9wZW5Db3VudCgwKSwgbUdsb2JhbFJlZkNvdW50KDApCit7CisgICAgaWYgKHByb2ZpbGUgIT0gTlVMTCkgeworICAgICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcHJvZmlsZS0+bUZsYWdzOworICAgIH0KK30KKwordm9pZCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0SW9IYW5kbGUoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUpCit7CisgICAgbUlkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKKyAgICBtSW9IYW5kbGUgPSBpb0hhbmRsZTsKK30KKworCitzdGF0dXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgTGF0ZW5jeTogJWRcbiIsIG1MYXRlbmN5KTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZsYWdzICUwOHhcbiIsIG1GbGFncyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGZkKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYXVkaW9fZGV2aWNlc190IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkZXZpY2UoKSBjb25zdAoreworICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICByZXR1cm4gKGF1ZGlvX2RldmljZXNfdCkobU91dHB1dDEtPm1EZXZpY2UgfCBtT3V0cHV0Mi0+bURldmljZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2U7CisgICAgfQorfQorCitib29sIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzaGFyZXNId01vZHVsZVdpdGgoCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYykKK3sKKyAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1PdXRwdXQxLT5zaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYykgfHwgbU91dHB1dDItPnNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjKTsKKyAgICB9IGVsc2UgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKXsKKyAgICAgICAgcmV0dXJuIHNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjLT5zdWJPdXRwdXQxKCkpIHx8CisgICAgICAgICAgICAgICAgICAgIHNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjLT5zdWJPdXRwdXQyKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjKTsKKyAgICB9Cit9CisKK2F1ZGlvX2RldmljZXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3VwcG9ydGVkRGV2aWNlcygpCit7CisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIHJldHVybiAoYXVkaW9fZGV2aWNlc190KShtT3V0cHV0MS0+c3VwcG9ydGVkRGV2aWNlcygpIHwgbU91dHB1dDItPnN1cHBvcnRlZERldmljZXMoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpIDsKKyAgICB9Cit9CisKK3VpbnQzMl90IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpsYXRlbmN5KCkKK3sKKyAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIChtT3V0cHV0MS0+bUxhdGVuY3kgPiBtT3V0cHV0Mi0+bUxhdGVuY3kpID8gbU91dHB1dDEtPm1MYXRlbmN5IDogbU91dHB1dDItPm1MYXRlbmN5OworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtTGF0ZW5jeTsKKyAgICB9Cit9CisKK3ZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSkKK3sKKyAgICAvLyBmb3J3YXJkIHVzYWdlIGNvdW50IGNoYW5nZSB0byBhdHRhY2hlZCBvdXRwdXRzCisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIG1PdXRwdXQxLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIGRlbHRhKTsKKyAgICAgICAgbU91dHB1dDItPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgZGVsdGEpOworICAgIH0KKyAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgZGVsdGEpOworCisgICAgLy8gaGFuZGxlIHN0cmVhbS1pbmRlcGVuZGVudCByZWYgY291bnQKKyAgICB1aW50MzJfdCBvbGRHbG9iYWxSZWZDb3VudCA9IG1HbG9iYWxSZWZDb3VudDsKKyAgICBpZiAoKGRlbHRhICsgKGludCltR2xvYmFsUmVmQ291bnQpIDwgMCkgeworICAgICAgICBBTE9HVygiY2hhbmdlUmVmQ291bnQoKSBpbnZhbGlkIGRlbHRhICVkIGdsb2JhbFJlZkNvdW50ICVkIiwgZGVsdGEsIG1HbG9iYWxSZWZDb3VudCk7CisgICAgICAgIG1HbG9iYWxSZWZDb3VudCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUdsb2JhbFJlZkNvdW50ICs9IGRlbHRhOworICAgIH0KKyAgICBpZiAoKG9sZEdsb2JhbFJlZkNvdW50ID09IDApICYmIChtR2xvYmFsUmVmQ291bnQgPiAwKSkgeworICAgICAgICBpZiAoKG1Qb2xpY3lNaXggIT0gTlVMTCkgJiYgKChtUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKQorICAgICAgICB7CisgICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShtUG9saWN5TWl4LT5tUmVnaXN0cmF0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9NSVhJTkcpOworICAgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKChvbGRHbG9iYWxSZWZDb3VudCA+IDApICYmIChtR2xvYmFsUmVmQ291bnQgPT0gMCkpIHsKKyAgICAgICAgaWYgKChtUG9saWN5TWl4ICE9IE5VTEwpICYmICgobVBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUobVBvbGljeU1peC0+bVJlZ2lzdHJhdGlvbklkLAorICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfSURMRSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNGaXhlZFZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIC8vIHVuaXQgZ2FpbiBpZiByZXJvdXRpbmcgdG8gZXh0ZXJuYWwgcG9saWN5CisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpIHsKKyAgICAgICAgaWYgKG1Qb2xpY3lNaXggIT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR1YoIm1heCBnYWluIHdoZW4gcmVyb3V0aW5nIGZvciBvdXRwdXQ9JWQiLCBtSW9IYW5kbGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKK3sKKworICAgIEFMT0dfQVNTRVJUKCFpc0R1cGxpY2F0ZWQoKSwgInRvQXVkaW9Qb3J0Q29uZmlnKCkgY2FsbGVkIG9uIGR1cGxpY2F0ZWQgb3V0cHV0ICVkIiwgbUlvSGFuZGxlKTsKKyAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKKworICAgIGRzdENvbmZpZy0+ZXh0Lm1peC5oYW5kbGUgPSBtSW9IYW5kbGU7Cit9CisKK3ZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAoreworICAgIEFMT0dfQVNTRVJUKCFpc0R1cGxpY2F0ZWQoKSwgInRvQXVkaW9Qb3J0KCkgY2FsbGVkIG9uIGR1cGxpY2F0ZWQgb3V0cHV0ICVkIiwgbUlvSGFuZGxlKTsKKworICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQocG9ydCk7CisKKyAgICB0b0F1ZGlvUG9ydENvbmZpZygmcG9ydC0+YWN0aXZlX2NvbmZpZyk7CisgICAgcG9ydC0+ZXh0Lm1peC5oYW5kbGUgPSBtSW9IYW5kbGU7CisgICAgcG9ydC0+ZXh0Lm1peC5sYXRlbmN5X2NsYXNzID0KKyAgICAgICAgICAgIG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgPyBBVURJT19MQVRFTkNZX0xPVyA6IEFVRElPX0xBVEVOQ1lfTk9STUFMOworfQorCitib29sIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQoreworICAgIGJvb2wgY2hhbmdlZCA9IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKHZvbHVtZSwgc3RyZWFtLCBkZXZpY2UsIGRlbGF5TXMsIGZvcmNlKTsKKworICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgIC8vIEZvcmNlIFZPSUNFX0NBTEwgdG8gdHJhY2sgQkxVRVRPT1RIX1NDTyBzdHJlYW0gdm9sdW1lIHdoZW4gYmx1ZXRvb3RoIGF1ZGlvIGlzCisgICAgICAgIC8vIGVuYWJsZWQKKyAgICAgICAgZmxvYXQgdm9sdW1lID0gVm9sdW1lOjpEYlRvQW1wbChtQ3VyVm9sdW1lW3N0cmVhbV0pOworICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPKSB7CisgICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCB2b2x1bWUsIG1Jb0hhbmRsZSwgZGVsYXlNcyk7CisgICAgICAgIH0KKyAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKHN0cmVhbSwgdm9sdW1lLCBtSW9IYW5kbGUsIGRlbGF5TXMpOworICAgIH0KKyAgICByZXR1cm4gY2hhbmdlZDsKK30KKworLy8gU3dBdWRpb091dHB1dENvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24KKworYm9vbCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAoreworICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRoaXMtPnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdGhpcy0+dmFsdWVBdChpKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK3sKKyAgICBuc2Vjc190IHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmICgoKG91dHB1dERlc2MtPmRldmljZSgpICYgQVBNX0FVRElPX09VVF9ERVZJQ0VfUkVNT1RFX0FMTCkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZShzdHJlYW0sIGluUGFzdE1zLCBzeXNUaW1lKSkgeworICAgICAgICAgICAgLy8gZG8gbm90IGNvbnNpZGVyIHJlIHJvdXRpbmcgKHdoZW4gdGhlIG91dHB1dCBpcyBnb2luZyB0byBhIGR5bmFtaWMgcG9saWN5KQorICAgICAgICAgICAgLy8gYXMgInJlbW90ZSBwbGF5YmFjayIKKyAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRBMmRwT3V0cHV0KCkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiBvdXRwdXREZXNjLT5kZXZpY2UoKSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLT5rZXlBdChpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRQcmltYXJ5T3V0cHV0KCkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpIHsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXREZXNjOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmdldE91dHB1dEZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdAoreworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gTlVMTDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIG91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAob3V0cHV0RGVzYy0+Z2V0SWQoKSA9PSBpZCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG91dHB1dERlc2M7Cit9CisKK2Jvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzQW55T3V0cHV0QWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVG9JZ25vcmUpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgcyA9IDAgOyBzIDwgQVVESU9fU1RSRUFNX0NOVCA7IHMrKykgeworICAgICAgICBpZiAocyA9PSAoc2l6ZV90KSBzdHJlYW1Ub0lnbm9yZSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCithdWRpb19kZXZpY2VzX3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmdldFN1cHBvcnRlZERldmljZXMoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdAoreworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVGb3IoaGFuZGxlKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IG91dHB1dERlc2MtPm1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpOworICAgIHJldHVybiBkZXZpY2VzOworfQorCisKK3N0YXR1c190IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuT3V0cHV0cyBkdW1wOlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBPdXRwdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKKyAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK307IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9QYXRjaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA2ZDg2NwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUGF0Y2giCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJBdWRpb1BhdGNoLmgiCisjaW5jbHVkZSAiQXVkaW9HYWluLmgiCisjaW5jbHVkZSAiQ29uZmlnUGFyc2luZ1V0aWxzLmgiCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitpbnQzMl90IHZvbGF0aWxlIEF1ZGlvUGF0Y2g6Om1OZXh0VW5pcXVlSWQgPSAxOworCitBdWRpb1BhdGNoOjpBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsIHVpZF90IHVpZCkgOgorICAgIG1IYW5kbGUoc3RhdGljX2Nhc3Q8YXVkaW9fcGF0Y2hfaGFuZGxlX3Q+KGFuZHJvaWRfYXRvbWljX2luYygmbU5leHRVbmlxdWVJZCkpKSwKKyAgICBtUGF0Y2goKnBhdGNoKSwKKyAgICBtVWlkKHVpZCksCisgICAgbUFmUGF0Y2hIYW5kbGUoMCkKK3sKK30KKworc3RhdHVzX3QgQXVkaW9QYXRjaDo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0F1ZGlvIHBhdGNoICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaGFuZGxlOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1IYW5kbGUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGF1ZGlvIGZsaW5nZXIgaGFuZGxlOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1BZlBhdGNoSGFuZGxlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBvd25lciB1aWQ6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbVVpZCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gJWQgc291cmNlczpcbiIsIHNwYWNlcywgIiIsIG1QYXRjaC5udW1fc291cmNlcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBhdGNoLm51bV9zb3VyY2VzOyBpKyspIHsKKyAgICAgICAgaWYgKG1QYXRjaC5zb3VyY2VzW2ldLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBEZXZpY2UgSUQgJWQgJXNcbiIsIHNwYWNlcyArIDIsICIiLAorICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNvdXJjZXNbaV0uaWQsIENvbmZpZ1BhcnNpbmdVdGlsczo6ZW51bVRvU3RyaW5nKHNEZXZpY2VUeXBlVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZVR5cGVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zb3VyY2VzW2ldLmV4dC5kZXZpY2UudHlwZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBNaXggSUQgJWQgSS9PIGhhbmRsZSAlZFxuIiwgc3BhY2VzICsgMiwgIiIsCisgICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc291cmNlc1tpXS5pZCwgbVBhdGNoLnNvdXJjZXNbaV0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICB9CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSAlZCBzaW5rczpcbiIsIHNwYWNlcywgIiIsIG1QYXRjaC5udW1fc2lua3MpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYXRjaC5udW1fc2lua3M7IGkrKykgeworICAgICAgICBpZiAobVBhdGNoLnNpbmtzW2ldLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBEZXZpY2UgSUQgJWQgJXNcbiIsIHNwYWNlcyArIDIsICIiLAorICAgICAgICAgICAgICAgICAgICAgbVBhdGNoLnNpbmtzW2ldLmlkLCBDb25maWdQYXJzaW5nVXRpbHM6OmVudW1Ub1N0cmluZyhzRGV2aWNlVHlwZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNEZXZpY2VUeXBlVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc2lua3NbaV0uZXh0LmRldmljZS50eXBlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIE1peCBJRCAlZCBJL08gaGFuZGxlICVkXG4iLCBzcGFjZXMgKyAyLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zaW5rc1tpXS5pZCwgbVBhdGNoLnNpbmtzW2ldLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BhdGNoQ29sbGVjdGlvbjo6YWRkQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1BhdGNoPiYgcGF0Y2gpCit7CisgICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoaGFuZGxlKTsKKworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIEFMT0dXKCJhZGRBdWRpb1BhdGNoKCkgcGF0Y2ggJWQgYWxyZWFkeSBpbiIsIGhhbmRsZSk7CisgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICB9CisgICAgYWRkKGhhbmRsZSwgcGF0Y2gpOworICAgIEFMT0dWKCJhZGRBdWRpb1BhdGNoKCkgaGFuZGxlICVkIGFmIGhhbmRsZSAlZCBudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQgc291cmNlIGhhbmRsZSAlZCIKKyAgICAgICAgICAgICJzaW5rIGhhbmRsZSAlZCIsCisgICAgICAgICAgaGFuZGxlLCBwYXRjaC0+bUFmUGF0Y2hIYW5kbGUsIHBhdGNoLT5tUGF0Y2gubnVtX3NvdXJjZXMsIHBhdGNoLT5tUGF0Y2gubnVtX3NpbmtzLAorICAgICAgICAgIHBhdGNoLT5tUGF0Y2guc291cmNlc1swXS5pZCwgcGF0Y2gtPm1QYXRjaC5zaW5rc1swXS5pZCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BhdGNoQ29sbGVjdGlvbjo6cmVtb3ZlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoaGFuZGxlKTsKKworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInJlbW92ZUF1ZGlvUGF0Y2goKSBwYXRjaCAlZCBub3QgaW4iLCBoYW5kbGUpOworICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgfQorICAgIEFMT0dWKCJyZW1vdmVBdWRpb1BhdGNoKCkgaGFuZGxlICVkIGFmIGhhbmRsZSAlZCIsIGhhbmRsZSwgdmFsdWVBdChpbmRleCktPm1BZlBhdGNoSGFuZGxlKTsKKyAgICByZW1vdmVJdGVtc0F0KGluZGV4KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUGF0Y2hDb2xsZWN0aW9uOjpsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMpIGNvbnN0Cit7CisgICAgaWYgKG51bV9wYXRjaGVzID09IE5VTEwgfHwgKCpudW1fcGF0Y2hlcyAhPSAwICYmIHBhdGNoZXMgPT0gTlVMTCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoImxpc3RBdWRpb1BhdGNoZXMoKSBudW1fcGF0Y2hlcyAlZCBwYXRjaGVzICVwIGF2YWlsYWJsZSBwYXRjaGVzICV6dSIsCisgICAgICAgICAgKm51bV9wYXRjaGVzLCBwYXRjaGVzLCBzaXplKCkpOworICAgIGlmIChwYXRjaGVzID09IE5VTEwpIHsKKyAgICAgICAgKm51bV9wYXRjaGVzID0gMDsKKyAgICB9CisKKyAgICBzaXplX3QgcGF0Y2hlc1dyaXR0ZW4gPSAwOworICAgIHNpemVfdCBwYXRjaGVzTWF4ID0gKm51bV9wYXRjaGVzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICA8IHNpemUoKSAmJiBwYXRjaGVzV3JpdHRlbiA8IHBhdGNoZXNNYXg7IGkrKykgeworICAgICAgICBjb25zdCBzcDxBdWRpb1BhdGNoPiAgcGF0Y2ggPSB2YWx1ZUF0KGkpOworICAgICAgICBwYXRjaGVzW3BhdGNoZXNXcml0dGVuXSA9IHBhdGNoLT5tUGF0Y2g7CisgICAgICAgIHBhdGNoZXNbcGF0Y2hlc1dyaXR0ZW4rK10uaWQgPSBwYXRjaC0+bUhhbmRsZTsKKyAgICAgICAgQUxPR1YoImxpc3RBdWRpb1BhdGNoZXMoKSBwYXRjaCAlenUgbnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIiwKKyAgICAgICAgICAgICAgaSwgcGF0Y2gtPm1QYXRjaC5udW1fc291cmNlcywgcGF0Y2gtPm1QYXRjaC5udW1fc2lua3MpOworICAgIH0KKyAgICAqbnVtX3BhdGNoZXMgPSBzaXplKCk7CisKKyAgICBBTE9HVigibGlzdEF1ZGlvUGF0Y2hlcygpIGdvdCAlenUgcGF0Y2hlcyBuZWVkZWQgJWQiLCBwYXRjaGVzV3JpdHRlbiwgKm51bV9wYXRjaGVzKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUGF0Y2hDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkF1ZGlvIFBhdGNoZXM6XG4iKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkLCAyLCBpKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb2xpY3lNaXguY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb2xpY3lNaXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMTk5OGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvbGljeU1peC5jcHAKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qb2xpY3lNaXgiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJBdWRpb1BvbGljeU1peC5oIgorI2luY2x1ZGUgIkh3TW9kdWxlLmgiCisjaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCisjaW5jbHVkZSAiSU9Qcm9maWxlLmgiCisjaW5jbHVkZSAiQXVkaW9HYWluLmgiCisjaW5jbHVkZSA8QXVkaW9PdXRwdXREZXNjcmlwdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordm9pZCBBdWRpb1BvbGljeU1peDo6c2V0T3V0cHV0KHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmb3V0cHV0KQoreworICAgIG1PdXRwdXQgPSBvdXRwdXQ7Cit9CisKK2NvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmQXVkaW9Qb2xpY3lNaXg6OmdldE91dHB1dCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1PdXRwdXQ7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNaXg6OmNsZWFyT3V0cHV0KCkKK3sKKyAgICBtT3V0cHV0LmNsZWFyKCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNaXg6OnNldE1peChBdWRpb01peCAmbWl4KQoreworICAgIG1NaXggPSBtaXg7Cit9CisKK2FuZHJvaWQ6OkF1ZGlvTWl4ICpBdWRpb1BvbGljeU1peDo6Z2V0TWl4KCkKK3sKKyAgICByZXR1cm4gJm1NaXg7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6cmVnaXN0ZXJNaXgoU3RyaW5nOCBhZGRyZXNzLCBBdWRpb01peCBtaXgpCit7CisgICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoYWRkcmVzcyk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgQUxPR0UoInJlZ2lzdGVyUG9saWN5TWl4ZXMoKTogbWl4IGZvciBhZGRyZXNzICVzIGFscmVhZHkgcmVnaXN0ZXJlZCIsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gbmV3IEF1ZGlvUG9saWN5TWl4KCk7CisgICAgcG9saWN5TWl4LT5zZXRNaXgobWl4KTsKKyAgICBhZGQoYWRkcmVzcywgcG9saWN5TWl4KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6dW5yZWdpc3Rlck1peChTdHJpbmc4IGFkZHJlc3MpCit7CisgICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoYWRkcmVzcyk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgidW5yZWdpc3RlclBvbGljeU1peGVzKCk6IG1peCBmb3IgYWRkcmVzcyAlcyBub3QgcmVnaXN0ZXJlZCIsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJlbW92ZUl0ZW1zQXQoaW5kZXgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpnZXRBdWRpb1BvbGljeU1peChTdHJpbmc4IGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiAmcG9saWN5TWl4KSBjb25zdAoreworICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KGFkZHJlc3MpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR0UoInVucmVnaXN0ZXJQb2xpY3lNaXhlcygpOiBtaXggZm9yIGFkZHJlc3MgJXMgbm90IHJlZ2lzdGVyZWQiLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcG9saWN5TWl4ID0gdmFsdWVBdChpbmRleCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Y2xvc2VPdXRwdXQoc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZkZXNjKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peCA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmIChwb2xpY3lNaXgtPmdldE91dHB1dCgpID09IGRlc2MpIHsKKyAgICAgICAgICAgIHBvbGljeU1peC0+Y2xlYXJPdXRwdXQoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpnZXRPdXRwdXRGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmZGVzYykKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSB2YWx1ZUF0KGkpOworICAgICAgICBBdWRpb01peCAqbWl4ID0gcG9saWN5TWl4LT5nZXRNaXgoKTsKKworICAgICAgICBpZiAobWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1peC0+bUNyaXRlcmlhLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKChSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRSA9PSBtaXgtPm1Dcml0ZXJpYVtqXS5tUnVsZSAmJgorICAgICAgICAgICAgICAgICAgICAgbWl4LT5tQ3JpdGVyaWFbal0ubUF0dHIubVVzYWdlID09IGF0dHJpYnV0ZXMudXNhZ2UpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoUlVMRV9FWENMVURFX0FUVFJJQlVURV9VU0FHRSA9PSBtaXgtPm1Dcml0ZXJpYVtqXS5tUnVsZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1BdHRyLm1Vc2FnZSAhPSBhdHRyaWJ1dGVzLnVzYWdlKSkgeworICAgICAgICAgICAgICAgICAgICBkZXNjID0gcG9saWN5TWl4LT5nZXRPdXRwdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKGF0dHJpYnV0ZXMudGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJuY21wKGF0dHJpYnV0ZXMudGFncyArIHN0cmxlbigiYWRkcj0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tUmVnaXN0cmF0aW9uSWQuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIHN0cmxlbigiYWRkcj0iKSAtIDEpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZGVzYyA9IHBvbGljeU1peC0+Z2V0T3V0cHV0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgeworICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZXMudXNhZ2UgPT0gQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UgJiYKKyAgICAgICAgICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBzdHJuY21wKGF0dHJpYnV0ZXMudGFncyArIHN0cmxlbigiYWRkcj0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXgtPm1SZWdpc3RyYXRpb25JZC5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSBzdHJsZW4oImFkZHI9IikgLSAxKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZGVzYyA9IHBvbGljeU1peC0+Z2V0T3V0cHV0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlc2MgIT0gMCkgeworICAgICAgICAgICAgZGVzYy0+bVBvbGljeU1peCA9IG1peDsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCAqKnBvbGljeU1peCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIEF1ZGlvTWl4ICptaXggPSB2YWx1ZUF0KGkpLT5nZXRNaXgoKTsKKworICAgICAgICBpZiAobWl4LT5tTWl4VHlwZSAhPSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbWl4LT5tQ3JpdGVyaWEuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIGlmICgoUlVMRV9NQVRDSF9BVFRSSUJVVEVfQ0FQVFVSRV9QUkVTRVQgPT0gbWl4LT5tQ3JpdGVyaWFbal0ubVJ1bGUgJiYKKyAgICAgICAgICAgICAgICAgICAgbWl4LT5tQ3JpdGVyaWFbal0ubUF0dHIubVNvdXJjZSA9PSBpbnB1dFNvdXJjZSkgfHwKKyAgICAgICAgICAgICAgIChSVUxFX0VYQ0xVREVfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUID09IG1peC0+bUNyaXRlcmlhW2pdLm1SdWxlICYmCisgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1BdHRyLm1Tb3VyY2UgIT0gaW5wdXRTb3VyY2UpKSB7CisgICAgICAgICAgICAgICAgaWYgKGF2YWlsRGV2aWNlcyAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb2xpY3lNaXggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBvbGljeU1peCA9IG1peDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpnZXRJbnB1dE1peEZvckF0dHIoYXVkaW9fYXR0cmlidXRlc190IGF0dHIsIEF1ZGlvTWl4ICoqcG9saWN5TWl4KQoreworICAgIGlmIChzdHJuY21wKGF0dHIudGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIFN0cmluZzggYWRkcmVzcyhhdHRyLnRhZ3MgKyBzdHJsZW4oImFkZHI9IikpOworCisgICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoYWRkcmVzcyk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygiZ2V0SW5wdXRNaXhGb3JBdHRyKCkgbm8gcG9saWN5IGZvciBhZGRyZXNzICVzIiwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBhdWRpb1BvbGljeU1peCA9IHZhbHVlQXQoaW5kZXgpOworICAgIEF1ZGlvTWl4ICptaXggPSBhdWRpb1BvbGljeU1peC0+Z2V0TWl4KCk7CisKKyAgICBpZiAobWl4LT5tTWl4VHlwZSAhPSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgIEFMT0dXKCJnZXRJbnB1dE1peEZvckF0dHIoKSBiYWQgcG9saWN5IG1peCB0eXBlIGZvciBhZGRyZXNzICVzIiwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgICpwb2xpY3lNaXggPSBtaXg7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvcnQuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTI0ZjE5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb3J0LmNwcApAQCAtMCwwICsxLDkyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvcnQiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KKyNpbmNsdWRlICJBdWRpb1BvcnQuaCIKKyNpbmNsdWRlICJId01vZHVsZS5oIgorI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgorI2luY2x1ZGUgIkNvbmZpZ1BhcnNpbmdVdGlscy5oIgorI2luY2x1ZGUgImF1ZGlvX3BvbGljeV9jb25mLmgiCisjaW5jbHVkZSA8cG9saWN5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworaW50MzJfdCB2b2xhdGlsZSBBdWRpb1BvcnQ6Om1OZXh0VW5pcXVlSWQgPSAxOworCisvLyAtLS0gQXVkaW9Qb3J0IGNsYXNzIGltcGxlbWVudGF0aW9uCisKK0F1ZGlvUG9ydDo6QXVkaW9Qb3J0KGNvbnN0IFN0cmluZzgmIG5hbWUsIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCByb2xlKSA6CisgICAgbU5hbWUobmFtZSksIG1UeXBlKHR5cGUpLCBtUm9sZShyb2xlKSwgbUZsYWdzKDApCit7CisgICAgbVVzZUluQ2hhbm5lbE1hc2sgPSAoKHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgJiYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkpIHx8CisgICAgICAgICAgICAgICAgICAgICgodHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSAmJiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykpOworfQorCit2b2lkIEF1ZGlvUG9ydDo6YXR0YWNoKGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKQoreworICAgIG1Nb2R1bGUgPSBtb2R1bGU7Cit9CisKK2F1ZGlvX3BvcnRfaGFuZGxlX3QgQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKQoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxhdWRpb19wb3J0X2hhbmRsZV90PihhbmRyb2lkX2F0b21pY19pbmMoJm1OZXh0VW5pcXVlSWQpKTsKK30KKworYXVkaW9fbW9kdWxlX2hhbmRsZV90IEF1ZGlvUG9ydDo6Z2V0TW9kdWxlSGFuZGxlKCkgY29uc3QKK3sKKyAgICBpZiAobU1vZHVsZSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gbU1vZHVsZS0+bUhhbmRsZTsKK30KKwordWludDMyX3QgQXVkaW9Qb3J0OjpnZXRNb2R1bGVWZXJzaW9uKCkgY29uc3QKK3sKKyAgICBpZiAobU1vZHVsZSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gbU1vZHVsZS0+bUhhbFZlcnNpb247Cit9CisKK2NvbnN0IGNoYXIgKkF1ZGlvUG9ydDo6Z2V0TW9kdWxlTmFtZSgpIGNvbnN0Cit7CisgICAgaWYgKG1Nb2R1bGUgPT0gMCkgeworICAgICAgICByZXR1cm4gIiI7CisgICAgfQorICAgIHJldHVybiBtTW9kdWxlLT5tTmFtZTsKK30KKwordm9pZCBBdWRpb1BvcnQ6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdAoreworICAgIHBvcnQtPnJvbGUgPSBtUm9sZTsKKyAgICBwb3J0LT50eXBlID0gbVR5cGU7CisgICAgc3RybGNweShwb3J0LT5uYW1lLCBtTmFtZSwgQVVESU9fUE9SVF9NQVhfTkFNRV9MRU4pOworICAgIHVuc2lnbmVkIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCkgJiYgaSA8IEFVRElPX1BPUlRfTUFYX1NBTVBMSU5HX1JBVEVTOyBpKyspIHsKKyAgICAgICAgaWYgKG1TYW1wbGluZ1JhdGVzW2ldICE9IDApIHsKKyAgICAgICAgICAgIHBvcnQtPnNhbXBsZV9yYXRlc1tpXSA9IG1TYW1wbGluZ1JhdGVzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHBvcnQtPm51bV9zYW1wbGVfcmF0ZXMgPSBpOworICAgIGZvciAoaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKSAmJiBpIDwgQVVESU9fUE9SVF9NQVhfQ0hBTk5FTF9NQVNLUzsgaSsrKSB7CisgICAgICAgIGlmIChtQ2hhbm5lbE1hc2tzW2ldICE9IDApIHsKKyAgICAgICAgICAgIHBvcnQtPmNoYW5uZWxfbWFza3NbaV0gPSBtQ2hhbm5lbE1hc2tzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHBvcnQtPm51bV9jaGFubmVsX21hc2tzID0gaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbUZvcm1hdHMuc2l6ZSgpICYmIGkgPCBBVURJT19QT1JUX01BWF9GT1JNQVRTOyBpKyspIHsKKyAgICAgICAgaWYgKG1Gb3JtYXRzW2ldICE9IDApIHsKKyAgICAgICAgICAgIHBvcnQtPmZvcm1hdHNbaV0gPSBtRm9ybWF0c1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwb3J0LT5udW1fZm9ybWF0cyA9IGk7CisKKyAgICBBTE9HVigiQXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydCgpIG51bSBnYWlucyAlenUiLCBtR2FpbnMuc2l6ZSgpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBtR2FpbnMuc2l6ZSgpICYmIGkgPCBBVURJT19QT1JUX01BWF9HQUlOUzsgaSsrKSB7CisgICAgICAgIHBvcnQtPmdhaW5zW2ldID0gbUdhaW5zW2ldLT5tR2FpbjsKKyAgICB9CisgICAgcG9ydC0+bnVtX2dhaW5zID0gaTsKK30KKwordm9pZCBBdWRpb1BvcnQ6OmltcG9ydEF1ZGlvUG9ydChjb25zdCBzcDxBdWRpb1BvcnQ+IHBvcnQpIHsKKyAgICBmb3IgKHNpemVfdCBrID0gMCA7IGsgPCBwb3J0LT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgOyBrKyspIHsKKyAgICAgICAgY29uc3QgdWludDMyX3QgcmF0ZSA9IHBvcnQtPm1TYW1wbGluZ1JhdGVzLml0ZW1BdChrKTsKKyAgICAgICAgaWYgKHJhdGUgIT0gMCkgeyAvLyBza2lwICJkeW5hbWljIiByYXRlcworICAgICAgICAgICAgYm9vbCBoYXNSYXRlID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBsID0gMCA7IGwgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCkgOyBsKyspIHsKKyAgICAgICAgICAgICAgICBpZiAocmF0ZSA9PSBtU2FtcGxpbmdSYXRlcy5pdGVtQXQobCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFzUmF0ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaGFzUmF0ZSkgeyAvLyBuZXZlciBpbXBvcnQgYSBzYW1wbGluZyByYXRlIHR3aWNlCisgICAgICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZXMuYWRkKHJhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvciAoc2l6ZV90IGsgPSAwIDsgayA8IHBvcnQtPm1DaGFubmVsTWFza3Muc2l6ZSgpIDsgaysrKSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IG1hc2sgPSBwb3J0LT5tQ2hhbm5lbE1hc2tzLml0ZW1BdChrKTsKKyAgICAgICAgaWYgKG1hc2sgIT0gMCkgeyAvLyBza2lwICJkeW5hbWljIiBtYXNrcworICAgICAgICAgICAgYm9vbCBoYXNNYXNrID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBsID0gMCA7IGwgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKSA7IGwrKykgeworICAgICAgICAgICAgICAgIGlmIChtYXNrID09IG1DaGFubmVsTWFza3MuaXRlbUF0KGwpKSB7CisgICAgICAgICAgICAgICAgICAgIGhhc01hc2sgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWhhc01hc2spIHsgLy8gbmV2ZXIgaW1wb3J0IGEgY2hhbm5lbCBtYXNrIHR3aWNlCisgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrcy5hZGQobWFzayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChzaXplX3QgayA9IDAgOyBrIDwgcG9ydC0+bUZvcm1hdHMuc2l6ZSgpIDsgaysrKSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IHBvcnQtPm1Gb3JtYXRzLml0ZW1BdChrKTsKKyAgICAgICAgaWYgKGZvcm1hdCAhPSAwKSB7IC8vIHNraXAgImR5bmFtaWMiIGZvcm1hdHMKKyAgICAgICAgICAgIGJvb2wgaGFzRm9ybWF0ID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBsID0gMCA7IGwgPCBtRm9ybWF0cy5zaXplKCkgOyBsKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ID09IG1Gb3JtYXRzLml0ZW1BdChsKSkgeworICAgICAgICAgICAgICAgICAgICBoYXNGb3JtYXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWhhc0Zvcm1hdCkgeyAvLyBuZXZlciBpbXBvcnQgYSBmb3JtYXQgdHdpY2UKKyAgICAgICAgICAgICAgICBtRm9ybWF0cy5hZGQoZm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1BvcnQ6OmNsZWFyQ2FwYWJpbGl0aWVzKCkgeworICAgIG1DaGFubmVsTWFza3MuY2xlYXIoKTsKKyAgICBtRm9ybWF0cy5jbGVhcigpOworICAgIG1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7Cit9CisKK3ZvaWQgQXVkaW9Qb3J0Ojpsb2FkU2FtcGxpbmdSYXRlcyhjaGFyICpuYW1lKQoreworICAgIGNoYXIgKnN0ciA9IHN0cnRvayhuYW1lLCAifCIpOworCisgICAgLy8gYnkgY29udmVudGlvbiwgIjAnIGluIHRoZSBmaXJzdCBlbnRyeSBpbiBtU2FtcGxpbmdSYXRlcyBpbmRpY2F0ZXMgdGhlIHN1cHBvcnRlZCBzYW1wbGluZworICAgIC8vIHJhdGVzIHNob3VsZCBiZSByZWFkIGZyb20gdGhlIG91dHB1dCBzdHJlYW0gYWZ0ZXIgaXQgaXMgb3BlbmVkIGZvciB0aGUgZmlyc3QgdGltZQorICAgIGlmIChzdHIgIT0gTlVMTCAmJiBzdHJjbXAoc3RyLCBEWU5BTUlDX1ZBTFVFX1RBRykgPT0gMCkgeworICAgICAgICBtU2FtcGxpbmdSYXRlcy5hZGQoMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgdWludDMyX3QgcmF0ZSA9IGF0b2koc3RyKTsKKyAgICAgICAgaWYgKHJhdGUgIT0gMCkgeworICAgICAgICAgICAgQUxPR1YoImxvYWRTYW1wbGluZ1JhdGVzKCkgYWRkaW5nIHJhdGUgJWQiLCByYXRlKTsKKyAgICAgICAgICAgIG1TYW1wbGluZ1JhdGVzLmFkZChyYXRlKTsKKyAgICAgICAgfQorICAgICAgICBzdHIgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb3J0Ojpsb2FkRm9ybWF0cyhjaGFyICpuYW1lKQoreworICAgIGNoYXIgKnN0ciA9IHN0cnRvayhuYW1lLCAifCIpOworCisgICAgLy8gYnkgY29udmVudGlvbiwgIjAnIGluIHRoZSBmaXJzdCBlbnRyeSBpbiBtRm9ybWF0cyBpbmRpY2F0ZXMgdGhlIHN1cHBvcnRlZCBmb3JtYXRzCisgICAgLy8gc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgb3V0cHV0IHN0cmVhbSBhZnRlciBpdCBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lCisgICAgaWYgKHN0ciAhPSBOVUxMICYmIHN0cmNtcChzdHIsIERZTkFNSUNfVkFMVUVfVEFHKSA9PSAwKSB7CisgICAgICAgIG1Gb3JtYXRzLmFkZChBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGF1ZGlvX2Zvcm1hdF90KUNvbmZpZ1BhcnNpbmdVdGlsczo6c3RyaW5nVG9FbnVtKHNGb3JtYXROYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRm9ybWF0TmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgICAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICBtRm9ybWF0cy5hZGQoZm9ybWF0KTsKKyAgICAgICAgfQorICAgICAgICBzdHIgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICB9CisgICAgLy8gd2Ugc29ydCBmcm9tIHdvcnN0IHRvIGJlc3QsIHNvIHRoYXQgQVVESU9fRk9STUFUX0RFRkFVTFQgaXMgYWx3YXlzIHRoZSBmaXJzdCBlbnRyeS4KKyAgICAvLyBUT0RPOiBjb21wYXJlRm9ybWF0cyBjb3VsZCBiZSBhIGxhbWJkYSB0byBjb252ZXJ0IGJldHdlZW4gcG9pbnRlci10by1mb3JtYXQgdG8gZm9ybWF0OgorICAgIC8vIFtdKGNvbnN0IGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQxLCBjb25zdCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0MikgeworICAgIC8vICAgICByZXR1cm4gY29tcGFyZUZvcm1hdHMoKmZvcm1hdDEsICpmb3JtYXQyKTsKKyAgICAvLyB9CisgICAgbUZvcm1hdHMuc29ydChjb21wYXJlRm9ybWF0cyk7Cit9CisKK3ZvaWQgQXVkaW9Qb3J0Ojpsb2FkSW5DaGFubmVscyhjaGFyICpuYW1lKQoreworICAgIGNvbnN0IGNoYXIgKnN0ciA9IHN0cnRvayhuYW1lLCAifCIpOworCisgICAgQUxPR1YoImxvYWRJbkNoYW5uZWxzKCkgJXMiLCBuYW1lKTsKKworICAgIGlmIChzdHIgIT0gTlVMTCAmJiBzdHJjbXAoc3RyLCBEWU5BTUlDX1ZBTFVFX1RBRykgPT0gMCkgeworICAgICAgICBtQ2hhbm5lbE1hc2tzLmFkZCgwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlIChzdHIgIT0gTlVMTCkgeworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9CisgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KUNvbmZpZ1BhcnNpbmdVdGlsczo6c3RyaW5nVG9FbnVtKHNJbkNoYW5uZWxzTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzSW5DaGFubmVsc05hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgICAgICBpZiAoY2hhbm5lbE1hc2sgPT0gMCkgeyAvLyBpZiBub3QgZm91bmQsIGNoZWNrIHRoZSBjaGFubmVsIGluZGV4IHRhYmxlCisgICAgICAgICAgICBjaGFubmVsTWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdCkKKyAgICAgICAgICAgICAgICAgICAgICBDb25maWdQYXJzaW5nVXRpbHM6OnN0cmluZ1RvRW51bShzSW5kZXhDaGFubmVsc05hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0luZGV4Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hhbm5lbE1hc2sgIT0gMCkgeworICAgICAgICAgICAgQUxPR1YoImxvYWRJbkNoYW5uZWxzKCkgYWRkaW5nIGNoYW5uZWxNYXNrICUjeCIsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgIG1DaGFubmVsTWFza3MuYWRkKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgfQorICAgICAgICBzdHIgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb3J0Ojpsb2FkT3V0Q2hhbm5lbHMoY2hhciAqbmFtZSkKK3sKKyAgICBjb25zdCBjaGFyICpzdHIgPSBzdHJ0b2sobmFtZSwgInwiKTsKKworICAgIEFMT0dWKCJsb2FkT3V0Q2hhbm5lbHMoKSAlcyIsIG5hbWUpOworCisgICAgLy8gYnkgY29udmVudGlvbiwgIjAnIGluIHRoZSBmaXJzdCBlbnRyeSBpbiBtQ2hhbm5lbE1hc2tzIGluZGljYXRlcyB0aGUgc3VwcG9ydGVkIGNoYW5uZWwKKyAgICAvLyBtYXNrcyBzaG91bGQgYmUgcmVhZCBmcm9tIHRoZSBvdXRwdXQgc3RyZWFtIGFmdGVyIGl0IGlzIG9wZW5lZCBmb3IgdGhlIGZpcnN0IHRpbWUKKyAgICBpZiAoc3RyICE9IE5VTEwgJiYgc3RyY21wKHN0ciwgRFlOQU1JQ19WQUxVRV9UQUcpID09IDApIHsKKyAgICAgICAgbUNoYW5uZWxNYXNrcy5hZGQoMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB3aGlsZSAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPQorICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdClDb25maWdQYXJzaW5nVXRpbHM6OnN0cmluZ1RvRW51bShzT3V0Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKHNPdXRDaGFubmVsc05hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIpOworICAgICAgICBpZiAoY2hhbm5lbE1hc2sgPT0gMCkgeyAvLyBpZiBub3QgZm91bmQsIGNoZWNrIHRoZSBjaGFubmVsIGluZGV4IHRhYmxlCisgICAgICAgICAgICBjaGFubmVsTWFzayA9IChhdWRpb19jaGFubmVsX21hc2tfdCkKKyAgICAgICAgICAgICAgICAgICAgICBDb25maWdQYXJzaW5nVXRpbHM6OnN0cmluZ1RvRW51bShzSW5kZXhDaGFubmVsc05hbWVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0luZGV4Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hhbm5lbE1hc2sgIT0gMCkgeworICAgICAgICAgICAgbUNoYW5uZWxNYXNrcy5hZGQoY2hhbm5lbE1hc2spOworICAgICAgICB9CisgICAgICAgIHN0ciA9IHN0cnRvayhOVUxMLCAifCIpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK2F1ZGlvX2dhaW5fbW9kZV90IEF1ZGlvUG9ydDo6bG9hZEdhaW5Nb2RlKGNoYXIgKm5hbWUpCit7CisgICAgY29uc3QgY2hhciAqc3RyID0gc3RydG9rKG5hbWUsICJ8Iik7CisKKyAgICBBTE9HVigibG9hZEdhaW5Nb2RlKCkgJXMiLCBuYW1lKTsKKyAgICBhdWRpb19nYWluX21vZGVfdCBtb2RlID0gMDsKKyAgICB3aGlsZSAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgbW9kZSB8PSAoYXVkaW9fZ2Fpbl9tb2RlX3QpQ29uZmlnUGFyc2luZ1V0aWxzOjpzdHJpbmdUb0VudW0oc0dhaW5Nb2RlTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzR2Fpbk1vZGVOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKKyAgICAgICAgc3RyID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgfQorICAgIHJldHVybiBtb2RlOworfQorCit2b2lkIEF1ZGlvUG9ydDo6bG9hZEdhaW4oY25vZGUgKnJvb3QsIGludCBpbmRleCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworCisgICAgc3A8QXVkaW9HYWluPiBnYWluID0gbmV3IEF1ZGlvR2FpbihpbmRleCwgbVVzZUluQ2hhbm5lbE1hc2spOworCisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01PREUpID09IDApIHsKKyAgICAgICAgICAgIGdhaW4tPm1HYWluLm1vZGUgPSBsb2FkR2Fpbk1vZGUoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fQ0hBTk5FTFMpID09IDApIHsKKyAgICAgICAgICAgIGlmIChtVXNlSW5DaGFubmVsTWFzaykgeworICAgICAgICAgICAgICAgIGdhaW4tPm1HYWluLmNoYW5uZWxfbWFzayA9CisgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpQ29uZmlnUGFyc2luZ1V0aWxzOjpzdHJpbmdUb0VudW0oc0luQ2hhbm5lbHNOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0luQ2hhbm5lbHNOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ2Fpbi0+bUdhaW4uY2hhbm5lbF9tYXNrID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdClDb25maWdQYXJzaW5nVXRpbHM6OnN0cmluZ1RvRW51bShzT3V0Q2hhbm5lbHNOYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc091dENoYW5uZWxzTmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUlOX1ZBTFVFKSA9PSAwKSB7CisgICAgICAgICAgICBnYWluLT5tR2Fpbi5taW5fdmFsdWUgPSBhdG9pKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01BWF9WQUxVRSkgPT0gMCkgeworICAgICAgICAgICAgZ2Fpbi0+bUdhaW4ubWF4X3ZhbHVlID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9ERUZBVUxUX1ZBTFVFKSA9PSAwKSB7CisgICAgICAgICAgICBnYWluLT5tR2Fpbi5kZWZhdWx0X3ZhbHVlID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9TVEVQX1ZBTFVFKSA9PSAwKSB7CisgICAgICAgICAgICBnYWluLT5tR2Fpbi5zdGVwX3ZhbHVlID0gYXRvaSgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NSU5fUkFNUF9NUykgPT0gMCkgeworICAgICAgICAgICAgZ2Fpbi0+bUdhaW4ubWluX3JhbXBfbXMgPSBhdG9pKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01BWF9SQU1QX01TKSA9PSAwKSB7CisgICAgICAgICAgICBnYWluLT5tR2Fpbi5tYXhfcmFtcF9tcyA9IGF0b2koKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorCisgICAgQUxPR1YoImxvYWRHYWluKCkgYWRkaW5nIG5ldyBnYWluIG1vZGUgJTA4eCBjaGFubmVsIG1hc2sgJTA4eCBtaW4gbUIgJWQgbWF4IG1CICVkIiwKKyAgICAgICAgICBnYWluLT5tR2Fpbi5tb2RlLCBnYWluLT5tR2Fpbi5jaGFubmVsX21hc2ssIGdhaW4tPm1HYWluLm1pbl92YWx1ZSwgZ2Fpbi0+bUdhaW4ubWF4X3ZhbHVlKTsKKworICAgIGlmIChnYWluLT5tR2Fpbi5tb2RlID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtR2FpbnMuYWRkKGdhaW4pOworfQorCit2b2lkIEF1ZGlvUG9ydDo6bG9hZEdhaW5zKGNub2RlICpyb290KQoreworICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBBTE9HVigibG9hZEdhaW5zKCkgbG9hZGluZyBnYWluICVzIiwgbm9kZS0+bmFtZSk7CisgICAgICAgIGxvYWRHYWluKG5vZGUsIGluZGV4KyspOworICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9ydDo6Y2hlY2tFeGFjdFNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUpIGNvbnN0Cit7CisgICAgaWYgKG1TYW1wbGluZ1JhdGVzLmlzRW1wdHkoKSkgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgaWYgKG1TYW1wbGluZ1JhdGVzW2ldID09IHNhbXBsaW5nUmF0ZSkgeworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9ydDo6Y2hlY2tDb21wYXRpYmxlU2FtcGxpbmdSYXRlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgdWludDMyX3QgKnVwZGF0ZWRTYW1wbGluZ1JhdGUpIGNvbnN0Cit7CisgICAgaWYgKG1TYW1wbGluZ1JhdGVzLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAodXBkYXRlZFNhbXBsaW5nUmF0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAqdXBkYXRlZFNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgLy8gU2VhcmNoIGZvciB0aGUgY2xvc2VzdCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZSB0aGF0IGlzIGFib3ZlIChwcmVmZXJyZWQpCisgICAgLy8gb3IgYmVsb3cgKGFjY2VwdGFibGUpIHRoZSBkZXNpcmVkIHNhbXBsaW5nIHJhdGUsIHdpdGhpbiBhIHBlcm1pdHRlZCByYXRpby4KKyAgICAvLyBUaGUgc2FtcGxpbmcgcmF0ZXMgZG8gbm90IG5lZWQgdG8gYmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4KKyAgICBzc2l6ZV90IG1heEJlbG93ID0gLTE7CisgICAgc3NpemVfdCBtaW5BYm92ZSA9IC0xOworICAgIHVpbnQzMl90IGNhbmRpZGF0ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNhbmRpZGF0ZSA9IG1TYW1wbGluZ1JhdGVzW2ldOworICAgICAgICBpZiAoY2FuZGlkYXRlID09IHNhbXBsaW5nUmF0ZSkgeworICAgICAgICAgICAgaWYgKHVwZGF0ZWRTYW1wbGluZ1JhdGUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICp1cGRhdGVkU2FtcGxpbmdSYXRlID0gY2FuZGlkYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIC8vIGNhbmRpZGF0ZSA8IGRlc2lyZWQKKyAgICAgICAgaWYgKGNhbmRpZGF0ZSA8IHNhbXBsaW5nUmF0ZSkgeworICAgICAgICAgICAgaWYgKG1heEJlbG93IDwgMCB8fCBjYW5kaWRhdGUgPiBtU2FtcGxpbmdSYXRlc1ttYXhCZWxvd10pIHsKKyAgICAgICAgICAgICAgICBtYXhCZWxvdyA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIC8vIGNhbmRpZGF0ZSA+IGRlc2lyZWQKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtaW5BYm92ZSA8IDAgfHwgY2FuZGlkYXRlIDwgbVNhbXBsaW5nUmF0ZXNbbWluQWJvdmVdKSB7CisgICAgICAgICAgICAgICAgbWluQWJvdmUgPSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gUHJlZmVyIHRvIGRvd24tc2FtcGxlIGZyb20gYSBoaWdoZXIgc2FtcGxpbmcgcmF0ZSwgYXMgd2UgZ2V0IHRoZSBkZXNpcmVkIGZyZXF1ZW5jeSBzcGVjdHJ1bS4KKyAgICBpZiAobWluQWJvdmUgPj0gMCkgeworICAgICAgICBjYW5kaWRhdGUgPSBtU2FtcGxpbmdSYXRlc1ttaW5BYm92ZV07CisgICAgICAgIGlmIChjYW5kaWRhdGUgLyBBVURJT19SRVNBTVBMRVJfRE9XTl9SQVRJT19NQVggPD0gc2FtcGxpbmdSYXRlKSB7CisgICAgICAgICAgICBpZiAodXBkYXRlZFNhbXBsaW5nUmF0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKnVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBjYW5kaWRhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gQnV0IGlmIHdlIGhhdmUgdG8gdXAtc2FtcGxlIGZyb20gYSBsb3dlciBzYW1wbGluZyByYXRlLCB0aGF0J3MgT0suCisgICAgaWYgKG1heEJlbG93ID49IDApIHsKKyAgICAgICAgY2FuZGlkYXRlID0gbVNhbXBsaW5nUmF0ZXNbbWF4QmVsb3ddOworICAgICAgICBpZiAoY2FuZGlkYXRlICogQVVESU9fUkVTQU1QTEVSX1VQX1JBVElPX01BWCA+PSBzYW1wbGluZ1JhdGUpIHsKKyAgICAgICAgICAgIGlmICh1cGRhdGVkU2FtcGxpbmdSYXRlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAqdXBkYXRlZFNhbXBsaW5nUmF0ZSA9IGNhbmRpZGF0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBsZWF2ZSB1cGRhdGVkU2FtcGxpbmdSYXRlIHVubW9kaWZpZWQKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCBBdWRpb1BvcnQ6OmNoZWNrRXhhY3RDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgY29uc3QKK3sKKyAgICBpZiAobUNoYW5uZWxNYXNrcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUNoYW5uZWxNYXNrc1tpXSA9PSBjaGFubmVsTWFzaykgeworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9ydDo6Y2hlY2tDb21wYXRpYmxlQ2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICp1cGRhdGVkQ2hhbm5lbE1hc2spIGNvbnN0Cit7CisgICAgaWYgKG1DaGFubmVsTWFza3MuaXNFbXB0eSgpKSB7CisgICAgICAgIGlmICh1cGRhdGVkQ2hhbm5lbE1hc2sgIT0gTlVMTCkgeworICAgICAgICAgICAgKnVwZGF0ZWRDaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBjb25zdCBib29sIGlzUmVjb3JkVGhyZWFkID0gbVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCAmJiBtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSzsKKyAgICBjb25zdCBib29sIGlzSW5kZXggPSBhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKGNoYW5uZWxNYXNrKQorICAgICAgICAgICAgPT0gQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9JTkRFWDsKKyAgICBpbnQgYmVzdE1hdGNoID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHN1cHBvcnRlZCA9IG1DaGFubmVsTWFza3NbaV07CisgICAgICAgIGlmIChzdXBwb3J0ZWQgPT0gY2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgIC8vIEV4YWN0IG1hdGNoZXMgYWx3YXlzIHRha2VuLgorICAgICAgICAgICAgaWYgKHVwZGF0ZWRDaGFubmVsTWFzayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKnVwZGF0ZWRDaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgLy8gQVVESU9fQ0hBTk5FTF9OT05FICh2YWx1ZTogMCkgaXMgdXNlZCBmb3IgZHluYW1pYyBjaGFubmVsIHN1cHBvcnQKKyAgICAgICAgaWYgKGlzUmVjb3JkVGhyZWFkICYmIHN1cHBvcnRlZCAhPSBBVURJT19DSEFOTkVMX05PTkUpIHsKKyAgICAgICAgICAgIC8vIEFwcHJveGltYXRlIChiZXN0KSBtYXRjaDoKKyAgICAgICAgICAgIC8vIFRoZSBtYXRjaCBzY29yZSBtZWFzdXJlcyBob3cgd2VsbCB0aGUgc3VwcG9ydGVkIGNoYW5uZWwgbWFzayBtYXRjaGVzIHRoZQorICAgICAgICAgICAgLy8gZGVzaXJlZCBtYXNrLCB3aGVyZSBpbmNyZWFzaW5nLWlzLWJldHRlci4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUT0RPOiBTb21lIHR3ZWFrcyBtYXkgYmUgbmVlZGVkLgorICAgICAgICAgICAgLy8gU2hvdWxkIGJlIGEgc3RhdGljIGZ1bmN0aW9uIG9mIHRoZSBkYXRhIHByb2Nlc3NpbmcgbGlicmFyeS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJbiBwcmlvcml0eToKKyAgICAgICAgICAgIC8vIG1hdGNoIHNjb3JlID0gMTAwMCBpZiBsZWdhY3kgY2hhbm5lbCBjb252ZXJzaW9uIGVxdWl2YWxlbnQgKGFsd2F5cyBwcmVmZXIgdGhpcykKKyAgICAgICAgICAgIC8vIE9SCisgICAgICAgICAgICAvLyBtYXRjaCBzY29yZSArPSAxMDAgaWYgdGhlIGNoYW5uZWwgbWFzayByZXByZXNlbnRhdGlvbnMgbWF0Y2gKKyAgICAgICAgICAgIC8vIG1hdGNoIHNjb3JlICs9IG51bWJlciBvZiBjaGFubmVscyBtYXRjaGVkLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBtYXRjaGVkIGNoYW5uZWxzLCB0aGUgbWFzayBtYXkgc3RpbGwgYmUgYWNjZXB0ZWQKKyAgICAgICAgICAgIC8vIGJ1dCB0aGUgcGxheWJhY2sgb3IgcmVjb3JkIHdpbGwgYmUgc2lsZW50LgorICAgICAgICAgICAgY29uc3QgYm9vbCBpc1N1cHBvcnRlZEluZGV4ID0gKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24oc3VwcG9ydGVkKQorICAgICAgICAgICAgICAgICAgICA9PSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX0lOREVYKTsKKyAgICAgICAgICAgIGludCBtYXRjaDsKKyAgICAgICAgICAgIGlmIChpc0luZGV4ICYmIGlzU3VwcG9ydGVkSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBpbmRleCBlcXVpdmFsZW5jZQorICAgICAgICAgICAgICAgIG1hdGNoID0gMTAwICsgX19idWlsdGluX3BvcGNvdW50KAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKHN1cHBvcnRlZCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpc0luZGV4ICYmICFpc1N1cHBvcnRlZEluZGV4KSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgZXF1aXZhbGVudEJpdHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soc3VwcG9ydGVkKSkgLSAxIDsKKyAgICAgICAgICAgICAgICBtYXRjaCA9IF9fYnVpbHRpbl9wb3Bjb3VudCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykgJiBlcXVpdmFsZW50Qml0cyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0luZGV4ICYmIGlzU3VwcG9ydGVkSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBlcXVpdmFsZW50Qml0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzaykpIC0gMTsKKyAgICAgICAgICAgICAgICBtYXRjaCA9IF9fYnVpbHRpbl9wb3Bjb3VudCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGVxdWl2YWxlbnRCaXRzICYgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKHN1cHBvcnRlZCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbmFsIGVxdWl2YWxlbmNlCisgICAgICAgICAgICAgICAgbWF0Y2ggPSAxMDAgKyBfX2J1aWx0aW5fcG9wY291bnQoCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoY2hhbm5lbE1hc2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoc3VwcG9ydGVkKSk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSzoKKyAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPOgorICAgICAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTl9NT05PKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IDEwMDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX0lOX01PTk86CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOX1NURVJFTykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSAxMDAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYXRjaCA+IGJlc3RNYXRjaCkgeworICAgICAgICAgICAgICAgIGJlc3RNYXRjaCA9IG1hdGNoOworICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkQ2hhbm5lbE1hc2sgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAqdXBkYXRlZENoYW5uZWxNYXNrID0gc3VwcG9ydGVkOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsgLy8gYW55IG1hdGNoIHdpbGwgZG8gaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYmVzdE1hdGNoID4gMCA/IE5PX0VSUk9SIDogQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCBBdWRpb1BvcnQ6OmNoZWNrRXhhY3RGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAoreworICAgIGlmIChtRm9ybWF0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZvcm1hdHMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIGlmIChtRm9ybWF0c1tpXSA9PSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCBBdWRpb1BvcnQ6OmNoZWNrQ29tcGF0aWJsZUZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGF1ZGlvX2Zvcm1hdF90ICp1cGRhdGVkRm9ybWF0KQorICAgICAgICBjb25zdAoreworICAgIGlmIChtRm9ybWF0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKHVwZGF0ZWRGb3JtYXQgIT0gTlVMTCkgeworICAgICAgICAgICAgKnVwZGF0ZWRGb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIGNvbnN0IGJvb2wgY2hlY2tJbmV4YWN0ID0gLy8gd2hlbiBwb3J0IGlzIGlucHV0IGFuZCBmb3JtYXQgaXMgbGluZWFyIHBjbQorICAgICAgICAgICAgbVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCAmJiBtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSworICAgICAgICAgICAgJiYgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpOworCisgICAgLy8gaXRlcmF0ZSBmcm9tIGJlc3QgZm9ybWF0IHRvIHdvcnN0IGZvcm1hdCAocmV2ZXJzZSBvcmRlcikKKyAgICBmb3IgKHNzaXplX3QgaSA9IG1Gb3JtYXRzLnNpemUoKSAtIDE7IGkgPj0gMCA7IC0taSkgeworICAgICAgICBpZiAobUZvcm1hdHNbaV0gPT0gZm9ybWF0IHx8CisgICAgICAgICAgICAgICAgKGNoZWNrSW5leGFjdAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUZvcm1hdHNbaV0gIT0gQVVESU9fRk9STUFUX0RFRkFVTFQKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdHNbaV0pKSkgeworICAgICAgICAgICAgLy8gZm9yIGluZXhhY3QgY2hlY2tzIHdlIHRha2UgdGhlIGZpcnN0IGxpbmVhciBwY20gZm9ybWF0IGR1ZSB0byBzb3J0aW5nLgorICAgICAgICAgICAgaWYgKHVwZGF0ZWRGb3JtYXQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICp1cGRhdGVkRm9ybWF0ID0gbUZvcm1hdHNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKwordWludDMyX3QgQXVkaW9Qb3J0OjpwaWNrU2FtcGxpbmdSYXRlKCkgY29uc3QKK3sKKyAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHVuaW5pdGlhbGl6ZWQgZHluYW1pYyBwcm9maWxlCisgICAgaWYgKG1TYW1wbGluZ1JhdGVzLnNpemUoKSA9PSAxICYmIG1TYW1wbGluZ1JhdGVzWzBdID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gRm9yIGRpcmVjdCBvdXRwdXRzLCBwaWNrIG1pbmltdW0gc2FtcGxpbmcgcmF0ZTogdGhpcyBoZWxwcyBlbnN1cmluZyB0aGF0IHRoZQorICAgIC8vIGNoYW5uZWwgY291bnQgLyBzYW1wbGluZyByYXRlIGNvbWJpbmF0aW9uIGNob3NlbiB3aWxsIGJlIHN1cHBvcnRlZCBieSB0aGUgY29ubmVjdGVkCisgICAgLy8gc2luaworICAgIGlmICgobVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgJiYgKG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpICYmCisgICAgICAgICAgICAobUZsYWdzICYgKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpKSkgeworICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSBVSU5UX01BWDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkgKyspIHsKKyAgICAgICAgICAgIGlmICgobVNhbXBsaW5nUmF0ZXNbaV0gPCBzYW1wbGluZ1JhdGUpICYmIChtU2FtcGxpbmdSYXRlc1tpXSA+IDApKSB7CisgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlID0gbVNhbXBsaW5nUmF0ZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChzYW1wbGluZ1JhdGUgPT0gVUlOVF9NQVgpID8gMCA6IHNhbXBsaW5nUmF0ZTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUgPSAwOworICAgIHVpbnQzMl90IG1heFJhdGUgPSBNQVhfTUlYRVJfU0FNUExJTkdfUkFURTsKKworICAgIC8vIEZvciBtaXhlZCBvdXRwdXQgYW5kIGlucHV0cywgdXNlIG1heCBtaXhlciBzYW1wbGluZyByYXRlcy4gRG8gbm90CisgICAgLy8gbGltaXQgc2FtcGxpbmcgcmF0ZSBvdGhlcndpc2UKKyAgICAvLyBGb3IgaW5wdXRzLCBhbHNvIHNlZSBjaGVja0NvbXBhdGlibGVTYW1wbGluZ1JhdGUoKS4KKyAgICBpZiAobVR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICBtYXhSYXRlID0gVUlOVF9NQVg7CisgICAgfQorICAgIC8vIFRPRE86IHNob3VsZCBtU2FtcGxpbmdSYXRlc1tdIGJlIG9yZGVyZWQgaW4gdGVybXMgb2Ygb3VyIHByZWZlcmVuY2UKKyAgICAvLyBhbmQgd2UgcmV0dXJuIHRoZSBmaXJzdCAoYW5kIGhlbmNlIG1vc3QgcHJlZmVycmVkKSBtYXRjaD8gIFRoaXMgaXMgb2YgY29uY2VybiBpZgorICAgIC8vIHdlIHdhbnQgdG8gY2hvb3NlIDk2a0h6IG92ZXIgMTkya0h6IGZvciBVU0IgZHJpdmVyIHN0YWJpbGl0eSBvciByZXNvdXJjZSBjb25zdHJhaW50cy4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSArKykgeworICAgICAgICBpZiAoKG1TYW1wbGluZ1JhdGVzW2ldID4gc2FtcGxpbmdSYXRlKSAmJiAobVNhbXBsaW5nUmF0ZXNbaV0gPD0gbWF4UmF0ZSkpIHsKKyAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSA9IG1TYW1wbGluZ1JhdGVzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzYW1wbGluZ1JhdGU7Cit9CisKK2F1ZGlvX2NoYW5uZWxfbWFza190IEF1ZGlvUG9ydDo6cGlja0NoYW5uZWxNYXNrKCkgY29uc3QKK3sKKyAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHVuaW5pdGlhbGl6ZWQgZHluYW1pYyBwcm9maWxlCisgICAgaWYgKG1DaGFubmVsTWFza3Muc2l6ZSgpID09IDEgJiYgbUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7CisgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX05PTkU7CisgICAgfQorICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworCisgICAgLy8gRm9yIGRpcmVjdCBvdXRwdXRzLCBwaWNrIG1pbmltdW0gY2hhbm5lbCBjb3VudDogdGhpcyBoZWxwcyBlbnN1cmluZyB0aGF0IHRoZQorICAgIC8vIGNoYW5uZWwgY291bnQgLyBzYW1wbGluZyByYXRlIGNvbWJpbmF0aW9uIGNob3NlbiB3aWxsIGJlIHN1cHBvcnRlZCBieSB0aGUgY29ubmVjdGVkCisgICAgLy8gc2luaworICAgIGlmICgobVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgJiYgKG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpICYmCisgICAgICAgICAgICAobUZsYWdzICYgKEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpKSkgeworICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBVSU5UX01BWDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSArKykgeworICAgICAgICAgICAgdWludDMyX3QgY25sQ291bnQ7CisgICAgICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgICAgICBjbmxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1DaGFubmVsTWFza3NbaV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjbmxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtQ2hhbm5lbE1hc2tzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoY25sQ291bnQgPCBjaGFubmVsQ291bnQpICYmIChjbmxDb3VudCA+IDApKSB7CisgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2tzW2ldOworICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IGNubENvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjaGFubmVsTWFzazsKKyAgICB9CisKKyAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSAwOworICAgIHVpbnQzMl90IG1heENvdW50ID0gTUFYX01JWEVSX0NIQU5ORUxfQ09VTlQ7CisKKyAgICAvLyBGb3IgbWl4ZWQgb3V0cHV0IGFuZCBpbnB1dHMsIHVzZSBtYXggbWl4ZXIgY2hhbm5lbCBjb3VudC4gRG8gbm90CisgICAgLy8gbGltaXQgY2hhbm5lbCBjb3VudCBvdGhlcndpc2UKKyAgICBpZiAobVR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICBtYXhDb3VudCA9IFVJTlRfTUFYOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIHVpbnQzMl90IGNubENvdW50OworICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgIGNubENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUNoYW5uZWxNYXNrc1tpXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbmxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtQ2hhbm5lbE1hc2tzW2ldKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGNubENvdW50ID4gY2hhbm5lbENvdW50KSAmJiAoY25sQ291bnQgPD0gbWF4Q291bnQpKSB7CisgICAgICAgICAgICBjaGFubmVsTWFzayA9IG1DaGFubmVsTWFza3NbaV07CisgICAgICAgICAgICBjaGFubmVsQ291bnQgPSBjbmxDb3VudDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2hhbm5lbE1hc2s7Cit9CisKKy8qIGZvcm1hdCBpbiBvcmRlciBvZiBpbmNyZWFzaW5nIHByZWZlcmVuY2UgKi8KK2NvbnN0IGF1ZGlvX2Zvcm1hdF90IEF1ZGlvUG9ydDo6c1BjbUZvcm1hdENvbXBhcmVUYWJsZVtdID0geworICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCisgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQsCisgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRCwKKyAgICAgICAgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQsCisgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQsCit9OworCitpbnQgQXVkaW9Qb3J0Ojpjb21wYXJlRm9ybWF0cyhhdWRpb19mb3JtYXRfdCBmb3JtYXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQyKQoreworICAgIC8vIE5PVEU6IEFVRElPX0ZPUk1BVF9JTlZBTElEIGlzIGFsc28gY29uc2lkZXJlZCBub3QgUENNIGFuZCB3aWxsIGJlIGNvbXBhcmVkIGVxdWFsIHRvIGFueQorICAgIC8vIGNvbXByZXNzZWQgZm9ybWF0IGFuZCBiZXR0ZXIgdGhhbiBhbnkgUENNIGZvcm1hdC4gVGhpcyBpcyBieSBkZXNpZ24gb2YgcGlja0Zvcm1hdCgpCisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdDEpKSB7CisgICAgICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQyKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQyKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaW50IGluZGV4MSA9IC0xLCBpbmRleDIgPSAtMTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgIChpIDwgQVJSQVlfU0laRShzUGNtRm9ybWF0Q29tcGFyZVRhYmxlKSkgJiYgKChpbmRleDEgPT0gLTEpIHx8IChpbmRleDIgPT0gLTEpKTsKKyAgICAgICAgICAgIGkgKyspIHsKKyAgICAgICAgaWYgKHNQY21Gb3JtYXRDb21wYXJlVGFibGVbaV0gPT0gZm9ybWF0MSkgeworICAgICAgICAgICAgaW5kZXgxID0gaTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc1BjbUZvcm1hdENvbXBhcmVUYWJsZVtpXSA9PSBmb3JtYXQyKSB7CisgICAgICAgICAgICBpbmRleDIgPSBpOworICAgICAgICB9CisgICAgfQorICAgIC8vIGZvcm1hdDEgbm90IGZvdW5kID0+IGluZGV4MSA8IDAgPT4gZm9ybWF0MiA+IGZvcm1hdDEKKyAgICAvLyBmb3JtYXQyIG5vdCBmb3VuZCA9PiBpbmRleDIgPCAwID0+IGZvcm1hdDIgPCBmb3JtYXQxCisgICAgcmV0dXJuIGluZGV4MSAtIGluZGV4MjsKK30KKworYXVkaW9fZm9ybWF0X3QgQXVkaW9Qb3J0OjpwaWNrRm9ybWF0KCkgY29uc3QKK3sKKyAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHVuaW5pdGlhbGl6ZWQgZHluYW1pYyBwcm9maWxlCisgICAgaWYgKG1Gb3JtYXRzLnNpemUoKSA9PSAxICYmIG1Gb3JtYXRzWzBdID09IDApIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0ZPUk1BVF9ERUZBVUxUOworICAgIH0KKworICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOworICAgIGF1ZGlvX2Zvcm1hdF90IGJlc3RGb3JtYXQgPQorICAgICAgICAgICAgQXVkaW9Qb3J0OjpzUGNtRm9ybWF0Q29tcGFyZVRhYmxlWworICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoQXVkaW9Qb3J0OjpzUGNtRm9ybWF0Q29tcGFyZVRhYmxlKSAtIDFdOworICAgIC8vIEZvciBtaXhlZCBvdXRwdXQgYW5kIGlucHV0cywgdXNlIGJlc3QgbWl4ZXIgb3V0cHV0IGZvcm1hdC4gRG8gbm90CisgICAgLy8gbGltaXQgZm9ybWF0IG90aGVyd2lzZQorICAgIGlmICgobVR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX01JWCkgfHwKKyAgICAgICAgICAgICgobVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgJiYKKyAgICAgICAgICAgICAoKChtRmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkpICE9IDApKSkpIHsKKyAgICAgICAgYmVzdEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZvcm1hdHMuc2l6ZSgpOyBpICsrKSB7CisgICAgICAgIGlmICgoY29tcGFyZUZvcm1hdHMobUZvcm1hdHNbaV0sIGZvcm1hdCkgPiAwKSAmJgorICAgICAgICAgICAgICAgIChjb21wYXJlRm9ybWF0cyhtRm9ybWF0c1tpXSwgYmVzdEZvcm1hdCkgPD0gMCkpIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IG1Gb3JtYXRzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmb3JtYXQ7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9ydDo6Y2hlY2tHYWluKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqZ2FpbkNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdAoreworICAgIGlmIChpbmRleCA8IDAgfHwgKHNpemVfdClpbmRleCA+PSBtR2FpbnMuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBtR2FpbnNbaW5kZXhdLT5jaGVja0NvbmZpZyhnYWluQ29uZmlnKTsKK30KKwordm9pZCBBdWRpb1BvcnQ6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgaWYgKG1OYW1lLmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuc3RyaW5nKCkpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorCisgICAgaWYgKG1TYW1wbGluZ1JhdGVzLnNpemUoKSAhPSAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc2FtcGxpbmcgcmF0ZXM6ICIsIHNwYWNlcywgIiIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpID09IDAgJiYgbVNhbXBsaW5nUmF0ZXNbaV0gPT0gMCkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkR5bmFtaWMiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJWQiLCBtU2FtcGxpbmdSYXRlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1TYW1wbGluZ1JhdGVzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIH0KKworICAgIGlmIChtQ2hhbm5lbE1hc2tzLnNpemUoKSAhPSAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gY2hhbm5lbCBtYXNrczogIiwgc3BhY2VzLCAiIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ2hhbm5lbE1hc2tzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBBTE9HVigiQXVkaW9Qb3J0OjpkdW1wIG1DaGFubmVsTWFza3MgJXp1ICUwOHgiLCBpLCBtQ2hhbm5lbE1hc2tzW2ldKTsKKworICAgICAgICAgICAgaWYgKGkgPT0gMCAmJiBtQ2hhbm5lbE1hc2tzW2ldID09IDApIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJEeW5hbWljIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIjB4JTA0eCIsIG1DaGFubmVsTWFza3NbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpID09IChtQ2hhbm5lbE1hc2tzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIH0KKworICAgIGlmIChtRm9ybWF0cy5zaXplKCkgIT0gMCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGZvcm1hdHM6ICIsIHNwYWNlcywgIiIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdFN0ciA9IENvbmZpZ1BhcnNpbmdVdGlsczo6ZW51bVRvU3RyaW5nKHNGb3JtYXROYW1lVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRm9ybWF0TmFtZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0c1tpXSk7CisgICAgICAgICAgICBjb25zdCBib29sIGlzRW1wdHlTdHIgPSBmb3JtYXRTdHJbMF0gPT0gMDsKKyAgICAgICAgICAgIGlmIChpID09IDAgJiYgaXNFbXB0eVN0cikgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkR5bmFtaWMiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGlzRW1wdHlTdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSN4IiwgbUZvcm1hdHNbaV0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVzIiwgZm9ybWF0U3RyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1Gb3JtYXRzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIH0KKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBpZiAobUdhaW5zLnNpemUoKSAhPSAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZ2FpbnM6XG4iLCBzcGFjZXMsICIiKTsKKyAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikgKyAxKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtR2FpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1HYWluc1tpXS0+ZHVtcChmZCwgc3BhY2VzICsgMiwgaSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb3J0Ojpsb2coY29uc3QgY2hhciogaW5kZW50KSBjb25zdAoreworICAgIEFMT0dJKCIlcyBQb3J0W25tOiVzLCB0eXBlOiVkLCByb2xlOiVkXSIsIGluZGVudCwgbU5hbWUuc3RyaW5nKCksIG1UeXBlLCBtUm9sZSk7Cit9CisKKy8vIC0tLSBBdWRpb1BvcnRDb25maWcgY2xhc3MgaW1wbGVtZW50YXRpb24KKworQXVkaW9Qb3J0Q29uZmlnOjpBdWRpb1BvcnRDb25maWcoKQoreworICAgIG1TYW1wbGluZ1JhdGUgPSAwOworICAgIG1DaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICBtRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgbUdhaW4uaW5kZXggPSAtMTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb3J0Q29uZmlnOjphcHBseUF1ZGlvUG9ydENvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqYmFja3VwQ29uZmlnKQoreworICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBsb2NhbEJhY2t1cENvbmZpZzsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKworICAgIGxvY2FsQmFja3VwQ29uZmlnLmNvbmZpZ19tYXNrID0gY29uZmlnLT5jb25maWdfbWFzazsKKyAgICB0b0F1ZGlvUG9ydENvbmZpZygmbG9jYWxCYWNrdXBDb25maWcpOworCisgICAgc3A8QXVkaW9Qb3J0PiBhdWRpb3BvcnQgPSBnZXRBdWRpb1BvcnQoKTsKKyAgICBpZiAoYXVkaW9wb3J0ID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKKyAgICAgICAgZ290byBleGl0OworICAgIH0KKyAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFKSB7CisgICAgICAgIHN0YXR1cyA9IGF1ZGlvcG9ydC0+Y2hlY2tFeGFjdFNhbXBsaW5nUmF0ZShjb25maWctPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgICAgIG1TYW1wbGluZ1JhdGUgPSBjb25maWctPnNhbXBsZV9yYXRlOworICAgIH0KKyAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgeworICAgICAgICBzdGF0dXMgPSBhdWRpb3BvcnQtPmNoZWNrRXhhY3RDaGFubmVsTWFzayhjb25maWctPmNoYW5uZWxfbWFzayk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBtQ2hhbm5lbE1hc2sgPSBjb25maWctPmNoYW5uZWxfbWFzazsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpIHsKKyAgICAgICAgc3RhdHVzID0gYXVkaW9wb3J0LT5jaGVja0V4YWN0Rm9ybWF0KGNvbmZpZy0+Zm9ybWF0KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgICAgIG1Gb3JtYXQgPSBjb25maWctPmZvcm1hdDsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKSB7CisgICAgICAgIHN0YXR1cyA9IGF1ZGlvcG9ydC0+Y2hlY2tHYWluKCZjb25maWctPmdhaW4sIGNvbmZpZy0+Z2Fpbi5pbmRleCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgICAgICBtR2FpbiA9IGNvbmZpZy0+Z2FpbjsKKyAgICB9CisKK2V4aXQ6CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBhcHBseUF1ZGlvUG9ydENvbmZpZygmbG9jYWxCYWNrdXBDb25maWcpOworICAgIH0KKyAgICBpZiAoYmFja3VwQ29uZmlnICE9IE5VTEwpIHsKKyAgICAgICAgKmJhY2t1cENvbmZpZyA9IGxvY2FsQmFja3VwQ29uZmlnOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0Cit7CisgICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkgeworICAgICAgICBkc3RDb25maWctPnNhbXBsZV9yYXRlID0gbVNhbXBsaW5nUmF0ZTsKKyAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkpIHsKKyAgICAgICAgICAgIGRzdENvbmZpZy0+c2FtcGxlX3JhdGUgPSBzcmNDb25maWctPnNhbXBsZV9yYXRlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0Q29uZmlnLT5zYW1wbGVfcmF0ZSA9IDA7CisgICAgfQorICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLKSB7CisgICAgICAgIGRzdENvbmZpZy0+Y2hhbm5lbF9tYXNrID0gbUNoYW5uZWxNYXNrOworICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBOVUxMKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykpIHsKKyAgICAgICAgICAgIGRzdENvbmZpZy0+Y2hhbm5lbF9tYXNrID0gc3JjQ29uZmlnLT5jaGFubmVsX21hc2s7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICB9CisgICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpIHsKKyAgICAgICAgZHN0Q29uZmlnLT5mb3JtYXQgPSBtRm9ybWF0OworICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBOVUxMKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCkpIHsKKyAgICAgICAgICAgIGRzdENvbmZpZy0+Zm9ybWF0ID0gc3JjQ29uZmlnLT5mb3JtYXQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkc3RDb25maWctPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIH0KKyAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pIHsKKyAgICAgICAgZHN0Q29uZmlnLT5nYWluID0gbUdhaW47CisgICAgICAgIGlmICgoc3JjQ29uZmlnICE9IE5VTEwpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfR0FJTikpIHsKKyAgICAgICAgICAgIGRzdENvbmZpZy0+Z2FpbiA9IHNyY0NvbmZpZy0+Z2FpbjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRzdENvbmZpZy0+Z2Fpbi5pbmRleCA9IC0xOworICAgIH0KKyAgICBpZiAoZHN0Q29uZmlnLT5nYWluLmluZGV4ICE9IC0xKSB7CisgICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfR0FJTjsKKyAgICB9IGVsc2UgeworICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrICY9IH5BVURJT19QT1JUX0NPTkZJR19HQUlOOworICAgIH0KK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NvbmZpZ1BhcnNpbmdVdGlscy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Db25maWdQYXJzaW5nVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZWYwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Db25maWdQYXJzaW5nVXRpbHMuY3BwCkBAIC0wLDAgKzEsMjg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OkNvbmZpZ1BhcnNpbmdVdGlscyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkNvbmZpZ1BhcnNpbmdVdGlscy5oIgorI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvL3N0YXRpYwordWludDMyX3QgQ29uZmlnUGFyc2luZ1V0aWxzOjpzdHJpbmdUb0VudW0oY29uc3Qgc3RydWN0IFN0cmluZ1RvRW51bSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBpZiAoc3RyY21wKHRhYmxlW2ldLm5hbWUsIG5hbWUpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJzdHJpbmdUb0VudW0oKSBmb3VuZCAlcyIsIHRhYmxlW2ldLm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIHRhYmxlW2ldLnZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvL3N0YXRpYworY29uc3QgY2hhciAqQ29uZmlnUGFyc2luZ1V0aWxzOjplbnVtVG9TdHJpbmcoY29uc3Qgc3RydWN0IFN0cmluZ1RvRW51bSAqdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgaWYgKHRhYmxlW2ldLnZhbHVlID09IHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdGFibGVbaV0ubmFtZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gIiI7Cit9CisKKy8vc3RhdGljCitib29sIENvbmZpZ1BhcnNpbmdVdGlsczo6c3RyaW5nVG9Cb29sKGNvbnN0IGNoYXIgKnZhbHVlKQoreworICAgIHJldHVybiAoKHN0cmNhc2VjbXAoInRydWUiLCB2YWx1ZSkgPT0gMCkgfHwgKHN0cmNtcCgiMSIsIHZhbHVlKSA9PSAwKSk7Cit9CisKKworLy8gLS0tIGF1ZGlvX3BvbGljeS5jb25mIGZpbGUgcGFyc2luZworLy9zdGF0aWMKK3VpbnQzMl90IENvbmZpZ1BhcnNpbmdVdGlsczo6cGFyc2VPdXRwdXRGbGFnTmFtZXMoY2hhciAqbmFtZSkKK3sKKyAgICB1aW50MzJfdCBmbGFnID0gMDsKKworICAgIC8vIGl0IGlzIE9LIHRvIGNhc3QgbmFtZSB0byBub24gY29uc3QgaGVyZSBhcyB3ZSBhcmUgbm90IGdvaW5nIHRvIHVzZSBpdCBhZnRlcgorICAgIC8vIHN0cnRvaygpIG1vZGlmaWVzIGl0CisgICAgY2hhciAqZmxhZ05hbWUgPSBzdHJ0b2sobmFtZSwgInwiKTsKKyAgICB3aGlsZSAoZmxhZ05hbWUgIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RybGVuKGZsYWdOYW1lKSAhPSAwKSB7CisgICAgICAgICAgICBmbGFnIHw9IENvbmZpZ1BhcnNpbmdVdGlsczo6c3RyaW5nVG9FbnVtKHNPdXRwdXRGbGFnTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc091dHB1dEZsYWdOYW1lVG9FbnVtVGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdOYW1lKTsKKyAgICAgICAgfQorICAgICAgICBmbGFnTmFtZSA9IHN0cnRvayhOVUxMLCAifCIpOworICAgIH0KKyAgICAvL2ZvcmNlIGRpcmVjdCBmbGFnIGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQ6IG9mZmxvYWRpbmcgaW1wbGllcyBhIGRpcmVjdCBvdXRwdXQgc3RyZWFtCisgICAgLy8gYW5kIGFsbCBjb21tb24gYmVoYXZpb3JzIGFyZSBkcml2ZW4gYnkgY2hlY2tpbmcgb25seSB0aGUgZGlyZWN0IGZsYWcKKyAgICAvLyB0aGlzIHNob3VsZCBub3JtYWxseSBiZSBzZXQgYXBwcm9wcmlhdGVseSBpbiB0aGUgcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZQorICAgIGlmICgoZmxhZyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKKyAgICAgICAgZmxhZyB8PSBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1Q7CisgICAgfQorCisgICAgcmV0dXJuIGZsYWc7Cit9CisKKy8vc3RhdGljCit1aW50MzJfdCBDb25maWdQYXJzaW5nVXRpbHM6OnBhcnNlSW5wdXRGbGFnTmFtZXMoY2hhciAqbmFtZSkKK3sKKyAgICB1aW50MzJfdCBmbGFnID0gMDsKKworICAgIC8vIGl0IGlzIE9LIHRvIGNhc3QgbmFtZSB0byBub24gY29uc3QgaGVyZSBhcyB3ZSBhcmUgbm90IGdvaW5nIHRvIHVzZSBpdCBhZnRlcgorICAgIC8vIHN0cnRvaygpIG1vZGlmaWVzIGl0CisgICAgY2hhciAqZmxhZ05hbWUgPSBzdHJ0b2sobmFtZSwgInwiKTsKKyAgICB3aGlsZSAoZmxhZ05hbWUgIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RybGVuKGZsYWdOYW1lKSAhPSAwKSB7CisgICAgICAgICAgICBmbGFnIHw9IHN0cmluZ1RvRW51bShzSW5wdXRGbGFnTmFtZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0lucHV0RmxhZ05hbWVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ05hbWUpOworICAgICAgICB9CisgICAgICAgIGZsYWdOYW1lID0gc3RydG9rKE5VTEwsICJ8Iik7CisgICAgfQorICAgIHJldHVybiBmbGFnOworfQorCisvL3N0YXRpYworYXVkaW9fZGV2aWNlc190IENvbmZpZ1BhcnNpbmdVdGlsczo6cGFyc2VEZXZpY2VOYW1lcyhjaGFyICpuYW1lKQoreworICAgIHVpbnQzMl90IGRldmljZSA9IDA7CisKKyAgICBjaGFyICpkZXZOYW1lID0gc3RydG9rKG5hbWUsICJ8Iik7CisgICAgd2hpbGUgKGRldk5hbWUgIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RybGVuKGRldk5hbWUpICE9IDApIHsKKyAgICAgICAgICAgIGRldmljZSB8PSBzdHJpbmdUb0VudW0oc0RldmljZVR5cGVUb0VudW1UYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZVR5cGVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZOYW1lKTsKKyAgICAgICAgIH0KKyAgICAgICAgZGV2TmFtZSA9IHN0cnRvayhOVUxMLCAifCIpOworICAgICB9CisgICAgcmV0dXJuIGRldmljZTsKK30KKworLy9zdGF0aWMKK3ZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkSHdNb2R1bGUoY25vZGUgKnJvb3QsIEh3TW9kdWxlQ29sbGVjdGlvbiAmaHdNb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZUlucHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGVmYXVsdE91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJmlzU3BlYWtlckRyY0VuYWJsZSkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOQU1FX05PVF9GT1VORDsKKyAgICBjbm9kZSAqbm9kZTsKKyAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbmV3IEh3TW9kdWxlKHJvb3QtPm5hbWUpOworCisgICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIERFVklDRVNfVEFHKTsKKyAgICBpZiAobm9kZSAhPSBOVUxMKSB7CisgICAgICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICAgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIGRldmljZSAlcyIsIG5vZGUtPm5hbWUpOworICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbW9kdWxlLT5sb2FkRGV2aWNlKG5vZGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOQU1FX05PVF9GT1VORCB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0bXBTdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICAgICAgfQorICAgIH0KKyAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgT1VUUFVUU19UQUcpOworICAgIGlmIChub2RlICE9IE5VTEwpIHsKKyAgICAgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgICAgICB3aGlsZSAobm9kZSkgeworICAgICAgICAgICAgQUxPR1YoImxvYWRId01vZHVsZSgpIGxvYWRpbmcgb3V0cHV0ICVzIiwgbm9kZS0+bmFtZSk7CisgICAgICAgICAgICBzdGF0dXNfdCB0bXBTdGF0dXMgPSBtb2R1bGUtPmxvYWRPdXRwdXQobm9kZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5BTUVfTk9UX0ZPVU5EIHx8IHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRtcFN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgICAgICB9CisgICAgfQorICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBJTlBVVFNfVEFHKTsKKyAgICBpZiAobm9kZSAhPSBOVUxMKSB7CisgICAgICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICAgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIGlucHV0ICVzIiwgbm9kZS0+bmFtZSk7CisgICAgICAgICAgICBzdGF0dXNfdCB0bXBTdGF0dXMgPSBtb2R1bGUtPmxvYWRJbnB1dChub2RlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTkFNRV9OT1RfRk9VTkQgfHwgc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdG1wU3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgbG9hZEdsb2JhbENvbmZpZyhyb290LCBtb2R1bGUsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRPdXRwdXREZXZpY2VzLCBpc1NwZWFrZXJEcmNFbmFibGUpOworCisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBod01vZHVsZXMuYWRkKG1vZHVsZSk7CisgICAgfQorfQorCisvL3N0YXRpYwordm9pZCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRId01vZHVsZXMoY25vZGUgKnJvb3QsIEh3TW9kdWxlQ29sbGVjdGlvbiAmaHdNb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVJbnB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZU91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGVmYXVsdE91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZpc1NwZWFrZXJEcmNFbmFibGVkKQoreworICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgQVVESU9fSFdfTU9EVUxFX1RBRyk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGVzKCkgbG9hZGluZyBtb2R1bGUgJXMiLCBub2RlLT5uYW1lKTsKKyAgICAgICAgbG9hZEh3TW9kdWxlKG5vZGUsIGh3TW9kdWxlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdE91dHB1dERldmljZXMsIGlzU3BlYWtlckRyY0VuYWJsZWQpOworICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9Cit9CisKKy8vc3RhdGljCit2b2lkIENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEdsb2JhbENvbmZpZyhjbm9kZSAqcm9vdCwgY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZUlucHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZkZWZhdWx0T3V0cHV0RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmc3BlYWtlckRyY0VuYWJsZWQpCit7CisgICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBHTE9CQUxfQ09ORklHX1RBRyk7CisKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgRGV2aWNlVmVjdG9yIGRlY2xhcmVkRGV2aWNlczsKKyAgICBpZiAobW9kdWxlICE9IE5VTEwpIHsKKyAgICAgICAgZGVjbGFyZWREZXZpY2VzID0gbW9kdWxlLT5tRGVjbGFyZWREZXZpY2VzOworICAgIH0KKworICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBpZiAoc3RyY21wKEFUVEFDSEVEX09VVFBVVF9ERVZJQ0VTX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgeworICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5sb2FkRGV2aWNlc0Zyb21UYWcoKGNoYXIgKilub2RlLT52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWREZXZpY2VzKTsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgQXR0YWNoZWQgT3V0cHV0IERldmljZXMgJTA4eCIsCisgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChERUZBVUxUX09VVFBVVF9ERVZJQ0VfVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdClzdHJpbmdUb0VudW0oCisgICAgICAgICAgICAgICAgICAgIHNEZXZpY2VUeXBlVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZVR5cGVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgIChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICAgICAgaWYgKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIGRlZmF1bHRPdXRwdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihkZXZpY2UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygibG9hZEdsb2JhbENvbmZpZygpIGRlZmF1bHQgZGV2aWNlIG5vdCBzcGVjaWZpZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgbURlZmF1bHRPdXRwdXREZXZpY2UgJTA4eCIsIGRlZmF1bHRPdXRwdXREZXZpY2UtPnR5cGUoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKEFUVEFDSEVEX0lOUFVUX0RFVklDRVNfVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7CisgICAgICAgICAgICBhdmFpbGFibGVJbnB1dERldmljZXMubG9hZERldmljZXNGcm9tVGFnKChjaGFyICopbm9kZS0+dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWREZXZpY2VzKTsKKyAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgQXZhaWxhYmxlIElucHV0RGV2aWNlcyAlMDh4IiwgYXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChTUEVBS0VSX0RSQ19FTkFCTEVEX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgeworICAgICAgICAgICAgc3BlYWtlckRyY0VuYWJsZWQgPSBzdHJpbmdUb0Jvb2woKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1TcGVha2VyRHJjRW5hYmxlZCA9ICVkIiwgc3BlYWtlckRyY0VuYWJsZWQpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChBVURJT19IQUxfVkVSU0lPTl9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKKyAgICAgICAgICAgIHVpbnQzMl90IG1ham9yLCBtaW5vcjsKKyAgICAgICAgICAgIHNzY2FuZigoY2hhciAqKW5vZGUtPnZhbHVlLCAiJXUuJXUiLCAmbWFqb3IsICZtaW5vcik7CisgICAgICAgICAgICBtb2R1bGUtPm1IYWxWZXJzaW9uID0gSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKG1ham9yLCBtaW5vcik7CisgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1IYWxWZXJzaW9uID0gJTA0eCBtYWpvciAldSBtaW5vciAldSIsCisgICAgICAgICAgICAgICAgICBtb2R1bGUtPm1IYWxWZXJzaW9uLCBtYWpvciwgbWlub3IpOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KK30KKworLy9zdGF0aWMKK3N0YXR1c190IENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEF1ZGlvUG9saWN5Q29uZmlnKGNvbnN0IGNoYXIgKnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBId01vZHVsZUNvbGxlY3Rpb24gJmh3TW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlSW5wdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRlZmF1bHRPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmaXNTcGVha2VyRHJjRW5hYmxlZCkKK3sKKyAgICBjbm9kZSAqcm9vdDsKKyAgICBjaGFyICpkYXRhOworCisgICAgZGF0YSA9IChjaGFyICopbG9hZF9maWxlKHBhdGgsIE5VTEwpOworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorICAgIHJvb3QgPSBjb25maWdfbm9kZSgiIiwgIiIpOworICAgIGNvbmZpZ19sb2FkKHJvb3QsIGRhdGEpOworCisgICAgbG9hZEh3TW9kdWxlcyhyb290LCBod01vZHVsZXMsCisgICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbnB1dERldmljZXMsIGF2YWlsYWJsZU91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICBkZWZhdWx0T3V0cHV0RGV2aWNlcywgaXNTcGVha2VyRHJjRW5hYmxlZCk7CisgICAgLy8gbGVnYWN5IGF1ZGlvX3BvbGljeS5jb25mIGZpbGVzIGhhdmUgb25lIGdsb2JhbF9jb25maWd1cmF0aW9uIHNlY3Rpb24KKyAgICBsb2FkR2xvYmFsQ29uZmlnKHJvb3QsIGh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSksCisgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbnB1dERldmljZXMsIGF2YWlsYWJsZU91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0T3V0cHV0RGV2aWNlcywgaXNTcGVha2VyRHJjRW5hYmxlZCk7CisgICAgY29uZmlnX2ZyZWUocm9vdCk7CisgICAgZnJlZShyb290KTsKKyAgICBmcmVlKGRhdGEpOworCisgICAgQUxPR0koImxvYWRBdWRpb1BvbGljeUNvbmZpZygpIGxvYWRlZCAlc1xuIiwgcGF0aCk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMWZjYTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcApAQCAtMCwwICsxLDM1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpEZXZpY2VzIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgorI2luY2x1ZGUgIkh3TW9kdWxlLmgiCisjaW5jbHVkZSAiQ29uZmlnUGFyc2luZ1V0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworRGV2aWNlRGVzY3JpcHRvcjo6RGV2aWNlRGVzY3JpcHRvcihhdWRpb19kZXZpY2VzX3QgdHlwZSkgOgorICAgIEF1ZGlvUG9ydChTdHJpbmc4KCIiKSwgQVVESU9fUE9SVF9UWVBFX0RFVklDRSwKKyAgICAgICAgICAgICAgYXVkaW9faXNfb3V0cHV0X2RldmljZSh0eXBlKSA/IEFVRElPX1BPUlRfUk9MRV9TSU5LIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpLAorICAgIG1UYWcoIiIpLCBtQWRkcmVzcygiIiksIG1EZXZpY2VUeXBlKHR5cGUpLCBtSWQoMCkKK3sKKworfQorCithdWRpb19wb3J0X2hhbmRsZV90IERldmljZURlc2NyaXB0b3I6OmdldElkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbUlkOworfQorCit2b2lkIERldmljZURlc2NyaXB0b3I6OmF0dGFjaChjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSkKK3sKKyAgICBBdWRpb1BvcnQ6OmF0dGFjaChtb2R1bGUpOworICAgIG1JZCA9IGdldE5leHRVbmlxdWVJZCgpOworfQorCitib29sIERldmljZURlc2NyaXB0b3I6OmVxdWFscyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgb3RoZXIpIGNvbnN0Cit7CisgICAgLy8gRGV2aWNlcyBhcmUgY29uc2lkZXJlZCBlcXVhbCBpZiB0aGV5OgorICAgIC8vIC0gYXJlIG9mIHRoZSBzYW1lIHR5cGUgKGEgZGV2aWNlIHR5cGUgY2Fubm90IGJlIEFVRElPX0RFVklDRV9OT05FKQorICAgIC8vIC0gaGF2ZSB0aGUgc2FtZSBhZGRyZXNzIG9yIG9uZSBkZXZpY2UgZG9lcyBub3Qgc3BlY2lmeSB0aGUgYWRkcmVzcworICAgIC8vIC0gaGF2ZSB0aGUgc2FtZSBjaGFubmVsIG1hc2sgb3Igb25lIGRldmljZSBkb2VzIG5vdCBzcGVjaWZ5IHRoZSBjaGFubmVsIG1hc2sKKyAgICBpZiAob3RoZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiAobURldmljZVR5cGUgPT0gb3RoZXItPm1EZXZpY2VUeXBlKSAmJgorICAgICAgICAgICAobUFkZHJlc3MgPT0gIiIgfHwgb3RoZXItPm1BZGRyZXNzID09ICIiIHx8IG1BZGRyZXNzID09IG90aGVyLT5tQWRkcmVzcykgJiYKKyAgICAgICAgICAgKG1DaGFubmVsTWFzayA9PSAwIHx8IG90aGVyLT5tQ2hhbm5lbE1hc2sgPT0gMCB8fAorICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzayA9PSBvdGhlci0+bUNoYW5uZWxNYXNrKTsKK30KKwordm9pZCBEZXZpY2VEZXNjcmlwdG9yOjpsb2FkR2FpbnMoY25vZGUgKnJvb3QpCit7CisgICAgQXVkaW9Qb3J0Ojpsb2FkR2FpbnMocm9vdCk7CisgICAgaWYgKG1HYWlucy5zaXplKCkgPiAwKSB7CisgICAgICAgIG1HYWluc1swXS0+Z2V0RGVmYXVsdENvbmZpZygmbUdhaW4pOworICAgIH0KK30KKwordm9pZCBEZXZpY2VWZWN0b3I6OnJlZnJlc2hUeXBlcygpCit7CisgICAgbURldmljZVR5cGVzID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIG1EZXZpY2VUeXBlcyB8PSBpdGVtQXQoaSktPnR5cGUoKTsKKyAgICB9CisgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6cmVmcmVzaFR5cGVzKCkgbURldmljZVR5cGVzICUwOHgiLCBtRGV2aWNlVHlwZXMpOworfQorCitzc2l6ZV90IERldmljZVZlY3Rvcjo6aW5kZXhPZihjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgaXRlbSkgY29uc3QKK3sKKyAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW0tPmVxdWFscyhpdGVtQXQoaSkpKSB7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3NzaXplX3QgRGV2aWNlVmVjdG9yOjphZGQoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pCit7CisgICAgc3NpemVfdCByZXQgPSBpbmRleE9mKGl0ZW0pOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0ID0gU29ydGVkVmVjdG9yOjphZGQoaXRlbSk7CisgICAgICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICAgICAgcmVmcmVzaFR5cGVzKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygiRGV2aWNlVmVjdG9yOjphZGQgZGV2aWNlICUwOHggYWxyZWFkeSBpbiIsIGl0ZW0tPnR5cGUoKSk7CisgICAgICAgIHJldCA9IC0xOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzc2l6ZV90IERldmljZVZlY3Rvcjo6cmVtb3ZlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKQoreworICAgIHNpemVfdCBpOworICAgIHNzaXplX3QgcmV0ID0gaW5kZXhPZihpdGVtKTsKKworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIEFMT0dXKCJEZXZpY2VWZWN0b3I6OnJlbW92ZSBkZXZpY2UgJTA4eCBub3QgaW4iLCBpdGVtLT50eXBlKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IFNvcnRlZFZlY3Rvcjo6cmVtb3ZlQXQocmV0KTsKKyAgICAgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgICAgICByZWZyZXNoVHlwZXMoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCithdWRpb19kZXZpY2VzX3QgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0Cit7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmdldE1vZHVsZUhhbmRsZSgpID09IG1vZHVsZUhhbmRsZSkgeworICAgICAgICAgICAgZGV2aWNlcyB8PSBpdGVtQXQoaSktPnR5cGUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlczsKK30KKwordm9pZCBEZXZpY2VWZWN0b3I6OmxvYWREZXZpY2VzRnJvbVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGVzKQoreworICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0OworCisgICAgdWludDMyX3Qgcm9sZV9iaXQgPSBBVURJT19ERVZJQ0VfQklUX0lOICYgdHlwZXM7CisgICAgdHlwZXMgJj0gfnJvbGVfYml0OworCisgICAgd2hpbGUgKHR5cGVzKSB7CisgICAgICAgIHVpbnQzMl90IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHoodHlwZXMpOworICAgICAgICB1aW50MzJfdCB0eXBlID0gMSA8PCBpOworICAgICAgICB0eXBlcyAmPSB+dHlwZTsKKyAgICAgICAgYWRkKG5ldyBEZXZpY2VEZXNjcmlwdG9yKHR5cGUgfCByb2xlX2JpdCkpOworICAgIH0KK30KKwordm9pZCBEZXZpY2VWZWN0b3I6OmxvYWREZXZpY2VzRnJvbVRhZyhjaGFyICp0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRlY2xhcmVkRGV2aWNlcykKK3sKKyAgICBjaGFyICpkZXZUYWcgPSBzdHJ0b2sodGFnLCAifCIpOworICAgIHdoaWxlIChkZXZUYWcgIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RybGVuKGRldlRhZykgIT0gMCkgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBDb25maWdQYXJzaW5nVXRpbHM6OnN0cmluZ1RvRW51bShzRGV2aWNlVHlwZVRvRW51bVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJSQVlfU0laRShzRGV2aWNlVHlwZVRvRW51bVRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldlRhZyk7CisgICAgICAgICAgICBpZiAodHlwZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldiA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKHR5cGUpOworICAgICAgICAgICAgICAgIGlmICh0eXBlID09IEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYIHx8CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCApIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2LT5tQWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWRkKGRldik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPQorICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWREZXZpY2VzLmdldERldmljZUZyb21UYWcoU3RyaW5nOChkZXZUYWcpKTsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlRGVzYyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZChkZXZpY2VEZXNjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICAgICBkZXZUYWcgPSBzdHJ0b2soTlVMTCwgInwiKTsKKyAgICAgfQorfQorCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBEZXZpY2VWZWN0b3I6OmdldERldmljZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgU3RyaW5nOCBhZGRyZXNzKSBjb25zdAoreworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPnR5cGUoKSA9PSB0eXBlKSB7CisgICAgICAgICAgICBpZiAoYWRkcmVzcyA9PSAiIiB8fCBpdGVtQXQoaSktPm1BZGRyZXNzID09IGFkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBpdGVtQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+bUFkZHJlc3MgPT0gYWRkcmVzcykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlKCkgZm9yIHR5cGUgJTA4eCBhZGRyZXNzICVzIGZvdW5kICVwIiwKKyAgICAgICAgICB0eXBlLCBhZGRyZXNzLnN0cmluZygpLCBkZXZpY2UuZ2V0KCkpOworICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3NwPERldmljZURlc2NyaXB0b3I+IERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlRnJvbUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0Cit7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+Z2V0SWQoKSA9PSBpZCkgeworICAgICAgICAgICAgZGV2aWNlID0gaXRlbUF0KGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRldmljZTsKK30KKworRGV2aWNlVmVjdG9yIERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlKSBjb25zdAoreworICAgIERldmljZVZlY3RvciBkZXZpY2VzOworICAgIGJvb2wgaXNPdXRwdXQgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlcyh0eXBlKTsKKyAgICB0eXBlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyAoaSA8IHNpemUoKSkgJiYgKHR5cGUgIT0gQVVESU9fREVWSUNFX05PTkUpOyBpKyspIHsKKyAgICAgICAgYm9vbCBjdXJJc091dHB1dCA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKGl0ZW1BdChpKS0+bURldmljZVR5cGUpOworICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyVHlwZSA9IGl0ZW1BdChpKS0+bURldmljZVR5cGUgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICAgICAgaWYgKChpc091dHB1dCA9PSBjdXJJc091dHB1dCkgJiYgKCh0eXBlICYgY3VyVHlwZSkgIT0gMCkpIHsKKyAgICAgICAgICAgIGRldmljZXMuYWRkKGl0ZW1BdChpKSk7CisgICAgICAgICAgICB0eXBlICY9IH5jdXJUeXBlOworICAgICAgICAgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlKCkgZm9yIHR5cGUgJXggZm91bmQgJXAiLAorICAgICAgICAgICAgICAgICAgaXRlbUF0KGkpLT50eXBlKCksIGl0ZW1BdChpKS5nZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRldmljZXM7Cit9CisKK0RldmljZVZlY3RvciBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZUFkZHIoCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlLCBTdHJpbmc4IGFkZHJlc3MpIGNvbnN0Cit7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT50eXBlKCkgPT0gdHlwZSkgeworICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+bUFkZHJlc3MgPT0gYWRkcmVzcykgeworICAgICAgICAgICAgICAgIGRldmljZXMuYWRkKGl0ZW1BdChpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRldmljZXM7Cit9CisKK3NwPERldmljZURlc2NyaXB0b3I+IERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlRnJvbVRhZyhjb25zdCBTdHJpbmc4JiB0YWcpIGNvbnN0Cit7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+bVRhZyA9PSB0YWcpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGl0ZW1BdChpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKKworc3RhdHVzX3QgRGV2aWNlVmVjdG9yOjpkdW1wKGludCBmZCwgY29uc3QgU3RyaW5nOCAmZGlyZWN0aW9uKSBjb25zdAoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG4gQXZhaWxhYmxlICVzIGRldmljZXM6XG4iLCBkaXJlY3Rpb24uc3RyaW5nKCkpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGl0ZW1BdChpKS0+ZHVtcChmZCwgMiwgaSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZEZXNjKSBjb25zdAoreworICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mKGRldkRlc2MpOworICAgIHJldHVybiBpbmRleCA+PSAwID8gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUgOiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOworfQorCit2b2lkIERldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKK3sKKyAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLfEFVRElPX1BPUlRfQ09ORklHX0dBSU47CisgICAgaWYgKHNyY0NvbmZpZyAhPSBOVUxMKSB7CisgICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gc3JjQ29uZmlnLT5jb25maWdfbWFzazsKKyAgICB9CisKKyAgICBBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKKworICAgIGRzdENvbmZpZy0+aWQgPSBtSWQ7CisgICAgZHN0Q29uZmlnLT5yb2xlID0gYXVkaW9faXNfb3V0cHV0X2RldmljZShtRGV2aWNlVHlwZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9ST0xFX1NJTksgOiBBVURJT19QT1JUX1JPTEVfU09VUkNFOworICAgIGRzdENvbmZpZy0+dHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U7CisgICAgZHN0Q29uZmlnLT5leHQuZGV2aWNlLnR5cGUgPSBtRGV2aWNlVHlwZTsKKworICAgIC8vVE9ETyBVbmRlcnN0YW5kIHdoeSB0aGlzIHRlc3QgaXMgbmVjZXNzYXJ5LiBpLmUuIHdoeSBhdCBib290IHRpbWUgZG9lcyBpdCBjcmFzaAorICAgIC8vIHdpdGhvdXQgdGhlIHRlc3Q/CisgICAgLy8gVGhpcyBoYXMgYmVlbiBkZW1vbnN0cmF0ZWQgdG8gTk9UIGJlIHRydWUgKGF0IHN0YXJ0IHVwKQorICAgIC8vIEFMT0dfQVNTRVJUKG1Nb2R1bGUgIT0gTlVMTCk7CisgICAgZHN0Q29uZmlnLT5leHQuZGV2aWNlLmh3X21vZHVsZSA9IG1Nb2R1bGUgIT0gMCA/IG1Nb2R1bGUtPm1IYW5kbGUgOiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICBzdHJuY3B5KGRzdENvbmZpZy0+ZXh0LmRldmljZS5hZGRyZXNzLCBtQWRkcmVzcy5zdHJpbmcoKSwgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTik7Cit9CisKK3ZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0Cit7CisgICAgQUxPR1YoIkRldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KCkgaGFuZGxlICVkIHR5cGUgJXgiLCBtSWQsIG1EZXZpY2VUeXBlKTsKKyAgICBBdWRpb1BvcnQ6OnRvQXVkaW9Qb3J0KHBvcnQpOworICAgIHBvcnQtPmlkID0gbUlkOworICAgIHRvQXVkaW9Qb3J0Q29uZmlnKCZwb3J0LT5hY3RpdmVfY29uZmlnKTsKKyAgICBwb3J0LT5leHQuZGV2aWNlLnR5cGUgPSBtRGV2aWNlVHlwZTsKKyAgICBwb3J0LT5leHQuZGV2aWNlLmh3X21vZHVsZSA9IG1Nb2R1bGUtPm1IYW5kbGU7CisgICAgc3RybmNweShwb3J0LT5leHQuZGV2aWNlLmFkZHJlc3MsIG1BZGRyZXNzLnN0cmluZygpLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKTsKK30KKwordm9pZCBEZXZpY2VEZXNjcmlwdG9yOjppbXBvcnRBdWRpb1BvcnQoY29uc3Qgc3A8QXVkaW9Qb3J0PiBwb3J0KSB7CisgICAgQXVkaW9Qb3J0OjppbXBvcnRBdWRpb1BvcnQocG9ydCk7CisgICAgbVNhbXBsaW5nUmF0ZSA9IHBvcnQtPnBpY2tTYW1wbGluZ1JhdGUoKTsKKyAgICBtRm9ybWF0ID0gcG9ydC0+cGlja0Zvcm1hdCgpOworICAgIG1DaGFubmVsTWFzayA9IHBvcnQtPnBpY2tDaGFubmVsTWFzaygpOworfQorCitzdGF0dXNfdCBEZXZpY2VEZXNjcmlwdG9yOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzRGV2aWNlICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGlmIChtSWQgIT0gMCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1JZCk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSB0eXBlOiAlLTQ4c1xuIiwgc3BhY2VzLCAiIiwKKyAgICAgICAgICAgIENvbmZpZ1BhcnNpbmdVdGlsczo6ZW51bVRvU3RyaW5nKHNEZXZpY2VUeXBlVG9FbnVtVGFibGUsCisgICAgICAgICAgICAgICAgICAgIEFSUkFZX1NJWkUoc0RldmljZVR5cGVUb0VudW1UYWJsZSksCisgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VUeXBlKSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGlmIChtQWRkcmVzcy5zaXplKCkgIT0gMCkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGFkZHJlc3M6ICUtMzJzXG4iLCBzcGFjZXMsICIiLCBtQWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB9CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgQXVkaW9Qb3J0OjpkdW1wKGZkLCBzcGFjZXMpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIERldmljZURlc2NyaXB0b3I6OmxvZygpIGNvbnN0Cit7CisgICAgQUxPR0koIkRldmljZSBpZDolZCB0eXBlOjB4JVg6JXMsIGFkZHI6JXMiLAorICAgICAgICAgIG1JZCwKKyAgICAgICAgICBtRGV2aWNlVHlwZSwKKyAgICAgICAgICBDb25maWdQYXJzaW5nVXRpbHM6OmVudW1Ub1N0cmluZygKKyAgICAgICAgICAgICBzRGV2aWNlTmFtZVRvRW51bVRhYmxlLCBBUlJBWV9TSVpFKHNEZXZpY2VOYW1lVG9FbnVtVGFibGUpLCBtRGV2aWNlVHlwZSksCisgICAgICAgICAgbUFkZHJlc3Muc3RyaW5nKCkpOworCisgICAgQXVkaW9Qb3J0Ojpsb2coIiAgIik7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDgzOGQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcApAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpFZmZlY3REZXNjcmlwdG9yIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiRWZmZWN0RGVzY3JpcHRvci5oIgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJL086ICVkXG4iLCBtSW8pOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU3RyYXRlZ3k6ICVkXG4iLCBtU3RyYXRlZ3kpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2Vzc2lvbjogJWRcbiIsIG1TZXNzaW9uKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIE5hbWU6ICVzXG4iLCAgbURlc2MubmFtZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAlc1xuIiwgIG1FbmFibGVkID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIik7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6RWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24oKSA6CisgICAgbVRvdGFsRWZmZWN0c0NwdUxvYWQoMCksCisgICAgbVRvdGFsRWZmZWN0c01lbW9yeSgwKQoreworCit9CisKK3N0YXR1c190IEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpyZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkKK3sKKyAgICBpZiAobVRvdGFsRWZmZWN0c01lbW9yeSArIGRlc2MtPm1lbW9yeVVzYWdlID4gZ2V0TWF4RWZmZWN0c01lbW9yeSgpKSB7CisgICAgICAgIEFMT0dXKCJyZWdpc3RlckVmZmVjdCgpIG1lbW9yeSBsaW1pdCBleGNlZWRlZCBmb3IgRnggJXMsIE1lbW9yeSAlZCBLQiIsCisgICAgICAgICAgICAgICAgZGVzYy0+bmFtZSwgZGVzYy0+bWVtb3J5VXNhZ2UpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIG1Ub3RhbEVmZmVjdHNNZW1vcnkgKz0gZGVzYy0+bWVtb3J5VXNhZ2U7CisgICAgQUxPR1YoInJlZ2lzdGVyRWZmZWN0KCkgZWZmZWN0ICVzLCBpbyAlZCwgc3RyYXRlZ3kgJWQgc2Vzc2lvbiAlZCBpZCAlZCIsCisgICAgICAgICAgICBkZXNjLT5uYW1lLCBpbywgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKKyAgICBBTE9HVigicmVnaXN0ZXJFZmZlY3QoKSBtZW1vcnkgJWQsIHRvdGFsIG1lbW9yeSAlZCIsIGRlc2MtPm1lbW9yeVVzYWdlLCBtVG90YWxFZmZlY3RzTWVtb3J5KTsKKworICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSBuZXcgRWZmZWN0RGVzY3JpcHRvcigpOworICAgIG1lbWNweSAoJmVmZmVjdERlc2MtPm1EZXNjLCBkZXNjLCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpOworICAgIGVmZmVjdERlc2MtPm1JbyA9IGlvOworICAgIGVmZmVjdERlc2MtPm1TdHJhdGVneSA9IHN0YXRpY19jYXN0PHJvdXRpbmdfc3RyYXRlZ3k+KHN0cmF0ZWd5KTsKKyAgICBlZmZlY3REZXNjLT5tU2Vzc2lvbiA9IHNlc3Npb247CisgICAgZWZmZWN0RGVzYy0+bUVuYWJsZWQgPSBmYWxzZTsKKworICAgIGFkZChpZCwgZWZmZWN0RGVzYyk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShpZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIHVua25vd24gZWZmZWN0IElEICVkIiwgaWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IHZhbHVlQXQoaW5kZXgpOworCisgICAgc2V0RWZmZWN0RW5hYmxlZChlZmZlY3REZXNjLCBmYWxzZSk7CisKKyAgICBpZiAobVRvdGFsRWZmZWN0c01lbW9yeSA8IGVmZmVjdERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlKSB7CisgICAgICAgIEFMT0dXKCJ1bnJlZ2lzdGVyRWZmZWN0KCkgbWVtb3J5ICVkIHRvbyBiaWcgZm9yIHRvdGFsICVkIiwKKyAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSwgbVRvdGFsRWZmZWN0c01lbW9yeSk7CisgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlID0gbVRvdGFsRWZmZWN0c01lbW9yeTsKKyAgICB9CisgICAgbVRvdGFsRWZmZWN0c01lbW9yeSAtPSBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZTsKKyAgICBBTE9HVigidW5yZWdpc3RlckVmZmVjdCgpIGVmZmVjdCAlcywgSUQgJWQsIG1lbW9yeSAlZCB0b3RhbCBtZW1vcnkgJWQiLAorICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubmFtZSwgaWQsIGVmZmVjdERlc2MtPm1EZXNjLm1lbW9yeVVzYWdlLCBtVG90YWxFZmZlY3RzTWVtb3J5KTsKKworICAgIHJlbW92ZUl0ZW0oaWQpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6c2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShpZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIHVua25vd24gZWZmZWN0IElEICVkIiwgaWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmV0dXJuIHNldEVmZmVjdEVuYWJsZWQodmFsdWVBdChpbmRleCksIGVuYWJsZWQpOworfQorCisKK3N0YXR1c190IEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpzZXRFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3REZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkKQoreworICAgIGlmIChlbmFibGVkID09IGVmZmVjdERlc2MtPm1FbmFibGVkKSB7CisgICAgICAgIEFMT0dWKCJzZXRFZmZlY3RFbmFibGVkKCVzKSBlZmZlY3QgYWxyZWFkeSAlcyIsCisgICAgICAgICAgICAgZW5hYmxlZD8idHJ1ZSI6ImZhbHNlIiwgZW5hYmxlZD8iZW5hYmxlZCI6ImRpc2FibGVkIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBpZiAobVRvdGFsRWZmZWN0c0NwdUxvYWQgKyBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkID4gZ2V0TWF4RWZmZWN0c0NwdUxvYWQoKSkgeworICAgICAgICAgICAgQUxPR1coInNldEVmZmVjdEVuYWJsZWQodHJ1ZSkgQ1BVIExvYWQgbGltaXQgZXhjZWVkZWQgZm9yIEZ4ICVzLCBDUFUgJWYgTUlQUyIsCisgICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLm5hbWUsIChmbG9hdCllZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkLzEwKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBtVG90YWxFZmZlY3RzQ3B1TG9hZCArPSBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkOworICAgICAgICBBTE9HVigic2V0RWZmZWN0RW5hYmxlZCh0cnVlKSB0b3RhbCBDUFUgJWQiLCBtVG90YWxFZmZlY3RzQ3B1TG9hZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1Ub3RhbEVmZmVjdHNDcHVMb2FkIDwgZWZmZWN0RGVzYy0+bURlc2MuY3B1TG9hZCkgeworICAgICAgICAgICAgQUxPR1coInNldEVmZmVjdEVuYWJsZWQoZmFsc2UpIENQVSBsb2FkICVkIHRvbyBoaWdoIGZvciB0b3RhbCAlZCIsCisgICAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLmNwdUxvYWQsIG1Ub3RhbEVmZmVjdHNDcHVMb2FkKTsKKyAgICAgICAgICAgIGVmZmVjdERlc2MtPm1EZXNjLmNwdUxvYWQgPSBtVG90YWxFZmZlY3RzQ3B1TG9hZDsKKyAgICAgICAgfQorICAgICAgICBtVG90YWxFZmZlY3RzQ3B1TG9hZCAtPSBlZmZlY3REZXNjLT5tRGVzYy5jcHVMb2FkOworICAgICAgICBBTE9HVigic2V0RWZmZWN0RW5hYmxlZChmYWxzZSkgdG90YWwgQ1BVICVkIiwgbVRvdGFsRWZmZWN0c0NwdUxvYWQpOworICAgIH0KKyAgICBlZmZlY3REZXNjLT5tRW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitib29sIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjppc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGVmZmVjdERlc2MtPm1FbmFibGVkICYmIChlZmZlY3REZXNjLT5tU3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEpICYmCisgICAgICAgICAgICAgICAgKChlZmZlY3REZXNjLT5tRGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX09GRkxPQURfU1VQUE9SVEVEKSA9PSAwKSkgeworICAgICAgICAgICAgQUxPR1YoImlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdCAlcyBlbmFibGVkIG9uIHNlc3Npb24gJWQiLAorICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubmFtZSwgZWZmZWN0RGVzYy0+bVNlc3Npb24pOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit1aW50MzJfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6Z2V0TWF4RWZmZWN0c0NwdUxvYWQoKSBjb25zdAoreworICAgIHJldHVybiBNQVhfRUZGRUNUU19DUFVfTE9BRDsKK30KKwordWludDMyX3QgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OmdldE1heEVmZmVjdHNNZW1vcnkoKSBjb25zdAoreworICAgIHJldHVybiBNQVhfRUZGRUNUU19NRU1PUlk7Cit9CisKK3N0YXR1c190IEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuVG90YWwgRWZmZWN0cyBDUFU6ICVmIE1JUFMsIFRvdGFsIEVmZmVjdHMgbWVtb3J5OiAlZCBLQlxuIiwKKyAgICAgICAgICAgICAoZmxvYXQpbVRvdGFsRWZmZWN0c0NwdUxvYWQvMTAsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlJlZ2lzdGVyZWQgZWZmZWN0czpcbiIpOworICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gRWZmZWN0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7CisgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMjA1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAKQEAgLTAsMCArMSwzNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6SHdNb2R1bGUiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJId01vZHVsZS5oIgorI2luY2x1ZGUgIklPUHJvZmlsZS5oIgorI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgorI2luY2x1ZGUgIkNvbmZpZ1BhcnNpbmdVdGlscy5oIgorI2luY2x1ZGUgImF1ZGlvX3BvbGljeV9jb25mLmgiCisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitId01vZHVsZTo6SHdNb2R1bGUoY29uc3QgY2hhciAqbmFtZSkKKyAgICA6IG1OYW1lKHN0cm5kdXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01BWF9MRU4pKSwKKyAgICAgIG1IYWxWZXJzaW9uKEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl9NSU4pLCBtSGFuZGxlKDApCit7Cit9CisKK0h3TW9kdWxlOjp+SHdNb2R1bGUoKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1PdXRwdXRQcm9maWxlc1tpXS0+bVN1cHBvcnRlZERldmljZXMuY2xlYXIoKTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRQcm9maWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBtSW5wdXRQcm9maWxlc1tpXS0+bVN1cHBvcnRlZERldmljZXMuY2xlYXIoKTsKKyAgICB9CisgICAgZnJlZSgodm9pZCAqKW1OYW1lKTsKK30KKworc3RhdHVzX3QgSHdNb2R1bGU6OmxvYWRJbnB1dChjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworCisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbmV3IElPUHJvZmlsZShTdHJpbmc4KHJvb3QtPm5hbWUpLCBBVURJT19QT1JUX1JPTEVfU0lOSyk7CisKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIFNBTVBMSU5HX1JBVEVTX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZFNhbXBsaW5nUmF0ZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZPUk1BVFNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5sb2FkRm9ybWF0cygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQ0hBTk5FTFNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5sb2FkSW5DaGFubmVscygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgREVWSUNFU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmxvYWREZXZpY2VzRnJvbVRhZygoY2hhciAqKW5vZGUtPnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVjbGFyZWREZXZpY2VzKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgRkxBR1NfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5tRmxhZ3MgPSBDb25maWdQYXJzaW5nVXRpbHM6OnBhcnNlSW5wdXRGbGFnTmFtZXMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5TX1RBRykgPT0gMCkgeworICAgICAgICAgICAgcHJvZmlsZS0+bG9hZEdhaW5zKG5vZGUpOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICBBTE9HV19JRihwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCksCisgICAgICAgICAgICAibG9hZElucHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgZGV2aWNlcyIpOworICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpID09IDAsCisgICAgICAgICAgICAibG9hZElucHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgY2hhbm5lbCBtYXNrcyIpOworICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLnNpemUoKSA9PSAwLAorICAgICAgICAgICAgImxvYWRJbnB1dCgpIGludmFsaWQgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzIik7CisgICAgQUxPR1dfSUYocHJvZmlsZS0+bUZvcm1hdHMuc2l6ZSgpID09IDAsCisgICAgICAgICAgICAibG9hZElucHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgZm9ybWF0cyIpOworICAgIGlmICghcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpICYmCisgICAgICAgICAgICAocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgIT0gMCkgJiYKKyAgICAgICAgICAgIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgIT0gMCkgJiYKKyAgICAgICAgICAgIChwcm9maWxlLT5tRm9ybWF0cy5zaXplKCkgIT0gMCkpIHsKKworICAgICAgICBBTE9HVigibG9hZElucHV0KCkgYWRkaW5nIGlucHV0IFN1cHBvcnRlZCBEZXZpY2VzICUwNHgiLAorICAgICAgICAgICAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpKTsKKworICAgICAgICBwcm9maWxlLT5hdHRhY2godGhpcyk7CisgICAgICAgIG1JbnB1dFByb2ZpbGVzLmFkZChwcm9maWxlKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorfQorCitzdGF0dXNfdCBId01vZHVsZTo6bG9hZE91dHB1dChjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworCisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbmV3IElPUHJvZmlsZShTdHJpbmc4KHJvb3QtPm5hbWUpLCBBVURJT19QT1JUX1JPTEVfU09VUkNFKTsKKworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgU0FNUExJTkdfUkFURVNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5sb2FkU2FtcGxpbmdSYXRlcygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgRk9STUFUU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRGb3JtYXRzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBDSEFOTkVMU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRPdXRDaGFubmVscygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgREVWSUNFU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmxvYWREZXZpY2VzRnJvbVRhZygoY2hhciAqKW5vZGUtPnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRGVjbGFyZWREZXZpY2VzKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgRkxBR1NfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5tRmxhZ3MgPSBDb25maWdQYXJzaW5nVXRpbHM6OnBhcnNlT3V0cHV0RmxhZ05hbWVzKChjaGFyICopbm9kZS0+dmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOU19UQUcpID09IDApIHsKKyAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRHYWlucyhub2RlKTsKKyAgICAgICAgfQorICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICB9CisgICAgQUxPR1dfSUYocHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuaXNFbXB0eSgpLAorICAgICAgICAgICAgImxvYWRPdXRwdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBkZXZpY2VzIik7CisgICAgQUxPR1dfSUYocHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5zaXplKCkgPT0gMCwKKyAgICAgICAgICAgICJsb2FkT3V0cHV0KCkgaW52YWxpZCBzdXBwb3J0ZWQgY2hhbm5lbCBtYXNrcyIpOworICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLnNpemUoKSA9PSAwLAorICAgICAgICAgICAgImxvYWRPdXRwdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcyIpOworICAgIEFMT0dXX0lGKHByb2ZpbGUtPm1Gb3JtYXRzLnNpemUoKSA9PSAwLAorICAgICAgICAgICAgImxvYWRPdXRwdXQoKSBpbnZhbGlkIHN1cHBvcnRlZCBmb3JtYXRzIik7CisgICAgaWYgKCFwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5pc0VtcHR5KCkgJiYKKyAgICAgICAgICAgIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLnNpemUoKSAhPSAwKSAmJgorICAgICAgICAgICAgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLnNpemUoKSAhPSAwKSAmJgorICAgICAgICAgICAgKHByb2ZpbGUtPm1Gb3JtYXRzLnNpemUoKSAhPSAwKSkgeworCisgICAgICAgIEFMT0dWKCJsb2FkT3V0cHV0KCkgYWRkaW5nIG91dHB1dCBTdXBwb3J0ZWQgRGV2aWNlcyAlMDR4LCBtRmxhZ3MgJTA0eCIsCisgICAgICAgICAgICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCksIHByb2ZpbGUtPm1GbGFncyk7CisgICAgICAgIHByb2ZpbGUtPmF0dGFjaCh0aGlzKTsKKyAgICAgICAgbU91dHB1dFByb2ZpbGVzLmFkZChwcm9maWxlKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorfQorCitzdGF0dXNfdCBId01vZHVsZTo6bG9hZERldmljZShjbm9kZSAqcm9vdCkKK3sKKyAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOworCisgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEFQTV9ERVZJQ0VfVFlQRSkgPT0gMCkgeworICAgICAgICAgICAgdHlwZSA9IENvbmZpZ1BhcnNpbmdVdGlsczo6cGFyc2VEZXZpY2VOYW1lcygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OworICAgIH0KKyAgICBpZiAodHlwZSA9PSBBVURJT19ERVZJQ0VfTk9ORSB8fAorICAgICAgICAgICAgKCFhdWRpb19pc19pbnB1dF9kZXZpY2UodHlwZSkgJiYgIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UodHlwZSkpKSB7CisgICAgICAgIEFMT0dXKCJsb2FkRGV2aWNlKCkgYmFkIHR5cGUgJTA4eCIsIHR5cGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IodHlwZSk7CisgICAgZGV2aWNlRGVzYy0+bVRhZyA9IFN0cmluZzgocm9vdC0+bmFtZSk7CisKKyAgICBub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7CisgICAgd2hpbGUgKG5vZGUpIHsKKyAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBBUE1fREVWSUNFX0FERFJFU1MpID09IDApIHsKKyAgICAgICAgICAgIGRldmljZURlc2MtPm1BZGRyZXNzID0gU3RyaW5nOCgoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQ0hBTk5FTFNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlRGVzYy0+bG9hZEluQ2hhbm5lbHMoKGNoYXIgKilub2RlLT52YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRldmljZURlc2MtPmxvYWRPdXRDaGFubmVscygoY2hhciAqKW5vZGUtPnZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTlNfVEFHKSA9PSAwKSB7CisgICAgICAgICAgICBkZXZpY2VEZXNjLT5sb2FkR2FpbnMobm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgfQorCisgICAgQUxPR1YoImxvYWREZXZpY2UoKSBhZGRpbmcgZGV2aWNlIHRhZyAlcyB0eXBlICUwOHggYWRkcmVzcyAlcyIsCisgICAgICAgICAgZGV2aWNlRGVzYy0+bVRhZy5zdHJpbmcoKSwgdHlwZSwgZGV2aWNlRGVzYy0+bUFkZHJlc3Muc3RyaW5nKCkpOworCisgICAgbURlY2xhcmVkRGV2aWNlcy5hZGQoZGV2aWNlRGVzYyk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEh3TW9kdWxlOjphZGRPdXRwdXRQcm9maWxlKFN0cmluZzggbmFtZSwgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgU3RyaW5nOCBhZGRyZXNzKQoreworICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBJT1Byb2ZpbGUobmFtZSwgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSk7CisKKyAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoY29uZmlnLT5zYW1wbGVfcmF0ZSk7CisgICAgcHJvZmlsZS0+bUNoYW5uZWxNYXNrcy5hZGQoY29uZmlnLT5jaGFubmVsX21hc2spOworICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmFkZChjb25maWctPmZvcm1hdCk7CisKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoZGV2aWNlKTsKKyAgICBkZXZEZXNjLT5tQWRkcmVzcyA9IGFkZHJlc3M7CisgICAgcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMuYWRkKGRldkRlc2MpOworCisgICAgcHJvZmlsZS0+YXR0YWNoKHRoaXMpOworICAgIG1PdXRwdXRQcm9maWxlcy5hZGQocHJvZmlsZSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEh3TW9kdWxlOjpyZW1vdmVPdXRwdXRQcm9maWxlKFN0cmluZzggbmFtZSkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobU91dHB1dFByb2ZpbGVzW2ldLT5tTmFtZSA9PSBuYW1lKSB7CisgICAgICAgICAgICBtT3V0cHV0UHJvZmlsZXMucmVtb3ZlQXQoaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgSHdNb2R1bGU6OmFkZElucHV0UHJvZmlsZShTdHJpbmc4IG5hbWUsIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIFN0cmluZzggYWRkcmVzcykKK3sKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBuZXcgSU9Qcm9maWxlKG5hbWUsIEFVRElPX1BPUlRfUk9MRV9TSU5LKTsKKworICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmFkZChjb25maWctPnNhbXBsZV9yYXRlKTsKKyAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmFkZChjb25maWctPmNoYW5uZWxfbWFzayk7CisgICAgcHJvZmlsZS0+bUZvcm1hdHMuYWRkKGNvbmZpZy0+Zm9ybWF0KTsKKworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihkZXZpY2UpOworICAgIGRldkRlc2MtPm1BZGRyZXNzID0gYWRkcmVzczsKKyAgICBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5hZGQoZGV2RGVzYyk7CisKKyAgICBBTE9HVigiYWRkSW5wdXRQcm9maWxlKCkgbmFtZSAlcyByYXRlICVkIG1hc2sgMHgwOCIsIG5hbWUuc3RyaW5nKCksIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKKworICAgIHByb2ZpbGUtPmF0dGFjaCh0aGlzKTsKKyAgICBtSW5wdXRQcm9maWxlcy5hZGQocHJvZmlsZSk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEh3TW9kdWxlOjpyZW1vdmVJbnB1dFByb2ZpbGUoU3RyaW5nOCBuYW1lKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1JbnB1dFByb2ZpbGVzW2ldLT5tTmFtZSA9PSBuYW1lKSB7CisgICAgICAgICAgICBtSW5wdXRQcm9maWxlcy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKK3ZvaWQgSHdNb2R1bGU6OmR1bXAoaW50IGZkKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAtIG5hbWU6ICVzXG4iLCBtTmFtZSk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSBoYW5kbGU6ICVkXG4iLCBtSGFuZGxlKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAtIHZlcnNpb246ICV1LiV1XG4iLCBtSGFsVmVyc2lvbiA+PiA4LCBtSGFsVmVyc2lvbiAmIDB4RkYpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBpZiAobU91dHB1dFByb2ZpbGVzLnNpemUoKSkgeworICAgICAgICB3cml0ZShmZCwgIiAgLSBvdXRwdXRzOlxuIiwgc3RybGVuKCIgIC0gb3V0cHV0czpcbiIpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICBvdXRwdXQgJXp1OlxuIiwgaSk7CisgICAgICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgICAgICBtT3V0cHV0UHJvZmlsZXNbaV0tPmR1bXAoZmQpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtSW5wdXRQcm9maWxlcy5zaXplKCkpIHsKKyAgICAgICAgd3JpdGUoZmQsICIgIC0gaW5wdXRzOlxuIiwgc3RybGVuKCIgIC0gaW5wdXRzOlxuIikpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgaW5wdXQgJXp1OlxuIiwgaSk7CisgICAgICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgICAgICBtSW5wdXRQcm9maWxlc1tpXS0+ZHVtcChmZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1EZWNsYXJlZERldmljZXMuc2l6ZSgpKSB7CisgICAgICAgIHdyaXRlKGZkLCAiICAtIGRldmljZXM6XG4iLCBzdHJsZW4oIiAgLSBkZXZpY2VzOlxuIikpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EZWNsYXJlZERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1EZWNsYXJlZERldmljZXNbaV0tPmR1bXAoZmQsIDQsIGkpOworICAgICAgICB9CisgICAgfQorfQorCitzcCA8SHdNb2R1bGU+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0TW9kdWxlRnJvbU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QKK3sKKyAgICBzcCA8SHdNb2R1bGU+IG1vZHVsZTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspCisgICAgeworICAgICAgICBpZiAoc3RyY21wKGl0ZW1BdChpKS0+bU5hbWUsIG5hbWUpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVtQXQoaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1vZHVsZTsKK30KKworCitzcCA8SHdNb2R1bGU+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0TW9kdWxlRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0Cit7CisgICAgc3AgPEh3TW9kdWxlPiBtb2R1bGU7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpdGVtQXQoaSktPm1PdXRwdXRQcm9maWxlcy5zaXplKCk7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5tT3V0cHV0UHJvZmlsZXNbal0tPm1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiBkZXZpY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGl0ZW1BdChpKS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5tSW5wdXRQcm9maWxlc1tqXS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmCisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbUF0KGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbW9kdWxlOworfQorCitzcDxEZXZpY2VEZXNjcmlwdG9yPiAgSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXREZXZpY2VEZXNjcmlwdG9yKGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkgY29uc3QKK3sKKyAgICBTdHJpbmc4IGFkZHJlc3MgPSAoZGV2aWNlX2FkZHJlc3MgPT0gTlVMTCkgPyBTdHJpbmc4KCIiKSA6IFN0cmluZzgoZGV2aWNlX2FkZHJlc3MpOworICAgIC8vIGhhbmRsZSBsZWdhY3kgcmVtb3RlIHN1Ym1peCBjYXNlIHdoZXJlIHRoZSBhZGRyZXNzIHdhcyBub3QgYWx3YXlzIHNwZWNpZmllZAorICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkgJiYgKGFkZHJlc3MubGVuZ3RoKCkgPT0gMCkpIHsKKyAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPEh3TW9kdWxlPiBod01vZHVsZSA9IGl0ZW1BdChpKTsKKyAgICAgICAgaWYgKGh3TW9kdWxlLT5tSGFuZGxlID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0KKyAgICAgICAgICAgICAgICBod01vZHVsZS0+bURlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVBZGRyKGRldmljZSwgYWRkcmVzcyk7CisgICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKKyAgICAgICAgfQorICAgICAgICBkZXZpY2VMaXN0ID0gaHdNb2R1bGUtPm1EZWNsYXJlZERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7CisgICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQorICAgICAgICAgICAgbmV3IERldmljZURlc2NyaXB0b3IoZGV2aWNlKTsKKyAgICBkZXZEZXNjLT5tTmFtZSA9IGRldmljZV9uYW1lOworICAgIGRldkRlc2MtPm1BZGRyZXNzID0gYWRkcmVzczsKKyAgICByZXR1cm4gZGV2RGVzYzsKK30KKworc3RhdHVzX3QgSHdNb2R1bGVDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKK3sKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuSFcgTW9kdWxlcyBkdW1wOlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBIVyBNb2R1bGUgJXp1OlxuIiwgaSArIDEpOworICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgICAgIGl0ZW1BdChpKS0+ZHVtcChmZCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworfSAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjZkNTFkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcApAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpJT1Byb2ZpbGUiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKKyNpbmNsdWRlICJId01vZHVsZS5oIgorI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0lPUHJvZmlsZTo6SU9Qcm9maWxlKGNvbnN0IFN0cmluZzgmIG5hbWUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpCisgICAgOiBBdWRpb1BvcnQobmFtZSwgQVVESU9fUE9SVF9UWVBFX01JWCwgcm9sZSkKK3sKK30KKworSU9Qcm9maWxlOjp+SU9Qcm9maWxlKCkKK3sKK30KKworLy8gY2hlY2tzIGlmIHRoZSBJTyBwcm9maWxlIGlzIGNvbXBhdGlibGUgd2l0aCBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKy8vIFNhbXBsaW5nIHJhdGUsIGZvcm1hdCBhbmQgY2hhbm5lbCBtYXNrIG11c3QgYmUgc3BlY2lmaWVkIGluIG9yZGVyIHRvCisvLyBnZXQgYSB2YWxpZCBhIG1hdGNoCitib29sIElPUHJvZmlsZTo6aXNDb21wYXRpYmxlUHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnVwZGF0ZWRTYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqdXBkYXRlZEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKnVwZGF0ZWRDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKSBjb25zdAoreworICAgIGNvbnN0IGJvb2wgaXNQbGF5YmFja1RocmVhZCA9IG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVggJiYgbVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKKyAgICBjb25zdCBib29sIGlzUmVjb3JkVGhyZWFkID0gbVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCAmJiBtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSzsKKyAgICBBTE9HX0FTU0VSVChpc1BsYXliYWNrVGhyZWFkICE9IGlzUmVjb3JkVGhyZWFkKTsKKworCisgICAgaWYgKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAvLyBqdXN0IGNoZWNrIHR5cGVzIGlmIG11bHRpcGxlIGRldmljZXMgYXJlIHNlbGVjdGVkCisgICAgICAgIGlmIChwb3Bjb3VudChkZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikgPiAxKSB7CisgICAgICAgICAgICBpZiAoKG1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiBkZXZpY2UpICE9IGRldmljZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtU3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2UoZGV2aWNlLCBhZGRyZXNzKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2FtcGxpbmdSYXRlID09IDApIHsKKyAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdWludDMyX3QgbXlVcGRhdGVkU2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlOworICAgIGlmIChpc1BsYXliYWNrVGhyZWFkICYmIGNoZWNrRXhhY3RTYW1wbGluZ1JhdGUoc2FtcGxpbmdSYXRlKSAhPSBOT19FUlJPUikgeworICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNSZWNvcmRUaHJlYWQgJiYgY2hlY2tDb21wYXRpYmxlU2FtcGxpbmdSYXRlKHNhbXBsaW5nUmF0ZSwgJm15VXBkYXRlZFNhbXBsaW5nUmF0ZSkgIT0KKyAgICAgICAgICAgIE5PX0VSUk9SKSB7CisgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChpc1BsYXliYWNrVGhyZWFkICYmIGNoZWNrRXhhY3RGb3JtYXQoZm9ybWF0KSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1ZGlvX2Zvcm1hdF90IG15VXBkYXRlZEZvcm1hdCA9IGZvcm1hdDsKKyAgICBpZiAoaXNSZWNvcmRUaHJlYWQgJiYgY2hlY2tDb21wYXRpYmxlRm9ybWF0KGZvcm1hdCwgJm15VXBkYXRlZEZvcm1hdCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChpc1BsYXliYWNrVGhyZWFkICYmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spIHx8CisgICAgICAgICAgICBjaGVja0V4YWN0Q2hhbm5lbE1hc2soY2hhbm5lbE1hc2spICE9IE5PX0VSUk9SKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG15VXBkYXRlZENoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CisgICAgaWYgKGlzUmVjb3JkVGhyZWFkICYmICghYXVkaW9faXNfaW5wdXRfY2hhbm5lbChjaGFubmVsTWFzaykgfHwKKyAgICAgICAgICAgIGNoZWNrQ29tcGF0aWJsZUNoYW5uZWxNYXNrKGNoYW5uZWxNYXNrLCAmbXlVcGRhdGVkQ2hhbm5lbE1hc2spICE9IE5PX0VSUk9SKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGlzUGxheWJhY2tUaHJlYWQgJiYgKG1GbGFncyAmIGZsYWdzKSAhPSBmbGFncykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIFRoZSBvbmx5IGlucHV0IGZsYWcgdGhhdCBpcyBhbGxvd2VkIHRvIGJlIGRpZmZlcmVudCBpcyB0aGUgZmFzdCBmbGFnLgorICAgIC8vIEFuIGV4aXN0aW5nIGZhc3Qgc3RyZWFtIGlzIGNvbXBhdGlibGUgd2l0aCBhIG5vcm1hbCB0cmFjayByZXF1ZXN0LgorICAgIC8vIEFuIGV4aXN0aW5nIG5vcm1hbCBzdHJlYW0gaXMgY29tcGF0aWJsZSB3aXRoIGEgZmFzdCB0cmFjayByZXF1ZXN0LAorICAgIC8vIGJ1dCB0aGUgZmFzdCByZXF1ZXN0IHdpbGwgYmUgZGVuaWVkIGJ5IEF1ZGlvRmxpbmdlciBhbmQgY29udmVydGVkIHRvIG5vcm1hbCB0cmFjay4KKyAgICBpZiAoaXNSZWNvcmRUaHJlYWQgJiYgKChtRmxhZ3MgXiBmbGFncykgJgorICAgICAgICAgICAgfkFVRElPX0lOUFVUX0ZMQUdfRkFTVCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICh1cGRhdGVkU2FtcGxpbmdSYXRlICE9IE5VTEwpIHsKKyAgICAgICAgKnVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBteVVwZGF0ZWRTYW1wbGluZ1JhdGU7CisgICAgfQorICAgIGlmICh1cGRhdGVkRm9ybWF0ICE9IE5VTEwpIHsKKyAgICAgICAgKnVwZGF0ZWRGb3JtYXQgPSBteVVwZGF0ZWRGb3JtYXQ7CisgICAgfQorICAgIGlmICh1cGRhdGVkQ2hhbm5lbE1hc2sgIT0gTlVMTCkgeworICAgICAgICAqdXBkYXRlZENoYW5uZWxNYXNrID0gbXlVcGRhdGVkQ2hhbm5lbE1hc2s7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIElPUHJvZmlsZTo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBBdWRpb1BvcnQ6OmR1bXAoZmQsIDQpOworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIC0gZmxhZ3M6IDB4JTA0eFxuIiwgbUZsYWdzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIC0gZGV2aWNlczpcbiIpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdXBwb3J0ZWREZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1TdXBwb3J0ZWREZXZpY2VzW2ldLT5kdW1wKGZkLCA2LCBpKTsKKyAgICB9Cit9CisKK3ZvaWQgSU9Qcm9maWxlOjpsb2coKQoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgQUxPR1YoIiAgICAtIHNhbXBsaW5nIHJhdGVzOiAiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TYW1wbGluZ1JhdGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEFMT0dWKCIgICVkIiwgbVNhbXBsaW5nUmF0ZXNbaV0pOworICAgIH0KKworICAgIEFMT0dWKCIgICAgLSBjaGFubmVsIG1hc2tzOiAiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQUxPR1YoIiAgMHglMDR4IiwgbUNoYW5uZWxNYXNrc1tpXSk7CisgICAgfQorCisgICAgQUxPR1YoIiAgICAtIGZvcm1hdHM6ICIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQUxPR1YoIiAgMHglMDh4IiwgbUZvcm1hdHNbaV0pOworICAgIH0KKworICAgIEFMT0dWKCIgICAgLSBkZXZpY2VzOiAweCUwNHhcbiIsIG1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkpOworICAgIEFMT0dWKCIgICAgLSBmbGFnczogMHglMDR4XG4iLCBtRmxhZ3MpOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2Vzc2lvblJvdXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1Nlc3Npb25Sb3V0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VjZmE0NAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1Nlc3Npb25Sb3V0ZS5jcHAKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6U2Vzc2lvblJvdXRlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiU2Vzc2lvblJvdXRlLmgiCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlICJBdWRpb0dhaW4uaCIKKyNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tIFNlc3Npb25Sb3V0ZSBjbGFzcyBpbXBsZW1lbnRhdGlvbgordm9pZCBTZXNzaW9uUm91dGU6OmxvZyhjb25zdCBjaGFyKiBwcmVmaXgpCit7CisgICAgQUxPR0koIiVzW1Nlc3Npb25Sb3V0ZSBzdHJtOjB4JVgsIHNyYzolZCwgc2VzczoweCVYLCBkZXY6MHglWCByZWZzOiVkIGFjdDolZCIsCisgICAgICAgICAgcHJlZml4LCBtU3RyZWFtVHlwZSwgbVNvdXJjZSwgbVNlc3Npb24sCisgICAgICAgICAgbURldmljZURlc2NyaXB0b3IgIT0gMCA/IG1EZXZpY2VEZXNjcmlwdG9yLT50eXBlKCkgOiBBVURJT19ERVZJQ0VfTk9ORSwKKyAgICAgICAgICBtUmVmQ291bnQsIG1BY3Rpdml0eUNvdW50KTsKK30KKworLy8gLS0tIFNlc3Npb25Sb3V0ZU1hcCBjbGFzcyBpbXBsZW1lbnRhdGlvbgorYm9vbCBTZXNzaW9uUm91dGVNYXA6Omhhc1JvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIHJldHVybiBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgJiYgdmFsdWVGb3Ioc2Vzc2lvbiktPm1EZXZpY2VEZXNjcmlwdG9yICE9IDA7Cit9CisKK2Jvb2wgU2Vzc2lvblJvdXRlTWFwOjpoYXNSb3V0ZUNoYW5nZWQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgaWYgKGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCkgeworICAgICAgICBpZiAodmFsdWVGb3Ioc2Vzc2lvbiktPm1DaGFuZ2VkKSB7CisgICAgICAgICAgICB2YWx1ZUZvcihzZXNzaW9uKS0+bUNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBTZXNzaW9uUm91dGVNYXA6OnJlbW92ZVJvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgPyB2YWx1ZUZvcihzZXNzaW9uKSA6IDA7CisgICAgaWYgKHJvdXRlICE9IDApIHsKKyAgICAgICAgQUxPR19BU1NFUlQocm91dGUtPm1SZWZDb3VudCA+IDApOworICAgICAgICAtLXJvdXRlLT5tUmVmQ291bnQ7CisgICAgICAgIGlmIChyb3V0ZS0+bVJlZkNvdW50IDw9IDApIHsKKyAgICAgICAgICAgIHJlbW92ZUl0ZW0oc2Vzc2lvbik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBTZXNzaW9uUm91dGVNYXA6OmluY1JvdXRlQWN0aXZpdHkoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCA/IHZhbHVlRm9yKHNlc3Npb24pIDogMDsKKyAgICByZXR1cm4gcm91dGUgIT0gMCA/ICsrKHJvdXRlLT5tQWN0aXZpdHlDb3VudCkgOiAtMTsKK30KKworaW50IFNlc3Npb25Sb3V0ZU1hcDo6ZGVjUm91dGVBY3Rpdml0eShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gaW5kZXhPZktleShzZXNzaW9uKSA+PSAwID8gdmFsdWVGb3Ioc2Vzc2lvbikgOiAwOworICAgIGlmIChyb3V0ZSAhPSAwICYmIHJvdXRlLT5tQWN0aXZpdHlDb3VudCA+IDApIHsKKyAgICAgICAgcmV0dXJuIC0tKHJvdXRlLT5tQWN0aXZpdHlDb3VudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKwordm9pZCBTZXNzaW9uUm91dGVNYXA6OmxvZyhjb25zdCBjaGFyKiBjYXB0aW9uKQoreworICAgIEFMT0dJKCIlcyAtLS0tIiwgY2FwdGlvbik7CisgICAgZm9yKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIHZhbHVlQXQoaW5kZXgpLT5sb2coIiAgIik7CisgICAgfQorfQorCit2b2lkIFNlc3Npb25Sb3V0ZU1hcDo6YWRkUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKK3sKKyAgICBpZiAobU1hcFR5cGUgPT0gTUFQVFlQRV9JTlBVVCAmJiBzdHJlYW1UeXBlICE9IFNlc3Npb25Sb3V0ZTo6U1RSRUFNX1RZUEVfTkEpIHsKKyAgICAgICAgQUxPR0UoIkFkZGluZyBPdXRwdXQgUm91dGUgdG8gSW5wdXRSb3V0ZU1hcCIpOworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChtTWFwVHlwZSA9PSBNQVBUWVBFX09VVFBVVCAmJiBzb3VyY2UgIT0gU2Vzc2lvblJvdXRlOjpTT1VSQ0VfVFlQRV9OQSkgeworICAgICAgICBBTE9HRSgiQWRkaW5nIElucHV0IFJvdXRlIHRvIE91dHB1dFJvdXRlTWFwIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gaW5kZXhPZktleShzZXNzaW9uKSA+PSAwID8gdmFsdWVGb3Ioc2Vzc2lvbikgOiAwOworCisgICAgaWYgKHJvdXRlICE9IDApIHsKKyAgICAgICAgaWYgKCgocm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yID09IDApICYmIChkZXNjcmlwdG9yICE9IDApKSB8fAorICAgICAgICAgICAgICAgICgocm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yICE9IDApICYmCisgICAgICAgICAgICAgICAgICgoZGVzY3JpcHRvciA9PSAwKSB8fCAoIXJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvci0+ZXF1YWxzKGRlc2NyaXB0b3IpKSkpKSB7CisgICAgICAgICAgICByb3V0ZS0+bUNoYW5nZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJvdXRlLT5tUmVmQ291bnQrKzsKKyAgICAgICAgcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKKyAgICB9IGVsc2UgeworICAgICAgICByb3V0ZSA9IG5ldyBTZXNzaW9uUm91dGUoc2Vzc2lvbiwgc3RyZWFtVHlwZSwgc291cmNlLCBkZXNjcmlwdG9yLCB1aWQpOworICAgICAgICByb3V0ZS0+bVJlZkNvdW50Kys7CisgICAgICAgIGFkZChzZXNzaW9uLCByb3V0ZSk7CisgICAgICAgIGlmIChkZXNjcmlwdG9yICE9IDApIHsKKyAgICAgICAgICAgIHJvdXRlLT5tQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NvdW5kVHJpZ2dlclNlc3Npb24uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU291bmRUcmlnZ2VyU2Vzc2lvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNhM2FlMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NvdW5kVHJpZ2dlclNlc3Npb24uY3BwCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6U291bmRUcmlnZ2VyU2Vzc2lvbiIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIlNvdW5kVHJpZ2dlclNlc3Npb24uaCIKKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXR1c190IFNvdW5kVHJpZ2dlclNlc3Npb25Db2xsZWN0aW9uOjphY3F1aXJlU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSkKK3sKKyAgICBhZGQoc2Vzc2lvbiwgaW9IYW5kbGUpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJTZXNzaW9uQ29sbGVjdGlvbjo6cmVsZWFzZVNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoc2Vzc2lvbik7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygiYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oKSBzZXNzaW9uICVkIG5vdCByZWdpc3RlcmVkIiwgc2Vzc2lvbik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmVtb3ZlSXRlbShzZXNzaW9uKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK307IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU3RyZWFtRGVzY3JpcHRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY4MmUyYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OlZvbHVtZXMiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKy8vI2RlZmluZSBWRVJZX1ZFUkJPU0VfTE9HR0lORworI2lmZGVmIFZFUllfVkVSQk9TRV9MT0dHSU5HCisjZGVmaW5lIEFMT0dWViBBTE9HVgorI2Vsc2UKKyNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKyNpbmNsdWRlICJTdHJlYW1EZXNjcmlwdG9yLmgiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLSBTdHJlYW1EZXNjcmlwdG9yIGNsYXNzIGltcGxlbWVudGF0aW9uCisKK1N0cmVhbURlc2NyaXB0b3I6OlN0cmVhbURlc2NyaXB0b3IoKQorICAgIDogICBtSW5kZXhNaW4oMCksIG1JbmRleE1heCgxKSwgbUNhbkJlTXV0ZWQodHJ1ZSkKK3sKKyAgICBtSW5kZXhDdXIuYWRkKEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCwgMCk7Cit9CisKK2ludCBTdHJlYW1EZXNjcmlwdG9yOjpnZXRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAoreworICAgIGRldmljZSA9IFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7CisgICAgLy8gdGhlcmUgaXMgYWx3YXlzIGEgdmFsaWQgZW50cnkgZm9yIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVAorICAgIGlmIChtSW5kZXhDdXIuaW5kZXhPZktleShkZXZpY2UpIDwgMCkgeworICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQ7CisgICAgfQorICAgIHJldHVybiBtSW5kZXhDdXIudmFsdWVGb3IoZGV2aWNlKTsKK30KKwordm9pZCBTdHJlYW1EZXNjcmlwdG9yOjpjbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpCit7CisgICAgbUluZGV4Q3VyLmNsZWFyKCk7Cit9CisKK3ZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6YWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCkKK3sKKyAgICBtSW5kZXhDdXIuYWRkKGRldmljZSwgaW5kZXgpOworfQorCit2b2lkIFN0cmVhbURlc2NyaXB0b3I6OnNldFZvbHVtZUluZGV4TWluKGludCB2b2xJbmRleE1pbikKK3sKKyAgICBtSW5kZXhNaW4gPSB2b2xJbmRleE1pbjsKK30KKwordm9pZCBTdHJlYW1EZXNjcmlwdG9yOjpzZXRWb2x1bWVJbmRleE1heChpbnQgdm9sSW5kZXhNYXgpCit7CisgICAgbUluZGV4TWF4ID0gdm9sSW5kZXhNYXg7Cit9CisKK3ZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6c2V0Vm9sdW1lQ3VydmVQb2ludChWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpwb2ludCkKK3sKKyAgICBtVm9sdW1lQ3VydmVbZGV2aWNlQ2F0ZWdvcnldID0gcG9pbnQ7Cit9CisKK3ZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpIGNvbnN0Cit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlcyAgICAgICAgICUwMmQgICAgICAgICAlMDJkICAgICAgICAgIiwKKyAgICAgICAgICAgICBtQ2FuQmVNdXRlZCA/ICJ0cnVlICIgOiAiZmFsc2UiLCBtSW5kZXhNaW4sIG1JbmRleE1heCk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUluZGV4Q3VyLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUwNHggOiAlMDJkLCAiLAorICAgICAgICAgICAgICAgICBtSW5kZXhDdXIua2V5QXQoaSksCisgICAgICAgICAgICAgICAgIG1JbmRleEN1ci52YWx1ZUF0KGkpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Cit9CisKK1N0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjpTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbigpCit7CisgICAgZm9yIChzaXplX3Qgc3RyZWFtID0gMCA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7IHN0cmVhbSsrKSB7CisgICAgICAgIGFkZChzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90PihzdHJlYW0pLCBTdHJlYW1EZXNjcmlwdG9yKCkpOworICAgIH0KK30KKworYm9vbCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6Y2FuQmVNdXRlZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICByZXR1cm4gdmFsdWVBdChzdHJlYW0pLmNhbkJlTXV0ZWQoKTsKK30KKwordm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6Y2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgZWRpdFZhbHVlQXQoc3RyZWFtKS5jbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpOworfQorCit2b2lkIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjphZGRDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGluZGV4KQoreworICAgIGVkaXRWYWx1ZUF0KHN0cmVhbSkuYWRkQ3VycmVudFZvbHVtZUluZGV4KGRldmljZSwgaW5kZXgpOworfQorCit2b2lkIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjpzZXRWb2x1bWVDdXJ2ZVBvaW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqcG9pbnQpCit7CisgICAgZWRpdFZhbHVlQXQoc3RyZWFtKS5zZXRWb2x1bWVDdXJ2ZVBvaW50KGRldmljZUNhdGVnb3J5LCBwb2ludCk7Cit9CisKK2NvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKlN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjpnZXRWb2x1bWVDdXJ2ZVBvaW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkpIGNvbnN0Cit7CisgICAgcmV0dXJuIHZhbHVlQXQoc3RyZWFtKS5nZXRWb2x1bWVDdXJ2ZVBvaW50KGRldmljZUNhdGVnb3J5KTsKK30KKwordm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c2V0Vm9sdW1lSW5kZXhNaW4oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0saW50IHZvbEluZGV4TWluKQoreworICAgIHJldHVybiBlZGl0VmFsdWVBdChzdHJlYW0pLnNldFZvbHVtZUluZGV4TWluKHZvbEluZGV4TWluKTsKK30KKwordm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c2V0Vm9sdW1lSW5kZXhNYXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0saW50IHZvbEluZGV4TWF4KQoreworICAgIHJldHVybiBlZGl0VmFsdWVBdChzdHJlYW0pLnNldFZvbHVtZUluZGV4TWF4KHZvbEluZGV4TWF4KTsKK30KKworc3RhdHVzX3QgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAoreworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5TdHJlYW1zIGR1bXA6XG4iKTsKKyAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAorICAgICAgICAgICAgICIgU3RyZWFtICBDYW4gYmUgbXV0ZWQgIEluZGV4IE1pbiAgSW5kZXggTWF4ICBJbmRleCBDdXIgW2RldmljZSA6IGluZGV4XS4uLlxuIik7CisgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMnp1ICAgICAgIiwgaSk7CisgICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICAgICAgdmFsdWVBdChpKS5kdW1wKGZkKTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNzNlNTQzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaApAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaD4KKyNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxWb2x1bWUuaD4KKyNpbmNsdWRlIDxId01vZHVsZS5oPgorI2luY2x1ZGUgPERldmljZURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBUaGlzIGludGVyZmFjZSBpcyBkZWRpY2F0ZWQgdG8gdGhlIHBvbGljeSBtYW5hZ2VyIHRoYXQgYSBQb2xpY3kgRW5naW5lIHNoYWxsIGltcGxlbWVudC4KKyAqLworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSBlbmdpbmUgd2FzIGNvcnJlY3RseSBpbml0aWFsaXplZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgaW5pdGlhbGl6YXRpb24gaGFzIGJlZW4gZG9uZSBjb3JyZWN0bHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLi4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpID0gMDsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIE1hbmFnZXIgb2JzZXJ2ZXIgdGhhdCBhbGxvd3MgdGhlIGVuZ2luZSB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiBjb2xsZWN0aW9uCisgICAgICogb2YgZGV2aWNlcywgc3RyZWFtcywgSHdNb2R1bGVzLCAuLi4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gb2JzZXJ2ZXIgaGFuZGxlIG9uIHRoZSBtYW5hZ2VyLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgaW5wdXQgZGV2aWNlIHNlbGVjdGVkIGZvciBhIGdpdmVuIGlucHV0IHNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gaW5wdXRTb3VyY2UgdG8gZ2V0IHRoZSBzZWxlY3RlZCBpbnB1dCBkZXZpY2UgYXNzb2NpYXRlZCB0bworICAgICAqCisgICAgICogQHJldHVybiBzZWxlY3RlZCBpbnB1dCBkZXZpY2UgZm9yIHRoZSBnaXZlbiBpbnB1dCBzb3VyY2UsIG1heSBiZSBub25lIGlmIGVycm9yLgorICAgICAqLworICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG91dHB1dCBkZXZpY2UgYXNzb2NpYXRlZCB0byBhIGdpdmVuIHN0cmF0ZWd5LgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBzdHJlYW0gdHlwZSBmb3Igd2hpY2ggdGhlIHNlbGVjdGVkIG91cHV0IGRldmljZSBpcyByZXF1ZXN0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHNlbGVjdGVkIG91cHV0IGRldmljZSBmb3IgdGhlIGdpdmVuIHN0cmF0ZWd5LCBtYXkgYmUgbm9uZSBpZiBlcnJvci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0YXRlZ3kpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc3RyYXRlZ3kgc2VsZWN0ZWQgZm9yIGEgZ2l2ZW4gc3RyZWFtIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHN0cmVhbTogZm9yIHdoaWNoIHRoZSBzZWxlY3RlZCBzdHJhdGVneSBmb2xsb3dlZCBieSBpcyByZXF1ZXN0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHN0cmF0ZWd5IHRvIGJlIGZvbGxvd2VkLgorICAgICAqLworICAgIHZpcnR1YWwgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzdHJhdGVneSBzZWxlY3RlZCBmb3IgYSBnaXZlbiB1c2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdXNhZ2UgdG8gZ2V0IHRoZSBzZWxlY3RlZCBzdHJhdGVneSBmb2xsb3dlZCBieS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc3RyYXRlZ3kgdG8gYmUgZm9sbG93ZWQuCisgICAgICovCisgICAgdmlydHVhbCByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSkgPSAwOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBUZWxlcGhvbnkgTW9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gbW9kZTogQW5kcm9pZCBQaG9uZSBzdGF0ZSAobm9ybWFsLCByaW5ndG9uZSwgY3N2LCBpbiBjb21tdW5pY2F0aW9uKQorICAgICAqCisgICAgICogQHJldHVybiBOT19FUlJPUiBpZiBUZWxlcGhvbnkgTW9kZSBzZXQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IG1vZGUpID0gMDsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdGVsZXBob255IE1vZGUKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdGVsZXBob255IG1vZGUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogU2V0IEZvcmNlIFVzZSBjb25maWcgZm9yIGEgZ2l2ZW4gdXNhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVzYWdlIGZvciB3aGljaCBhIGNvbmZpZ3VyYXRpb24gc2hhbGwgYmUgZm9yY2VkLgorICAgICAqIEBwYXJhbVtpbl0gY29uZmlnIHdpc2hlZCB0byBiZSBmb3JjZWQgZm9yIHRoZSBnaXZlbiB1c2FnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIEZvcmNlIFVzZSBjb25maWcgd2FzIHNldCBjb3JyZWN0bHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlIChlLmcuIGNvbmZpZworICAgICAqIG5vdCBhbGxvd2VkIGEgZ2l2ZW4gdXNhZ2UuLi4pCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykgPSAwOworCisgICAgLyoqCisgICAgICogR2V0IEZvcmNlIFVzZSBjb25maWcgZm9yIGEgZ2l2ZW4gdXNhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHVzYWdlIGZvciB3aGljaCBhIGNvbmZpZ3VyYXRpb24gc2hhbGwgYmUgZm9yY2VkLgorICAgICAqCisgICAgICogQHJldHVybiBjb25maWcgd2lzaGVkIHRvIGJlIGZvcmNlZCBmb3IgdGhlIGdpdmVuIHVzYWdlLgorICAgICAqLworICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29ubmVjdGlvbiBzdGF0ZSBvZiBkZXZpY2UocykuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGRldkRlc2MgZm9yIHdoaWNoIHRoZSBzdGF0ZSBoYXMgY2hhbmdlZC4KKyAgICAgKiBAcGFyYW1baW5dIHN0YXRlIG9mIGF2YWlsYWJpbGl0eSBvZiB0aGlzKHRoZXNlKSBkZXZpY2UocykuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIGRldmljZXMgY3JpdGVyaW9uIHVwZGF0ZWQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSkgPSAwOworCisgICAgLyoqCisgICAgICogVHJhbnNsYXRlIGEgdm9sdW1lIGluZGV4IGdpdmVuIGJ5IHRoZSBVSSB0byBhbiBhbXBsaWZpY2F0aW9uIHZhbHVlIGluIGRCIGZvciBhIHN0cmVhbSB0eXBlCisgICAgICogYW5kIGEgZGV2aWNlIGNhdGVnb3J5LgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBkZXZpY2VDYXRlZ29yeSBmb3Igd2hpY2ggdGhlIGNvbnZlcnNpb24gaXMgcmVxdWVzdGVkLgorICAgICAqIEBwYXJhbVtpbl0gc3RyZWFtIHR5cGUgZm9yIHdoaWNoIHRoZSBjb252ZXJzaW9uIGlzIHJlcXVlc3RlZC4KKyAgICAgKiBAcGFyYW1baW5dIGluZGV4SW5VaSBpbmRleCByZWNlaXZlZCBmcm9tIHRoZSBVSSB0byBiZSB0cmFuc2xhdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBhbXBsaWZpY2F0aW9uIHZhbHVlIGluIGRCIG1hdGNoaW5nIHRoZSBVSSBpbmRleCBmb3IgdGhpcyBnaXZlbiBkZXZpY2UgYW5kIHN0cmVhbS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGZsb2F0IHZvbEluZGV4VG9EYihWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoZSBtaW4gLyBtYXggaW5kZXggb2Ygdm9sdW1lIGFwcGxpY2FibGUgZm9yIGEgZ2l2ZW4gc3RyZWFtIHR5cGUuIFRoZXNlIGluZGV4ZXMKKyAgICAgKiB3aWxsIGJlIHVzZWQgdXBvbiBjb252ZXJzaW9uIG9mIFVJIGluZGV4IHRvIHZvbHVtZSBhbXBsaWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBzdHJlYW0gdHlwZSBmb3Igd2hpY2ggdGhlIGluZGV4ZXMgbmVlZCB0byBiZSBzZXQKKyAgICAgKiBAcGFyYW1baW5dIGluZGV4TWluIE1pbmltdW0gaW5kZXggYWxsb3dlZCBmb3IgdGhpcyBzdHJlYW0uCisgICAgICogQHBhcmFtW2luXSBpbmRleE1heCBNYXhpbXVtIGluZGV4IGFsbG93ZWQgZm9yIHRoaXMgc3RyZWFtLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpID0gMDsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdm9sdW1lIGN1cnZlcyBmb3IgZWFjaCBzdHJhdGVneSBhbmQgZGV2aWNlIGNhdGVnb3J5CisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGlzU3BlYWtlckRyY0VuYWJsZWQgdHJ1ZSBvbiBkZXZpY2VzIHRoYXQgdXNlIERSQyBvbiB0aGUgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgICAgICAgICAgIHBhdGggdG8gYm9vc3Qgc29mdCBzb3VuZHMsIHVzZWQgdG8gYWRqdXN0IHZvbHVtZSBjdXJ2ZXMgYWNjb3JkaW5nbHkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6ZVZvbHVtZUN1cnZlcyhib29sIGlzU3BlYWtlckRyY0VuYWJsZWQpID0gMDsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZSgpIHt9Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZkNDNkZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8QXVkaW9HYWluLmg+CisjaW5jbHVkZSA8QXVkaW9Qb3J0Lmg+CisjaW5jbHVkZSA8QXVkaW9QYXRjaC5oPgorI2luY2x1ZGUgPElPUHJvZmlsZS5oPgorI2luY2x1ZGUgPERldmljZURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxBdWRpb0lucHV0RGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPEF1ZGlvT3V0cHV0RGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWl4Lmg+CisjaW5jbHVkZSA8U291bmRUcmlnZ2VyU2Vzc2lvbi5oPgorI2luY2x1ZGUgPFN0cmVhbURlc2NyaXB0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGlzIGFuIG9ic2VydmVyIHRoYXQgdGhlIG1hbmFnZXIgc2hhbGwgaW1wbGVtZW50IHRvIGFsbG93cyBlLmcuIHRoZSBlbmdpbmUKKyAqIHRvIGFjY2VzcyB0byBwb2xpY3kgcGlsbGFycyBlbGVtZW50cyAobGlrZSBvdXRwdXQgLyBpbnB1dCBkZXNjcml0b3JzIGNvbGxlY3Rpb25zLAorICogSHdNb2R1bGUgY29sbGVjdGlvbnMsIEF1ZGlvTWl4LCAuLi4KKyAqLworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIGNvbnN0IEF1ZGlvUGF0Y2hDb2xsZWN0aW9uICZnZXRBdWRpb1BhdGNoZXMoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIGNvbnN0IFNvdW5kVHJpZ2dlclNlc3Npb25Db2xsZWN0aW9uICZnZXRTb3VuZFRyaWdnZXJTZXNzaW9uQ29sbGVjdGlvbigpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgY29uc3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uICZnZXRBdWRpb1BvbGljeU1peENvbGxlY3Rpb24oKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZnZXRPdXRwdXRzKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBjb25zdCBBdWRpb0lucHV0Q29sbGVjdGlvbiAmZ2V0SW5wdXRzKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBjb25zdCBEZXZpY2VWZWN0b3IgJmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIGNvbnN0IERldmljZVZlY3RvciAmZ2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbiAmZ2V0U3RyZWFtRGVzY3JpcHRvcnMoKSA9IDA7CisKKyAgICB2aXJ0dWFsIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZnZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIoKSB7fQorfTsKKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjE4YzUyMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTkgQEAKK2lmZXEgKCQoVVNFX0NPTkZJR1VSQUJMRV9BVURJT19QT0xJQ1kpLCAxKQorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKKyMgQ29tcG9uZW50IGJ1aWxkCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBzcmMvRW5naW5lLmNwcCBcCisgICAgc3JjL0VuZ2luZUluc3RhbmNlLmNwcCBcCisgICAgc3JjL1N0cmVhbS5jcHAgXAorICAgIHNyYy9TdHJhdGVneS5jcHAgXAorICAgIHNyYy9Vc2FnZS5jcHAgXAorICAgIHNyYy9JbnB1dFNvdXJjZS5jcHAgXAorCithdWRpb19wb2xpY3lfZW5naW5lX2luY2x1ZGVzX2NvbW1vbiA6PSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlIFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UKKworTE9DQUxfQ0ZMQUdTICs9IFwKKyAgICAtV2FsbCBcCisgICAgLVdlcnJvciBcCisgICAgLVdleHRyYSBcCisKK0xPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSBcCisgICAgJChhdWRpb19wb2xpY3lfZW5naW5lX2luY2x1ZGVzX2NvbW1vbikKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChhdWRpb19wb2xpY3lfZW5naW5lX2luY2x1ZGVzX2NvbW1vbikgXAorICAgICQoVEFSR0VUX09VVF9IRUFERVJTKS9odyBcCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGZyYW1ld29ya3MtYXYpIFwKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlCisKKworTE9DQUxfTU9EVUxFIDo9IGxpYmF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhYmxlCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgbGlibWVkaWFfaGVscGVyIFwKKyAgICBsaWJhdWRpb3BvbGljeXBmd3dyYXBwZXIgXAorICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJjdXRpbHMgXAorICAgIGxpYnV0aWxzIFwKKyAgICBsaWJhdWRpb3V0aWxzIFwKKyAgICBsaWJwYXJhbWV0ZXIKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBSZWN1cnNpdmUgY2FsbCBzdWItZm9sZGVyIEFuZHJvaWQubWsKKyMKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlL0F1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlL0F1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YzRiZTJjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUvQXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlOworY2xhc3MgQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2U7CisKK25hbWVzcGFjZSBhbmRyb2lkCit7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit7CisKK2NsYXNzIEVuZ2luZTsKKworY2xhc3MgRW5naW5lSW5zdGFuY2UKK3sKK3Byb3RlY3RlZDoKKyAgICBFbmdpbmVJbnN0YW5jZSgpOworCitwdWJsaWM6CisgICAgdmlydHVhbCB+RW5naW5lSW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIEdldCBBdWRpbyBQb2xpY3kgRW5naW5lIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHJldHVybiBwb2ludGVyIHRvIFJvdXRlIE1hbmFnZXIgSW5zdGFuY2Ugb2JqZWN0LgorICAgICAqLworICAgIHN0YXRpYyBFbmdpbmVJbnN0YW5jZSAqZ2V0SW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSBxdWVyeS4KKyAgICAgKiBUaGUgZmlyc3QgY2xpZW50IG9mIGFuIGludGVyZmFjZSBvZiB0aGUgcG9saWN5IGVuZ2luZSB3aWxsIHN0YXJ0IHRoZSBzaW5nbGV0b24uCisgICAgICoKKyAgICAgKiBAdHBhcmFtIFJlcXVlc3RlZEludGVyZmFjZTogaW50ZXJmYWNlIHRoYXQgdGhlIGNsaWVudCBpcyB3aXNoaW5nIHRvIHJldHJpZXZlLgorICAgICAqCisgICAgICogQHJldHVybiBpbnRlcmZhY2UgaGFuZGxlLgorICAgICAqLworICAgIHRlbXBsYXRlIDxjbGFzcyBSZXF1ZXN0ZWRJbnRlcmZhY2U+CisgICAgUmVxdWVzdGVkSW50ZXJmYWNlICpxdWVyeUludGVyZmFjZSgpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgLyoqCisgICAgICogR2V0IEF1ZGlvIFBvbGljeSBFbmdpbmUgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEF1ZGlvIFBvbGljeSBFbmdpbmUgc2luZ2xldG9uLgorICAgICAqLworICAgIEVuZ2luZSAqZ2V0RW5naW5lKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgLyogQ29weSBmYWNpbGl0aWVzIGFyZSBwdXQgcHJpdmF0ZSB0byBkaXNhYmxlIGNvcHkuICovCisgICAgRW5naW5lSW5zdGFuY2UoY29uc3QgRW5naW5lSW5zdGFuY2UgJm9iamVjdCk7CisgICAgRW5naW5lSW5zdGFuY2UgJm9wZXJhdG9yPShjb25zdCBFbmdpbmVJbnN0YW5jZSAmb2JqZWN0KTsKK307CisKKy8qKgorICogTGltaXQgdGVtcGxhdGUgaW5zdGFudGF0aW9uIHRvIHN1cHBvcnRlZCB0eXBlIGludGVyZmFjZXMuCisgKiBDb21waWxlIHRpbWUgZXJyb3Igd2lsbCBjbGFpbSBpZiBpbnZhbGlkIGludGVyZmFjZSBpcyByZXF1ZXN0ZWQuCisgKi8KK3RlbXBsYXRlIDw+CitBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UgKkVuZ2luZUluc3RhbmNlOjpxdWVyeUludGVyZmFjZSgpIGNvbnN0OworCit0ZW1wbGF0ZSA8PgorQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKkVuZ2luZUluc3RhbmNlOjpxdWVyeUludGVyZmFjZSgpIGNvbnN0OworCit9OyAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL3JvdW5kdXAuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlL0VuZ2luZURlZmluaXRpb24uaApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CnNpbWlsYXJpdHkgaW5kZXggNjglCnJlbmFtZSBmcm9tIGluY2x1ZGUvbWVkaWEvbmJhaW8vcm91bmR1cC5oCnJlbmFtZSB0byBzZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZS9FbmdpbmVEZWZpbml0aW9uLmgKaW5kZXggNGMzY2MyNS4uNTRkOGRiNQotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL3JvdW5kdXAuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZS9FbmdpbmVEZWZpbml0aW9uLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwxOCArMTQsOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBST1VORFVQX0gKLSNkZWZpbmUgUk9VTkRVUF9ICisjcHJhZ21hIG9uY2UKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgorI2luY2x1ZGUgPFZvbHVtZS5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAotLy8gUm91bmQgdXAgdG8gdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyCi11bnNpZ25lZCByb3VuZHVwKHVuc2lnbmVkIHYpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi0jZW5kaWYgIC8vIFJPVU5EVVBfSAordHlwZWRlZiBzdGQ6OnZlY3RvcjxWb2x1bWVDdXJ2ZVBvaW50PiBWb2x1bWVDdXJ2ZVBvaW50czsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NGRhYmE1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZS9BdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxFbmdpbmVEZWZpbml0aW9uLmg+CisjaW5jbHVkZSA8Vm9sdW1lLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyB0aGUgcGFyYW1ldGVyIHBsdWdpbiB0bzoKKyAqICAtIGluc3RhbnRpYXRlIGFsbCB0aGUgbWVtYmVycyBvZiB0aGUgcG9saWN5IGVuZ2luZSAoc3RyYXRlZ2llcywgaW5wdXQgc291cmNlcywgdXNhZ2VzLCBwcm9maWxlcykKKyAqICAtIGtlZXAgdXAgdG8gZGF0ZSB0aGUgYXR0cmlidXRlcyBvZiB0aGVzZSBwb2xpY3kgbWVtYmVycyAoIGkuZS4gZGV2aWNlcyB0byBiZSB1c2VkIGZvciBhCisgKiAgICBzdHJhdGVneSwgc3RyYXRlZ3kgdG8gYmUgZm9sbG93ZWQgYnkgYSB1c2FnZSBvciBhIHN0cmVhbSwgLi4uKQorICovCitjbGFzcyBBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZQoreworcHVibGljOgorICAgIC8qKgorICAgICAqIEFkZCBhIHN0cmF0ZWd5IHRvIHRoZSBlbmdpbmUKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gbmFtZSBvZiB0aGUgc3RyYXRlZ3kgdG8gYWRkCisgICAgICogQHBhcmFtW2luXSBpZGVudGlmaWVyOiB0aGUgbnVtZXJpY2FsIHZhbHVlIGFzc29jaWF0ZWQgdG8gdGhpcyBtZW1iZXIuIEl0IE1VU1QgbWF0Y2ggZWl0aGVyCisgICAgICogICAgICAgICAgICBzeXN0ZW0vYXVkaW8uaCBvciBzeXN0ZW0vYXVkaW9fcG9saWN5LmggZW51bXJhdGlvbiB2YWx1ZSBpbiBvcmRlciB0byBsaW5rIHRoZQorICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyIGNvbnRyb2xlZCBieSB0aGUgUEZXIGFuZCB0aGUgcG9saWN5IG1hbmFnZXIgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgc3RyYXRlZ3kgaGFzIGJlZW4gYWRkZWQgc3VjY2Vzc2Z1bGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqLworICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgYWRkU3RyYXRlZ3koY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIHJvdXRpbmdfc3RyYXRlZ3kgaWQpID0gMDsKKworICAgIC8qKgorICAgICAqIEFkZCBhIHN0cmVhbXMgdG8gdGhlIGVuZ2luZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gbmFtZSBvZiB0aGUgc3RyZWFtIHRvIGFkZAorICAgICAqIEBwYXJhbVtpbl0gaWRlbnRpZmllcjogdGhlIG51bWVyaWNhbCB2YWx1ZSBhc3NvY2lhdGVkIHRvIHRoaXMgbWVtYmVyLiBJdCBNVVNUIG1hdGNoIGVpdGhlcgorICAgICAqICAgICAgICAgICAgc3lzdGVtL2F1ZGlvLmggb3Igc3lzdGVtL2F1ZGlvX3BvbGljeS5oIGVudW1yYXRpb24gdmFsdWUgaW4gb3JkZXIgdG8gbGluayB0aGUKKyAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciBjb250cm9sZWQgYnkgdGhlIFBGVyBhbmQgdGhlIHBvbGljeSBtYW5hZ2VyIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIHN0cmVhbSBoYXMgYmVlbiBhZGRlZCBzdWNjZXNzZnVsbHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgICAqCisgICAgICovCisgICAgdmlydHVhbCBhbmRyb2lkOjpzdGF0dXNfdCBhZGRTdHJlYW0oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3N0cmVhbV90eXBlX3QgaWQpID0gMDsKKworICAgIC8qKgorICAgICAqIEFkZCBhIHVzYWdlIHRvIHRoZSBlbmdpbmUKKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gbmFtZSBvZiB0aGUgdXNhZ2UgdG8gYWRkCisgICAgICogQHBhcmFtW2luXSBpZGVudGlmaWVyOiB0aGUgbnVtZXJpY2FsIHZhbHVlIGFzc29jaWF0ZWQgdG8gdGhpcyBtZW1iZXIuIEl0IE1VU1QgbWF0Y2ggZWl0aGVyCisgICAgICogICAgICAgICAgICBzeXN0ZW0vYXVkaW8uaCBvciBzeXN0ZW0vYXVkaW9fcG9saWN5LmggZW51bXJhdGlvbiB2YWx1ZSBpbiBvcmRlciB0byBsaW5rIHRoZQorICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyIGNvbnRyb2xlZCBieSB0aGUgUEZXIGFuZCB0aGUgcG9saWN5IG1hbmFnZXIgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgdXNhZ2UgaGFzIGJlZW4gYWRkZWQgc3VjY2Vzc2Z1bGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqLworICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgYWRkVXNhZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3VzYWdlX3QgaWQpID0gMDsKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBpbnB1dCBzb3VyY2UgdG8gdGhlIGVuZ2luZQorICAgICAqCisgICAgICogQHBhcmFtW2luXSBuYW1lIG9mIHRoZSBpbnB1dCBzb3VyY2UgdG8gYWRkCisgICAgICogQHBhcmFtW2luXSBpZGVudGlmaWVyOiB0aGUgbnVtZXJpY2FsIHZhbHVlIGFzc29jaWF0ZWQgdG8gdGhpcyBtZW1iZXIuIEl0IE1VU1QgbWF0Y2ggZWl0aGVyCisgICAgICogICAgICAgICAgICBzeXN0ZW0vYXVkaW8uaCBvciBzeXN0ZW0vYXVkaW9fcG9saWN5LmggZW51bXJhdGlvbiB2YWx1ZSBpbiBvcmRlciB0byBsaW5rIHRoZQorICAgICAqICAgICAgICAgICAgcGFyYW1ldGVyIGNvbnRyb2xlZCBieSB0aGUgUEZXIGFuZCB0aGUgcG9saWN5IG1hbmFnZXIgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgaW5wdXQgc291cmNlIGhhcyBiZWVuIGFkZGVkIHN1Y2Nlc3NmdWxseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IGFkZElucHV0U291cmNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb19zb3VyY2VfdCBpZCkgPSAwOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBkZXZpY2UgdG8gYmUgdXNlZCBieSBhIHN0cmF0ZWd5LgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBzdHJhdGVneTogbmFtZSBvZiB0aGUgc3RyYXRlZ3kgZm9yIHdoaWNoIHRoZSBkZXZpY2UgdG8gdXNlIGhhcyB0byBiZSBzZXQKKyAgICAgKiBAcGFyYW1baW5dIGRldmljZXM7IG1hc2sgb2YgZGV2aWNlcyB0byBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4gc3RyYXRlZ3kuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRldmljZXMgd2VyZSBzZXQgY29ycmVjbHR5IGZvciB0aGlzIHN0cmF0ZWd5LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIHNldERldmljZUZvclN0cmF0ZWd5KGNvbnN0IHJvdXRpbmdfc3RyYXRlZ3kgJnN0cmF0ZWd5LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykgPSAwOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdHJhdGVneSB0byBiZSBmb2xsb3dlZCBieSBhIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gc3RyZWFtOiBuYW1lIG9mIHRoZSBzdHJlYW0gZm9yIHdoaWNoIHRoZSBzdHJhdGVneSB0byB1c2UgaGFzIHRvIGJlIHNldAorICAgICAqIEBwYXJhbVtpbl0gc3RyYXRlZ3kgdG8gZm9sbG93IGZvciB0aGUgZ2l2ZW4gc3RyZWFtLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdHJhdGVneSB3ZXJlIHNldCBjb3JyZWNsdHkgZm9yIHRoaXMgc3RyZWFtLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIHNldFN0cmF0ZWd5Rm9yU3RyZWFtKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbSwgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkgPSAwOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdHJhdGVneSB0byBiZSBmb2xsb3dlZCBieSBhIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gc3RyZWFtOiBuYW1lIG9mIHRoZSBzdHJlYW0gZm9yIHdoaWNoIHRoZSBzdHJhdGVneSB0byB1c2UgaGFzIHRvIGJlIHNldAorICAgICAqIEBwYXJhbVtpbl0gc3RyYXRlZ3kgdG8gZm9sbG93IGZvciB0aGUgZ2l2ZW4gc3RyZWFtLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdHJhdGVneSB3ZXJlIHNldCBjb3JyZWNsdHkgZm9yIHRoaXMgc3RyZWFtLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIHNldFZvbHVtZVByb2ZpbGVGb3JTdHJlYW0oY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnRzICZwb2ludHMpID0gMDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3RyYXRlZ3kgdG8gYmUgZm9sbG93ZWQgYnkgYSB1c2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdXNhZ2U6IG5hbWUgb2YgdGhlIHVzYWdlIGZvciB3aGljaCB0aGUgc3RyYXRlZ3kgdG8gdXNlIGhhcyB0byBiZSBzZXQKKyAgICAgKiBAcGFyYW1baW5dIHN0cmF0ZWd5IHRvIGZvbGxvdyBmb3IgdGhlIGdpdmVuIHVzYWdlLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdHJhdGVneSB3ZXJlIHNldCBjb3JyZWNsdHkgZm9yIHRoaXMgdXNhZ2UsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgc2V0U3RyYXRlZ3lGb3JVc2FnZShjb25zdCBhdWRpb191c2FnZV90ICZ1c2FnZSwgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkgPSAwOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBpbnB1dCBkZXZpY2UgdG8gYmUgdXNlZCBieSBhbiBpbnB1dCBzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGlucHV0U291cmNlOiBuYW1lIG9mIHRoZSBpbnB1dCBzb3VyY2UgZm9yIHdoaWNoIHRoZSBkZXZpY2UgdG8gdXNlIGhhcyB0byBiZSBzZXQKKyAgICAgKiBAcGFyYW1baW5dIGRldmljZXM7IG1hc2sgb2YgZGV2aWNlcyB0byBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4gaW5wdXQgc291cmNlLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2VzIHdlcmUgc2V0IGNvcnJlY2x0eSBmb3IgdGhpcyBpbnB1dCBzb3VyY2UsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoY29uc3QgYXVkaW9fc291cmNlX3QgJmlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZSgpIHt9Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwMmZkNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL0FuZHJvaWQubWsKQEAgLTAsMCArMSw3IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFJlY3Vyc2l2ZSBjYWxsIHN1Yi1mb2xkZXIgQW5kcm9pZC5taworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YjE5MDIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL0FuZHJvaWQubWsKQEAgLTAsMCArMSwxMDUgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBATk9URToKKyMgQXVkaW8gUG9saWN5IEVuZ2luZSBjb25maWd1cmFibGUgZXhhbXBsZSBmb3IgZ2VuZXJpYyBkZXZpY2UgYnVpbGQKKyMKKyMgQW55IHZlbmRvciBzaGFsbCBoYXZlIGl0cyBvd24gY29uZmlndXJhdGlvbiB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgZGV2aWNlIGZvbGRlcgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitQRldfQ09SRSA6PSBleHRlcm5hbC9wYXJhbWV0ZXItZnJhbWV3b3JrCitCVUlMRF9QRldfU0VUVElOR1MgOj0gJChQRldfQ09SRSkvc3VwcG9ydC9hbmRyb2lkL2J1aWxkX3Bmd19zZXR0aW5ncy5taworUEZXX0RFRkFVTFRfU0NIRU1BU19ESVIgOj0gJChQRldfQ09SRSkvU2NoZW1hcworUEZXX1NDSEVNQVNfRElSIDo9ICQoUEZXX0RFRkFVTFRfU0NIRU1BU19ESVIpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDT05GSUdVUkFUSU9OIEZJTEVTCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyBQb2xpY3kgUEZXIHRvcCBsZXZlbCBmaWxlICMjIyMjIyMjIworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKExPQ0FMX01PRFVMRSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworCisjIyMjIyMjIyMjIFBvbGljeSBQRlcgU3RydWN0dXJlcyAjIyMjIyMjIyMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gUG9saWN5Q2xhc3MueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9TdHJ1Y3R1cmUvUG9saWN5CitMT0NBTF9TUkNfRklMRVMgOj0gU3RydWN0dXJlLyQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBQb2xpY3lTdWJzeXN0ZW0ueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCisgICAgUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbCBcCisgICAgUG9saWN5U3Vic3lzdGVtLVZvbHVtZS54bWwgXAorICAgIGxpYnBvbGljeS1zdWJzeXN0ZW0gXAorCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kKK0xPQ0FMX1NSQ19GSUxFUyA6PSBTdHJ1Y3R1cmUvJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IFBvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kKK0xPQ0FMX1NSQ19GSUxFUyA6PSBTdHJ1Y3R1cmUvJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IFBvbGljeVN1YnN5c3RlbS1Wb2x1bWUueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9TdHJ1Y3R1cmUvUG9saWN5CitMT0NBTF9TUkNfRklMRVMgOj0gU3RydWN0dXJlLyQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCisjIyMjIyMjIyMgUG9saWN5IFBGVyBTZXR0aW5ncyAjIyMjIyMjIyMKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsucG9saWN5CitMT0NBTF9NT0RVTEVfU1RFTSA6PSBQb2xpY3lDb25maWd1cmFibGVEb21haW5zLnhtbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gcGFyYW1ldGVyLWZyYW1ld29yay9TZXR0aW5ncy9Qb2xpY3kKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9IFwKKyAgICAgICAgUG9saWN5Q2xhc3MueG1sIFwKKyAgICAgICAgUG9saWN5U3Vic3lzdGVtLnhtbCBcCisgICAgICAgIFBhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCisKK2lmZXEgKCQocGZ3X3JlYnVpbGRfc2V0dGluZ3MpLHRydWUpCitQRldfVE9QTEVWRUxfRklMRSA6PSAkKFRBUkdFVF9PVVRfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCitQRldfQ1JJVEVSSUFfRklMRSA6PSAkKExPQ0FMX1BBVEgpL3BvbGljeV9jcml0ZXJpYS50eHQKK1BGV19FRERfRklMRVMgOj0gXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfbWVkaWEucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Bob25lLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9kdG1mLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9lbmZvcmNlZF9hdWRpYmxlLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2FjY2Vzc2liaWxpdHkucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Jlcm91dGluZy5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl9zdHJlYW0ucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9zdHJhdGVneV9mb3JfdXNhZ2UucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX2lucHV0X3NvdXJjZS5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL3ZvbHVtZXMucGZ3CisKK2luY2x1ZGUgJChCVUlMRF9QRldfU0VUVElOR1MpCitlbHNlCisjIFVzZSB0aGUgZXhpc3RpbmcgZmlsZQorTE9DQUxfU1JDX0ZJTEVTIDo9IFNldHRpbmdzLyQoTE9DQUxfTU9EVUxFX1NURU0pCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCitlbmRpZiAjIHBmd19yZWJ1aWxkX3NldHRpbmdzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OTA1MjAxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbApAQCAtMCwwICsxLDE1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFBhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb24geG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iU2NoZW1hcy9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uLnhzZCIKKyAgICBTeXN0ZW1DbGFzc05hbWU9IlBvbGljeSIgU2VydmVyUG9ydD0iNTAxOSIgVHVuaW5nQWxsb3dlZD0idHJ1ZSI+CisKKyAgICA8U3Vic3lzdGVtUGx1Z2lucz4KKyAgICAgICAgPExvY2F0aW9uIEZvbGRlcj0iIj4KKyAgICAgICAgICAgIDxQbHVnaW4gTmFtZT0ibGlicG9saWN5LXN1YnN5c3RlbS5zbyIvPgorICAgICAgICA8L0xvY2F0aW9uPgorICAgIDwvU3Vic3lzdGVtUGx1Z2lucz4KKyAgICA8U3RydWN0dXJlRGVzY3JpcHRpb25GaWxlTG9jYXRpb24gUGF0aD0iU3RydWN0dXJlL1BvbGljeS9Qb2xpY3lDbGFzcy54bWwiLz4KKyAgICA8U2V0dGluZ3NDb25maWd1cmF0aW9uPgorICAgICAgICA8Q29uZmlndXJhYmxlRG9tYWluc0ZpbGVMb2NhdGlvbiBQYXRoPSJTZXR0aW5ncy9Qb2xpY3kvUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy54bWwiLz4KKyAgICA8L1NldHRpbmdzQ29uZmlndXJhdGlvbj4KKzwvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvUkVBRE1FLm1kIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI2NjhlMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTEgQEAKK0NvbmZpZ3VyYWJsZSBQb2xpY3kgRW5naW5lIEV4YW1wbGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZm9sZGVyIGV4cG9zZXMgYSBnZW5lcmljIGZ1bmN0aW9uYWwgY29uZmlndXJhYmxlIHBvbGljeSBlbmdpbmUgY29uZmlndXJhdGlvbiBmaWxlcwordG8gcHJvdmlkZSB0byBoYXZlIGEgcHJvZHVjdCBmb2xsb3dpbmcgdGhlIG5leHVzIGV4cGVyaWVuY2UuCisKK0EgdmVuZG9yIHdpc2hpbmcgdG8gY3VzdG9taXplIHRoZSBiZWhhdmlvciBzaGFsbCBwcm92aWRlcyBpdHMgb3duIHNldCBvZiBjb25maWd1cmF0aW9uIGZpbGVzCit3aXRoaW4gdGhlIGRldmljZSBmb2xkZXIgZm9yIHRoZSBwcm9kdWN0IHRvIGN1c3RvbWl6ZS4KKworRm9yIGFueSBxdWVzdGlvbiBhYm91dCB0aGUgcGFyYW1ldGVyIGZyYW1ld29yayBhbmQgY29uZmlndXJhdGlvbiBmaWxlcywKK1NlZSBbdGhlIHdpa2kgb24gZ2l0aHViXShodHRwczovL2dpdGh1Yi5jb20vMDFvcmcvcGFyYW1ldGVyLWZyYW1ld29yay93aWtpKS4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL1BvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYjA3MjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL1BvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sCkBAIC0wLDAgKzEsMTEyOTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tICMjIyMgRE8gTk9UIEVESVQgVEhJUyBGSUxFICMjIyMgLS0+Cis8Q29uZmlndXJhYmxlRG9tYWlucyB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iU2NoZW1hcy9Db25maWd1cmFibGVEb21haW5zLnhzZCIgU3lzdGVtQ2xhc3NOYW1lPSJQb2xpY3kiPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvclN0cmF0ZWd5Lk1lZGlhLlVucmVhY2hhYmxlRGV2aWNlcyIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ii8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvclN0cmF0ZWd5Lk1lZGlhLkRldmljZTIiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZW1vdGVTdWJtaXgiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJSZW1vdGVTdWJtaXgiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmUiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZU5vQnRBMmRwIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwSGVhZHBob25lcyIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBTcGVha2VyIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcFNwZWFrZXIiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJGb3JjZVNwZWFrZXIiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHBob25lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iV2lyZWRIZWFkcGhvbmUiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iTGluZSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkFjY2Vzc29yeSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlVzYkFjY2Vzc29yeSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlVzYkRldmljZSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRndGxEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkRndGxEb2NrSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkF1eERpZ2l0YWwiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJIZG1pIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQW5sZ0RvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQW5sZ0RvY2tIZWFkc2V0Ii8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckRvY2siIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQW5hbG9nRG9jayIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNwZWFrZXIiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlJlbW90ZVN1Ym1peCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHAiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwSGVhZHBob25lIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcFNwZWFrZXIiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJGb3JjZVNwZWFrZXIiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRwaG9uZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkxpbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JBY2Nlc3NvcnkiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JEZXZpY2UiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZ3RsRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBdXhEaWdpdGFsIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQW5sZ0RvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU3BlYWtlciI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuTWVkaWEuQXJjIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2VsZWN0ZWQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJIZG1pQXJjIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTm90U2VsZWN0ZWQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTZWxlY3RlZCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pX2FyYyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJOb3RTZWxlY3RlZCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pX2FyYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuTWVkaWEuU3BkaWYiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTZWxlY3RlZCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlNwZGlmIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTm90U2VsZWN0ZWQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTZWxlY3RlZCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJOb3RTZWxlY3RlZCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuTWVkaWEuQXV4TGluZSIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNlbGVjdGVkIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQXV4TGluZSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vdFNlbGVjdGVkIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2VsZWN0ZWQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYXV4X2xpbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTm90U2VsZWN0ZWQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYXV4X2xpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvclN0cmF0ZWd5LlBob25lLlVucmVhY2hhYmxlRGV2aWNlcyIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pX2FyYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhdXhfbGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5QaG9uZS5EZXZpY2UiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTY29DYXJraXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhTY29DYXJraXQiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VCdFNjbyIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aFNjb0hlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhTY29IZWFkc2V0Ii8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQnRTY28iLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhTY28iPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhTY28iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VCdFNjbyIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHAiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZUJ0U2NvIi8+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VOb25lIi8+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwSGVhZHBob25lcyIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VCdFNjbyIvPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlTm9uZSIvPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBTcGVha2VyIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcFNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZU5vQnRBMmRwIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHBob25lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iV2lyZWRIZWFkcGhvbmUiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iV2lyZWRIZWFkc2V0Ii8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlVzYkRldmljZSIvPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZUJ0U2NvIi8+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VOb25lIi8+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iRXhjbHVkZXMiIFZhbHVlPSJVc2JBY2Nlc3NvcnkiLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkFjY2Vzc29yeSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlVzYkFjY2Vzc29yeSIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZ3RsRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJEZ3RsRG9ja0hlYWRzZXQiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iSGRtaSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkhkbWkiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQW5sZ0RvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQW5sZ0RvY2tIZWFkc2V0Ii8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkVhcnBpZWNlIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iRWFycGllY2UiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTGluZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkxpbmUiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU3BlYWtlciI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVmYXVsdCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2NvQ2Fya2l0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aFNjb0hlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoU2NvIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHAiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcFNwZWFrZXIiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkcGhvbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JBY2Nlc3NvcnkiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGd0bERvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkhkbWkiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQW5sZ0RvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkVhcnBpZWNlIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkxpbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU3BlYWtlciI+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+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5Tb25pZmljYXRpb24uVW5yZWFjaGFibGVEZXZpY2VzIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQ2FsaWJyYXRpb24iPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pX2FyYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhdXhfbGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5Tb25pZmljYXRpb24uU3BlYWtlciIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNlbGVjdGVkIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iU3BlYWtlciIvPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJFeGNsdWRlcyIgVmFsdWU9IkxpbmUiLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vdFNlbGVjdGVkIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2VsZWN0ZWQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJOb3RTZWxlY3RlZCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5Tb25pZmljYXRpb24uRGV2aWNlMiIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHAiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmVzIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZU5vQnRBMmRwIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcFNwZWFrZXIiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwU3BlYWtlciIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTY29DYXJraXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQnRTY28iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aFNjb0NhcmtpdCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNjb0hlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQnRTY28iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aFNjb0hlYWRzZXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTY28iPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQnRTY28iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aFNjbyIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHBob25lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iV2lyZWRIZWFkcGhvbmUiLz4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkxpbmUiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJMaW5lIi8+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJXaXJlZEhlYWRzZXQiLz4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlVzYkRldmljZSIvPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iRXhjbHVkZXMiIFZhbHVlPSJVc2JBY2Nlc3NvcnkiLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiQWNjZXNzb3J5Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iVXNiQWNjZXNzb3J5Ii8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGd0bERvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iRGd0bERvY2tIZWFkc2V0Ii8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQW5sZ0RvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQW5sZ0RvY2tIZWFkc2V0Ii8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckRvY2siIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQW5hbG9nRG9jayIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkVhcnBpZWNlIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkVhcnBpZWNlIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTm9uZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHAiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmVzIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwU3BlYWtlciI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2NvQ2Fya2l0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTY29IZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTY28iPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHBob25lIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiQWNjZXNzb3J5Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZ3RsRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkFubGdEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRWFycGllY2UiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5Tb25pZmljYXRpb25SZXNwZWN0ZnVsLlVucmVhY2hhYmxlRGV2aWNlcyIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pX2FyYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhdXhfbGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5Tb25pZmljYXRpb25SZXNwZWN0ZnVsLlNwZWFrZXJzIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU3BlYWtlclNhZmUiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJTcGVha2VyU2FmZSIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTcGVha2VyIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iU3BlYWtlciIvPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJFeGNsdWRlcyIgVmFsdWU9IkxpbmUiLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vbmUiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNwZWFrZXJTYWZlIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyX3NhZmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNwZWFrZXIiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTm9uZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuU29uaWZpY2F0aW9uUmVzcGVjdGZ1bC5EZXZpY2UyIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZU5vQnRBMmRwIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwU3BlYWtlciI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZU5vQnRBMmRwIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aFNjb0NhcmtpdCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VCdFNjbyIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoU2NvQ2Fya2l0Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoU2NvSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VCdFNjbyIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoU2NvSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aFNjbyI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VCdFNjbyIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoU2NvIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkcGhvbmUiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHBob25lIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTGluZVdoZW5Gb2xsb3dNZWRpYVN0cmF0ZWd5Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHBob25lIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iRXhjbHVkZXMiIFZhbHVlPSJVc2JBY2Nlc3NvcnkiLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iVXNiRGV2aWNlIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiQWNjZXNzb3J5Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iVXNiQWNjZXNzb3J5Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGd0bERvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iRGd0bERvY2tIZWFkc2V0Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQXV4RGlnaXRhbCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkhkbWkiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBbmxnRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckRvY2siIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQW5hbG9nRG9jayIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQW5sZ0RvY2tIZWFkc2V0Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRWFycGllY2UiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iRWFycGllY2UiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkxpbmUiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmVzIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBTcGVha2VyIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aFNjb0NhcmtpdCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhTY29IZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aFNjbyI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRwaG9uZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lV2hlbkZvbGxvd01lZGlhU3RyYXRlZ3kiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JBY2Nlc3NvcnkiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGd0bERvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkF1eERpZ2l0YWwiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQW5sZ0RvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkVhcnBpZWNlIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkxpbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvclN0cmF0ZWd5LkR0bWYuVW5yZWFjaGFibGVEZXZpY2VzIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQ2FsaWJyYXRpb24iPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvclN0cmF0ZWd5LkR0bWYuRGV2aWNlMiIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlJlbW90ZVN1Ym1peCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJSZW1vdGVTdWJtaXgiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHAiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwSGVhZHBob25lcyI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZU5vQnRBMmRwIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwSGVhZHBob25lcyIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBTcGVha2VyIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHBTcGVha2VyIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRm9yY2VTcGVha2VyV2hlbk5vdEluQ2FsbCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aFNjb0hlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhTY29IZWFkc2V0Ii8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQnRTY28iLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhTY28iPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhTY28iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VCdFNjbyIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHBob25lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJXaXJlZEhlYWRwaG9uZSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkxpbmVXaGVuRm9sbG93aW5nTWVkaWEiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iTGluZSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iV2lyZWRIZWFkc2V0Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiRGV2aWNlIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJFeGNsdWRlcyIgVmFsdWU9IlVzYkFjY2Vzc29yeSIvPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlVzYkRldmljZSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkFjY2Vzc29yeSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJVc2JBY2Nlc3NvcnkiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZ3RsRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iRGd0bERvY2tIZWFkc2V0Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iSGRtaSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJIZG1pIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQW5sZ0RvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yRG9jayIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VBbmFsb2dEb2NrIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJBbmxnRG9ja0hlYWRzZXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJFYXJwaWVjZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkVhcnBpZWNlIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkxpbmVXaGVuRmFsbFRocm91Z2hQaG9uZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkxpbmUiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU3BlYWtlciI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQiLz4KKyAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlJlbW90ZVN1Ym1peCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHAiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwSGVhZHBob25lcyI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBTcGVha2VyIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRm9yY2VTcGVha2VyV2hlbk5vdEluQ2FsbCI+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+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aFNjb0hlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhTY28iPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRwaG9uZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkxpbmVXaGVuRm9sbG93aW5nTWVkaWEiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JEZXZpY2UiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JBY2Nlc3NvcnkiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZ3RsRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJIZG1pIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQW5sZ0RvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRWFycGllY2UiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lV2hlbkZhbGxUaHJvdWdoUGhvbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTcGVha2VyIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVmYXVsdCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5EdG1mLkFyYyIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNlbGVjdGVkIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkhkbWlBcmMiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJOb3RTZWxlY3RlZCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNlbGVjdGVkIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWlfYXJjIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vdFNlbGVjdGVkIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWlfYXJjIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5EdG1mLlNwZGlmIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2VsZWN0ZWQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iU3BkaWYiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJOb3RTZWxlY3RlZCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNlbGVjdGVkIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vdFNlbGVjdGVkIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5EdG1mLkF1eExpbmUiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTZWxlY3RlZCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkluQ2FsbCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iSW5Db21tdW5pY2F0aW9uIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJBdXhMaW5lIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTm90U2VsZWN0ZWQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTZWxlY3RlZCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhdXhfbGluZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJOb3RTZWxlY3RlZCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhdXhfbGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9yU3RyYXRlZ3kuRW5mb3JjZWRBdWRpYmxlLlVucmVhY2hhYmxlRGV2aWNlcyIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQ2FsaWJyYXRpb24iPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pX2FyYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYXV4X2xpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5FbmZvcmNlZEF1ZGlibGUuU3BlYWtlciIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNlbGVjdGVkIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iU3BlYWtlciIvPgorICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQW55Ij4KKyAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JTeXN0ZW0iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlU3lzdGVtRW5mb3JjZWQiLz4KKyAgICAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iRXhjbHVkZXMiIFZhbHVlPSJSZW1vdGVTdWJtaXgiLz4KKyAgICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcCIvPgorICAgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMiLz4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJFeGNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHBTcGVha2VyIi8+CisgICAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iUmVtb3RlU3VibWl4Ii8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iV2lyZWRIZWFkcGhvbmUiLz4KKyAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iRXhjbHVkZXMiIFZhbHVlPSJMaW5lIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iV2lyZWRIZWFkc2V0Ii8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iVXNiQWNjZXNzb3J5Ii8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iVXNiRGV2aWNlIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iRGd0bERvY2tIZWFkc2V0Ii8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkV4Y2x1ZGVzIiBWYWx1ZT0iSGRtaSIvPgorICAgICAgICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iRXhjbHVkZXMiIFZhbHVlPSJBbmxnRG9ja0hlYWRzZXQiLz4KKyAgICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yRG9jayIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VBbmFsb2dEb2NrIi8+CisgICAgICAgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTm90U2VsZWN0ZWQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2VsZWN0ZWQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTm90U2VsZWN0ZWQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvclN0cmF0ZWd5LkVuZm9yY2VkQXVkaWJsZS5EZXZpY2UyIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iUmVtb3RlU3VibWl4Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iUmVtb3RlU3VibWl4Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHAiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlTm9CdEEyZHAiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwSGVhZHBob25lcyI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmVzIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZU5vQnRBMmRwIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcFNwZWFrZXIiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwU3BlYWtlciIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHBob25lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJXaXJlZEhlYWRwaG9uZSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkxpbmUiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkxpbmUiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkFjY2Vzc29yeSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yTWVkaWEiIE1hdGNoZXNXaGVuPSJJc05vdCIgVmFsdWU9IkZvcmNlU3BlYWtlciIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iVXNiQWNjZXNzb3J5Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiRGV2aWNlIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJVc2JEZXZpY2UiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZ3RsRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkRndGxEb2NrSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkhkbWkiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkhkbWkiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBbmxnRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yRG9jayIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VBbmFsb2dEb2NrIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJBbmxnRG9ja0hlYWRzZXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlJlbW90ZVN1Ym1peCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+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+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyX3NhZmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyX3NhZmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBTcGVha2VyIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRwaG9uZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+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+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyX3NhZmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTGluZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyX3NhZmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JBY2Nlc3NvcnkiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkRldmljZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyX3NhZmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGd0bERvY2tIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJIZG1pIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29fY2Fya2l0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdGVsZXBob255X3R4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBbmxnRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJlYXJwaWVjZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5UcmFuc21pdHRlZFRocm91Z2hTcGVha2VyLlVucmVhY2hlYWJsZURldmljZXMiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQ2FsaWJyYXRpb24iPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaV9hcmMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhdXhfbGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyX3NhZmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvclN0cmF0ZWd5LlRyYW5zbWl0dGVkVGhyb3VnaFNwZWFrZXIuU3BlYWtlciIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNlbGVjdGVkIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik5vdFNlbGVjdGVkIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2VsZWN0ZWQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJOb3RTZWxlY3RlZCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5BY2Nlc3NpYmlsaXR5LlVucmVhY2hhYmxlRGV2aWNlcyIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2VhcnBpZWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29fY2Fya2l0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaV9hcmMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImF1eF9saW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZm0iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm0iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyX3NhZmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlcl9zYWZlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3R4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JTdHJhdGVneS5BY2Nlc3NpYmlsaXR5LkRldmljZTIiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZW1vdGVTdWJtaXgiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJSZW1vdGVTdWJtaXgiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmUiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXNOb3QiIFZhbHVlPSJGb3JjZU5vQnRBMmRwIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwSGVhZHBob25lcyIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBTcGVha2VyIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JNZWRpYSIgTWF0Y2hlc1doZW49IklzTm90IiBWYWx1ZT0iRm9yY2VOb0J0QTJkcCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoQTJkcFNwZWFrZXIiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJGb3JjZVNwZWFrZXIiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvck1lZGlhIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IlNwZWFrZXIiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRwaG9uZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IldpcmVkSGVhZHBob25lIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iTGluZSI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkxpbmUiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJXaXJlZEhlYWRzZXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JBY2Nlc3NvcnkiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJVc2JBY2Nlc3NvcnkiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JEZXZpY2UiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJVc2JEZXZpY2UiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZ3RsRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJEZ3RsRG9ja0hlYWRzZXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBdXhEaWdpdGFsIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iSGRtaSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkFubGdEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZU91dHB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkFubGdEb2NrSGVhZHNldCIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JEb2NrIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZUFuYWxvZ0RvY2siLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTcGVha2VyIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iU3BlYWtlciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZW1vdGVTdWJtaXgiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHAiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBIZWFkcGhvbmUiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBTcGVha2VyIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJGb3JjZVNwZWFrZXIiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHBob25lIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlVzYkFjY2Vzc29yeSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiRGV2aWNlIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZ3RsRG9ja0hlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkF1eERpZ2l0YWwiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkFubGdEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU3BlYWtlciI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVmYXVsdCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvclN0cmF0ZWd5LlJlcm91dGluZy5VbnJlYWNoYWJsZURldmljZXMiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2ZtIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXJfc2FmZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9lYXJwaWVjZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfc2NvX2NhcmtpdCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay90ZWxlcGhvbnlfdHgiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pX2FyYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImF1eF9saW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9mbSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlcl9zYWZlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZWFycGllY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9zY28iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3NjbyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX3Njb19jYXJraXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3RlbGVwaG9ueV90eCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvclN0cmF0ZWd5LlJlcm91dGluZy5EZXZpY2UyIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+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+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJSZW1vdGVTdWJtaXgiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmx1ZXRvb3RoQTJkcCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCbHVldG9vdGhBMmRwSGVhZHBob25lIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJsdWV0b290aEEyZHBTcGVha2VyIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkZvcmNlU3BlYWtlciI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRwaG9uZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJMaW5lIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JBY2Nlc3NvcnkiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiRGV2aWNlIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRndGxEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBdXhEaWdpdGFsIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkFubGdEb2NrSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkcGhvbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHBob25lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTcGVha2VyIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGVha2VyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IlN0cmF0ZWd5Rm9yU3RyZWFtIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQ2FsaWJyYXRpb24iPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5waG9uZTwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+bWVkaWE8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5zb25pZmljYXRpb248L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+bWVkaWE8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+c29uaWZpY2F0aW9uPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5zb25pZmljYXRpb25fcmVzcGVjdGZ1bDwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPnBob25lPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+ZW5mb3JjZWRfYXVkaWJsZTwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPmR0bWY8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPnRyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlcjwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPmFjY2Vzc2liaWxpdHk8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPnJlcm91dGluZzwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IlNlbGVjdGVkU3RyYXRlZ3lGb3JVc2FnZXMuQ2FsaWJyYXRpb24iIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvdW5rbm93bi9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvbWVkaWEvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL3ZvaWNlX2NvbW11bmljYXRpb25fc2lnbmFsbGluZy9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvYWxhcm0vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbi9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvbm90aWZpY2F0aW9uX3RlbGVwaG9ueV9yaW5ndG9uZS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvbm90aWZpY2F0aW9uX2NvbW11bmljYXRpb25fcmVxdWVzdC9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvbm90aWZpY2F0aW9uX2NvbW11bmljYXRpb25faW5zdGFudC9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvbm90aWZpY2F0aW9uX2NvbW11bmljYXRpb25fZGVsYXllZC9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvbm90aWZpY2F0aW9uX2V2ZW50L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9hc3Npc3RhbmNlX25hdmlnYXRpb25fZ3VpZGFuY2UvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL2Fzc2lzdGFuY2Vfc29uaWZpY2F0aW9uL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9nYW1lL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL3Vua25vd24vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPm1lZGlhPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9tZWRpYS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+bWVkaWE8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPnBob25lPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy92b2ljZV9jb21tdW5pY2F0aW9uX3NpZ25hbGxpbmcvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPmR0bWY8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL2FsYXJtL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5zb25pZmljYXRpb248L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbi9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+c29uaWZpY2F0aW9uX3Jlc3BlY3RmdWw8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbl90ZWxlcGhvbnlfcmluZ3RvbmUvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPnNvbmlmaWNhdGlvbjwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvbm90aWZpY2F0aW9uX2NvbW11bmljYXRpb25fcmVxdWVzdC9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+c29uaWZpY2F0aW9uX3Jlc3BlY3RmdWw8L0VudW1QYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX2luc3RhbnQvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPnNvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9ub3RpZmljYXRpb25fY29tbXVuaWNhdGlvbl9kZWxheWVkL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5zb25pZmljYXRpb25fcmVzcGVjdGZ1bDwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvbm90aWZpY2F0aW9uX2V2ZW50L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5zb25pZmljYXRpb25fcmVzcGVjdGZ1bDwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvYXNzaXN0YW5jZV9uYXZpZ2F0aW9uX2d1aWRhbmNlL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5tZWRpYTwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS91c2FnZXMvYXNzaXN0YW5jZV9zb25pZmljYXRpb24vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPm1lZGlhPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9nYW1lL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kiPgorICAgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5Ij5tZWRpYTwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IlNlbGVjdGVkU3RyYXRlZ3lGb3JVc2FnZXMuQXNzaXN0YW5jZUFjY2Vzc2liaWxpdHkiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTb25pZmljYXRpb24iPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJSaW5nVG9uZSIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlBob25lIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iSW5DYWxsIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNvbW11bmljYXRpb24iLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBY2Nlc3NpYmlsaXR5Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9hc3Npc3RhbmNlX2FjY2Vzc2liaWxpdHkvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU29uaWZpY2F0aW9uIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL2Fzc2lzdGFuY2VfYWNjZXNzaWJpbGl0eS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+c29uaWZpY2F0aW9uPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJQaG9uZSI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3VzYWdlcy9hc3Npc3RhbmNlX2FjY2Vzc2liaWxpdHkvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSI+CisgICAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiPnBob25lPC9FbnVtUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBY2Nlc3NpYmlsaXR5Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvdXNhZ2VzL2Fzc2lzdGFuY2VfYWNjZXNzaWJpbGl0eS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5Ij4KKyAgICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJzdHJhdGVneSI+YWNjZXNzaWJpbGl0eTwvRW51bVBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvcklucHV0U291cmNlLkNhbGlicmF0aW9uIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQ2FsaWJyYXRpb24iPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2FjY2Vzc29yeSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3R2X3R1bmVyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbG9vcGJhY2siLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbWJpZW50Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdGVsZXBob255X3J4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2FjY2Vzc29yeSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9jb21tdW5pY2F0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW1iaWVudCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbmxnX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2FjY2Vzc29yeSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3R2X3R1bmVyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbmxnX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svc3BkaWYiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9pbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9jb21tdW5pY2F0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaGRtaSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW1iaWVudCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9jb21tdW5pY2F0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW1iaWVudCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbmxnX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2FjY2Vzc29yeSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdHZfdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svc3BkaWYiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9pbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW1iaWVudCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaGRtaSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdGVsZXBob255X3J4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbmxnX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svc3BkaWYiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2FjY2Vzc29yeSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3R2X3R1bmVyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9pbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW1iaWVudCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaGRtaSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdGVsZXBob255X3J4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svcmVtb3RlX3N1Ym1peCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfYWNjZXNzb3J5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdHZfdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xpbmUiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbG9vcGJhY2siLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9pbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2NvbW11bmljYXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbWJpZW50Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaGRtaSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svcmVtb3RlX3N1Ym1peCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfYWNjZXNzb3J5Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdHZfdHVuZXIiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9saW5lIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svc3BkaWYiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJDYWxpYnJhdGlvbiI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImluIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjb21tdW5pY2F0aW9uIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW1iaWVudCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbWJpZW50Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdGVsZXBob255X3J4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV9yeCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJhY2tfbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdHZfdHVuZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idHZfdHVuZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imxvb3BiYWNrIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9pbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJpbiI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjb21tdW5pY2F0aW9uIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbWJpZW50Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFtYmllbnQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdGVsZXBob255X3J4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV9yeCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0dl90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbG9vcGJhY2siPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibG9vcGJhY2siPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaW4iPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjb21tdW5pY2F0aW9uIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW1iaWVudCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm1fdHVuZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdHZfdHVuZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idHZfdHVuZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imxvb3BiYWNrIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaW4iPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9jb21tdW5pY2F0aW9uIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImNvbW11bmljYXRpb24iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbWJpZW50Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFtYmllbnQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJiYWNrX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbV90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3R2X3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InR2X3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imxvb3BiYWNrIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9pbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJpbiI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjb21tdW5pY2F0aW9uIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbWJpZW50Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFtYmllbnQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm1fdHVuZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3R2X3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InR2X3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfdXBsaW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbG9vcGJhY2siPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibG9vcGJhY2siPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImluIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9jb21tdW5pY2F0aW9uIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImNvbW11bmljYXRpb24iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW1iaWVudCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfcngiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm1fdHVuZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3R2X3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InR2X3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbG9vcGJhY2siPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibG9vcGJhY2siPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaW4iPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjb21tdW5pY2F0aW9uIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW1iaWVudCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdGVsZXBob255X3J4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV9yeCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJiYWNrX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3R2X3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InR2X3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsb29wYmFjayI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImluIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjb21tdW5pY2F0aW9uIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW1iaWVudCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbWJpZW50Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdGVsZXBob255X3J4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV9yeCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfYWNjZXNzb3J5Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbV90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3R2X3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InR2X3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbGluZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xvb3BiYWNrIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imxvb3BiYWNrIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaW4iPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9jb21tdW5pY2F0aW9uIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImNvbW11bmljYXRpb24iPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbWJpZW50Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFtYmllbnQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9oZG1pIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3J4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm1fdHVuZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0dl90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2xpbmUiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3NwZGlmIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9sb29wYmFjayI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsb29wYmFjayI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2luIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImluIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjb21tdW5pY2F0aW9uIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW1iaWVudCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbWJpZW50Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaGRtaSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdGVsZXBob255X3J4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV9yeCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJhY2tfbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9hY2Nlc3NvcnkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdHZfdHVuZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idHZfdHVuZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zcGRpZiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbG9vcGJhY2siPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibG9vcGJhY2siPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svaW4iPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaW4iPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svY29tbXVuaWNhdGlvbiI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjb21tdW5pY2F0aW9uIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2FtYmllbnQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW1iaWVudCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2hkbWkiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3J4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJiYWNrX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9yZW1vdGVfc3VibWl4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2FjY2Vzc29yeSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9mbV90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbV90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90dl90dW5lciI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0dl90dW5lciI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9saW5lIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svc3BkaWYiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svbG9vcGJhY2siPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibG9vcGJhY2siPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvcklucHV0U291cmNlLkRlZmF1bHRBbmRNaWMiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBMmRwIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlSW5wdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhBMmRwIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2NvIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlSW5wdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCbHVldG9vdGhTY29IZWFkc2V0Ii8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvclJlY29yZCIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VCdFNjbyIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iV2lyZWRIZWFkc2V0Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiRGV2aWNlIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlSW5wdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJVc2JEZXZpY2UiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCdWlsdGluTWljIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlSW5wdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCdWlsdGluTWljIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVmYXVsdCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ii8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJBMmRwIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2NvIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiRGV2aWNlIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQnVpbHRpbk1pYyI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9hMmRwIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2RlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfYTJkcCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX2EyZHAiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9taWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9ySW5wdXRTb3VyY2UuVm9pY2VVcGxpbmtBbmRWb2ljZURvd25saW5rQW5kVm9pY2VDYWxsIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVm9pY2VDYWxsIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlSW5wdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJUZWxlcGhvbnlSeCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdGVsZXBob255X3J4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVm9pY2VDYWxsIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfcngiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3J4Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcngiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3J4Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdGVsZXBob255X3J4Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV9yeCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfcngiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfcngiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IkRldmljZUZvcklucHV0U291cmNlLkNhbWNvcmRlciIgU2VxdWVuY2VBd2FyZT0iZmFsc2UiPgorICAgIDxDb25maWd1cmF0aW9ucz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJhY2tNaWMiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVJbnB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJhY2tNaWMiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCdWlsdGluTWljIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlSW5wdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCdWlsdGluTWljIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVmYXVsdCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCYWNrTWljIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJiYWNrX21pYyI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQnVpbHRpbk1pYyI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJhY2tfbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9ySW5wdXRTb3VyY2UuVm9pY2VSZWNvZ25pdGlvbkFuZEhvdHdvcmQiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTY29IZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JSZWNvcmQiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlQnRTY28iLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmx1ZXRvb3RoU2NvSGVhZHNldCIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IldpcmVkSGVhZHNldCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iV2lyZWRIZWFkc2V0Ii8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iVXNiRGV2aWNlIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlSW5wdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJVc2JEZXZpY2UiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCdWlsdGluTWljIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlSW5wdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCdWlsdGluTWljIi8+CisgICAgICAgIDwvQ29tcG91bmRSdWxlPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRGVmYXVsdCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iU2NvSGVhZHNldCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iV2lyZWRIZWFkc2V0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2hvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JEZXZpY2UiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkJ1aWx0aW5NaWMiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JJbnB1dFNvdXJjZS5Wb2ljZUNvbW11bmljYXRpb24iIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTY29IZWFkc2V0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZUJ0U2NvIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJBdmFpbGFibGVJbnB1dERldmljZXMiIE1hdGNoZXNXaGVuPSJJbmNsdWRlcyIgVmFsdWU9IkJsdWV0b290aFNjb0hlYWRzZXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRzZXQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlTm9uZSIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlSW5wdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJXaXJlZEhlYWRzZXQiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JEZXZpY2UiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlTm9uZSIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlSW5wdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJVc2JEZXZpY2UiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCdWlsdGluTWljIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlSW5wdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJCdWlsdGluTWljIi8+CisgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbnkiPgorICAgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkZvcmNlTm9uZSIvPgorICAgICAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iRm9yY2VTcGVha2VyIi8+CisgICAgICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlSW5wdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iRXhjbHVkZXMiIFZhbHVlPSJCYWNrTWljIi8+CisgICAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCYWNrTWljIj4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJGb3JjZVNwZWFrZXIiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iQmFja01pYyIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNjb0hlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJiYWNrX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJXaXJlZEhlYWRzZXQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJiYWNrX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJVc2JEZXZpY2UiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJiYWNrX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJCdWlsdGluTWljIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3dpcmVkX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3VzYl9kZXZpY2UiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2J1aWx0aW5fbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJ1aWx0aW5fbWljIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYmFja19taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQmFja01pYyI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JsdWV0b290aF9zY29faGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay93aXJlZF9oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay91c2JfZGV2aWNlIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9idWlsdGluX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2JhY2tfbWljIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJhY2tfbWljIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9ibHVldG9vdGhfc2NvX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svd2lyZWRfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdXNiX2RldmljZSI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svYnVpbHRpbl9taWMiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9iYWNrX21pYyI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJiYWNrX21pYyI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9TZXR0aW5ncz4KKyAgPC9Db25maWd1cmFibGVEb21haW4+CisgIDxDb25maWd1cmFibGVEb21haW4gTmFtZT0iRGV2aWNlRm9ySW5wdXRTb3VyY2UuUmVtb3RlU3VibWl4IiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iUmVtb3RlU3VibWl4Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iQXZhaWxhYmxlSW5wdXREZXZpY2VzIiBNYXRjaGVzV2hlbj0iSW5jbHVkZXMiIFZhbHVlPSJSZW1vdGVTdWJtaXgiLz4KKyAgICAgICAgPC9Db21wb3VuZFJ1bGU+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbXBvdW5kUnVsZSBUeXBlPSJBbGwiLz4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L0NvbmZpZ3VyYXRpb25zPgorICAgIDxDb25maWd1cmFibGVFbGVtZW50cz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlJlbW90ZVN1Ym1peCI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3JlbW90ZV9zdWJtaXgiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJEZWZhdWx0Ij4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svcmVtb3RlX3N1Ym1peCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKyAgPENvbmZpZ3VyYWJsZURvbWFpbiBOYW1lPSJEZXZpY2VGb3JJbnB1dFNvdXJjZS5GbVR1bmVyIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iRm1UdW5lciI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IkF2YWlsYWJsZUlucHV0RGV2aWNlcyIgTWF0Y2hlc1doZW49IkluY2x1ZGVzIiBWYWx1ZT0iRm1UdW5lciIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIi8+CisgICAgPC9Db25maWd1cmFibGVFbGVtZW50cz4KKyAgICA8U2V0dGluZ3M+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJGbVR1bmVyIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL2ZtX3R1bmVyIj4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIj4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkRlZmF1bHQiPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svZm1fdHVuZXIiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm1fdHVuZXIiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IlZvbHVtZVByb2ZpbGVzRm9yU3RyZWFtLkNhbGlicmF0aW9uIiBTZXF1ZW5jZUF3YXJlPSJmYWxzZSI+CisgICAgPENvbmZpZ3VyYXRpb25zPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iQ2FsaWJyYXRpb24iPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCIvPgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvQ29uZmlndXJhdGlvbnM+CisgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnRzPgorICAgIDxTZXR0aW5ncz4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IkNhbGlicmF0aW9uIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yNC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xOC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xMi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI0LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE2LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjQuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xOC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTEyLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTU4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNy4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMzAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI2LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yMi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI0LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xOC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTIuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi02LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjQuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTIuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi01OC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi00MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yMS4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi00OS41MDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0zMy41MDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNy4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMzUuNjk5MjE4NzU8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjYuMTAxNTYyNTA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTMuMTk5MjE4NzU8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDkuNTAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0zMy41MDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE3LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi00MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jpbmcvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI3LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTEwLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi01OC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTQwLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTcuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi01Ni4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTM0LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTEuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTU4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi00MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTcuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTQwLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNy4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDkuNTAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0zMy41MDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE3LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMzUuNjk5MjE4NzU8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yNi4xMDE1NjI1MDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTEzLjE5OTIxODc1PC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi00OS41MDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMzMuNTAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE3LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTU4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi00MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjcuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xMC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi00OS41MDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMzMuNTAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE3LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTM1LjY5OTIxODc1PC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yNi4xMDE1NjI1MDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTMuMTk5MjE4NzU8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi00OS41MDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0zMy41MDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNy4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjcuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTEwLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4wPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjQuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTIuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yNC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi04LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4wPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI0LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xMi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi02LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi01OC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTQwLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTcuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMzAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjIuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjQuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTIuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI0LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xMi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi02LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi01OC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTQwLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjcuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tOTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tOTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tOTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi05Ni4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4wPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi05Ni4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNjguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTM0LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4wPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tOTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi05Ni4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTk2LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi05Ni4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTk2LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tOTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjI8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi05Ni4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tOTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi01OC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi00MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNy4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjMzPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMzQuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTEuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi00MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE3LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi00MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE3LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4wPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjI8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4wPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjI8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4wPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4yPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4wPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjI8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4wPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjI8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4wPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4wLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjI8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL3BhdGNoL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xMDA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9wYXRjaC92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgIDwvU2V0dGluZ3M+CisgIDwvQ29uZmlndXJhYmxlRG9tYWluPgorICA8Q29uZmlndXJhYmxlRG9tYWluIE5hbWU9IlZvbHVtZVByb2ZpbGVzRm9yU3RyZWFtLkR0bWYiIFNlcXVlbmNlQXdhcmU9ImZhbHNlIj4KKyAgICA8Q29uZmlndXJhdGlvbnM+CisgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJJbkNhbGwiPgorICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFueSI+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJJbkNhbGwiLz4KKyAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IkluQ29tbXVuaWNhdGlvbiIvPgorICAgICAgICA8L0NvbXBvdW5kUnVsZT4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9Ik91dE9mQ2FsbCI+CisgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIi8+CisgICAgICA8L0NvbmZpZ3VyYXRpb24+CisgICAgPC9Db25maWd1cmF0aW9ucz4KKyAgICA8Q29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIi8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvZGJfYXR0ZW51YXRpb24iLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiIvPgorICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudHM+CisgICAgPFNldHRpbmdzPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iSW5DYWxsIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0zMC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yNi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yMi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yNC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xOC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xMi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjE8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjQuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xOC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTEyLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTU4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yNy4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xMC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgPC9Db25maWd1cmF0aW9uPgorICAgICAgPENvbmZpZ3VyYXRpb24gTmFtZT0iT3V0T2ZDYWxsIj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0yNC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xOC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+NjY8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9oZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xMi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2hlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzMvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNi4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTI0LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTE2LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTguMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9zcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL3NwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+MC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMC9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjA8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tMjQuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9lYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4zMzwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMS9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xOC4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2VhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjY2PC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8yL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTEyLjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MTAwPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8zL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTYuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzAvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij4xPC9JbnRlZ2VyUGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8wL2RiX2F0dGVudWF0aW9uIj4KKyAgICAgICAgICA8Rml4ZWRQb2ludFBhcmFtZXRlciBOYW1lPSJkYl9hdHRlbnVhdGlvbiI+LTU4LjAwMDAwMDAwPC9GaXhlZFBvaW50UGFyYW1ldGVyPgorICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi92b2x1bWVfcHJvZmlsZXMvZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cy8xL2luZGV4Ij4KKyAgICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCI+MzM8L0ludGVnZXJQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzEvZGJfYXR0ZW51YXRpb24iPgorICAgICAgICAgIDxGaXhlZFBvaW50UGFyYW1ldGVyIE5hbWU9ImRiX2F0dGVudWF0aW9uIj4tNDAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL3ZvbHVtZV9wcm9maWxlcy9leHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzLzIvaW5kZXgiPgorICAgICAgICAgIDxJbnRlZ2VyUGFyYW1ldGVyIE5hbWU9ImluZGV4Ij42NjwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMi9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPi0xNy4wMDAwMDAwMDwvRml4ZWRQb2ludFBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9pbmRleCI+CisgICAgICAgICAgPEludGVnZXJQYXJhbWV0ZXIgTmFtZT0iaW5kZXgiPjEwMDwvSW50ZWdlclBhcmFtZXRlcj4KKyAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvdm9sdW1lX3Byb2ZpbGVzL2V4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMvMy9kYl9hdHRlbnVhdGlvbiI+CisgICAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iPjAuMDAwMDAwMDA8L0ZpeGVkUG9pbnRQYXJhbWV0ZXI+CisgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KKyAgICAgIDwvQ29uZmlndXJhdGlvbj4KKyAgICA8L1NldHRpbmdzPgorICA8L0NvbmZpZ3VyYWJsZURvbWFpbj4KKzwvQ29uZmlndXJhYmxlRG9tYWlucz4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9pbnB1dF9zb3VyY2UucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX2lucHV0X3NvdXJjZS5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRiYzM3MAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9pbnB1dF9zb3VyY2UucGZ3CkBAIC0wLDAgKzEsNTE1IEBACitzdXBEb21haW46IERldmljZUZvcklucHV0U291cmNlCisJZG9tYWluOiBDYWxpYnJhdGlvbgorCQljb25mOiBDYWxpYnJhdGlvbgorCQkJIworCQkJIyBOb3RlIHRoYXQgQUxMIGlucHV0IGRldmljZXMgbXVzdCBoYXZlIHRoZSBzaWduIGJpdCBzZXQgdG8gMS4KKwkJCSMgQXMgdGhlIGRldmljZXMgaXMgYSBtYXNrLCB1c2UgdGhlICJpbiIgYml0IGFzIGEgZGlyZWN0aW9uIGluZGljYXRvci4KKwkJCSMKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9kZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQlpbiA9IDEKKwkJCQljb21tdW5pY2F0aW9uID0gMAorCQkJCWFtYmllbnQgPSAwCisJCQkJaGRtaSA9IDAKKwkJCQl0ZWxlcGhvbnlfcnggPSAwCisJCQkJYmFja19taWMgPSAwCisJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCWZtX3R1bmVyID0gMAorCQkJCXR2X3R1bmVyID0gMAorCQkJCWxpbmUgPSAwCisJCQkJc3BkaWYgPSAwCisJCQkJbG9vcGJhY2sgPSAwCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQlpbiA9IDEKKwkJCQljb21tdW5pY2F0aW9uID0gMAorCQkJCWFtYmllbnQgPSAwCisJCQkJaGRtaSA9IDAKKwkJCQl0ZWxlcGhvbnlfcnggPSAwCisJCQkJYmFja19taWMgPSAwCisJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCWZtX3R1bmVyID0gMAorCQkJCXR2X3R1bmVyID0gMAorCQkJCWxpbmUgPSAwCisJCQkJc3BkaWYgPSAwCisJCQkJbG9vcGJhY2sgPSAwCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWluID0gMQorCQkJCWNvbW11bmljYXRpb24gPSAwCisJCQkJYW1iaWVudCA9IDAKKwkJCQlidWlsdGluX21pYyA9IDAKKwkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQloZG1pID0gMAorCQkJCWJhY2tfbWljID0gMAorCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQl1c2JfZGV2aWNlID0gMAorCQkJCWZtX3R1bmVyID0gMAorCQkJCXR2X3R1bmVyID0gMAorCQkJCWxpbmUgPSAwCisJCQkJc3BkaWYgPSAwCisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJbG9vcGJhY2sgPSAwCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJaW4gPSAxCisJCQkJY29tbXVuaWNhdGlvbiA9IDAKKwkJCQlhbWJpZW50ID0gMAorCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCWhkbWkgPSAwCisJCQkJYmFja19taWMgPSAwCisJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJZm1fdHVuZXIgPSAwCisJCQkJdHZfdHVuZXIgPSAwCisJCQkJbGluZSA9IDAKKwkJCQlzcGRpZiA9IDAKKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQlsb29wYmFjayA9IDAKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWluID0gMQorCQkJCWNvbW11bmljYXRpb24gPSAwCisJCQkJYW1iaWVudCA9IDAKKwkJCQlidWlsdGluX21pYyA9IDAKKwkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQloZG1pID0gMAorCQkJCWJhY2tfbWljID0gMAorCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQl1c2JfZGV2aWNlID0gMAorCQkJCWZtX3R1bmVyID0gMAorCQkJCXR2X3R1bmVyID0gMAorCQkJCWxpbmUgPSAwCisJCQkJc3BkaWYgPSAwCisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJbG9vcGJhY2sgPSAwCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQlpbiA9IDEKKwkJCQljb21tdW5pY2F0aW9uID0gMAorCQkJCWFtYmllbnQgPSAwCisJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJaGRtaSA9IDAKKwkJCQl0ZWxlcGhvbnlfcnggPSAwCisJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJZm1fdHVuZXIgPSAwCisJCQkJdHZfdHVuZXIgPSAwCisJCQkJbGluZSA9IDAKKwkJCQlzcGRpZiA9IDAKKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQlsb29wYmFjayA9IDAKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJaW4gPSAxCisJCQkJY29tbXVuaWNhdGlvbiA9IDAKKwkJCQlhbWJpZW50ID0gMAorCQkJCWhkbWkgPSAwCisJCQkJdGVsZXBob255X3J4ID0gMAorCQkJCWJhY2tfbWljID0gMAorCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQlmbV90dW5lciA9IDAKKwkJCQl0dl90dW5lciA9IDAKKwkJCQlsaW5lID0gMAorCQkJCXNwZGlmID0gMAorCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCWxvb3BiYWNrID0gMAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWluID0gMQorCQkJCWNvbW11bmljYXRpb24gPSAwCisJCQkJYW1iaWVudCA9IDAKKwkJCQloZG1pID0gMAorCQkJCXRlbGVwaG9ueV9yeCA9IDAKKwkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJZm1fdHVuZXIgPSAwCisJCQkJdHZfdHVuZXIgPSAwCisJCQkJbGluZSA9IDAKKwkJCQlzcGRpZiA9IDAKKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQlsb29wYmFjayA9IDAKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQlpbiA9IDEKKwkJCQljb21tdW5pY2F0aW9uID0gMAorCQkJCWFtYmllbnQgPSAwCisJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJaGRtaSA9IDAKKwkJCQl0ZWxlcGhvbnlfcnggPSAwCisJCQkJYmFja19taWMgPSAwCisJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQl1c2JfZGV2aWNlID0gMAorCQkJCWZtX3R1bmVyID0gMAorCQkJCXR2X3R1bmVyID0gMAorCQkJCWxpbmUgPSAwCisJCQkJc3BkaWYgPSAwCisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJbG9vcGJhY2sgPSAwCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJaW4gPSAxCisJCQkJY29tbXVuaWNhdGlvbiA9IDAKKwkJCQlhbWJpZW50ID0gMAorCQkJCWhkbWkgPSAwCisJCQkJdGVsZXBob255X3J4ID0gMAorCQkJCWJhY2tfbWljID0gMAorCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQlmbV90dW5lciA9IDAKKwkJCQl0dl90dW5lciA9IDAKKwkJCQlsaW5lID0gMAorCQkJCXNwZGlmID0gMAorCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCWxvb3BiYWNrID0gMAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQlpbiA9IDEKKwkJCQljb21tdW5pY2F0aW9uID0gMAorCQkJCWFtYmllbnQgPSAwCisJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCWhkbWkgPSAwCisJCQkJdGVsZXBob255X3J4ID0gMAorCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJYmFja19taWMgPSAwCisJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJZm1fdHVuZXIgPSAwCisJCQkJdHZfdHVuZXIgPSAwCisJCQkJbGluZSA9IDAKKwkJCQlzcGRpZiA9IDAKKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQlsb29wYmFjayA9IDAKKworCWRvbWFpbjogRGVmYXVsdEFuZE1pYworCQljb25mOiBBMmRwCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAorCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMKKwkJCQljb21wb25lbnQ6IGRlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay8KKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJY29tcG9uZW50OiBtaWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay8KKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisKKwkJY29uZjogU2NvCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAorCQkJRm9yY2VVc2VGb3JSZWNvcmQgSXMgRm9yY2VCdFNjbworCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMKKwkJCQljb21wb25lbnQ6IGRlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay8KKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCisJCQkJY29tcG9uZW50OiBtaWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay8KKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCisKKwkJY29uZjogV2lyZWRIZWFkc2V0CisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcworCQkJCWNvbXBvbmVudDogZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrLworCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQljb21wb25lbnQ6IG1pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrLworCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKworCQljb25mOiBVc2JEZXZpY2UKKwkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzCisJCQkJY29tcG9uZW50OiBkZWZhdWx0L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCWNvbXBvbmVudDogbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCisJCWNvbmY6IEJ1aWx0aW5NaWMKKwkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBCdWlsdGluTWljCisKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcworCQkJCWNvbXBvbmVudDogZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrLworCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJYnVpbHRpbl9taWMgPSAxCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQljb21wb25lbnQ6IG1pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrLworCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJYnVpbHRpbl9taWMgPSAxCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKworCQljb25mOiBEZWZhdWx0CisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMKKwkJCQljb21wb25lbnQ6IGRlZmF1bHQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay8KKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJY29tcG9uZW50OiBtaWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay8KKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisKKwlkb21haW46IFZvaWNlVXBsaW5rQW5kVm9pY2VEb3dubGlua0FuZFZvaWNlQ2FsbAorCQljb25mOiBWb2ljZUNhbGwKKwkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBUZWxlcGhvbnlSeAorCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMKKwkJCQl2b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCA9IDEKKwkJCQl2b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdGVsZXBob255X3J4ID0gMQorCQkJCXZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCA9IDEKKworCQljb25mOiBEZWZhdWx0CisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMKKwkJCQl2b2ljZV9kb3dubGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCA9IDAKKwkJCQl2b2ljZV9jYWxsL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svdGVsZXBob255X3J4ID0gMAorCQkJCXZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCA9IDAKKworCWRvbWFpbjogQ2FtY29yZGVyCisJCWNvbmY6IEJhY2tNaWMKKwkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBCYWNrTWljCisKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWJhY2tfbWljID0gMQorCQkJCWJ1aWx0aW5fbWljID0gMAorCisJCWNvbmY6IEJ1aWx0aW5NaWMKKwkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBCdWlsdGluTWljCisKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWJhY2tfbWljID0gMAorCQkJCWJ1aWx0aW5fbWljID0gMQorCisJCWNvbmY6IERlZmF1bHQKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWJhY2tfbWljID0gMAorCQkJCWJ1aWx0aW5fbWljID0gMAorCisJZG9tYWluOiBWb2ljZVJlY29nbml0aW9uQW5kSG90d29yZAorCQljb25mOiBTY29IZWFkc2V0CisJCQlGb3JjZVVzZUZvclJlY29yZCBJcyBGb3JjZUJ0U2NvCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAorCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMKKwkJCQljb21wb25lbnQ6IHZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQljb21wb25lbnQ6IGhvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWJ1aWx0aW5fbWljID0gMAorCisJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMKKwkJCQljb21wb25lbnQ6IHZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQljb21wb25lbnQ6IGhvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWJ1aWx0aW5fbWljID0gMAorCisJCWNvbmY6IFVzYkRldmljZQorCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMKKwkJCQljb21wb25lbnQ6IHZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQljb21wb25lbnQ6IGhvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAxCisJCQkJCWJ1aWx0aW5fbWljID0gMAorCisJCWNvbmY6IEJ1aWx0aW5NaWMKKwkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBCdWlsdGluTWljCisKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcworCQkJCWNvbXBvbmVudDogdm9pY2VfcmVjb2duaXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWJ1aWx0aW5fbWljID0gMQorCQkJCWNvbXBvbmVudDogaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJYnVpbHRpbl9taWMgPSAxCisKKwkJY29uZjogRGVmYXVsdAorCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzCisJCQkJY29tcG9uZW50OiB2b2ljZV9yZWNvZ25pdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJY29tcG9uZW50OiBob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDAKKworCWRvbWFpbjogVm9pY2VDb21tdW5pY2F0aW9uCisJCWNvbmY6IFNjb0hlYWRzZXQKKwkJCSMKKwkJCSMgU0NPIGRldmljZSBtYXkgYmUgcmVxdWVzdGVkIGJ1dCBubyBTQ08gZGV2aWNlIGlzIGF2YWlsYWJsZQorCQkJIworCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0CisKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCisJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQl1c2JfZGV2aWNlID0gMAorCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCWJhY2tfbWljID0gMAorCisJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlTm9uZQorCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJdXNiX2RldmljZSA9IDAKKwkJCQlidWlsdGluX21pYyA9IDAKKwkJCQliYWNrX21pYyA9IDAKKworCQljb25mOiBVc2JEZXZpY2UKKwkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZU5vbmUKKwkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2NvbW11bmljYXRpb24vYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCXVzYl9kZXZpY2UgPSAxCisJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJYmFja19taWMgPSAwCisKKwkJY29uZjogQnVpbHRpbk1pYworCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEluY2x1ZGVzIEJ1aWx0aW5NaWMKKwkJCUFOWQorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZU5vbmUKKwkJCQlBTEwKKwkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgorCQkJCQlBdmFpbGFibGVJbnB1dERldmljZXMgRXhjbHVkZXMgQmFja01pYworCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJdXNiX2RldmljZSA9IDAKKwkJCQlidWlsdGluX21pYyA9IDEKKwkJCQliYWNrX21pYyA9IDAKKworCQljb25mOiBCYWNrTWljCisJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgQmFja01pYworCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJdXNiX2RldmljZSA9IDAKKwkJCQlidWlsdGluX21pYyA9IDAKKwkJCQliYWNrX21pYyA9IDEKKworCQljb25mOiBEZWZhdWx0CisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJdXNiX2RldmljZSA9IDAKKwkJCQlidWlsdGluX21pYyA9IDAKKwkJCQliYWNrX21pYyA9IDAKKworCWRvbWFpbjogUmVtb3RlU3VibWl4CisJCWNvbmY6IFJlbW90ZVN1Ym1peAorCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAorCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJcmVtb3RlX3N1Ym1peCA9IDEKKworCQljb25mOiBEZWZhdWx0CisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKworCWRvbWFpbjogRm1UdW5lcgorCQljb25mOiBGbVR1bmVyCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgRm1UdW5lcgorCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWZtX3R1bmVyID0gMQorCisJCWNvbmY6IERlZmF1bHQKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCisJCQkJZm1fdHVuZXIgPSAwCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGFiMzNiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2FjY2Vzc2liaWxpdHkucGZ3CkBAIC0wLDAgKzEsMzAyIEBACitzdXBEb21haW46IERldmljZUZvclN0cmF0ZWd5CisKKwlzdXBEb21haW46IEFjY2Vzc2liaWxpdHkKKwkJIworCQkjIEBGSVhNRTogU1RSQVRFR1lfQUNDRVNTSUJJTElUWSBmb2xsb3dzIFNUUkFURUdZX01FRElBIGZvciBub3cKKwkJIworCQkjIEBGSVhNRTogSG93IHRvIGRpc2FibGUgSERNSSBpZiAhYXVkaW9faXNfbGluZWFyX3BjbSBvdGhlciB0aGFuIHByb2dyYW1tYXRpY2FsbHk/Pz8KKwkJIworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogQ2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisKKwkJZG9tYWluOiBEZXZpY2UyCisJCQljb25mOiBSZW1vdGVTdWJtaXgKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMQorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHAKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEZvcmNlU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogTGluZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMQorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogVXNiQWNjZXNzb3J5CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBVc2JEZXZpY2UKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAxCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQXV4RGlnaXRhbAorCQkJCSMKKwkJCQkjIERvIG5vdCByb3V0ZSBhY2Nlc3NpYmlsaXR5IHByb21wdHMgdG8gYSBkaWdpdGFsIG91dHB1dCBjdXJyZW50bHkgY29uZmlndXJlZCB3aXRoIGEKKwkJCQkjIGNvbXByZXNzZWQgZm9ybWF0IGFzIHRoZXkgd291bGQgbGlrZWx5IG5vdCBiZSBtaXhlZCBhbmQgZHJvcHBlZC4KKwkJCQkjCisJCQkJIyBAVE9ETyBIb3cgdG8gdHJhbnNsYXRlIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uKD8/PykKKwkJCQkjIGRlc2MtPmlzQWN0aXZlKCkgJiYgIWF1ZGlvX2lzX2xpbmVhcl9wY20oZGVzYy0+bUZvcm1hdCkgJiYgZGV2aWNlcyAhPSBBVURJT19ERVZJQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMQorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2R0bWYucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2R0bWYucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MjczYjIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfZHRtZi5wZncKQEAgLTAsMCArMSw2MzcgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yU3RyYXRlZ3kKKworCXN1cERvbWFpbjogRHRtZgorCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBDYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisKKwkJZG9tYWluOiBEZXZpY2UyCisJCQljb25mOiBSZW1vdGVTdWJtaXgKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgUmVtb3RlU3VibWl4CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAxCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogRm9yY2VTcGVha2VyV2hlbk5vdEluQ2FsbAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyBJc05vdCBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvSGVhZHNldAorCQkJCSMKKwkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhTY28KKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbworCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAxCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJIworCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogTGluZVdoZW5Gb2xsb3dpbmdNZWRpYQorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMQorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBVc2JEZXZpY2UKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBVc2JBY2Nlc3NvcnkKKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IFVTQiBhY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsCisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgRGd0bERvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEhkbWkKKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IEhkbWkgbm90IHJlYWNoYWJsZSBpbiBjYWxsCisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDEKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgQW5sZ0RvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogRWFycGllY2UKKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEVhcnBpZWNlCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogTGluZVdoZW5GYWxsVGhyb3VnaFBob25lCisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDEKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQkJIworCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyBJc05vdCBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJZG9tYWluOiBBcmMKKwkJCSMKKwkJCSMgRFRNRiBzdHJhdGVneSBmb2xsb3dzIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkjIHRoZXNlIGZvbGxvd2luZyBkb21haW5zIGNvbnNpc3RzIGluIGRldmljZShzKSB0aGF0IGNhbiBjby1leGlzdCB3aXRoIG90aGVycworCQkJIyBlLmcuIEFSQywgU1BESUYsIEFVWF9MSU5FCisJCQkjCisJCQljb25mOiBTZWxlY3RlZAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWlBcmMKKworCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAwCisKKwkJZG9tYWluOiBTcGRpZgorCQkJIworCQkJIyBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCisJCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKKwkJCSMKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BkaWYKKworCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYgPSAwCisKKwkJZG9tYWluOiBBdXhMaW5lCisJCQkjCisJCQkjIERUTUYgc3RyYXRlZ3kgZm9sbG93cyBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKKwkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQorCQkJIworCQkJY29uZjogU2VsZWN0ZWQKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBdXhMaW5lCisKKwkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lID0gMApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MTQ3NDMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfZW5mb3JjZWRfYXVkaWJsZS5wZncKQEAgLTAsMCArMSwzNTggQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yU3RyYXRlZ3kKKworCXN1cERvbWFpbjogRW5mb3JjZWRBdWRpYmxlCisKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IENhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQkjIG5vIGVuZm9yY2VkX2F1ZGlibGUgb24gcmVtb3RlIHN1Ym1peCAoZS5nLiBXRkQpCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKworCQlkb21haW46IFNwZWFrZXIKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJIworCQkJCSMgc3RyYXRlZ3kgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSB1c2VzIHNhbWUgcm91dGluZyBwb2xpY3kgYXMgU1RSQVRFR1lfU09OSUZJQ0FUSU9OCisJCQkJIyBleGNlcHQ6CisJCQkJIyAgICAtIHdoZW4gaW4gY2FsbCB3aGVyZSBpdCBkb2Vzbid0IGRlZmF1bHQgdG8gU1RSQVRFR1lfUEhPTkUgYmVoYXZpb3IKKwkJCQkjICAgIC0gaW4gY291bnRyaWVzIHdoZXJlIG5vdCBlbmZvcmNlZCBpbiB3aGljaCBjYXNlIGl0IGZvbGxvd3MgU1RSQVRFR1lfTUVESUEKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJQU5ZCisJCQkJCUZvcmNlVXNlRm9yU3lzdGVtIElzIEZvcmNlU3lzdGVtRW5mb3JjZWQKKwkJCQkJQUxMCisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzIEZvcmNlU3BlYWtlcgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBSZW1vdGVTdWJtaXgKKwkJCQkJCUFOWQorCQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgQmx1ZXRvb3RoQTJkcAorCQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBTcGVha2VyIGlzIGFsc28gdGhlIGZhbGxiYWNrIGRldmljZSBpZiBhbnkgb2YgdGhlIGRldmljZSBmcm9tIERldmljZTIgZG9tYWluCisJCQkJCSMgaXMgc2VsZWN0ZWQuCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFJlbW90ZVN1Ym1peAorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBMaW5lCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHNldAorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiRGV2aWNlCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIERndGxEb2NrSGVhZHNldAorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBIZG1pCisJCQkJCQlBTlkKKwkJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCQkJCQkJCUZvcmNlVXNlRm9yRG9jayBJc05vdCBGb3JjZUFuYWxvZ0RvY2sKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJZG9tYWluOiBEZXZpY2UyCisJCQljb25mOiBSZW1vdGVTdWJtaXgKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMQorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHAKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAxCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCisJCQljb25mOiBVc2JBY2Nlc3NvcnkKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKworCQkJY29uZjogVXNiRGV2aWNlCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCisJCQljb25mOiBIZG1pCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAxCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9tZWRpYS5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfbWVkaWEucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YmVkZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfbWVkaWEucGZ3CkBAIC0wLDAgKzEsMzMxIEBACitkb21haW5Hcm91cDogRGV2aWNlRm9yU3RyYXRlZ3kKKworCWRvbWFpbkdyb3VwOiBNZWRpYQorCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBDYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisKKwkJZG9tYWluOiBEZXZpY2UyCisJCQljb25mOiBSZW1vdGVTdWJtaXgKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMQorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmUKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBGb3JjZVNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzIEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCSMKKwkJCQkjIElmIGhkbWkgc3lzdGVtIGF1ZGlvIG1vZGUgaXMgb24sIHJlbW92ZSBzcGVha2VyIG91dCBvZiBvdXRwdXQgbGlzdC4KKwkJCQkjCisJCQkJRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8gSXNOb3QgRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDEKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogVXNiQWNjZXNzb3J5CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogVXNiRGV2aWNlCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogRGd0bERvY2tIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQXV4RGlnaXRhbAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCSMKKwkJCQkjIElmIGhkbWkgc3lzdGVtIGF1ZGlvIG1vZGUgaXMgb24sIHJlbW92ZSBzcGVha2VyIG91dCBvZiBvdXRwdXQgbGlzdC4KKwkJCQkjCisJCQkJRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8gSXNOb3QgRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQlkb21haW46IEFyYworCQkJIworCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKKwkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQorCQkJIworCQkJY29uZjogU2VsZWN0ZWQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWlBcmMKKworCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAwCisKKwkJZG9tYWluOiBTcGRpZgorCQkJIworCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKKwkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQorCQkJIworCQkJY29uZjogU2VsZWN0ZWQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZGlmCisKKwkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMAorCisJCWRvbWFpbjogQXV4TGluZQorCQkJY29uZjogU2VsZWN0ZWQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEF1eExpbmUKKworCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcGhvbmUucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Bob25lLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjAxNDkxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Bob25lLnBmdwpAQCAtMCwwICsxLDQ4NSBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JTdHJhdGVneQorCisJc3VwRG9tYWluOiBQaG9uZQorCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBDYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCSMgbm8gc29uaWZpY2F0aW9uIG9uIHJlbW90ZSBzdWJtaXggKGUuZy4gV0ZEKQorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCisJCWRvbWFpbjogRGV2aWNlCisJCQljb25mOiBTY29DYXJraXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0NhcmtpdAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMQorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbworCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHAKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQU5ZCisJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZU5vbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUFOWQorCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VOb25lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisJCQkJQU5ZCisJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZU5vbmUKKwkJCQkJQUxMCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisJCQkJCQkjCisJCQkJCQkjIEluIGNhc2Ugb2YgRm9yY2UgU3BlYWtlciwgcHJpb3JpdHkgYmV0d2VlbiBkZXZpY2UgYW5kIGFjY2Vzc29yeSBhcmUKKwkJCQkJCSMgaW52ZXJ0ZWQgY29tcGFyZWQgdG8gRm9yY2UgTm9uZSBvciBCdCBTY28KKwkJCQkJCSMKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5CisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAxCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogVXNiQWNjZXNzb3J5CisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBIZG1pCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAxCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogRWFycGllY2UKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEVhcnBpZWNlCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBMaW5lCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMQorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBTcGVha2VyCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9yZXJvdXRpbmcucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Jlcm91dGluZy5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5MGEzMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9yZXJvdXRpbmcucGZ3CkBAIC0wLDAgKzEsMjk3IEBACitkb21haW5Hcm91cDogRGV2aWNlRm9yU3RyYXRlZ3kKKworCWRvbWFpbkdyb3VwOiBSZXJvdXRpbmcKKwkJIworCQkjIEZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kKKwkJIworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogQ2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKworCQlkb21haW46IERldmljZTIKKwkJCWNvbmY6IFJlbW90ZVN1Ym1peAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgUmVtb3RlU3VibWl4CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBGb3JjZVNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzIEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBMaW5lCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDEKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogVXNiQWNjZXNzb3J5CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQXV4RGlnaXRhbAorCQkJCSMKKwkJCQkjIFJlcm91dGluZyBpcyBzaW1pbGFyIHRvIG1lZGlhIGFuZCBzb25pZmljYXRpb24gKGV4ZXB0IGhlcmU6IHNvbmlmaWNhdGlvbiBpcyBub3QgYWxsb3dlZCBvbiBIRE1JKQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAxCisKKwkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jaworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlzcGVha2VyID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbi5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExMDFmOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3CkBAIC0wLDAgKzEsNDg1IEBACitzdXBEb21haW46IERldmljZUZvclN0cmF0ZWd5CisKKwlzdXBEb21haW46IFNvbmlmaWNhdGlvbgorCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBDYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQkjIG5vIHNvbmlmaWNhdGlvbiBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgYnV0IEhETUkgaXMgbm90IHJlYWNoYWJsZQorCQkJCQkjCisJCQkJCWhkbWkgPSAwCisKKwkJZG9tYWluOiBTcGVha2VyCisKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBFTkZPUkNFRF9BVURJQkxFIGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJCSMKKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgTGluZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJZG9tYWluOiBEZXZpY2UyCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHAKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBTY29DYXJraXQKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMQorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFNjb0hlYWRzZXQKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBTY28KKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMQorCisJCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJCSMKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJCSMKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgVVNCIEFjY2Vzc29yeSBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogRGd0bERvY2tIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBEZ3RsRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgQW5sZ0RvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jaworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogRWFycGllY2UKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEVhcnBpZWNlCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBOb25lCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NjY3NGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3CkBAIC0wLDAgKzEsNTQ1IEBACitkb21haW5Hcm91cDogRGV2aWNlRm9yU3RyYXRlZ3kKKworCWRvbWFpbkdyb3VwOiBTb25pZmljYXRpb25SZXNwZWN0ZnVsCisJCSMKKwkJIyBTb25pZmljaWF0aW9uIFJlc3BlY3RmdWwgZm9sbG93czoKKwkJIwktIElmIGluIGNhbGw6IFN0cmF0ZWd5IHNvbmlmaWNhdGlvbiAodGhhdCBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGluIGNhbGwgYWxzby4uLikKKwkJIwktIElmIG5vdCBpbiBjYWxsIEFORCBhIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUgcmVtb3RlbHk6IFN0cmF0ZWd5IHNvbmlmaWNhdGlvbiAodGhhdAorCQkjICAgICBmb2xsb3dzIGVuZm9yY2VkIGF1ZGlibGUsIHdoaWNoIGZvbGxvd3MgbWVkaWEpCisJCSMJLSBpZiBub3QgaW4gY2FsbCBhbmQgbm8gbXVzaWMgc3RyZWFtIGFjdGl2ZSByZW1vdGVseSBhbmQgbXVzaWMgc3RyZWFtIGFjdGl2ZSk6IHN0cmF0ZWd5CisJCSMgICAgIG1lZGlhCisJCSMgICAtIE90aGVyd2lzZSBmb2xsb3dzIHNvbmlmaWNhdGlvbiBieSByZXBsYWNpbmcgc3BlYWtlciB3aXRoIHNwZWFrZXIgc2FmZSBpZiBzcGVha2VyIGlzCisJCSMJICBzZWxlY3RlZC4KKwkJIworCQkjIENhc2Ugb2Ygc3RyZWFtIGFjdGl2ZSBoYW5kbGVkIHByb2dyYW1tYXRpY2FsbHkKKworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogQ2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCisJCWRvbWFpbjogU3BlYWtlcnMKKworCQkJY29uZjogU3BlYWtlclNhZmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXJTYWZlCisJCQkJIworCQkJCSMgRm9sbG93cyBzb25pZmljYXRpb24gc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgYW5kIHJlcGxhY2Ugc3BlYWtlciBieSBzcGVha2VyIHNhZmUKKwkJCQkjIGlmIGFuZCBvbmx5IGlmIHNwZWFrZXIgb25seSBzZWxlY3RlZAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyX3NhZmUgPSAxCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIEZvbGxvd3Mgc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgY2FsbAorCQkJCQkJIworCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBMaW5lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCXNwZWFrZXIgPSAxCisKKwkJCWNvbmY6IE5vbmUKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJZG9tYWluOiBEZXZpY2UyCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzIEZvcmNlTm9CdEEyZHAKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzIEZvcmNlTm9CdEEyZHAKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvQ2Fya2l0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0NhcmtpdAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvSGVhZHNldAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhTY28KKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCUFOWQorCQkJCQlBTEwKKwkJCQkJCSMKKwkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJCSMKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJCQkjCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogTGluZVdoZW5Gb2xsb3dNZWRpYVN0cmF0ZWd5CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMQorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJCUFOWQorCQkJCQlBTEwKKwkJCQkJCSMKKwkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJCSMKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJCQkjCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCUFOWQorCQkJCQlBTEwKKwkJCQkJCSMKKwkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJCSMKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJCQkjCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBVc2JBY2Nlc3NvcnkKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IFVzYkFjY2Vzc29yeSBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IERndGxEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBBdXhEaWdpdGFsCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBIRE1JIG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMQorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IEFubGdEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogRWFycGllY2UKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAxCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogTGluZQorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMQorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YWU5ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyLnBmdwpAQCAtMCwwICsxLDQwIEBACitzdXBEb21haW46IERldmljZUZvclN0cmF0ZWd5CisKKwlzdXBEb21haW46IFRyYW5zbWl0dGVkVGhyb3VnaFNwZWFrZXIKKwkJZG9tYWluOiBVbnJlYWNoZWFibGVEZXZpY2VzCisJCQljb25mOiBDYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJZG9tYWluOiBTcGVha2VyCisJCQljb25mOiBTZWxlY3RlZAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3N0cmVhbS5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl9zdHJlYW0ucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM5NDBiOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl9zdHJlYW0ucGZ3CkBAIC0wLDAgKzEsMjAgQEAKK2RvbWFpbjogU3RyYXRlZ3lGb3JTdHJlYW0KKworCWNvbmY6IENhbGlicmF0aW9uCisJCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gcGhvbmUKKwkJIworCQkjIE5PVEU6IFNZU1RFTSBzdHJlYW0gdXNlcyBNRURJQSBzdHJhdGVneSBiZWNhdXNlIG11dGluZyBtdXNpYyBhbmQgc3dpdGNoaW5nIG91dHB1dHMKKwkJIyB3aGlsZSBrZXkgY2xpY2tzIGFyZSBwbGF5ZWQgcHJvZHVjZXMgYSBwb29yIHJlc3VsdAorCQkjCisJCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvc3lzdGVtL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBtZWRpYQorCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL3JpbmcvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHNvbmlmaWNhdGlvbgorCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL211c2ljL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBtZWRpYQorCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FsYXJtL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBzb25pZmljYXRpb24KKwkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ub3RpZmljYXRpb24vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHNvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsCisJCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYmx1ZXRvb3RoX3Njby9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gcGhvbmUKKwkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBlbmZvcmNlZF9hdWRpYmxlCisJCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZHRtZi9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gZHRtZgorCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyCisJCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWNjZXNzaWJpbGl0eS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gYWNjZXNzaWJpbGl0eQorCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL3Jlcm91dGluZy9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gcmVyb3V0aW5nCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjVkYTEzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy9zdHJhdGVneV9mb3JfdXNhZ2UucGZ3CkBAIC0wLDAgKzEsMzkgQEAKK3N1cERvbWFpbjogU2VsZWN0ZWRTdHJhdGVneUZvclVzYWdlcworCisJZG9tYWluOiBDYWxpYnJhdGlvbgorCQljb25mOiBDYWxpYnJhdGlvbgorCQkJL1BvbGljeS9wb2xpY3kvdXNhZ2VzL3Vua25vd24vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IG1lZGlhCisJCQkvUG9saWN5L3BvbGljeS91c2FnZXMvbWVkaWEvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IG1lZGlhCisJCQkvUG9saWN5L3BvbGljeS91c2FnZXMvdm9pY2VfY29tbXVuaWNhdGlvbi9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gcGhvbmUKKwkJCS9Qb2xpY3kvcG9saWN5L3VzYWdlcy92b2ljZV9jb21tdW5pY2F0aW9uX3NpZ25hbGxpbmcvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IGR0bWYKKwkJCS9Qb2xpY3kvcG9saWN5L3VzYWdlcy9hbGFybS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gc29uaWZpY2F0aW9uCisJCQkvUG9saWN5L3BvbGljeS91c2FnZXMvbm90aWZpY2F0aW9uL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBzb25pZmljYXRpb25fcmVzcGVjdGZ1bAorCQkJL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbl90ZWxlcGhvbnlfcmluZ3RvbmUvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHNvbmlmaWNhdGlvbgorCQkJL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbl9jb21tdW5pY2F0aW9uX3JlcXVlc3QvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHNvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsCisJCQkvUG9saWN5L3BvbGljeS91c2FnZXMvbm90aWZpY2F0aW9uX2NvbW11bmljYXRpb25faW5zdGFudC9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwKKwkJCS9Qb2xpY3kvcG9saWN5L3VzYWdlcy9ub3RpZmljYXRpb25fY29tbXVuaWNhdGlvbl9kZWxheWVkL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBzb25pZmljYXRpb25fcmVzcGVjdGZ1bAorCQkJL1BvbGljeS9wb2xpY3kvdXNhZ2VzL25vdGlmaWNhdGlvbl9ldmVudC9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwKKwkJCS9Qb2xpY3kvcG9saWN5L3VzYWdlcy9hc3Npc3RhbmNlX25hdmlnYXRpb25fZ3VpZGFuY2UvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IG1lZGlhCisJCQkvUG9saWN5L3BvbGljeS91c2FnZXMvYXNzaXN0YW5jZV9zb25pZmljYXRpb24vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IG1lZGlhCisJCQkvUG9saWN5L3BvbGljeS91c2FnZXMvZ2FtZS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gbWVkaWEKKworCWRvbWFpbjogQXNzaXN0YW5jZUFjY2Vzc2liaWxpdHkKKwkJY29uZjogU29uaWZpY2F0aW9uCisJCQkjCisJCQkjIEluIGNhc2Ugb2YgUmluZyBvciBBbGFybSBzdHJlYW0gdHlwZSBhY3RpdmUsIHN3aXRjaGluZyB0byBzb25pZmljYXRpb24KKwkJCSMgQHRvZG86IGhhbmRsZSB0aGlzIGR5bmFtaWMgY2FzZS4gQXMgYSBXQSwgdXNpbmcgUmluZ3RvbmUgbW9kZS4uLgorCQkJIworCQkJVGVsZXBob255TW9kZSBJcyBSaW5nVG9uZQorCisJCQkvUG9saWN5L3BvbGljeS91c2FnZXMvYXNzaXN0YW5jZV9hY2Nlc3NpYmlsaXR5L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBzb25pZmljYXRpb24KKworCQljb25mOiBQaG9uZQorCQkJQU5ZCisJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCisJCQkvUG9saWN5L3BvbGljeS91c2FnZXMvYXNzaXN0YW5jZV9hY2Nlc3NpYmlsaXR5L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBwaG9uZQorCisJCWNvbmY6IEFjY2Vzc2liaWxpdHkKKwkJCS9Qb2xpY3kvcG9saWN5L3VzYWdlcy9hc3Npc3RhbmNlX2FjY2Vzc2liaWxpdHkvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IGFjY2Vzc2liaWxpdHkKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TZXR0aW5ncy92b2x1bWVzLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3Mvdm9sdW1lcy5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA0OTU2NAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU2V0dGluZ3Mvdm9sdW1lcy5wZncKQEAgLTAsMCArMSw1NDUgQEAKK3N1cERvbWFpbjogVm9sdW1lUHJvZmlsZXNGb3JTdHJlYW0KKwlkb21haW46IENhbGlicmF0aW9uCisJCWNvbmY6IENhbGlicmF0aW9uCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmVhbXMKKwkJCQljb21wb25lbnQ6IHZvaWNlX2NhbGwvdm9sdW1lX3Byb2ZpbGVzCisJCQkJCWNvbXBvbmVudDogaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMAorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC0yNC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMTguMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTEyLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAtNi4wCisJCQkJCWNvbXBvbmVudDogc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMAorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC0yNC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMTYuMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTguMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IGVhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAwCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTI0LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0xOC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTIuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IC02LjAKKwkJCQkJY29tcG9uZW50OiBleHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC01OC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtNDAuMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTE3LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKworCQkJCWNvbXBvbmVudDogc3lzdGVtL3ZvbHVtZV9wcm9maWxlcworCQkJCQljb21wb25lbnQ6IGhlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMzAuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTI2LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0yMi4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTE4LjAKKwkJCQkJY29tcG9uZW50OiBzcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTI0LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0xOC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTIuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IC02LjAKKwkJCQkJY29tcG9uZW50OiBlYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC0yNC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMTguMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTEyLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAtNi4wCisJCQkJCWNvbXBvbmVudDogZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNTguMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTQwLjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0yMS4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTEwLjAKKworCQkJCWNvbXBvbmVudDogcmluZy92b2x1bWVfcHJvZmlsZXMKKwkJCQkJY29tcG9uZW50OiBoZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTQ5LjUKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0zMy41CisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTcuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IHNwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMzUuNworCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTI2LjEKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xMy4yCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCWNvbXBvbmVudDogZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNDkuNQorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTMzLjUKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCWNvbXBvbmVudDogZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNTguMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTQwLjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0yNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTEwLjAKKworCQkJCWNvbXBvbmVudDogbXVzaWMvdm9sdW1lX3Byb2ZpbGVzCisJCQkJCWNvbXBvbmVudDogaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC01OC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtNDAuMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTE3LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBzcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTU2LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0zNC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTEuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IGVhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTU4LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC00MC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTcuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IGV4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTU4LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC00MC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTcuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCisJCQkJY29tcG9uZW50OiBhbGFybS92b2x1bWVfcHJvZmlsZXMKKwkJCQkJY29tcG9uZW50OiBoZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTQ5LjUKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0zMy41CisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTcuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IHNwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMzUuNworCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTI2LjEKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xMy4yCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCWNvbXBvbmVudDogZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNDkuNQorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTMzLjUKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCWNvbXBvbmVudDogZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNTguMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTQwLjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0yNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTEwLjAKKworCQkJCWNvbXBvbmVudDogbm90aWZpY2F0aW9uL3ZvbHVtZV9wcm9maWxlcworCQkJCQljb21wb25lbnQ6IGhlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNDkuNQorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTMzLjUKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCWNvbXBvbmVudDogc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC0zNS43CisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMjYuMQorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTEzLjIKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBlYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC00OS41CisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMzMuNQorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTE3LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBleHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC01OC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtNDAuMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTI3LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAtMTAuMAorCisJCQkJY29tcG9uZW50OiBibHVldG9vdGhfc2NvL3ZvbHVtZV9wcm9maWxlcworCQkJCQljb21wb25lbnQ6IGhlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDAKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMjQuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTE4LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xMi4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTYuMAorCQkJCQljb21wb25lbnQ6IHNwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDAKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMjQuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTE2LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC04LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBlYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMAorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC0yNC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMTguMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTEyLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAtNi4wCisJCQkJCWNvbXBvbmVudDogZXh0bWVkaWFfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNTguMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTQwLjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisKKwkJCQljb21wb25lbnQ6IGVuZm9yY2VkX2F1ZGlibGUvdm9sdW1lX3Byb2ZpbGVzCisJCQkJCWNvbXBvbmVudDogaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC0zMC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMjYuMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTIyLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAtMTguMAorCQkJCQljb21wb25lbnQ6IHNwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMjQuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTE4LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xMi4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTYuMAorCQkJCQljb21wb25lbnQ6IGVhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTI0LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0xOC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTIuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IC02LjAKKwkJCQkJY29tcG9uZW50OiBleHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC01OC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtNDAuMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTI3LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAtMTAuMAorCisJCQkJY29tcG9uZW50OiB0dHMvdm9sdW1lX3Byb2ZpbGVzCisJCQkJCWNvbXBvbmVudDogaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMAorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC05Ni4wCisJCQkJCQkxL2luZGV4ID0gMQorCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC05Ni4wCisJCQkJCQkyL2luZGV4ID0gMgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC05Ni4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTk2LjAKKwkJCQkJY29tcG9uZW50OiBzcGVha2VyX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAwCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTk2LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC02OC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMzQuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IGVhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAwCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTk2LjAKKwkJCQkJCTEvaW5kZXggPSAxCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTk2LjAKKwkJCQkJCTIvaW5kZXggPSAyCisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTk2LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAtOTYuMAorCQkJCQljb21wb25lbnQ6IGV4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAwCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTk2LjAKKwkJCQkJCTEvaW5kZXggPSAxCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTk2LjAKKwkJCQkJCTIvaW5kZXggPSAyCisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTk2LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAtOTYuMAorCisJCQkJY29tcG9uZW50OiBhY2Nlc3NpYmlsaXR5L3ZvbHVtZV9wcm9maWxlcworCQkJCQljb21wb25lbnQ6IGhlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtNTguMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTQwLjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xNy4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCWNvbXBvbmVudDogc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC01Ni4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMzQuMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTExLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBlYXJwaWVjZV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC01OC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtNDAuMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTE3LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBleHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC01OC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtNDAuMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTE3LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKworCQkJCWNvbXBvbmVudDogcmVyb3V0aW5nL3ZvbHVtZV9wcm9maWxlcworCQkJCQljb21wb25lbnQ6IGhlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDAKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTEvaW5kZXggPSAxCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkyL2luZGV4ID0gMgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IHNwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDAKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTEvaW5kZXggPSAxCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkyL2luZGV4ID0gMgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IGVhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAwCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkxL2luZGV4ID0gMQorCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMi9pbmRleCA9IDIKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBleHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMAorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMS9pbmRleCA9IDEKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTIvaW5kZXggPSAyCisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisKKwkJCQljb21wb25lbnQ6IHBhdGNoL3ZvbHVtZV9wcm9maWxlcworCQkJCQljb21wb25lbnQ6IGhlYWRzZXRfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDAKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTEvaW5kZXggPSAxCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkyL2luZGV4ID0gMgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IHNwZWFrZXJfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDAKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTEvaW5kZXggPSAxCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkyL2luZGV4ID0gMgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IGVhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAwCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkxL2luZGV4ID0gMQorCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMi9pbmRleCA9IDIKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJY29tcG9uZW50OiBleHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMAorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQkJMS9pbmRleCA9IDEKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwkJCQkJCTIvaW5kZXggPSAyCisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gMC4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gMC4wCisKKwlkb21haW46IER0bWYKKwkJY29uZjogSW5DYWxsCisJCQlBTlkKKwkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyZWFtcworCQkJCWNvbXBvbmVudDogZHRtZi92b2x1bWVfcHJvZmlsZXMKKwkJCQkJY29tcG9uZW50OiBoZWFkc2V0X2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTMwLjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0yNi4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMjIuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IC0xOC4wCisJCQkJCWNvbXBvbmVudDogc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC0yNC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMTguMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTEyLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAtNi4wCisJCQkJCWNvbXBvbmVudDogZWFycGllY2VfZGV2aWNlX2NhdGVnb3J5L2N1cnZlX3BvaW50cworCQkJCQkJMC9pbmRleCA9IDEKKwkJCQkJCTAvZGJfYXR0ZW51YXRpb24gPSAtMjQuMAorCQkJCQkJMS9pbmRleCA9IDMzCisJCQkJCQkxL2RiX2F0dGVudWF0aW9uID0gLTE4LjAKKwkJCQkJCTIvaW5kZXggPSA2NgorCQkJCQkJMi9kYl9hdHRlbnVhdGlvbiA9IC0xMi4wCisJCQkJCQkzL2luZGV4ID0gMTAwCisJCQkJCQkzL2RiX2F0dGVudWF0aW9uID0gLTYuMAorCQkJCQljb21wb25lbnQ6IGV4dG1lZGlhX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAxCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTU4LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC00MC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMjcuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IC0xMC4wCisKKwkJY29uZjogT3V0T2ZDYWxsCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmVhbXMKKwkJCQljb21wb25lbnQ6IGR0bWYvdm9sdW1lX3Byb2ZpbGVzCisJCQkJCWNvbXBvbmVudDogaGVhZHNldF9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMAorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC0yNC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMTguMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTEyLjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAtNi4wCisJCQkJCWNvbXBvbmVudDogc3BlYWtlcl9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMAorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC0yNC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtMTYuMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTguMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IDAuMAorCQkJCQljb21wb25lbnQ6IGVhcnBpZWNlX2RldmljZV9jYXRlZ29yeS9jdXJ2ZV9wb2ludHMKKwkJCQkJCTAvaW5kZXggPSAwCisJCQkJCQkwL2RiX2F0dGVudWF0aW9uID0gLTI0LjAKKwkJCQkJCTEvaW5kZXggPSAzMworCQkJCQkJMS9kYl9hdHRlbnVhdGlvbiA9IC0xOC4wCisJCQkJCQkyL2luZGV4ID0gNjYKKwkJCQkJCTIvZGJfYXR0ZW51YXRpb24gPSAtMTIuMAorCQkJCQkJMy9pbmRleCA9IDEwMAorCQkJCQkJMy9kYl9hdHRlbnVhdGlvbiA9IC02LjAKKwkJCQkJY29tcG9uZW50OiBleHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkvY3VydmVfcG9pbnRzCisJCQkJCQkwL2luZGV4ID0gMQorCQkJCQkJMC9kYl9hdHRlbnVhdGlvbiA9IC01OC4wCisJCQkJCQkxL2luZGV4ID0gMzMKKwkJCQkJCTEvZGJfYXR0ZW51YXRpb24gPSAtNDAuMAorCQkJCQkJMi9pbmRleCA9IDY2CisJCQkJCQkyL2RiX2F0dGVudWF0aW9uID0gLTE3LjAKKwkJCQkJCTMvaW5kZXggPSAxMDAKKwkJCQkJCTMvZGJfYXR0ZW51YXRpb24gPSAwLjAKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TdHJ1Y3R1cmUvUG9saWN5Q2xhc3MueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TdHJ1Y3R1cmUvUG9saWN5Q2xhc3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI5Njg3OWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1N0cnVjdHVyZS9Qb2xpY3lDbGFzcy54bWwKQEAgLTAsMCArMSw1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFN5c3RlbUNsYXNzIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249Ii4uLy4uL1NjaGVtYXMvU3lzdGVtQ2xhc3MueHNkIiBOYW1lPSJQb2xpY3kiPgorICAgIDxTdWJzeXN0ZW1JbmNsdWRlIFBhdGg9IlBvbGljeVN1YnN5c3RlbS54bWwiLz4KKzwvU3lzdGVtQ2xhc3M+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MjFkNmFkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbApAQCAtMCwwICsxLDE3MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxDb21wb25lbnRUeXBlU2V0IHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgorICAgICAgICAgICAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iU2NoZW1hcy9Db21wb25lbnRUeXBlU2V0LnhzZCI+CisgICAgPCEtLSBPdXRwdXQgZGV2aWNlcyBkZWZpbml0aW9uIGFzIGEgYml0ZmllbGQgZm9yIHRoZSBzdXBwb3J0ZWQgZGV2aWNlcyBwZXIgb3V0cHV0CisgICAgcHJvZmlsZS4gSXQgbXVzdCBtYXRjaCB3aXRoIHRoZSBvdXRwdXQgZGV2aWNlIGVudW0gcGFyYW1ldGVyLgorICAgIC0tPgorICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgR0xPQkFMIENPTVBPTkVOVFMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKyAgICAgPCEtLSBDb21tb24gVHlwZXMgZGVmaW50aW9uIC0tPgorICAgICA8eGk6aW5jbHVkZSBocmVmPSJQb2xpY3lTdWJzeXN0ZW0tVm9sdW1lLnhtbCIvPgorCisgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBHTE9CQUwgQ09NUE9ORU5UUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgIDxDb21wb25lbnRUeXBlIE5hbWU9Ik91dHB1dERldmljZXNNYXNrIiBEZXNjcmlwdGlvbj0iMzJ0aCBiaXQgaXMgbm90IGFsbG93ZWQgYXMgZGVkaWNhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpbnB1dCBkZXZpY2VzIGRldGVjdGlvbiI+CisgICAgICAgIDxCaXRQYXJhbWV0ZXJCbG9jayBOYW1lPSJtYXNrIiBTaXplPSIzMiI+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIiBTaXplPSIxIiBQb3M9IjAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciIgU2l6ZT0iMSIgUG9zPSIxIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iMiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiIFNpemU9IjEiIFBvcz0iMyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIiBTaXplPSIxIiBQb3M9IjQiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjUiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiIFNpemU9IjEiIFBvcz0iNiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCIgU2l6ZT0iMSIgUG9zPSI3Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiIFNpemU9IjEiIFBvcz0iOCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIiBTaXplPSIxIiBQb3M9IjkiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSIgU2l6ZT0iMSIgUG9zPSIxMCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSIxMSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSIxMiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5IiBTaXplPSIxIiBQb3M9IjEzIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiIFNpemU9IjEiIFBvcz0iMTQiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCIgU2l6ZT0iMSIgUG9zPSIxNSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiIFNpemU9IjEiIFBvcz0iMjYiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSIgU2l6ZT0iMSIgUG9zPSIxNyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pX2FyYyIgU2l6ZT0iMSIgUG9zPSIxOCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiIgU2l6ZT0iMSIgUG9zPSIxOSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbSIgU2l6ZT0iMSIgUG9zPSIyMCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhdXhfbGluZSIgU2l6ZT0iMSIgUG9zPSIyMSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyX3NhZmUiIFNpemU9IjEiIFBvcz0iMjIiLz4KKyAgICAgICAgPC9CaXRQYXJhbWV0ZXJCbG9jaz4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8IS0tIElucHV0IGRldmljZXMgZGVmaW5pdGlvbiBhcyBhIGJpdGZpZWxkIGZvciB0aGUgc3VwcG9ydGVkIGRldmljZXMgcGVyIElucHV0CisgICAgcHJvZmlsZS4gSXQgbXVzdCBtYXRjaCB3aXRoIHRoZSBJbnB1dCBkZXZpY2UgZW51bSBwYXJhbWV0ZXIuCisgICAgLS0+CisgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iSW5wdXREZXZpY2VzTWFzayI+CisgICAgICAgIDxCaXRQYXJhbWV0ZXJCbG9jayBOYW1lPSJtYXNrIiBTaXplPSIzMiI+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImNvbW11bmljYXRpb24iIFNpemU9IjEiIFBvcz0iMCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbWJpZW50IiBTaXplPSIxIiBQb3M9IjEiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiIFNpemU9IjEiIFBvcz0iMiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iMyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjQiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSIgU2l6ZT0iMSIgUG9zPSI1Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV9yeCIgU2l6ZT0iMSIgUG9zPSI2Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJhY2tfbWljIiBTaXplPSIxIiBQb3M9IjciLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCIgU2l6ZT0iMSIgUG9zPSI4Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjkiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iMTAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSIgU2l6ZT0iMSIgUG9zPSIxMSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIiBTaXplPSIxIiBQb3M9IjEyIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIiBTaXplPSIxIiBQb3M9IjEzIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InR2X3R1bmVyIiBTaXplPSIxIiBQb3M9IjE0Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiIFNpemU9IjEiIFBvcz0iMTUiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiIFNpemU9IjEiIFBvcz0iMTYiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiIFNpemU9IjEiIFBvcz0iMTciLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibG9vcGJhY2siIFNpemU9IjEiIFBvcz0iMTgiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaW4iIFNpemU9IjEiIFBvcz0iMzEiLz4KKyAgICAgICAgPC9CaXRQYXJhbWV0ZXJCbG9jaz4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJPdXRwdXRGbGFncyIKKyAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0idGhlIGF1ZGlvIG91dHB1dCBmbGFncyBzZXJ2ZSB0d28gcHVycG9zZXM6CisgICAgICAgICAgICAgICAgICAgIC0gd2hlbiBhbiBBdWRpb1RyYWNrIGlzIGNyZWF0ZWQgdGhleSBpbmRpY2F0ZSBhIHdpc2ggdG8gYmUgY29ubmVjdGVkIHRvIGFuCisgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHN0cmVhbSB3aXRoIGF0dHJpYnV0ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGZsYWdzLgorICAgICAgICAgICAgICAgICAgICAtIHdoZW4gcHJlc2VudCBpbiBhbiBvdXRwdXQgcHJvZmlsZSBkZXNjcmlwdG9yIGxpc3RlZCBmb3IgYSBwYXJ0aWN1bGFyIGF1ZGlvCisgICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmUgbW9kdWxlLCB0aGV5IGluZGljYXRlIHRoYXQgYW4gb3V0cHV0IHN0cmVhbSBjYW4gYmUgb3BlbmVkIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0cyB0aGUgYXR0cmlidXRlcyBpbmRpY2F0ZWQgYnkgdGhlIGZsYWdzLgorICAgICAgICAgICAgICAgICAgICBUaGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgd2lsbCB0cnkgdG8gbWF0Y2ggdGhlIGZsYWdzIGluIHRoZSByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICh3aGVuIGdldE91cHV0KCkgaXMgY2FsbGVkKSB0byBhbiBhdmFpbGFibGUgb3V0cHV0IHN0cmVhbS4iPgorICAgICAgICA8Qml0UGFyYW1ldGVyQmxvY2sgTmFtZT0ibWFzayIgU2l6ZT0iMzIiPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkaXJlY3QiIFNpemU9IjEiIFBvcz0iMCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJwcmltYXJ5IiBTaXplPSIxIiBQb3M9IjEiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZmFzdCIgU2l6ZT0iMSIgUG9zPSIyIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRlZXBfYnVmZmVyIiBTaXplPSIxIiBQb3M9IjMiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY29tcHJlc3Nfb2ZmbG9hZCIgU2l6ZT0iMSIgUG9zPSI0Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Im5vbl9ibG9ja2luZyIgU2l6ZT0iMSIgUG9zPSI1Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imh3X2F2X3N5bmMiIFNpemU9IjEiIFBvcz0iNiIvPgorICAgICAgICA8L0JpdFBhcmFtZXRlckJsb2NrPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0RmxhZ3MiCisgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IlRoZSBhdWRpbyBpbnB1dCBmbGFncyBhcmUgYW5hbG9nb3VzIHRvIGF1ZGlvIG91dHB1dCBmbGFncy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudGx5IHRoZXkgYXJlIHVzZWQgb25seSB3aGVuIGFuIEF1ZGlvUmVjb3JkIGlzIGNyZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGluZGljYXRlIGEgcHJlZmVyZW5jZSB0byBiZSBjb25uZWN0ZWQgdG8gYW4gaW5wdXQgc3RyZWFtIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgZmxhZ3MuIj4KKyAgICAgICAgPEJpdFBhcmFtZXRlckJsb2NrIE5hbWU9Im1hc2siIFNpemU9IjMyIj4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZmFzdCIgU2l6ZT0iMSIgUG9zPSIwIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Imh3X2hvdHdvcmQiIFNpemU9IjEiIFBvcz0iMiIvPgorICAgICAgICA8L0JpdFBhcmFtZXRlckJsb2NrPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0U291cmNlc01hc2siIERlc2NyaXB0aW9uPSJUaGUgYXVkaW8gaW5wdXQgc291cmNlIGlzIGFsc28ga25vd24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgdGhlIHVzZSBjYXNlLiI+CisgICAgICAgIDxCaXRQYXJhbWV0ZXJCbG9jayBOYW1lPSJtYXNrIiBTaXplPSIzMiI+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRlZmF1bHQiIFNpemU9IjEiIFBvcz0iMCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJtaWMiIFNpemU9IjEiIFBvcz0iMSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ2b2ljZV91cGxpbmsiIFNpemU9IjEiIFBvcz0iMiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ2b2ljZV9kb3dubGluayIgU2l6ZT0iMSIgUG9zPSIzIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InZvaWNlX2NhbGwiIFNpemU9IjEiIFBvcz0iNCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjYW1jb3JkZXIiIFNpemU9IjEiIFBvcz0iNSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ2b2ljZV9yZWNvZ25pdGlvbiIgU2l6ZT0iMSIgUG9zPSI2Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InZvaWNlX2NvbW11bmljYXRpb24iIFNpemU9IjEiIFBvcz0iNyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4IiBTaXplPSIxIiBQb3M9IjgiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm1fdHVuZXIiIFNpemU9IjEiIFBvcz0iOSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJob3R3b3JkIiBTaXplPSIxIiBQb3M9IjEwIi8+CisgICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+CisgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgPCEtLSBSb3V0aW5nIFN0cmF0ZWd5IGRlZmluaXRpb24gYXMgYW4gZW51bWVyYXRpb24uIE51bWVyaWNhbCB2YWx1ZSBtdXN0IG1hdGNoIHRoZSB2YWx1ZQorICAgICAgICAgb2YgdGhlIHJvdXRpbmcgc3RyYXRlZ3kgaW4gcG9saWN5IGhlYWRlciBmaWxlLiAtLT4KKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJTdHJhdGVneSI+CisgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InN0cmF0ZWd5IiBTaXplPSIzMiI+CisgICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9Im1lZGlhIiBOdW1lcmljYWw9IjAiLz4KKyAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0icGhvbmUiIE51bWVyaWNhbD0iMSIvPgorICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJzb25pZmljYXRpb24iIE51bWVyaWNhbD0iMiIvPgorICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJzb25pZmljYXRpb25fcmVzcGVjdGZ1bCIgTnVtZXJpY2FsPSIzIi8+CisgICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9ImR0bWYiIE51bWVyaWNhbD0iNCIvPgorICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJlbmZvcmNlZF9hdWRpYmxlIiBOdW1lcmljYWw9IjUiLz4KKyAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0idHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyIiBOdW1lcmljYWw9IjYiLz4KKyAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0iYWNjZXNzaWJpbGl0eSIgTnVtZXJpY2FsPSI3Ii8+CisgICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InJlcm91dGluZyIgTnVtZXJpY2FsPSI4Ii8+CisgICAgICAgIDwvRW51bVBhcmFtZXRlcj4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSQVRFR1kgQ09NTU9OIFRZUEVTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJTdHJhdGVneUNvbmZpZyIgTWFwcGluZz0iU3RyYXRlZ3k6JyUxJyI+CisgICAgICAgIDxDb21wb25lbnQgTmFtZT0ic2VsZWN0ZWRfb3V0cHV0X2RldmljZXMiIFR5cGU9Ik91dHB1dERldmljZXNNYXNrIi8+CisgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkFURUdZIENPTU1PTiBUWVBFUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gQ09NTU9OIFRZUEVTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJTdHJlYW0iPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFwcGxpY2FibGVfc3RyYXRlZ3kiIFR5cGU9IlN0cmF0ZWd5IiBNYXBwaW5nPSJTdHJlYW06JyUxJyIvPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvbHVtZV9wcm9maWxlcyIgVHlwZT0iVm9sdW1lQ3VydmVzQ2F0ZWdvcmllcyIKKyAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iQSB2b2x1bWUgcHJvZmlsZSBpcyByZWZlcmVkIGJ5IHRoZSBzdHJlYW0gdHlwZS4iLz4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIENPTU1PTiBUWVBFUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBVU0FHRSBDT01NT04gVFlQRVMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlVzYWdlIj4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhcHBsaWNhYmxlX3N0cmF0ZWd5IiBUeXBlPSJTdHJhdGVneSIgTWFwcGluZz0iVXNhZ2U6JyUxJyIvPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBVU0FHRSBDT01NT04gVFlQRVMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIENPTU1PTiBUWVBFUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iSW5wdXRTb3VyY2UiPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFwcGxpY2FibGVfaW5wdXRfZGV2aWNlIiBUeXBlPSJJbnB1dERldmljZXNNYXNrIgorICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IklucHV0U291cmNlOiclMSciIERlc2NyaXB0aW9uPSJTZWxlY3RlZCBJbnB1dCBkZXZpY2UiLz4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIENPTU1PTiBUWVBFUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworPC9Db21wb25lbnRUeXBlU2V0PgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLVZvbHVtZS54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0tVm9sdW1lLnhtbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZjM5Y2MyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLVZvbHVtZS54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxDb21wb25lbnRUeXBlU2V0IHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgorICAgICAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgICAgICAgICAgIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSJTY2hlbWFzL0NvbXBvbmVudFR5cGVTZXQueHNkIj4KKyAgPENvbXBvbmVudFR5cGUgTmFtZT0iVm9sdW1lQ3VydmVQb2ludHMiPgorICAgIDxQYXJhbWV0ZXJCbG9jayBOYW1lPSJjdXJ2ZV9wb2ludHMiIEFycmF5TGVuZ3RoPSI0IiBNYXBwaW5nPSJWb2x1bWVQcm9maWxlOiclMSciCisgICAgICAgIERlc2NyaXB0aW9uPSI0IHBvaW50cyB0byBkZWZpbmUgdGhlIHZvbHVtZSBhdHRlbnVhdGlvbiBjdXJ2ZSwgZWFjaAorICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyaXplZCBieSB0aGUgdm9sdW1lIGluZGV4IChmcm9tIDAgdG8gMTAwKSBhdCB3aGljaAorICAgICAgICAgICAgICAgICAgICAgdGhleSBhcHBseSwgYW5kIHRoZSBhdHRlbnVhdGlvbiBpbiBkQiBhdCB0aGF0IGluZGV4LgorICAgICAgICAgICAgICAgICAgICAgV2UgdXNlIDEwMCBzdGVwcyB0byBhdm9pZCByb3VuZGluZyBlcnJvcnMgd2hlbiBjb21wdXRpbmcKKyAgICAgICAgICAgICAgICAgICAgIHRoZSB2b2x1bWUiPgorICAgICAgICA8SW50ZWdlclBhcmFtZXRlciBOYW1lPSJpbmRleCIgU2l6ZT0iMzIiLz4KKyAgICAgICAgPEZpeGVkUG9pbnRQYXJhbWV0ZXIgTmFtZT0iZGJfYXR0ZW51YXRpb24iIFNpemU9IjE2IiBJbnRlZ3JhbD0iNyIgRnJhY3Rpb25hbD0iOCIvPgorICAgICA8L1BhcmFtZXRlckJsb2NrPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlZvbHVtZUN1cnZlc0NhdGVnb3JpZXMiPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImhlYWRzZXRfZGV2aWNlX2NhdGVnb3J5IiBUeXBlPSJWb2x1bWVDdXJ2ZVBvaW50cyIgTWFwcGluZz0iQ2F0ZWdvcnk6MCIvPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9InNwZWFrZXJfZGV2aWNlX2NhdGVnb3J5IiBUeXBlPSJWb2x1bWVDdXJ2ZVBvaW50cyIgTWFwcGluZz0iQ2F0ZWdvcnk6MSIvPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImVhcnBpZWNlX2RldmljZV9jYXRlZ29yeSIgVHlwZT0iVm9sdW1lQ3VydmVQb2ludHMiIE1hcHBpbmc9IkNhdGVnb3J5OjIiLz4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJleHRtZWRpYV9kZXZpY2VfY2F0ZWdvcnkiIFR5cGU9IlZvbHVtZUN1cnZlUG9pbnRzIiBNYXBwaW5nPSJDYXRlZ29yeTozIi8+CisgICAgPC9Db21wb25lbnRUeXBlPgorCis8L0NvbXBvbmVudFR5cGVTZXQ+CisKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjIxZjZhZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGUvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS54bWwKQEAgLTAsMCArMSwxMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8U3Vic3lzdGVtIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgorICAgICAgICAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iU2NoZW1hcy9TdWJzeXN0ZW0ueHNkIgorICAgICAgICAgICBOYW1lPSJwb2xpY3kiIFR5cGU9IlBvbGljeSIgRW5kaWFubmVzcz0iTGl0dGxlIj4KKworICAgIDxDb21wb25lbnRMaWJyYXJ5PgorICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgR0xPQkFMIENPTVBPTkVOVFMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKyAgICAgICAgPCEtLSBDb21tb24gVHlwZXMgZGVmaW50aW9uIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJQb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sIi8+CisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJBVEVHWSBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlN0cmF0ZWdpZXMiIERlc2NyaXB0aW9uPSJJZGVudGlmaWVyIG11c3QgbWF0Y2ggdGhlIGVudW0gdmFsdWUgdG8gbWFrZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbGluayBiZXR3ZWVuIHRoZSBQb2xpY3lNYW5hZ2VyIGFuZCBQRlciPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJtZWRpYSIgVHlwZT0iU3RyYXRlZ3lDb25maWciIE1hcHBpbmc9IkFtZW5kMTpNZWRpYSxJZGVudGlmaWVyOjAiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icGhvbmUiIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIiBNYXBwaW5nPSJBbWVuZDE6UGhvbmUsSWRlbnRpZmllcjoxIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InNvbmlmaWNhdGlvbiIgVHlwZT0iU3RyYXRlZ3lDb25maWciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlNvbmlmaWNhdGlvbixJZGVudGlmaWVyOjIiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ic29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwiIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIgorICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6U29uaWZpY2F0aW9uUmVzcGVjdGZ1bCxJZGVudGlmaWVyOjMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZHRtZiIgVHlwZT0iU3RyYXRlZ3lDb25maWciIE1hcHBpbmc9IkFtZW5kMTpEdG1mLElkZW50aWZpZXI6NCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJlbmZvcmNlZF9hdWRpYmxlIiBUeXBlPSJTdHJhdGVneUNvbmZpZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOkVuZm9yY2VkQXVkaWJsZSxJZGVudGlmaWVyOjUiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyIiBUeXBlPSJTdHJhdGVneUNvbmZpZyIKKyAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlRyYW5zbWl0dGVkVGhyb3VnaFNwZWFrZXIsSWRlbnRpZmllcjo2Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFjY2Vzc2liaWxpdHkiIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6QWNjZXNzaWJpbGl0eSxJZGVudGlmaWVyOjciLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmVyb3V0aW5nIiBUeXBlPSJTdHJhdGVneUNvbmZpZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6UmVyb3V0aW5nLElkZW50aWZpZXI6OCIvPgorICAgICAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkFURUdZIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJTdHJlYW1zIiBEZXNjcmlwdGlvbj0iYXNzb2NpYXRlZCB0byBhdWRpb19zdHJlYW1fdHlwZV90IGRlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgbWFwcGluZyBtdXN0IG1hdGNoIHRoZSB2YWx1ZSBvZiB0aGUgZW51bSI+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NhbGwiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iQW1lbmQxOlZvaWNlQ2FsbCxJZGVudGlmaWVyOjAiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ic3lzdGVtIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IkFtZW5kMTpTeXN0ZW0sSWRlbnRpZmllcjoxIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJpbmciIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iQW1lbmQxOlJpbmcsSWRlbnRpZmllcjoyIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im11c2ljIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IkFtZW5kMTpNdXNpYyxJZGVudGlmaWVyOjMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWxhcm0iIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iQW1lbmQxOkFsYXJtLElkZW50aWZpZXI6NCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJub3RpZmljYXRpb24iIFR5cGU9IlN0cmVhbSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uLElkZW50aWZpZXI6NSIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJibHVldG9vdGhfc2NvIiBUeXBlPSJTdHJlYW0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpCbHVldG9vdGhTY28sSWRlbnRpZmllcjo2Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImVuZm9yY2VkX2F1ZGlibGUiIFR5cGU9IlN0cmVhbSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOkVuZm9yY2VBdWRpYmxlLElkZW50aWZpZXI6NyIKKyAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IlNvdW5kcyB0aGF0IGNhbm5vdCBiZSBtdXRlZCBieSB1c2VyIGFuZCBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSByb3V0ZWQgdG8gc3BlYWtlciIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJkdG1mIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IkFtZW5kMTpEdG1mLElkZW50aWZpZXI6OCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ0dHMiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iQW1lbmQxOlR0cyxJZGVudGlmaWVyOjkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJUcmFuc21pdHRlZCBUaHJvdWdoIFNwZWFrZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGF5cyBvdmVyIHNwZWFrZXIgb25seSwgc2lsZW50IG9uIG90aGVyIGRldmljZXMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWNjZXNzaWJpbGl0eSIgVHlwZT0iU3RyZWFtIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6QWNjZXNzaWJpbGl0eSxJZGVudGlmaWVyOjEwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGFjY2Vzc2liaWxpdHkgdGFsayBiYWNrIHByb21wdHMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmVyb3V0aW5nIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9IkFtZW5kMTpSZXJvdXRpbmcsSWRlbnRpZmllcjoxMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IkZvciBkeW5hbWljIHBvbGljeSBvdXRwdXQgbWl4ZXMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icGF0Y2giIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iQW1lbmQxOlBhdGNoLElkZW50aWZpZXI6MTIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJGb3IgaW50ZXJuYWwgYXVkaW8gZmxpbmdlciB0cmFja3MuIEZpeGVkIHZvbHVtZSIvPgorICAgICAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkVBTSBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgVVNBR0UgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJVc2FnZXMiIERlc2NyaXB0aW9uPSJhc3NvY2lhdGVkIHRvIGF1ZGlvX3N0cmVhbV90eXBlX3QgZGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciBtYXBwaW5nIG11c3QgbWF0Y2ggdGhlIHZhbHVlIG9mIHRoZSBlbnVtIj4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idW5rbm93biIgVHlwZT0iVXNhZ2UiIE1hcHBpbmc9IkFtZW5kMTpVbmtub3duLElkZW50aWZpZXI6MCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJtZWRpYSIgVHlwZT0iVXNhZ2UiIE1hcHBpbmc9IkFtZW5kMTpNZWRpYSxJZGVudGlmaWVyOjEiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY29tbXVuaWNhdGlvbiIgVHlwZT0iVXNhZ2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpWb2ljZUNvbW11bmljYXRpb24sSWRlbnRpZmllcjoyIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NvbW11bmljYXRpb25fc2lnbmFsbGluZyIgVHlwZT0iVXNhZ2UiCisgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpWb2ljZUNvbW11bmljYXRpb25TaWduYWxsaW5nLElkZW50aWZpZXI6MyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhbGFybSIgVHlwZT0iVXNhZ2UiIE1hcHBpbmc9IkFtZW5kMTpBbGFybSxJZGVudGlmaWVyOjQiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibm90aWZpY2F0aW9uIiBUeXBlPSJVc2FnZSIgTWFwcGluZz0iQW1lbmQxOk5vdGlmaWNhdGlvbixJZGVudGlmaWVyOjUiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibm90aWZpY2F0aW9uX3RlbGVwaG9ueV9yaW5ndG9uZSIgVHlwZT0iVXNhZ2UiCisgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpOb3RpZmljYXRpb25UZWxlcGhvbnlSaW5ndG9uZSxJZGVudGlmaWVyOjYiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibm90aWZpY2F0aW9uX2NvbW11bmljYXRpb25fcmVxdWVzdCIgVHlwZT0iVXNhZ2UiCisgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpOb3RpZmljYXRpb25Db21tdW5pY2F0aW9uUmVxdWVzdCxJZGVudGlmaWVyOjciLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibm90aWZpY2F0aW9uX2NvbW11bmljYXRpb25faW5zdGFudCIgVHlwZT0iVXNhZ2UiCisgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpOb3RpZmljYXRpb25Db21tdW5pY2F0aW9uSW5zdGFudCxJZGVudGlmaWVyOjgiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibm90aWZpY2F0aW9uX2NvbW11bmljYXRpb25fZGVsYXllZCIgVHlwZT0iVXNhZ2UiCisgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpOb3RpZmljYXRpb25Db21tdW5pY2F0aW9uRGVsYXRlZCxJZGVudGlmaWVyOjkiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibm90aWZpY2F0aW9uX2V2ZW50IiBUeXBlPSJVc2FnZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uRXZlbnQsSWRlbnRpZmllcjoxMCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhc3Npc3RhbmNlX2FjY2Vzc2liaWxpdHkiIFR5cGU9IlVzYWdlIgorICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6QXNzaXN0YW5jZUFjY2Vzc2liaWxpdHksSWRlbnRpZmllcjoxMSIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhc3Npc3RhbmNlX25hdmlnYXRpb25fZ3VpZGFuY2UiIFR5cGU9IlVzYWdlIgorICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6QXNzaXN0YW5jZU5hdmlnYXRpb25HdWlkYW5jZSxJZGVudGlmaWVyOjEyIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFzc2lzdGFuY2Vfc29uaWZpY2F0aW9uIiBUeXBlPSJVc2FnZSIKKyAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOkFzc2lzdGFuY2VTb25pZmljYXRpb24sSWRlbnRpZmllcjoxMyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJnYW1lIiBUeXBlPSJVc2FnZSIgTWFwcGluZz0iQW1lbmQxOkJsdWV0b290aFNjbyxJZGVudGlmaWVyOjE0Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZpcnR1YWxfc291cmNlIiBUeXBlPSJVc2FnZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpWaXJ0dWFsU291cmNlLElkZW50aWZpZXI6MTUiLz4KKyAgICAgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBVU0FHRSBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iSW5wdXRTb3VyY2VzIiBEZXNjcmlwdGlvbj0iYXNzb2NpYXRlZCB0byBhdWRpb19zb3VyY2VfdCBkZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIG1hcHBpbmcgbXVzdCBtYXRjaCB0aGUgdmFsdWUgb2YgdGhlIGVudW0iPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJkZWZhdWx0IiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iQW1lbmQxOkRlZmF1bHQsSWRlbnRpZmllcjowIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im1pYyIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9IkFtZW5kMTpNaWMsSWRlbnRpZmllcjoxIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX3VwbGluayIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlZvaWNlVXBsaW5rLElkZW50aWZpZXI6MiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9kb3dubGluayIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VEb3dubGluayxJZGVudGlmaWVyOjMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY2FsbCIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpWb2ljZUNhbGwsSWRlbnRpZmllcjo0Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImNhbWNvcmRlciIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9IkFtZW5kMTpDYW1jb3JkZXIsSWRlbnRpZmllcjo1Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX3JlY29nbml0aW9uIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpWb2ljZVJlY29nbml0aW9uLElkZW50aWZpZXI6NiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jb21tdW5pY2F0aW9uIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlZvaWNlQ29tbXVuaWNhdGlvbixJZGVudGlmaWVyOjciLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmVtb3RlX3N1Ym1peCIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpSZW1vdGVTdWJtaXgsSWRlbnRpZmllcjo4Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImZtX3R1bmVyIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iQW1lbmQxOkZtVHVuZXIsSWRlbnRpZmllcjoxOTk4Ii8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImhvdHdvcmQiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJBbWVuZDE6SG90d29yZCxJZGVudGlmaWVyOjE5OTkiLz4KKyAgICAgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBJTlBVVCBTT1VSQ0UgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICA8L0NvbXBvbmVudExpYnJhcnk+CisKKyAgICA8SW5zdGFuY2VEZWZpbml0aW9uPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9InN0cmVhbXMiIFR5cGU9IlN0cmVhbXMiLz4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzdHJhdGVnaWVzIiBUeXBlPSJTdHJhdGVnaWVzIi8+CisgICAgICAgIDxDb21wb25lbnQgTmFtZT0iaW5wdXRfc291cmNlcyIgVHlwZT0iSW5wdXRTb3VyY2VzIi8+CisgICAgICAgIDxDb21wb25lbnQgTmFtZT0idXNhZ2VzIiBUeXBlPSJVc2FnZXMiLz4KKyAgICA8L0luc3RhbmNlRGVmaW5pdGlvbj4KKzwvU3Vic3lzdGVtPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9wb2xpY3lfY3JpdGVyaWEudHh0IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZS9wb2xpY3lfY3JpdGVyaWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVmMDY0OTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlL3BvbGljeV9jcml0ZXJpYS50eHQKQEAgLTAsMCArMSw5IEBACitFeGNsdXNpdmVDcml0ZXJpb24gVGVsZXBob255TW9kZSAgICAgICAgICAgICAgICA6ICAgTm9ybWFsICAgICAgICAgIFJpbmdUb25lICAgICAgICAgICAgICAgIEluQ2FsbCAgICAgICAgICAgICAgSW5Db21tdW5pY2F0aW9uCitJbmNsdXNpdmVDcml0ZXJpb24gQXZhaWxhYmxlSW5wdXREZXZpY2VzICAgICAgICA6ICAgQ29tbXVuaWNhdGlvbiBBbWJpZW50IEJ1aWx0aW5NaWMgQmx1ZXRvb3RoU2NvSGVhZHNldCBXaXJlZEhlYWRzZXQgSGRtaSBUZWxlcGhvbnlSeCBCYWNrTWljIFJlbW90ZVN1Ym1peCBBbmxnRG9ja0hlYWRzZXQgRGd0bERvY2tIZWFkc2V0IFVzYkFjY2Vzc29yeSBVc2JEZXZpY2UgRm1UdW5lciBUdlR1bmVyIExpbmUgU3BkaWYgQmx1ZXRvb3RoQTJkcCBMb29wYmFjaworSW5jbHVzaXZlQ3JpdGVyaW9uIEF2YWlsYWJsZU91dHB1dERldmljZXMgICAgICAgOiAgIEVhcnBpZWNlIFNwZWFrZXIgV2lyZWRTcGVha2VyIFdpcmVkSGVhZHNldCBXaXJlZEhlYWRwaG9uZSBCbHVldG9vdGhTY28gQmx1ZXRvb3RoU2NvSGVhZHNldCBCbHVldG9vdGhTY29DYXJraXQgQmx1ZXRvb3RoQTJkcCBCbHVldG9vdGhBMmRwSGVhZHBob25lcyBCbHVldG9vdGhBMmRwU3BlYWtlciBIZG1pIEFubGdEb2NrSGVhZHNldCBEZ3RsRG9ja0hlYWRzZXQgVXNiQWNjZXNzb3J5IFVzYkRldmljZSBSZW1vdGVTdWJtaXggVGVsZXBob255VHggTGluZSBIZG1pQXJjIFNwZGlmIEZtIEF1eExpbmUgU3BlYWtlclNhZmUKK0V4Y2x1c2l2ZUNyaXRlcmlvbiBGb3JjZVVzZUZvckNvbW11bmljYXRpb24gICAgIDogICBGb3JjZU5vbmUgICAgICAgRm9yY2VTcGVha2VyICAgICAgICAgICAgRm9yY2VCdFNjbworRXhjbHVzaXZlQ3JpdGVyaW9uIEZvcmNlVXNlRm9yTWVkaWEgICAgICAgICAgICAgOiAgIEZvcmNlTm9uZSAgICAgICBGb3JjZVNwZWFrZXIJCQlGb3JjZUhlYWRwaG9uZXMgICAgICAgICBGb3JjZUJ0QTJkcCAgICAgICAgIEZvcmNlV2lyZWRBY2Nlc3NvcnkgRm9yY2VBbmFsb2dEb2NrIEZvcmNlRGlnaXRhbERvY2sgICAgRm9yY2VOb0J0QTJkcCAgICAgICBGb3JjZVN5c3RlbUVuZm9yY2VkCitFeGNsdXNpdmVDcml0ZXJpb24gRm9yY2VVc2VGb3JSZWNvcmQgICAgICAgICAgICA6ICAgRm9yY2VOb25lICAgICAgIEZvcmNlQnRTY28gICAgICAgICAgICAgIEZvcmNlV2lyZWRBY2Nlc3NvcnkKK0V4Y2x1c2l2ZUNyaXRlcmlvbiBGb3JjZVVzZUZvckRvY2sgICAgICAgICAgICAgIDogICBGb3JjZU5vbmUgICAgICAgRm9yY2VXaXJlZEFjY2Vzc29yeSAgICAgRm9yY2VCdENhckRvY2sgICAgICBGb3JjZUJ0RGVza0RvY2sgICAgIEZvcmNlQW5hbG9nRG9jayBGb3JjZURpZ2l0YWxEb2NrCitFeGNsdXNpdmVDcml0ZXJpb24gRm9yY2VVc2VGb3JTeXN0ZW0gICAgICAgICAgICA6ICAgRm9yY2VOb25lICAgICAgIEZvcmNlU3lzdGVtRW5mb3JjZWQKK0V4Y2x1c2l2ZUNyaXRlcmlvbiBGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyAgIDogICBGb3JjZU5vbmUgICAgICAgRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTUyMzY1NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzYgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIFBvbGljeVN1YnN5c3RlbUJ1aWxkZXIuY3BwIFwKKyAgICBQb2xpY3lTdWJzeXN0ZW0uY3BwIFwKKyAgICBTdHJhdGVneS5jcHAgXAorICAgIElucHV0U291cmNlLmNwcCBcCisgICAgVm9sdW1lUHJvZmlsZS5jcHAgXAorICAgIFN0cmVhbS5jcHAgXAorICAgIFVzYWdlLmNwcAorCitMT0NBTF9DRkxBR1MgKz0gXAorICAgIC1XYWxsIFwKKyAgICAtV2Vycm9yIFwKKyAgICAtV2V4dHJhIFwKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChUT1BESVIpZXh0ZXJuYWwvcGFyYW1ldGVyLWZyYW1ld29yay9wYXJhbWV0ZXIgXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUgXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUgXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZSBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhYmxlICBcCisgICAgbGlicGFyYW1ldGVyIFwKKyAgICBsaWJ4bWxzZXJpYWxpemVyIFwKKyAgICBsaWJsb2cgXAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFIDo9IGxpYnBvbGljeS1zdWJzeXN0ZW0KKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vSW5wdXRTb3VyY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40OTdkNTU1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmNwcApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIklucHV0U291cmNlLmgiCisjaW5jbHVkZSAiUG9saWN5TWFwcGluZ0tleXMuaCIKKyNpbmNsdWRlICJQb2xpY3lTdWJzeXN0ZW0uaCIKKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK0lucHV0U291cmNlOjpJbnB1dFNvdXJjZShjb25zdCBzdHJpbmcgJm1hcHBpbmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0KQorICAgIDogQ0Zvcm1hdHRlZFN1YnN5c3RlbU9iamVjdChpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0tleUFtZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1hcHBpbmdLZXlBbWVuZEVuZCAtIE1hcHBpbmdLZXlBbWVuZDEgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCksCisgICAgICBtUG9saWN5U3Vic3lzdGVtKHN0YXRpY19jYXN0PGNvbnN0IFBvbGljeVN1YnN5c3RlbSAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC0+Z2V0QmVsb25naW5nU3Vic3lzdGVtKCkpKSwKKyAgICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UobVBvbGljeVN1YnN5c3RlbS0+Z2V0UG9saWN5UGx1Z2luSW50ZXJmYWNlKCkpLAorICAgICAgbUFwcGxpY2FibGVJbnB1dERldmljZShtRGVmYXVsdEFwcGxpY2FibGVJbnB1dERldmljZSkKK3sKKyAgICBtSWQgPSBzdGF0aWNfY2FzdDxhdWRpb19zb3VyY2VfdD4oY29udGV4dC5nZXRJdGVtQXNJbnRlZ2VyKE1hcHBpbmdLZXlJZGVudGlmaWVyKSk7CisgICAgLy8gRGVjbGFyZXMgdGhlIHN0cmF0ZWd5IHRvIGF1ZGlvIHBvbGljeSBlbmdpbmUKKyAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5hZGRJbnB1dFNvdXJjZShnZXRGb3JtYXR0ZWRNYXBwaW5nVmFsdWUoKSwgbUlkKTsKK30KKworYm9vbCBJbnB1dFNvdXJjZTo6cmVjZWl2ZUZyb21IVyhzdHJpbmcgJiAvKmVycm9yKi8pCit7CisgICAgYmxhY2tib2FyZFdyaXRlKCZtQXBwbGljYWJsZUlucHV0RGV2aWNlLCBzaXplb2YobUFwcGxpY2FibGVJbnB1dERldmljZSkpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIElucHV0U291cmNlOjpzZW5kVG9IVyhzdHJpbmcgJiAvKmVycm9yKi8pCit7CisgICAgdWludDMyX3QgYXBwbGljYWJsZUlucHV0RGV2aWNlOworICAgIGJsYWNrYm9hcmRSZWFkKCZhcHBsaWNhYmxlSW5wdXREZXZpY2UsIHNpemVvZihhcHBsaWNhYmxlSW5wdXREZXZpY2UpKTsKKyAgICBtQXBwbGljYWJsZUlucHV0RGV2aWNlID0gYXBwbGljYWJsZUlucHV0RGV2aWNlOworICAgIHJldHVybiBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5zZXREZXZpY2VGb3JJbnB1dFNvdXJjZShtSWQsIG1BcHBsaWNhYmxlSW5wdXREZXZpY2UpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vSW5wdXRTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42N2M1YjUwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0LmgiCisjaW5jbHVkZSAiSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LmgiCisjaW5jbHVkZSAiTWFwcGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlIDxBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworY2xhc3MgUG9saWN5U3Vic3lzdGVtOworCitjbGFzcyBJbnB1dFNvdXJjZSA6IHB1YmxpYyBDRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0Cit7CitwdWJsaWM6CisgICAgSW5wdXRTb3VyY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm1hcHBpbmdWYWx1ZSwKKyAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgYm9vbCByZWNlaXZlRnJvbUhXKHN0ZDo6c3RyaW5nICZlcnJvcik7CisgICAgdmlydHVhbCBib29sIHNlbmRUb0hXKHN0ZDo6c3RyaW5nICZlcnJvcik7CisKK3ByaXZhdGU6CisgICAgY29uc3QgUG9saWN5U3Vic3lzdGVtICptUG9saWN5U3Vic3lzdGVtOyAvKio8IFJvdXRlIHN1YnN5dGVtIHBsdWdpbi4gKi8KKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSB0byBjb21tdW5pY2F0ZSB3aXRoIEF1ZGlvIFBvbGljeSBFbmdpbmUuCisgICAgICovCisgICAgYW5kcm9pZDo6QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKm1Qb2xpY3lQbHVnaW5JbnRlcmZhY2U7CisKKyAgICBhdWRpb19zb3VyY2VfdCBtSWQ7IC8qKjwgaW5wdXQgc291cmNlIGlkZW50aWZpZXIgdG8gbGluayB3aXRoIGF1ZGlvLmguICovCisgICAgdWludDMyX3QgbUFwcGxpY2FibGVJbnB1dERldmljZTsgLyoqPCBhcHBsaWNhYmxlIGlucHV0IGRldmljZSBmb3IgdGhpcyBzdHJhdGVneS4gKi8KKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgbURlZmF1bHRBcHBsaWNhYmxlSW5wdXREZXZpY2UgPSAwOyAvKio8IGRlZmF1bHQgaW5wdXQgZGV2aWNlLiAqLworfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vcm91bmR1cC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeU1hcHBpbmdLZXlzLmgKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQpzaW1pbGFyaXR5IGluZGV4IDYzJQpjb3B5IGZyb20gaW5jbHVkZS9tZWRpYS9uYmFpby9yb3VuZHVwLmgKY29weSB0byBzZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5TWFwcGluZ0tleXMuaAppbmRleCA0YzNjYzI1Li41Mzk0NGU5Ci0tLSBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vcm91bmR1cC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lNYXBwaW5nS2V5cy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMTggKzE0LDE5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIFJPVU5EVVBfSAotI2RlZmluZSBST1VORFVQX0gKKyNwcmFnbWEgb25jZQogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCisvKioKKyAqIE1hcHBpbmcgaXRlbSB0eXBlcworICovCitlbnVtIFBvbGljeUl0ZW1UeXBlCit7CisgICAgTWFwcGluZ0tleU5hbWUsCisgICAgTWFwcGluZ0tleUNhdGVnb3J5LAorICAgIE1hcHBpbmdLZXlJZGVudGlmaWVyLAorICAgIE1hcHBpbmdLZXlBbWVuZDEsCisgICAgTWFwcGluZ0tleUFtZW5kMiwKKyAgICBNYXBwaW5nS2V5QW1lbmQzCit9OwogCi0vLyBSb3VuZCB1cCB0byB0aGUgbmV4dCBoaWdoZXN0IHBvd2VyIG9mIDIKLXVuc2lnbmVkIHJvdW5kdXAodW5zaWduZWQgdik7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAgLy8gUk9VTkRVUF9ICitzdGF0aWMgY29uc3QgdWludDhfdCBNYXBwaW5nS2V5QW1lbmRFbmQgPSBNYXBwaW5nS2V5QW1lbmQzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZjM5MDZkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5jcHAKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJQb2xpY3lTdWJzeXN0ZW0uaCIKKyNpbmNsdWRlICJTdWJzeXN0ZW1PYmplY3RGYWN0b3J5LmgiCisjaW5jbHVkZSAiUG9saWN5TWFwcGluZ0tleXMuaCIKKyNpbmNsdWRlICJTdHJhdGVneS5oIgorI2luY2x1ZGUgIlN0cmVhbS5oIgorI2luY2x1ZGUgIklucHV0U291cmNlLmgiCisjaW5jbHVkZSAiVm9sdW1lUHJvZmlsZS5oIgorI2luY2x1ZGUgIlVzYWdlLmgiCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK3VzaW5nIGFuZHJvaWQ6OmF1ZGlvX3BvbGljeTo6RW5naW5lSW5zdGFuY2U7CisKK2NvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVN1YnN5c3RlbTo6bUtleU5hbWUgPSAiTmFtZSI7Citjb25zdCBjaGFyICpjb25zdCBQb2xpY3lTdWJzeXN0ZW06Om1LZXlJZGVudGlmaWVyID0gIklkZW50aWZpZXIiOworY29uc3QgY2hhciAqY29uc3QgUG9saWN5U3Vic3lzdGVtOjptS2V5Q2F0ZWdvcnkgPSAiQ2F0ZWdvcnkiOworY29uc3QgY2hhciAqY29uc3QgUG9saWN5U3Vic3lzdGVtOjptS2V5QW1lbmQxID0gIkFtZW5kMSI7Citjb25zdCBjaGFyICpjb25zdCBQb2xpY3lTdWJzeXN0ZW06Om1LZXlBbWVuZDIgPSAiQW1lbmQyIjsKK2NvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVN1YnN5c3RlbTo6bUtleUFtZW5kMyA9ICJBbWVuZDMiOworCisKK2NvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVN1YnN5c3RlbTo6bVN0cmVhbUNvbXBvbmVudE5hbWUgPSAiU3RyZWFtIjsKK2NvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVN1YnN5c3RlbTo6bVN0cmF0ZWd5Q29tcG9uZW50TmFtZSA9ICJTdHJhdGVneSI7Citjb25zdCBjaGFyICpjb25zdCBQb2xpY3lTdWJzeXN0ZW06Om1JbnB1dFNvdXJjZUNvbXBvbmVudE5hbWUgPSAiSW5wdXRTb3VyY2UiOworY29uc3QgY2hhciAqY29uc3QgUG9saWN5U3Vic3lzdGVtOjptVXNhZ2VDb21wb25lbnROYW1lID0gIlVzYWdlIjsKK2NvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVN1YnN5c3RlbTo6bVZvbHVtZVByb2ZpbGVDb21wb25lbnROYW1lID0gIlZvbHVtZVByb2ZpbGUiOworCitQb2xpY3lTdWJzeXN0ZW06OlBvbGljeVN1YnN5c3RlbShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICA6IENTdWJzeXN0ZW0obmFtZSksCisgICAgICBtUGx1Z2luSW50ZXJmYWNlKE5VTEwpCit7CisgICAgLy8gVHJ5IHRvIGNvbm5lY3QgYSBQbHVnaW4gSW50ZXJmYWNlIGZyb20gQXVkaW8gUG9saWN5IEVuZ2luZQorICAgIEVuZ2luZUluc3RhbmNlICplbmdpbmVJbnN0YW5jZSA9IEVuZ2luZUluc3RhbmNlOjpnZXRJbnN0YW5jZSgpOworCisgICAgQUxPR19BU1NFUlQoZW5naW5lSW5zdGFuY2UgIT0gTlVMTCwgIk5VTEwgUGx1Z2luIEludGVyZmFjZSIpOworCisgICAgLy8gUmV0cmlldmUgdGhlIFJvdXRlIEludGVyZmFjZQorICAgIG1QbHVnaW5JbnRlcmZhY2UgPSBlbmdpbmVJbnN0YW5jZS0+cXVlcnlJbnRlcmZhY2U8YW5kcm9pZDo6QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2U+KCk7CisgICAgQUxPR19BU1NFUlQobVBsdWdpbkludGVyZmFjZSAhPSBOVUxMLCAiTlVMTCBQbHVnaW4gSW50ZXJmYWNlIik7CisKKyAgICAvLyBQcm92aWRlIG1hcHBpbmcga2V5cyB0byB0aGUgY29yZSwgbmVjZXNzYXJ5IHdoZW4gcGFyc2luZyB0aGUgWE1MIFN0cnVjdHVyZSBmaWxlcy4KKyAgICBhZGRDb250ZXh0TWFwcGluZ0tleShtS2V5TmFtZSk7CisgICAgYWRkQ29udGV4dE1hcHBpbmdLZXkobUtleUNhdGVnb3J5KTsKKyAgICBhZGRDb250ZXh0TWFwcGluZ0tleShtS2V5SWRlbnRpZmllcik7CisgICAgYWRkQ29udGV4dE1hcHBpbmdLZXkobUtleUFtZW5kMSk7CisgICAgYWRkQ29udGV4dE1hcHBpbmdLZXkobUtleUFtZW5kMik7CisgICAgYWRkQ29udGV4dE1hcHBpbmdLZXkobUtleUFtZW5kMyk7CisKKyAgICAvLyBQcm92aWRlIGNyZWF0b3JzIHRvIHVwcGVyIGxheWVyCisgICAgYWRkU3Vic3lzdGVtT2JqZWN0RmFjdG9yeSgKKyAgICAgICAgbmV3IFRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5PFN0cmVhbT4oCisgICAgICAgICAgICBtU3RyZWFtQ29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgICgxIDw8IE1hcHBpbmdLZXlBbWVuZDEpIHwgKDEgPDwgTWFwcGluZ0tleUlkZW50aWZpZXIpKQorICAgICAgICApOworICAgIGFkZFN1YnN5c3RlbU9iamVjdEZhY3RvcnkoCisgICAgICAgIG5ldyBUU3Vic3lzdGVtT2JqZWN0RmFjdG9yeTxTdHJhdGVneT4oCisgICAgICAgICAgICBtU3RyYXRlZ3lDb21wb25lbnROYW1lLAorICAgICAgICAgICAgKDEgPDwgTWFwcGluZ0tleUFtZW5kMSkgfCAoMSA8PCBNYXBwaW5nS2V5SWRlbnRpZmllcikpCisgICAgICAgICk7CisgICAgYWRkU3Vic3lzdGVtT2JqZWN0RmFjdG9yeSgKKyAgICAgICAgbmV3IFRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5PFVzYWdlPigKKyAgICAgICAgICAgIG1Vc2FnZUNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAoMSA8PCBNYXBwaW5nS2V5QW1lbmQxKSB8ICgxIDw8IE1hcHBpbmdLZXlJZGVudGlmaWVyKSkKKyAgICAgICAgKTsKKyAgICBhZGRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5KAorICAgICAgICBuZXcgVFN1YnN5c3RlbU9iamVjdEZhY3Rvcnk8SW5wdXRTb3VyY2U+KAorICAgICAgICAgICAgbUlucHV0U291cmNlQ29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgICgxIDw8IE1hcHBpbmdLZXlBbWVuZDEpIHwgKDEgPDwgTWFwcGluZ0tleUlkZW50aWZpZXIpKQorICAgICAgICApOworICAgIGFkZFN1YnN5c3RlbU9iamVjdEZhY3RvcnkoCisgICAgICAgIG5ldyBUU3Vic3lzdGVtT2JqZWN0RmFjdG9yeTxWb2x1bWVQcm9maWxlPigKKyAgICAgICAgICAgIG1Wb2x1bWVQcm9maWxlQ29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgICgxIDw8IE1hcHBpbmdLZXlBbWVuZDEpIHwgKDEgPDwgTWFwcGluZ0tleUlkZW50aWZpZXIpIHwgKDEgPDwgTWFwcGluZ0tleUlkZW50aWZpZXIpKQorICAgICAgICApOworfQorCisvLyBSZXRyaWV2ZSBSb3V0ZSBpbnRlcmZhY2UKK2FuZHJvaWQ6OkF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICpQb2xpY3lTdWJzeXN0ZW06OmdldFBvbGljeVBsdWdpbkludGVyZmFjZSgpIGNvbnN0Cit7CisgICAgQUxPR19BU1NFUlQobVBsdWdpbkludGVyZmFjZSAhPSBOVUxMLCAiTlVMTCBQbHVnaW4gSW50ZXJmYWNlIik7CisgICAgcmV0dXJuIG1QbHVnaW5JbnRlcmZhY2U7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2MyNmZlMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJTdWJzeXN0ZW0uaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2U7CisKK30KKworY2xhc3MgUG9saWN5U3Vic3lzdGVtIDogcHVibGljIENTdWJzeXN0ZW0KK3sKK3B1YmxpYzoKKyAgICBQb2xpY3lTdWJzeXN0ZW0oY29uc3Qgc3RkOjpzdHJpbmcgJnN0ck5hbWUpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgUm91dGUgTWFuYWdlciBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJvdXRlTWFuYWdlciBpbnRlcmZhY2UgZm9yIHRoZSByb3V0ZSBwbHVnaW4uCisgICAgICovCisgICAgYW5kcm9pZDo6QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKmdldFBvbGljeVBsdWdpbkludGVyZmFjZSgpIGNvbnN0OworCitwcml2YXRlOgorICAgIC8qIENvcHkgZmFjaWxpdGllcyBhcmUgcHV0IHByaXZhdGUgdG8gZGlzYWJsZSBjb3B5LiAqLworICAgIFBvbGljeVN1YnN5c3RlbShjb25zdCBQb2xpY3lTdWJzeXN0ZW0gJm9iamVjdCk7CisgICAgUG9saWN5U3Vic3lzdGVtICZvcGVyYXRvcj0oY29uc3QgUG9saWN5U3Vic3lzdGVtICZvYmplY3QpOworCisgICAgYW5kcm9pZDo6QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKm1QbHVnaW5JbnRlcmZhY2U7IC8qKjwgQXVkaW8gUG9saWN5IFBsdWdpbiBJbnRlcmZhY2UuICovCisKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbUtleU5hbWU7IC8qKjwgbmFtZSBrZXkgbWFwcGluZyBzdHJpbmcuICovCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1LZXlJZGVudGlmaWVyOworICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtS2V5Q2F0ZWdvcnk7CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbUtleUFtZW5kMTsgLyoqPCBhbWVuZDEga2V5IG1hcHBpbmcgc3RyaW5nLiAqLworICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtS2V5QW1lbmQyOyAvKio8IGFtZW5kMiBrZXkgbWFwcGluZyBzdHJpbmcuICovCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1LZXlBbWVuZDM7IC8qKjwgYW1lbmQzIGtleSBtYXBwaW5nIHN0cmluZy4gKi8KKworICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtU3RyZWFtQ29tcG9uZW50TmFtZTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVN0cmF0ZWd5Q29tcG9uZW50TmFtZTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbUlucHV0U291cmNlQ29tcG9uZW50TmFtZTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVVzYWdlQ29tcG9uZW50TmFtZTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVZvbHVtZVByb2ZpbGVDb21wb25lbnROYW1lOworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW1CdWlsZGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW1CdWlsZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMTRkNDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbUJ1aWxkZXIuY3BwCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiU3Vic3lzdGVtTGlicmFyeS5oIgorI2luY2x1ZGUgIk5hbWVkRWxlbWVudEJ1aWxkZXJUZW1wbGF0ZS5oIgorI2luY2x1ZGUgIlBvbGljeVN1YnN5c3RlbS5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgUE9MSUNZX1NVQlNZU1RFTV9OQU1FID0gIlBvbGljeSI7CitleHRlcm4gIkMiCit7Cit2b2lkIGdldFBPTElDWVN1YnN5c3RlbUJ1aWxkZXIoQ1N1YnN5c3RlbUxpYnJhcnkgKnN1YnN5c3RlbUxpYnJhcnkpCit7CisgICAgc3Vic3lzdGVtTGlicmFyeS0+YWRkRWxlbWVudEJ1aWxkZXIoUE9MSUNZX1NVQlNZU1RFTV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUTmFtZWRFbGVtZW50QnVpbGRlclRlbXBsYXRlPFBvbGljeVN1YnN5c3RlbT4oKSk7Cit9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyYXRlZ3kuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmF0ZWd5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xODQ4ODEzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmF0ZWd5LmNwcApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlN0cmF0ZWd5LmgiCisjaW5jbHVkZSAiUG9saWN5TWFwcGluZ0tleXMuaCIKKyNpbmNsdWRlICJQb2xpY3lTdWJzeXN0ZW0uaCIKKwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBhbmRyb2lkOjpyb3V0aW5nX3N0cmF0ZWd5OworCitTdHJhdGVneTo6U3RyYXRlZ3koY29uc3Qgc3RyaW5nICZtYXBwaW5nVmFsdWUsCisgICAgICAgICAgICAgICAgICAgQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAqaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENNYXBwaW5nQ29udGV4dCAmY29udGV4dCkKKyAgICA6IENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QoaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmdLZXlBbWVuZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNYXBwaW5nS2V5QW1lbmRFbmQgLSBNYXBwaW5nS2V5QW1lbmQxICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQpLAorICAgICAgbVBvbGljeVN1YnN5c3RlbShzdGF0aWNfY2FzdDxjb25zdCBQb2xpY3lTdWJzeXN0ZW0gKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQtPmdldEJlbG9uZ2luZ1N1YnN5c3RlbSgpKSksCisgICAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlKG1Qb2xpY3lTdWJzeXN0ZW0tPmdldFBvbGljeVBsdWdpbkludGVyZmFjZSgpKSwKKyAgICAgIG1BcHBsaWNhYmxlT3V0cHV0RGV2aWNlKG1EZWZhdWx0QXBwbGljYWJsZU91dHB1dERldmljZSkKK3sKKyAgICBtSWQgPSBzdGF0aWNfY2FzdDxyb3V0aW5nX3N0cmF0ZWd5Pihjb250ZXh0LmdldEl0ZW1Bc0ludGVnZXIoTWFwcGluZ0tleUlkZW50aWZpZXIpKTsKKworICAgIC8vIERlY2xhcmVzIHRoZSBzdHJhdGVneSB0byBhdWRpbyBwb2xpY3kgZW5naW5lCisgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+YWRkU3RyYXRlZ3koZ2V0Rm9ybWF0dGVkTWFwcGluZ1ZhbHVlKCksIG1JZCk7Cit9CisKK2Jvb2wgU3RyYXRlZ3k6OnJlY2VpdmVGcm9tSFcoc3RyaW5nICYgLyplcnJvciovKQoreworICAgIGJsYWNrYm9hcmRXcml0ZSgmbUFwcGxpY2FibGVPdXRwdXREZXZpY2UsIHNpemVvZihtQXBwbGljYWJsZU91dHB1dERldmljZSkpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFN0cmF0ZWd5OjpzZW5kVG9IVyhzdHJpbmcgJiAvKmVycm9yKi8pCit7CisgICAgdWludDMyX3QgYXBwbGljYWJsZU91dHB1dERldmljZTsKKyAgICBibGFja2JvYXJkUmVhZCgmYXBwbGljYWJsZU91dHB1dERldmljZSwgc2l6ZW9mKGFwcGxpY2FibGVPdXRwdXREZXZpY2UpKTsKKyAgICByZXR1cm4gbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0RGV2aWNlRm9yU3RyYXRlZ3kobUlkLCBhcHBsaWNhYmxlT3V0cHV0RGV2aWNlKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJhdGVneS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmF0ZWd5LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWE5YjNlNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJhdGVneS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkZvcm1hdHRlZFN1YnN5c3RlbU9iamVjdC5oIgorI2luY2x1ZGUgIkluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC5oIgorI2luY2x1ZGUgIk1hcHBpbmdDb250ZXh0LmgiCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK2NsYXNzIFBvbGljeVN1YnN5c3RlbTsKKworY2xhc3MgU3RyYXRlZ3kgOiBwdWJsaWMgQ0Zvcm1hdHRlZFN1YnN5c3RlbU9iamVjdAoreworcHVibGljOgorICAgIFN0cmF0ZWd5KGNvbnN0IHN0ZDo6c3RyaW5nICZtYXBwaW5nVmFsdWUsCisgICAgICAgICAgICAgQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAqaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAorICAgICAgICAgICAgIGNvbnN0IENNYXBwaW5nQ29udGV4dCAmY29udGV4dCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGJvb2wgcmVjZWl2ZUZyb21IVyhzdGQ6OnN0cmluZyAmZXJyb3IpOworICAgIHZpcnR1YWwgYm9vbCBzZW5kVG9IVyhzdGQ6OnN0cmluZyAmZXJyb3IpOworCitwcml2YXRlOgorICAgIGNvbnN0IFBvbGljeVN1YnN5c3RlbSAqbVBvbGljeVN1YnN5c3RlbTsgLyoqPCBSb3V0ZSBzdWJzeXRlbSBwbHVnaW4uICovCisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgdG8gY29tbXVuaWNhdGUgd2l0aCBBdWRpbyBQb2xpY3kgRW5naW5lLgorICAgICAqLworICAgIGFuZHJvaWQ6OkF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlICptUG9saWN5UGx1Z2luSW50ZXJmYWNlOworCisgICAgYW5kcm9pZDo6cm91dGluZ19zdHJhdGVneSBtSWQ7IC8qKjwgc3RyYXRlZ3kgaWRlbnRpZmllciB0byBsaW5rIHdpdGggYXVkaW8uaC4qLworICAgIHVpbnQzMl90IG1BcHBsaWNhYmxlT3V0cHV0RGV2aWNlOyAvKio8IGFwcGxpY2FibGUgb3V0cHV0IGRldmljZSBmb3IgdGhpcyBzdHJhdGVneS4gKi8KKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgbURlZmF1bHRBcHBsaWNhYmxlT3V0cHV0RGV2aWNlID0gMDsgLyoqPCBkZWZhdWx0IG91dHB1dCBkZXZpY2UuICovCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NzViMGJiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5jcHAKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJTdHJlYW0uaCIKKyNpbmNsdWRlICJQb2xpY3lNYXBwaW5nS2V5cy5oIgorI2luY2x1ZGUgIlBvbGljeVN1YnN5c3RlbS5oIgorCit1c2luZyBzdGQ6OnN0cmluZzsKK3VzaW5nIGFuZHJvaWQ6OnJvdXRpbmdfc3RyYXRlZ3k7CisKK1N0cmVhbTo6U3RyZWFtKGNvbnN0IHN0cmluZyAmbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDTWFwcGluZ0NvbnRleHQgJmNvbnRleHQpCisgICAgOiBDRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0KGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nS2V5QW1lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWFwcGluZ0tleUFtZW5kRW5kIC0gTWFwcGluZ0tleUFtZW5kMSArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KSwKKyAgICAgIG1Qb2xpY3lTdWJzeXN0ZW0oc3RhdGljX2Nhc3Q8Y29uc3QgUG9saWN5U3Vic3lzdGVtICo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LT5nZXRCZWxvbmdpbmdTdWJzeXN0ZW0oKSkpLAorICAgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZShtUG9saWN5U3Vic3lzdGVtLT5nZXRQb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSksCisgICAgICBtQXBwbGljYWJsZVN0cmF0ZWd5KG1EZWZhdWx0QXBwbGljYWJsZVN0cmF0ZWd5KQoreworICAgIG1JZCA9IHN0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGNvbnRleHQuZ2V0SXRlbUFzSW50ZWdlcihNYXBwaW5nS2V5SWRlbnRpZmllcikpOworCisgICAgLy8gRGVjbGFyZXMgdGhlIHN0cmF0ZWd5IHRvIGF1ZGlvIHBvbGljeSBlbmdpbmUKKyAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5hZGRTdHJlYW0oZ2V0Rm9ybWF0dGVkTWFwcGluZ1ZhbHVlKCksIG1JZCk7Cit9CisKK2Jvb2wgU3RyZWFtOjpyZWNlaXZlRnJvbUhXKHN0cmluZyAmIC8qZXJyb3IqLykKK3sKKyAgICBibGFja2JvYXJkV3JpdGUoJm1BcHBsaWNhYmxlU3RyYXRlZ3ksIHNpemVvZihtQXBwbGljYWJsZVN0cmF0ZWd5KSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU3RyZWFtOjpzZW5kVG9IVyhzdHJpbmcgJiAvKmVycm9yKi8pCit7CisgICAgdWludDMyX3QgYXBwbGljYWJsZVN0cmF0ZWd5OworICAgIGJsYWNrYm9hcmRSZWFkKCZhcHBsaWNhYmxlU3RyYXRlZ3ksIHNpemVvZihhcHBsaWNhYmxlU3RyYXRlZ3kpKTsKKyAgICBtQXBwbGljYWJsZVN0cmF0ZWd5ID0gYXBwbGljYWJsZVN0cmF0ZWd5OworICAgIHJldHVybiBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5zZXRTdHJhdGVneUZvclN0cmVhbShtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8cm91dGluZ19zdHJhdGVneT4obUFwcGxpY2FibGVTdHJhdGVneSkpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdkOTBjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyZWFtLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0LmgiCisjaW5jbHVkZSAiSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LmgiCisjaW5jbHVkZSAiTWFwcGluZ0NvbnRleHQuaCIKKyNpbmNsdWRlIDxBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworY2xhc3MgUG9saWN5U3Vic3lzdGVtOworCitjbGFzcyBTdHJlYW0gOiBwdWJsaWMgQ0Zvcm1hdHRlZFN1YnN5c3RlbU9iamVjdAoreworcHVibGljOgorICAgIFN0cmVhbShjb25zdCBzdGQ6OnN0cmluZyAmbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKKyAgICAgICAgICAgICBjb25zdCBDTWFwcGluZ0NvbnRleHQgJmNvbnRleHQpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBib29sIHJlY2VpdmVGcm9tSFcoc3RkOjpzdHJpbmcgJmVycm9yKTsKKyAgICB2aXJ0dWFsIGJvb2wgc2VuZFRvSFcoc3RkOjpzdHJpbmcgJmVycm9yKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBQb2xpY3lTdWJzeXN0ZW0gKm1Qb2xpY3lTdWJzeXN0ZW07IC8qKjwgUm91dGUgc3Vic3l0ZW0gcGx1Z2luLiAqLworCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIHRvIGNvbW11bmljYXRlIHdpdGggQXVkaW8gUG9saWN5IEVuZ2luZS4KKyAgICAgKi8KKyAgICBhbmRyb2lkOjpBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZSAqbVBvbGljeVBsdWdpbkludGVyZmFjZTsKKworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbUlkOyAvKio8IHN0cmVhbSB0eXBlIGlkZW50aWZpZXIgdG8gbGluayB3aXRoIGF1ZGlvLmguICovCisgICAgdWludDMyX3QgbUFwcGxpY2FibGVTdHJhdGVneTsgLyoqPCBhcHBsaWNhYmxlIHN0cmF0ZWd5IGZvciB0aGlzIHN0cmVhbS4gKi8KKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgbURlZmF1bHRBcHBsaWNhYmxlU3RyYXRlZ3kgPSAwOyAvKio8IGRlZmF1bHQgc3RyYXRlZ3kuICovCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1VzYWdlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Vc2FnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTkxNmI5YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Vc2FnZS5jcHAKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJVc2FnZS5oIgorI2luY2x1ZGUgIlBvbGljeU1hcHBpbmdLZXlzLmgiCisjaW5jbHVkZSAiUG9saWN5U3Vic3lzdGVtLmgiCisKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgYW5kcm9pZDo6cm91dGluZ19zdHJhdGVneTsKKworVXNhZ2U6OlVzYWdlKGNvbnN0IHN0cmluZyAmbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDTWFwcGluZ0NvbnRleHQgJmNvbnRleHQpCisgICAgOiBDRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0KGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nS2V5QW1lbmQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWFwcGluZ0tleUFtZW5kRW5kIC0gTWFwcGluZ0tleUFtZW5kMSArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KSwKKyAgICAgIG1Qb2xpY3lTdWJzeXN0ZW0oc3RhdGljX2Nhc3Q8Y29uc3QgUG9saWN5U3Vic3lzdGVtICo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LT5nZXRCZWxvbmdpbmdTdWJzeXN0ZW0oKSkpLAorICAgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZShtUG9saWN5U3Vic3lzdGVtLT5nZXRQb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSksCisgICAgICBtQXBwbGljYWJsZVN0cmF0ZWd5KG1EZWZhdWx0QXBwbGljYWJsZVN0cmF0ZWd5KQoreworICAgIG1JZCA9IHN0YXRpY19jYXN0PGF1ZGlvX3VzYWdlX3Q+KGNvbnRleHQuZ2V0SXRlbUFzSW50ZWdlcihNYXBwaW5nS2V5SWRlbnRpZmllcikpOworCisgICAgLy8gRGVjbGFyZXMgdGhlIHN0cmF0ZWd5IHRvIGF1ZGlvIHBvbGljeSBlbmdpbmUKKyAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5hZGRVc2FnZShnZXRGb3JtYXR0ZWRNYXBwaW5nVmFsdWUoKSwgbUlkKTsKK30KKworYm9vbCBVc2FnZTo6cmVjZWl2ZUZyb21IVyhzdHJpbmcgJiAvKmVycm9yKi8pCit7CisgICAgYmxhY2tib2FyZFdyaXRlKCZtQXBwbGljYWJsZVN0cmF0ZWd5LCBzaXplb2YobUFwcGxpY2FibGVTdHJhdGVneSkpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFVzYWdlOjpzZW5kVG9IVyhzdHJpbmcgJiAvKmVycm9yKi8pCit7CisgICAgdWludDMyX3QgYXBwbGljYWJsZVN0cmF0ZWd5OworICAgIGJsYWNrYm9hcmRSZWFkKCZhcHBsaWNhYmxlU3RyYXRlZ3ksIHNpemVvZihhcHBsaWNhYmxlU3RyYXRlZ3kpKTsKKyAgICBtQXBwbGljYWJsZVN0cmF0ZWd5ID0gYXBwbGljYWJsZVN0cmF0ZWd5OworICAgIHJldHVybiBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5zZXRTdHJhdGVneUZvclVzYWdlKG1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxyb3V0aW5nX3N0cmF0ZWd5PihtQXBwbGljYWJsZVN0cmF0ZWd5KSk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVXNhZ2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Vc2FnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhlOWI2MzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVXNhZ2UuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QuaCIKKyNpbmNsdWRlICJJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQuaCIKKyNpbmNsdWRlICJNYXBwaW5nQ29udGV4dC5oIgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCitjbGFzcyBQb2xpY3lTdWJzeXN0ZW07CisKK2NsYXNzIFVzYWdlIDogcHVibGljIENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QKK3sKK3B1YmxpYzoKKyAgICBVc2FnZShjb25zdCBzdGQ6OnN0cmluZyAmbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKKyAgICAgICAgICAgICBjb25zdCBDTWFwcGluZ0NvbnRleHQgJmNvbnRleHQpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBib29sIHJlY2VpdmVGcm9tSFcoc3RkOjpzdHJpbmcgJmVycm9yKTsKKyAgICB2aXJ0dWFsIGJvb2wgc2VuZFRvSFcoc3RkOjpzdHJpbmcgJmVycm9yKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBQb2xpY3lTdWJzeXN0ZW0gKm1Qb2xpY3lTdWJzeXN0ZW07IC8qKjwgUm91dGUgc3Vic3l0ZW0gcGx1Z2luLiAqLworCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIHRvIGNvbW11bmljYXRlIHdpdGggQXVkaW8gUG9saWN5IEVuZ2luZS4KKyAgICAgKi8KKyAgICBhbmRyb2lkOjpBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZSAqbVBvbGljeVBsdWdpbkludGVyZmFjZTsKKworICAgIGF1ZGlvX3VzYWdlX3QgbUlkOyAvKio8IHVzYWdlIGlkZW50aWZpZXIgdG8gbGluayB3aXRoIGF1ZGlvLmguICovCisgICAgdWludDMyX3QgbUFwcGxpY2FibGVTdHJhdGVneTsgLyoqPCBhcHBsaWNhYmxlIHN0cmF0ZWd5IGZvciB0aGlzIHVzYWdlLiAqLworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBtRGVmYXVsdEFwcGxpY2FibGVTdHJhdGVneSA9IDA7IC8qKjwgZGVmYXVsdCBzdHJhdGVneS4gKi8KK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVm9sdW1lUHJvZmlsZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVm9sdW1lUHJvZmlsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWMxNTVjOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Wb2x1bWVQcm9maWxlLmNwcApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlZvbHVtZVByb2ZpbGUuaCIKKyNpbmNsdWRlICJQb2xpY3lNYXBwaW5nS2V5cy5oIgorI2luY2x1ZGUgIlBvbGljeVN1YnN5c3RlbS5oIgorI2luY2x1ZGUgIlBhcmFtZXRlckJsb2NrVHlwZS5oIgorI2luY2x1ZGUgPFZvbHVtZS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKwordXNpbmcgc3RkOjpzdHJpbmc7CisKK1ZvbHVtZVByb2ZpbGU6OlZvbHVtZVByb2ZpbGUoY29uc3Qgc3RyaW5nICZtYXBwaW5nVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0KQorICAgIDogQ0Zvcm1hdHRlZFN1YnN5c3RlbU9iamVjdChpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0tleUFtZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1hcHBpbmdLZXlBbWVuZEVuZCAtIE1hcHBpbmdLZXlBbWVuZDEgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCksCisgICAgICBtUG9saWN5U3Vic3lzdGVtKHN0YXRpY19jYXN0PGNvbnN0IFBvbGljeVN1YnN5c3RlbSAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC0+Z2V0QmVsb25naW5nU3Vic3lzdGVtKCkpKSwKKyAgICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UobVBvbGljeVN1YnN5c3RlbS0+Z2V0UG9saWN5UGx1Z2luSW50ZXJmYWNlKCkpCit7CisgICAgdWludDMyX3QgY2F0ZWdvcnlLZXkgPSBjb250ZXh0LmdldEl0ZW1Bc0ludGVnZXIoTWFwcGluZ0tleUNhdGVnb3J5KTsKKyAgICBpZiAoY2F0ZWdvcnlLZXkgPj0gVm9sdW1lOjpERVZJQ0VfQ0FURUdPUllfQ05UKSB7CisgICAgICAgIG1DYXRlZ29yeSA9IFZvbHVtZTo6REVWSUNFX0NBVEVHT1JZX1NQRUFLRVI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNhdGVnb3J5ID0gc3RhdGljX2Nhc3Q8Vm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnk+KGNhdGVnb3J5S2V5KTsKKyAgICB9CisgICAgbUlkID0gc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4oY29udGV4dC5nZXRJdGVtQXNJbnRlZ2VyKE1hcHBpbmdLZXlJZGVudGlmaWVyKSk7CisKKyAgICAvLyAobm8gZXhjZXB0aW9uIHN1cHBvcnQsIGRlZmVyIHRoZSBlcnJvcikKKyAgICBpZiAoaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LT5nZXRUeXBlKCkgIT0gQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudDo6RVBhcmFtZXRlckJsb2NrKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gR2V0IGFjdHVhbCBlbGVtZW50IHR5cGUKKyAgICBjb25zdCBDUGFyYW1ldGVyQmxvY2tUeXBlICpwYXJhbWV0ZXJUeXBlID0gc3RhdGljX2Nhc3Q8Y29uc3QgQ1BhcmFtZXRlckJsb2NrVHlwZSAqPigKKyAgICAgICAgICAgICAgICBpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQtPmdldFR5cGVFbGVtZW50KCkpOworICAgIG1Qb2ludHMgPSBwYXJhbWV0ZXJUeXBlLT5nZXRBcnJheUxlbmd0aCgpOworfQorCitib29sIFZvbHVtZVByb2ZpbGU6OnJlY2VpdmVGcm9tSFcoc3RyaW5nICYgLyplcnJvciovKQoreworICAgIHJldHVybiB0cnVlOworfQorCitib29sIFZvbHVtZVByb2ZpbGU6OnNlbmRUb0hXKHN0cmluZyAmIC8qZXJyb3IqLykKK3sKKyAgICBQb2ludCBwb2ludHNbbVBvaW50c107CisgICAgYmxhY2tib2FyZFJlYWQoJnBvaW50cywgc2l6ZW9mKFBvaW50KSAqIG1Qb2ludHMpOworCisgICAgVm9sdW1lQ3VydmVQb2ludHMgcG9pbnRzVmVjdG9yOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBvaW50czsgaSsrKSB7CisgICAgICAgIFZvbHVtZUN1cnZlUG9pbnQgY3VydmVQb2ludDsKKyAgICAgICAgY3VydmVQb2ludC5tSW5kZXggPSBwb2ludHNbaV0uaW5kZXg7CisgICAgICAgIGN1cnZlUG9pbnQubURCQXR0ZW51YXRpb24gPSBzdGF0aWNfY2FzdDxmbG9hdD4ocG9pbnRzW2ldLmRiQXR0ZW51YXRpb24pIC8KKyAgICAgICAgICAgICAgICAoMVVMIDw8IGdGcmFjdGlvbmFsKTsKKyAgICAgICAgcG9pbnRzVmVjdG9yLnB1c2hfYmFjayhjdXJ2ZVBvaW50KTsKKyAgICB9CisgICAgcmV0dXJuIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPnNldFZvbHVtZVByb2ZpbGVGb3JTdHJlYW0obUlkLCBtQ2F0ZWdvcnksIHBvaW50c1ZlY3Rvcik7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVm9sdW1lUHJvZmlsZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1ZvbHVtZVByb2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMDBhZTg0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1ZvbHVtZVByb2ZpbGUuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QuaCIKKyNpbmNsdWRlICJJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQuaCIKKyNpbmNsdWRlICJNYXBwaW5nQ29udGV4dC5oIgorI2luY2x1ZGUgPFZvbHVtZS5oPgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCitjbGFzcyBQb2xpY3lTdWJzeXN0ZW07CisKK2NsYXNzIFZvbHVtZVByb2ZpbGUgOiBwdWJsaWMgQ0Zvcm1hdHRlZFN1YnN5c3RlbU9iamVjdAoreworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgUG9pbnQKKyAgICB7CisgICAgICAgIGludCBpbmRleDsKKyAgICAgICAgLyoqIFZvbHVtZSBpcyB1c2luZyBGaXhlZFBvaW50UGFyYW1ldGVyIHVudGlsIGZsb2F0IHBhcmFtZXRlcnMgYXJlIGF2YWlsYWJsZS4gKi8KKyAgICAgICAgaW50MTZfdCBkYkF0dGVudWF0aW9uOworICAgIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3B1YmxpYzoKKyAgICBWb2x1bWVQcm9maWxlKGNvbnN0IHN0ZDo6c3RyaW5nICZtYXBwaW5nVmFsdWUsCisgICAgICAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICBjb25zdCBDTWFwcGluZ0NvbnRleHQgJmNvbnRleHQpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBib29sIHJlY2VpdmVGcm9tSFcoc3RkOjpzdHJpbmcgJmVycm9yKTsKKyAgICB2aXJ0dWFsIGJvb2wgc2VuZFRvSFcoc3RkOjpzdHJpbmcgJmVycm9yKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBQb2xpY3lTdWJzeXN0ZW0gKm1Qb2xpY3lTdWJzeXN0ZW07IC8qKjwgUm91dGUgc3Vic3l0ZW0gcGx1Z2luLiAqLworCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIHRvIGNvbW11bmljYXRlIHdpdGggQXVkaW8gUG9saWN5IEVuZ2luZS4KKyAgICAgKi8KKyAgICBhbmRyb2lkOjpBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZSAqbVBvbGljeVBsdWdpbkludGVyZmFjZTsKKworICAgIC8qKgorICAgICAqIHZvbHVtZSBwcm9maWxlIGlkZW50aWZpZXIsICB3aGljaCBpcyBpbiBmYWN0IGEgc3RyZWFtIHR5cGUgdG8gbGluayB3aXRoIGF1ZGlvLmguCisgICAgICovCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtSWQ7CisKKyAgICBzaXplX3QgbVBvaW50czsKKyAgICBWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBtQ2F0ZWdvcnk7CisKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgZ0ZyYWN0aW9uYWwgPSA4OyAvKio8IEJld2FyZSB0byBhbGlnbiB3aXRoIHRoZSBzdHJ1Y3R1cmUuICovCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Db2xsZWN0aW9uLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0NvbGxlY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZjE3YjE1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Db2xsZWN0aW9uLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkVsZW1lbnQuaCIKKyNpbmNsdWRlICJTdHJlYW0uaCIKKyNpbmNsdWRlICJTdHJhdGVneS5oIgorI2luY2x1ZGUgIlVzYWdlLmgiCisjaW5jbHVkZSAiSW5wdXRTb3VyY2UuaCIKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYW5kcm9pZAoreworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoreworCisvKioKKyAqIENvbGxlY3Rpb24gb2YgcG9saWN5IGVsZW1lbnQgYXMgYSBtYXAgaW5kZXhlZCB3aXRoIGEgdGhlaXIgVUlEIHR5cGUuCisgKgorICogQHRwYXJhbSBLZXkgdHlwZSBvZiB0aGUgcG9saWN5IGVsZW1lbnQgaW5kZXhpbmcgdGhlIGNvbGxlY3Rpb24uCisgKiAgICAgICAgIFBvbGljeSBFbGVtZW50IHN1cHBvcnRlZCBhcmU6CisgKiAgICAgICAgICAgICAgICAgICAgICAtIFN0cmF0ZWd5CisgKiAgICAgICAgICAgICAgICAgICAgICAtIFN0cmVhbQorICogICAgICAgICAgICAgICAgICAgICAgLSBJbnB1dFNvdXJjZQorICogICAgICAgICAgICAgICAgICAgICAgLSBVc2FnZS4KKyAqLwordGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KK2NsYXNzIENvbGxlY3Rpb24gOiBwdWJsaWMgc3RkOjptYXA8S2V5LCBFbGVtZW50PEtleT4gKj4KK3sKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBFbGVtZW50PEtleT4gVDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6bWFwPEtleSwgVCAqPjo6aXRlcmF0b3IgQ29sbGVjdGlvbkl0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjptYXA8S2V5LCBUICo+Ojpjb25zdF9pdGVyYXRvciBDb2xsZWN0aW9uQ29uc3RJdGVyYXRvcjsKKworcHVibGljOgorICAgIENvbGxlY3Rpb24oKQorICAgIHsKKyAgICAgICAgY29sbGVjdGlvblN1cHBvcnRlZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHBvbGljeSBlbGVtZW50IHRvIHRoZSBjb2xsZWN0aW9uLiBQb2xpY3kgZWxlbWVudHMgYXJlIHN0cmVhbXMsIHN0cmF0ZWdpZXMsIGlucHV0CisgICAgICogc291cmNlcywgLi4uIENvbXBpbGUgdGltZSBlcnJvciBnZW5lcmF0ZWQgaWYgY2FsbGVkIHdpdGggbm90IHN1cHBvcnRlZCBjb2xsZWN0aW9uLgorICAgICAqIEl0IGFsc28gc2V0IHRoZSBrZXkgYXMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwb2xpY3kgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEB0cGFyYW0gS2V5IGluZGV4aW5nIHRoZSBjb2xsZWN0aW9uIG9mIHBvbGljeSBlbGVtZW50LgorICAgICAqIEBwYXJhbVtpbl0gbmFtZSBvZiB0aGUgcG9saWN5IGVsZW1lbnQgdG8gZmluZC4KKyAgICAgKiBAcGFyYW1baW5dIGtleSB0byBiZSB1c2VkIHRvIGluZGV4IHRoaXMgbmV3IHBvbGljeSBlbGVtZW50LgorICAgICAqCisgICAgICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgcG9saWN5IGVsZW1lbnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGFkZGVkIHRvIHRoZSBjb2xsZWN0aW9uLgorICAgICAqLworICAgIHN0YXR1c190IGFkZChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgS2V5IGtleSkKKyAgICB7CisgICAgICAgIGlmICgoKnRoaXMpLmZpbmQoa2V5KSAhPSAoKnRoaXMpLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IGVsZW1lbnQgJXMgYWxyZWFkeSBhZGRlZCIsIF9fRlVOQ1RJT05fXywgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgKCp0aGlzKVtrZXldID0gbmV3IFQobmFtZSk7CisgICAgICAgIEFMT0dEKCIlczogYWRkaW5nIGVsZW1lbnQgJXMgdG8gY29sbGVjdGlvbiIsIF9fRlVOQ1RJT05fXywgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuICgqdGhpcylba2V5XS0+c2V0SWRlbnRpZmllcihrZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIHBvbGljeSBlbGVtZW50IGZyb20gdGhlIGNvbGxlY3Rpb24gYnkgaXRzIGtleS4gUG9saWN5IGVsZW1lbnRzIGFyZSBzdHJlYW1zLCBzdHJhdGVnaWVzLAorICAgICAqIGlucHV0IHNvdXJjZXMsIC4uLiBDb21waWxlIHRpbWUgZXJyb3IgZ2VuZXJhdGVkIGlmIGNhbGxlZCB3aXRoIG5vdCBzdXBwb3J0ZWQgY29sbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEB0cGFyYW0gS2V5IGluZGV4aW5nIHRoZSBjb2xsZWN0aW9uIG9mIHBvbGljeSBlbGVtZW50LgorICAgICAqIEBwYXJhbVtpbl0ga2V5IG9mIHRoZSBwb2xpY3kgZWxlbWVudCB0byBmaW5kLgorICAgICAqCisgICAgICogQHJldHVybiB2YWxpZCBwb2ludGVyIG9uIHBvbGljeSBlbGVtZW50IGlmIGZvdW5kLCBOVUxMIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBUICpnZXQoS2V5IGtleSkgY29uc3QKKyAgICB7CisgICAgICAgIENvbGxlY3Rpb25Db25zdEl0ZXJhdG9yIGl0ID0gKCp0aGlzKS5maW5kKGtleSk7CisgICAgICAgIHJldHVybiAoaXQgPT0gKCp0aGlzKS5lbmQoKSkgPyBOVUxMIDogaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGEgcG9saWN5IGVsZW1lbnQgZnJvbSB0aGUgY29sbGVjdGlvbiBieSBpdHMgbmFtZS4gUG9saWN5IGVsZW1lbnRzIGFyZSBzdHJlYW1zLAorICAgICAqIHN0cmF0ZWdpZXMsIGlucHV0IHNvdXJjZXMsIC4uLgorICAgICAqIENvbXBpbGUgdGltZSBlcnJvciBnZW5lcmF0ZWQgaWYgY2FsbGVkIHdpdGggbm90IHN1cHBvcnRlZCBjb2xsZWN0aW9uLgorICAgICAqCisgICAgICogQHRwYXJhbSBLZXkgaW5kZXhpbmcgdGhlIGNvbGxlY3Rpb24gb2YgcG9saWN5IGVsZW1lbnQuCisgICAgICogQHBhcmFtW2luXSBuYW1lIG9mIHRoZSBwb2xpY3kgZWxlbWVudCB0byBmaW5kLgorICAgICAqIEBwYXJhbVtpbl0gZWxlbWVudHNNYXAgbWFwcyBvZiBwb2xpY3kgZWxlbWVudHMgdG8gc2VhcmNoIGludG8uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZhbGlkIHBvaW50ZXIgb24gZWxlbWVudCBpZiBmb3VuZCwgTlVMTCBvdGhlcndpc2UuCisgICAgICovCisgICAgVCAqZmluZEJ5TmFtZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgY29uc3QKKyAgICB7CisKKyAgICAgICAgQ29sbGVjdGlvbkNvbnN0SXRlcmF0b3IgaXQ7CisgICAgICAgIGZvciAoaXQgPSAoKnRoaXMpLmJlZ2luKCk7IGl0ICE9ICgqdGhpcykuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIFQgKmVsZW1lbnQgPSBpdC0+c2Vjb25kOworICAgICAgICAgICAgaWYgKGVsZW1lbnQtPmdldE5hbWUoKSA9PSBuYW1lKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbGwgdGhlIGVsZW1lbnRzIGZyb20gdGhlIGxpc3QgYW5kIGRlc3Ryb3kgdGhlbS4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyKCkKKyAgICB7CisgICAgICAgIENvbGxlY3Rpb25JdGVyYXRvciBpdDsKKyAgICAgICAgZm9yIChpdCA9ICgqdGhpcykuYmVnaW4oKTsgaXQgIT0gKCp0aGlzKS5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgZGVsZXRlIGl0LT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgICAgKCp0aGlzKS5jbGVhcigpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBwcm92aWRlIGEgY29tcGlsZSB0aW1lIGVycm9yIGlmIG5vIHNwZWNpYWxpemF0aW9uIGlzIHByb3ZpZGVkIGZvciBhIGdpdmVuIHR5cGUuCisgICAgICoKKyAgICAgKiBAdHBhcmFtIFQ6IHR5cGUgb2YgdGhlIHBvbGljeUVsZW1lbnQuIFBvbGljeSBFbGVtZW50IHN1cHBvcnRlZCBhcmU6CisgICAgICogICAgICAgICAgICAgICAgICAgICAgLSBTdHJhdGVneQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIC0gU3RyZWFtCisgICAgICogICAgICAgICAgICAgICAgICAgICAgLSBJbnB1dFNvdXJjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIC0gVXNhZ2UuCisgICAgICovCisgICAgc3RydWN0IGNvbGxlY3Rpb25TdXBwb3J0ZWQ7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IENvbGxlY3Rpb248YXVkaW9fc3RyZWFtX3R5cGVfdD46OmNvbGxlY3Rpb25TdXBwb3J0ZWQge307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IENvbGxlY3Rpb248c3RkOjpzdHJpbmc+Ojpjb2xsZWN0aW9uU3VwcG9ydGVkIHt9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBDb2xsZWN0aW9uPGF1ZGlvX3VzYWdlX3Q+Ojpjb2xsZWN0aW9uU3VwcG9ydGVkIHt9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBDb2xsZWN0aW9uPGF1ZGlvX3NvdXJjZV90Pjo6Y29sbGVjdGlvblN1cHBvcnRlZCB7fTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ29sbGVjdGlvbjxyb3V0aW5nX3N0cmF0ZWd5Pjo6Y29sbGVjdGlvblN1cHBvcnRlZCB7fTsKKwordHlwZWRlZiBDb2xsZWN0aW9uPHJvdXRpbmdfc3RyYXRlZ3k+IFN0cmF0ZWd5Q29sbGVjdGlvbjsKK3R5cGVkZWYgQ29sbGVjdGlvbjxhdWRpb19zdHJlYW1fdHlwZV90PiBTdHJlYW1Db2xsZWN0aW9uOwordHlwZWRlZiBDb2xsZWN0aW9uPGF1ZGlvX3VzYWdlX3Q+IFVzYWdlQ29sbGVjdGlvbjsKK3R5cGVkZWYgQ29sbGVjdGlvbjxhdWRpb19zb3VyY2VfdD4gSW5wdXRTb3VyY2VDb2xsZWN0aW9uOworCit9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRWxlbWVudC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbGVtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTJlNzdlNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRWxlbWVudC5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kKK3sKKwordGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KK2NsYXNzIEVsZW1lbnQKK3sKK3B1YmxpYzoKKyAgICBFbGVtZW50KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKQorICAgICAgICA6IG1OYW1lKG5hbWUpCisgICAge30KKyAgICB+RWxlbWVudCgpIHt9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGlkZW50aWZpZXIgb2YgdGhpcyBwb2xpY3kgZWxlbWVudAorICAgICAqCisgICAgICogQHJldHVybnMgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGlzIHBvbGljeSBlbGVtZW50CisgICAgICovCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorCisgICAgLyoqCisgICAgKiBTZXQgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHBvbGljeSBlbGVtZW50LgorICAgICoKKyAgICAqIEB0cGFyYW0gS2V5IHR5cGUgb2YgdGhlIHVuaXF1ZSBpZGVudGlmaWVyLgorICAgICogQHBhcmFtW2luXSBpZGVudGlmaWVyIHRvIGJlIHNldC4KKyAgICAqCisgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSBpZGVudGlmaWVyIGlzIHZhbGlkIGFuZCBzZXQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICAqLworICAgIHN0YXR1c190IHNldElkZW50aWZpZXIoS2V5IGlkZW50aWZpZXIpCisgICAgeworICAgICAgICBtSWRlbnRpZmllciA9IGlkZW50aWZpZXI7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGlzIHBvbGljeSBlbGVtZW50LgorICAgICAqLworICAgIGNvbnN0IEtleSAmZ2V0SWRlbnRpZmllcigpIGNvbnN0IHsgcmV0dXJuIG1JZGVudGlmaWVyOyB9CisKKyAgICAvKioKKyAgICAgKiBBIFBvbGljeSBlbGVtZW50IG1heSBpbXBsZW1lbnQgZ2V0dGVyL3NldHRlciBmdW5jdGlvbiBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KKyAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgcm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKKyAgICAgKiBvciBhIHN0cmluZy4KKyAgICAgKgorICAgICAqIEB0cGFyYW0gUHJvcGVydHkgZm9yIHdoaWNoIHRoaXMgcG9saWN5IGVsZW1lbnQgaGFzIHNldHRlciAvIGdldHRlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSBrZXB0IHRyYWNrIGJ5IHRoaXMgcG9saWN5IGJhc2UgZWxlbWVudC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHk+CisgICAgUHJvcGVydHkgZ2V0KCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBBIFBvbGljeSBlbGVtZW50IG1heSBpbXBsZW1lbnQgZ2V0dGVyL3NldHRlciBmdW5jdGlvbiBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KKyAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgcm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKKyAgICAgKiBvciBhIHN0cmluZy4KKyAgICAgKgorICAgICAqIEB0cGFyYW0gUHJvcGVydHkgZm9yIHdoaWNoIHRoaXMgcG9saWN5IGVsZW1lbnQgaGFzIHNldHRlciAvIGdldHRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcHJvcGVydHkgdmFsdWUgdG8gYmUgYXNzaWduZWQgZm9yIHRoaXMgcG9saWN5IGJhc2UgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IGtlcHQgdHJhY2sgYnkgdGhpcyBwb2xpY3kgYmFzZSBlbGVtZW50LgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KKyAgICBzdGF0dXNfdCBzZXQoUHJvcGVydHkgcHJvcGVydHkpOworCitwcml2YXRlOgorICAgIC8qIENvcHkgZmFjaWxpdGllcyBhcmUgcHV0IHByaXZhdGUgdG8gZGlzYWJsZSBjb3B5LiAqLworICAgIEVsZW1lbnQoY29uc3QgRWxlbWVudCAmb2JqZWN0KTsKKyAgICBFbGVtZW50ICZvcGVyYXRvcj0oY29uc3QgRWxlbWVudCAmb2JqZWN0KTsKKworICAgIHN0ZDo6c3RyaW5nIG1OYW1lOyAvKio8IFVuaXF1ZSBsaXRlcmFsIElkZW50aWZpZXIgb2YgYSBwb2xpY3kgYmFzZSBlbGVtZW50Ki8KKyAgICBLZXkgbUlkZW50aWZpZXI7IC8qKjwgVW5pcXVlIG51bWVyaWNhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCit9OworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzMzY2RmNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmNwcApAQCAtMCwwICsxLDI3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworLy8jZGVmaW5lIFZFUllfVkVSQk9TRV9MT0dHSU5HCisjaWZkZWYgVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNkZWZpbmUgQUxPR1ZWIEFMT0dWCisjZWxzZQorI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworI2luY2x1ZGUgIkVuZ2luZS5oIgorI2luY2x1ZGUgIlN0cmF0ZWd5LmgiCisjaW5jbHVkZSAiU3RyZWFtLmgiCisjaW5jbHVkZSAiSW5wdXRTb3VyY2UuaCIKKyNpbmNsdWRlICJVc2FnZS5oIgorI2luY2x1ZGUgPHBvbGljeS5oPgorI2luY2x1ZGUgPFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmg+CisKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjptYXA7CisKK25hbWVzcGFjZSBhbmRyb2lkCit7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit7Cit0ZW1wbGF0ZSA8PgorU3RyYXRlZ3lDb2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248cm91dGluZ19zdHJhdGVneT4oKQoreworICAgIHJldHVybiBtU3RyYXRlZ3lDb2xsZWN0aW9uOworfQordGVtcGxhdGUgPD4KK1N0cmVhbUNvbGxlY3Rpb24gJkVuZ2luZTo6Z2V0Q29sbGVjdGlvbjxhdWRpb19zdHJlYW1fdHlwZV90PigpCit7CisgICAgcmV0dXJuIG1TdHJlYW1Db2xsZWN0aW9uOworfQordGVtcGxhdGUgPD4KK1VzYWdlQ29sbGVjdGlvbiAmRW5naW5lOjpnZXRDb2xsZWN0aW9uPGF1ZGlvX3VzYWdlX3Q+KCkKK3sKKyAgICByZXR1cm4gbVVzYWdlQ29sbGVjdGlvbjsKK30KK3RlbXBsYXRlIDw+CitJbnB1dFNvdXJjZUNvbGxlY3Rpb24gJkVuZ2luZTo6Z2V0Q29sbGVjdGlvbjxhdWRpb19zb3VyY2VfdD4oKQoreworICAgIHJldHVybiBtSW5wdXRTb3VyY2VDb2xsZWN0aW9uOworfQorCit0ZW1wbGF0ZSA8PgorY29uc3QgU3RyYXRlZ3lDb2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248cm91dGluZ19zdHJhdGVneT4oKSBjb25zdAoreworICAgIHJldHVybiBtU3RyYXRlZ3lDb2xsZWN0aW9uOworfQordGVtcGxhdGUgPD4KK2NvbnN0IFN0cmVhbUNvbGxlY3Rpb24gJkVuZ2luZTo6Z2V0Q29sbGVjdGlvbjxhdWRpb19zdHJlYW1fdHlwZV90PigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1TdHJlYW1Db2xsZWN0aW9uOworfQordGVtcGxhdGUgPD4KK2NvbnN0IFVzYWdlQ29sbGVjdGlvbiAmRW5naW5lOjpnZXRDb2xsZWN0aW9uPGF1ZGlvX3VzYWdlX3Q+KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVVzYWdlQ29sbGVjdGlvbjsKK30KK3RlbXBsYXRlIDw+Citjb25zdCBJbnB1dFNvdXJjZUNvbGxlY3Rpb24gJkVuZ2luZTo6Z2V0Q29sbGVjdGlvbjxhdWRpb19zb3VyY2VfdD4oKSBjb25zdAoreworICAgIHJldHVybiBtSW5wdXRTb3VyY2VDb2xsZWN0aW9uOworfQorCitFbmdpbmU6OkVuZ2luZSgpCisgICAgOiBtTWFuYWdlckludGVyZmFjZSh0aGlzKSwKKyAgICAgIG1QbHVnaW5JbnRlcmZhY2UodGhpcyksCisgICAgICBtUG9saWN5UGFyYW1ldGVyTWdyKG5ldyBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcigpKSwKKyAgICAgIG1BcG1PYnNlcnZlcihOVUxMKQoreworfQorCitFbmdpbmU6On5FbmdpbmUoKQoreworICAgIG1TdHJhdGVneUNvbGxlY3Rpb24uY2xlYXIoKTsKKyAgICBtU3RyZWFtQ29sbGVjdGlvbi5jbGVhcigpOworICAgIG1JbnB1dFNvdXJjZUNvbGxlY3Rpb24uY2xlYXIoKTsKKyAgICBtVXNhZ2VDb2xsZWN0aW9uLmNsZWFyKCk7Cit9CisKKwordm9pZCBFbmdpbmU6OnNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcikKK3sKKyAgICBBTE9HX0FTU0VSVChvYnNlcnZlciAhPSBOVUxMLCAiSW52YWxpZCBBdWRpbyBQb2xpY3kgTWFuYWdlciBvYnNlcnZlciIpOworICAgIG1BcG1PYnNlcnZlciA9IG9ic2VydmVyOworfQorCitzdGF0dXNfdCBFbmdpbmU6OmluaXRDaGVjaygpCit7CisgICAgaWYgKG1Qb2xpY3lQYXJhbWV0ZXJNZ3IgIT0gTlVMTCAmJiBtUG9saWN5UGFyYW1ldGVyTWdyLT5zdGFydCgpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCIlczogY291bGQgbm90IHN0YXJ0IFBvbGljeSBQRlciLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBkZWxldGUgbVBvbGljeVBhcmFtZXRlck1ncjsKKyAgICAgICAgbVBvbGljeVBhcmFtZXRlck1nciA9IE5VTEw7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gKG1BcG1PYnNlcnZlciAhPSBOVUxMKT8gTk9fRVJST1IgOiBOT19JTklUOworfQorCitib29sIEVuZ2luZTo6c2V0Vm9sdW1lUHJvZmlsZUZvclN0cmVhbShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50cyAmcG9pbnRzKQoreworICAgIFN0cmVhbSAqc3RyZWFtID0gZ2V0RnJvbUNvbGxlY3Rpb248YXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyZWFtVHlwZSk7CisgICAgaWYgKHN0cmVhbSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogc3RyZWFtICVkIG5vdCBmb3VuZCIsIF9fRlVOQ1RJT05fXywgc3RyZWFtVHlwZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHN0cmVhbS0+c2V0Vm9sdW1lUHJvZmlsZShkZXZpY2VDYXRlZ29yeSwgcG9pbnRzKSA9PSBOT19FUlJPUjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KK0VsZW1lbnQ8S2V5PiAqRW5naW5lOjpnZXRGcm9tQ29sbGVjdGlvbihjb25zdCBLZXkgJmtleSkgY29uc3QKK3sKKyAgICBjb25zdCBDb2xsZWN0aW9uPEtleT4gY29sbGVjdGlvbiA9IGdldENvbGxlY3Rpb248S2V5PigpOworICAgIHJldHVybiBjb2xsZWN0aW9uLmdldChrZXkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5Pgorc3RhdHVzX3QgRW5naW5lOjphZGQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGNvbnN0IEtleSAma2V5KQoreworICAgIENvbGxlY3Rpb248S2V5PiAmY29sbGVjdGlvbiA9IGdldENvbGxlY3Rpb248S2V5PigpOworICAgIHJldHVybiBjb2xsZWN0aW9uLmFkZChuYW1lLCBrZXkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHksIHR5cGVuYW1lIEtleT4KK1Byb3BlcnR5IEVuZ2luZTo6Z2V0UHJvcGVydHlGb3JLZXkoS2V5IGtleSkgY29uc3QKK3sKKyAgICBFbGVtZW50PEtleT4gKmVsZW1lbnQgPSBnZXRGcm9tQ29sbGVjdGlvbjxLZXk+KGtleSk7CisgICAgaWYgKGVsZW1lbnQgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IEVsZW1lbnQgbm90IGZvdW5kIHdpdGhpbiBjb2xsZWN0aW9uIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFByb3BlcnR5PigwKTsKKyAgICB9CisgICAgcmV0dXJuIGVsZW1lbnQtPnRlbXBsYXRlIGdldDxQcm9wZXJ0eT4oKTsKK30KKworcm91dGluZ19zdHJhdGVneSBFbmdpbmU6Ok1hbmFnZXJJbnRlcmZhY2VJbXBsOjpnZXRTdHJhdGVneUZvclVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpCit7CisgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMgPSBtUG9saWN5RW5naW5lLT5tQXBtT2JzZXJ2ZXItPmdldE91dHB1dHMoKTsKKworICAgIGlmICh1c2FnZSA9PSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFkgJiYKKyAgICAgICAgICAgIChvdXRwdXRzLmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9SSU5HKSB8fAorICAgICAgICAgICAgIG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX0FMQVJNKSkpIHsKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX1NPTklGSUNBVElPTjsKKyAgICB9CisgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFByb3BlcnR5Rm9yS2V5PHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3VzYWdlX3Q+KHVzYWdlKTsKK30KKworYXVkaW9fZGV2aWNlc190IEVuZ2luZTo6TWFuYWdlckludGVyZmFjZUltcGw6OmdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpIGNvbnN0Cit7CisgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMgPSBtUG9saWN5RW5naW5lLT5tQXBtT2JzZXJ2ZXItPmdldE91dHB1dHMoKTsKKworICAgIC8qKiBUaGlzIGlzIHRoZSBvbmx5IGNhc2UgaGFuZGxlZCBwcm9ncmFtbWF0aWNhbGx5IGJlY2F1c2UgdGhlIFBGVyBpcyB1bmFibGUgdG8ga25vdyB0aGUKKyAgICAgKiBhY3Rpdml0eSBvZiBzdHJlYW1zLgorICAgICAqCisgICAgICogLVdoaWxlIG1lZGlhIGlzIHBsYXlpbmcgb24gYSByZW1vdGUgZGV2aWNlLCB1c2UgdGhlIHRoZSBzb25pZmljYXRpb24gYmVoYXZpb3IuCisgICAgICogTm90ZSB0aGF0IHdlIHRlc3QgdGhpcyB1c2VjYXNlIGJlZm9yZSB0ZXN0aW5nIGlmIG1lZGlhIGlzIHBsYXlpbmcgYmVjYXVzZQorICAgICAqIHRoZSBpc1N0cmVhbUFjdGl2ZSgpIG1ldGhvZCBvbmx5IGluZm9ybXMgYWJvdXQgdGhlIGFjdGl2aXR5IG9mIGEgc3RyZWFtLCBub3QKKyAgICAgKiBpZiBpdCdzIGZvciBsb2NhbCBwbGF5YmFjay4gTm90ZSBhbHNvIHRoYXQgd2UgdXNlIHRoZSBzYW1lIGRlbGF5IGJldHdlZW4gYm90aCB0ZXN0cworICAgICAqCisgICAgICogLVdoZW4gbWVkaWEgaXMgbm90IHBsYXlpbmcgYW55bW9yZSwgZmFsbCBiYWNrIG9uIHRoZSBzb25pZmljYXRpb24gYmVoYXZpb3IKKyAgICAgKi8KKyAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwgJiYKKyAgICAgICAgICAgICFpc19zdGF0ZV9pbl9jYWxsKGdldFBob25lU3RhdGUoKSkgJiYKKyAgICAgICAgICAgICFvdXRwdXRzLmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoQVVESU9fU1RSRUFNX01VU0lDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpICYmCisgICAgICAgICAgICBvdXRwdXRzLmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpKSB7CisgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIHJvdXRpbmdfc3RyYXRlZ3k+KFNUUkFURUdZX01FRElBKTsKKyAgICB9CisgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX2RldmljZXNfdCwgcm91dGluZ19zdHJhdGVneT4oc3RyYXRlZ3kpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHksIHR5cGVuYW1lIEtleT4KK2Jvb2wgRW5naW5lOjpzZXRQcm9wZXJ0eUZvcktleShjb25zdCBQcm9wZXJ0eSAmcHJvcGVydHksIGNvbnN0IEtleSAma2V5KQoreworICAgIEVsZW1lbnQ8S2V5PiAqZWxlbWVudCA9IGdldEZyb21Db2xsZWN0aW9uPEtleT4oa2V5KTsKKyAgICBpZiAoZWxlbWVudCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogRWxlbWVudCBub3QgZm91bmQgd2l0aGluIGNvbGxlY3Rpb24iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gZWxlbWVudC0+dGVtcGxhdGUgc2V0PFByb3BlcnR5Pihwcm9wZXJ0eSkgPT0gTk9fRVJST1I7Cit9CisKK2Zsb2F0IEVuZ2luZTo6dm9sSW5kZXhUb0RiKFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleEluVWkpCit7CisgICAgU3RyZWFtICpzdHJlYW0gPSBnZXRGcm9tQ29sbGVjdGlvbjxhdWRpb19zdHJlYW1fdHlwZV90PihzdHJlYW1UeXBlKTsKKyAgICBpZiAoc3RyZWFtID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFbGVtZW50IGluZGV4ZWQgYnkga2V5PSVkIG5vdCBmb3VuZCIsIF9fRlVOQ1RJT05fXywgc3RyZWFtVHlwZSk7CisgICAgICAgIHJldHVybiAxLjBmOworICAgIH0KKyAgICByZXR1cm4gc3RyZWFtLT52b2xJbmRleFRvRGIoY2F0ZWdvcnksIGluZGV4SW5VaSk7Cit9CisKK3N0YXR1c190IEVuZ2luZTo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpCit7CisgICAgU3RyZWFtICpzdHJlYW0gPSBnZXRGcm9tQ29sbGVjdGlvbjxhdWRpb19zdHJlYW1fdHlwZV90PihzdHJlYW1UeXBlKTsKKyAgICBpZiAoc3RyZWFtID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gVHlwZSAlZCBub3QgZm91bmQiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbVR5cGUpOworICAgICAgICByZXR1cm4gQkFEX1RZUEU7CisgICAgfQorICAgIG1BcG1PYnNlcnZlci0+Z2V0U3RyZWFtRGVzY3JpcHRvcnMoKS5zZXRWb2x1bWVJbmRleE1pbihzdHJlYW1UeXBlLCBpbmRleE1pbik7CisgICAgbUFwbU9ic2VydmVyLT5nZXRTdHJlYW1EZXNjcmlwdG9ycygpLnNldFZvbHVtZUluZGV4TWF4KHN0cmVhbVR5cGUsIGluZGV4TWF4KTsKKworICAgIHJldHVybiBzdHJlYW0tPmluaXRWb2x1bWUoaW5kZXhNaW4sIGluZGV4TWF4KTsKK30KKworc3RhdHVzX3QgRW5naW5lOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKQoreworICAgIHJldHVybiBtUG9saWN5UGFyYW1ldGVyTWdyLT5zZXRQaG9uZVN0YXRlKG1vZGUpOworfQorCithdWRpb19tb2RlX3QgRW5naW5lOjpnZXRQaG9uZVN0YXRlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVBvbGljeVBhcmFtZXRlck1nci0+Z2V0UGhvbmVTdGF0ZSgpOworfQorCitzdGF0dXNfdCBFbmdpbmU6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCit7CisgICAgcmV0dXJuIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOworfQorCithdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IEVuZ2luZTo6Z2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdAoreworICAgIHJldHVybiBtUG9saWN5UGFyYW1ldGVyTWdyLT5nZXRGb3JjZVVzZSh1c2FnZSk7Cit9CisKK3N0YXR1c190IEVuZ2luZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VBZGRyZXNzKQoreworICAgIHJldHVybiBtUG9saWN5UGFyYW1ldGVyTWdyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlcywgc3RhdGUsIGRldmljZUFkZHJlc3MpOworfQorCit0ZW1wbGF0ZSA8PgorQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlICpFbmdpbmU6OnF1ZXJ5SW50ZXJmYWNlKCkKK3sKKyAgICByZXR1cm4gJm1NYW5hZ2VySW50ZXJmYWNlOworfQorCit0ZW1wbGF0ZSA8PgorQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKkVuZ2luZTo6cXVlcnlJbnRlcmZhY2UoKQoreworICAgIHJldHVybiAmbVBsdWdpbkludGVyZmFjZTsKK30KKworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmZhN2ExMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmgKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJDb2xsZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkCit7CitjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlcjsKKworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoreworCitjbGFzcyBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjsKK2NsYXNzIFZvbHVtZVByb2ZpbGU7CisKK2NsYXNzIEVuZ2luZQoreworcHVibGljOgorICAgIEVuZ2luZSgpOworICAgIHZpcnR1YWwgfkVuZ2luZSgpOworCisgICAgdGVtcGxhdGUgPGNsYXNzIFJlcXVlc3RlZEludGVyZmFjZT4KKyAgICBSZXF1ZXN0ZWRJbnRlcmZhY2UgKnF1ZXJ5SW50ZXJmYWNlKCk7CisKK3ByaXZhdGU6CisgICAgLy8vIEludGVyZmFjZSBtZW1iZXJzCisgICAgY2xhc3MgTWFuYWdlckludGVyZmFjZUltcGwgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgTWFuYWdlckludGVyZmFjZUltcGwoRW5naW5lICpwb2xpY3lFbmdpbmUpCisgICAgICAgICAgICA6IG1Qb2xpY3lFbmdpbmUocG9saWN5RW5naW5lKSB7fQorCisgICAgICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgaW5pdENoZWNrKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmluaXRDaGVjaygpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1Qb2xpY3lFbmdpbmUtPnNldE9ic2VydmVyKG9ic2VydmVyKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX2RldmljZXNfdCwgYXVkaW9fc291cmNlX3Q+KGlucHV0U291cmNlKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0YXRlZ3kpIGNvbnN0OworICAgICAgICB2aXJ0dWFsIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQcm9wZXJ0eUZvcktleTxyb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb19zdHJlYW1fdHlwZV90PihzdHJlYW0pOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IG1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRQaG9uZVN0YXRlKG1vZGUpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0Rm9yY2VVc2UodXNhZ2UsIGNvbmZpZyk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldEZvcmNlVXNlKHVzYWdlKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2RGVzYy0+dHlwZSgpLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+bUFkZHJlc3MpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+aW5pdFN0cmVhbVZvbHVtZShzdHJlYW0sIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6ZVZvbHVtZUN1cnZlcyhib29sIC8qaXNTcGVha2VyRHJjRW5hYmxlZCovKSB7fQorCisgICAgICAgIHZpcnR1YWwgZmxvYXQgdm9sSW5kZXhUb0RiKFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleEluVWkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT52b2xJbmRleFRvRGIoZGV2aWNlQ2F0ZWdvcnksIHN0cmVhbSwgaW5kZXhJblVpKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgRW5naW5lICptUG9saWN5RW5naW5lOworICAgIH0gbU1hbmFnZXJJbnRlcmZhY2U7CisKKyAgICBjbGFzcyBQbHVnaW5JbnRlcmZhY2VJbXBsIDogcHVibGljIEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlCisgICAgeworICAgIHB1YmxpYzoKKyAgICAgICAgUGx1Z2luSW50ZXJmYWNlSW1wbChFbmdpbmUgKnBvbGljeUVuZ2luZSkKKyAgICAgICAgICAgIDogbVBvbGljeUVuZ2luZShwb2xpY3lFbmdpbmUpIHt9CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTdHJhdGVneShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmFkZDxyb3V0aW5nX3N0cmF0ZWd5PihuYW1lLCBzdHJhdGVneSk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTdHJlYW0oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+YWRkPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KG5hbWUsIHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRVc2FnZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgYXVkaW9fdXNhZ2VfdCB1c2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmFkZDxhdWRpb191c2FnZV90PihuYW1lLCB1c2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRJbnB1dFNvdXJjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgYXVkaW9fc291cmNlX3Qgc291cmNlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+YWRkPGF1ZGlvX3NvdXJjZV90PihuYW1lLCBzb3VyY2UpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBzZXREZXZpY2VGb3JTdHJhdGVneShjb25zdCByb3V0aW5nX3N0cmF0ZWd5ICZzdHJhdGVneSwgYXVkaW9fZGV2aWNlc190IGRldmljZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIHJvdXRpbmdfc3RyYXRlZ3k+KGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBib29sIHNldFN0cmF0ZWd5Rm9yU3RyZWFtKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRQcm9wZXJ0eUZvcktleTxyb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb19zdHJlYW1fdHlwZV90PihzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0pOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWVQcm9maWxlRm9yU3RyZWFtKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnRzICZwb2ludHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRWb2x1bWVQcm9maWxlRm9yU3RyZWFtKHN0cmVhbSwgZGV2aWNlQ2F0ZWdvcnksIHBvaW50cyk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIGJvb2wgc2V0U3RyYXRlZ3lGb3JVc2FnZShjb25zdCBhdWRpb191c2FnZV90ICZ1c2FnZSwgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldFByb3BlcnR5Rm9yS2V5PHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3VzYWdlX3Q+KHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIGJvb2wgc2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoY29uc3QgYXVkaW9fc291cmNlX3QgJmlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX2RldmljZXNfdCwgYXVkaW9fc291cmNlX3Q+KGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFNvdXJjZSk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIEVuZ2luZSAqbVBvbGljeUVuZ2luZTsKKyAgICB9IG1QbHVnaW5JbnRlcmZhY2U7CisKK3ByaXZhdGU6CisgICAgLyogQ29weSBmYWNpbGl0aWVzIGFyZSBwdXQgcHJpdmF0ZSB0byBkaXNhYmxlIGNvcHkuICovCisgICAgRW5naW5lKGNvbnN0IEVuZ2luZSAmb2JqZWN0KTsKKyAgICBFbmdpbmUgJm9wZXJhdG9yPShjb25zdCBFbmdpbmUgJm9iamVjdCk7CisKKyAgICB2b2lkIHNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcik7CisKKyAgICBib29sIHNldFZvbHVtZVByb2ZpbGVGb3JTdHJlYW0oY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludHMgJnBvaW50cyk7CisKKyAgICBzdGF0dXNfdCBpbml0Q2hlY2soKTsKKyAgICBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKTsKKyAgICBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpIGNvbnN0OworICAgIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOworICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdDsKKyAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZXMsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlQWRkcmVzcyk7CisKKyAgICBmbG9hdCB2b2xJbmRleFRvRGIoVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgY2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKTsKKyAgICBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCk7CisKKyAgICBTdHJhdGVneUNvbGxlY3Rpb24gbVN0cmF0ZWd5Q29sbGVjdGlvbjsgLyoqPCBTdHJhdGVnaWVzIGluZGV4ZWQgYnkgdGhlaXIgZW51bSBpZC4gKi8KKyAgICBTdHJlYW1Db2xsZWN0aW9uIG1TdHJlYW1Db2xsZWN0aW9uOyAvKio8IFN0cmVhbXMgaW5kZXhlZCBieSB0aGVpciBlbnVtIGlkLiAgKi8KKyAgICBVc2FnZUNvbGxlY3Rpb24gbVVzYWdlQ29sbGVjdGlvbjsgLyoqPCBVc2FnZXMgaW5kZXhlZCBieSB0aGVpciBlbnVtIGlkLiAqLworICAgIElucHV0U291cmNlQ29sbGVjdGlvbiBtSW5wdXRTb3VyY2VDb2xsZWN0aW9uOyAvKio8IElucHV0IHNvdXJjZXMgaW5kZXhlZCBieSB0aGVpciBlbnVtIGlkLiAqLworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KKyAgICBzdGF0dXNfdCBhZGQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGNvbnN0IEtleSAma2V5KTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXk+CisgICAgRWxlbWVudDxLZXk+ICpnZXRGcm9tQ29sbGVjdGlvbihjb25zdCBLZXkgJmtleSkgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5PgorICAgIGNvbnN0IENvbGxlY3Rpb248S2V5PiAmZ2V0Q29sbGVjdGlvbigpIGNvbnN0OworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KKyAgICBDb2xsZWN0aW9uPEtleT4gJmdldENvbGxlY3Rpb24oKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eSwgdHlwZW5hbWUgS2V5PgorICAgIFByb3BlcnR5IGdldFByb3BlcnR5Rm9yS2V5KEtleSBrZXkpIGNvbnN0OworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5LCB0eXBlbmFtZSBLZXk+CisgICAgYm9vbCBzZXRQcm9wZXJ0eUZvcktleShjb25zdCBQcm9wZXJ0eSAmcHJvcGVydHksIGNvbnN0IEtleSAma2V5KTsKKworICAgIC8qKgorICAgICAqIFBvbGljeSBQYXJhbWV0ZXIgTWFuYWdlciBoaWRkZW4gdGhyb3VnaCBhIHdyYXBwZXIuCisgICAgICovCisgICAgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIgKm1Qb2xpY3lQYXJhbWV0ZXJNZ3I7CisKKyAgICBBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqbUFwbU9ic2VydmVyOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZUluc3RhbmNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lSW5zdGFuY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlhYTg5YjIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZUluc3RhbmNlLmNwcApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oPgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oIgorI2luY2x1ZGUgIkVuZ2luZS5oIgorCit1c2luZyBzdGQ6OnN0cmluZzsKKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kKK3sKKworRW5naW5lSW5zdGFuY2U6OkVuZ2luZUluc3RhbmNlKCkKK3sKK30KKworRW5naW5lSW5zdGFuY2UgKkVuZ2luZUluc3RhbmNlOjpnZXRJbnN0YW5jZSgpCit7CisgICAgc3RhdGljIEVuZ2luZUluc3RhbmNlIGluc3RhbmNlOworICAgIHJldHVybiAmaW5zdGFuY2U7Cit9CisKK0VuZ2luZUluc3RhbmNlOjp+RW5naW5lSW5zdGFuY2UoKQoreworfQorCitFbmdpbmUgKkVuZ2luZUluc3RhbmNlOjpnZXRFbmdpbmUoKSBjb25zdAoreworICAgIHN0YXRpYyBFbmdpbmUgZW5naW5lOworICAgIHJldHVybiAmZW5naW5lOworfQorCit0ZW1wbGF0ZSA8PgorQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlICpFbmdpbmVJbnN0YW5jZTo6cXVlcnlJbnRlcmZhY2UoKSBjb25zdAoreworICAgIHJldHVybiBnZXRFbmdpbmUoKS0+cXVlcnlJbnRlcmZhY2U8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlPigpOworfQorCit0ZW1wbGF0ZSA8PgorQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKkVuZ2luZUluc3RhbmNlOjpxdWVyeUludGVyZmFjZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGdldEVuZ2luZSgpLT5xdWVyeUludGVyZmFjZTxBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZT4oKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWZmMTUzOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuY3BwCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qb2xpY3lFbmdpbmUvSW5wdXRTb3VyY2UiCisKKyNpbmNsdWRlICJJbnB1dFNvdXJjZS5oIgorCit1c2luZyBzdGQ6OnN0cmluZzsKKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kKK3sKK3N0YXR1c190IEVsZW1lbnQ8YXVkaW9fc291cmNlX3Q+OjpzZXRJZGVudGlmaWVyKGF1ZGlvX3NvdXJjZV90IGlkZW50aWZpZXIpCit7CisgICAgaWYgKGlkZW50aWZpZXIgPiBBVURJT19TT1VSQ0VfTUFYICYmIGlkZW50aWZpZXIgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbUlkZW50aWZpZXIgPSBpZGVudGlmaWVyOworICAgIEFMT0dEKCIlczogSW5wdXRTb3VyY2UgJXMgaWRlbnRpZmllciAweCVYIiwgX19GVU5DVElPTl9fLCBnZXROYW1lKCkuY19zdHIoKSwgaWRlbnRpZmllcik7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisvKioKKyogU2V0IHRoZSBkZXZpY2UgYXNzb2NpYXRlZCB0byB0aGlzIHNvdXJjZS4KKyogSXQgY2hlY2tzIGlmIHRoZSBpbnB1dCBkZXZpY2UgaXMgdmFsaWQgYnV0IGFsbG93cyB0byBzZXQgYSBOT05FIGRldmljZQorKiAoaS5lLiBvbmx5IHRoZSBJTiBCSVQgaXMgc2V0KS4KKyoKKyogQHBhcmFtW2luXSBkZXZpY2VzIHNlbGVjdGVkIGZvciB0aGUgZ2l2ZW4gaW5wdXQgc291cmNlLgorKiBAdHBhcmFtIGF1ZGlvX2RldmljZXNfdDogQXBwbGljYWJsZSBpbnB1dCBkZXZpY2UgZm9yIHRoaXMgaW5wdXQgc291cmNlLgorKgorKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSBkZXZpY2UgaXMgZWl0aGVyIHZhbGlkIG9yIG5vbmUsIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorKi8KK3RlbXBsYXRlIDw+CitzdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3NvdXJjZV90Pjo6c2V0KGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQoreworICAgIGlmICghYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZXMpICYmIGRldmljZXMgIT0gQVVESU9fREVWSUNFX0JJVF9JTikgeworICAgICAgICBBTE9HRSgiJXM6IHRyeWluZyB0byBzZXQgYW4gaW52YWxpZCBkZXZpY2UgMHglWCBmb3IgaW5wdXQgc291cmNlICVzIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2VzLCBnZXROYW1lKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dEKCIlczogMHglWCBmb3IgaW5wdXQgc291cmNlICVzIiwgX19GVU5DVElPTl9fLCBkZXZpY2VzLCBnZXROYW1lKCkuY19zdHIoKSk7CisgICAgbUFwcGxpY2FibGVEZXZpY2VzID0gZGV2aWNlczsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3RlbXBsYXRlIDw+CithdWRpb19kZXZpY2VzX3QgRWxlbWVudDxhdWRpb19zb3VyY2VfdD46OmdldDxhdWRpb19kZXZpY2VzX3Q+KCkgY29uc3QKK3sKKyAgICBBTE9HVigiJXM6IDB4JVggZm9yIGlucHV0U291cmNlICVzIiwgX19GVU5DVElPTl9fLCBtQXBwbGljYWJsZURldmljZXMsIGdldE5hbWUoKS5jX3N0cigpKTsKKyAgICByZXR1cm4gbUFwcGxpY2FibGVEZXZpY2VzOworfQorfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZjNDk4ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRWxlbWVudC5oIgorCituYW1lc3BhY2UgYW5kcm9pZAoreworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoreworCisvKioKKyAqIFNwZWNpYWxpemF0aW9uIG9mIHBvbGljeSBiYXNlIGNsYXNzIGVsZW1lbnQgZm9yIGF1ZGlvX3NvdXJjZV90CisgKiBAdHBhcmFtIGF1ZGlvX3NvdXJjZV90IFBvbGljeSBCYXNlIEVsZW1lbnQgaWRlbnRpZmllZCBieSB0aGUgYXVkaW9fc291cmNlX3QgZGVmaW5pdGlvbi4KKyAqLwordGVtcGxhdGUgPD4KK2NsYXNzIEVsZW1lbnQ8YXVkaW9fc291cmNlX3Q+Cit7CitwdWJsaWM6CisgICAgRWxlbWVudChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICAgICAgOiBtTmFtZShuYW1lKSwKKyAgICAgICAgICBtQXBwbGljYWJsZURldmljZXMoQVVESU9fREVWSUNFX05PTkUpCisgICAge30KKyAgICB+RWxlbWVudCgpIHt9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGlkZW50aWZpZXIgb2YgdGhpcyBwb2xpY3kgZWxlbWVudAorICAgICAqCisgICAgICogQHJldHVybnMgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGlzIHBvbGljeSBlbGVtZW50CisgICAgICovCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorCisgICAgLyoqCisgICAgKiBTZXQgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHBvbGljeSBlbGVtZW50LgorICAgICoKKyAgICAqIEB0cGFyYW0gS2V5IHR5cGUgb2YgdGhlIHVuaXF1ZSBpZGVudGlmaWVyLgorICAgICogQHBhcmFtW2luXSBpZGVudGlmaWVyIHRvIGJlIHNldC4KKyAgICAqCisgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSBpZGVudGlmaWVyIGlzIHZhbGlkIGFuZCBzZXQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICAqLworICAgIHN0YXR1c190IHNldElkZW50aWZpZXIoYXVkaW9fc291cmNlX3QgaWRlbnRpZmllcik7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGlzIHBvbGljeSBlbGVtZW50LgorICAgICAqLworICAgIGF1ZGlvX3NvdXJjZV90IGdldElkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBtSWRlbnRpZmllcjsgfQorCisgICAgLyoqCisgICAgICogQSBQb2xpY3kgZWxlbWVudCBtYXkgaW1wbGVtZW50IGdldHRlci9zZXR0ZXIgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCisgICAgICogUHJvcGVydHkgbWF5IGJlIHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CisgICAgICogb3IgYSBzdHJpbmcuCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgorICAgIFByb3BlcnR5IGdldCgpIGNvbnN0OworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgorICAgIHN0YXR1c190IHNldChQcm9wZXJ0eSBwcm9wZXJ0eSk7CisKK3ByaXZhdGU6CisgICAgLyogQ29weSBmYWNpbGl0aWVzIGFyZSBwdXQgcHJpdmF0ZSB0byBkaXNhYmxlIGNvcHkuICovCisgICAgRWxlbWVudChjb25zdCBFbGVtZW50ICZvYmplY3QpOworICAgIEVsZW1lbnQgJm9wZXJhdG9yPShjb25zdCBFbGVtZW50ICZvYmplY3QpOworCisgICAgc3RkOjpzdHJpbmcgbU5hbWU7IC8qKjwgVW5pcXVlIGxpdGVyYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQqLworICAgIGF1ZGlvX3NvdXJjZV90IG1JZGVudGlmaWVyOyAvKio8IFVuaXF1ZSBudW1lcmljYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQqLworCisgICAgYXVkaW9fZGV2aWNlc190IG1BcHBsaWNhYmxlRGV2aWNlczsgLyoqPCBBcHBsaWNhYmxlIGlucHV0IGRldmljZSBmb3IgdGhpcyBpbnB1dCBzb3VyY2UuICovCit9OworCit0eXBlZGVmIEVsZW1lbnQ8YXVkaW9fc291cmNlX3Q+IElucHV0U291cmNlOworCit9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJhdGVneS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmF0ZWd5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NDc0NDNhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJhdGVneS5jcHAKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZS9TdHJhdGVneSIKKworI2luY2x1ZGUgIlN0cmF0ZWd5LmgiCisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCituYW1lc3BhY2UgYW5kcm9pZAoreworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoreworCitzdGF0dXNfdCBFbGVtZW50PHJvdXRpbmdfc3RyYXRlZ3k+OjpzZXRJZGVudGlmaWVyKHJvdXRpbmdfc3RyYXRlZ3kgaWRlbnRpZmllcikKK3sKKyAgICBpZiAoaWRlbnRpZmllciA+PSBOVU1fU1RSQVRFR0lFUykgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBtSWRlbnRpZmllciA9IGlkZW50aWZpZXI7CisgICAgQUxPR0QoIiVzOiBTdHJhdGVneSAlcyBpZGVudGlmaWVyIDB4JVgiLCBfX0ZVTkNUSU9OX18sIGdldE5hbWUoKS5jX3N0cigpLCBpZGVudGlmaWVyKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKy8qKgorICogU2V0IHRoZSBkZXZpY2UgYXNzb2NpYXRlZCB0byB0aGlzIHN0cmF0ZWd5LgorICogSXQgY2hlY2tzIGlmIHRoZSBvdXRwdXQgZGV2aWNlIGlzIHZhbGlkIGJ1dCBhbGxvd3MgdG8gc2V0IGEgTk9ORSBkZXZpY2UKKyAqCisgKiBAcGFyYW1baW5dIGRldmljZXMgc2VsZWN0ZWQgZm9yIHRoZSBnaXZlbiBzdHJhdGVneS4KKyAqCisgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSBkZXZpY2UgaXMgZWl0aGVyIHZhbGlkIG9yIG5vbmUsIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCit0ZW1wbGF0ZSA8Pgorc3RhdHVzX3QgRWxlbWVudDxyb3V0aW5nX3N0cmF0ZWd5Pjo6c2V0PGF1ZGlvX2RldmljZXNfdD4oYXVkaW9fZGV2aWNlc190IGRldmljZXMpCit7CisgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlcyhkZXZpY2VzKSAmJiBkZXZpY2VzICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIEFMT0dFKCIlczogdHJ5aW5nIHRvIHNldCBhbiBpbnZhbGlkIGRldmljZSAweCVYIGZvciBzdHJhdGVneSAlcyIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgZ2V0TmFtZSgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HRCgiJXM6IDB4JVggZm9yIHN0cmF0ZWd5ICVzIiwgX19GVU5DVElPTl9fLCBkZXZpY2VzLCBnZXROYW1lKCkuY19zdHIoKSk7CisgICAgbUFwcGxpY2FibGVEZXZpY2VzID0gZGV2aWNlczsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3RlbXBsYXRlIDw+CithdWRpb19kZXZpY2VzX3QgRWxlbWVudDxyb3V0aW5nX3N0cmF0ZWd5Pjo6Z2V0PGF1ZGlvX2RldmljZXNfdD4oKSBjb25zdAoreworICAgIEFMT0dWKCIlczogMHglWCBmb3Igc3RyYXRlZ3kgJXMiLCBfX0ZVTkNUSU9OX18sIG1BcHBsaWNhYmxlRGV2aWNlcywgZ2V0TmFtZSgpLmNfc3RyKCkpOworICAgIHJldHVybiBtQXBwbGljYWJsZURldmljZXM7Cit9CisKK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmF0ZWd5LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmF0ZWd5LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTE1N2Q1NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyYXRlZ3kuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJFbGVtZW50LmgiCisjaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkCit7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit7CisKKy8qKgorICogQHRwYXJhbSBhdWRpb19kZXZpY2VzX3Q6IEFwcGxpY2FibGUgb3V0cHV0IGRldmljZShzKSBmb3IgdGhpcyBzdHJhdGVneS4KKyAqLwordGVtcGxhdGUgPD4KK2NsYXNzIEVsZW1lbnQ8cm91dGluZ19zdHJhdGVneT4KK3sKK3B1YmxpYzoKKyAgICBFbGVtZW50KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKQorICAgICAgICA6IG1OYW1lKG5hbWUpLAorICAgICAgICAgIG1BcHBsaWNhYmxlRGV2aWNlcyhBVURJT19ERVZJQ0VfTk9ORSkKKyAgICB7fQorICAgIH5FbGVtZW50KCkge30KKworICAgIC8qKgorICAgICAqIFJldHVybnMgaWRlbnRpZmllciBvZiB0aGlzIHBvbGljeSBlbGVtZW50CisgICAgICoKKyAgICAgKiBAcmV0dXJucyBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQKKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisKKyAgICAvKioKKyAgICAqIFNldCB0aGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcG9saWN5IGVsZW1lbnQuCisgICAgKgorICAgICogQHRwYXJhbSBLZXkgdHlwZSBvZiB0aGUgdW5pcXVlIGlkZW50aWZpZXIuCisgICAgKiBAcGFyYW1baW5dIGlkZW50aWZpZXIgdG8gYmUgc2V0LgorICAgICoKKyAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIGlkZW50aWZpZXIgaXMgdmFsaWQgYW5kIHNldCBjb3JyZWN0bHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgICovCisgICAgc3RhdHVzX3Qgc2V0SWRlbnRpZmllcihyb3V0aW5nX3N0cmF0ZWd5IGlkZW50aWZpZXIpOworCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyBwb2xpY3kgZWxlbWVudC4KKyAgICAgKi8KKyAgICByb3V0aW5nX3N0cmF0ZWd5IGdldElkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBtSWRlbnRpZmllcjsgfQorCisgICAgLyoqCisgICAgICogQSBQb2xpY3kgZWxlbWVudCBtYXkgaW1wbGVtZW50IGdldHRlci9zZXR0ZXIgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCisgICAgICogUHJvcGVydHkgbWF5IGJlIHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CisgICAgICogb3IgYSBzdHJpbmcuCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgorICAgIFByb3BlcnR5IGdldCgpIGNvbnN0OworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgorICAgIHN0YXR1c190IHNldChQcm9wZXJ0eSBwcm9wZXJ0eSk7CisKK3ByaXZhdGU6CisgICAgLyogQ29weSBmYWNpbGl0aWVzIGFyZSBwdXQgcHJpdmF0ZSB0byBkaXNhYmxlIGNvcHkuICovCisgICAgRWxlbWVudChjb25zdCBFbGVtZW50ICZvYmplY3QpOworICAgIEVsZW1lbnQgJm9wZXJhdG9yPShjb25zdCBFbGVtZW50ICZvYmplY3QpOworCisgICAgc3RkOjpzdHJpbmcgbU5hbWU7IC8qKjwgVW5pcXVlIGxpdGVyYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQqLworICAgIHJvdXRpbmdfc3RyYXRlZ3kgbUlkZW50aWZpZXI7IC8qKjwgVW5pcXVlIG51bWVyaWNhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCisKKyAgICBhdWRpb19kZXZpY2VzX3QgbUFwcGxpY2FibGVEZXZpY2VzOyAvKio8IEFwcGxpY2FibGUgb3V0cHV0IGRldmljZShzKSBmb3IgdGhpcyBzdHJhdGVneS4gKi8KK307CisKK3R5cGVkZWYgRWxlbWVudDxyb3V0aW5nX3N0cmF0ZWd5PiBTdHJhdGVneTsKKworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJlYTJjMTkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmVhbS5jcHAKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qb2xpY3lFbmdpbmUvU3RyZWFtIgorCisjaW5jbHVkZSAiU3RyZWFtLmgiCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKK3VzaW5nIHN0ZDo6c3RyaW5nOworCituYW1lc3BhY2UgYW5kcm9pZAoreworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoreworCitzdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+OjpzZXRJZGVudGlmaWVyKGF1ZGlvX3N0cmVhbV90eXBlX3QgaWRlbnRpZmllcikKK3sKKyAgICBpZiAoaWRlbnRpZmllciA+IEFVRElPX1NUUkVBTV9DTlQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbUlkZW50aWZpZXIgPSBpZGVudGlmaWVyOworICAgIEFMT0dEKCIlczogU3RyZWFtICVzIGlkZW50aWZpZXIgMHglWCIsIF9fRlVOQ1RJT05fXywgZ2V0TmFtZSgpLmNfc3RyKCksIGlkZW50aWZpZXIpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLyoqCisqIFNldCB0aGUgc3RyYXRlZ3kgdG8gZm9sbG93IGZvciB0aGlzIHN0cmVhbS4KKyogSXQgY2hlY2tzIGlmIHRoZSBzdHJhdGVneSBpcyB2YWxpZC4KKyoKKyogQHBhcmFtW2luXSBzdHJhdGVneSB0byBiZSBmb2xsb3dlZC4KKyoKKyogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgc3RyYXRlZ3kgaXMgc2V0IGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCisqLwordGVtcGxhdGUgPD4KK3N0YXR1c190IEVsZW1lbnQ8YXVkaW9fc3RyZWFtX3R5cGVfdD46OnNldDxyb3V0aW5nX3N0cmF0ZWd5Pihyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQoreworICAgIGlmIChzdHJhdGVneSA+PSBOVU1fU1RSQVRFR0lFUykgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBtQXBwbGljYWJsZVN0cmF0ZWd5ID0gc3RyYXRlZ3k7CisgICAgQUxPR0QoIiVzOiAweCVYIGZvciBTdHJlYW0gJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmF0ZWd5LCBnZXROYW1lKCkuY19zdHIoKSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit0ZW1wbGF0ZSA8Pgorcm91dGluZ19zdHJhdGVneSBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+OjpnZXQ8cm91dGluZ19zdHJhdGVneT4oKSBjb25zdAoreworICAgIEFMT0dWKCIlczogMHglWCBmb3IgU3RyZWFtICVzIiwgX19GVU5DVElPTl9fLCBtQXBwbGljYWJsZVN0cmF0ZWd5LCBnZXROYW1lKCkuY19zdHIoKSk7CisgICAgcmV0dXJuIG1BcHBsaWNhYmxlU3RyYXRlZ3k7Cit9CisKK3N0YXR1c190IEVsZW1lbnQ8YXVkaW9fc3RyZWFtX3R5cGVfdD46OnNldFZvbHVtZVByb2ZpbGUoVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgY2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnRzICZwb2ludHMpCit7CisgICAgQUxPR0QoIiVzOiBhZGRpbmcgdm9sdW1lIHByb2ZpbGUgZm9yICVzIGZvciBkZXZpY2UgY2F0ZWdvcnkgJWQsIHBvaW50cyBuYiA9JWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgZ2V0TmFtZSgpLmNfc3RyKCksIGNhdGVnb3J5LCBwb2ludHMuc2l6ZSgpKTsKKyAgICBtVm9sdW1lUHJvZmlsZXNbY2F0ZWdvcnldID0gcG9pbnRzOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwb2ludHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQUxPR1YoIiVzOiAlcyBjYXQ9JWQgY3VydmUgaW5kZXggPSVkIEluZGV4PSVkIGRCQXR0ZW51YXRpb249JWYiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGdldE5hbWUoKS5jX3N0cigpLCBjYXRlZ29yeSwgaSwgcG9pbnRzW2ldLm1JbmRleCwKKyAgICAgICAgICAgICBwb2ludHNbaV0ubURCQXR0ZW51YXRpb24pOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEVsZW1lbnQ8YXVkaW9fc3RyZWFtX3R5cGVfdD46OmluaXRWb2x1bWUoaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpCit7CisgICAgQUxPR1YoImluaXRTdHJlYW1Wb2x1bWUoKSBzdHJlYW0gJXMsIG1pbiAlZCwgbWF4ICVkIiwgZ2V0TmFtZSgpLmNfc3RyKCksIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgaWYgKGluZGV4TWluIDwgMCB8fCBpbmRleE1pbiA+PSBpbmRleE1heCkgeworICAgICAgICBBTE9HVygiaW5pdFN0cmVhbVZvbHVtZSgpIGludmFsaWQgaW5kZXggbGltaXRzIGZvciBzdHJlYW0gJXMsIG1pbiAlZCwgbWF4ICVkIiwKKyAgICAgICAgICAgICAgZ2V0TmFtZSgpLmNfc3RyKCksIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIG1JbmRleE1pbiA9IGluZGV4TWluOworICAgIG1JbmRleE1heCA9IGluZGV4TWF4OworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitmbG9hdCBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+Ojp2b2xJbmRleFRvRGIoVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKQoreworICAgIFZvbHVtZVByb2ZpbGVDb25zdEl0ZXJhdG9yIGl0ID0gbVZvbHVtZVByb2ZpbGVzLmZpbmQoZGV2aWNlQ2F0ZWdvcnkpOworICAgIGlmIChpdCA9PSBtVm9sdW1lUHJvZmlsZXMuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBkZXZpY2UgY2F0ZWdvcnkgJWQgbm90IGZvdW5kIGZvciBzdHJlYW0gJXMiLCBfX0ZVTkNUSU9OX18sIGRldmljZUNhdGVnb3J5LAorICAgICAgICAgICAgICBnZXROYW1lKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiAxLjBmOworICAgIH0KKyAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50cyBjdXJ2ZSA9IG1Wb2x1bWVQcm9maWxlc1tkZXZpY2VDYXRlZ29yeV07CisgICAgaWYgKGN1cnZlLnNpemUoKSAhPSBWb2x1bWU6OlZPTENOVCkgeworICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgcHJvZmlsZSBmb3IgY2F0ZWdvcnkgJWQgYW5kIGZvciBzdHJlYW0gJXMiLCBfX0ZVTkNUSU9OX18sIGRldmljZUNhdGVnb3J5LAorICAgICAgICAgICAgICBnZXROYW1lKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiAxLjBmOworICAgIH0KKworICAgIC8vIHRoZSB2b2x1bWUgaW5kZXggaW4gdGhlIFVJIGlzIHJlbGF0aXZlIHRvIHRoZSBtaW4gYW5kIG1heCB2b2x1bWUgaW5kaWNlcyBmb3IgdGhpcyBzdHJlYW0gdHlwZQorICAgIGludCBuYlN0ZXBzID0gMSArIGN1cnZlW1ZvbHVtZTo6Vk9MTUFYXS5tSW5kZXggLQorICAgICAgICAgICAgY3VydmVbVm9sdW1lOjpWT0xNSU5dLm1JbmRleDsKKworICAgIGlmIChtSW5kZXhNYXggLSBtSW5kZXhNaW4gPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgdm9sdW1lIGluZGV4ZXMgTWluPU1heD0lZCIsIF9fRlVOQ1RJT05fXywgbUluZGV4TWluKTsKKyAgICAgICAgcmV0dXJuIDEuMGY7CisgICAgfQorICAgIGludCB2b2xJZHggPSAobmJTdGVwcyAqIChpbmRleEluVWkgLSBtSW5kZXhNaW4pKSAvCisgICAgICAgICAgICAobUluZGV4TWF4IC0gbUluZGV4TWluKTsKKworICAgIC8vIGZpbmQgd2hhdCBwYXJ0IG9mIHRoZSBjdXJ2ZSB0aGlzIGluZGV4IHZvbHVtZSBiZWxvbmdzIHRvLCBvciBpZiBpdCdzIG91dCBvZiBib3VuZHMKKyAgICBpbnQgc2VnbWVudCA9IDA7CisgICAgaWYgKHZvbElkeCA8IGN1cnZlW1ZvbHVtZTo6Vk9MTUlOXS5tSW5kZXgpIHsgICAgICAgICAvLyBvdXQgb2YgYm91bmRzCisgICAgICAgIHJldHVybiAwLjBmOworICAgIH0gZWxzZSBpZiAodm9sSWR4IDwgY3VydmVbVm9sdW1lOjpWT0xLTkVFMV0ubUluZGV4KSB7CisgICAgICAgIHNlZ21lbnQgPSAwOworICAgIH0gZWxzZSBpZiAodm9sSWR4IDwgY3VydmVbVm9sdW1lOjpWT0xLTkVFMl0ubUluZGV4KSB7CisgICAgICAgIHNlZ21lbnQgPSAxOworICAgIH0gZWxzZSBpZiAodm9sSWR4IDw9IGN1cnZlW1ZvbHVtZTo6Vk9MTUFYXS5tSW5kZXgpIHsKKyAgICAgICAgc2VnbWVudCA9IDI7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXQgb2YgYm91bmRzCisgICAgICAgIHJldHVybiAxLjBmOworICAgIH0KKworICAgIC8vIGxpbmVhciBpbnRlcnBvbGF0aW9uIGluIHRoZSBhdHRlbnVhdGlvbiB0YWJsZSBpbiBkQgorICAgIGZsb2F0IGRlY2liZWxzID0gY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24gKworICAgICAgICAgICAgKChmbG9hdCkodm9sSWR4IC0gY3VydmVbc2VnbWVudF0ubUluZGV4KSkgKgorICAgICAgICAgICAgICAgICggKGN1cnZlW3NlZ21lbnQrMV0ubURCQXR0ZW51YXRpb24gLQorICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24pIC8KKyAgICAgICAgICAgICAgICAgICAgKChmbG9hdCkoY3VydmVbc2VnbWVudCsxXS5tSW5kZXggLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1JbmRleCkpICk7CisKKyAgICBBTE9HVigiVk9MVU1FIHZvbCBpbmRleD1bJWQgJWQgJWRdLCBkQj1bJS4xZiAlLjFmICUuMWZdIiwKKyAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1JbmRleCwgdm9sSWR4LAorICAgICAgICAgICAgY3VydmVbc2VnbWVudCsxXS5tSW5kZXgsCisgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tREJBdHRlbnVhdGlvbiwKKyAgICAgICAgICAgIGRlY2liZWxzLAorICAgICAgICAgICAgY3VydmVbc2VnbWVudCsxXS5tREJBdHRlbnVhdGlvbik7CisKKyAgICByZXR1cm4gZGVjaWJlbHM7Cit9CisKK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmVhbS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44YzM5ZGM2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uaApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiRWxlbWVudC5oIgorI2luY2x1ZGUgIkVuZ2luZURlZmluaXRpb24uaCIKKyNpbmNsdWRlIDxWb2x1bWUuaD4KKyNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBhbmRyb2lkCit7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit7CisvKioKKyAqIEB0cGFyYW0gcm91dGluZ19zdHJhdGVneTogQXBwbGljYWJsZSBzdHJhdGVneSBmb3IgdGhpcyBzdHJlYW0uCisgKi8KK3RlbXBsYXRlIDw+CitjbGFzcyBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+Cit7Citwcml2YXRlOgorICAgIHR5cGVkZWYgc3RkOjptYXA8Vm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnksIFZvbHVtZUN1cnZlUG9pbnRzPiBWb2x1bWVQcm9maWxlczsKKyAgICB0eXBlZGVmIFZvbHVtZVByb2ZpbGVzOjppdGVyYXRvciBWb2x1bWVQcm9maWxlSXRlcmF0b3I7CisgICAgdHlwZWRlZiBWb2x1bWVQcm9maWxlczo6Y29uc3RfaXRlcmF0b3IgVm9sdW1lUHJvZmlsZUNvbnN0SXRlcmF0b3I7CisKK3B1YmxpYzoKKyAgICBFbGVtZW50KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKQorICAgICAgICA6IG1OYW1lKG5hbWUpLAorICAgICAgICAgIG1BcHBsaWNhYmxlU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEpLAorICAgICAgICAgIG1JbmRleE1pbigwKSwKKyAgICAgICAgICBtSW5kZXhNYXgoMSkKKyAgICB7fQorICAgIH5FbGVtZW50KCkge30KKworICAgIC8qKgorICAgICAqIFJldHVybnMgaWRlbnRpZmllciBvZiB0aGlzIHBvbGljeSBlbGVtZW50CisgICAgICoKKyAgICAgKiBAcmV0dXJucyBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQKKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisKKyAgICAvKioKKyAgICAqIFNldCB0aGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcG9saWN5IGVsZW1lbnQuCisgICAgKgorICAgICogQHRwYXJhbSBLZXkgdHlwZSBvZiB0aGUgdW5pcXVlIGlkZW50aWZpZXIuCisgICAgKiBAcGFyYW1baW5dIGlkZW50aWZpZXIgdG8gYmUgc2V0LgorICAgICoKKyAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIGlkZW50aWZpZXIgaXMgdmFsaWQgYW5kIHNldCBjb3JyZWN0bHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgICovCisgICAgc3RhdHVzX3Qgc2V0SWRlbnRpZmllcihhdWRpb19zdHJlYW1fdHlwZV90IGlkZW50aWZpZXIpOworCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyBwb2xpY3kgZWxlbWVudC4KKyAgICAgKi8KKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IGdldElkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBtSWRlbnRpZmllcjsgfQorCisgICAgLyoqCisgICAgICogQSBQb2xpY3kgZWxlbWVudCBtYXkgaW1wbGVtZW50IGdldHRlci9zZXR0ZXIgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCisgICAgICogUHJvcGVydHkgbWF5IGJlIHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CisgICAgICogb3IgYSBzdHJpbmcuCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgorICAgIFByb3BlcnR5IGdldCgpIGNvbnN0OworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgorICAgIHN0YXR1c190IHNldChQcm9wZXJ0eSBwcm9wZXJ0eSk7CisKKyAgICBzdGF0dXNfdCBzZXRWb2x1bWVQcm9maWxlKFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGNhdGVnb3J5LCBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50cyAmcG9pbnRzKTsKKworICAgIGZsb2F0IHZvbEluZGV4VG9EYihWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwgaW50IGluZGV4SW5VaSk7CisKKyAgICBzdGF0dXNfdCBpbml0Vm9sdW1lKGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KTsKKworcHJpdmF0ZToKKyAgICAvKiBDb3B5IGZhY2lsaXRpZXMgYXJlIHB1dCBwcml2YXRlIHRvIGRpc2FibGUgY29weS4gKi8KKyAgICBFbGVtZW50KGNvbnN0IEVsZW1lbnQgJm9iamVjdCk7CisgICAgRWxlbWVudCAmb3BlcmF0b3I9KGNvbnN0IEVsZW1lbnQgJm9iamVjdCk7CisKKyAgICBzdGQ6OnN0cmluZyBtTmFtZTsgLyoqPCBVbmlxdWUgbGl0ZXJhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtSWRlbnRpZmllcjsgLyoqPCBVbmlxdWUgbnVtZXJpY2FsIElkZW50aWZpZXIgb2YgYSBwb2xpY3kgYmFzZSBlbGVtZW50Ki8KKworICAgIHJvdXRpbmdfc3RyYXRlZ3kgbUFwcGxpY2FibGVTdHJhdGVneTsgLyoqPCBBcHBsaWNhYmxlIHN0cmF0ZWd5IGZvciB0aGlzIHN0cmVhbS4gKi8KKworICAgIC8qKgorICAgICAqIENvbGxlY3Rpb24gb2Ygdm9sdW1lIHByb2ZpbGVzIGluZGV4ZWQgYnkgdGhlIHN0cmVhbSB0eXBlLgorICAgICAqIFZvbHVtZSBpcyB0aGUgb25seSByZWFzb24gd2h5IHRoZSBzdHJlYW0gcHJvZmlsZSB3YXMgbm90IHJlbW92ZWQgZnJvbSBwb2xpY3kgd2hlbiBpbnRyb2R1Y2luZworICAgICAqIGF0dHJpYnV0ZXMuCisgICAgICovCisgICAgVm9sdW1lUHJvZmlsZXMgbVZvbHVtZVByb2ZpbGVzOworCisgICAgaW50IG1JbmRleE1pbjsKKworICAgIGludCBtSW5kZXhNYXg7Cit9OworCit0eXBlZGVmIEVsZW1lbnQ8YXVkaW9fc3RyZWFtX3R5cGVfdD4gU3RyZWFtOworCit9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1VzYWdlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvVXNhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVkMjA4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1VzYWdlLmNwcApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUG9saWN5RW5naW5lL1VzYWdlIgorCisjaW5jbHVkZSAiVXNhZ2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kKK3sKKworc3RhdHVzX3QgRWxlbWVudDxhdWRpb191c2FnZV90Pjo6c2V0SWRlbnRpZmllcihhdWRpb191c2FnZV90IGlkZW50aWZpZXIpCit7CisgICAgaWYgKGlkZW50aWZpZXIgPiBBVURJT19VU0FHRV9NQVgpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgbUlkZW50aWZpZXIgPSBpZGVudGlmaWVyOworICAgIEFMT0dEKCIlczogVXNhZ2UgJXMgaGFzIGlkZW50aWZpZXIgMHglWCIsIF9fRlVOQ1RJT05fXywgZ2V0TmFtZSgpLmNfc3RyKCksIGlkZW50aWZpZXIpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordGVtcGxhdGUgPD4KK3N0YXR1c190IEVsZW1lbnQ8YXVkaW9fdXNhZ2VfdD46OnNldDxyb3V0aW5nX3N0cmF0ZWd5Pihyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQoreworICAgIGlmIChzdHJhdGVneSA+PSBOVU1fU1RSQVRFR0lFUykgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HRCgiJXM6ICVkIGZvciBVc2FnZSAlcyIsIF9fRlVOQ1RJT05fXywgc3RyYXRlZ3ksIGdldE5hbWUoKS5jX3N0cigpKTsKKyAgICBtQXBwbGljYWJsZVN0cmF0ZWd5ID0gc3RyYXRlZ3k7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit0ZW1wbGF0ZSA8Pgorcm91dGluZ19zdHJhdGVneSBFbGVtZW50PGF1ZGlvX3VzYWdlX3Q+OjpnZXQ8cm91dGluZ19zdHJhdGVneT4oKSBjb25zdAoreworICAgIEFMT0dEKCIlczogJWQgZm9yIFVzYWdlICVzIiwgX19GVU5DVElPTl9fLCBtQXBwbGljYWJsZVN0cmF0ZWd5LCBnZXROYW1lKCkuY19zdHIoKSk7CisgICAgcmV0dXJuIG1BcHBsaWNhYmxlU3RyYXRlZ3k7Cit9CisKK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvVXNhZ2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvVXNhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNjllMGUwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Vc2FnZS5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkVsZW1lbnQuaCIKKyNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kKK3sKKworLyoqCisgKiBAdHBhcmFtIHJvdXRpbmdfc3RyYXRlZ3k6IEFwcGxpY2FibGUgc3RyYXRlZ3kgZm9yIHRoaXMgdXNhZ2UuCisgKi8KK3RlbXBsYXRlIDw+CitjbGFzcyBFbGVtZW50PGF1ZGlvX3VzYWdlX3Q+Cit7CitwdWJsaWM6CisgICAgRWxlbWVudChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkKKyAgICAgICAgOiBtTmFtZShuYW1lKSwKKyAgICAgICAgICBtQXBwbGljYWJsZVN0cmF0ZWd5KFNUUkFURUdZX01FRElBKQorICAgIHt9CisgICAgfkVsZW1lbnQoKSB7fQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBpZGVudGlmaWVyIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQKKyAgICAgKgorICAgICAqIEByZXR1cm5zIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhpcyBwb2xpY3kgZWxlbWVudAorICAgICAqLworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKworICAgIC8qKgorICAgICogU2V0IHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBwb2xpY3kgZWxlbWVudC4KKyAgICAqCisgICAgKiBAdHBhcmFtIEtleSB0eXBlIG9mIHRoZSB1bmlxdWUgaWRlbnRpZmllci4KKyAgICAqIEBwYXJhbVtpbl0gaWRlbnRpZmllciB0byBiZSBzZXQuCisgICAgKgorICAgICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgaWRlbnRpZmllciBpcyB2YWxpZCBhbmQgc2V0IGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRJZGVudGlmaWVyKGF1ZGlvX3VzYWdlX3QgaWRlbnRpZmllcik7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGlzIHBvbGljeSBlbGVtZW50LgorICAgICAqLworICAgIGF1ZGlvX3VzYWdlX3QgZ2V0SWRlbnRpZmllcigpIGNvbnN0IHsgcmV0dXJuIG1JZGVudGlmaWVyOyB9CisKKyAgICAvKioKKyAgICAgKiBBIFBvbGljeSBlbGVtZW50IG1heSBpbXBsZW1lbnQgZ2V0dGVyL3NldHRlciBmdW5jdGlvbiBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KKyAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgcm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKKyAgICAgKiBvciBhIHN0cmluZy4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHk+CisgICAgUHJvcGVydHkgZ2V0KCkgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHk+CisgICAgc3RhdHVzX3Qgc2V0KFByb3BlcnR5IHByb3BlcnR5KTsKKworcHJpdmF0ZToKKyAgICAvKiBDb3B5IGZhY2lsaXRpZXMgYXJlIHB1dCBwcml2YXRlIHRvIGRpc2FibGUgY29weS4gKi8KKyAgICBFbGVtZW50KGNvbnN0IEVsZW1lbnQgJm9iamVjdCk7CisgICAgRWxlbWVudCAmb3BlcmF0b3I9KGNvbnN0IEVsZW1lbnQgJm9iamVjdCk7CisKKyAgICBzdGQ6OnN0cmluZyBtTmFtZTsgLyoqPCBVbmlxdWUgbGl0ZXJhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCisgICAgYXVkaW9fdXNhZ2VfdCBtSWRlbnRpZmllcjsgLyoqPCBVbmlxdWUgbnVtZXJpY2FsIElkZW50aWZpZXIgb2YgYSBwb2xpY3kgYmFzZSBlbGVtZW50Ki8KKyAgICByb3V0aW5nX3N0cmF0ZWd5IG1BcHBsaWNhYmxlU3RyYXRlZ3k7IC8qKjwgQXBwbGljYWJsZSBzdHJhdGVneSBmb3IgdGhpcyB1c2FnZS4gKi8KK307CisKK3R5cGVkZWYgRWxlbWVudDxhdWRpb191c2FnZV90PiBVc2FnZTsKKworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk2ZjkxMwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0MCBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBXUkFQUEVSIExJQlJBUlkKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKKyAgICAkKFRBUkdFVF9PVVRfSEVBREVSUykvcGFyYW1ldGVyIFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlIFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UgXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzL2NvbnZlcnQgXAorCitMT0NBTF9TUkNfRklMRVM6PSBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5jcHAKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgbGlibWVkaWFfaGVscGVyIFwKKworTE9DQUxfTU9EVUxFOj0gbGliYXVkaW9wb2xpY3lwZnd3cmFwcGVyCitMT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChMT0NBTF9QQVRIKS9pbmNsdWRlCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvciAtV2V4dHJhCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENPTkZJR1VSQVRJT04gRklMRQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgc3BlY2lmaWMgbWFuYWdlbWVudCBvZiBhdWRpb19wb2xpY3lfY3JpdGVyaWEuY29uZgoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfRVRDKQorTE9DQUxfU1JDX0ZJTEVTIDo9IGNvbmZpZy8kKExPQ0FMX01PRFVMRSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZmU0OWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuY3BwCkBAIC0wLDAgKzEsNDM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUG9saWN5RW5naW5lL1BGV1dyYXBwZXIiCisKKyNpbmNsdWRlICJQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oIgorI2luY2x1ZGUgImF1ZGlvX3BvbGljeV9jcml0ZXJpYV9jb25mLmgiCisjaW5jbHVkZSA8UGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3IuaD4KKyNpbmNsdWRlIDxTZWxlY3Rpb25Dcml0ZXJpb25UeXBlSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8U2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Y29udmVydC5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK3VzaW5nIHN0ZDo6c3RyaW5nOwordXNpbmcgc3RkOjptYXA7Cit1c2luZyBzdGQ6OnZlY3RvcjsKKworLy8vIFBGVyByZWxhdGVkIGRlZmluaXRpb25zCisvLyBMb2dnZXIKK2NsYXNzIFBhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yTG9nZ2VyIDogcHVibGljIENQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3Rvcjo6SUxvZ2dlcgoreworcHVibGljOgorICAgIFBhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yTG9nZ2VyKCkge30KKworICAgIHZpcnR1YWwgdm9pZCBsb2coYm9vbCBpc1dhcm5pbmcsIGNvbnN0IHN0cmluZyAmbG9nKQorICAgIHsKKyAgICAgICAgY29uc3Qgc3RhdGljIHN0cmluZyBmb3JtYXQoInBvbGljeS1wYXJhbWV0ZXItbWFuYWdlcjogIik7CisKKyAgICAgICAgaWYgKGlzV2FybmluZykgeworICAgICAgICAgICAgQUxPR1coIiVzICVzIiwgZm9ybWF0LmNfc3RyKCksIGxvZy5jX3N0cigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dEKCIlcyAlcyIsIGZvcm1hdC5jX3N0cigpLCBsb2cuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9Cit9OworCituYW1lc3BhY2UgYW5kcm9pZAoreworCit1c2luZyB1dGlsaXRpZXM6OmNvbnZlcnRUbzsKKworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoreworY29uc3QgY2hhciAqY29uc3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6Om1Qb2xpY3lQZndEZWZhdWx0Q29uZkZpbGVOYW1lID0KKyAgICAiL2V0Yy9wYXJhbWV0ZXItZnJhbWV3b3JrL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sIjsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6cGFyYW1ldGVyTWFuYWdlckVsZW1lbnRTdXBwb3J0ZWQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4ge307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpwYXJhbWV0ZXJNYW5hZ2VyRWxlbWVudFN1cHBvcnRlZDxJU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZUludGVyZmFjZT4ge307CisKK1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcigpCisgICAgOiBtUGZ3Q29ubmVjdG9yTG9nZ2VyKG5ldyBQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvckxvZ2dlcikKK3sKKyAgICAvLyBDb25uZWN0b3IKKyAgICBtUGZ3Q29ubmVjdG9yID0gbmV3IENQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvcihtUG9saWN5UGZ3RGVmYXVsdENvbmZGaWxlTmFtZSk7CisKKyAgICAvLyBMb2dnZXIKKyAgICBtUGZ3Q29ubmVjdG9yLT5zZXRMb2dnZXIobVBmd0Nvbm5lY3RvckxvZ2dlcik7CisKKyAgICAvLyBMb2FkIGNyaXRlcmlhIGZpbGUKKyAgICBpZiAoKGxvYWRBdWRpb1BvbGljeUNyaXRlcmlhQ29uZmlnKGdBdWRpb1BvbGljeUNyaXRlcmlhVmVuZG9yQ29uZkZpbGVQYXRoKSAhPSBOT19FUlJPUikgJiYKKyAgICAgICAgKGxvYWRBdWRpb1BvbGljeUNyaXRlcmlhQ29uZmlnKGdBdWRpb1BvbGljeUNyaXRlcmlhQ29uZkZpbGVQYXRoKSAhPSBOT19FUlJPUikpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBOZWl0aGVyIHZlbmRvciBjb25mIGZpbGUgKCVzKSBub3Igc3lzdGVtIGNvbmYgZmlsZSAoJXMpIGNvdWxkIGJlIGZvdW5kIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBnQXVkaW9Qb2xpY3lDcml0ZXJpYVZlbmRvckNvbmZGaWxlUGF0aCwKKyAgICAgICAgICAgICAgZ0F1ZGlvUG9saWN5Q3JpdGVyaWFDb25mRmlsZVBhdGgpOworICAgIH0KKyAgICBBTE9HRCgiJXM6IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyIGluc3RhbnRpYXRlZCEiLCBfX0ZVTkNUSU9OX18pOworfQorCitQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6flBhcmFtZXRlck1hbmFnZXJXcmFwcGVyKCkKK3sKKyAgICAvLyBVbnNldCBsb2dnZXIKKyAgICBtUGZ3Q29ubmVjdG9yLT5zZXRMb2dnZXIoTlVMTCk7CisgICAgLy8gUmVtb3ZlIGxvZ2dlcgorICAgIGRlbGV0ZSBtUGZ3Q29ubmVjdG9yTG9nZ2VyOworICAgIC8vIFJlbW92ZSBjb25uZWN0b3IKKyAgICBkZWxldGUgbVBmd0Nvbm5lY3RvcjsKK30KKworc3RhdHVzX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OnN0YXJ0KCkKK3sKKyAgICBBTE9HRCgiJXM6IGluIiwgX19GVU5DVElPTl9fKTsKKyAgICAvLy8gU3RhcnQgUEZXCisgICAgc3RkOjpzdHJpbmcgZXJyb3I7CisgICAgaWYgKCFtUGZ3Q29ubmVjdG9yLT5zdGFydChlcnJvcikpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBQb2xpY3kgUEZXIHN0YXJ0IGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyb3IuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBBTE9HRCgiJXM6IFBvbGljeSBQRlcgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKwordm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6YWRkQ3JpdGVyaW9uVHlwZShjb25zdCBzdHJpbmcgJnR5cGVOYW1lLCBib29sIGlzSW5jbHVzaXZlKQoreworICAgIEFMT0dfQVNTRVJUKG1Qb2xpY3lDcml0ZXJpb25UeXBlcy5maW5kKHR5cGVOYW1lKSA9PSBtUG9saWN5Q3JpdGVyaW9uVHlwZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgIkNyaXRlcmlvblR5cGUgIiA8PCB0eXBlTmFtZSA8PCAiIGFscmVhZHkgYWRkZWQiKTsKKyAgICBBTE9HRCgiJXM6IEFkZGluZyBuZXcgY3JpdGVyaW9uVHlwZSAlcyIsIF9fRlVOQ1RJT05fXywgdHlwZU5hbWUuY19zdHIoKSk7CisKKyAgICBtUG9saWN5Q3JpdGVyaW9uVHlwZXNbdHlwZU5hbWVdID0gbVBmd0Nvbm5lY3Rvci0+Y3JlYXRlU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZShpc0luY2x1c2l2ZSk7Cit9CisKK3ZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmFkZENyaXRlcmlvblR5cGVWYWx1ZVBhaXIoCisgICAgY29uc3Qgc3RyaW5nICZ0eXBlTmFtZSwKKyAgICB1aW50MzJfdCBudW1lcmljVmFsdWUsCisgICAgY29uc3Qgc3RyaW5nICZsaXRlcmFsVmFsdWUpCit7CisgICAgQUxPR19BU1NFUlQobVBvbGljeUNyaXRlcmlvblR5cGVzLmZpbmQodHlwZU5hbWUpICE9IG1Qb2xpY3lDcml0ZXJpb25UeXBlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAiQ3JpdGVyaW9uVHlwZSAiIDw8IHR5cGVOYW1lLmNfc3RyKCkgPDwgIm5vdCBmb3VuZCIpOworICAgIEFMT0dWKCIlczogQWRkaW5nIG5ldyB2YWx1ZSBwYWlyICglZCwlcykgZm9yIGNyaXRlcmlvblR5cGUgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgbnVtZXJpY1ZhbHVlLCBsaXRlcmFsVmFsdWUuY19zdHIoKSwgdHlwZU5hbWUuY19zdHIoKSk7CisgICAgSVNlbGVjdGlvbkNyaXRlcmlvblR5cGVJbnRlcmZhY2UgKmNyaXRlcmlvblR5cGUgPSBtUG9saWN5Q3JpdGVyaW9uVHlwZXNbdHlwZU5hbWVdOworICAgIGNyaXRlcmlvblR5cGUtPmFkZFZhbHVlUGFpcihudW1lcmljVmFsdWUsIGxpdGVyYWxWYWx1ZS5jX3N0cigpKTsKK30KKwordm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZENyaXRlcmlvblR5cGUoY25vZGUgKnJvb3QsIGJvb2wgaXNJbmNsdXNpdmUpCit7CisgICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7CisgICAgY25vZGUgKm5vZGU7CisgICAgZm9yIChub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7IG5vZGUgIT0gTlVMTDsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKworICAgICAgICBBTE9HX0FTU0VSVChub2RlICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKKyAgICAgICAgY29uc3QgY2hhciAqdHlwZU5hbWUgPSBub2RlLT5uYW1lOworICAgICAgICBjaGFyICp2YWx1ZU5hbWVzID0gc3RybmR1cChub2RlLT52YWx1ZSwgc3RybGVuKG5vZGUtPnZhbHVlKSk7CisKKyAgICAgICAgYWRkQ3JpdGVyaW9uVHlwZSh0eXBlTmFtZSwgaXNJbmNsdXNpdmUpOworCisgICAgICAgIHVpbnQzMl90IGluZGV4ID0gMDsKKyAgICAgICAgY2hhciAqY3R4OworICAgICAgICBjaGFyICp2YWx1ZU5hbWUgPSBzdHJ0b2tfcih2YWx1ZU5hbWVzLCAiLCIsICZjdHgpOworICAgICAgICB3aGlsZSAodmFsdWVOYW1lICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChzdHJsZW4odmFsdWVOYW1lKSAhPSAwKSB7CisKKyAgICAgICAgICAgICAgICAvLyBDb25mIGZpbGUgbWF5IHVzZSBvciBub3QgcGFpciwgaWYgbm8gcGFpciwgdXNlIGluY3JlbWVudGFsIGluZGV4LCBlbHNlCisgICAgICAgICAgICAgICAgLy8gdXNlIHByb3ZpZGVkIGluZGV4LgorICAgICAgICAgICAgICAgIGlmIChzdHJjaHIodmFsdWVOYW1lLCAnOicpICE9IE5VTEwpIHsKKworICAgICAgICAgICAgICAgICAgICBjaGFyICpmaXJzdCA9IHN0cnRvayh2YWx1ZU5hbWUsICI6Iik7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKnNlY29uZCA9IHN0cnRvayhOVUxMLCAiOiIpOworICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVCgoZmlyc3QgIT0gTlVMTCkgJiYgKHN0cmxlbihmaXJzdCkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlY29uZCAhPSBOVUxMKSAmJiAoc3RybGVuKHNlY29uZCkgIT0gMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHZhbHVlIHBhaXIiKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnZlcnRUbzxzdHJpbmcsIHVpbnQzMl90PihmaXJzdCwgaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgaW5kZXgoJXMpIGZvdW5kIiwgX19GVU5DVElPTl9fLCBmaXJzdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYWRkQ3JpdGVyaW9uVHlwZVZhbHVlUGFpcih0eXBlTmFtZSwgaW5kZXgsIHNlY29uZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwZndJbmRleCA9IGlzSW5jbHVzaXZlID8gMSA8PCBpbmRleCA6IGluZGV4OworICAgICAgICAgICAgICAgICAgICBhZGRDcml0ZXJpb25UeXBlVmFsdWVQYWlyKHR5cGVOYW1lLCBwZndJbmRleCwgdmFsdWVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWx1ZU5hbWUgPSBzdHJ0b2tfcihOVUxMLCAiLCIsICZjdHgpOworICAgICAgICB9CisgICAgICAgIGZyZWUodmFsdWVOYW1lcyk7CisgICAgfQorfQorCit2b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpsb2FkSW5jbHVzaXZlQ3JpdGVyaW9uVHlwZShjbm9kZSAqcm9vdCkKK3sKKyAgICBBTE9HX0FTU0VSVChyb290ICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKKyAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIGdJbmNsdXNpdmVDcml0ZXJpb25UeXBlVGFnLmNfc3RyKCkpOworICAgIGlmIChub2RlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsb2FkQ3JpdGVyaW9uVHlwZShub2RlLCB0cnVlKTsKK30KKwordm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZEV4Y2x1c2l2ZUNyaXRlcmlvblR5cGUoY25vZGUgKnJvb3QpCit7CisgICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7CisgICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBnRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZVRhZy5jX3N0cigpKTsKKyAgICBpZiAobm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbG9hZENyaXRlcmlvblR5cGUobm9kZSwgZmFsc2UpOworfQorCit2b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpwYXJzZUNoaWxkcmVuKGNub2RlICpyb290LCBzdHJpbmcgJmRlZmF1bHRWYWx1ZSwgc3RyaW5nICZ0eXBlKQoreworICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOworICAgIGNub2RlICpub2RlOworICAgIGZvciAobm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOyBub2RlICE9IE5VTEw7IG5vZGUgPSBub2RlLT5uZXh0KSB7CisgICAgICAgIEFMT0dfQVNTRVJUKG5vZGUgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOworCisgICAgICAgIGlmIChzdHJpbmcobm9kZS0+bmFtZSkgPT0gZ0RlZmF1bHRUYWcpIHsKKyAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IG5vZGUtPnZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKHN0cmluZyhub2RlLT5uYW1lKSA9PSBnVHlwZVRhZykgeworICAgICAgICAgICAgdHlwZSA9IG5vZGUtPnZhbHVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIEFMT0dFKCIlczogVW5yZWNvZ25pemVkICVzICVzIG5vZGUiLCBfX0ZVTkNUSU9OX18sIG5vZGUtPm5hbWUsIG5vZGUtPnZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUICpQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6Z2V0RWxlbWVudChjb25zdCBzdHJpbmcgJm5hbWUsIHN0ZDo6bWFwPHN0cmluZywgVCAqPiAmZWxlbWVudHNNYXApCit7CisgICAgcGFyYW1ldGVyTWFuYWdlckVsZW1lbnRTdXBwb3J0ZWQ8VD4oKTsKKyAgICB0eXBlbmFtZSBzdGQ6Om1hcDxzdHJpbmcsIFQgKj46Oml0ZXJhdG9yIGl0ID0gZWxlbWVudHNNYXAuZmluZChuYW1lKTsKKyAgICBBTE9HX0FTU0VSVChpdCAhPSBlbGVtZW50c01hcC5lbmQoKSwgIkVsZW1lbnQgIiA8PCBuYW1lIDw8ICIgbm90IGZvdW5kIik7CisgICAgcmV0dXJuIGl0LT5zZWNvbmQ7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY29uc3QgVCAqUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmdldEVsZW1lbnQoY29uc3Qgc3RyaW5nICZuYW1lLCBjb25zdCBzdGQ6Om1hcDxzdHJpbmcsIFQgKj4gJmVsZW1lbnRzTWFwKSBjb25zdAoreworICAgIHBhcmFtZXRlck1hbmFnZXJFbGVtZW50U3VwcG9ydGVkPFQ+KCk7CisgICAgdHlwZW5hbWUgc3RkOjptYXA8c3RyaW5nLCBUICo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGVsZW1lbnRzTWFwLmZpbmQobmFtZSk7CisgICAgQUxPR19BU1NFUlQoaXQgIT0gZWxlbWVudHNNYXAuZW5kKCksICJFbGVtZW50ICIgPDwgbmFtZSA8PCAiIG5vdCBmb3VuZCIpOworICAgIHJldHVybiBpdC0+c2Vjb25kOworfQorCit2b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpsb2FkQ3JpdGVyaWEoY25vZGUgKnJvb3QpCit7CisgICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7CisgICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBnQ3JpdGVyaW9uVGFnLmNfc3RyKCkpOworCisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiJXM6IG5vIGluY2x1c2l2ZSBjcml0ZXJpYSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7IG5vZGUgIT0gTlVMTDsgbm9kZSA9IG5vZGUtPm5leHQpIHsKKyAgICAgICAgbG9hZENyaXRlcmlvbihub2RlKTsKKyAgICB9Cit9CisKK3ZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmFkZENyaXRlcmlvbihjb25zdCBzdHJpbmcgJm5hbWUsIGNvbnN0IHN0cmluZyAmdHlwZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcgJmRlZmF1bHRMaXRlcmFsVmFsdWUpCit7CisgICAgQUxPR19BU1NFUlQobVBvbGljeUNyaXRlcmlhLmZpbmQoY3JpdGVyaW9uTmFtZSkgPT0gbVBvbGljeUNyaXRlcmlhLmVuZCgpLAorICAgICAgICAgICAgICAgICJSb3V0ZSBDcml0ZXJpb24gIiA8PCBjcml0ZXJpb25OYW1lIDw8ICIgYWxyZWFkeSBhZGRlZCIpOworCisgICAgSVNlbGVjdGlvbkNyaXRlcmlvblR5cGVJbnRlcmZhY2UgKmNyaXRlcmlvblR5cGUgPQorICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZUludGVyZmFjZT4odHlwZU5hbWUsIG1Qb2xpY3lDcml0ZXJpb25UeXBlcyk7CisKKyAgICBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPQorICAgICAgICAgICAgbVBmd0Nvbm5lY3Rvci0+Y3JlYXRlU2VsZWN0aW9uQ3JpdGVyaW9uKG5hbWUsIGNyaXRlcmlvblR5cGUpOworCisgICAgbVBvbGljeUNyaXRlcmlhW25hbWVdID0gY3JpdGVyaW9uOworICAgIGludCBudW1lcmljYWxWYWx1ZSA9IDA7CisgICAgaWYgKCFjcml0ZXJpb25UeXBlLT5nZXROdW1lcmljYWxWYWx1ZShkZWZhdWx0TGl0ZXJhbFZhbHVlLmNfc3RyKCksICBudW1lcmljYWxWYWx1ZSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOyB0cnlpbmcgdG8gYXBwbHkgaW52YWxpZCBkZWZhdWx0IGxpdGVyYWwgdmFsdWUgKCVzKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgZGVmYXVsdExpdGVyYWxWYWx1ZS5jX3N0cigpKTsKKyAgICB9CisgICAgY3JpdGVyaW9uLT5zZXRDcml0ZXJpb25TdGF0ZShudW1lcmljYWxWYWx1ZSk7Cit9CisKK3ZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmxvYWRDcml0ZXJpb24oY25vZGUgKnJvb3QpCit7CisgICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7CisgICAgY29uc3QgY2hhciAqY3JpdGVyaW9uTmFtZSA9IHJvb3QtPm5hbWU7CisKKyAgICBBTE9HX0FTU0VSVChtUG9saWN5Q3JpdGVyaWEuZmluZChjcml0ZXJpb25OYW1lKSA9PSBtUG9saWN5Q3JpdGVyaWEuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgIkNyaXRlcmlvbiAiIDw8IGNyaXRlcmlvbk5hbWUgPDwgIiBhbHJlYWR5IGFkZGVkIik7CisKKyAgICBzdHJpbmcgcGFyYW1LZXlOYW1lID0gIiI7CisgICAgc3RyaW5nIHBhdGggPSAiIjsKKyAgICBzdHJpbmcgdHlwZU5hbWUgPSAiIjsKKyAgICBzdHJpbmcgZGVmYXVsdFZhbHVlID0gIiI7CisKKyAgICBwYXJzZUNoaWxkcmVuKHJvb3QsIGRlZmF1bHRWYWx1ZSwgdHlwZU5hbWUpOworCisgICAgYWRkQ3JpdGVyaW9uKGNyaXRlcmlvbk5hbWUsIHR5cGVOYW1lLCBkZWZhdWx0VmFsdWUpOworfQorCit2b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpsb2FkQ29uZmlnKGNub2RlICpyb290KQoreworICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOworICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgZ1BvbGljeUNvbmZUYWcuY19zdHIoKSk7CisgICAgaWYgKG5vZGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiJXM6IENvdWxkIG5vdCBmaW5kIG5vZGUgZm9yIHBmdyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR0QoIiVzOiBMb2FkaW5nIGNvbmYgZm9yIHBmdyIsIF9fRlVOQ1RJT05fXyk7CisgICAgbG9hZEluY2x1c2l2ZUNyaXRlcmlvblR5cGUobm9kZSk7CisgICAgbG9hZEV4Y2x1c2l2ZUNyaXRlcmlvblR5cGUobm9kZSk7CisgICAgbG9hZENyaXRlcmlhKG5vZGUpOworfQorCisKK3N0YXR1c190IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpsb2FkQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZpZyhjb25zdCBjaGFyICpwYXRoKQoreworICAgIEFMT0dfQVNTRVJUKHBhdGggIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZTogZW1wdHkgcGF0aCIpOworICAgIGNub2RlICpyb290OworICAgIGNoYXIgKmRhdGE7CisgICAgQUxPR0QoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBkYXRhID0gKGNoYXIgKilsb2FkX2ZpbGUocGF0aCwgTlVMTCk7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisgICAgcm9vdCA9IGNvbmZpZ19ub2RlKCIiLCAiIik7CisgICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiVW5hYmxlIHRvIGFsbG9jYXRlIGEgY29uZmlndXJhdGlvbiBub2RlIik7CisgICAgY29uZmlnX2xvYWQocm9vdCwgZGF0YSk7CisKKyAgICBsb2FkQ29uZmlnKHJvb3QpOworCisgICAgY29uZmlnX2ZyZWUocm9vdCk7CisgICAgZnJlZShyb290KTsKKyAgICBmcmVlKGRhdGEpOworICAgIEFMT0dEKCIlczogbG9hZGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2Jvb2wgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmlzU3RhcnRlZCgpCit7CisgICAgcmV0dXJuIG1QZndDb25uZWN0b3IgJiYgbVBmd0Nvbm5lY3Rvci0+aXNTdGFydGVkKCk7Cit9CisKK3N0YXR1c190IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKQoreworICAgIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiA9IG1Qb2xpY3lDcml0ZXJpYVtnUGhvbmVTdGF0ZUNyaXRlcmlvblRhZ107CisgICAgaWYgKCFpc1ZhbHVlVmFsaWRGb3JDcml0ZXJpb24oY3JpdGVyaW9uLCBzdGF0aWNfY2FzdDxpbnQ+KG1vZGUpKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBjcml0ZXJpb24tPnNldENyaXRlcmlvblN0YXRlKChpbnQpKG1vZGUpKTsKKyAgICBhcHBseVBsYXRmb3JtQ29uZmlndXJhdGlvbigpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYXVkaW9fbW9kZV90IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpnZXRQaG9uZVN0YXRlKCkgY29uc3QKK3sKKyAgICBjb25zdCBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPQorICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnUGhvbmVTdGF0ZUNyaXRlcmlvblRhZywgbVBvbGljeUNyaXRlcmlhKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YXVkaW9fbW9kZV90Pihjcml0ZXJpb24tPmdldENyaXRlcmlvblN0YXRlKCkpOworfQorCitzdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6c2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQoreworICAgIC8vIEB0b2RvOiByZXR1cm4gYW4gZXJyb3Igb24gYSB1bnN1cHBvcnRlZCB2YWx1ZQorICAgIGlmICh1c2FnZSA+IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0gbVBvbGljeUNyaXRlcmlhW2dGb3JjZVVzZUNyaXRlcmlvblRhZ1t1c2FnZV1dOworICAgIGlmICghaXNWYWx1ZVZhbGlkRm9yQ3JpdGVyaW9uKGNyaXRlcmlvbiwgc3RhdGljX2Nhc3Q8aW50Pihjb25maWcpKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBjcml0ZXJpb24tPnNldENyaXRlcmlvblN0YXRlKChpbnQpY29uZmlnKTsKKyAgICBhcHBseVBsYXRmb3JtQ29uZmlndXJhdGlvbigpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6Z2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdAoreworICAgIC8vIEB0b2RvOiByZXR1cm4gYW4gZXJyb3Igb24gYSB1bnN1cHBvcnRlZCB2YWx1ZQorICAgIGlmICh1c2FnZSA+IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UKSB7CisgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKKyAgICB9CisgICAgY29uc3QgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KKyAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ0ZvcmNlVXNlQ3JpdGVyaW9uVGFnW3VzYWdlXSwgbVBvbGljeUNyaXRlcmlhKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdD4oY3JpdGVyaW9uLT5nZXRDcml0ZXJpb25TdGF0ZSgpKTsKK30KKworYm9vbCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6aXNWYWx1ZVZhbGlkRm9yQ3JpdGVyaW9uKElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWVUb0NoZWNrKQoreworICAgIGNvbnN0IElTZWxlY3Rpb25Dcml0ZXJpb25UeXBlSW50ZXJmYWNlICppbnRlcmZhY2UgPSBjcml0ZXJpb24tPmdldENyaXRlcmlvblR5cGUoKTsKKyAgICBzdHJpbmcgbGl0ZXJhbFZhbHVlOworICAgIHJldHVybiBpbnRlcmZhY2UtPmdldExpdGVyYWxWYWx1ZSh2YWx1ZVRvQ2hlY2ssIGxpdGVyYWxWYWx1ZSk7Cit9CisKK3N0YXR1c190IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLypkZXZpY2VBZGRyZXMqLykKK3sKKyAgICBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPSBOVUxMOworCisgICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKGRldmljZXMpKSB7CisgICAgICAgIGNyaXRlcmlvbiA9IG1Qb2xpY3lDcml0ZXJpYVtnT3V0cHV0RGV2aWNlQ3JpdGVyaW9uVGFnXTsKKyAgICB9IGVsc2UgaWYgKGRldmljZXMgJiBBVURJT19ERVZJQ0VfQklUX0lOKSB7CisgICAgICAgIGNyaXRlcmlvbiA9IG1Qb2xpY3lDcml0ZXJpYVtnSW5wdXREZXZpY2VDcml0ZXJpb25UYWddOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVFlQRTsKKyAgICB9CisgICAgaWYgKGNyaXRlcmlvbiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciBkZXZpY2VzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIGludDMyX3QgcHJldmlvdXNEZXZpY2VzID0gY3JpdGVyaW9uLT5nZXRDcml0ZXJpb25TdGF0ZSgpOworICAgIHN3aXRjaCAoc3RhdGUpCisgICAgeworICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEU6CisgICAgICAgIGNyaXRlcmlvbi0+c2V0Q3JpdGVyaW9uU3RhdGUocHJldmlvdXNEZXZpY2VzIHw9IGRldmljZXMpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRToKKyAgICAgICAgaWYgKGRldmljZXMgJiBBVURJT19ERVZJQ0VfQklUX0lOKSB7CisgICAgICAgICAgICBkZXZpY2VzICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgICAgICB9CisgICAgICAgIGNyaXRlcmlvbi0+c2V0Q3JpdGVyaW9uU3RhdGUocHJldmlvdXNEZXZpY2VzICY9IH5kZXZpY2VzKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBhcHBseVBsYXRmb3JtQ29uZmlndXJhdGlvbigpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6YXBwbHlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKQoreworICAgIG1QZndDb25uZWN0b3ItPmFwcGx5Q29uZmlndXJhdGlvbnMoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9hdWRpb19wb2xpY3lfY3JpdGVyaWFfY29uZi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvYXVkaW9fcG9saWN5X2NyaXRlcmlhX2NvbmYuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41OGU3MTM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvYXVkaW9fcG9saWN5X2NyaXRlcmlhX2NvbmYuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICBEZWZpbml0aW9ucyBmb3IgYXVkaW8gcG9saWN5IGNyaXRlcmlhIGNvbmZpZ3VyYXRpb24gZmlsZSAoYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYpICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgIEBUT0RPOiBzY3JpcHRlZCBmcm9tIGF1ZGlvLmggJiBhdWRpb19wb2xpY3ksaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdBdWRpb1BvbGljeUNyaXRlcmlhQ29uZkZpbGVQYXRoID0KKyAgICAiL3N5c3RlbS9ldGMvYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYiOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdBdWRpb1BvbGljeUNyaXRlcmlhVmVuZG9yQ29uZkZpbGVQYXRoID0KKyAgICAiL3ZlbmRvci9ldGMvYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYiOworCisvKioKKyAqIFBGVyBpbnN0YW5jZXMgdGFncworICovCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdQb2xpY3lDb25mVGFnID0gIlBvbGljeSI7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdEZWZhdWx0VGFnID0gIkRlZmF1bHQiOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnVHlwZVRhZyA9ICJUeXBlIjsKKworLyoqCisgKiBQRlcgZWxlbWVudHMgdGFncworICovCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdJbmNsdXNpdmVDcml0ZXJpb25UeXBlVGFnID0gIkluY2x1c2l2ZUNyaXRlcmlvblR5cGUiOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZVRhZyA9ICJFeGNsdXNpdmVDcml0ZXJpb25UeXBlIjsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ0NyaXRlcmlvblRhZyA9ICJDcml0ZXJpb24iOworCisvKioKKyAqIFBGVyBrbm93biBjcml0ZXJpb24gdGFncworICovCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdJbnB1dERldmljZUNyaXRlcmlvblRhZyA9ICJBdmFpbGFibGVJbnB1dERldmljZXMiOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnT3V0cHV0RGV2aWNlQ3JpdGVyaW9uVGFnID0gIkF2YWlsYWJsZU91dHB1dERldmljZXMiOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnUGhvbmVTdGF0ZUNyaXRlcmlvblRhZyA9ICJUZWxlcGhvbnlNb2RlIjsKKworLyoqCisgKiBPcmRlciBNVVNUIGJlIGFsaWduIHdpdGggZGVmaW50aWlvbiBvZiBhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3Qgd2l0aGluIGF1ZGlvX3BvbGljeS5oCisgKi8KK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBnRm9yY2VVc2VDcml0ZXJpb25UYWdbQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlRdID0KK3sKKyAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSA9ICAgICAgICAiRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiwKKyAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gPSAgICAgICAgICAgICAgICAiRm9yY2VVc2VGb3JNZWRpYSIsCisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEXSA9ICAgICAgICAgICAgICAgIkZvcmNlVXNlRm9yUmVjb3JkIiwKKyAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLXSA9ICAgICAgICAgICAgICAgICAiRm9yY2VVc2VGb3JEb2NrIiwKKyAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID0gICAgICAgICAgICAgICAiRm9yY2VVc2VGb3JTeXN0ZW0iLAorICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPXSA9ICAgICJGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyIKK307CisKKworCisKKworCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9jb25maWcvYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9jb25maWcvYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWIwNDZhOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2NvbmZpZy9hdWRpb19wb2xpY3lfY3JpdGVyaWEuY29uZgpAQCAtMCwwICsxLDEzNyBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEBOT1RFOgorIyBBdWRpbyBQb2xpY3kgQ3JpdGVyaWEgZmlsZSBleGFtcGxlIGZvciBnZW5lcmljIGRldmljZSBidWlsZAorIworIyBBbnkgdmVuZG9yIHNoYWxsIGhhdmUgaXRzIG93biBjb25maWd1cmF0aW9uIHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZyBkZXZpY2UgZm9sZGVyCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENyaXRlcmlvbiB0eXBlIEV4YW1wbGU6CisjIEZvciBlYWNoIGNyaXRlcmlvbiwgYSBjb3VwbGUgb2YgbnVtZXJpY2FsLCBsaXRlcmFsIHZhbHVlcyBtdXN0IGJlIHByb3ZpZGVkIHRvIHRoZSBQRlcuCisjIFRoZSBudW1lcmljYWwgcGFydCBpcyBub3QgbWFuZGF0b3J5LiBJZiBub3QgZmlsbGVkIGJ5IHRoZSB1c2VyLCBhIGRlZmF1bHQgbnVtZXJpY2FsIHZhbHVlIHdpbGwgYmUKKyMgYXV0b21hdGljYWxseSBwcm92aWRlZCBieSBhdWRpbyBIQUwgdXNpbmcgdGhlIGZvbGxvd2luZyBsb2dpYzoKKyMgICAtIEV4Y2x1c2l2ZSBjcml0ZXJpb246CisjICAgICAgICAgICogMCAtPiBmaXJzdCBsaXRlcmFsIHZhbHVlLAorIyAgICAgICAgICAqIDEgLT4gc2Vjb25kIGxpdGVyYWwgdmFsdWUsCisjICAgICAgICAgICAgICAgLi4uCisjICAgICAgICAgICogTiAtPiAoTisxKXRoIGxpdGVyYWwgdmFsdWUuCisjICAgLSBJbmNsdXNpdmUgY3JpdGVyaW9uOgorIyAgICAgICAgICAqIDEgPDwgMCAtPiBmaXJzdCBsaXRlcmFsIHZhbHVlLAorIyAgICAgICAgICAqIDEgPDwgMSAtPiBzZWNvbmQgbGl0ZXJhbCB2YWx1ZSwKKyMgICAgICAgICAgICAgICAuLi4KKyMgICAgICAgICAgKiAxIDw8IE4gLT4gKE4rMSl0aCBsaXRlcmFsIHZhbHVlLAorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFBvbGljeSB7CisjICAgIEluY2x1c2l2ZUNyaXRlcmlvblR5cGV8RXhjbHVzaXZlQ3JpdGVyaW9uVHlwZSB7CisjICAgICAgICA8Q3JpdGVyaW9uIE5hbWU+ICBbbnVtZXJpY2FsIHZhbHVlIDE6XTxsaXRlcmFsIHZhbHVlIDE+LFtudW1lcmljYWwgdmFsdWUgMjpdPGxpdGVyYWwgdmFsdWUgMj4sPGxpdGVyYWwgdmFsdWUgMz4sLi4uCisjICAgIH0KKyMgfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ3JpdGVyaW9uOgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFBvbGljeSB7CisjICAgIENyaXRlcmlvbiB7CisjICAgICAgICA8Q3JpdGVyaW9uIE5hbWU+IHsKKyMgICAgICAgICAgICBUeXBlICAgICAgICAgICAgPENyaXRlcmlvbiB0eXBlIG5hbWU+CisjICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIDxkZWZhdWx0IHZhbHVlIG9mIHRoZSBjcml0ZXJpb24+CisjICAgICAgICB9CisjICAgIH0KKyMgfQorCitQb2xpY3kgeworICAgIEluY2x1c2l2ZUNyaXRlcmlvblR5cGUgeworICAgICAgICAjCisgICAgICAgICMgRE8gTk9UIENIQU5HRSBPUkRFUi4gVGhpcyBkZWZpbml0aW9uIG11c3QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mCisgICAgICAgICMgQVVESU9fREVWSUNFX09VVF8qIHdpdGhpbiA8c3lzdGVtL2F1ZGlvLmg+IGZpbGUgb2YgYW5kcm9pZC4KKyAgICAgICAgIworICAgICAgICBPdXRwdXREZXZpY2VzTWFza1R5cGUgICBFYXJwaWVjZSxTcGVha2VyLFdpcmVkSGVhZHNldCxXaXJlZEhlYWRwaG9uZSxCbHVldG9vdGhTY28sQmx1ZXRvb3RoU2NvSGVhZHNldCxCbHVldG9vdGhTY29DYXJraXQsQmx1ZXRvb3RoQTJkcCxCbHVldG9vdGhBMmRwSGVhZHBob25lcyxCbHVldG9vdGhBMmRwU3BlYWtlcixIZG1pLEFubGdEb2NrSGVhZHNldCxEZ3RsRG9ja0hlYWRzZXQsVXNiQWNjZXNzb3J5LFVzYkRldmljZSxSZW1vdGVTdWJtaXgsVGVsZXBob255VHgsTGluZSxIZG1pQXJjLFNwZGlmLEZtLEF1eExpbmUsU3BlYWtlclNhZmUKKyAgICAgICAgIworICAgICAgICAjIERPIE5PVCBDSEFOR0UgT1JERVIuIFRoaXMgZGVmaW5pdGlvbiBtdXN0IGJlIGFsaWduZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZgorICAgICAgICAjIEFVRElPX0RFVklDRV9JTl8qIHdpdGhpbiA8c3lzdGVtL2F1ZGlvLmg+IGZpbGUgb2YgYW5kcm9pZC4KKyAgICAgICAgIyBOb3RlIGFsc28gdGhhdCBkaXJlY3Rpb24gYml0IHdpbGwgYmUgZGVjaW1hdGVkIGJ5IEF1ZGlvSEFMIGluIG9yZGVyIHRvIGFsbG93IHVzaW5nIGEgbWFzaworICAgICAgICAjIHdpdGggdGhlIGNhcmRpbmFsaXR5IG9mIDEgYmV0d2VlbiBhIGJpdCBhbmQgYW4gaW5wdXQgZGV2aWNlLgorICAgICAgICAjCisgICAgICAgIElucHV0RGV2aWNlc01hc2tUeXBlICAgIENvbW11bmljYXRpb24sQW1iaWVudCxCdWlsdGluTWljLEJsdWV0b290aFNjb0hlYWRzZXQsV2lyZWRIZWFkc2V0LEhkbWksVGVsZXBob255UngsQmFja01pYyxSZW1vdGVTdWJtaXgsQW5sZ0RvY2tIZWFkc2V0LERndGxEb2NrSGVhZHNldCxVc2JBY2Nlc3NvcnksVXNiRGV2aWNlLEZtVHVuZXIsVHZUdW5lLExpbmUsU3BkaWYsQmx1ZXRvb3RoQTJkcCxMb29wYmFjaworICAgIH0KKyAgICBFeGNsdXNpdmVDcml0ZXJpb25UeXBlIHsKKyAgICAgICAgIworICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlIGF1ZGlvX21vZGVfdAorICAgICAgICAjIGZyb20gc3lzdGVtL2F1ZGlvLmgKKyAgICAgICAgIworICAgICAgICBBbmRyb2lkTW9kZVR5cGUgICAgIDA6Tm9ybWFsLDE6UmluZ1RvbmUsMjpJbkNhbGwsMzpJbkNvbW11bmljYXRpb24KKyAgICAgICAgIworICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlCisgICAgICAgICMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jb25maWdfdCBmcm9tIHN5c3RlbS9hdWRpby5oCisgICAgICAgICMKKyAgICAgICAgRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uVHlwZSAgICAwOkZvcmNlTm9uZSwxOkZvcmNlU3BlYWtlciwzOkZvcmNlQnRTY28KKyAgICAgICAgIworICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlCisgICAgICAgICMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jb25maWdfdCBmcm9tIHN5c3RlbS9hdWRpby5oCisgICAgICAgICMKKyAgICAgICAgRm9yY2VVc2VGb3JNZWRpYVR5cGUgICAgICAgICAgICAwOkZvcmNlTm9uZSwxOkZvcmNlU3BlYWtlciwyOkZvcmNlSGVhZHBob25lcyw0OkZvcmNlQnRBMmRwLDU6Rm9yY2VXaXJlZEFjY2Vzc29yeSw4OkZvcmNlQW5hbG9nRG9jayw5OkZvcmNlRGlnaXRhbERvY2ssMTA6Rm9yY2VOb0J0QTJkcAorICAgICAgICAjCisgICAgICAgICMgVGhlIHZhbHVlcyBvZiB0aGUgbW9kZSBNVVNUIGJlIGFsaWduZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKKyAgICAgICAgIyBhdWRpb19wb2xpY3lfZm9yY2VkX2NvbmZpZ190IGZyb20gc3lzdGVtL2F1ZGlvLmgKKyAgICAgICAgIworICAgICAgICBGb3JjZVVzZUZvclJlY29yZFR5cGUgICAgICAgICAgIDA6Rm9yY2VOb25lLDM6Rm9yY2VCdFNjbyw1OkZvcmNlV2lyZWRBY2Nlc3NvcnkKKyAgICAgICAgIworICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlCisgICAgICAgICMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jb25maWdfdCBmcm9tIHN5c3RlbS9hdWRpby5oCisgICAgICAgICMKKyAgICAgICAgRm9yY2VVc2VGb3JEb2NrVHlwZSAgICAgICAgICAgICAwOkZvcmNlTm9uZSw1OkZvcmNlV2lyZWRBY2Nlc3NvcnksNjpGb3JjZUJ0Q2FyRG9jayw3OkZvcmNlQnREZXNrRG9jayw4OkZvcmNlQW5hbG9nRG9jayw5OkZvcmNlRGlnaXRhbERvY2sKKyAgICAgICAgIworICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlCisgICAgICAgICMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jb25maWdfdCBmcm9tIHN5c3RlbS9hdWRpby5oCisgICAgICAgICMKKyAgICAgICAgRm9yY2VVc2VGb3JTeXN0ZW1UeXBlICAgICAgICAgICAwOkZvcmNlTm9uZSwxMTpGb3JjZVN5c3RlbUVuZm9yY2VkCisgICAgICAgICMKKyAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQorICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAorICAgICAgICAjCisgICAgICAgIEZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvVHlwZSAgMDpGb3JjZU5vbmUsMTI6Rm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKKyAgICB9CisKKyAgICBDcml0ZXJpb24geworICAgICAgICBBdmFpbGFibGVJbnB1dERldmljZXMgeworICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIElucHV0RGV2aWNlc01hc2tUeXBlCisgICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgbm9uZQorICAgICAgICB9CisgICAgICAgIEF2YWlsYWJsZU91dHB1dERldmljZXMgeworICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIE91dHB1dERldmljZXNNYXNrVHlwZQorICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIG5vbmUKKyAgICAgICAgfQorICAgICAgICBUZWxlcGhvbnlNb2RlIHsKKyAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBBbmRyb2lkTW9kZVR5cGUKKyAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBOb3JtYWwKKyAgICAgICAgfQorICAgICAgICBGb3JjZVVzZUZvckNvbW11bmljYXRpb24geworICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvblR5cGUKKyAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKKyAgICAgICAgfQorICAgICAgICBGb3JjZVVzZUZvck1lZGlhIHsKKyAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBGb3JjZVVzZUZvck1lZGlhVHlwZQorICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIEZvcmNlTm9uZQorICAgICAgICB9CisgICAgICAgIEZvcmNlVXNlRm9yUmVjb3JkIHsKKyAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBGb3JjZVVzZUZvclJlY29yZFR5cGUKKyAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKKyAgICAgICAgfQorICAgICAgICBGb3JjZVVzZUZvckRvY2sgeworICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEZvcmNlVXNlRm9yRG9ja1R5cGUKKyAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKKyAgICAgICAgfQorICAgICAgICBGb3JjZVVzZUZvclN5c3RlbSB7CisgICAgICAgICAgICBUeXBlICAgICAgICAgICAgRm9yY2VVc2VGb3JTeXN0ZW1UeXBlCisgICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgRm9yY2VOb25lCisgICAgICAgIH0KKyAgICAgICAgRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8geworICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvVHlwZQorICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIEZvcmNlTm9uZQorICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9pbmNsdWRlL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9pbmNsdWRlL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2M1ZjJjMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2luY2x1ZGUvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuaApAQCAtMCwwICsxLDI4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JXTG9jay5oPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK2NsYXNzIENQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvcjsKK2NsYXNzIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U7CitjbGFzcyBJU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZUludGVyZmFjZTsKK3N0cnVjdCBjbm9kZTsKKworY2xhc3MgUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3JMb2dnZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkCit7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit7CisKK2NsYXNzIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyCit7Citwcml2YXRlOgorICAgIHR5cGVkZWYgc3RkOjpwYWlyPGludCwgY29uc3QgY2hhciAqPiBDcml0ZXJpb25UeXBlVmFsdWVQYWlyOworCisgICAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqPiBDcml0ZXJpb25Db2xsZWN0aW9uOworICAgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIElTZWxlY3Rpb25Dcml0ZXJpb25UeXBlSW50ZXJmYWNlICo+IENyaXRlcmlvblR5cGVDb2xsZWN0aW9uOworICAgIHR5cGVkZWYgQ3JpdGVyaW9uQ29sbGVjdGlvbjo6aXRlcmF0b3IgQ3JpdGVyaW9uTWFwSXRlcmF0b3I7CisgICAgdHlwZWRlZiBDcml0ZXJpb25Db2xsZWN0aW9uOjpjb25zdF9pdGVyYXRvciBDcml0ZXJpb25NYXBDb25zdEl0ZXJhdG9yOworICAgIHR5cGVkZWYgQ3JpdGVyaW9uVHlwZUNvbGxlY3Rpb246Oml0ZXJhdG9yIENyaXRlcmlvblR5cGVNYXBJdGVyYXRvcjsKKyAgICB0eXBlZGVmIENyaXRlcmlvblR5cGVDb2xsZWN0aW9uOjpjb25zdF9pdGVyYXRvciBDcml0ZXJpYVR5cGVNYXBDb25zdEl0ZXJhdG9yOworCitwdWJsaWM6CisgICAgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIoKTsKKyAgICB+UGFyYW1ldGVyTWFuYWdlcldyYXBwZXIoKTsKKworICAgIC8qKgorICAgICAqIFN0YXJ0cyB0aGUgcGxhdGZvcm0gc3RhdGUgc2VydmljZS4KKyAgICAgKiBJdCBzdGFydHMgdGhlIHBhcmFtZXRlciBmcmFtZXdvcmsgcG9saWN5IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHJldHVybiBOT19FUlJPUiBpZiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzdGFydCgpOworCisgICAgLyoqCisgICAgICogVGhlIGZvbGxvd2luZyBBUEkgd3JhcCBwb2xpY3kgYWN0aW9uIHRvIGNyaXRlcmlhCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlIHBsYXRmb3JtIHN0YXRlIHdhcyBjb3JyZWN0bHkgc3RhcnRlZCAoaWUgdGhlIHBvbGljeSBwYXJhbWV0ZXIgbWFuYWdlcgorICAgICAqIGhhcyBiZWVuIGluc3RhbnRpYXRlZCBhbmQgc3RhcnRlZCBjb3JyZWN0bHkpLgorICAgICAqCisgICAgICogQHRvZG86IG1hcCBvbiBpbml0Q2hlY2s/CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcGxhdGZvcm0gc3RhdGUgaXMgc3RhcnRlZCBjb3JyZWN0bHksIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIGlzU3RhcnRlZCgpOworCisgICAgLyoqCisgICAgICogU2V0IFRlbGVwaG9ueSBNb2RlLgorICAgICAqIEl0IHdpbGwgc2V0IHRoZSB0ZWxlcGhvbnkgbW9kZSBjcml0ZXJpb24gYWNjb3JkaW5nbHkgYW5kIGFwcGx5IHRoZSBjb25maWd1cmF0aW9uIGluIG9yZGVyCisgICAgICogdG8gc2VsZWN0IHRoZSByaWdodCBjb25maWd1cmF0aW9uIG9uIGRvbWFpbnMgZGVwZW5kaW5nIG9uIHRoaXMgbW9kZSBjcml0ZXJpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIG1vZGU6IEFuZHJvaWQgUGhvbmUgc3RhdGUgKG5vcm1hbCwgcmluZ3RvbmUsIGNzdiwgaW4gY29tbXVuaWNhdGlvbikKKyAgICAgKgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgY3JpdGVyaW9uIHNldCBjb3JyZWN0bHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IG1vZGUpOworCisgICAgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFNldCBGb3JjZSBVc2UgY29uZmlnIGZvciBhIGdpdmVuIHVzYWdlLgorICAgICAqIEl0IHdpbGwgc2V0IHRoZSBjb3JyZXNwb25kaW5nIHBvbGljeSBwYXJhbWV0ZXIgZnJhbWV3b3JrIGNyaXRlcmlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdXNhZ2UgZm9yIHdoaWNoIGEgY29uZmlndXJhdGlvbiBzaGFsbCBiZSBmb3JjZWQuCisgICAgICogQHBhcmFtW2luXSBjb25maWcgd2lzaGVkIHRvIGJlIGZvcmNlZCBmb3IgdGhlIGdpdmVuIHNoYWxsLgorICAgICAqCisgICAgICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgY3JpdGVyaW9uIHdhcyBzZXQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZSAoZS5nLiBjb25maWcgbm90CisgICAgICogYWxsb3dlZCBhIGdpdmVuIHVzYWdlLi4uKQorICAgICAqLworICAgIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOworCisgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpIGNvbnN0OworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb25uZWN0aW9uIHN0YXRlIG9mIGRldmljZShzKS4KKyAgICAgKiBJdCB3aWxsIHNldCB0aGUgYXNzb2NpYXRlZCBwb2xpY3kgcGFyYW1ldGVyIGZyYW1ld29yayBjcml0ZXJpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGRldmljZXMgbWFzayBvZiBkZXZpY2VzIGZvciB3aGljaCB0aGUgc3RhdGUgaGFzIGNoYW5nZWQuCisgICAgICogQHBhcmFtW2luXSBzdGF0ZSBvZiBhdmFpbGFiaWxpdHkgb2YgdGhpcyh0aGVzZSkgZGV2aWNlKHMpLgorICAgICAqIEBwYXJhbVtpbl0gZGV2aWNlQWRkcmVzczogdGhlIG1hc2sgbWlnaHQgbm90IGJlIGVub3VnaCwgYXMgaXQgbWF5IHJlcHJlc2VudHMgYSB0eXBlIG9mCisgICAgICogICAgICAgICAgICBkZXZpY2UsIHNvIGFkZHJlc3Mgb2YgdGhlIGRldmljZSB3aWxsIGhlbHAgcHJlY2lzZSBpZGVudGlmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgZGV2aWNlcyBjcml0ZXJpb24gdXBkYXRlZCBjb3JyZWN0bHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VBZGRyZXNzKTsKKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBBcHBseSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgcGxhdGZvcm0gb24gdGhlIHBvbGljeSBwYXJhbWV0ZXIgbWFuYWdlci4KKyAgICAgKiBPbmNlIGFsbCB0aGUgY3JpdGVyaWEgaGF2ZSBiZWVuIHNldCwgdGhlIGNsaWVudCBvZiB0aGUgcGxhdGZvcm0gc3RhdGUgbXVzdCBjYWxsCisgICAgICogdGhpcyBmdW5jdGlvbiBpbiBvcmRlciB0byBoYXZlIHRoZSByb3V0ZSBQRlcgdGFraW5nIGludG8gYWNjb3VudCB0aGVzZSBjcml0ZXJpYS4KKyAgICAgKgorICAgICAqIE9QRU5TOiBzaGFsbCB3ZSBleHBvc2UgdGhpcz8KKyAgICAgKiAgICAgIC0gWWVzIGlmIGF0b21pYyBzZXQgb3BlcmF0aW9uLgorICAgICAqICAgICAgICAgIEluIHRoaXMgY2FzZSwgYWJzdHJhY3QgaXQgYmVoaW5kIHRoZSAiU1RBR0UgQU5EIENPTU1JVCIgcGF0dGVybgorICAgICAqICAgICAgLSBubyBpZiBuZWVkIHRvIHNldCBtb3JlIHRoYW4gb25lIGJlZm9yZSB0cmlnZ2VyaW5nIGFuIGFwcGx5IGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgdm9pZCBhcHBseVBsYXRmb3JtQ29uZmlndXJhdGlvbigpOworCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgY3JpdGVyaW9uIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcGF0aCBDcml0ZXJpb24gY29uZiBmaWxlIHBhdGguCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlzIHBhcnNpbmcgc3VjY2Vzc2Z1bCwgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAgICovCisgICAgc3RhdHVzX3QgbG9hZEF1ZGlvUG9saWN5Q3JpdGVyaWFDb25maWcoY29uc3QgY2hhciAqcGF0aCk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjcml0ZXJpb24gdHlwZSB0byBBdWRpb1BvbGljeVBmdy4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdHlwZU5hbWUgb2YgdGhlIFBGVyBjcml0ZXJpb24gdHlwZS4KKyAgICAgKiBAcGFyYW1baW5dIGlzSW5jbHVzaXZlIGF0dHJpYnV0ZSBvZiB0aGUgY3JpdGVyaW9uIHR5cGUuCisgICAgICovCisgICAgdm9pZCBhZGRDcml0ZXJpb25UeXBlKGNvbnN0IHN0ZDo6c3RyaW5nICZ0eXBlTmFtZSwgYm9vbCBpc0luY2x1c2l2ZSk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjcml0ZXJpb24gdHlwZSB2YWx1ZSBwYWlyIHRvIEF1ZGlvUG9saWN5UGZ3LgorICAgICAqCisgICAgICogQHBhcmFtW2luXSB0eXBlTmFtZSBjcml0ZXJpb24gdHlwZSBuYW1lIHRvIHdoaWNoIHRoaXMgdmFsdWUgcGFpciBpcyBhZGRlZCB0by4KKyAgICAgKiBAcGFyYW1baW5dIG51bWVyaWMgcGFydCBvZiB0aGUgdmFsdWUgcGFpci4KKyAgICAgKiBAcGFyYW1baW5dIGxpdGVyYWwgcGFydCBvZiB0aGUgdmFsdWUgcGFpci4KKyAgICAgKi8KKyAgICB2b2lkIGFkZENyaXRlcmlvblR5cGVWYWx1ZVBhaXIoY29uc3Qgc3RkOjpzdHJpbmcgJnR5cGVOYW1lLCB1aW50MzJfdCBudW1lcmljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbGl0ZXJhbCk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBjcml0ZXJpb24gdG8gQXVkaW9Qb2xpY3lQZncuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIG5hbWUgb2YgdGhlIFBGVyBjcml0ZXJpb24uCisgICAgICogQHBhcmFtW2luXSB0eXBlTmFtZSBjcml0ZXJpb24gdHlwZSBuYW1lIHRvIHdoaWNoIHRoaXMgY3JpdGVyaW9uIGlzIGFzc29jaWF0ZWQgdG8uCisgICAgICogQHBhcmFtW2luXSBkZWZhdWx0TGl0ZXJhbFZhbHVlIG9mIHRoZSBQRlcgY3JpdGVyaW9uLgorICAgICAqLworICAgIHZvaWQgYWRkQ3JpdGVyaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZ0eXBlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZGVmYXVsdExpdGVyYWxWYWx1ZSk7CisgICAgLyoqCisgICAgICogUGFyc2UgYW5kIGxvYWQgdGhlIGluY2x1c2l2ZSBjcml0ZXJpb24gdHlwZSBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcm9vdCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICovCisgICAgdm9pZCBsb2FkSW5jbHVzaXZlQ3JpdGVyaW9uVHlwZShjbm9kZSAqcm9vdCk7CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhbmQgbG9hZCB0aGUgZXhjbHVzaXZlIGNyaXRlcmlvbiB0eXBlIGZyb20gY29uZmlndXJhdGlvbiBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSByb290IG5vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgKi8KKyAgICB2b2lkIGxvYWRFeGNsdXNpdmVDcml0ZXJpb25UeXBlKGNub2RlICpyb290KTsKKworICAgIC8qKgorICAgICAqIFBhcnNlIGFuZCBsb2FkIHRoZSBjcml0ZXJpYSBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcm9vdCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICovCisgICAgdm9pZCBsb2FkQ3JpdGVyaWEoY25vZGUgKnJvb3QpOworCisgICAgLyoqCisgICAgICogUGFyc2UgYW5kIGxvYWQgYSBjcml0ZXJpb24gZnJvbSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorICAgICAqLworICAgIHZvaWQgbG9hZENyaXRlcmlvbihjbm9kZSAqcm9vdCk7CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhbmQgbG9hZCB0aGUgY3JpdGVyaW9uIHR5cGVzIGZyb20gY29uZmlndXJhdGlvbiBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSByb290IG5vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQorICAgICAqIEBwYXJhbVtpbl0gaXNJbmNsdXNpdmUgdHJ1ZSBpZiBpbmNsdXNpdmUsIGZhbHNlIGlzIGV4Y2x1c2l2ZS4KKyAgICAgKi8KKyAgICB2b2lkIGxvYWRDcml0ZXJpb25UeXBlKGNub2RlICpyb290LCBib29sIGlzSW5jbHVzaXZlKTsKKworICAgIC8qKgorICAgICAqIExvYWQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcm9vdCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgICovCisgICAgdm9pZCBsb2FkQ29uZmlnKGNub2RlICpyb290KTsKKworICAgIC8qKgorICAgICAqIFBhcnNlIGFuZCBsb2FkIHRoZSBjaGlkcmVuIG5vZGUgZnJvbSBhIGdpdmVuIHJvb3Qgbm9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gcm9vdCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKKyAgICAgKiBAcGFyYW1bb3V0XSBkZWZhdWx0VmFsdWUgb2YgdGhlIHBhcmFtZXRlciBtYW5hZ2VyIGVsZW1lbnQgdG8gcmV0cmlldmUuCisgICAgICogQHBhcmFtW291dF0gdHlwZSBvZiB0aGUgcGFyYW1ldGVyIG1hbmFnZXIgZWxlbWVudCB0byByZXRyaWV2ZS4KKyAgICAqLworICAgIHZvaWQgcGFyc2VDaGlsZHJlbihjbm9kZSAqcm9vdCwgc3RkOjpzdHJpbmcgJmRlZmF1bHRWYWx1ZSwgc3RkOjpzdHJpbmcgJnR5cGUpOworCisgICAgLyoqCisgICAgICogUmV0cmlldmUgYW4gZWxlbWVudCBmcm9tIGEgbWFwIGJ5IGl0cyBuYW1lLgorICAgICAqCisgICAgICogQHRwYXJhbSBUIHR5cGUgb2YgZWxlbWVudCB0byBzZWFyY2guCisgICAgICogQHBhcmFtW2luXSBuYW1lIG5hbWUgb2YgdGhlIGVsZW1lbnQgdG8gZmluZC4KKyAgICAgKiBAcGFyYW1baW5dIGVsZW1lbnRzTWFwIG1hcHMgb2YgZWxlbWVudHMgdG8gc2VhcmNoIGludG8uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZhbGlkIHBvaW50ZXIgb24gZWxlbWVudCBpZiBmb3VuZCwgTlVMTCBvdGhlcndpc2UuCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgVCAqZ2V0RWxlbWVudChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFQgKj4gJmVsZW1lbnRzTWFwKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIGFuIGVsZW1lbnQgZnJvbSBhIG1hcCBieSBpdHMgbmFtZS4gQ29uc3QgdmVyc2lvbi4KKyAgICAgKgorICAgICAqIEB0cGFyYW0gVCB0eXBlIG9mIGVsZW1lbnQgdG8gc2VhcmNoLgorICAgICAqIEBwYXJhbVtpbl0gbmFtZSBuYW1lIG9mIHRoZSBlbGVtZW50IHRvIGZpbmQuCisgICAgICogQHBhcmFtW2luXSBlbGVtZW50c01hcCBtYXBzIG9mIGVsZW1lbnRzIHRvIHNlYXJjaCBpbnRvLgorICAgICAqCisgICAgICogQHJldHVybiB2YWxpZCBwb2ludGVyIG9uIGVsZW1lbnQgaWYgZm91bmQsIE5VTEwgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIGNvbnN0IFQgKmdldEVsZW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVCAqPiAmZWxlbWVudHNNYXApIGNvbnN0OworCisgICAgLyoqCisgICAgICogc2V0IHRoZSB2YWx1ZSBvZiBhIGNvbXBvbmVudCBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdmFsdWUgbmV3IHZhbHVlIHRvIHNldCB0byB0aGUgY29tcG9uZW50IHN0YXRlLgorICAgICAqIEBwYXJhbVtpbl0gc3RhdGVOYW1lIG9mIHRoZSBjb21wb25lbnQgc3RhdGUuCisgICAgICovCisgICAgdm9pZCBzZXRWYWx1ZShpbnQgdmFsdWUsIGNvbnN0IHN0ZDo6c3RyaW5nICZzdGF0ZU5hbWUpOworCisgICAgLyoqCisgICAgICogZ2V0IHRoZSB2YWx1ZSBvZiBhIGNvbXBvbmVudCBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gbmFtZSBvZiB0aGUgY29tcG9uZW50IHN0YXRlLgorICAgICAqCisgICAgICogQHJldHVybiB2YWx1ZSBvZiB0aGUgY29tcG9uZW50IHN0YXRlCisgICAgICovCisgICAgaW50IGdldFZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nICZzdGF0ZU5hbWUpIGNvbnN0OworCisgICAgYm9vbCBpc1ZhbHVlVmFsaWRGb3JDcml0ZXJpb24oSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uLCBpbnQgdmFsdWVUb0NoZWNrKTsKKworICAgIENyaXRlcmlvblR5cGVDb2xsZWN0aW9uIG1Qb2xpY3lDcml0ZXJpb25UeXBlczsgLyoqPCBQb2xpY3kgQ3JpdGVyaW9uIFR5cGUgbWFwLiAqLworICAgIENyaXRlcmlvbkNvbGxlY3Rpb24gbVBvbGljeUNyaXRlcmlhOyAvKio8IFBvbGljeSBDcml0ZXJpb24gTWFwLiAqLworCisgICAgQ1BhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yICptUGZ3Q29ubmVjdG9yOyAvKio8IFBvbGljeSBQYXJhbWV0ZXIgTWFuYWdlciBjb25uZWN0b3IuICovCisgICAgUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3JMb2dnZXIgKm1QZndDb25uZWN0b3JMb2dnZXI7IC8qKjwgUG9saWN5IFBGVyBsb2dnZXIuICovCisKKworICAgIC8qKgorICAgICAqIHByb3ZpZGUgYSBjb21waWxlIHRpbWUgZXJyb3IgaWYgbm8gc3BlY2lhbGl6YXRpb24gaXMgcHJvdmlkZWQgZm9yIGEgZ2l2ZW4gdHlwZS4KKyAgICAgKgorICAgICAqIEB0cGFyYW0gVDogdHlwZSBvZiB0aGUgcGFyYW1ldGVyIG1hbmFnZXIgZWxlbWVudC4gU3VwcG9ydGVkIG9uZSBhcmU6CisgICAgICogICAgICAgICAgICAgICAgICAgICAgLSBDcml0ZXJpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAtIENyaXRlcmlvblR5cGUuCisgICAgICovCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgc3RydWN0IHBhcmFtZXRlck1hbmFnZXJFbGVtZW50U3VwcG9ydGVkOworCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1Qb2xpY3lQZndEZWZhdWx0Q29uZkZpbGVOYW1lOyAvKio8IERlZmF1bHQgUG9saWN5IFBGVyB0b3AgZmlsZSBuYW1lLiovCit9OworCit9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZDQzYjg5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDYgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworIyBDb21wb25lbnQgYnVpbGQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIHNyYy9FbmdpbmUuY3BwIFwKKyAgICBzcmMvRW5naW5lSW5zdGFuY2UuY3BwIFwKKyAgICBzcmMvR2FpbnMuY3BwIFwKKworCithdWRpb19wb2xpY3lfZW5naW5lX2luY2x1ZGVzX2NvbW1vbiA6PSBcCisgICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKKyAgICAkKFRPUERJUilmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UKKworTE9DQUxfQ0ZMQUdTICs9IFwKKyAgICAtV2FsbCBcCisgICAgLVdlcnJvciBcCisgICAgLVdleHRyYSBcCisKK0xPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSBcCisgICAgJChhdWRpb19wb2xpY3lfZW5naW5lX2luY2x1ZGVzX2NvbW1vbikKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChhdWRpb19wb2xpY3lfZW5naW5lX2luY2x1ZGVzX2NvbW1vbikgXAorICAgICQoVEFSR0VUX09VVF9IRUFERVJTKS9odyBcCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGZyYW1ld29ya3MtYXYpIFwKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYmlvbmljKSBcCisgICAgJChUT1BESVIpZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZQorCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJhdWRpb3BvbGljeWVuZ2luZWRlZmF1bHQKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJtZWRpYV9oZWxwZXIgXAorICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKKyAgICBsaWJjdXRpbHMgXAorICAgIGxpYnV0aWxzIFwKKyAgICBsaWJhdWRpb3V0aWxzIFwKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9pbmNsdWRlL0F1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvaW5jbHVkZS9BdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWUzMjlmMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvaW5jbHVkZS9BdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCitjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2U7CisKK25hbWVzcGFjZSBhbmRyb2lkCit7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit7CisKK2NsYXNzIEVuZ2luZTsKKworY2xhc3MgRW5naW5lSW5zdGFuY2UKK3sKK3Byb3RlY3RlZDoKKyAgICBFbmdpbmVJbnN0YW5jZSgpOworCitwdWJsaWM6CisgICAgdmlydHVhbCB+RW5naW5lSW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIEdldCBBdWRpbyBQb2xpY3kgRW5naW5lIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHJldHVybiBwb2ludGVyIHRvIFJvdXRlIE1hbmFnZXIgSW5zdGFuY2Ugb2JqZWN0LgorICAgICAqLworICAgIHN0YXRpYyBFbmdpbmVJbnN0YW5jZSAqZ2V0SW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSBxdWVyeS4KKyAgICAgKiBUaGUgZmlyc3QgY2xpZW50IG9mIGFuIGludGVyZmFjZSBvZiB0aGUgcG9saWN5IGVuZ2luZSB3aWxsIHN0YXJ0IHRoZSBzaW5nbGV0b24uCisgICAgICoKKyAgICAgKiBAdHBhcmFtIFJlcXVlc3RlZEludGVyZmFjZTogaW50ZXJmYWNlIHRoYXQgdGhlIGNsaWVudCBpcyB3aXNoaW5nIHRvIHJldHJpZXZlLgorICAgICAqCisgICAgICogQHJldHVybiBpbnRlcmZhY2UgaGFuZGxlLgorICAgICAqLworICAgIHRlbXBsYXRlIDxjbGFzcyBSZXF1ZXN0ZWRJbnRlcmZhY2U+CisgICAgUmVxdWVzdGVkSW50ZXJmYWNlICpxdWVyeUludGVyZmFjZSgpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgLyoqCisgICAgICogR2V0IEF1ZGlvIFBvbGljeSBFbmdpbmUgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEF1ZGlvIFBvbGljeSBFbmdpbmUgc2luZ2xldG9uLgorICAgICAqLworICAgIEVuZ2luZSAqZ2V0RW5naW5lKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgLyogQ29weSBmYWNpbGl0aWVzIGFyZSBwdXQgcHJpdmF0ZSB0byBkaXNhYmxlIGNvcHkuICovCisgICAgRW5naW5lSW5zdGFuY2UoY29uc3QgRW5naW5lSW5zdGFuY2UgJm9iamVjdCk7CisgICAgRW5naW5lSW5zdGFuY2UgJm9wZXJhdG9yPShjb25zdCBFbmdpbmVJbnN0YW5jZSAmb2JqZWN0KTsKK307CisKKy8qKgorICogTGltaXQgdGVtcGxhdGUgaW5zdGFudGF0aW9uIHRvIHN1cHBvcnRlZCB0eXBlIGludGVyZmFjZXMuCisgKiBDb21waWxlIHRpbWUgZXJyb3Igd2lsbCBjbGFpbSBpZiBpbnZhbGlkIGludGVyZmFjZSBpcyByZXF1ZXN0ZWQuCisgKi8KK3RlbXBsYXRlIDw+CitBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UgKkVuZ2luZUluc3RhbmNlOjpxdWVyeUludGVyZmFjZSgpIGNvbnN0OworCit9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA2ODY0MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwCkBAIC0wLDAgKzEsNzE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUG9saWN5RW5naW5lIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisvLyNkZWZpbmUgVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNpZmRlZiBWRVJZX1ZFUkJPU0VfTE9HR0lORworI2RlZmluZSBBTE9HVlYgQUxPR1YKKyNlbHNlCisjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisjaW5jbHVkZSAiRW5naW5lLmgiCisjaW5jbHVkZSAiR2FpbnMuaCIKKyNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlci5oPgorI2luY2x1ZGUgPEF1ZGlvUG9ydC5oPgorI2luY2x1ZGUgPElPUHJvZmlsZS5oPgorI2luY2x1ZGUgPHBvbGljeS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kKK3sKKworRW5naW5lOjpFbmdpbmUoKQorICAgIDogbU1hbmFnZXJJbnRlcmZhY2UodGhpcyksCisgICAgICBtUGhvbmVTdGF0ZShBVURJT19NT0RFX05PUk1BTCksCisgICAgICBtQXBtT2JzZXJ2ZXIoTlVMTCkKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UOyBpKyspIHsKKyAgICAgICAgbUZvcmNlVXNlW2ldID0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7CisgICAgfQorfQorCitFbmdpbmU6On5FbmdpbmUoKQoreworfQorCit2b2lkIEVuZ2luZTo6c2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKQoreworICAgIEFMT0dfQVNTRVJUKG9ic2VydmVyICE9IE5VTEwsICJJbnZhbGlkIEF1ZGlvIFBvbGljeSBNYW5hZ2VyIG9ic2VydmVyIik7CisgICAgbUFwbU9ic2VydmVyID0gb2JzZXJ2ZXI7Cit9CisKK3N0YXR1c190IEVuZ2luZTo6aW5pdENoZWNrKCkKK3sKKyAgICByZXR1cm4gKG1BcG1PYnNlcnZlciAhPSBOVUxMKSA/ICBOT19FUlJPUiA6IE5PX0lOSVQ7Cit9CisKK2Zsb2F0IEVuZ2luZTo6dm9sSW5kZXhUb0RiKFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGNhdGVnb3J5LCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleEluVWkpCit7CisgICAgY29uc3QgU3RyZWFtRGVzY3JpcHRvciAmc3RyZWFtRGVzYyA9IG1BcG1PYnNlcnZlci0+Z2V0U3RyZWFtRGVzY3JpcHRvcnMoKS52YWx1ZUF0KHN0cmVhbVR5cGUpOworICAgIHJldHVybiBHYWluczo6dm9sSW5kZXhUb0RiKGNhdGVnb3J5LCBzdHJlYW1EZXNjLCBpbmRleEluVWkpOworfQorCisKK3N0YXR1c190IEVuZ2luZTo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpCit7CisgICAgQUxPR1YoImluaXRTdHJlYW1Wb2x1bWUoKSBzdHJlYW0gJWQsIG1pbiAlZCwgbWF4ICVkIiwgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICBpZiAoaW5kZXhNaW4gPCAwIHx8IGluZGV4TWluID49IGluZGV4TWF4KSB7CisgICAgICAgIEFMT0dXKCJpbml0U3RyZWFtVm9sdW1lKCkgaW52YWxpZCBpbmRleCBsaW1pdHMgZm9yIHN0cmVhbSAlZCwgbWluICVkLCBtYXggJWQiLAorICAgICAgICAgICAgICBzdHJlYW0gLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBtQXBtT2JzZXJ2ZXItPmdldFN0cmVhbURlc2NyaXB0b3JzKCkuc2V0Vm9sdW1lSW5kZXhNaW4oc3RyZWFtLCBpbmRleE1pbik7CisgICAgbUFwbU9ic2VydmVyLT5nZXRTdHJlYW1EZXNjcmlwdG9ycygpLnNldFZvbHVtZUluZGV4TWF4KHN0cmVhbSwgaW5kZXhNYXgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBFbmdpbmU6OmluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoYm9vbCBpc1NwZWFrZXJEcmNFbmFibGVkKQoreworICAgIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uICZzdHJlYW1zID0gbUFwbU9ic2VydmVyLT5nZXRTdHJlYW1EZXNjcmlwdG9ycygpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBWb2x1bWU6OkRFVklDRV9DQVRFR09SWV9DTlQ7IGorKykgeworICAgICAgICAgICAgc3RyZWFtcy5zZXRWb2x1bWVDdXJ2ZVBvaW50KHN0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxWb2x1bWU6OmRldmljZV9jYXRlZ29yeT4oaiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5zOjpzVm9sdW1lUHJvZmlsZXNbaV1bal0pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgYXZhaWxhYmlsaXR5IG9mIERSQyBvbiBzcGVha2VyIHBhdGg6IGlmIGF2YWlsYWJsZSwgb3ZlcnJpZGUgc29tZSBvZiB0aGUgc3BlYWtlciBjdXJ2ZXMKKyAgICBpZiAoaXNTcGVha2VyRHJjRW5hYmxlZCkgeworICAgICAgICBzdHJlYW1zLnNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX1NZU1RFTSwgVm9sdW1lOjpERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKKyAgICAgICAgICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZURyYyk7CisgICAgICAgIHN0cmVhbXMuc2V0Vm9sdW1lQ3VydmVQb2ludChBVURJT19TVFJFQU1fUklORywgVm9sdW1lOjpERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKKyAgICAgICAgICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyYyk7CisgICAgICAgIHN0cmVhbXMuc2V0Vm9sdW1lQ3VydmVQb2ludChBVURJT19TVFJFQU1fQUxBUk0sIFZvbHVtZTo6REVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCisgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmMpOworICAgICAgICBzdHJlYW1zLnNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiwgVm9sdW1lOjpERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKKyAgICAgICAgICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyYyk7CisgICAgICAgIHN0cmVhbXMuc2V0Vm9sdW1lQ3VydmVQb2ludChBVURJT19TVFJFQU1fTVVTSUMsIFZvbHVtZTo6REVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCisgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyYyk7CisgICAgICAgIHN0cmVhbXMuc2V0Vm9sdW1lQ3VydmVQb2ludChBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSwgVm9sdW1lOjpERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKKyAgICAgICAgICAgICAgICBHYWluczo6c1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlRHJjKTsKKyAgICB9Cit9CisKKworc3RhdHVzX3QgRW5naW5lOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKK3sKKyAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIHN0YXRlICVkIiwgc3RhdGUpOworCisgICAgaWYgKHN0YXRlIDwgMCB8fCBzdGF0ZSA+PSBBVURJT19NT0RFX0NOVCkgeworICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIGludmFsaWQgc3RhdGUgJWQiLCBzdGF0ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKHN0YXRlID09IG1QaG9uZVN0YXRlICkgeworICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIHNldHRpbmcgc2FtZSBzdGF0ZSAlZCIsIHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBzdG9yZSBwcmV2aW91cyBwaG9uZSBzdGF0ZSBmb3IgbWFuYWdlbWVudCBvZiBzb25pZmljYXRpb24gc3RyYXRlZ3kgYmVsb3cKKyAgICBpbnQgb2xkU3RhdGUgPSBtUGhvbmVTdGF0ZTsKKyAgICBtUGhvbmVTdGF0ZSA9IHN0YXRlOworICAgIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uICZzdHJlYW1zID0gbUFwbU9ic2VydmVyLT5nZXRTdHJlYW1EZXNjcmlwdG9ycygpOworICAgIC8vIGFyZSB3ZSBlbnRlcmluZyBvciBzdGFydGluZyBhIGNhbGwKKyAgICBpZiAoIWlzX3N0YXRlX2luX2NhbGwob2xkU3RhdGUpICYmIGlzX3N0YXRlX2luX2NhbGwoc3RhdGUpKSB7CisgICAgICAgIEFMT0dWKCIgIEVudGVyaW5nIGNhbGwgaW4gc2V0UGhvbmVTdGF0ZSgpIik7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgVm9sdW1lOjpERVZJQ0VfQ0FURUdPUllfQ05UOyBqKyspIHsKKyAgICAgICAgICAgIHN0cmVhbXMuc2V0Vm9sdW1lQ3VydmVQb2ludChBVURJT19TVFJFQU1fRFRNRiwgc3RhdGljX2Nhc3Q8Vm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnk+KGopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1ZvbHVtZVByb2ZpbGVzW0FVRElPX1NUUkVBTV9WT0lDRV9DQUxMXVtqXSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGlzX3N0YXRlX2luX2NhbGwob2xkU3RhdGUpICYmICFpc19zdGF0ZV9pbl9jYWxsKHN0YXRlKSkgeworICAgICAgICBBTE9HVigiICBFeGl0aW5nIGNhbGwgaW4gc2V0UGhvbmVTdGF0ZSgpIik7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgVm9sdW1lOjpERVZJQ0VfQ0FURUdPUllfQ05UOyBqKyspIHsKKyAgICAgICAgICAgIHN0cmVhbXMuc2V0Vm9sdW1lQ3VydmVQb2ludChBVURJT19TVFJFQU1fRFRNRiwgc3RhdGljX2Nhc3Q8Vm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnk+KGopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1ZvbHVtZVByb2ZpbGVzW0FVRElPX1NUUkVBTV9EVE1GXVtqXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBFbmdpbmU6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCit7CisgICAgc3dpdGNoKHVzYWdlKSB7CisgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT046CisgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVIgJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkgeworICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9DT01NVU5JQ0FUSU9OIiwgY29uZmlnKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBOgorICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9IRUFEUEhPTkVTICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfQTJEUCAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9XSVJFRF9BQ0NFU1NPUlkgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQU5BTE9HX0RPQ0sgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfRElHSVRBTF9ET0NLICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfU1BFQUtFUiApIHsKKyAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfTUVESUEiLCBjb25maWcpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEOgorICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9XSVJFRF9BQ0NFU1NPUlkgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkgeworICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9SRUNPUkQiLCBjb25maWcpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DSzoKKyAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX0NBUl9ET0NLICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX0RFU0tfRE9DSyAmJgorICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9XSVJFRF9BQ0NFU1NPUlkgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQU5BTE9HX0RPQ0sgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfRElHSVRBTF9ET0NLKSB7CisgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX0RPQ0siLCBjb25maWcpOworICAgICAgICB9CisgICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU06CisgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUgJiYKKyAgICAgICAgICAgIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSB7CisgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX1NZU1RFTSIsIGNvbmZpZyk7CisgICAgICAgIH0KKyAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPOgorICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmCisgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0hETUlfU1lTVEVNX0FVRElPX0VORk9SQ0VEKSB7CisgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3JIRE1JX1NZU1RFTV9BVURJTyIsIGNvbmZpZyk7CisgICAgICAgIH0KKyAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCB1c2FnZSAlZCIsIHVzYWdlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworcm91dGluZ19zdHJhdGVneSBFbmdpbmU6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIC8vIHN0cmVhbSB0byBzdHJhdGVneSBtYXBwaW5nCisgICAgc3dpdGNoIChzdHJlYW0pIHsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOgorICAgIGNhc2UgQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ086CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9QSE9ORTsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9SSU5HOgorICAgIGNhc2UgQVVESU9fU1RSRUFNX0FMQVJNOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfU09OSUZJQ0FUSU9OOworICAgIGNhc2UgQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjoKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMOworICAgIGNhc2UgQVVESU9fU1RSRUFNX0RUTUY6CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9EVE1GOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCJ1bmtub3duIHN0cmVhbSB0eXBlICVkIiwgc3RyZWFtKTsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9TWVNURU06CisgICAgICAgIC8vIE5PVEU6IFNZU1RFTSBzdHJlYW0gdXNlcyBNRURJQSBzdHJhdGVneSBiZWNhdXNlIG11dGluZyBtdXNpYyBhbmQgc3dpdGNoaW5nIG91dHB1dHMKKyAgICAgICAgLy8gd2hpbGUga2V5IGNsaWNrcyBhcmUgcGxheWVkIHByb2R1Y2VzIGEgcG9vciByZXN1bHQKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9NVVNJQzoKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX01FRElBOworICAgIGNhc2UgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU6CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFOworICAgIGNhc2UgQVVESU9fU1RSRUFNX1RUUzoKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUjsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZOgorICAgICAgICByZXR1cm4gU1RSQVRFR1lfQUNDRVNTSUJJTElUWTsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9SRVJPVVRJTkc6CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9SRVJPVVRJTkc7CisgICAgfQorfQorCityb3V0aW5nX3N0cmF0ZWd5IEVuZ2luZTo6Z2V0U3RyYXRlZ3lGb3JVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKQoreworICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gbUFwbU9ic2VydmVyLT5nZXRPdXRwdXRzKCk7CisKKyAgICAvLyB1c2FnZSB0byBzdHJhdGVneSBtYXBwaW5nCisgICAgc3dpdGNoICh1c2FnZSkgeworICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgorICAgICAgICBpZiAob3V0cHV0cy5pc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fUklORykgfHwKKyAgICAgICAgICAgICAgICBvdXRwdXRzLmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9BTEFSTSkpIHsKKyAgICAgICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT047CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBTVFJBVEVHWV9QSE9ORTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU1RSQVRFR1lfQUNDRVNTSUJJTElUWTsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6CisgICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgorICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9NRURJQTsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX1BIT05FOworCisgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9EVE1GOworCisgICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT047CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDoKKyAgICAgICAgcmV0dXJuIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMOworCisgICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBTVFJBVEVHWV9NRURJQTsKKyAgICB9Cit9CisKK2F1ZGlvX2RldmljZXNfdCBFbmdpbmU6OmdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpIGNvbnN0Cit7CisgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gbUFwbU9ic2VydmVyLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7CisgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVJbnB1dERldmljZXMgPSBtQXBtT2JzZXJ2ZXItPmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpOworCisgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMgPSBtQXBtT2JzZXJ2ZXItPmdldE91dHB1dHMoKTsKKworICAgIHVpbnQzMl90IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgIHVpbnQzMl90IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOworCisgICAgc3dpdGNoIChzdHJhdGVneSkgeworCisgICAgY2FzZSBTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVI6CisgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICBpZiAoIWRldmljZSkgeworICAgICAgICAgICAgQUxPR0UoImdldERldmljZUZvclN0cmF0ZWd5KCkgbm8gZGV2aWNlIGZvdW5kIGZvciAiXAorICAgICAgICAgICAgICAgICAgICAiU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMOgorICAgICAgICBpZiAoaXNJbkNhbGwoKSkgeworICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OKTsKKyAgICAgICAgfSBlbHNlIGlmIChvdXRwdXRzLmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoQVVESU9fU1RSRUFNX01VU0lDLAorICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSkgeworICAgICAgICAgICAgLy8gd2hpbGUgbWVkaWEgaXMgcGxheWluZyBvbiBhIHJlbW90ZSBkZXZpY2UsIHVzZSB0aGUgdGhlIHNvbmlmaWNhdGlvbiBiZWhhdmlvci4KKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSB0ZXN0IHRoaXMgdXNlY2FzZSBiZWZvcmUgdGVzdGluZyBpZiBtZWRpYSBpcyBwbGF5aW5nIGJlY2F1c2UKKyAgICAgICAgICAgIC8vICAgdGhlIGlzU3RyZWFtQWN0aXZlKCkgbWV0aG9kIG9ubHkgaW5mb3JtcyBhYm91dCB0aGUgYWN0aXZpdHkgb2YgYSBzdHJlYW0sIG5vdAorICAgICAgICAgICAgLy8gICBpZiBpdCdzIGZvciBsb2NhbCBwbGF5YmFjay4gTm90ZSBhbHNvIHRoYXQgd2UgdXNlIHRoZSBzYW1lIGRlbGF5IGJldHdlZW4gYm90aCB0ZXN0cworICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OKTsKKyAgICAgICAgICAgIC8vdXNlciAic2FmZSIgc3BlYWtlciBpZiBhdmFpbGFibGUgaW5zdGVhZCBvZiBub3JtYWwgc3BlYWtlciB0byBhdm9pZCB0cmlnZ2VyaW5nCisgICAgICAgICAgICAvL290aGVyIGFjb3VzdGljIHNhZmV0eSBtZWNoYW5pc21zIGZvciBub3RpZmljYXRpb24KKyAgICAgICAgICAgIGlmICgoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSAmJgorICAgICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgfD0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkU7CisgICAgICAgICAgICAgICAgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAob3V0cHV0cy5pc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSkgeworICAgICAgICAgICAgLy8gd2hpbGUgbWVkaWEgaXMgcGxheWluZyAob3IgaGFzIHJlY2VudGx5IHBsYXllZCksIHVzZSB0aGUgc2FtZSBkZXZpY2UKKyAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHdoZW4gbWVkaWEgaXMgbm90IHBsYXlpbmcgYW55bW9yZSwgZmFsbCBiYWNrIG9uIHRoZSBzb25pZmljYXRpb24gYmVoYXZpb3IKKyAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTik7CisgICAgICAgICAgICAvL3VzZXIgInNhZmUiIHNwZWFrZXIgaWYgYXZhaWxhYmxlIGluc3RlYWQgb2Ygbm9ybWFsIHNwZWFrZXIgdG8gYXZvaWQgdHJpZ2dlcmluZworICAgICAgICAgICAgLy9vdGhlciBhY291c3RpYyBzYWZldHkgbWVjaGFuaXNtcyBmb3Igbm90aWZpY2F0aW9uCisgICAgICAgICAgICBpZiAoKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgJiYKKyAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlIHw9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFOworICAgICAgICAgICAgICAgIGRldmljZSAmPSB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBTVFJBVEVHWV9EVE1GOgorICAgICAgICBpZiAoIWlzSW5DYWxsKCkpIHsKKyAgICAgICAgICAgIC8vIHdoZW4gb2ZmIGNhbGwsIERUTUYgc3RyYXRlZ3kgZm9sbG93cyB0aGUgc2FtZSBydWxlcyBhcyBNRURJQSBzdHJhdGVneQorICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gd2hlbiBpbiBjYWxsLCBEVE1GIGFuZCBQSE9ORSBzdHJhdGVnaWVzIGZvbGxvdyB0aGUgc2FtZSBydWxlcworICAgICAgICAvLyBGQUxMIFRIUk9VR0gKKworICAgIGNhc2UgU1RSQVRFR1lfUEhPTkU6CisgICAgICAgIC8vIEZvcmNlIHVzZSBvZiBvbmx5IGRldmljZXMgb24gcHJpbWFyeSBvdXRwdXQgaWY6CisgICAgICAgIC8vIC0gaW4gY2FsbCBBTkQKKyAgICAgICAgLy8gICAtIGNhbm5vdCByb3V0ZSBmcm9tIHZvaWNlIGNhbGwgUlggT1IKKyAgICAgICAgLy8gICAtIGF1ZGlvIEhBTCB2ZXJzaW9uIGlzIDwgMy4wIGFuZCBUWCBkZXZpY2UgaXMgb24gdGhlIHByaW1hcnkgSFcgbW9kdWxlCisgICAgICAgIGlmIChnZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHhEZXZpY2UgPSBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTik7CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHByaW1hcnlPdXRwdXQgPSBvdXRwdXRzLmdldFByaW1hcnlPdXRwdXQoKTsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbFByaW1hcnlJbnB1dERldmljZXMgPQorICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21Id01vZHVsZShwcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKSk7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxQcmltYXJ5T3V0cHV0RGV2aWNlcyA9CisgICAgICAgICAgICAgICAgICAgIHByaW1hcnlPdXRwdXQtPnN1cHBvcnRlZERldmljZXMoKSAmIGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKKworICAgICAgICAgICAgaWYgKCgoYXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJgorICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYICYgfkFVRElPX0RFVklDRV9CSVRfSU4pID09IDApIHx8CisgICAgICAgICAgICAgICAgICAgICgoKHR4RGV2aWNlICYgYXZhaWxQcmltYXJ5SW5wdXREZXZpY2VzICYgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKHByaW1hcnlPdXRwdXQtPmdldEF1ZGlvUG9ydCgpLT5nZXRNb2R1bGVWZXJzaW9uKCkgPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSkpIHsKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSA9IGF2YWlsUHJpbWFyeU91dHB1dERldmljZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gZm9yIHBob25lIHN0cmF0ZWd5LCB3ZSBmaXJzdCBjb25zaWRlciB0aGUgZm9yY2VkIHVzZSBhbmQgdGhlbiB0aGUgYXZhaWxhYmxlIGRldmljZXMgYnkgb3JkZXIKKyAgICAgICAgLy8gb2YgcHJpb3JpdHkKKyAgICAgICAgc3dpdGNoIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSkgeworICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ086CisgICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkgfHwgc3RyYXRlZ3kgIT0gU1RSQVRFR1lfRFRNRikgeworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAvLyBpZiBTQ08gZGV2aWNlIGlzIHJlcXVlc3RlZCBidXQgbm8gU0NPIGRldmljZSBpcyBhdmFpbGFibGUsIGZhbGwgYmFjayB0byBkZWZhdWx0IGNhc2UKKyAgICAgICAgICAgIC8vIEZBTEwgVEhST1VHSAorCisgICAgICAgIGRlZmF1bHQ6ICAgIC8vIEZPUkNFX05PTkUKKyAgICAgICAgICAgIC8vIHdoZW4gbm90IGluIGEgcGhvbmUgY2FsbCwgcGhvbmUgc3RyYXRlZ3kgc2hvdWxkIHJvdXRlIFNUUkVBTV9WT0lDRV9DQUxMIHRvIEEyRFAKKyAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJgorICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgorICAgICAgICAgICAgICAgICAgICAob3V0cHV0cy5nZXRBMmRwT3V0cHV0KCkgIT0gMCkpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVDsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSkgeworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUw7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFOworICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICBkZXZpY2UgPSBtQXBtT2JzZXJ2ZXItPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+dHlwZSgpOworICAgICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIG5vIGRldmljZSBmb3VuZCBmb3IgU1RSQVRFR1lfUEhPTkUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVI6CisgICAgICAgICAgICAvLyB3aGVuIG5vdCBpbiBhIHBob25lIGNhbGwsIHBob25lIHN0cmF0ZWd5IHNob3VsZCByb3V0ZSBTVFJFQU1fVk9JQ0VfQ0FMTCB0bworICAgICAgICAgICAgLy8gQTJEUCBzcGVha2VyIHdoZW4gZm9yY2luZyB0byBzcGVha2VyIG91dHB1dAorICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpICYmCisgICAgICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCisgICAgICAgICAgICAgICAgICAgIChvdXRwdXRzLmdldEEyZHBPdXRwdXQoKSAhPSAwKSkgeworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFpc0luQ2FsbCgpKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlk7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTDsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQ7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfTElORTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGRldmljZSA9IG1BcG1PYnNlcnZlci0+Z2V0RGVmYXVsdE91dHB1dERldmljZSgpLT50eXBlKCk7CisgICAgICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdldERldmljZUZvclN0cmF0ZWd5KCkgbm8gZGV2aWNlIGZvdW5kIGZvciBTVFJBVEVHWV9QSE9ORSwgRk9SQ0VfU1BFQUtFUiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBicmVhazsKKworICAgIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OOgorCisgICAgICAgIC8vIElmIGluY2FsbCwganVzdCBzZWxlY3QgdGhlIFNUUkFURUdZX1BIT05FIGRldmljZTogVGhlIHJlc3Qgb2YgdGhlIGJlaGF2aW9yIGlzIGhhbmRsZWQgYnkKKyAgICAgICAgLy8gaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkuCisgICAgICAgIGlmIChpc0luQ2FsbCgpKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBGQUxMIFRIUk9VR0gKKworICAgIGNhc2UgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRToKKyAgICAgICAgLy8gc3RyYXRlZ3kgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSB1c2VzIHNhbWUgcm91dGluZyBwb2xpY3kgYXMgU1RSQVRFR1lfU09OSUZJQ0FUSU9OCisgICAgICAgIC8vIGV4Y2VwdDoKKyAgICAgICAgLy8gICAtIHdoZW4gaW4gY2FsbCB3aGVyZSBpdCBkb2Vzbid0IGRlZmF1bHQgdG8gU1RSQVRFR1lfUEhPTkUgYmVoYXZpb3IKKyAgICAgICAgLy8gICAtIGluIGNvdW50cmllcyB3aGVyZSBub3QgZW5mb3JjZWQgaW4gd2hpY2ggY2FzZSBpdCBmb2xsb3dzIFNUUkFURUdZX01FRElBCisKKyAgICAgICAgaWYgKChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHx8CisgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIHNwZWFrZXIgZGV2aWNlIG5vdCBmb3VuZCBmb3IgU1RSQVRFR1lfU09OSUZJQ0FUSU9OIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlIHNlY29uZCBkZXZpY2UgdXNlZCBmb3Igc29uaWZpY2F0aW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBkZXZpY2UgdXNlZCBieSBtZWRpYSBzdHJhdGVneQorICAgICAgICAvLyBGQUxMIFRIUk9VR0gKKworICAgIC8vIEZJWE1FOiBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZIGFuZCBTVFJBVEVHWV9SRVJPVVRJTkcgZm9sbG93IFNUUkFURUdZX01FRElBIGZvciBub3cKKyAgICBjYXNlIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFk6CisgICAgICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZKSB7CisgICAgICAgICAgICAvLyBkbyBub3Qgcm91dGUgYWNjZXNzaWJpbGl0eSBwcm9tcHRzIHRvIGEgZGlnaXRhbCBvdXRwdXQgY3VycmVudGx5IGNvbmZpZ3VyZWQgd2l0aCBhCisgICAgICAgICAgICAvLyBjb21wcmVzc2VkIGZvcm1hdCBhcyB0aGV5IHdvdWxkIGxpa2VseSBub3QgYmUgbWl4ZWQgYW5kIGRyb3BwZWQuCisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBvdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBkZXNjLT5kZXZpY2UoKSAmCisgICAgICAgICAgICAgICAgICAgIChBVURJT19ERVZJQ0VfT1VUX0hETUkgfCBBVURJT19ERVZJQ0VfT1VUX1NQRElGIHwgQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQyk7CisgICAgICAgICAgICAgICAgaWYgKGRlc2MtPmlzQWN0aXZlKCkgJiYgIWF1ZGlvX2lzX2xpbmVhcl9wY20oZGVzYy0+bUZvcm1hdCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiB+ZGV2aWNlczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gRkFMTCBUSFJPVUdICisKKyAgICBjYXNlIFNUUkFURUdZX1JFUk9VVElORzoKKyAgICBjYXNlIFNUUkFURUdZX01FRElBOiB7CisgICAgICAgIHVpbnQzMl90IGRldmljZTIgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgaWYgKHN0cmF0ZWd5ICE9IFNUUkFURUdZX1NPTklGSUNBVElPTikgeworICAgICAgICAgICAgLy8gbm8gc29uaWZpY2F0aW9uIG9uIHJlbW90ZSBzdWJtaXggKGUuZy4gV0ZEKQorICAgICAgICAgICAgaWYgKGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwgU3RyaW5nOCgiMCIpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaXNJbkNhbGwoKSAmJiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEpKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmCisgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgJiYKKyAgICAgICAgICAgICAgICAob3V0cHV0cy5nZXRBMmRwT3V0cHV0KCkgIT0gMCkpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA7CisgICAgICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKKyAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVIpKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0xJTkU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSAmJiAoc3RyYXRlZ3kgIT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSkgeworICAgICAgICAgICAgLy8gbm8gc29uaWZpY2F0aW9uIG9uIGF1eCBkaWdpdGFsIChlLmcuIEhETUkpCisgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMOworICAgICAgICB9CisgICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKKyAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DS10gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0FOQUxPR19ET0NLKSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICB9CisgICAgICAgIGludCBkZXZpY2UzID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgeworICAgICAgICAgICAgLy8gQVJDLCBTUERJRiBhbmQgQVVYX0xJTkUgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzLgorICAgICAgICAgICAgZGV2aWNlMyA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQzsKKyAgICAgICAgICAgIGRldmljZTMgfD0gKGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUERJRik7CisgICAgICAgICAgICBkZXZpY2UzIHw9IChhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0xJTkUpOworICAgICAgICB9CisKKyAgICAgICAgZGV2aWNlMiB8PSBkZXZpY2UzOworICAgICAgICAvLyBkZXZpY2UgaXMgREVWSUNFX09VVF9TUEVBS0VSIGlmIHdlIGNvbWUgZnJvbSBjYXNlIFNUUkFURUdZX1NPTklGSUNBVElPTiBvcgorICAgICAgICAvLyBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLCBBVURJT19ERVZJQ0VfTk9ORSBvdGhlcndpc2UKKyAgICAgICAgZGV2aWNlIHw9IGRldmljZTI7CisKKyAgICAgICAgLy8gSWYgaGRtaSBzeXN0ZW0gYXVkaW8gbW9kZSBpcyBvbiwgcmVtb3ZlIHNwZWFrZXIgb3V0IG9mIG91dHB1dCBsaXN0LgorICAgICAgICBpZiAoKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSAmJgorICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPXSA9PQorICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9IRE1JX1NZU1RFTV9BVURJT19FTkZPUkNFRCkpIHsKKyAgICAgICAgICAgIGRldmljZSAmPSB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgIGRldmljZSA9IG1BcG1PYnNlcnZlci0+Z2V0RGVmYXVsdE91dHB1dERldmljZSgpLT50eXBlKCk7CisgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIG5vIGRldmljZSBmb3VuZCBmb3IgU1RSQVRFR1lfTUVESUEiKTsKKyAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR1coImdldERldmljZUZvclN0cmF0ZWd5KCkgdW5rbm93biBzdHJhdGVneTogJWQiLCBzdHJhdGVneSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIEFMT0dWVigiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBzdHJhdGVneSAlZCwgZGV2aWNlICV4Iiwgc3RyYXRlZ3ksIGRldmljZSk7CisgICAgcmV0dXJuIGRldmljZTsKK30KKworCithdWRpb19kZXZpY2VzX3QgRW5naW5lOjpnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkgY29uc3QKK3sKKyAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZU91dHB1dERldmljZXMgPSBtQXBtT2JzZXJ2ZXItPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKTsKKyAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZUlucHV0RGV2aWNlcyA9IG1BcG1PYnNlcnZlci0+Z2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCk7CisgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMgPSBtQXBtT2JzZXJ2ZXItPmdldE91dHB1dHMoKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPSBhdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOworCisgICAgdWludDMyX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisKKyAgICBzd2l0Y2ggKGlucHV0U291cmNlKSB7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOgorICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwpIHsKKyAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBVURJT19TT1VSQ0VfREVGQVVMVDoKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9NSUM6CisgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSB7CisgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUDsKKyAgICB9IGVsc2UgaWYgKChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pICYmCisgICAgICAgIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpKSB7CisgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7CisgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSB7CisgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUOworICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSkgeworICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRTsKKyAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7CisgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKKyAgICB9CisgICAgYnJlYWs7CisKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgorICAgICAgICAvLyBBbGxvdyBvbmx5IHVzZSBvZiBkZXZpY2VzIG9uIHByaW1hcnkgaW5wdXQgaWYgaW4gY2FsbCBhbmQgSEFMIGRvZXMgbm90IHN1cHBvcnQgcm91dGluZworICAgICAgICAvLyB0byB2b2ljZSBjYWxsIHBhdGguCisgICAgICAgIGlmICgoZ2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfSU5fQ0FMTCkgJiYKKyAgICAgICAgICAgICAgICAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgpID09IDApIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gcHJpbWFyeU91dHB1dCA9IG91dHB1dHMuZ2V0UHJpbWFyeU91dHB1dCgpOworICAgICAgICAgICAgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPQorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21Id01vZHVsZShwcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKSkKKyAgICAgICAgICAgICAgICAgICAgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0pIHsKKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPOgorICAgICAgICAgICAgLy8gaWYgU0NPIGRldmljZSBpcyByZXF1ZXN0ZWQgYnV0IG5vIFNDTyBkZXZpY2UgaXMgYXZhaWxhYmxlLCBmYWxsIGJhY2sgdG8gZGVmYXVsdCBjYXNlCisgICAgICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEZBTEwgVEhST1VHSAorCisgICAgICAgIGRlZmF1bHQ6ICAgIC8vIEZPUkNFX05PTkUKKyAgICAgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSOgorICAgICAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSB7CisgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgeworICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT046CisgICAgY2FzZSBBVURJT19TT1VSQ0VfSE9UV09SRDoKKyAgICAgICAgaWYgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRF0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTyAmJgorICAgICAgICAgICAgICAgIGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVDsKKyAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVDsKKyAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRTsKKyAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU09VUkNFX0NBTUNPUkRFUjoKKyAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUM7CisgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzoKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMOgorICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDoKKyAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICBjYXNlIEFVRElPX1NPVVJDRV9GTV9UVU5FUjoKKyAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fRk1fVFVORVI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR1coImdldERldmljZUZvcklucHV0U291cmNlKCkgaW52YWxpZCBpbnB1dCBzb3VyY2UgJWQiLCBpbnB1dFNvdXJjZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBBTE9HVigiZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoKWlucHV0IHNvdXJjZSAlZCwgZGV2aWNlICUwOHgiLCBpbnB1dFNvdXJjZSwgZGV2aWNlKTsKKyAgICByZXR1cm4gZGV2aWNlOworfQorCit0ZW1wbGF0ZSA8PgorQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlICpFbmdpbmU6OnF1ZXJ5SW50ZXJmYWNlKCkKK3sKKyAgICByZXR1cm4gJm1NYW5hZ2VySW50ZXJmYWNlOworfQorCit9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU2YTQ3NDgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuaApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisKKyNpbmNsdWRlICJBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJHYWlucy5oIgorI2luY2x1ZGUgPEF1ZGlvR2Fpbi5oPgorI2luY2x1ZGUgPHBvbGljeS5oPgorCituYW1lc3BhY2UgYW5kcm9pZAoreworCitjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlcjsKKworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoreworCitjbGFzcyBFbmdpbmUKK3sKK3B1YmxpYzoKKyAgICBFbmdpbmUoKTsKKyAgICB2aXJ0dWFsIH5FbmdpbmUoKTsKKworICAgIHRlbXBsYXRlIDxjbGFzcyBSZXF1ZXN0ZWRJbnRlcmZhY2U+CisgICAgUmVxdWVzdGVkSW50ZXJmYWNlICpxdWVyeUludGVyZmFjZSgpOworCitwcml2YXRlOgorICAgIC8vLyBJbnRlcmZhY2UgbWVtYmVycworICAgIGNsYXNzIE1hbmFnZXJJbnRlcmZhY2VJbXBsIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZQorICAgIHsKKyAgICBwdWJsaWM6CisgICAgICAgIE1hbmFnZXJJbnRlcmZhY2VJbXBsKEVuZ2luZSAqcG9saWN5RW5naW5lKQorICAgICAgICAgICAgOiBtUG9saWN5RW5naW5lKHBvbGljeUVuZ2luZSkge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKQorICAgICAgICB7CisgICAgICAgICAgICBtUG9saWN5RW5naW5lLT5zZXRPYnNlcnZlcihvYnNlcnZlcik7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+aW5pdENoZWNrKCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXREZXZpY2VGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRTdHJhdGVneUZvclVzYWdlKHVzYWdlKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IG1vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRQaG9uZVN0YXRlKG1vZGUpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0Rm9yY2VVc2UodXNhZ2UsIGNvbmZpZyk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldEZvcmNlVXNlKHVzYWdlKTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAvKmRldkRlc2MqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IC8qc3RhdGUqLykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5pbml0U3RyZWFtVm9sdW1lKHN0cmVhbSwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6ZVZvbHVtZUN1cnZlcyhib29sIGlzU3BlYWtlckRyY0VuYWJsZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5pbml0aWFsaXplVm9sdW1lQ3VydmVzKGlzU3BlYWtlckRyY0VuYWJsZWQpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgZmxvYXQgdm9sSW5kZXhUb0RiKFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLGludCBpbmRleEluVWkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT52b2xJbmRleFRvRGIoZGV2aWNlQ2F0ZWdvcnksIHN0cmVhbSwgaW5kZXhJblVpKTsKKyAgICAgICAgfQorICAgIHByaXZhdGU6CisgICAgICAgIEVuZ2luZSAqbVBvbGljeUVuZ2luZTsKKyAgICB9IG1NYW5hZ2VySW50ZXJmYWNlOworCitwcml2YXRlOgorICAgIC8qIENvcHkgZmFjaWxpdGllcyBhcmUgcHV0IHByaXZhdGUgdG8gZGlzYWJsZSBjb3B5LiAqLworICAgIEVuZ2luZShjb25zdCBFbmdpbmUgJm9iamVjdCk7CisgICAgRW5naW5lICZvcGVyYXRvcj0oY29uc3QgRW5naW5lICZvYmplY3QpOworCisgICAgdm9pZCBzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpOworCisgICAgc3RhdHVzX3QgaW5pdENoZWNrKCk7CisKKyAgICBpbmxpbmUgYm9vbCBpc0luQ2FsbCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNfc3RhdGVfaW5fY2FsbChtUGhvbmVTdGF0ZSk7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSk7CisgICAgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1QaG9uZVN0YXRlOworICAgIH0KKyAgICBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKKyAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtRm9yY2VVc2VbdXNhZ2VdOworICAgIH0KKyAgICBzdGF0dXNfdCBzZXREZWZhdWx0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworCisgICAgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisgICAgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpOworICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KSBjb25zdDsKKyAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpIGNvbnN0OworCisgICAgZmxvYXQgdm9sSW5kZXhUb0RiKFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXhJblVpKTsKKyAgICBzdGF0dXNfdCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCk7CisgICAgdm9pZCBpbml0aWFsaXplVm9sdW1lQ3VydmVzKGJvb2wgaXNTcGVha2VyRHJjRW5hYmxlZCk7CisKKyAgICBhdWRpb19tb2RlX3QgbVBob25lU3RhdGU7ICAvKio8IGN1cnJlbnQgcGhvbmUgc3RhdGUuICovCisKKyAgICAvKiogY3VycmVudCBmb3JjZWQgdXNlIGNvbmZpZ3VyYXRpb24uICovCisgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlRdOworCisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm1BcG1PYnNlcnZlcjsKK307Cit9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lSW5zdGFuY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lSW5zdGFuY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE3ZTk4MzIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmVJbnN0YW5jZS5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmgiCisjaW5jbHVkZSAiRW5naW5lLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkCit7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit7CisKK0VuZ2luZUluc3RhbmNlOjpFbmdpbmVJbnN0YW5jZSgpCit7Cit9CisKK0VuZ2luZUluc3RhbmNlICpFbmdpbmVJbnN0YW5jZTo6Z2V0SW5zdGFuY2UoKQoreworICAgIHN0YXRpYyBFbmdpbmVJbnN0YW5jZSBpbnN0YW5jZTsKKyAgICByZXR1cm4gJmluc3RhbmNlOworfQorCitFbmdpbmVJbnN0YW5jZTo6fkVuZ2luZUluc3RhbmNlKCkKK3sKK30KKworRW5naW5lICpFbmdpbmVJbnN0YW5jZTo6Z2V0RW5naW5lKCkgY29uc3QKK3sKKyAgICBzdGF0aWMgRW5naW5lIGVuZ2luZTsKKyAgICByZXR1cm4gJmVuZ2luZTsKK30KKwordGVtcGxhdGUgPD4KK0F1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZSAqRW5naW5lSW5zdGFuY2U6OnF1ZXJ5SW50ZXJmYWNlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZ2V0RW5naW5lKCktPnF1ZXJ5SW50ZXJmYWNlPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZT4oKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0dhaW5zLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0dhaW5zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGYyOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvR2FpbnMuY3BwCkBAIC0wLDAgKzEsMjU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OkdhaW5zIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisvLyNkZWZpbmUgVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNpZmRlZiBWRVJZX1ZFUkJPU0VfTE9HR0lORworI2RlZmluZSBBTE9HVlYgQUxPR1YKKyNlbHNlCisjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisjaW5jbHVkZSAiR2FpbnMuaCIKKyNpbmNsdWRlIDxWb2x1bWUuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEVuZ2luZWRlZmF1bHQKK2NvbnN0IFZvbHVtZUN1cnZlUG9pbnQKK0dhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTQ5LjVmfSwgezMzLCAtMzMuNWZ9LCB7NjYsIC0xNy4wZn0sIHsxMDAsIDAuMGZ9Cit9OworCisKK2NvbnN0IFZvbHVtZUN1cnZlUG9pbnQKK0dhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0geworICAgIHsxLCAtNTguMGZ9LCB7MjAsIC00MC4wZn0sIHs2MCwgLTE3LjBmfSwgezEwMCwgMC4wZn0KK307CisKK2NvbnN0IFZvbHVtZUN1cnZlUG9pbnQKK0dhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7CisgICAgezEsIC01OC4wZn0sIHsyMCwgLTQwLjBmfSwgezYwLCAtMjEuMGZ9LCB7MTAwLCAtMTAuMGZ9Cit9OworCitjb25zdCBWb2x1bWVDdXJ2ZVBvaW50CitHYWluczo6c1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTU2LjBmfSwgezIwLCAtMzQuMGZ9LCB7NjAsIC0xMS4wZn0sIHsxMDAsIDAuMGZ9Cit9OworCitjb25zdCBWb2x1bWVDdXJ2ZVBvaW50CitHYWluczo6c1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTU1LjBmfSwgezIwLCAtNDMuMGZ9LCB7ODYsIC0xMi4wZn0sIHsxMDAsIDAuMGZ9Cit9OworCitjb25zdCBWb2x1bWVDdXJ2ZVBvaW50CitHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7CisgICAgezEsIC0yOS43Zn0sIHszMywgLTIwLjFmfSwgezY2LCAtMTAuMmZ9LCB7MTAwLCAwLjBmfQorfTsKKworY29uc3QgVm9sdW1lQ3VydmVQb2ludAorR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmNbVm9sdW1lOjpWT0xDTlRdID0geworICAgIHsxLCAtMzUuN2Z9LCB7MzMsIC0yNi4xZn0sIHs2NiwgLTEzLjJmfSwgezEwMCwgMC4wZn0KK307CisKKy8vIEFVRElPX1NUUkVBTV9TWVNURU0sIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFIGFuZCBBVURJT19TVFJFQU1fRFRNRiB2b2x1bWUgdHJhY2tzCisvLyBBVURJT19TVFJFQU1fUklORyBvbiBwaG9uZXMgYW5kIEFVRElPX1NUUkVBTV9NVVNJQyBvbiB0YWJsZXRzLgorLy8gQVVESU9fU1RSRUFNX0RUTUYgdHJhY2tzIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIHdoaWxlIGluIGNhbGwgKFNlZSBBdWRpb1NlcnZpY2UuamF2YSkuCisvLyBUaGUgcmFuZ2UgaXMgY29uc3RyYWluZWQgYmV0d2VlbiAtMjRkQiBhbmQgLTZkQiBvdmVyIHNwZWFrZXIgYW5kIC0zMGRCIGFuZCAtMThkQiBvdmVyIGhlYWRzZXQuCisKK2NvbnN0IFZvbHVtZUN1cnZlUG9pbnQKK0dhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKKyAgICB7MSwgLTI0LjBmfSwgezMzLCAtMTguMGZ9LCB7NjYsIC0xMi4wZn0sIHsxMDAsIC02LjBmfQorfTsKKworY29uc3QgVm9sdW1lQ3VydmVQb2ludAorR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVEcmNbVm9sdW1lOjpWT0xDTlRdID0geworICAgIHsxLCAtMzQuMGZ9LCB7MzMsIC0yNC4wZn0sIHs2NiwgLTE1LjBmfSwgezEwMCwgLTYuMGZ9Cit9OworCitjb25zdCBWb2x1bWVDdXJ2ZVBvaW50CitHYWluczo6c0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7CisgICAgezEsIC0zMC4wZn0sIHszMywgLTI2LjBmfSwgezY2LCAtMjIuMGZ9LCB7MTAwLCAtMTguMGZ9Cit9OworCitjb25zdCBWb2x1bWVDdXJ2ZVBvaW50CitHYWluczo6c0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKKyAgICB7MCwgLTQyLjBmfSwgezMzLCAtMjguMGZ9LCB7NjYsIC0xNC4wZn0sIHsxMDAsIDAuMGZ9Cit9OworCitjb25zdCBWb2x1bWVDdXJ2ZVBvaW50CitHYWluczo6c1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKKyAgICB7MCwgLTI0LjBmfSwgezMzLCAtMTYuMGZ9LCB7NjYsIC04LjBmfSwgezEwMCwgMC4wZn0KK307CisKK2NvbnN0IFZvbHVtZUN1cnZlUG9pbnQKK0dhaW5zOjpzTGluZWFyVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0geworICAgIHswLCAtOTYuMGZ9LCB7MzMsIC02OC4wZn0sIHs2NiwgLTM0LjBmfSwgezEwMCwgMC4wZn0KK307CisKK2NvbnN0IFZvbHVtZUN1cnZlUG9pbnQKK0dhaW5zOjpzU2lsZW50Vm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0geworICAgIHswLCAtOTYuMGZ9LCB7MSwgLTk2LjBmfSwgezIsIC05Ni4wZn0sIHsxMDAsIC05Ni4wZn0KK307CisKK2NvbnN0IFZvbHVtZUN1cnZlUG9pbnQKK0dhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0geworICAgIHswLCAwLjBmfSwgezEsIDAuMGZ9LCB7MiwgMC4wZn0sIHsxMDAsIDAuMGZ9Cit9OworCitjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpHYWluczo6c1ZvbHVtZVByb2ZpbGVzW0FVRElPX1NUUkVBTV9DTlRdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtWb2x1bWU6OkRFVklDRV9DQVRFR09SWV9DTlRdID0geworICAgIHsgLy8gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwKKyAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgR2FpbnM6OnNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgR2FpbnM6OnNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX1NZU1RFTQorICAgICAgICBHYWluczo6c0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fUklORworICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fTVVTSUMKKyAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX0FMQVJNCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCisgICAgfSwKKyAgICB7IC8vIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04KKyAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIEdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQorICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08KKyAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgR2FpbnM6OnNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUKKyAgICAgICAgR2FpbnM6OnNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCisgICAgeyAgLy8gQVVESU9fU1RSRUFNX0RUTUYKKyAgICAgICAgR2FpbnM6OnNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIEdhaW5zOjpzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fVFRTCisgICAgICAvLyAiVHJhbnNtaXR0ZWQgVGhyb3VnaCBTcGVha2VyIjogYWx3YXlzIHNpbGVudCBleGNlcHQgb24gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgR2FpbnM6OnNTaWxlbnRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgR2FpbnM6OnNMaW5lYXJWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgR2FpbnM6OnNTaWxlbnRWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIEdhaW5zOjpzU2lsZW50Vm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkKKyAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorICAgIHsgLy8gQVVESU9fU1RSRUFNX1JFUk9VVElORworICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAorICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgorICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKKyAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQorICAgIH0sCisgICAgeyAvLyBBVURJT19TVFJFQU1fUEFUQ0gKKyAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKKyAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKKyAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCisgICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKKyAgICB9LAorfTsKKworLy9zdGF0aWMKK2Zsb2F0IEdhaW5zOjp2b2xJbmRleFRvRGIoVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmVhbURlc2NyaXB0b3ImIHN0cmVhbURlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleEluVWkpCit7CisgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqY3VydmUgPSBzdHJlYW1EZXNjLmdldFZvbHVtZUN1cnZlUG9pbnQoZGV2aWNlQ2F0ZWdvcnkpOworCisgICAgLy8gdGhlIHZvbHVtZSBpbmRleCBpbiB0aGUgVUkgaXMgcmVsYXRpdmUgdG8gdGhlIG1pbiBhbmQgbWF4IHZvbHVtZSBpbmRpY2VzIGZvciB0aGlzIHN0cmVhbSB0eXBlCisgICAgaW50IG5iU3RlcHMgPSAxICsgY3VydmVbVm9sdW1lOjpWT0xNQVhdLm1JbmRleCAtCisgICAgICAgICAgICBjdXJ2ZVtWb2x1bWU6OlZPTE1JTl0ubUluZGV4OworICAgIGludCB2b2xJZHggPSAobmJTdGVwcyAqIChpbmRleEluVWkgLSBzdHJlYW1EZXNjLmdldFZvbHVtZUluZGV4TWluKCkpKSAvCisgICAgICAgICAgICAoc3RyZWFtRGVzYy5nZXRWb2x1bWVJbmRleE1heCgpIC0gc3RyZWFtRGVzYy5nZXRWb2x1bWVJbmRleE1pbigpKTsKKworICAgIC8vIGZpbmQgd2hhdCBwYXJ0IG9mIHRoZSBjdXJ2ZSB0aGlzIGluZGV4IHZvbHVtZSBiZWxvbmdzIHRvLCBvciBpZiBpdCdzIG91dCBvZiBib3VuZHMKKyAgICBpbnQgc2VnbWVudCA9IDA7CisgICAgaWYgKHZvbElkeCA8IGN1cnZlW1ZvbHVtZTo6Vk9MTUlOXS5tSW5kZXgpIHsgICAgICAgICAvLyBvdXQgb2YgYm91bmRzCisgICAgICAgIHJldHVybiBWT0xVTUVfTUlOX0RCOworICAgIH0gZWxzZSBpZiAodm9sSWR4IDwgY3VydmVbVm9sdW1lOjpWT0xLTkVFMV0ubUluZGV4KSB7CisgICAgICAgIHNlZ21lbnQgPSAwOworICAgIH0gZWxzZSBpZiAodm9sSWR4IDwgY3VydmVbVm9sdW1lOjpWT0xLTkVFMl0ubUluZGV4KSB7CisgICAgICAgIHNlZ21lbnQgPSAxOworICAgIH0gZWxzZSBpZiAodm9sSWR4IDw9IGN1cnZlW1ZvbHVtZTo6Vk9MTUFYXS5tSW5kZXgpIHsKKyAgICAgICAgc2VnbWVudCA9IDI7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXQgb2YgYm91bmRzCisgICAgICAgIHJldHVybiAwLjBmOworICAgIH0KKworICAgIC8vIGxpbmVhciBpbnRlcnBvbGF0aW9uIGluIHRoZSBhdHRlbnVhdGlvbiB0YWJsZSBpbiBkQgorICAgIGZsb2F0IGRlY2liZWxzID0gY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24gKworICAgICAgICAgICAgKChmbG9hdCkodm9sSWR4IC0gY3VydmVbc2VnbWVudF0ubUluZGV4KSkgKgorICAgICAgICAgICAgICAgICggKGN1cnZlW3NlZ21lbnQrMV0ubURCQXR0ZW51YXRpb24gLQorICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24pIC8KKyAgICAgICAgICAgICAgICAgICAgKChmbG9hdCkoY3VydmVbc2VnbWVudCsxXS5tSW5kZXggLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1JbmRleCkpICk7CisKKyAgICBBTE9HVlYoIlZPTFVNRSB2b2wgaW5kZXg9WyVkICVkICVkXSwgZEI9WyUuMWYgJS4xZiAlLjFmXSIsCisgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tSW5kZXgsIHZvbElkeCwKKyAgICAgICAgICAgIGN1cnZlW3NlZ21lbnQrMV0ubUluZGV4LAorICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubURCQXR0ZW51YXRpb24sCisgICAgICAgICAgICBkZWNpYmVscywKKyAgICAgICAgICAgIGN1cnZlW3NlZ21lbnQrMV0ubURCQXR0ZW51YXRpb24pOworCisgICAgcmV0dXJuIGRlY2liZWxzOworfQorCisKKy8vc3RhdGljCitmbG9hdCBHYWluczo6dm9sSW5kZXhUb0FtcGwoVm9sdW1lOjpkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyZWFtRGVzY3JpcHRvciYgc3RyZWFtRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKQoreworICAgIHJldHVybiBWb2x1bWU6OkRiVG9BbXBsKHZvbEluZGV4VG9EYihkZXZpY2VDYXRlZ29yeSwgc3RyZWFtRGVzYywgaW5kZXhJblVpKSk7Cit9CisKKworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvR2FpbnMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0dhaW5zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyMGI3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0dhaW5zLmgKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8U3RyZWFtRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN0cmVhbURlc2NyaXB0b3I7CisKK2NsYXNzIEdhaW5zCit7CitwdWJsaWMgOgorICAgIHN0YXRpYyBmbG9hdCB2b2xJbmRleFRvQW1wbChWb2x1bWU6OmRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyZWFtRGVzY3JpcHRvciYgc3RyZWFtRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4SW5VaSk7CisKKyAgICBzdGF0aWMgZmxvYXQgdm9sSW5kZXhUb0RiKFZvbHVtZTo6ZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyZWFtRGVzY3JpcHRvciYgc3RyZWFtRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleEluVWkpOworCisgICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmUKKyAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKKyAgICAvLyBkZWZhdWx0IHZvbHVtZSBjdXJ2ZSBmb3IgbWVkaWEgc3RyYXRlZ3kKKyAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOworICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3Igbm9uLW1lZGlhIGF1ZGlvIG9uIGV4dCBtZWRpYSBvdXRwdXRzIChIRE1JLCBMaW5lLCBldGMpCisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOworICAgIC8vIHZvbHVtZSBjdXJ2ZSBmb3IgbWVkaWEgc3RyYXRlZ3kgb24gc3BlYWtlcnMKKyAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOworICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF07CisgICAgLy8gdm9sdW1lIGN1cnZlIGZvciBzb25pZmljYXRpb24gc3RyYXRlZ3kgb24gc3BlYWtlcnMKKyAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKKyAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXTsKKyAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKKyAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXTsKKyAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKKyAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOworICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyVm9pY2VWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07CisgICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0xpbmVhclZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKKyAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzU2lsZW50Vm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOworICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNGdWxsU2NhbGVWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07CisgICAgLy8gZGVmYXVsdCB2b2x1bWUgY3VydmVzIHBlciBzdHJlYW0gYW5kIGRldmljZSBjYXRlZ29yeS4gU2VlIGluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoKQorICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpzVm9sdW1lUHJvZmlsZXNbQVVESU9fU1RSRUFNX0NOVF1bVm9sdW1lOjpERVZJQ0VfQ0FURUdPUllfQ05UXTsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUZhY3RvcnkuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlci9BdWRpb1BvbGljeUZhY3RvcnkuY3BwCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIHNlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAKcmVuYW1lIHRvIHNlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXIvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcAppbmRleCAyYWU3YmMxLi45OTEwYTFmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUZhY3RvcnkuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXIvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgIkF1ZGlvUG9saWN5TWFuYWdlci5oIgorI2luY2x1ZGUgIm1hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZjY4NjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNDg4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeU1hbmFnZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKy8vI2RlZmluZSBWRVJZX1ZFUkJPU0VfTE9HR0lORworI2lmZGVmIFZFUllfVkVSQk9TRV9MT0dHSU5HCisjZGVmaW5lIEFMT0dWViBBTE9HVgorI2Vsc2UKKyNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oPgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgorI2luY2x1ZGUgPHNvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaD4KKyNpbmNsdWRlICJBdWRpb1BvbGljeU1hbmFnZXIuaCIKKyNpbmNsdWRlICJhdWRpb19wb2xpY3lfY29uZi5oIgorI2luY2x1ZGUgPENvbmZpZ1BhcnNpbmdVdGlscy5oPgorI2luY2x1ZGUgPHBvbGljeS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGltcGxlbWVudGF0aW9uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQoreworICAgIHJldHVybiBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoZGV2aWNlLCBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCit7CisgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludCgpIGRldmljZTogMHglWCwgc3RhdGUgJWQsIGFkZHJlc3MgJXMgbmFtZSAlcyIsCistICAgICAgICAgICAgZGV2aWNlLCBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKKworICAgIC8vIGNvbm5lY3QvZGlzY29ubmVjdCBvbmx5IDEgZGV2aWNlIGF0IGEgdGltZQorICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQorICAgICAgICAgICAgbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKGRldmljZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKKworICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlcworICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgU29ydGVkVmVjdG9yIDxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKKworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihkZXZEZXNjKTsKKworICAgICAgICAvLyBzYXZlIGEgY29weSBvZiB0aGUgb3BlbmVkIG91dHB1dCBkZXNjcmlwdG9ycyBiZWZvcmUgYW55IG91dHB1dCBpcyBvcGVuZWQgb3IgY2xvc2VkCisgICAgICAgIC8vIGJ5IGNoZWNrT3V0cHV0c0ZvckRldmljZSgpLiBUaGlzIHdpbGwgYmUgbmVlZGVkIGJ5IGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpCisgICAgICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkKKyAgICAgICAgeworICAgICAgICAvLyBoYW5kbGUgb3V0cHV0IGRldmljZSBjb25uZWN0aW9uCisgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEU6IHsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBhbHJlYWR5IGNvbm5lY3RlZDogJXgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBjb25uZWN0aW5nIGRldmljZSAleCIsIGRldmljZSk7CisKKyAgICAgICAgICAgIC8vIHJlZ2lzdGVyIG5ldyBkZXZpY2UgYXMgYXZhaWxhYmxlCisgICAgICAgICAgICBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChkZXZEZXNjKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRm9yRGV2aWNlKGRldmljZSk7CisgICAgICAgICAgICAgICAgaWYgKG1vZHVsZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBjb3VsZCBub3QgZmluZCBIVyBtb2R1bGUgZm9yIGRldmljZSAlMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+YXR0YWNoKG1vZHVsZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2RGVzYywgc3RhdGUsIG91dHB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBQcm9wYWdhdGUgZGV2aWNlIGF2YWlsYWJpbGl0eSB0byBFbmdpbmUKKyAgICAgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZEZXNjLCBzdGF0ZSk7CisKKyAgICAgICAgICAgIC8vIG91dHB1dHMgc2hvdWxkIG5ldmVyIGJlIGVtcHR5IGhlcmUKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKG91dHB1dHMuc2l6ZSgpICE9IDAsICJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKToiCisgICAgICAgICAgICAgICAgICAgICJjaGVja091dHB1dHNGb3JEZXZpY2UoKSByZXR1cm5lZCBubyBvdXRwdXRzIGJ1dCBzdGF0dXMgT0siKTsKKyAgICAgICAgICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBjaGVja091dHB1dHNGb3JEZXZpY2UoKSByZXR1cm5lZCAlenUgb3V0cHV0cyIsCisgICAgICAgICAgICAgICAgICBvdXRwdXRzLnNpemUoKSk7CisKKyAgICAgICAgICAgIC8vIFNlbmQgY29ubmVjdCB0byBIQUxzCisgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfQ09OTkVDVCksIGRldmljZSk7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwgcGFyYW0udG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlIGRpc2Nvbm5lY3Rpb24KKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOiB7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBub3QgY29ubmVjdGVkOiAleCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGlzY29ubmVjdGluZyBvdXRwdXQgZGV2aWNlICV4IiwgZGV2aWNlKTsKKworICAgICAgICAgICAgLy8gU2VuZCBEaXNjb25uZWN0IHRvIEhBTHMKKyAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoZGV2RGVzYy0+bUFkZHJlc3MpOworICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX0RFVklDRV9ESVNDT05ORUNUKSwgZGV2aWNlKTsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKEFVRElPX0lPX0hBTkRMRV9OT05FLCBwYXJhbS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgLy8gcmVtb3ZlIGRldmljZSBmcm9tIGF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlcworICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOworCisgICAgICAgICAgICBjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2RGVzYywgc3RhdGUsIG91dHB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKTsKKworICAgICAgICAgICAgLy8gUHJvcGFnYXRlIGRldmljZSBhdmFpbGFiaWxpdHkgdG8gRW5naW5lCisgICAgICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2RGVzYywgc3RhdGUpOworICAgICAgICAgICAgfSBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgc3RhdGU6ICV4Iiwgc3RhdGUpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrQTJkcFN1c3BlbmQgbXVzdCBydW4gYmVmb3JlIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcyBzbyB0aGF0IEEyRFAKKyAgICAgICAgLy8gb3V0cHV0IGlzIHN1c3BlbmRlZCBiZWZvcmUgYW55IHRyYWNrcyBhcmUgbW92ZWQgdG8gaXQKKyAgICAgICAgY2hlY2tBMmRwU3VzcGVuZCgpOworICAgICAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKKyAgICAgICAgLy8gb3V0cHV0cyBtdXN0IGJlIGNsb3NlZCBhZnRlciBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKSBpcyBleGVjdXRlZAorICAgICAgICBpZiAoIW91dHB1dHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHNbaV0pOworICAgICAgICAgICAgICAgIC8vIGNsb3NlIHVudXNlZCBvdXRwdXRzIGFmdGVyIGRldmljZSBkaXNjb25uZWN0aW9uIG9yIGRpcmVjdCBvdXRwdXRzIHRoYXQgaGF2ZSBiZWVuCisgICAgICAgICAgICAgICAgLy8gb3BlbmVkIGJ5IGNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHRvIHF1ZXJ5IGR5bmFtaWMgcGFyYW1ldGVycworICAgICAgICAgICAgICAgIGlmICgoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+bURpcmVjdE9wZW5Db3VudCA9PSAwKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0c1tpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gY2hlY2sgYWdhaW4gYWZ0ZXIgY2xvc2luZyBBMkRQIG91dHB1dCB0byByZXNldCBtQTJkcFN1c3BlbmRlZCBpZiBuZWVkZWQKKyAgICAgICAgICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisgICAgICAgIGlmIChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMICYmIGhhc1ByaW1hcnlPdXRwdXQoKSkgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2UpOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmICgobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpICE9IEFVRElPX01PREVfSU5fQ0FMTCkgfHwgKGRlc2MgIT0gbVByaW1hcnlPdXRwdXQpKSB7CisgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShkZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBmb3JjZSBkZXZpY2UgY2hhbmdlIG9uIGR1cGxpY2F0ZWQgb3V0cHV0IGJlY2F1c2UgaWYgZGV2aWNlIGlzIDAsIGl0IHdpbGwKKyAgICAgICAgICAgICAgICAvLyBhbHNvIGZvcmNlIGEgZGV2aWNlIDAgZm9yIHRoZSB0d28gb3V0cHV0cyBpdCBpcyBkdXBsaWNhdGVkIHRvIHdoaWNoIG1heSBvdmVycmlkZQorICAgICAgICAgICAgICAgIC8vIGEgdmFsaWQgZGV2aWNlIHNlbGVjdGlvbiBvbiB0aG9zZSBvdXRwdXRzLgorICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSAhZGVzYy0+aXNEdXBsaWNhdGVkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBmb3JjZSB3aGVuIGRpc2Nvbm5lY3RpbmcgKGEgbm9uLWR1cGxpY2F0ZWQgZGV2aWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkpOworICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShkZXNjLCBuZXdEZXZpY2UsIGZvcmNlLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gIC8vIGVuZCBpZiBpcyBvdXRwdXQgZGV2aWNlCisKKyAgICAvLyBoYW5kbGUgaW5wdXQgZGV2aWNlcworICAgIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICBTb3J0ZWRWZWN0b3IgPGF1ZGlvX2lvX2hhbmRsZV90PiBpbnB1dHM7CisKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihkZXZEZXNjKTsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkKKyAgICAgICAgeworICAgICAgICAvLyBoYW5kbGUgaW5wdXQgZGV2aWNlIGNvbm5lY3Rpb24KKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRTogeworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIGFscmVhZHkgY29ubmVjdGVkOiAlZCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRm9yRGV2aWNlKGRldmljZSk7CisgICAgICAgICAgICBpZiAobW9kdWxlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCk6IGNvdWxkIG5vdCBmaW5kIEhXIG1vZHVsZSBmb3IgZGV2aWNlICUwOHgiLAorICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNoZWNrSW5wdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBpbnB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5kZXggPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmFkZChkZXZEZXNjKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpbmRleF0tPmF0dGFjaChtb2R1bGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTZXQgY29ubmVjdCB0byBIQUxzCisgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfQ09OTkVDVCksIGRldmljZSk7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwgcGFyYW0udG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBkZXZpY2UgYXZhaWxhYmlsaXR5IHRvIEVuZ2luZQorICAgICAgICAgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldkRlc2MsIHN0YXRlKTsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICAvLyBoYW5kbGUgaW5wdXQgZGV2aWNlIGRpc2Nvbm5lY3Rpb24KKyAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOiB7CisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBub3QgY29ubmVjdGVkOiAlZCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGlzY29ubmVjdGluZyBpbnB1dCBkZXZpY2UgJXgiLCBkZXZpY2UpOworCisgICAgICAgICAgICAvLyBTZXQgRGlzY29ubmVjdCB0byBIQUxzCisgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfRElTQ09OTkVDVCksIGRldmljZSk7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhBVURJT19JT19IQU5ETEVfTk9ORSwgcGFyYW0udG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIGNoZWNrSW5wdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBpbnB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOworCisgICAgICAgICAgICAvLyBQcm9wYWdhdGUgZGV2aWNlIGF2YWlsYWJpbGl0eSB0byBFbmdpbmUKKyAgICAgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZEZXNjLCBzdGF0ZSk7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIHN0YXRlOiAleCIsIHN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBjbG9zZUFsbElucHV0cygpOworCisgICAgICAgIGlmIChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMICYmIGhhc1ByaW1hcnlPdXRwdXQoKSkgeworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2UpOworICAgICAgICB9CisKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSAvLyBlbmQgaWYgaXMgaW5wdXQgZGV2aWNlCisKKyAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBkZXZpY2U6ICV4IiwgZGV2aWNlKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCithdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKK3sKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKGRldmljZSwgZGV2aWNlX2FkZHJlc3MsICIiKTsKKworICAgIERldmljZVZlY3RvciAqZGV2aWNlVmVjdG9yOworCisgICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICBkZXZpY2VWZWN0b3IgPSAmbUF2YWlsYWJsZU91dHB1dERldmljZXM7CisgICAgfSBlbHNlIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICBkZXZpY2VWZWN0b3IgPSAmbUF2YWlsYWJsZUlucHV0RGV2aWNlczsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygiZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBkZXZpY2UgdHlwZSAlMDh4IiwgZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7CisgICAgfQorICAgIHJldHVybiBkZXZpY2VWZWN0b3ItPmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZEZXNjKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUNhbGxSb3V0aW5nKGF1ZGlvX2RldmljZXNfdCByeERldmljZSwgaW50IGRlbGF5TXMpCit7CisgICAgYm9vbCBjcmVhdGVUeFBhdGNoID0gZmFsc2U7CisgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOworICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKKyAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlOworICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0OworCisgICAgaWYoIWhhc1ByaW1hcnlPdXRwdXQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGF1ZGlvX2RldmljZXNfdCB0eERldmljZSA9IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OKTsKKyAgICBBTE9HVigidXBkYXRlQ2FsbFJvdXRpbmcgZGV2aWNlIHJ4RGV2aWNlICUwOHggdHhEZXZpY2UgJTA4eCIsIHJ4RGV2aWNlLCB0eERldmljZSk7CisKKyAgICAvLyByZWxlYXNlIGV4aXN0aW5nIFJYIHBhdGNoIGlmIGFueQorICAgIGlmIChtQ2FsbFJ4UGF0Y2ggIT0gMCkgeworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gobUNhbGxSeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgIG1DYWxsUnhQYXRjaC5jbGVhcigpOworICAgIH0KKyAgICAvLyByZWxlYXNlIFRYIHBhdGNoIGlmIGFueQorICAgIGlmIChtQ2FsbFR4UGF0Y2ggIT0gMCkgeworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gobUNhbGxUeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgIG1DYWxsVHhQYXRjaC5jbGVhcigpOworICAgIH0KKworICAgIC8vIElmIHRoZSBSWCBkZXZpY2UgaXMgb24gdGhlIHByaW1hcnkgSFcgbW9kdWxlLCB0aGVuIHVzZSBsZWdhY3kgcm91dGluZyBtZXRob2QgZm9yIHZvaWNlIGNhbGxzCisgICAgLy8gdmlhIHNldE91dHB1dERldmljZSgpIG9uIHByaW1hcnkgb3V0cHV0LgorICAgIC8vIE90aGVyd2lzZSwgY3JlYXRlIHR3byBhdWRpbyBwYXRjaGVzIGZvciBUWCBhbmQgUlggcGF0aC4KKyAgICBpZiAoYXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKSAmIHJ4RGV2aWNlKSB7CisgICAgICAgIHNldE91dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2UsIHRydWUsIGRlbGF5TXMpOworICAgICAgICAvLyBJZiB0aGUgVFggZGV2aWNlIGlzIGFsc28gb24gdGhlIHByaW1hcnkgSFcgbW9kdWxlLCBzZXRPdXRwdXREZXZpY2UoKSB3aWxsIHRha2UgY2FyZQorICAgICAgICAvLyBvZiBpdCBkdWUgdG8gbGVnYWN5IGltcGxlbWVudGF0aW9uLiBJZiBub3QsIGNyZWF0ZSBhIHBhdGNoLgorICAgICAgICBpZiAoKGF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKSAmIHR4RGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pCisgICAgICAgICAgICAgICAgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgIGNyZWF0ZVR4UGF0Y2ggPSB0cnVlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gY3JlYXRlIFJYIHBhdGggYXVkaW8gcGF0Y2gKKyAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShyeERldmljZSk7CisgICAgICAgIEFMT0dfQVNTRVJUKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgInVwZGF0ZUNhbGxSb3V0aW5nKCkgc2VsZWN0ZWQgZGV2aWNlIG5vdCBpbiBvdXRwdXQgZGV2aWNlIGxpc3QiKTsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gcnhTaW5rRGV2aWNlRGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOworICAgICAgICBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCk7CisgICAgICAgIEFMT0dfQVNTRVJUKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgInVwZGF0ZUNhbGxSb3V0aW5nKCkgbm8gdGVsZXBob255IFJYIGRldmljZSIpOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiByeFNvdXJjZURldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKKworICAgICAgICByeFNvdXJjZURldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzBdKTsKKyAgICAgICAgcnhTaW5rRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzWzBdKTsKKworICAgICAgICAvLyByZXF1ZXN0IHRvIHJldXNlIGV4aXN0aW5nIG91dHB1dCBzdHJlYW0gaWYgb25lIGlzIGFscmVhZHkgb3BlbmVkIHRvIHJlYWNoIHRoZSBSWCBkZXZpY2UKKyAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0c0ZvckRldmljZShyeERldmljZSwgbU91dHB1dHMpOworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfSU5WQUxJRCk7CisgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIFJYIGRldmljZSBvdXRwdXQgaXMgZHVwbGljYXRlZCIpOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMV0pOworICAgICAgICAgICAgcGF0Y2guc291cmNlc1sxXS5leHQubWl4LnVzZWNhc2Uuc3RyZWFtID0gQVVESU9fU1RSRUFNX1BBVENIOworICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAyOworICAgICAgICB9CisKKyAgICAgICAgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZhZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAidXBkYXRlQ2FsbFJvdXRpbmcoKSBlcnJvciAlZCBjcmVhdGluZyBSWCBhdWRpbyBwYXRjaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1DYWxsUnhQYXRjaCA9IG5ldyBBdWRpb1BhdGNoKCZwYXRjaCwgbVVpZENhY2hlZCk7CisgICAgICAgICAgICBtQ2FsbFJ4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIG1DYWxsUnhQYXRjaC0+bVVpZCA9IG1VaWRDYWNoZWQ7CisgICAgICAgIH0KKyAgICAgICAgY3JlYXRlVHhQYXRjaCA9IHRydWU7CisgICAgfQorICAgIGlmIChjcmVhdGVUeFBhdGNoKSB7CisKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOworICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7CisgICAgICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSh0eERldmljZSk7CisgICAgICAgIEFMT0dfQVNTRVJUKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgInVwZGF0ZUNhbGxSb3V0aW5nKCkgc2VsZWN0ZWQgZGV2aWNlIG5vdCBpbiBpbnB1dCBkZXZpY2UgbGlzdCIpOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiB0eFNvdXJjZURldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKKyAgICAgICAgdHhTb3VyY2VEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1swXSk7CisgICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgpOworICAgICAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCisgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIG5vIHRlbGVwaG9ueSBUWCBkZXZpY2UiKTsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gdHhTaW5rRGV2aWNlRGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOworICAgICAgICB0eFNpbmtEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc2lua3NbMF0pOworCisgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2UoQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgsIG1PdXRwdXRzKTsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQpOworICAgICAgICAvLyByZXF1ZXN0IHRvIHJldXNlIGV4aXN0aW5nIG91dHB1dCBzdHJlYW0gaWYgb25lIGlzIGFscmVhZHkgb3BlbmVkIHRvIHJlYWNoIHRoZSBUWAorICAgICAgICAvLyBwYXRoIG91dHB1dCBkZXZpY2UKKyAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1cGRhdGVDYWxsUm91dGluZygpIFJYIGRldmljZSBvdXRwdXQgaXMgZHVwbGljYXRlZCIpOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMV0pOworICAgICAgICAgICAgcGF0Y2guc291cmNlc1sxXS5leHQubWl4LnVzZWNhc2Uuc3RyZWFtID0gQVVESU9fU1RSRUFNX1BBVENIOworICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAyOworICAgICAgICB9CisKKyAgICAgICAgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZhZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgQUxPR1dfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAic2V0UGhvbmVTdGF0ZSgpIGVycm9yICVkIGNyZWF0aW5nIFRYIGF1ZGlvIHBhdGNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgbUNhbGxUeFBhdGNoID0gbmV3IEF1ZGlvUGF0Y2goJnBhdGNoLCBtVWlkQ2FjaGVkKTsKKyAgICAgICAgICAgIG1DYWxsVHhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOworICAgICAgICAgICAgbUNhbGxUeFBhdGNoLT5tVWlkID0gbVVpZENhY2hlZDsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKQoreworICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkgc3RhdGUgJWQiLCBzdGF0ZSk7CisgICAgLy8gc3RvcmUgcHJldmlvdXMgcGhvbmUgc3RhdGUgZm9yIG1hbmFnZW1lbnQgb2Ygc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGJlbG93CisgICAgaW50IG9sZFN0YXRlID0gbUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpOworCisgICAgaWYgKG1FbmdpbmUtPnNldFBob25lU3RhdGUoc3RhdGUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dXKCJzZXRQaG9uZVN0YXRlKCkgaW52YWxpZCBvciBzYW1lIHN0YXRlICVkIiwgc3RhdGUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vLyBPcGVuczogY2FuIHRoZXNlIGxpbmUgYmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHN3aXRjaCBvZiB2b2x1bWUgY3VydmVzPz8/CisgICAgLy8gaWYgbGVhdmluZyBjYWxsIHN0YXRlLCBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGFjdGl2ZSBzdHJlYW1zCisgICAgLy8gcGVydGFpbmluZyB0byBzb25pZmljYXRpb24gc3RyYXRlZ3kgc2VlIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpCisgICAgaWYgKGlzU3RhdGVJbkNhbGwob2xkU3RhdGUpKSB7CisgICAgICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkgaW4gY2FsbCBzdGF0ZSBtYW5hZ2VtZW50OiBuZXcgc3RhdGUgaXMgJWQiLCBzdGF0ZSk7CisgICAgICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7IHN0cmVhbSsrKSB7CisgICAgICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9QQVRDSCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgZmFsc2UsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZm9yY2UgcmVldmFsdWF0aW5nIGFjY2Vzc2liaWxpdHkgcm91dGluZyB3aGVuIGNhbGwgc3RvcHMKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN3aXRjaGluZyB0byBvciBmcm9tIGluY2FsbCBzdGF0ZSBvciBzd2l0Y2hpbmcgYmV0d2VlbiB0ZWxlcGhvbnkgYW5kIFZvSVAgbGVhZCB0byBmb3JjZQorICAgICAqIHJvdXRpbmcgY29tbWFuZC4KKyAgICAgKi8KKyAgICBib29sIGZvcmNlID0gKChpc19zdGF0ZV9pbl9jYWxsKG9sZFN0YXRlKSAhPSBpc19zdGF0ZV9pbl9jYWxsKHN0YXRlKSkKKyAgICAgICAgICAgICAgICAgIHx8IChpc19zdGF0ZV9pbl9jYWxsKHN0YXRlKSAmJiAoc3RhdGUgIT0gb2xkU3RhdGUpKSk7CisKKyAgICAvLyBjaGVjayBmb3IgZGV2aWNlIGFuZCBvdXRwdXQgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgbmV3IHBob25lIHN0YXRlCisgICAgY2hlY2tBMmRwU3VzcGVuZCgpOworICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOworICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisKKyAgICBpbnQgZGVsYXlNcyA9IDA7CisgICAgaWYgKGlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7CisgICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgLy8gbXV0ZSBtZWRpYSBhbmQgc29uaWZpY2F0aW9uIHN0cmF0ZWdpZXMgYW5kIGRlbGF5IGRldmljZSBzd2l0Y2ggYnkgdGhlIGxhcmdlc3QKKyAgICAgICAgICAgIC8vIGxhdGVuY3kgb2YgYW55IG91dHB1dCB3aGVyZSBlaXRoZXIgc3RyYXRlZ3kgaXMgYWN0aXZlLgorICAgICAgICAgICAgLy8gVGhpcyBhdm9pZCBzZW5kaW5nIHRoZSByaW5nIHRvbmUgb3IgbXVzaWMgdGFpbCBpbnRvIHRoZSBlYXJwaWVjZSBvciBoZWFkc2V0LgorICAgICAgICAgICAgaWYgKChpc1N0cmF0ZWd5QWN0aXZlKGRlc2MsIFNUUkFURUdZX01FRElBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c1RpbWUpIHx8CisgICAgICAgICAgICAgICAgIGlzU3RyYXRlZ3lBY3RpdmUoZGVzYywgU1RSQVRFR1lfU09OSUZJQ0FUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c1RpbWUpKSAmJgorICAgICAgICAgICAgICAgICAgICAoZGVsYXlNcyA8IChpbnQpZGVzYy0+bGF0ZW5jeSgpKjIpKSB7CisgICAgICAgICAgICAgICAgZGVsYXlNcyA9IGRlc2MtPmxhdGVuY3koKSoyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLCB0cnVlLCBkZXNjKTsKKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9NRURJQSwgZmFsc2UsIGRlc2MsIE1VVEVfVElNRV9NUywKKyAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgdHJ1ZSAvKmZyb21DYWNoZSovKSk7CisgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCB0cnVlLCBkZXNjKTsKKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZhbHNlLCBkZXNjLCBNVVRFX1RJTUVfTVMsCisgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCB0cnVlIC8qZnJvbUNhY2hlKi8pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChoYXNQcmltYXJ5T3V0cHV0KCkpIHsKKyAgICAgICAgLy8gTm90ZSB0aGF0IGRlc3BpdGUgdGhlIGZhY3QgdGhhdCBnZXROZXdPdXRwdXREZXZpY2UoKSBpcyBjYWxsZWQgb24gdGhlIHByaW1hcnkgb3V0cHV0LAorICAgICAgICAvLyB0aGUgZGV2aWNlIHJldHVybmVkIGlzIG5vdCBuZWNlc3NhcmlseSByZWFjaGFibGUgdmlhIHRoaXMgb3V0cHV0CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCByeERldmljZSA9IGdldE5ld091dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIGVuZGluZyBjYWxsCisgICAgICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKKyAgICAgICAgaWYgKGlzU3RhdGVJbkNhbGwob2xkU3RhdGUpICYmIHJ4RGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICByeERldmljZSA9IG1QcmltYXJ5T3V0cHV0LT5kZXZpY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKKyAgICAgICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKHJ4RGV2aWNlLCBkZWxheU1zKTsKKyAgICAgICAgfSBlbHNlIGlmIChvbGRTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwpIHsKKyAgICAgICAgICAgIGlmIChtQ2FsbFJ4UGF0Y2ggIT0gMCkgeworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChtQ2FsbFJ4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgICAgICAgICBtQ2FsbFJ4UGF0Y2guY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQ2FsbFR4UGF0Y2ggIT0gMCkgeworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChtQ2FsbFR4UGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgICAgICAgICBtQ2FsbFR4UGF0Y2guY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldE91dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2UsIGZvcmNlLCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2UsIGZvcmNlLCAwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBpZiBlbnRlcmluZyBpbiBjYWxsIHN0YXRlLCBoYW5kbGUgc3BlY2lhbCBjYXNlIG9mIGFjdGl2ZSBzdHJlYW1zCisgICAgLy8gcGVydGFpbmluZyB0byBzb25pZmljYXRpb24gc3RyYXRlZ3kgc2VlIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpCisgICAgaWYgKGlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7CisgICAgICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkgaW4gY2FsbCBzdGF0ZSBtYW5hZ2VtZW50OiBuZXcgc3RhdGUgaXMgJWQiLCBzdGF0ZSk7CisgICAgICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7IHN0cmVhbSsrKSB7CisgICAgICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9QQVRDSCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBmb3JjZSByZWV2YWx1YXRpbmcgYWNjZXNzaWJpbGl0eSByb3V0aW5nIHdoZW4gY2FsbCBzdGFydHMKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpOworICAgIH0KKworICAgIC8vIEZsYWcgdGhhdCByaW5ndG9uZSB2b2x1bWUgbXVzdCBiZSBsaW1pdGVkIHRvIG11c2ljIHZvbHVtZSB1bnRpbCB3ZSBleGl0IE1PREVfUklOR1RPTkUKKyAgICBpZiAoc3RhdGUgPT0gQVVESU9fTU9ERV9SSU5HVE9ORSAmJgorICAgICAgICBpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZKSkgeworICAgICAgICBtTGltaXRSaW5ndG9uZVZvbHVtZSA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUgPSBmYWxzZTsKKyAgICB9Cit9CisKK2F1ZGlvX21vZGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFBob25lU3RhdGUoKSB7CisgICAgcmV0dXJuIG1FbmdpbmUtPmdldFBob25lU3RhdGUoKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCit7CisgICAgQUxPR1YoInNldEZvcmNlVXNlKCkgdXNhZ2UgJWQsIGNvbmZpZyAlZCwgbVBob25lU3RhdGUgJWQiLCB1c2FnZSwgY29uZmlnLCBtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkpOworCisgICAgaWYgKG1FbmdpbmUtPnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGNvdWxkIG5vdCBzZXQgZm9yY2UgY2ZnICVkIGZvciB1c2FnZSAlZCIsIGNvbmZpZywgdXNhZ2UpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGJvb2wgZm9yY2VWb2x1bWVSZWV2YWwgPSAodXNhZ2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OKSB8fAorICAgICAgICAgICAgKHVzYWdlID09IEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DSykgfHwKKyAgICAgICAgICAgICh1c2FnZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSk7CisKKyAgICAvLyBjaGVjayBmb3IgZGV2aWNlIGFuZCBvdXRwdXQgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgbmV3IGZvcmNlIHVzYWdlCisgICAgY2hlY2tBMmRwU3VzcGVuZCgpOworICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOworICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisgICAgaWYgKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX0lOX0NBTEwgJiYgaGFzUHJpbWFyeU91dHB1dCgpKSB7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZSk7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIGlmICgobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpICE9IEFVRElPX01PREVfSU5fQ0FMTCkgfHwgKG91dHB1dERlc2MgIT0gbVByaW1hcnlPdXRwdXQpKSB7CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgbmV3RGV2aWNlLCAobmV3RGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcmNlVm9sdW1lUmVldmFsICYmIChuZXdEZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpKSB7CisgICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0RGVzYywgbmV3RGV2aWNlLCAwLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGFjdGl2ZUlucHV0ID0gbUlucHV0cy5nZXRBY3RpdmVJbnB1dCgpOworICAgIGlmIChhY3RpdmVJbnB1dCAhPSAwKSB7CisgICAgICAgIHNldElucHV0RGV2aWNlKGFjdGl2ZUlucHV0LCBnZXROZXdJbnB1dERldmljZShhY3RpdmVJbnB1dCkpOworICAgIH0KKworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3lzdGVtUHJvcGVydHkoY29uc3QgY2hhciogcHJvcGVydHksIGNvbnN0IGNoYXIqIHZhbHVlKQoreworICAgIEFMT0dWKCJzZXRTeXN0ZW1Qcm9wZXJ0eSgpIHByb3BlcnR5ICVzLCB2YWx1ZSAlcyIsIHByb3BlcnR5LCB2YWx1ZSk7Cit9CisKKy8vIEZpbmQgYSBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgY29tcGF0aWJsZSB3aXRoIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCwgZXZlbiBpZiB0aGUgaW5wdXQgZmxhZ3MgZG8KKy8vIG5vdCBleHBsaWNpdGx5IHJlcXVlc3QgYSBkaXJlY3Qgb3V0cHV0CitzcDxJT1Byb2ZpbGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQoreworICAgIC8vIG9ubHkgcmV0YWluIGZsYWdzIHRoYXQgd2lsbCBkcml2ZSB0aGUgZGlyZWN0IG91dHB1dCBwcm9maWxlIHNlbGVjdGlvbgorICAgIC8vIGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtSZWxldmFudEZsYWdzID0KKyAgICAgICAgICAgIChBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCk7CisgICAgZmxhZ3MgPQorICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKChmbGFncyAmIGtSZWxldmFudEZsYWdzKSB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGU7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gY3VyUHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXTsKKyAgICAgICAgICAgIGlmICghY3VyUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2UsIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIE5VTEwgLyp1cGRhdGVkU2FtcGxpbmdSYXRlKi8sCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgTlVMTCAvKnVwZGF0ZWRGb3JtYXQqLywKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIE5VTEwgLyp1cGRhdGVkQ2hhbm5lbE1hc2sqLywKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyByZWplY3QgcHJvZmlsZXMgbm90IGNvcnJlc3BvbmRpbmcgdG8gYSBkZXZpY2UgY3VycmVudGx5IGF2YWlsYWJsZQorICAgICAgICAgICAgaWYgKChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgY3VyUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaWYgc2V2ZXJhbCBwcm9maWxlcyBhcmUgY29tcGF0aWJsZSwgZ2l2ZSBwcmlvcml0eSB0byBvbmUgd2l0aCBvZmZsb2FkIGNhcGFiaWxpdHkKKyAgICAgICAgICAgIGlmIChwcm9maWxlICE9IDAgJiYgKChjdXJQcm9maWxlLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSA9PSAwKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvZmlsZSA9IGN1clByb2ZpbGU7CisgICAgICAgICAgICBpZiAoKHByb2ZpbGUtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcHJvZmlsZTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKQoreworICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgQUxPR1YoImdldE91dHB1dCgpIGRldmljZSAlZCwgc3RyZWFtICVkLCBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAleCwgY2hhbm5lbE1hc2sgJXgsIGZsYWdzICV4IiwKKyAgICAgICAgICBkZXZpY2UsIHN0cmVhbSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncyk7CisKKyAgICByZXR1cm4gZ2V0T3V0cHV0Rm9yRGV2aWNlKGRldmljZSwgQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgc2FtcGxpbmdSYXRlLGZvcm1hdCwgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgb2ZmbG9hZEluZm8pOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCit7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXM7CisgICAgaWYgKGF0dHIgIT0gTlVMTCkgeworICAgICAgICBpZiAoIWlzVmFsaWRBdHRyaWJ1dGVzKGF0dHIpKSB7CisgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cigpIGludmFsaWQgYXR0cmlidXRlczogdXNhZ2U9JWQgY29udGVudD0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCisgICAgICAgICAgICAgICAgICBhdHRyLT51c2FnZSwgYXR0ci0+Y29udGVudF90eXBlLCBhdHRyLT5mbGFncywKKyAgICAgICAgICAgICAgICAgIGF0dHItPnRhZ3MpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBhdHRyaWJ1dGVzID0gKmF0dHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCpzdHJlYW0gPCBBVURJT19TVFJFQU1fTUlOIHx8ICpzdHJlYW0gPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyKCk6ICBpbnZhbGlkIHN0cmVhbSB0eXBlIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHN0cmVhbV90eXBlX3RvX2F1ZGlvX2F0dHJpYnV0ZXMoKnN0cmVhbSwgJmF0dHJpYnV0ZXMpOworICAgIH0KKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYzsKKyAgICBpZiAobVBvbGljeU1peGVzLmdldE91dHB1dEZvckF0dHIoYXR0cmlidXRlcywgZGVzYykgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR19BU1NFUlQoZGVzYyAhPSAwLCAiSW52YWxpZCBkZXNjIHJldHVybmVkIGJ5IGdldE91dHB1dEZvckF0dHIiKTsKKyAgICAgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgKnN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmYXR0cmlidXRlcyk7CisgICAgICAgICpvdXRwdXQgPSBkZXNjLT5tSW9IYW5kbGU7CisgICAgICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgcmV0dXJucyBvdXRwdXQgJWQiLCAqb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBpZiAoYXR0cmlidXRlcy51c2FnZSA9PSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSkgeworICAgICAgICBBTE9HVygiZ2V0T3V0cHV0Rm9yQXR0cigpIG5vIHBvbGljeSBtaXggZm91bmQgZm9yIHVzYWdlIEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQUxPR1YoImdldE91dHB1dEZvckF0dHIoKSB1c2FnZT0lZCwgY29udGVudD0lZCwgdGFnPSVzIGZsYWdzPSUwOHgiCisgICAgICAgICAgICAiIHNlc3Npb24gJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCIsCisgICAgICAgICAgICBhdHRyaWJ1dGVzLnVzYWdlLCBhdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSwgYXR0cmlidXRlcy50YWdzLCBhdHRyaWJ1dGVzLmZsYWdzLAorICAgICAgICAgICAgc2Vzc2lvbiwgc2VsZWN0ZWREZXZpY2VJZCk7CisKKyAgICAqc3RyZWFtID0gc3RyZWFtVHlwZWZyb21BdHRyaWJ1dGVzSW50KCZhdHRyaWJ1dGVzKTsKKworICAgIC8vIEV4cGxpY2l0IHJvdXRpbmc/CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYzsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXS0+Z2V0SWQoKSA9PSBzZWxlY3RlZERldmljZUlkKSB7CisgICAgICAgICAgICBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBtT3V0cHV0Um91dGVzLmFkZFJvdXRlKHNlc3Npb24sICpzdHJlYW0sIFNlc3Npb25Sb3V0ZTo6U09VUkNFX1RZUEVfTkEsIGRldmljZURlc2MsIHVpZCk7CisKKyAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gKHJvdXRpbmdfc3RyYXRlZ3kpIGdldFN0cmF0ZWd5Rm9yQXR0cigmYXR0cmlidXRlcyk7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKworICAgIGlmICgoYXR0cmlidXRlcy5mbGFncyAmIEFVRElPX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgeworICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKTsKKyAgICB9CisKKyAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIGRldmljZSAweCV4LCBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAleCwgY2hhbm5lbE1hc2sgJXgsIGZsYWdzICV4IiwKKyAgICAgICAgICBkZXZpY2UsIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZmxhZ3MpOworCisgICAgKm91dHB1dCA9IGdldE91dHB1dEZvckRldmljZShkZXZpY2UsIHNlc3Npb24sICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgb2ZmbG9hZEluZm8pOworICAgIGlmICgqb3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIG1PdXRwdXRSb3V0ZXMucmVtb3ZlUm91dGUoc2Vzc2lvbik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0Rm9yRGV2aWNlKAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiBfX3VudXNlZCwKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKK3sKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICB1aW50MzJfdCBsYXRlbmN5ID0gMDsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgIGlmIChtQ3VyT3V0cHV0ICE9IDApIHsKKyAgICAgICAgQUxPR1YoImdldE91dHB1dCgpIHRlc3Qgb3V0cHV0IG1DdXJPdXRwdXQgJWQsIHNhbXBsaW5nUmF0ZSAlZCwgZm9ybWF0ICVkLCBjaGFubmVsTWFzayAleCwgbURpcmVjdE91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgbUN1ck91dHB1dCwgbVRlc3RTYW1wbGluZ1JhdGUsIG1UZXN0Rm9ybWF0LCBtVGVzdENoYW5uZWxzLCBtRGlyZWN0T3V0cHV0KTsKKworICAgICAgICBpZiAobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdID09IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSBvcGVuaW5nIHRlc3Qgb3V0cHV0Iik7CisgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZSk7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gbVRlc3REZXZpY2U7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5tTGF0ZW5jeSA9IG1UZXN0TGF0ZW5jeU1zOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzID0KKyAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KShtRGlyZWN0T3V0cHV0ID8gQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIDogMCk7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9IDA7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBtVGVzdFNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBtVGVzdENoYW5uZWxzOworICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG1UZXN0Rm9ybWF0OworICAgICAgICAgICAgaWYgKG9mZmxvYWRJbmZvICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvID0gKm9mZmxvYWRJbmZvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bUxhdGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgICAgICAgICAgb3V0cHV0Q21kLmFkZEludChTdHJpbmc4KCJzZXRfaWQiKSxtQ3VyT3V0cHV0KTsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sb3V0cHV0Q21kLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGFkZE91dHB1dChtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0sIG91dHB1dERlc2MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBtVGVzdE91dHB1dHNbbUN1ck91dHB1dF07CisgICAgfQorI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKKworICAgIC8vIG9wZW4gYSBkaXJlY3Qgb3V0cHV0IGlmIHJlcXVpcmVkIGJ5IHNwZWNpZmllZCBwYXJhbWV0ZXJzCisgICAgLy9mb3JjZSBkaXJlY3QgZmxhZyBpZiBvZmZsb2FkIGZsYWcgaXMgc2V0OiBvZmZsb2FkaW5nIGltcGxpZXMgYSBkaXJlY3Qgb3V0cHV0IHN0cmVhbQorICAgIC8vIGFuZCBhbGwgY29tbW9uIGJlaGF2aW9ycyBhcmUgZHJpdmVuIGJ5IGNoZWNraW5nIG9ubHkgdGhlIGRpcmVjdCBmbGFnCisgICAgLy8gdGhpcyBzaG91bGQgbm9ybWFsbHkgYmUgc2V0IGFwcHJvcHJpYXRlbHkgaW4gdGhlIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUKKyAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgeworICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIH0KKyAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgeworICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIH0KKyAgICAvLyBvbmx5IGFsbG93IGRlZXAgYnVmZmVyaW5nIGZvciBtdXNpYyBzdHJlYW0gdHlwZQorICAgIGlmIChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX01VU0lDKSB7CisgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyAmfkFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSKTsKKyAgICB9IGVsc2UgaWYgKC8qIHN0cmVhbSA9PSBBVURJT19TVFJFQU1fTVVTSUMgJiYgKi8KKyAgICAgICAgICAgIGZsYWdzID09IEFVRElPX09VVFBVVF9GTEFHX05PTkUgJiYKKyAgICAgICAgICAgIHByb3BlcnR5X2dldF9ib29sKCJhdWRpby5kZWVwX2J1ZmZlci5tZWRpYSIsIGZhbHNlIC8qIGRlZmF1bHRfdmFsdWUgKi8pKSB7CisgICAgICAgIC8vIHVzZSBERUVQX0JVRkZFUiBhcyBkZWZhdWx0IG91dHB1dCBmb3IgbXVzaWMgc3RyZWFtIHR5cGUKKyAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVI7CisgICAgfQorICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1RUUykgeworICAgICAgICBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX1RUUzsKKyAgICB9CisKKyAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGU7CisKKyAgICAvLyBza2lwIGRpcmVjdCBvdXRwdXQgc2VsZWN0aW9uIGlmIHRoZSByZXF1ZXN0IGNhbiBvYnZpb3VzbHkgYmUgYXR0YWNoZWQgdG8gYSBtaXhlZCBvdXRwdXQKKyAgICAvLyBhbmQgbm90IGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgICAgaWYgKCgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpID09IDApICYmCisgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYgc2FtcGxpbmdSYXRlIDw9IE1BWF9NSVhFUl9TQU1QTElOR19SQVRFICYmCisgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spIDw9IDIpIHsKKyAgICAgICAgZ290byBub25fZGlyZWN0X291dHB1dDsKKyAgICB9CisKKyAgICAvLyBEbyBub3QgYWxsb3cgb2ZmbG9hZGluZyBpZiBvbmUgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdCBpcyBlbmFibGVkLiBUaGlzIHByZXZlbnRzIGZyb20KKyAgICAvLyBjcmVhdGluZyBhbiBvZmZsb2FkZWQgdHJhY2sgYW5kIHRlYXJpbmcgaXQgZG93biBpbW1lZGlhdGVseSBhZnRlciBzdGFydCB3aGVuIGF1ZGlvZmxpbmdlcgorICAgIC8vIGRldGVjdHMgdGhlcmUgaXMgYW4gYWN0aXZlIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QuCisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBjaGVjayB0aGUgYXVkaW8gc2Vzc2lvbiBoZXJlIGJ1dCB3ZSBkbyBub3QgaGF2ZSBpdCBpbiB0aGlzIGNvbnRleHQuCisgICAgLy8gVGhpcyBtYXkgcHJldmVudCBvZmZsb2FkaW5nIGluIHJhcmUgc2l0dWF0aW9ucyB3aGVyZSBlZmZlY3RzIGFyZSBsZWZ0IGFjdGl2ZSBieSBhcHBzCisgICAgLy8gaW4gdGhlIGJhY2tncm91bmQuCisKKyAgICBpZiAoKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpID09IDApIHx8CisgICAgICAgICAgICAhbUVmZmVjdHMuaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSkgeworICAgICAgICBwcm9maWxlID0gZ2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dChkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpZmxhZ3MpOworICAgIH0KKworICAgIGlmIChwcm9maWxlICE9IDApIHsKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBOVUxMOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgKHByb2ZpbGUgPT0gZGVzYy0+bVByb2ZpbGUpKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYyA9IGRlc2M7CisgICAgICAgICAgICAgICAgLy8gcmV1c2UgZGlyZWN0IG91dHB1dCBpZiBjdXJyZW50bHkgb3BlbiBhbmQgY29uZmlndXJlZCB3aXRoIHNhbWUgcGFyYW1ldGVycworICAgICAgICAgICAgICAgIGlmICgoc2FtcGxpbmdSYXRlID09IG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybWF0ID09IG91dHB1dERlc2MtPm1Gb3JtYXQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrKSkgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGlyZWN0T3BlbkNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSByZXVzaW5nIGRpcmVjdCBvdXRwdXQgJWQiLCBtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtT3V0cHV0cy5rZXlBdChpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gY2xvc2UgZGlyZWN0IG91dHB1dCBpZiBjdXJyZW50bHkgb3BlbiBhbmQgY29uZmlndXJlZCB3aXRoIGRpZmZlcmVudCBwYXJhbWV0ZXJzCisgICAgICAgIGlmIChvdXRwdXREZXNjICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB0aGUgc2VsZWN0ZWQgcHJvZmlsZSBpcyBvZmZsb2FkZWQgYW5kIG5vIG9mZmxvYWQgaW5mbyB3YXMgc3BlY2lmaWVkLAorICAgICAgICAvLyBjcmVhdGUgYSBkZWZhdWx0IG9uZQorICAgICAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBkZWZhdWx0T2ZmbG9hZEluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworICAgICAgICBpZiAoKHByb2ZpbGUtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICYmICFvZmZsb2FkSW5mbykgeworICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCk7CisgICAgICAgICAgICBkZWZhdWx0T2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUgPSBzYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBkZWZhdWx0T2ZmbG9hZEluZm8uY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7CisgICAgICAgICAgICBkZWZhdWx0T2ZmbG9hZEluZm8uZm9ybWF0ID0gZm9ybWF0OworICAgICAgICAgICAgZGVmYXVsdE9mZmxvYWRJbmZvLnN0cmVhbV90eXBlID0gc3RyZWFtOworICAgICAgICAgICAgZGVmYXVsdE9mZmxvYWRJbmZvLmJpdF9yYXRlID0gMDsKKyAgICAgICAgICAgIGRlZmF1bHRPZmZsb2FkSW5mby5kdXJhdGlvbl91cyA9IC0xOworICAgICAgICAgICAgZGVmYXVsdE9mZmxvYWRJbmZvLmhhc192aWRlbyA9IHRydWU7IC8vIGNvbnNlcnZhdGl2ZQorICAgICAgICAgICAgZGVmYXVsdE9mZmxvYWRJbmZvLmlzX3N0cmVhbWluZyA9IHRydWU7IC8vIGxpa2VseQorICAgICAgICAgICAgb2ZmbG9hZEluZm8gPSAmZGVmYXVsdE9mZmxvYWRJbmZvOworICAgICAgICB9CisKKyAgICAgICAgb3V0cHV0RGVzYyA9IG5ldyBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihwcm9maWxlLCBtcENsaWVudEludGVyZmFjZSk7CisgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CisgICAgICAgIG91dHB1dERlc2MtPm1MYXRlbmN5ID0gMDsKKyAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShvdXRwdXREZXNjLT5tRmxhZ3MgfCBmbGFncyk7CisgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gc2FtcGxpbmdSYXRlOworICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7CisgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgIGlmIChvZmZsb2FkSW5mbyAhPSBOVUxMKSB7CisgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvID0gKm9mZmxvYWRJbmZvOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KHByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXREZXNjLT5tTGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKKworICAgICAgICAvLyBvbmx5IGFjY2VwdCBhbiBvdXRwdXQgd2l0aCB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlcnMKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fAorICAgICAgICAgICAgKHNhbXBsaW5nUmF0ZSAhPSAwICYmIHNhbXBsaW5nUmF0ZSAhPSBjb25maWcuc2FtcGxlX3JhdGUpIHx8CisgICAgICAgICAgICAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUICYmIGZvcm1hdCAhPSBjb25maWcuZm9ybWF0KSB8fAorICAgICAgICAgICAgKGNoYW5uZWxNYXNrICE9IDAgJiYgY2hhbm5lbE1hc2sgIT0gY29uZmlnLmNoYW5uZWxfbWFzaykpIHsKKyAgICAgICAgICAgIEFMT0dWKCJnZXRPdXRwdXQoKSBmYWlsZWQgb3BlbmluZyBkaXJlY3Qgb3V0cHV0OiBvdXRwdXQgJWQgc2FtcGxpbmdSYXRlICVkICVkLCIKKyAgICAgICAgICAgICAgICAgICAgImZvcm1hdCAlZCAlZCwgY2hhbm5lbE1hc2sgJTA0eCAlMDR4Iiwgb3V0cHV0LCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUsIGZvcm1hdCwgb3V0cHV0RGVzYy0+bUZvcm1hdCwgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayk7CisgICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmYWxsIGJhY2sgdG8gbWl4ZXIgb3V0cHV0IGlmIHBvc3NpYmxlIHdoZW4gdGhlIGRpcmVjdCBvdXRwdXQgY291bGQgbm90IGJlIG9wZW4KKyAgICAgICAgICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYgc2FtcGxpbmdSYXRlIDw9IE1BWF9NSVhFUl9TQU1QTElOR19SQVRFKSB7CisgICAgICAgICAgICAgICAgZ290byBub25fZGlyZWN0X291dHB1dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICAgICAgb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPSAwOworICAgICAgICBvdXRwdXREZXNjLT5tU3RvcFRpbWVbc3RyZWFtXSA9IDA7CisgICAgICAgIG91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQgPSAxOworCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCA9IGdldE91dHB1dEZvckVmZmVjdCgpOworICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBvdXRwdXREZXNjKTsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRWZmZWN0KCk7CisgICAgICAgIGlmIChkc3RPdXRwdXQgPT0gb3V0cHV0KSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+bW92ZUVmZmVjdHMoQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCBzcmNPdXRwdXQsIGRzdE91dHB1dCk7CisgICAgICAgIH0KKyAgICAgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOworICAgICAgICBBTE9HVigiZ2V0T3V0cHV0KCkgcmV0dXJucyBuZXcgZGlyZWN0IG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICB9CisKK25vbl9kaXJlY3Rfb3V0cHV0OgorICAgIC8vIGlnbm9yaW5nIGNoYW5uZWwgbWFzayBkdWUgdG8gZG93bm1peCBjYXBhYmlsaXR5IGluIG1peGVyCisKKyAgICAvLyBvcGVuIGEgbm9uIGRpcmVjdCBvdXRwdXQKKworICAgIC8vIGZvciBub24gZGlyZWN0IG91dHB1dHMsIG9ubHkgUENNIGlzIHN1cHBvcnRlZAorICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKKyAgICAgICAgLy8gZ2V0IHdoaWNoIG91dHB1dCBpcyBzdWl0YWJsZSBmb3IgdGhlIHNwZWNpZmllZCBzdHJlYW0uIFRoZSBhY3R1YWwKKyAgICAgICAgLy8gcm91dGluZyBjaGFuZ2Ugd2lsbCBoYXBwZW4gd2hlbiBzdGFydE91dHB1dCgpIHdpbGwgYmUgY2FsbGVkCisgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBtT3V0cHV0cyk7CisKKyAgICAgICAgLy8gYXQgdGhpcyBzdGFnZSB3ZSBzaG91bGQgaWdub3JlIHRoZSBESVJFQ1QgZmxhZyBhcyBubyBkaXJlY3Qgb3V0cHV0IGNvdWxkIGJlIGZvdW5kIGVhcmxpZXIKKyAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgICAgIG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLCBmbGFncywgZm9ybWF0KTsKKyAgICB9CisgICAgQUxPR1dfSUYoKG91dHB1dCA9PSAwKSwgImdldE91dHB1dCgpIGNvdWxkIG5vdCBmaW5kIG91dHB1dCBmb3Igc3RyZWFtICVkLCBzYW1wbGluZ1JhdGUgJWQsIgorICAgICAgICAgICAgImZvcm1hdCAlZCwgY2hhbm5lbHMgJXgsIGZsYWdzICV4Iiwgc3RyZWFtLCBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZsYWdzKTsKKworICAgIEFMT0dWKCIgIGdldE91dHB1dEZvckRldmljZSgpIHJldHVybnMgb3V0cHV0ICVkIiwgb3V0cHV0KTsKKworICAgIHJldHVybiBvdXRwdXQ7Cit9CisKK2F1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2VsZWN0T3V0cHV0KGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQoreworICAgIC8vIHNlbGVjdCBvbmUgb3V0cHV0IGFtb25nIHNldmVyYWwgdGhhdCBwcm92aWRlIGEgcGF0aCB0byBhIHBhcnRpY3VsYXIgZGV2aWNlIG9yIHNldCBvZgorICAgIC8vIGRldmljZXMgKHRoZSBsaXN0IHdhcyBwcmV2aW91c2x5IGJ1aWxkIGJ5IGdldE91dHB1dHNGb3JEZXZpY2UoKSkuCisgICAgLy8gVGhlIHByaW9yaXR5IGlzIGFzIGZvbGxvd3M6CisgICAgLy8gMTogdGhlIG91dHB1dCB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBvZiByZXF1ZXN0ZWQgcG9saWN5IGZsYWdzCisgICAgLy8gMjogdGhlIHByaW1hcnkgb3V0cHV0CisgICAgLy8gMzogdGhlIGZpcnN0IG91dHB1dCBpbiB0aGUgbGlzdAorCisgICAgaWYgKG91dHB1dHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChvdXRwdXRzLnNpemUoKSA9PSAxKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRzWzBdOworICAgIH0KKworICAgIGludCBtYXhDb21tb25GbGFncyA9IDA7CisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0RmxhZ3MgPSAwOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dFByaW1hcnkgPSAwOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0c1tpXSk7CisgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgICAgIC8vIGlmIGEgdmFsaWQgZm9ybWF0IGlzIHNwZWNpZmllZCwgc2tpcCBvdXRwdXQgaWYgbm90IGNvbXBhdGlibGUKKyAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gQVVESU9fRk9STUFUX0lOVkFMSUQpIHsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gb3V0cHV0RGVzYy0+bUZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgY29tbW9uRmxhZ3MgPSBwb3Bjb3VudChvdXRwdXREZXNjLT5tUHJvZmlsZS0+bUZsYWdzICYgZmxhZ3MpOworICAgICAgICAgICAgaWYgKGNvbW1vbkZsYWdzID4gbWF4Q29tbW9uRmxhZ3MpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRGbGFncyA9IG91dHB1dHNbaV07CisgICAgICAgICAgICAgICAgbWF4Q29tbW9uRmxhZ3MgPSBjb21tb25GbGFnczsKKyAgICAgICAgICAgICAgICBBTE9HVigic2VsZWN0T3V0cHV0KCkgY29tbW9uRmxhZ3MgZm9yIG91dHB1dCAlZCwgJTA0eCIsIG91dHB1dHNbaV0sIGNvbW1vbkZsYWdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUHJvZmlsZS0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSkgeworICAgICAgICAgICAgICAgIG91dHB1dFByaW1hcnkgPSBvdXRwdXRzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG91dHB1dEZsYWdzICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dEZsYWdzOworICAgIH0KKyAgICBpZiAob3V0cHV0UHJpbWFyeSAhPSAwKSB7CisgICAgICAgIHJldHVybiBvdXRwdXRQcmltYXJ5OworICAgIH0KKworICAgIHJldHVybiBvdXRwdXRzWzBdOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgQUxPR1YoInN0YXJ0T3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLAorICAgICAgICAgIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInN0YXJ0T3V0cHV0KCkgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7CisKKyAgICAvLyBSb3V0aW5nPworICAgIG1PdXRwdXRSb3V0ZXMuaW5jUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKKworICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2U7CisgICAgaWYgKG91dHB1dERlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCkgeworICAgICAgICBuZXdEZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg7CisgICAgfSBlbHNlIGlmIChtT3V0cHV0Um91dGVzLmhhc1JvdXRlQ2hhbmdlZChzZXNzaW9uKSkgeworICAgICAgICBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIGNoZWNrU3RyYXRlZ3lSb3V0ZShnZXRTdHJhdGVneShzdHJlYW0pLCBvdXRwdXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG5ld0RldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgIH0KKworICAgIHVpbnQzMl90IGRlbGF5TXMgPSAwOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRTb3VyY2Uob3V0cHV0RGVzYywgc3RyZWFtLCBuZXdEZXZpY2UsICZkZWxheU1zKTsKKworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgbU91dHB1dFJvdXRlcy5kZWNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICAvLyBBdXRvbWF0aWNhbGx5IGVuYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBpbnB1dCB3aGVuIG91dHB1dCBpcyBzdGFydGVkIG9uIGEgcmUgcm91dGluZyBtaXgKKyAgICAvLyBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUworICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShuZXdEZXZpY2UpICYmIG91dHB1dERlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCAmJgorICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7CisgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4LT5tUmVnaXN0cmF0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICJyZW1vdGUtc3VibWl4Iik7CisgICAgfQorCisgICAgaWYgKGRlbGF5TXMgIT0gMCkgeworICAgICAgICB1c2xlZXAoZGVsYXlNcyAqIDEwMDApOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRTb3VyY2Uoc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRlbGF5TXMpCit7CisgICAgLy8gY2Fubm90IHN0YXJ0IHBsYXliYWNrIG9mIFNUUkVBTV9UVFMgaWYgYW55IG90aGVyIG91dHB1dCBpcyBiZWluZyB1c2VkCisgICAgdWludDMyX3QgYmVhY29uTXV0ZUxhdGVuY3kgPSAwOworCisgICAgKmRlbGF5TXMgPSAwOworICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1RUUykgeworICAgICAgICBBTE9HVigiXHQgZm91bmQgQkVBQ09OIHN0cmVhbSIpOworICAgICAgICBpZiAobU91dHB1dHMuaXNBbnlPdXRwdXRBY3RpdmUoQVVESU9fU1RSRUFNX1RUUyAvKnN0cmVhbVRvSWdub3JlKi8pKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiZWFjb25NdXRlTGF0ZW5jeSA9IGhhbmRsZUV2ZW50Rm9yQmVhY29uKFNUQVJUSU5HX0JFQUNPTik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBzb21lIHBsYXliYWNrIG90aGVyIHRoYW4gYmVhY29uIHN0YXJ0cworICAgICAgICBiZWFjb25NdXRlTGF0ZW5jeSA9IGhhbmRsZUV2ZW50Rm9yQmVhY29uKFNUQVJUSU5HX09VVFBVVCk7CisgICAgfQorCisgICAgLy8gY2hlY2sgYWN0aXZlIGJlZm9yZSBpbmNyZW1lbnRpbmcgdXNhZ2UgY291bnQKKyAgICBib29sIGZvcmNlID0gIW91dHB1dERlc2MtPmlzQWN0aXZlKCk7CisKKyAgICAvLyBpbmNyZW1lbnQgdXNhZ2UgY291bnQgZm9yIHRoaXMgc3RyZWFtIG9uIHRoZSByZXF1ZXN0ZWQgb3V0cHV0OgorICAgIC8vIE5PVEUgdGhhdCB0aGUgdXNhZ2UgY291bnQgaXMgdGhlIHNhbWUgZm9yIGR1cGxpY2F0ZWQgb3V0cHV0IGFuZCBoYXJkd2FyZSBvdXRwdXQgd2hpY2ggaXMKKyAgICAvLyBuZWNlc3NhcnkgZm9yIGEgY29ycmVjdCBjb250cm9sIG9mIGhhcmR3YXJlIG91dHB1dCByb3V0aW5nIGJ5IHN0YXJ0T3V0cHV0KCkgYW5kIHN0b3BPdXRwdXQoKQorICAgIG91dHB1dERlc2MtPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgMSk7CisKKyAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPT0gMSB8fCBkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgLy8gc3RhcnRpbmcgYW4gb3V0cHV0IGJlaW5nIHJlcm91dGVkPworICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIH0KKyAgICAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7CisgICAgICAgIGJvb2wgc2hvdWxkV2FpdCA9IChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZWFjb25NdXRlTGF0ZW5jeSA+IDApOworICAgICAgICB1aW50MzJfdCB3YWl0TXMgPSBiZWFjb25NdXRlTGF0ZW5jeTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChkZXNjICE9IG91dHB1dERlc2MpIHsKKyAgICAgICAgICAgICAgICAvLyBmb3JjZSBhIGRldmljZSBjaGFuZ2UgaWYgYW55IG90aGVyIG91dHB1dCBpcyBtYW5hZ2VkIGJ5IHRoZSBzYW1lIGh3CisgICAgICAgICAgICAgICAgLy8gbW9kdWxlIGFuZCBoYXMgYSBjdXJyZW50IGRldmljZSBzZWxlY3Rpb24gdGhhdCBkaWZmZXJzIGZyb20gc2VsZWN0ZWQgZGV2aWNlLgorICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIGF1ZGlvIEhBTCBtdXN0IHJlY2VpdmUgdGhlIG5ldyBkZXZpY2Ugc2VsZWN0aW9uIHNvIHRoYXQgaXQgY2FuCisgICAgICAgICAgICAgICAgLy8gY2hhbmdlIHRoZSBkZXZpY2UgY3VycmVudGx5IHNlbGVjdGVkIGJ5IHRoZSBvdGhlciBhY3RpdmUgb3V0cHV0LgorICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5zaGFyZXNId01vZHVsZVdpdGgoZGVzYykgJiYKKyAgICAgICAgICAgICAgICAgICAgZGVzYy0+ZGV2aWNlKCkgIT0gZGV2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcmNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgYXVkaW8gb24gb3RoZXIgYWN0aXZlIG91dHB1dHMgdG8gYmUgcHJlc2VudGVkIHdoZW4gc3RhcnRpbmcKKyAgICAgICAgICAgICAgICAvLyBhIG5vdGlmaWNhdGlvbiBzbyB0aGF0IGF1ZGlvIGZvY3VzIGVmZmVjdCBjYW4gcHJvcGFnYXRlLCBvciB0aGF0IGEgbXV0ZS91bm11dGUKKyAgICAgICAgICAgICAgICAvLyBldmVudCBvY2N1cnJlZCBmb3IgYmVhY29uCisgICAgICAgICAgICAgICAgdWludDMyX3QgbGF0ZW5jeSA9IGRlc2MtPmxhdGVuY3koKTsKKyAgICAgICAgICAgICAgICBpZiAoc2hvdWxkV2FpdCAmJiBkZXNjLT5pc0FjdGl2ZShsYXRlbmN5ICogMikgJiYgKHdhaXRNcyA8IGxhdGVuY3kpKSB7CisgICAgICAgICAgICAgICAgICAgIHdhaXRNcyA9IGxhdGVuY3k7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IG11dGVXYWl0TXMgPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZGV2aWNlLCBmb3JjZSk7CisKKyAgICAgICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZSBmb3Igc29uaWZpY2F0aW9uIHdoaWxlIGluIGNhbGwKKyAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKKyAgICAgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihzdHJlYW0sIHRydWUsIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFwcGx5IHZvbHVtZSBydWxlcyBmb3IgY3VycmVudCBzdHJlYW0gYW5kIGRldmljZSBpZiBuZWNlc3NhcnkKKyAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtcy52YWx1ZUZvcihzdHJlYW0pLmdldFZvbHVtZUluZGV4KGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CisKKyAgICAgICAgLy8gdXBkYXRlIHRoZSBvdXRwdXRzIGlmIHN0YXJ0aW5nIGFuIG91dHB1dCB3aXRoIGEgc3RyZWFtIHRoYXQgY2FuIGFmZmVjdCBub3RpZmljYXRpb24KKyAgICAgICAgLy8gcm91dGluZworICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKHN0cmVhbSk7CisKKyAgICAgICAgLy8gZm9yY2UgcmVldmFsdWF0aW5nIGFjY2Vzc2liaWxpdHkgcm91dGluZyB3aGVuIHJpbmd0b25lIG9yIGFsYXJtIHN0YXJ0cworICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBBTE9HVigic3RvcE91dHB1dCgpIG91dHB1dCAlZCwgc3RyZWFtICVkLCBzZXNzaW9uICVkIiwgb3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygic3RvcE91dHB1dCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOworCisgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID09IDEpIHsKKyAgICAgICAgLy8gQXV0b21hdGljYWxseSBkaXNhYmxlIHRoZSByZW1vdGUgc3VibWl4IGlucHV0IHdoZW4gb3V0cHV0IGlzIHN0b3BwZWQgb24gYQorICAgICAgICAvLyByZSByb3V0aW5nIG1peCBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUworICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2Uob3V0cHV0RGVzYy0+bURldmljZSkgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKKyAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVBvbGljeU1peC0+bVJlZ2lzdHJhdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAicmVtb3RlLXN1Ym1peCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUm91dGluZz8KKyAgICBib29sIGZvcmNlRGV2aWNlVXBkYXRlID0gZmFsc2U7CisgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID4gMCkgeworICAgICAgICBpbnQgYWN0aXZpdHlDb3VudCA9IG1PdXRwdXRSb3V0ZXMuZGVjUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKKyAgICAgICAgZm9yY2VEZXZpY2VVcGRhdGUgPSAobU91dHB1dFJvdXRlcy5oYXNSb3V0ZShzZXNzaW9uKSAmJiAoYWN0aXZpdHlDb3VudCA9PSAwKSk7CisKKyAgICAgICAgaWYgKGZvcmNlRGV2aWNlVXBkYXRlKSB7CisgICAgICAgICAgICBjaGVja1N0cmF0ZWd5Um91dGUoZ2V0U3RyYXRlZ3koc3RyZWFtKSwgQVVESU9fSU9fSEFORExFX05PTkUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0b3BTb3VyY2Uob3V0cHV0RGVzYywgc3RyZWFtLCBmb3JjZURldmljZVVwZGF0ZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcFNvdXJjZShzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlRGV2aWNlVXBkYXRlKQoreworICAgIC8vIGFsd2F5cyBoYW5kbGUgc3RyZWFtIHN0b3AsIGNoZWNrIHdoaWNoIHN0cmVhbSB0eXBlIGlzIHN0b3BwaW5nCisgICAgaGFuZGxlRXZlbnRGb3JCZWFjb24oc3RyZWFtID09IEFVRElPX1NUUkVBTV9UVFMgPyBTVE9QUElOR19CRUFDT04gOiBTVE9QUElOR19PVVRQVVQpOworCisgICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZSBmb3Igc29uaWZpY2F0aW9uIHdoaWxlIGluIGNhbGwKKyAgICBpZiAoaXNJbkNhbGwoKSkgeworICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oc3RyZWFtLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA+IDApIHsKKyAgICAgICAgLy8gZGVjcmVtZW50IHVzYWdlIGNvdW50IG9mIHRoaXMgc3RyZWFtIG9uIHRoZSBvdXRwdXQKKyAgICAgICAgb3V0cHV0RGVzYy0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCAtMSk7CisKKyAgICAgICAgLy8gc3RvcmUgdGltZSBhdCB3aGljaCB0aGUgc3RyZWFtIHdhcyBzdG9wcGVkIC0gc2VlIGlzU3RyZWFtQWN0aXZlKCkKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID09IDAgfHwgZm9yY2VEZXZpY2VVcGRhdGUpIHsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdG9wVGltZVtzdHJlYW1dID0gc3lzdGVtVGltZSgpOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIC8vIGRlbGF5IHRoZSBkZXZpY2Ugc3dpdGNoIGJ5IHR3aWNlIHRoZSBsYXRlbmN5IGJlY2F1c2Ugc3RvcE91dHB1dCgpIGlzIGV4ZWN1dGVkIHdoZW4KKyAgICAgICAgICAgIC8vIHRoZSB0cmFjayBzdG9wKCkgY29tbWFuZCBpcyByZWNlaXZlZCBhbmQgYXQgdGhhdCB0aW1lIHRoZSBhdWRpbyB0cmFjayBidWZmZXIgY2FuCisgICAgICAgICAgICAvLyBzdGlsbCBjb250YWluIGRhdGEgdGhhdCBuZWVkcyB0byBiZSBkcmFpbmVkLiBUaGUgbGF0ZW5jeSBvbmx5IGNvdmVycyB0aGUgYXVkaW8gSEFMCisgICAgICAgICAgICAvLyBhbmQga2VybmVsIGJ1ZmZlcnMuIEFsc28gdGhlIGxhdGVuY3kgZG9lcyBub3QgYWx3YXlzIGluY2x1ZGUgYWRkaXRpb25hbCBkZWxheSBpbiB0aGUKKyAgICAgICAgICAgIC8vIGF1ZGlvIHBhdGggKGF1ZGlvIERTUCwgQ09ERUMgLi4uKQorICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIG5ld0RldmljZSwgZmFsc2UsIG91dHB1dERlc2MtPmxhdGVuY3koKSoyKTsKKworICAgICAgICAgICAgLy8gZm9yY2UgcmVzdG9yaW5nIHRoZSBkZXZpY2Ugc2VsZWN0aW9uIG9uIG90aGVyIGFjdGl2ZSBvdXRwdXRzIGlmIGl0IGRpZmZlcnMgZnJvbSB0aGUKKyAgICAgICAgICAgIC8vIG9uZSBiZWluZyBzZWxlY3RlZCBmb3IgdGhpcyBvdXRwdXQKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBjdXJPdXRwdXQgPSBtT3V0cHV0cy5rZXlBdChpKTsKKyAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgIGlmIChkZXNjICE9IG91dHB1dERlc2MgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmlzQWN0aXZlKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPnNoYXJlc0h3TW9kdWxlV2l0aChkZXNjKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKG5ld0RldmljZSAhPSBkZXNjLT5kZXZpY2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROZXdPdXRwdXREZXZpY2UoZGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bGF0ZW5jeSgpKjIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgb3V0cHV0cyBpZiBzdG9wcGluZyBvbmUgd2l0aCBhIHN0cmVhbSB0aGF0IGNhbiBhZmZlY3Qgbm90aWZpY2F0aW9uIHJvdXRpbmcKKyAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvblJvdXRpbmdGb3JTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1coInN0b3BPdXRwdXQoKSByZWZjb3VudCBpcyBhbHJlYWR5IDAiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiBfX3VudXNlZCkKK3sKKyAgICBBTE9HVigicmVsZWFzZU91dHB1dCgpICVkIiwgb3V0cHV0KTsKKyAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInJlbGVhc2VPdXRwdXQoKSByZWxlYXNpbmcgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICBpbnQgdGVzdEluZGV4ID0gdGVzdE91dHB1dEluZGV4KG91dHB1dCk7CisgICAgaWYgKHRlc3RJbmRleCAhPSAwKSB7CisgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUoKSkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgICAgICByZW1vdmVPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgIG1UZXN0T3V0cHV0c1t0ZXN0SW5kZXhdID0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKKworICAgIC8vIFJvdXRpbmcKKyAgICBtT3V0cHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOworCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKKyAgICBpZiAoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CisgICAgICAgIGlmIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50IDw9IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlT3V0cHV0KCkgaW52YWxpZCBvcGVuIGNvdW50ICVkIGZvciBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tRGlyZWN0T3BlbkNvdW50LCBvdXRwdXQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICgtLWRlc2MtPm1EaXJlY3RPcGVuQ291bnQgPT0gMCkgeworICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgIC8vIElmIGVmZmVjdHMgd2hlcmUgcHJlc2VudCBvbiB0aGUgb3V0cHV0LCBhdWRpb2ZsaW5nZXIgbW92ZWQgdGhlbSB0byB0aGUgcHJpbWFyeQorICAgICAgICAgICAgLy8gb3V0cHV0IGJ5IGRlZmF1bHQ6IG1vdmUgdGhlbSBiYWNrIHRvIHRoZSBhcHByb3ByaWF0ZSBvdXRwdXQuCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQgPSBnZXRPdXRwdXRGb3JFZmZlY3QoKTsKKyAgICAgICAgICAgIGlmIChoYXNQcmltYXJ5T3V0cHV0KCkgJiYgZHN0T3V0cHV0ICE9IG1QcmltYXJ5T3V0cHV0LT5tSW9IYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+bW92ZUVmZmVjdHMoQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dC0+bUlvSGFuZGxlLCBkc3RPdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOworICAgICAgICB9CisgICAgfQorfQorCisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfdHlwZV90ICppbnB1dFR5cGUpCit7CisgICAgQUxPR1YoImdldElucHV0Rm9yQXR0cigpIHNvdXJjZSAlZCwgc2FtcGxpbmdSYXRlICVkLCBmb3JtYXQgJWQsIGNoYW5uZWxNYXNrICV4LCIKKyAgICAgICAgICAgICJzZXNzaW9uICVkLCBmbGFncyAlI3giLAorICAgICAgICAgIGF0dHItPnNvdXJjZSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBzZXNzaW9uLCBmbGFncyk7CisKKyAgICAqaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0lOVkFMSUQ7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZTsKKyAgICAvLyBoYW5kbGUgbGVnYWN5IHJlbW90ZSBzdWJtaXggY2FzZSB3aGVyZSB0aGUgYWRkcmVzcyB3YXMgbm90IGFsd2F5cyBzcGVjaWZpZWQKKyAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKKyAgICBib29sIGlzU291bmRUcmlnZ2VyID0gZmFsc2U7CisgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UgPSBhdHRyLT5zb3VyY2U7CisgICAgYXVkaW9fc291cmNlX3QgaGFsSW5wdXRTb3VyY2U7CisgICAgQXVkaW9NaXggKnBvbGljeU1peCA9IE5VTEw7CisKKyAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQpIHsKKyAgICAgICAgaW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOworICAgIH0KKyAgICBoYWxJbnB1dFNvdXJjZSA9IGlucHV0U291cmNlOworCisgICAgLy8gRXhwbGljaXQgcm91dGluZz8KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+Z2V0SWQoKSA9PSBzZWxlY3RlZERldmljZUlkKSB7CisgICAgICAgICAgICBkZXZpY2VEZXNjID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIG1JbnB1dFJvdXRlcy5hZGRSb3V0ZShzZXNzaW9uLCBTZXNzaW9uUm91dGU6OlNUUkVBTV9UWVBFX05BLCBpbnB1dFNvdXJjZSwgZGV2aWNlRGVzYywgdWlkKTsKKworICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWCAmJgorICAgICAgICAgICAgc3RybmNtcChhdHRyLT50YWdzLCAiYWRkcj0iLCBzdHJsZW4oImFkZHI9IikpID09IDApIHsKKyAgICAgICAgc3RhdHVzX3QgcmV0ID0gbVBvbGljeU1peGVzLmdldElucHV0TWl4Rm9yQXR0cigqYXR0ciwgJnBvbGljeU1peCk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9NSVhfRVhUX1BPTElDWV9SRVJPVVRFOworICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoYXR0ci0+dGFncyArIHN0cmxlbigiYWRkcj0iKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UsICZwb2xpY3lNaXgpOworICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgY291bGQgbm90IGZpbmQgZGV2aWNlIGZvciBzb3VyY2UgJWQiLCBpbnB1dFNvdXJjZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGlmIChwb2xpY3lNaXggIT0gTlVMTCkgeworICAgICAgICAgICAgYWRkcmVzcyA9IHBvbGljeU1peC0+bVJlZ2lzdHJhdGlvbklkOworICAgICAgICAgICAgaWYgKHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7CisgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYW4gZXh0ZXJuYWwgcG9saWN5LCBidXQgdGhpcyBpbnB1dCBpcyBhdHRhY2hlZCB0byBhIG1peCBvZiByZWNvcmRlcnMsCisgICAgICAgICAgICAgICAgLy8gbWVhbmluZyBpdCByZWNlaXZlcyBhdWRpbyBpbmplY3RlZCBpbnRvIHRoZSBmcmFtZXdvcmssIHNvIHRoZSByZWNvcmRlciBkb2Vzbid0CisgICAgICAgICAgICAgICAgLy8ga25vdyBhYm91dCBpdCBhbmQgaXMgdGhlcmVmb3JlIGNvbnNpZGVyZWQgImxlZ2FjeSIKKyAgICAgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0xFR0FDWTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gcmVjb3JkaW5nIGEgbWl4IG9mIHBsYXllcnMgZGVmaW5lZCBieSBhbiBleHRlcm5hbCBwb2xpY3ksIHdlJ3JlIHJlcm91dGluZyBmb3IKKyAgICAgICAgICAgICAgICAvLyBhbiBleHRlcm5hbCBwb2xpY3kKKyAgICAgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX01JWF9FWFRfUE9MSUNZX1JFUk9VVEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKKyAgICAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTUlYX0NBUFRVUkU7CisgICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgpIHsKKyAgICAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfVEVMRVBIT05ZX1JYOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9MRUdBQ1k7CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRhcHQgY2hhbm5lbCBzZWxlY3Rpb24gdG8gaW5wdXQgc291cmNlCisgICAgICAgIHN3aXRjaCAoaW5wdXRTb3VyY2UpIHsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOgorICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzoKKyAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTks7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDoKKyAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTksgfCBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbVNvdW5kVHJpZ2dlclNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbik7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICppbnB1dCA9IG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy52YWx1ZUZvcihzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBpc1NvdW5kVHJpZ2dlciA9IHRydWU7CisgICAgICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkoZmxhZ3MgfCBBVURJT19JTlBVVF9GTEFHX0hXX0hPVFdPUkQpOworICAgICAgICAgICAgICAgIEFMT0dWKCJTb3VuZFRyaWdnZXIgY2FwdHVyZSBvbiBzZXNzaW9uICVkIGlucHV0ICVkIiwgc2Vzc2lvbiwgKmlucHV0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGFsSW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBmaW5kIGEgY29tcGF0aWJsZSBpbnB1dCBwcm9maWxlIChub3QgbmVjZXNzYXJpbHkgaWRlbnRpY2FsIGluIHBhcmFtZXRlcnMpCisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlOworICAgIC8vIHNhbXBsaW5nUmF0ZSBhbmQgZmxhZ3MgbWF5IGJlIHVwZGF0ZWQgYnkgZ2V0SW5wdXRQcm9maWxlCisgICAgdWludDMyX3QgcHJvZmlsZVNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKKyAgICBhdWRpb19mb3JtYXRfdCBwcm9maWxlRm9ybWF0ID0gZm9ybWF0OworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHByb2ZpbGVDaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOworICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgcHJvZmlsZUZsYWdzID0gZmxhZ3M7CisgICAgZm9yICg7OykgeworICAgICAgICBwcm9maWxlID0gZ2V0SW5wdXRQcm9maWxlKGRldmljZSwgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlU2FtcGxpbmdSYXRlLCBwcm9maWxlRm9ybWF0LCBwcm9maWxlQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZUZsYWdzKTsKKyAgICAgICAgaWYgKHByb2ZpbGUgIT0gMCkgeworICAgICAgICAgICAgYnJlYWs7IC8vIHN1Y2Nlc3MKKyAgICAgICAgfSBlbHNlIGlmIChwcm9maWxlRmxhZ3MgIT0gQVVESU9fSU5QVVRfRkxBR19OT05FKSB7CisgICAgICAgICAgICBwcm9maWxlRmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkU7IC8vIHJldHJ5CisgICAgICAgIH0gZWxzZSB7IC8vIGZhaWwKKyAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSBjb3VsZCBub3QgZmluZCBwcm9maWxlIGZvciBkZXZpY2UgMHglWCwgc2FtcGxpbmdSYXRlICV1LCIKKyAgICAgICAgICAgICAgICAgICAgImZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrIDB4JVgsIGZsYWdzICUjeCIsCisgICAgICAgICAgICAgICAgICAgIGRldmljZSwgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoImdldElucHV0Rm9yQXR0cigpOiBIVyBtb2R1bGUgJXMgbm90IG9wZW5lZCIsIHByb2ZpbGUtPmdldE1vZHVsZU5hbWUoKSk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBwcm9maWxlU2FtcGxpbmdSYXRlOworICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBwcm9maWxlQ2hhbm5lbE1hc2s7CisgICAgY29uZmlnLmZvcm1hdCA9IHByb2ZpbGVGb3JtYXQ7CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3BlbklucHV0KHByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxJbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVGbGFncyk7CisKKyAgICAvLyBvbmx5IGFjY2VwdCBpbnB1dCB3aXRoIHRoZSBleGFjdCByZXF1ZXN0ZWQgc2V0IG9mIHBhcmFtZXRlcnMKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8ICppbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSB8fAorICAgICAgICAocHJvZmlsZVNhbXBsaW5nUmF0ZSAhPSBjb25maWcuc2FtcGxlX3JhdGUpIHx8CisgICAgICAgIChwcm9maWxlRm9ybWF0ICE9IGNvbmZpZy5mb3JtYXQpIHx8CisgICAgICAgIChwcm9maWxlQ2hhbm5lbE1hc2sgIT0gY29uZmlnLmNoYW5uZWxfbWFzaykpIHsKKyAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGZhaWxlZCBvcGVuaW5nIGlucHV0OiBzYW1wbGluZ1JhdGUgJWQsIGZvcm1hdCAlZCwiCisgICAgICAgICAgICAgICAgIiBjaGFubmVsTWFzayAleCIsCisgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgaWYgKCppbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQoKmlucHV0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IocHJvZmlsZSk7CisgICAgaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UgPSBpbnB1dFNvdXJjZTsKKyAgICBpbnB1dERlc2MtPm1SZWZDb3VudCA9IDA7CisgICAgaW5wdXREZXNjLT5tT3BlblJlZkNvdW50ID0gMTsKKyAgICBpbnB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBwcm9maWxlU2FtcGxpbmdSYXRlOworICAgIGlucHV0RGVzYy0+bUZvcm1hdCA9IHByb2ZpbGVGb3JtYXQ7CisgICAgaW5wdXREZXNjLT5tQ2hhbm5lbE1hc2sgPSBwcm9maWxlQ2hhbm5lbE1hc2s7CisgICAgaW5wdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOworICAgIGlucHV0RGVzYy0+bVNlc3Npb25zLmFkZChzZXNzaW9uKTsKKyAgICBpbnB1dERlc2MtPm1Jc1NvdW5kVHJpZ2dlciA9IGlzU291bmRUcmlnZ2VyOworICAgIGlucHV0RGVzYy0+bVBvbGljeU1peCA9IHBvbGljeU1peDsKKworICAgIEFMT0dWKCJnZXRJbnB1dEZvckF0dHIoKSByZXR1cm5zIGlucHV0IHR5cGUgPSAlZCIsICppbnB1dFR5cGUpOworCisgICAgYWRkSW5wdXQoKmlucHV0LCBpbnB1dERlc2MpOworICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIEFMT0dWKCJzdGFydElucHV0KCkgaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygic3RhcnRJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOworCisgICAgaW5kZXggPSBpbnB1dERlc2MtPm1TZXNzaW9ucy5pbmRleE9mKHNlc3Npb24pOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gdmlydHVhbCBpbnB1dCBkZXZpY2VzIGFyZSBjb21wYXRpYmxlIHdpdGggb3RoZXIgaW5wdXQgZGV2aWNlcworICAgIGlmICghaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoaW5wdXREZXNjLT5tRGV2aWNlKSkgeworCisgICAgICAgIC8vIGZvciBhIG5vbi12aXJ0dWFsIGlucHV0IGRldmljZSwgY2hlY2sgaWYgdGhlcmUgaXMgYW5vdGhlciAobm9uLXZpcnR1YWwpIGFjdGl2ZSBpbnB1dAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhY3RpdmVJbnB1dCA9IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXQoKTsKKyAgICAgICAgaWYgKGFjdGl2ZUlucHV0ICE9IDAgJiYgYWN0aXZlSW5wdXQgIT0gaW5wdXQpIHsKKworICAgICAgICAgICAgLy8gSWYgdGhlIGFscmVhZHkgYWN0aXZlIGlucHV0IHVzZXMgQVVESU9fU09VUkNFX0hPVFdPUkQgdGhlbiBpdCBpcyBjbG9zZWQsCisgICAgICAgICAgICAvLyBvdGhlcndpc2UgdGhlIGFjdGl2ZSBpbnB1dCBjb250aW51ZXMgYW5kIHRoZSBuZXcgaW5wdXQgY2Fubm90IGJlIHN0YXJ0ZWQuCisgICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gYWN0aXZlRGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoYWN0aXZlSW5wdXQpOworICAgICAgICAgICAgaWYgKGFjdGl2ZURlc2MtPm1JbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCVkKSBwcmVlbXB0aW5nIGxvdy1wcmlvcml0eSBpbnB1dCAlZCIsIGlucHV0LCBhY3RpdmVJbnB1dCk7CisgICAgICAgICAgICAgICAgc3RvcElucHV0KGFjdGl2ZUlucHV0LCBhY3RpdmVEZXNjLT5tU2Vzc2lvbnMuaXRlbUF0KDApKTsKKyAgICAgICAgICAgICAgICByZWxlYXNlSW5wdXQoYWN0aXZlSW5wdXQsIGFjdGl2ZURlc2MtPm1TZXNzaW9ucy5pdGVtQXQoMCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgic3RhcnRJbnB1dCglZCkgZmFpbGVkOiBvdGhlciBpbnB1dCAlZCBhbHJlYWR5IHN0YXJ0ZWQiLCBpbnB1dCwgYWN0aXZlSW5wdXQpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJvdXRpbmc/CisgICAgbUlucHV0Um91dGVzLmluY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7CisKKyAgICBpZiAoaW5wdXREZXNjLT5tUmVmQ291bnQgPT0gMCB8fCBtSW5wdXRSb3V0ZXMuaGFzUm91dGVDaGFuZ2VkKHNlc3Npb24pKSB7CisgICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCisgICAgICAgIGlmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgJiYgKChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1SZWdpc3RyYXRpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX01JWElORyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudCgpID09IDApIHsKKyAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKHRydWUpOworICAgICAgICB9CisgICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0LCBnZXROZXdJbnB1dERldmljZShpbnB1dCksIHRydWUgLyogZm9yY2UgKi8pOworCisgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSByZW1vdGUgc3VibWl4IG91dHB1dCB3aGVuIGlucHV0IGlzIHN0YXJ0ZWQgaWYgbm90CisgICAgICAgIC8vIHVzZWQgYnkgYSBwb2xpY3kgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCisgICAgICAgIC8vIEZvciByZW1vdGUgc3VibWl4IChhIHZpcnR1YWwgZGV2aWNlKSwgd2Ugb3BlbiBvbmx5IG9uZSBpbnB1dCBwZXIgY2FwdHVyZSByZXF1ZXN0LgorICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoaW5wdXREZXNjLT5tRGV2aWNlKSkgeworICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7CisgICAgICAgICAgICBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gU3RyaW5nOCgiMCIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tUmVnaXN0cmF0aW9uSWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWRkcmVzcyAhPSAiIikgeworICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsICJyZW1vdGUtc3VibWl4Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KCkgaW5wdXQgc291cmNlID0gJWQiLCBpbnB1dERlc2MtPm1JbnB1dFNvdXJjZSk7CisKKyAgICBpbnB1dERlc2MtPm1SZWZDb3VudCsrOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3sKKyAgICBBTE9HVigic3RvcElucHV0KCkgaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbnB1dCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygic3RvcElucHV0KCkgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7CisKKyAgICBpbmRleCA9IGlucHV0RGVzYy0+bVNlc3Npb25zLmluZGV4T2Yoc2Vzc2lvbik7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVygic3RvcElucHV0KCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChpbnB1dERlc2MtPm1SZWZDb3VudCA9PSAwKSB7CisgICAgICAgIEFMT0dXKCJzdG9wSW5wdXQoKSBpbnB1dCAlZCBhbHJlYWR5IHN0b3BwZWQiLCBpbnB1dCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpbnB1dERlc2MtPm1SZWZDb3VudC0tOworCisgICAgLy8gUm91dGluZz8KKyAgICBtSW5wdXRSb3V0ZXMuZGVjUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKKworICAgIGlmIChpbnB1dERlc2MtPm1SZWZDb3VudCA9PSAwKSB7CisgICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCisgICAgICAgIGlmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgJiYgKChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1SZWdpc3RyYXRpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX0lETEUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYXV0b21hdGljYWxseSBkaXNhYmxlIHRoZSByZW1vdGUgc3VibWl4IG91dHB1dCB3aGVuIGlucHV0IGlzIHN0b3BwZWQgaWYgbm90CisgICAgICAgIC8vIHVzZWQgYnkgYSBwb2xpY3kgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCisgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKKyAgICAgICAgICAgIGlmIChpbnB1dERlc2MtPm1Qb2xpY3lNaXggPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1SZWdpc3RyYXRpb25JZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhZGRyZXNzICE9ICIiKSB7CisgICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgInJlbW90ZS1zdWJtaXgiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJlc2V0SW5wdXREZXZpY2UoaW5wdXQpOworCisgICAgICAgIGlmIChtSW5wdXRzLmFjdGl2ZUlucHV0c0NvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUoZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit7CisgICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpICVkIiwgaW5wdXQpOworICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIHJlbGVhc2luZyB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gUm91dGluZworICAgIG1JbnB1dFJvdXRlcy5yZW1vdmVSb3V0ZShzZXNzaW9uKTsKKworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOworICAgIEFMT0dfQVNTRVJUKGlucHV0RGVzYyAhPSAwKTsKKworICAgIGluZGV4ID0gaW5wdXREZXNjLT5tU2Vzc2lvbnMuaW5kZXhPZihzZXNzaW9uKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dXKCJyZWxlYXNlSW5wdXQoKSB1bmtub3duIHNlc3Npb24gJWQgb24gaW5wdXQgJWQiLCBzZXNzaW9uLCBpbnB1dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW5wdXREZXNjLT5tU2Vzc2lvbnMucmVtb3ZlKHNlc3Npb24pOworICAgIGlmIChpbnB1dERlc2MtPm1PcGVuUmVmQ291bnQgPT0gMCkgeworICAgICAgICBBTE9HVygicmVsZWFzZUlucHV0KCkgaW52YWxpZCBvcGVuIHJlZiBjb3VudCAlZCIsIGlucHV0RGVzYy0+bU9wZW5SZWZDb3VudCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW5wdXREZXNjLT5tT3BlblJlZkNvdW50LS07CisgICAgaWYgKGlucHV0RGVzYy0+bU9wZW5SZWZDb3VudCA+IDApIHsKKyAgICAgICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpIGV4aXQgPiAwIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjbG9zZUlucHV0KGlucHV0KTsKKyAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CisgICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpIGV4aXQiKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsb3NlQWxsSW5wdXRzKCkgeworICAgIGJvb2wgcGF0Y2hSZW1vdmVkID0gZmFsc2U7CisKKyAgICBmb3Ioc2l6ZV90IGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgeworICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGlucHV0X2luZGV4KTsKKyAgICAgICAgc3NpemVfdCBwYXRjaF9pbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgICAgIGlmIChwYXRjaF9pbmRleCA+PSAwKSB7CisgICAgICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQocGF0Y2hfaW5kZXgpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICAgICAgbUF1ZGlvUGF0Y2hlcy5yZW1vdmVJdGVtc0F0KHBhdGNoX2luZGV4KTsKKyAgICAgICAgICAgIHBhdGNoUmVtb3ZlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQobUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOworICAgIH0KKyAgICBtSW5wdXRzLmNsZWFyKCk7CisgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKworICAgIGlmIChwYXRjaFJlbW92ZWQpIHsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCkKK3sKKyAgICBBTE9HVigiaW5pdFN0cmVhbVZvbHVtZSgpIHN0cmVhbSAlZCwgbWluICVkLCBtYXggJWQiLCBzdHJlYW0gLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgIG1FbmdpbmUtPmluaXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgIC8vRklYTUU6IEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIHZvbHVtZSBmb2xsb3dzIEFVRElPX1NUUkVBTV9NVVNJQyBmb3Igbm93CisgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fTVVTSUMpIHsKKyAgICAgICAgbUVuZ2luZS0+aW5pdFN0cmVhbVZvbHVtZShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKworICAgIGlmICgoaW5kZXggPCBtU3RyZWFtcy52YWx1ZUZvcihzdHJlYW0pLmdldFZvbHVtZUluZGV4TWluKCkpIHx8CisgICAgICAgICAgICAoaW5kZXggPiBtU3RyZWFtcy52YWx1ZUZvcihzdHJlYW0pLmdldFZvbHVtZUluZGV4TWF4KCkpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gRm9yY2UgbWF4IHZvbHVtZSBpZiBzdHJlYW0gY2Fubm90IGJlIG11dGVkCisgICAgaWYgKCFtU3RyZWFtcy5jYW5CZU11dGVkKHN0cmVhbSkpIGluZGV4ID0gbVN0cmVhbXMudmFsdWVGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleE1heCgpOworCisgICAgQUxPR1YoInNldFN0cmVhbVZvbHVtZUluZGV4KCkgc3RyZWFtICVkLCBkZXZpY2UgJTA0eCwgaW5kZXggJWQiLAorICAgICAgICAgIHN0cmVhbSwgZGV2aWNlLCBpbmRleCk7CisKKyAgICAvLyBpZiBkZXZpY2UgaXMgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUIHNldCBkZWZhdWx0IHZhbHVlIGFuZAorICAgIC8vIGNsZWFyIGFsbCBkZXZpY2Ugc3BlY2lmaWMgdmFsdWVzCisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQpIHsKKyAgICAgICAgbVN0cmVhbXMuY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoc3RyZWFtKTsKKyAgICB9CisgICAgbVN0cmVhbXMuYWRkQ3VycmVudFZvbHVtZUluZGV4KHN0cmVhbSwgZGV2aWNlLCBpbmRleCk7CisKKyAgICAvLyB1cGRhdGUgdm9sdW1lIG9uIGFsbCBvdXRwdXRzIHdob3NlIGN1cnJlbnQgZGV2aWNlIGlzIGFsc28gc2VsZWN0ZWQgYnkgdGhlIHNhbWUKKyAgICAvLyBzdHJhdGVneSBhcyB0aGUgZGV2aWNlIHNwZWNpZmllZCBieSB0aGUgY2FsbGVyCisgICAgYXVkaW9fZGV2aWNlc190IHN0cmF0ZWd5RGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koZ2V0U3RyYXRlZ3koc3RyZWFtKSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKworCisgICAgLy9GSVhNRTogQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkgdm9sdW1lIGZvbGxvd3MgQVVESU9fU1RSRUFNX01VU0lDIGZvciBub3cKKyAgICBhdWRpb19kZXZpY2VzX3QgYWNjZXNzaWJpbGl0eURldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDKSB7CisgICAgICAgIG1TdHJlYW1zLmFkZEN1cnJlbnRWb2x1bWVJbmRleChBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSwgZGV2aWNlLCBpbmRleCk7CisgICAgICAgIGFjY2Vzc2liaWxpdHlEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9BQ0NFU1NJQklMSVRZLCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgIH0KKyAgICBpZiAoKGRldmljZSAhPSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQpICYmCisgICAgICAgICAgICAoZGV2aWNlICYgKHN0cmF0ZWd5RGV2aWNlIHwgYWNjZXNzaWJpbGl0eURldmljZSkpID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1ckRldmljZSA9IFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRlc2MtPmRldmljZSgpKTsKKyAgICAgICAgaWYgKChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUKSB8fCAoKGN1ckRldmljZSAmIHN0cmF0ZWd5RGV2aWNlKSAhPSAwKSkgeworICAgICAgICAgICAgc3RhdHVzX3Qgdm9sU3RhdHVzID0gY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLCBpbmRleCwgZGVzYywgY3VyRGV2aWNlKTsKKyAgICAgICAgICAgIGlmICh2b2xTdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB2b2xTdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUKSB8fCAoKGN1ckRldmljZSAmIGFjY2Vzc2liaWxpdHlEZXZpY2UpICE9IDApKSB7CisgICAgICAgICAgICBzdGF0dXNfdCB2b2xTdGF0dXMgPSBjaGVja0FuZFNldFZvbHVtZShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBkZXNjLCBjdXJEZXZpY2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAoaW5kZXggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAvLyBpZiBkZXZpY2UgaXMgQVVESU9fREVWSUNFX09VVF9ERUZBVUxULCByZXR1cm4gdm9sdW1lIGZvciBkZXZpY2UgY29ycmVzcG9uZGluZyB0bworICAgIC8vIHRoZSBzdHJhdGVneSB0aGUgc3RyZWFtIGJlbG9uZ3MgdG8uCisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koZ2V0U3RyYXRlZ3koc3RyZWFtKSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICB9CisgICAgZGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKKworICAgICppbmRleCA9ICBtU3RyZWFtcy52YWx1ZUZvcihzdHJlYW0pLmdldFZvbHVtZUluZGV4KGRldmljZSk7CisgICAgQUxPR1YoImdldFN0cmVhbVZvbHVtZUluZGV4KCkgc3RyZWFtICVkIGRldmljZSAlMDh4IGluZGV4ICVkIiwgc3RyZWFtLCBkZXZpY2UsICppbmRleCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNlbGVjdE91dHB1dEZvckVmZmVjdHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMpCit7CisgICAgLy8gc2VsZWN0IG9uZSBvdXRwdXQgYW1vbmcgc2V2ZXJhbCBzdWl0YWJsZSBmb3IgZ2xvYmFsIGVmZmVjdHMuCisgICAgLy8gVGhlIHByaW9yaXR5IGlzIGFzIGZvbGxvd3M6CisgICAgLy8gMTogQW4gb2ZmbG9hZGVkIG91dHB1dC4gSWYgdGhlIGVmZmVjdCBlbmRzIHVwIG5vdCBiZWluZyBvZmZsb2FkYWJsZSwKKyAgICAvLyAgICBBdWRpb0ZsaW5nZXIgd2lsbCBpbnZhbGlkYXRlIHRoZSB0cmFjayBhbmQgdGhlIG9mZmxvYWRlZCBvdXRwdXQKKyAgICAvLyAgICB3aWxsIGJlIGNsb3NlZCBjYXVzaW5nIHRoZSBlZmZlY3QgdG8gYmUgbW92ZWQgdG8gYSBQQ00gb3V0cHV0LgorICAgIC8vIDI6IEEgZGVlcCBidWZmZXIgb3V0cHV0CisgICAgLy8gMzogdGhlIGZpcnN0IG91dHB1dCBpbiB0aGUgbGlzdAorCisgICAgaWYgKG91dHB1dHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0T2ZmbG9hZGVkID0gMDsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXREZWVwQnVmZmVyID0gMDsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dHNbaV0pOworICAgICAgICBBTE9HVigic2VsZWN0T3V0cHV0Rm9yRWZmZWN0cyBvdXRwdXRzWyV6dV0gZmxhZ3MgJXgiLCBpLCBkZXNjLT5tRmxhZ3MpOworICAgICAgICBpZiAoKGRlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKKyAgICAgICAgICAgIG91dHB1dE9mZmxvYWRlZCA9IG91dHB1dHNbaV07CisgICAgICAgIH0KKyAgICAgICAgaWYgKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUikgIT0gMCkgeworICAgICAgICAgICAgb3V0cHV0RGVlcEJ1ZmZlciA9IG91dHB1dHNbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigic2VsZWN0T3V0cHV0Rm9yRWZmZWN0cyBvdXRwdXRPZmZsb2FkZWQgJWQgb3V0cHV0RGVlcEJ1ZmZlciAlZCIsCisgICAgICAgICAgb3V0cHV0T2ZmbG9hZGVkLCBvdXRwdXREZWVwQnVmZmVyKTsKKyAgICBpZiAob3V0cHV0T2ZmbG9hZGVkICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dE9mZmxvYWRlZDsKKyAgICB9CisgICAgaWYgKG91dHB1dERlZXBCdWZmZXIgIT0gMCkgeworICAgICAgICByZXR1cm4gb3V0cHV0RGVlcEJ1ZmZlcjsKKyAgICB9CisKKyAgICByZXR1cm4gb3V0cHV0c1swXTsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykKK3sKKyAgICAvLyBhcHBseSBzaW1wbGUgcnVsZSB3aGVyZSBnbG9iYWwgZWZmZWN0cyBhcmUgYXR0YWNoZWQgdG8gdGhlIHNhbWUgb3V0cHV0IGFzIE1VU0lDIHN0cmVhbXMKKworICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShBVURJT19TVFJFQU1fTVVTSUMpOworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBkc3RPdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShkZXZpY2UsIG1PdXRwdXRzKTsKKworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dEZvckVmZmVjdHMoZHN0T3V0cHV0cyk7CisgICAgQUxPR1YoImdldE91dHB1dEZvckVmZmVjdCgpIGdvdCBvdXRwdXQgJWQgZm9yIGZ4ICVzIGZsYWdzICV4IiwKKyAgICAgICAgICBvdXRwdXQsIChkZXNjID09IE5VTEwpID8gInVuc3BlY2lmaWVkIiA6IGRlc2MtPm5hbWUsICAoZGVzYyA9PSBOVUxMKSA/IDAgOiBkZXNjLT5mbGFncyk7CisKKyAgICByZXR1cm4gb3V0cHV0OworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlZ2lzdGVyRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShpbyk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBpbmRleCA9IG1JbnB1dHMuaW5kZXhPZktleShpbyk7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJyZWdpc3RlckVmZmVjdCgpIHVua25vd24gaW8gJWQiLCBpbyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1FZmZlY3RzLnJlZ2lzdGVyRWZmZWN0KGRlc2MsIGlvLCBzdHJhdGVneSwgc2Vzc2lvbiwgaWQpOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAoreworICAgIHJldHVybiBtT3V0cHV0cy5pc1N0cmVhbUFjdGl2ZShzdHJlYW0sIGluUGFzdE1zKTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAoreworICAgIHJldHVybiBtT3V0cHV0cy5pc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KHN0cmVhbSwgaW5QYXN0TXMpOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gIGlucHV0RGVzY3JpcHRvciA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGlucHV0RGVzY3JpcHRvci0+bVJlZkNvdW50ID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dERlc2NyaXB0b3ItPm1JbnB1dFNvdXJjZSA9PSAoaW50KXNvdXJjZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gQVVESU9fU09VUkNFX0hPVFdPUkQgaXMgZXF1aXZhbGVudCB0byBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04gb25seSBpZiBpdAorICAgICAgICAvLyBjb3JyZXNwb25kcyB0byBhbiBhY3RpdmUgY2FwdHVyZSB0cmlnZ2VyZWQgYnkgYSBoYXJkd2FyZSBob3R3b3JkIHJlY29nbml0aW9uCisgICAgICAgIGlmICgoc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTikgJiYKKyAgICAgICAgICAgICAgICAgKGlucHV0RGVzY3JpcHRvci0+bUlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSkgeworICAgICAgICAgICAgLy8gRklYTUU6IHdlIHNob3VsZCBub3QgYXNzdW1lIHRoYXQgdGhlIGZpcnN0IHNlc3Npb24gaXMgdGhlIGFjdGl2ZSBvbmUgYW5kIGtlZXAKKyAgICAgICAgICAgIC8vIGFjdGl2aXR5IGNvdW50IHBlciBzZXNzaW9uLiBTYW1lIGluIHN0YXJ0SW5wdXQoKS4KKyAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuaW5kZXhPZktleShpbnB1dERlc2NyaXB0b3ItPm1TZXNzaW9ucy5pdGVtQXQoMCkpOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFJlZ2lzdGVyIGEgbGlzdCBvZiBjdXN0b20gbWl4ZXMgd2l0aCB0aGVpciBhdHRyaWJ1dGVzIGFuZCBmb3JtYXQuCisvLyBXaGVuIGEgbWl4IGlzIHJlZ2lzdGVyZWQsIGNvcnJlc3BvbmRpbmcgaW5wdXQgYW5kIG91dHB1dCBwcm9maWxlcyBhcmUKKy8vIGFkZGVkIHRvIHRoZSByZW1vdGUgc3VibWl4IGh3IG1vZHVsZS4gVGhlIHByb2ZpbGUgY29udGFpbnMgb25seSB0aGUKKy8vIHBhcmFtZXRlcnMgKHNhbXBsaW5nIHJhdGUsIGZvcm1hdC4uLikgc3BlY2lmaWVkIGJ5IHRoZSBtaXguCisvLyBUaGUgY29ycmVzcG9uZGluZyBpbnB1dCByZW1vdGUgc3VibWl4IGRldmljZSBpcyBhbHNvIGNvbm5lY3RlZC4KKy8vCisvLyBXaGVuIGEgcmVtb3RlIHN1Ym1peCBkZXZpY2UgaXMgY29ubmVjdGVkLCB0aGUgYWRkcmVzcyBpcyBjaGVja2VkIHRvIHNlbGVjdCB0aGUKKy8vIGFwcHJvcHJpYXRlIHByb2ZpbGUgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IG9yIG91dHB1dCBzdHJlYW0gaXMgb3BlbmVkLgorLy8KKy8vIFdoZW4gY2FwdHVyZSBzdGFydHMsIGdldElucHV0Rm9yQXR0cigpIHdpbGw6CisvLyAgLSAxIGxvb2sgZm9yIGEgbWl4IG1hdGNoaW5nIHRoZSBhZGRyZXNzIHBhc3NlZCBpbiBhdHRyaWJ0dXRlcyB0YWdzIGlmIGFueQorLy8gIC0gMiBpZiBub25lIGZvdW5kLCBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZSgpIHdpbGw6CisvLyAgICAgLSAyLjEgbG9vayBmb3IgYSBtaXggbWF0Y2hpbmcgdGhlIGF0dHJpYnV0ZXMgc291cmNlCisvLyAgICAgLSAyLjIgaWYgbm9uZSBmb3VuZCwgZGVmYXVsdCB0byBkZXZpY2Ugc2VsZWN0aW9uIGJ5IHBvbGljeSBydWxlcworLy8gQXQgdGhpcyB0aW1lLCB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQgcmVtb3RlIHN1Ym1peCBkZXZpY2UgaXMgYWxzbyBjb25uZWN0ZWQKKy8vIGFuZCBhY3RpdmUgcGxheWJhY2sgdXNlIGNhc2VzIGNhbiBiZSB0cmFuc2ZlcnJlZCB0byB0aGlzIG1peCBpZiBuZWVkZWQgd2hlbiByZWNvbm5lY3RpbmcKKy8vIGFmdGVyIEF1ZGlvVHJhY2tzIGFyZSBpbnZhbGlkYXRlZAorLy8KKy8vIFdoZW4gcGxheWJhY2sgc3RhcnRzLCBnZXRPdXRwdXRGb3JBdHRyKCkgd2lsbDoKKy8vICAtIDEgbG9vayBmb3IgYSBtaXggbWF0Y2hpbmcgdGhlIGFkZHJlc3MgcGFzc2VkIGluIGF0dHJpYnR1dGVzIHRhZ3MgaWYgYW55CisvLyAgLSAyIGlmIG5vbmUgZm91bmQsIGxvb2sgZm9yIGEgbWl4IG1hdGNoaW5nIHRoZSBhdHRyaWJ1dGVzIHVzYWdlCisvLyAgLSAzIGlmIG5vbmUgZm91bmQsIGRlZmF1bHQgdG8gZGV2aWNlIGFuZCBvdXRwdXQgc2VsZWN0aW9uIGJ5IHBvbGljeSBydWxlcy4KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWdpc3RlclBvbGljeU1peGVzKFZlY3RvcjxBdWRpb01peD4gbWl4ZXMpCit7CisgICAgc3A8SHdNb2R1bGU+IG1vZHVsZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUkVNT1RFX1NVQk1JWCwgbUh3TW9kdWxlc1tpXS0+bU5hbWUpID09IDAgJiYKKyAgICAgICAgICAgICAgICBtSHdNb2R1bGVzW2ldLT5tSGFuZGxlICE9IDApIHsKKyAgICAgICAgICAgIG1vZHVsZSA9IG1Id01vZHVsZXNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtb2R1bGUgPT0gMCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgQUxPR1YoInJlZ2lzdGVyUG9saWN5TWl4ZXMoKSBudW0gbWl4ZXMgJWQiLCBtaXhlcy5zaXplKCkpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtaXhlcy5zaXplKCk7IGkrKykgeworICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXhlc1tpXS5tUmVnaXN0cmF0aW9uSWQ7CisKKyAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy5yZWdpc3Rlck1peChhZGRyZXNzLCBtaXhlc1tpXSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGF1ZGlvX2NvbmZpZ190IG91dHB1dENvbmZpZyA9IG1peGVzW2ldLm1Gb3JtYXQ7CisgICAgICAgIGF1ZGlvX2NvbmZpZ190IGlucHV0Q29uZmlnID0gbWl4ZXNbaV0ubUZvcm1hdDsKKyAgICAgICAgLy8gTk9URTogYXVkaW8gZmxpbmdlciBtaXhlciBkb2VzIG5vdCBzdXBwb3J0IG1vbm8gb3V0cHV0OiBjb25maWd1cmUgcmVtb3RlIHN1Ym1peCBIQUwgaW4KKyAgICAgICAgLy8gc3RlcmVvIGFuZCBsZXQgYXVkaW8gZmxpbmdlciBkbyB0aGUgY2hhbm5lbCBjb252ZXJzaW9uIGlmIG5lZWRlZC4KKyAgICAgICAgb3V0cHV0Q29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICAgICAgaW5wdXRDb25maWcuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU87CisgICAgICAgIG1vZHVsZS0+YWRkT3V0cHV0UHJvZmlsZShhZGRyZXNzLCAmb3V0cHV0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLCBhZGRyZXNzKTsKKyAgICAgICAgbW9kdWxlLT5hZGRJbnB1dFByb2ZpbGUoYWRkcmVzcywgJmlucHV0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsIGFkZHJlc3MpOworCisgICAgICAgIGlmIChtaXhlc1tpXS5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgInJlbW90ZS1zdWJtaXgiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgInJlbW90ZS1zdWJtaXgiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6dW5yZWdpc3RlclBvbGljeU1peGVzKFZlY3RvcjxBdWRpb01peD4gbWl4ZXMpCit7CisgICAgc3A8SHdNb2R1bGU+IG1vZHVsZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUkVNT1RFX1NVQk1JWCwgbUh3TW9kdWxlc1tpXS0+bU5hbWUpID09IDAgJiYKKyAgICAgICAgICAgICAgICBtSHdNb2R1bGVzW2ldLT5tSGFuZGxlICE9IDApIHsKKyAgICAgICAgICAgIG1vZHVsZSA9IG1Id01vZHVsZXNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtb2R1bGUgPT0gMCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgQUxPR1YoInVucmVnaXN0ZXJQb2xpY3lNaXhlcygpIG51bSBtaXhlcyAlZCIsIG1peGVzLnNpemUoKSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1peGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG1peGVzW2ldLm1SZWdpc3RyYXRpb25JZDsKKworICAgICAgICBpZiAobVBvbGljeU1peGVzLnVucmVnaXN0ZXJNaXgoYWRkcmVzcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwgYWRkcmVzcy5zdHJpbmcoKSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKQorICAgICAgICB7CisgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCAicmVtb3RlLXN1Ym1peCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsIGFkZHJlc3Muc3RyaW5nKCkpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkKKyAgICAgICAgeworICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4Iik7CisgICAgICAgIH0KKyAgICAgICAgbW9kdWxlLT5yZW1vdmVPdXRwdXRQcm9maWxlKGFkZHJlc3MpOworICAgICAgICBtb2R1bGUtPnJlbW92ZUlucHV0UHJvZmlsZShhZGRyZXNzKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZHVtcChpbnQgZmQpCit7CisgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CisgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgU3RyaW5nOCByZXN1bHQ7CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkF1ZGlvUG9saWN5TWFuYWdlciBEdW1wOiAlcFxuIiwgdGhpcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFByaW1hcnkgT3V0cHV0OiAlZFxuIiwKKyAgICAgICAgICAgICBoYXNQcmltYXJ5T3V0cHV0KCkgPyBtUHJpbWFyeU91dHB1dC0+bUlvSGFuZGxlIDogQVVESU9fSU9fSEFORExFX05PTkUpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgUGhvbmUgc3RhdGU6ICVkXG4iLCBtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBjb21tdW5pY2F0aW9ucyAlZFxuIiwKKyAgICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04pKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgbWVkaWEgJWRcbiIsIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUEpKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgcmVjb3JkICVkXG4iLCBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRCkpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBkb2NrICVkXG4iLCBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0spKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3Igc3lzdGVtICVkXG4iLCBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkpOworICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBoZG1pIHN5c3RlbSBhdWRpbyAlZFxuIiwKKyAgICAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU8pKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5kdW1wKGZkLCBTdHJpbmc4KCJvdXRwdXQiKSk7CisgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5kdW1wKGZkLCBTdHJpbmc4KCJpbnB1dCIpKTsKKyAgICBtSHdNb2R1bGVzLmR1bXAoZmQpOworICAgIG1PdXRwdXRzLmR1bXAoZmQpOworICAgIG1JbnB1dHMuZHVtcChmZCk7CisgICAgbVN0cmVhbXMuZHVtcChmZCk7CisgICAgbUVmZmVjdHMuZHVtcChmZCk7CisgICAgbUF1ZGlvUGF0Y2hlcy5kdW1wKGZkKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBjaGVja3MgZm9yIHRoZSBwYXJhbWV0ZXJzIHdoaWNoIGNhbiBiZSBvZmZsb2FkZWQuCisvLyBUaGlzIGNhbiBiZSBlbmhhbmNlZCBkZXBlbmRpbmcgb24gdGhlIGNhcGFiaWxpdHkgb2YgdGhlIERTUCBhbmQgcG9saWN5CisvLyBvZiB0aGUgc3lzdGVtLgorYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgb2ZmbG9hZEluZm8pCit7CisgICAgQUxPR1YoImlzT2ZmbG9hZFN1cHBvcnRlZDogU1I9JXUsIENNPTB4JXgsIEZvcm1hdD0weCV4LCBTdHJlYW1UeXBlPSVkLCIKKyAgICAgIiBCaXRSYXRlPSV1LCBkdXJhdGlvbj0lIiBQUklkNjQgIiB1cywgaGFzX3ZpZGVvPSVkIiwKKyAgICAgb2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUsIG9mZmxvYWRJbmZvLmNoYW5uZWxfbWFzaywKKyAgICAgb2ZmbG9hZEluZm8uZm9ybWF0LAorICAgICBvZmZsb2FkSW5mby5zdHJlYW1fdHlwZSwgb2ZmbG9hZEluZm8uYml0X3JhdGUsIG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzLAorICAgICBvZmZsb2FkSW5mby5oYXNfdmlkZW8pOworCisgICAgLy8gQ2hlY2sgaWYgb2ZmbG9hZCBoYXMgYmVlbiBkaXNhYmxlZAorICAgIGNoYXIgcHJvcFZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgaWYgKHByb3BlcnR5X2dldCgiYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIiwgcHJvcFZhbHVlLCAiMCIpKSB7CisgICAgICAgIGlmIChhdG9pKHByb3BWYWx1ZSkgIT0gMCkgeworICAgICAgICAgICAgQUxPR1YoIm9mZmxvYWQgZGlzYWJsZWQgYnkgYXVkaW8ub2ZmbG9hZC5kaXNhYmxlPSVzIiwgcHJvcFZhbHVlICk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiBzdHJlYW0gdHlwZSBpcyBtdXNpYywgdGhlbiBvbmx5IGFsbG93IG9mZmxvYWQgYXMgb2Ygbm93LgorICAgIGlmIChvZmZsb2FkSW5mby5zdHJlYW1fdHlwZSAhPSBBVURJT19TVFJFQU1fTVVTSUMpCisgICAgeworICAgICAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkOiBzdHJlYW1fdHlwZSAhPSBNVVNJQywgcmV0dXJuaW5nIGZhbHNlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvL1RPRE86IGVuYWJsZSBhdWRpbyBvZmZsb2FkaW5nIHdpdGggdmlkZW8gd2hlbiByZWFkeQorICAgIGNvbnN0IGJvb2wgYWxsb3dPZmZsb2FkV2l0aFZpZGVvID0KKyAgICAgICAgICAgIHByb3BlcnR5X2dldF9ib29sKCJhdWRpby5vZmZsb2FkLnZpZGVvIiwgZmFsc2UgLyogZGVmYXVsdF92YWx1ZSAqLyk7CisgICAgaWYgKG9mZmxvYWRJbmZvLmhhc192aWRlbyAmJiAhYWxsb3dPZmZsb2FkV2l0aFZpZGVvKSB7CisgICAgICAgIEFMT0dWKCJpc09mZmxvYWRTdXBwb3J0ZWQ6IGhhc192aWRlbyA9PSB0cnVlLCByZXR1cm5pbmcgZmFsc2UiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vSWYgZHVyYXRpb24gaXMgbGVzcyB0aGFuIG1pbmltdW0gdmFsdWUgZGVmaW5lZCBpbiBwcm9wZXJ0eSwgcmV0dXJuIGZhbHNlCisgICAgaWYgKHByb3BlcnR5X2dldCgiYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2VjcyIsIHByb3BWYWx1ZSwgTlVMTCkpIHsKKyAgICAgICAgaWYgKG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzIDwgKGF0b2kocHJvcFZhbHVlKSAqIDEwMDAwMDAgKSkgeworICAgICAgICAgICAgQUxPR1YoIk9mZmxvYWQgZGVuaWVkIGJ5IGR1cmF0aW9uIDwgYXVkaW8ub2ZmbG9hZC5taW4uZHVyYXRpb24uc2Vjcyg9JXMpIiwgcHJvcFZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAob2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPCBPRkZMT0FEX0RFRkFVTFRfTUlOX0RVUkFUSU9OX1NFQ1MgKiAxMDAwMDAwKSB7CisgICAgICAgIEFMT0dWKCJPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGRlZmF1bHQgbWluKD0ldSkiLCBPRkZMT0FEX0RFRkFVTFRfTUlOX0RVUkFUSU9OX1NFQ1MpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gRG8gbm90IGFsbG93IG9mZmxvYWRpbmcgaWYgb25lIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QgaXMgZW5hYmxlZC4gVGhpcyBwcmV2ZW50cyBmcm9tCisgICAgLy8gY3JlYXRpbmcgYW4gb2ZmbG9hZGVkIHRyYWNrIGFuZCB0ZWFyaW5nIGl0IGRvd24gaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnQgd2hlbiBhdWRpb2ZsaW5nZXIKKyAgICAvLyBkZXRlY3RzIHRoZXJlIGlzIGFuIGFjdGl2ZSBub24gb2ZmbG9hZGFibGUgZWZmZWN0LgorICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgY2hlY2sgdGhlIGF1ZGlvIHNlc3Npb24gaGVyZSBidXQgd2UgZG8gbm90IGhhdmUgaXQgaW4gdGhpcyBjb250ZXh0LgorICAgIC8vIFRoaXMgbWF5IHByZXZlbnQgb2ZmbG9hZGluZyBpbiByYXJlIHNpdHVhdGlvbnMgd2hlcmUgZWZmZWN0cyBhcmUgbGVmdCBhY3RpdmUgYnkgYXBwcworICAgIC8vIGluIHRoZSBiYWNrZ3JvdW5kLgorICAgIGlmIChtRWZmZWN0cy5pc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYSBwcm9maWxlIHRvIHN1cHBvcnQgdGhpcy4KKyAgICAvLyBBVURJT19ERVZJQ0VfTk9ORQorICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoQVVESU9fREVWSUNFX05PTkUgLyppZ25vcmUgZGV2aWNlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mby5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mby5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpOworICAgIEFMT0dWKCJpc09mZmxvYWRTdXBwb3J0ZWQoKSBwcm9maWxlICVzZm91bmQiLCBwcm9maWxlICE9IDAgPyAiIiA6ICJOT1QgIik7CisgICAgcmV0dXJuIChwcm9maWxlICE9IDApOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Omxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikKK3sKKyAgICBpZiAobnVtX3BvcnRzID09IE5VTEwgfHwgKCpudW1fcG9ydHMgIT0gMCAmJiBwb3J0cyA9PSBOVUxMKSB8fAorICAgICAgICAgICAgZ2VuZXJhdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCJsaXN0QXVkaW9Qb3J0cygpIHJvbGUgJWQgdHlwZSAlZCBudW1fcG9ydHMgJWQgcG9ydHMgJXAiLCByb2xlLCB0eXBlLCAqbnVtX3BvcnRzLCBwb3J0cyk7CisgICAgaWYgKHBvcnRzID09IE5VTEwpIHsKKyAgICAgICAgKm51bV9wb3J0cyA9IDA7CisgICAgfQorCisgICAgc2l6ZV90IHBvcnRzV3JpdHRlbiA9IDA7CisgICAgc2l6ZV90IHBvcnRzTWF4ID0gKm51bV9wb3J0czsKKyAgICAqbnVtX3BvcnRzID0gMDsKKyAgICBpZiAodHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTk9ORSB8fCB0eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTksgfHwgcm9sZSA9PSBBVURJT19QT1JUX1JPTEVfTk9ORSkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGkgIDwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpICYmIHBvcnRzV3JpdHRlbiA8IHBvcnRzTWF4OyBpKyspIHsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXS0+dG9BdWRpb1BvcnQoJnBvcnRzW3BvcnRzV3JpdHRlbisrXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqbnVtX3BvcnRzICs9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFIHx8IHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX05PTkUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgICAgICAgICBpICA8IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpICYmIHBvcnRzV3JpdHRlbiA8IHBvcnRzTWF4OyBpKyspIHsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT50b0F1ZGlvUG9ydCgmcG9ydHNbcG9ydHNXcml0dGVuKytdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpudW1fcG9ydHMgKz0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX05PTkUgfHwgdHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgIGlmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LIHx8IHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX05PTkUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUlucHV0cy5zaXplKCkgJiYgcG9ydHNXcml0dGVuIDwgcG9ydHNNYXg7IGkrKykgeworICAgICAgICAgICAgICAgIG1JbnB1dHNbaV0tPnRvQXVkaW9Qb3J0KCZwb3J0c1twb3J0c1dyaXR0ZW4rK10pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKm51bV9wb3J0cyArPSBtSW5wdXRzLnNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFIHx8IHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX05PTkUpIHsKKyAgICAgICAgICAgIHNpemVfdCBudW1PdXRwdXRzID0gMDsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1PdXRwdXRzW2ldLT5pc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBudW1PdXRwdXRzKys7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3J0c1dyaXR0ZW4gPCBwb3J0c01heCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHNbaV0tPnRvQXVkaW9Qb3J0KCZwb3J0c1twb3J0c1dyaXR0ZW4rK10pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKm51bV9wb3J0cyArPSBudW1PdXRwdXRzOworICAgICAgICB9CisgICAgfQorICAgICpnZW5lcmF0aW9uID0gY3VyQXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgIEFMT0dWKCJsaXN0QXVkaW9Qb3J0cygpIGdvdCAlenUgcG9ydHMgbmVlZGVkICVkIiwgcG9ydHNXcml0dGVuLCAqbnVtX3BvcnRzKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0IF9fdW51c2VkKQoreworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKK3sKKyAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIik7CisKKyAgICBpZiAoaGFuZGxlID09IE5VTEwgfHwgcGF0Y2ggPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG51bSBzb3VyY2VzICVkIG51bSBzaW5rcyAlZCIsIHBhdGNoLT5udW1fc291cmNlcywgcGF0Y2gtPm51bV9zaW5rcyk7CisKKyAgICBpZiAocGF0Y2gtPm51bV9zb3VyY2VzID09IDAgfHwgcGF0Y2gtPm51bV9zb3VyY2VzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYIHx8CisgICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzID09IDAgfHwgcGF0Y2gtPm51bV9zaW5rcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAvLyBvbmx5IG9uZSBzb3VyY2UgcGVyIGF1ZGlvIHBhdGNoIHN1cHBvcnRlZCBmb3Igbm93CisgICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA+IDEpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChwYXRjaC0+c291cmNlc1swXS5yb2xlICE9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgeworICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnJvbGUgIT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpoYW5kbGUpOworCisgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2ggc291cmNlIGlkICVkIHJvbGUgJWQgdHlwZSAlZCIsIHBhdGNoLT5zb3VyY2VzWzBdLmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5yb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS50eXBlKTsKKyNpZiBMT0dfTkRFQlVHID09IDAKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgeworICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCBzaW5rICVkOiBpZCAlZCByb2xlICVkIHR5cGUgJWQiLCBpLCBwYXRjaC0+c2lua3NbaV0uaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLnJvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLnR5cGUpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBtVWlkQ2FjaGVkICVkIHBhdGNoRGVzYy0+bVVpZCAlZCB1aWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVpZENhY2hlZCwgcGF0Y2hEZXNjLT5tVWlkLCB1aWQpOworICAgICAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQgJiYgdWlkICE9IHBhdGNoRGVzYy0+bVVpZCkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmhhbmRsZSA9IDA7CisgICAgfQorCisgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLmdldE91dHB1dEZyb21JZChwYXRjaC0+c291cmNlc1swXS5pZCk7CisgICAgICAgIGlmIChvdXRwdXREZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgb3V0cHV0IG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBwYXRjaC0+c291cmNlc1swXS5pZCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwiZHVwbGljYXRlZCBvdXRwdXQgJWQgaW4gc291cmNlIGluIHBvcnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCkgeworICAgICAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVBhdGNoLnNvdXJjZXNbMF0uaWQgIT0gcGF0Y2gtPnNvdXJjZXNbMF0uaWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHNvdXJjZSBpZCBkaWZmZXJzIGZvciBwYXRjaCBjdXJyZW50IGlkICVkIG5ldyBpZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaC5zb3VyY2VzWzBdLmlkLCBwYXRjaC0+c291cmNlc1swXS5pZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgICAgIC8vIE9ubHkgc3VwcG9ydCBtaXggdG8gZGV2aWNlcyBjb25uZWN0aW9uCisgICAgICAgICAgICAvLyBUT0RPIGFkZCBzdXBwb3J0IGZvciBtaXggdG8gbWl4IGNvbm5lY3Rpb24KKyAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbaV0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzb3VyY2UgbWl4IGJ1dCBzaW5rIGlzIG5vdCBhIGRldmljZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQorICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocGF0Y2gtPnNpbmtzW2ldLmlkKTsKKyAgICAgICAgICAgIGlmIChkZXZEZXNjID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG91dCBkZXZpY2Ugbm90IGZvdW5kIGZvciBpZCAlZCIsIHBhdGNoLT5zaW5rc1tpXS5pZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5tUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZEZXNjLT50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgIC8vIHVwZGF0ZWRTYW1wbGluZ1JhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgLy8gdXBkYXRlZEZvcm1hdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAvLyB1cGRhdGVkQ2hhbm5lbE1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSAvKkZJWE1FKi8pKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBwcm9maWxlIG5vdCBzdXBwb3J0ZWQgZm9yIGRldmljZSAlMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPnR5cGUoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2RGVzYyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IHJlY29uZmlndXJlIG91dHB1dCBmb3JtYXQgYW5kIGNoYW5uZWxzIGhlcmUKKyAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXR0aW5nIGRldmljZSAlMDh4IG9uIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgIGRldmljZXMudHlwZXMoKSwgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGRldmljZXMudHlwZXMoKSwgdHJ1ZSwgMCwgaGFuZGxlKTsKKyAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKmhhbmRsZSk7CisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICBpZiAocGF0Y2hEZXNjICE9IDAgJiYgcGF0Y2hEZXNjICE9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIHNldE91dHB1dERldmljZSgpIGRpZCBub3QgcmV1c2UgdGhlIHBhdGNoIHByb3ZpZGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgcGF0Y2hEZXNjLT5tVWlkID0gdWlkOworICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzdWNjZXNzIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIHNldE91dHB1dERldmljZSgpIGZhaWxlZCB0byBjcmVhdGUgYSBwYXRjaCIpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChwYXRjaC0+c291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgICAgIC8vIGlucHV0IGRldmljZSB0byBpbnB1dCBtaXggY29ubmVjdGlvbgorICAgICAgICAgICAgLy8gb25seSBvbmUgc2luayBzdXBwb3J0ZWQgd2hlbiBjb25uZWN0aW5nIGFuIGlucHV0IGRldmljZSB0byBhIG1peAorICAgICAgICAgICAgaWYgKHBhdGNoLT5udW1fc2lua3MgPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMuZ2V0SW5wdXRGcm9tSWQocGF0Y2gtPnNpbmtzWzBdLmlkKTsKKyAgICAgICAgICAgIGlmIChpbnB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGF0Y2hEZXNjICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2hEZXNjLT5tUGF0Y2guc2lua3NbMF0uaWQgIT0gcGF0Y2gtPnNpbmtzWzBdLmlkKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9CisgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgICAgIGlmIChkZXZEZXNjID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWlucHV0RGVzYy0+bVByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2RGVzYy0+dHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAvKnVwZGF0ZWRTYW1wbGVSYXRlKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIC8qdXBkYXRlZEZvcm1hdCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAvKnVwZGF0ZWRDaGFubmVsTWFzayovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgZm9yIHRoZSBwYXJhbWV0ZXIgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIE5PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVE9ETzogcmVjb25maWd1cmUgb3V0cHV0IGZvcm1hdCBhbmQgY2hhbm5lbHMgaGVyZQorICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXR0aW5nIGRldmljZSAlMDh4IG9uIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPnR5cGUoKSwgaW5wdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXREZXNjLT5tSW9IYW5kbGUsIGRldkRlc2MtPnR5cGUoKSwgdHJ1ZSwgaGFuZGxlKTsKKyAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpoYW5kbGUpOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0Y2hEZXNjICE9IDAgJiYgcGF0Y2hEZXNjICE9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXRJbnB1dERldmljZSgpIGRpZCBub3QgcmV1c2UgdGhlIHBhdGNoIHByb3ZpZGVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tVWlkID0gdWlkOworICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc3VjY2VzcyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIHNldElucHV0RGV2aWNlKCkgZmFpbGVkIHRvIGNyZWF0ZSBhIHBhdGNoIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgIC8vIGRldmljZSB0byBkZXZpY2UgY29ubmVjdGlvbgorICAgICAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVBhdGNoLnNvdXJjZXNbMF0uaWQgIT0gcGF0Y2gtPnNvdXJjZXNbMF0uaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2VEZXNjID0KKyAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocGF0Y2gtPnNvdXJjZXNbMF0uaWQpOworICAgICAgICAgICAgaWYgKHNyY0RldmljZURlc2MgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vdXBkYXRlIHNvdXJjZSBhbmQgc2luayB3aXRoIG91ciBvd24gZGF0YSBhcyB0aGUgZGF0YSBwYXNzZWQgaW4gdGhlIHBhdGNoIG1heQorICAgICAgICAgICAgLy8gYmUgaW5jb21wbGV0ZS4KKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBuZXdQYXRjaCA9ICpwYXRjaDsKKyAgICAgICAgICAgIHNyY0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZuZXdQYXRjaC5zb3VyY2VzWzBdLCAmcGF0Y2gtPnNvdXJjZXNbMF0pOworCisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbaV0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc291cmNlIGRldmljZSBidXQgb25lIHNpbmsgaXMgbm90IGEgZGV2aWNlIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzaW5rRGV2aWNlRGVzYyA9CisgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocGF0Y2gtPnNpbmtzW2ldLmlkKTsKKyAgICAgICAgICAgICAgICBpZiAoc2lua0RldmljZURlc2MgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzaW5rRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJm5ld1BhdGNoLnNpbmtzW2ldLCAmcGF0Y2gtPnNpbmtzW2ldKTsKKworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHNvZnR3YXJlIGJyaWRnZSBpbiBQYXRjaFBhbmVsIGlmOgorICAgICAgICAgICAgICAgIC8vIC0gc291cmNlIGFuZCBzaW5rIGRldmljZXMgYXJlIG9uIGRpZmZlcm50IEhXIG1vZHVsZXMgT1IKKyAgICAgICAgICAgICAgICAvLyAtIGF1ZGlvIEhBTCB2ZXJzaW9uIGlzIDwgMy4wCisgICAgICAgICAgICAgICAgaWYgKChzcmNEZXZpY2VEZXNjLT5nZXRNb2R1bGVIYW5kbGUoKSAhPSBzaW5rRGV2aWNlRGVzYy0+Z2V0TW9kdWxlSGFuZGxlKCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoc3JjRGV2aWNlRGVzYy0+bU1vZHVsZS0+bUhhbFZlcnNpb24gPCBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IG9ubHkgb25lIHNpbmsgZGV2aWNlIGZvciBub3cgdG8gc2ltcGxpZnkgb3V0cHV0IHNlbGVjdGlvbiBsb2dpYworICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPm51bV9zaW5rcyA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRPdXRwdXRzRm9yRGV2aWNlKHNpbmtEZXZpY2VEZXNjLT50eXBlKCksIG1PdXRwdXRzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHNpbmsgZGV2aWNlIGlzIHJlYWNoYWJsZSB2aWEgYW4gb3BlbmVkIG91dHB1dCBzdHJlYW0sIHJlcXVlc3QgdG8gZ28gdmlhCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgb3V0cHV0IHN0cmVhbSBieSBhZGRpbmcgYSBzZWNvbmQgc291cmNlIHRvIHRoZSBwYXRjaCBkZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfSU5WQUxJRCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc291cmNlc1sxXSwgJnBhdGNoLT5zb3VyY2VzWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9QQVRDSDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLm51bV9zb3VyY2VzID0gMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIGZyb20gcm91dGluZyBjYXBhYmlsaXRpZXMgaW4gY29uZmlnIGZpbGUgYW5kIG90aGVyIGNvbmZsaWN0aW5nIHBhdGNoZXMKKworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJm5ld1BhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgcGF0Y2ggcGFuZWwgcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBhZlBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKCZuZXdQYXRjaCwgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBuZXdQYXRjaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICAgICAgKmhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKKyAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgcGF0Y2ggcGFuZWwgY291bGQgbm90IGNvbm5lY3QgZGV2aWNlIHBhdGNoLCBlcnJvciAlZCIsCisgICAgICAgICAgICAgICAgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQoreworICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIHBhdGNoICVkIiwgaGFuZGxlKTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaGFuZGxlKTsKKworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKKyAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBtVWlkQ2FjaGVkICVkIHBhdGNoRGVzYy0+bVVpZCAlZCB1aWQgJWQiLAorICAgICAgICAgIG1VaWRDYWNoZWQsIHBhdGNoRGVzYy0+bVVpZCwgdWlkKTsKKyAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQgJiYgdWlkICE9IHBhdGNoRGVzYy0+bVVpZCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCA9ICZwYXRjaERlc2MtPm1QYXRjaDsKKyAgICBwYXRjaERlc2MtPm1VaWQgPSBtVWlkQ2FjaGVkOworICAgIGlmIChwYXRjaC0+c291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy5nZXRPdXRwdXRGcm9tSWQocGF0Y2gtPnNvdXJjZXNbMF0uaWQpOworICAgICAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBvdXRwdXQgbm90IGZvdW5kIGZvciBpZCAlZCIsIHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pLAorICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9IGVsc2UgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgeworICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMuZ2V0SW5wdXRGcm9tSWQocGF0Y2gtPnNpbmtzWzBdLmlkKTsKKyAgICAgICAgICAgIGlmIChpbnB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGlucHV0IG5vdCBmb3VuZCBmb3IgaWQgJWQiLCBwYXRjaC0+c2lua3NbMF0uaWQpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dERlc2MtPm1Jb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYy0+bUlvSGFuZGxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIHJlbW92ZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlKTsKKyAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbikKK3sKKyAgICBpZiAoZ2VuZXJhdGlvbiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgICpnZW5lcmF0aW9uID0gY3VyQXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgIHJldHVybiBtQXVkaW9QYXRjaGVzLmxpc3RBdWRpb1BhdGNoZXMobnVtX3BhdGNoZXMsIHBhdGNoZXMpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBBTE9HVigic2V0QXVkaW9Qb3J0Q29uZmlnKCkiKTsKKworICAgIGlmIChjb25maWcgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigic2V0QXVkaW9Qb3J0Q29uZmlnKCkgb24gcG9ydCBoYW5kbGUgJWQiLCBjb25maWctPmlkKTsKKyAgICAvLyBPbmx5IHN1cHBvcnQgZ2FpbiBjb25maWd1cmF0aW9uIGZvciBub3cKKyAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAhPSBBVURJT19QT1JUX0NPTkZJR19HQUlOKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzcDxBdWRpb1BvcnRDb25maWc+IGF1ZGlvUG9ydENvbmZpZzsKKyAgICBpZiAoY29uZmlnLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgaWYgKGNvbmZpZy0+cm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7CisgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLmdldE91dHB1dEZyb21JZChjb25maWctPmlkKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXREZXNjID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR19BU1NFUlQoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgInNldEF1ZGlvUG9ydENvbmZpZygpIGNhbGxlZCBvbiBkdXBsaWNhdGVkIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgYXVkaW9Qb3J0Q29uZmlnID0gb3V0cHV0RGVzYzsKKyAgICAgICAgfSBlbHNlIGlmIChjb25maWctPnJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLmdldElucHV0RnJvbUlkKGNvbmZpZy0+aWQpOworICAgICAgICAgICAgaWYgKGlucHV0RGVzYyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1ZGlvUG9ydENvbmZpZyA9IGlucHV0RGVzYzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNvbmZpZy0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2M7CisgICAgICAgIGlmIChjb25maWctPnJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgeworICAgICAgICAgICAgZGV2aWNlRGVzYyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKGNvbmZpZy0+aWQpOworICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+cm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykgeworICAgICAgICAgICAgZGV2aWNlRGVzYyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChjb25maWctPmlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZURlc2MgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBhdWRpb1BvcnRDb25maWcgPSBkZXZpY2VEZXNjOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGJhY2t1cENvbmZpZzsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvcnRDb25maWctPmFwcGx5QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZywgJmJhY2t1cENvbmZpZyk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbmV3Q29uZmlnOworICAgICAgICBhdWRpb1BvcnRDb25maWctPnRvQXVkaW9Qb3J0Q29uZmlnKCZuZXdDb25maWcsIGNvbmZpZyk7CisgICAgICAgIHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRBdWRpb1BvcnRDb25maWcoJm5ld0NvbmZpZywgMCk7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgYXVkaW9Qb3J0Q29uZmlnLT5hcHBseUF1ZGlvUG9ydENvbmZpZygmYmFja3VwQ29uZmlnKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZVJlc291cmNlc0ZvclVpZCh1aWRfdCB1aWQpCit7CisgICAgY2xlYXJBdWRpb1BhdGNoZXModWlkKTsKKyAgICBjbGVhclNlc3Npb25Sb3V0ZXModWlkKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsZWFyQXVkaW9QYXRjaGVzKHVpZF90IHVpZCkKK3sKKyAgICBmb3IgKHNzaXplX3QgaSA9IChzc2l6ZV90KW1BdWRpb1BhdGNoZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pICB7CisgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVVpZCA9PSB1aWQpIHsKKyAgICAgICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoKG1BdWRpb1BhdGNoZXMua2V5QXQoaSksIHVpZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrU3RyYXRlZ3lSb3V0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXB0dXRUb1NraXApCit7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgbU91dHB1dHMpOworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbU91dHB1dHMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgaWYgKG1PdXRwdXRzLmtleUF0KGopID09IG91cHR1dFRvU2tpcCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGopOworICAgICAgICBpZiAoIWlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgKHJvdXRpbmdfc3RyYXRlZ3kpc3RyYXRlZ3kpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiB0aGUgZGVmYXVsdCBkZXZpY2UgZm9yIHRoaXMgc3RyYXRlZ3kgaXMgb24gYW5vdGhlciBvdXRwdXQgbWl4LAorICAgICAgICAvLyBpbnZhbGlkYXRlIGFsbCB0cmFja3MgaW4gdGhpcyBzdHJhdGVneSB0byBmb3JjZSByZSBjb25uZWN0aW9uLgorICAgICAgICAvLyBPdGhlcndpc2Ugc2VsZWN0IG5ldyBkZXZpY2Ugb24gdGhlIG91dHB1dCBtaXguCisgICAgICAgIGlmIChvdXRwdXRzLmluZGV4T2YobU91dHB1dHMua2V5QXQoaikpIDwgMCkgeworICAgICAgICAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0NOVDsgc3RyZWFtKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9QQVRDSCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSkgPT0gc3RyYXRlZ3kpIHsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIG5ld0RldmljZSwgZmFsc2UpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xlYXJTZXNzaW9uUm91dGVzKHVpZF90IHVpZCkKK3sKKyAgICAvLyByZW1vdmUgb3V0cHV0IHJvdXRlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyB1aWQKKyAgICBTb3J0ZWRWZWN0b3I8cm91dGluZ19zdHJhdGVneT4gYWZmZWN0ZWRTdHJhdGVnaWVzOworICAgIGZvciAoc3NpemVfdCBpID0gKHNzaXplX3QpbU91dHB1dFJvdXRlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgIHsKKyAgICAgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IG1PdXRwdXRSb3V0ZXMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKHJvdXRlLT5tVWlkID09IHVpZCkgeworICAgICAgICAgICAgbU91dHB1dFJvdXRlcy5yZW1vdmVJdGVtc0F0KGkpOworICAgICAgICAgICAgaWYgKHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwKSB7CisgICAgICAgICAgICAgICAgYWZmZWN0ZWRTdHJhdGVnaWVzLmFkZChnZXRTdHJhdGVneShyb3V0ZS0+bVN0cmVhbVR5cGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyByZXJvdXRlIG91dHB1dHMgaWYgbmVjZXNzYXJ5CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhZmZlY3RlZFN0cmF0ZWdpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKGFmZmVjdGVkU3RyYXRlZ2llc1tpXSwgQVVESU9fSU9fSEFORExFX05PTkUpOworICAgIH0KKworICAgIC8vIHJlbW92ZSBpbnB1dCByb3V0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdWlkCisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX3NvdXJjZV90PiBhZmZlY3RlZFNvdXJjZXM7CisgICAgZm9yIChzc2l6ZV90IGkgPSAoc3NpemVfdCltSW5wdXRSb3V0ZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pICB7CisgICAgICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBtSW5wdXRSb3V0ZXMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKHJvdXRlLT5tVWlkID09IHVpZCkgeworICAgICAgICAgICAgbUlucHV0Um91dGVzLnJlbW92ZUl0ZW1zQXQoaSk7CisgICAgICAgICAgICBpZiAocm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yICE9IDApIHsKKyAgICAgICAgICAgICAgICBhZmZlY3RlZFNvdXJjZXMuYWRkKHJvdXRlLT5tU291cmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyByZXJvdXRlIGlucHV0cyBpZiBuZWNlc3NhcnkKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IGlucHV0c1RvQ2xvc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChhZmZlY3RlZFNvdXJjZXMuaW5kZXhPZihpbnB1dERlc2MtPm1JbnB1dFNvdXJjZSkgPj0gMCkgeworICAgICAgICAgICAgaW5wdXRzVG9DbG9zZS5hZGQoaW5wdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5wdXRzVG9DbG9zZS5zaXplKCk7IGkrKykgeworICAgICAgICBjbG9zZUlucHV0KGlucHV0c1RvQ2xvc2VbaV0pOworICAgIH0KK30KKworCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKQoreworICAgICpzZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdCltcENsaWVudEludGVyZmFjZS0+bmV3QXVkaW9VbmlxdWVJZCgpOworICAgICppb0hhbmRsZSA9IChhdWRpb19pb19oYW5kbGVfdCltcENsaWVudEludGVyZmFjZS0+bmV3QXVkaW9VbmlxdWVJZCgpOworICAgICpkZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfSE9UV09SRCk7CisKKyAgICByZXR1cm4gbVNvdW5kVHJpZ2dlclNlc3Npb25zLmFjcXVpcmVTZXNzaW9uKCpzZXNzaW9uLCAqaW9IYW5kbGUpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaGFuZGxlIF9fdW51c2VkKQoreworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wQXVkaW9Tb3VyY2UoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlIF9fdW51c2VkKQoreworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXVkaW9Qb2xpY3lNYW5hZ2VyCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6Om5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCkKK3sKKyAgICByZXR1cm4gYW5kcm9pZF9hdG9taWNfaW5jKCZtQXVkaW9Qb3J0R2VuZXJhdGlvbik7Cit9CisKK0F1ZGlvUG9saWN5TWFuYWdlcjo6QXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCisgICAgOgorI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgVGhyZWFkKGZhbHNlKSwKKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUoZmFsc2UpLCBtTGFzdFZvaWNlVm9sdW1lKC0xLjBmKSwKKyAgICBtQTJkcFN1c3BlbmRlZChmYWxzZSksCisgICAgbVNwZWFrZXJEcmNFbmFibGVkKGZhbHNlKSwKKyAgICBtQXVkaW9Qb3J0R2VuZXJhdGlvbigxKSwKKyAgICBtQmVhY29uTXV0ZVJlZkNvdW50KDApLAorICAgIG1CZWFjb25QbGF5aW5nUmVmQ291bnQoMCksCisgICAgbUJlYWNvbk11dGVkKGZhbHNlKQoreworICAgIGF1ZGlvX3BvbGljeTo6RW5naW5lSW5zdGFuY2UgKmVuZ2luZUluc3RhbmNlID0gYXVkaW9fcG9saWN5OjpFbmdpbmVJbnN0YW5jZTo6Z2V0SW5zdGFuY2UoKTsKKyAgICBpZiAoIWVuZ2luZUluc3RhbmNlKSB7CisgICAgICAgIEFMT0dFKCIlczogIENvdWxkIG5vdCBnZXQgYW4gaW5zdGFuY2Ugb2YgcG9saWN5IGVuZ2luZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gUmV0cmlldmUgdGhlIFBvbGljeSBNYW5hZ2VyIEludGVyZmFjZQorICAgIG1FbmdpbmUgPSBlbmdpbmVJbnN0YW5jZS0+cXVlcnlJbnRlcmZhY2U8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlPigpOworICAgIGlmIChtRW5naW5lID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IFBvbGljeSBFbmdpbmUgSW50ZXJmYWNlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtRW5naW5lLT5zZXRPYnNlcnZlcih0aGlzKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtRW5naW5lLT5pbml0Q2hlY2soKTsKKyAgICBBTE9HX0FTU0VSVChzdGF0dXMgPT0gTk9fRVJST1IsICJQb2xpY3kgZW5naW5lIG5vdCBpbml0aWFsaXplZChlcnI9JWQpIiwgc3RhdHVzKTsKKworICAgIG1VaWRDYWNoZWQgPSBnZXR1aWQoKTsKKyAgICBtcENsaWVudEludGVyZmFjZSA9IGNsaWVudEludGVyZmFjZTsKKworICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKTsKKyAgICBpZiAoQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkQXVkaW9Qb2xpY3lDb25maWcoQVVESU9fUE9MSUNZX1ZFTkRPUl9DT05GSUdfRklMRSwKKyAgICAgICAgICAgICAgICAgbUh3TW9kdWxlcywgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywgbUF2YWlsYWJsZU91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlLCBtU3BlYWtlckRyY0VuYWJsZWQpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGlmIChDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRBdWRpb1BvbGljeUNvbmZpZyhBVURJT19QT0xJQ1lfQ09ORklHX0ZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUh3TW9kdWxlcywgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywgbUF2YWlsYWJsZU91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UsIG1TcGVha2VyRHJjRW5hYmxlZCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgbG9hZCBhdWRpbyBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlLCBzZXR0aW5nIGRlZmF1bHRzIik7CisgICAgICAgICAgICBkZWZhdWx0QXVkaW9Qb2xpY3lDb25maWcoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBhbmQgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyBub3cgY29udGFpbiBhbGwgYXR0YWNoZWQgZGV2aWNlcworCisgICAgLy8gbXVzdCBiZSBkb25lIGFmdGVyIHJlYWRpbmcgdGhlIHBvbGljeSAoc2luY2UgY29uZGl0aW9ubmVkIGJ5IFNwZWFrZXIgRHJjIEVuYWJsaW5nKQorICAgIG1FbmdpbmUtPmluaXRpYWxpemVWb2x1bWVDdXJ2ZXMobVNwZWFrZXJEcmNFbmFibGVkKTsKKworICAgIC8vIG9wZW4gYWxsIG91dHB1dCBzdHJlYW1zIG5lZWRlZCB0byBhY2Nlc3MgYXR0YWNoZWQgZGV2aWNlcworICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7CisgICAgYXVkaW9fZGV2aWNlc190IGlucHV0RGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Id01vZHVsZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5sb2FkSHdNb2R1bGUobUh3TW9kdWxlc1tpXS0+bU5hbWUpOworICAgICAgICBpZiAobUh3TW9kdWxlc1tpXS0+bUhhbmRsZSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygiY291bGQgbm90IG9wZW4gSFcgbW9kdWxlICVzIiwgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gb3BlbiBhbGwgb3V0cHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzCisgICAgICAgIC8vIGV4Y2VwdCBmb3IgZGlyZWN0IG91dHB1dCBzdHJlYW1zIHRoYXQgYXJlIG9ubHkgb3BlbmVkIHdoZW4gdGhleSBhcmUgYWN0dWFsbHkKKyAgICAgICAgLy8gcmVxdWlyZWQgYnkgYW4gYXBwLgorICAgICAgICAvLyBUaGlzIGFsc28gdmFsaWRhdGVzIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzIGxpc3QKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gb3V0UHJvZmlsZSA9IG1Id01vZHVsZXNbaV0tPm1PdXRwdXRQcm9maWxlc1tqXTsKKworICAgICAgICAgICAgaWYgKG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJPdXRwdXQgcHJvZmlsZSBjb250YWlucyBubyBkZXZpY2Ugb24gbW9kdWxlICVzIiwgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKG91dFByb2ZpbGUtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByb2ZpbGVUeXBlID0gb3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKTsKKyAgICAgICAgICAgIGlmICgocHJvZmlsZVR5cGUgJiBtRGVmYXVsdE91dHB1dERldmljZS0+dHlwZSgpKSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlID0gbURlZmF1bHRPdXRwdXREZXZpY2UtPnR5cGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gY2hvc2UgZmlyc3QgZGV2aWNlIHByZXNlbnQgaW4gbVN1cHBvcnRlZERldmljZXMgYWxzbyBwYXJ0IG9mCisgICAgICAgICAgICAgICAgLy8gb3V0cHV0RGV2aWNlVHlwZXMKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayAgPCBvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSA9IG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdLT50eXBlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgocHJvZmlsZVR5cGUgJiBvdXRwdXREZXZpY2VUeXBlcykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHByb2ZpbGVUeXBlICYgb3V0cHV0RGV2aWNlVHlwZXMpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKG91dFByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZSk7CisKKyAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBwcm9maWxlVHlwZTsKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrOworICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG91dHB1dERlc2MtPm1Gb3JtYXQ7CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KG91dFByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0RGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZsYWdzKTsKKworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dXKCJDYW5ub3Qgb3BlbiBvdXRwdXQgc3RyZWFtIGZvciBkZXZpY2UgJTA4eCBvbiBodyBtb2R1bGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgbUh3TW9kdWxlc1tpXS0+bU5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCA9IGNvbmZpZy5mb3JtYXQ7CisKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayAgPCBvdXRQcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IG91dFByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzW2tdLT50eXBlKCk7CisgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2Yob3V0UHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNba10pOworICAgICAgICAgICAgICAgICAgICAvLyBnaXZlIGEgdmFsaWQgSUQgdG8gYW4gYXR0YWNoZWQgZGV2aWNlIG9uY2UgY29uZmlybWVkIGl0IGlzIHJlYWNoYWJsZQorICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiAhbUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5pc0F0dGFjaGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+YXR0YWNoKG1Id01vZHVsZXNbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtUHJpbWFyeU91dHB1dCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRQcm9maWxlLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSB7CisgICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0ID0gb3V0cHV0RGVzYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgb3V0cHV0RGVzYyk7CisgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIG9wZW4gaW5wdXQgc3RyZWFtcyBuZWVkZWQgdG8gYWNjZXNzIGF0dGFjaGVkIGRldmljZXMgdG8gdmFsaWRhdGUKKyAgICAgICAgLy8gbUF2YWlsYWJsZUlucHV0RGV2aWNlcyBsaXN0CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gaW5Qcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXNbal07CisKKyAgICAgICAgICAgIGlmIChpblByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJJbnB1dCBwcm9maWxlIGNvbnRhaW5zIG5vIGRldmljZSBvbiBtb2R1bGUgJXMiLCBtSHdNb2R1bGVzW2ldLT5tTmFtZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBjaG9zZSBmaXJzdCBkZXZpY2UgcHJlc2VudCBpbiBtU3VwcG9ydGVkRGV2aWNlcyBhbHNvIHBhcnQgb2YKKyAgICAgICAgICAgIC8vIGlucHV0RGV2aWNlVHlwZXMKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcm9maWxlVHlwZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgIDwgaW5Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlID0gaW5Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1trXS0+dHlwZSgpOworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlVHlwZSAmIGlucHV0RGV2aWNlVHlwZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIGlucHV0RGV2aWNlVHlwZXMpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IoaW5Qcm9maWxlKTsKKworICAgICAgICAgICAgaW5wdXREZXNjLT5tSW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDOworICAgICAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlID0gcHJvZmlsZVR5cGU7CisKKyAgICAgICAgICAgIC8vIGZpbmQgdGhlIGFkZHJlc3MKKyAgICAgICAgICAgIERldmljZVZlY3RvciBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShwcm9maWxlVHlwZSk7CisgICAgICAgICAgICAvLyAgIHRoZSBpbnB1dHMgdmVjdG9yIG11c3QgYmUgb2Ygc2l6ZSAxLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBoZXJlCisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBpbnB1dERldmljZXMuc2l6ZSgpID4gMCA/IGlucHV0RGV2aWNlcy5pdGVtQXQoMCktPm1BZGRyZXNzCisgICAgICAgICAgICAgICAgICAgIDogU3RyaW5nOCgiIik7CisgICAgICAgICAgICBBTE9HVigiICBmb3IgaW5wdXQgZGV2aWNlIDB4JXggdXNpbmcgYWRkcmVzcyAlcyIsIHByb2ZpbGVUeXBlLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFMT0dFX0lGKGlucHV0RGV2aWNlcy5zaXplKCkgPT0gMCwgIklucHV0IGRldmljZSBsaXN0IGlzIGVtcHR5ISIpOworCisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBpbnB1dERlc2MtPm1TYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gaW5wdXREZXNjLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gaW5wdXREZXNjLT5tRm9ybWF0OworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuSW5wdXQoaW5Qcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXREZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUpOworCisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgIDwgaW5Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy5zaXplKCk7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNba10tPnR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5pbmRleE9mKGluUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNba10pOworICAgICAgICAgICAgICAgICAgICAvLyBnaXZlIGEgdmFsaWQgSUQgdG8gYW4gYXR0YWNoZWQgZGV2aWNlIG9uY2UgY29uZmlybWVkIGl0IGlzIHJlYWNoYWJsZQorICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXZEZXNjLT5pc0F0dGFjaGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5hdHRhY2gobUh3TW9kdWxlc1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KGluUHJvZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQoaW5wdXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gaW5wdXQgc3RyZWFtIGZvciBkZXZpY2UgJTA4eCBvbiBodyBtb2R1bGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICBtSHdNb2R1bGVzW2ldLT5tTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gbWFrZSBzdXJlIGFsbCBhdHRhY2hlZCBkZXZpY2VzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgYSB1bmlxdWUgSUQKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAgPCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5zaXplKCk7KSB7CisgICAgICAgIGlmICghbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPmlzQXR0YWNoZWQoKSkgeworICAgICAgICAgICAgQUxPR1coIklucHV0IGRldmljZSAlMDh4IHVucmVhY2hhYmxlIiwgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0tPnR5cGUoKSk7CisgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUobUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlIGRldmljZSBpcyBub3cgdmFsaWRhdGVkIGFuZCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIGF2YWlsYWJsZSBkZXZpY2VzIG9mIHRoZSBlbmdpbmUKKyAgICAgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpOworICAgICAgICBpKys7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICA8IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOykgeworICAgICAgICBpZiAoIW1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPmlzQXR0YWNoZWQoKSkgeworICAgICAgICAgICAgQUxPR1coIklucHV0IGRldmljZSAlMDh4IHVucmVhY2hhYmxlIiwgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+dHlwZSgpKTsKKyAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMucmVtb3ZlKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlIGRldmljZSBpcyBub3cgdmFsaWRhdGVkIGFuZCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIGF2YWlsYWJsZSBkZXZpY2VzIG9mIHRoZSBlbmdpbmUKKyAgICAgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSk7CisgICAgICAgIGkrKzsKKyAgICB9CisgICAgLy8gbWFrZSBzdXJlIGRlZmF1bHQgZGV2aWNlIGlzIHJlYWNoYWJsZQorICAgIGlmIChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKG1EZWZhdWx0T3V0cHV0RGV2aWNlKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIkRlZmF1bHQgZGV2aWNlICUwOHggaXMgdW5yZWFjaGFibGUiLCBtRGVmYXVsdE91dHB1dERldmljZS0+dHlwZSgpKTsKKyAgICB9CisKKyAgICBBTE9HRV9JRigobVByaW1hcnlPdXRwdXQgPT0gMCksICJGYWlsZWQgdG8gb3BlbiBwcmltYXJ5IG91dHB1dCIpOworCisgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKworI2lmZGVmIEFVRElPX1BPTElDWV9URVNUCisgICAgaWYgKG1QcmltYXJ5T3V0cHV0ICE9IDApIHsKKyAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0Q21kID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgb3V0cHV0Q21kLmFkZEludChTdHJpbmc4KCJzZXRfaWQiKSwgMCk7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1QcmltYXJ5T3V0cHV0LT5tSW9IYW5kbGUsIG91dHB1dENtZC50b1N0cmluZygpKTsKKworICAgICAgICBtVGVzdERldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgbVRlc3RTYW1wbGluZ1JhdGUgPSA0NDEwMDsKKyAgICAgICAgbVRlc3RGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICAgICAgbVRlc3RDaGFubmVscyA9ICBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgICAgIG1UZXN0TGF0ZW5jeU1zID0gMDsKKyAgICAgICAgbUN1ck91dHB1dCA9IDA7CisgICAgICAgIG1EaXJlY3RPdXRwdXQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fVEVTVF9PVVRQVVRTOyBpKyspIHsKKyAgICAgICAgICAgIG1UZXN0T3V0cHV0c1tpXSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICAgICAgY2hhciBidWZmZXJbU0laRV07CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkF1ZGlvUG9saWN5TWFuYWdlclRlc3QiKTsKKyAgICAgICAgcnVuKGJ1ZmZlciwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CisgICAgfQorI2VuZGlmIC8vQVVESU9fUE9MSUNZX1RFU1QKK30KKworQXVkaW9Qb2xpY3lNYW5hZ2VyOjp+QXVkaW9Qb2xpY3lNYW5hZ2VyKCkKK3sKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorICAgIGV4aXQoKTsKKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChtT3V0cHV0cy5rZXlBdChpKSk7CisgICB9CisgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQobUlucHV0cy5rZXlBdChpKSk7CisgICB9CisgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jbGVhcigpOworICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5jbGVhcigpOworICAgbU91dHB1dHMuY2xlYXIoKTsKKyAgIG1JbnB1dHMuY2xlYXIoKTsKKyAgIG1Id01vZHVsZXMuY2xlYXIoKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0Q2hlY2soKQoreworICAgIHJldHVybiBoYXNQcmltYXJ5T3V0cHV0KCkgPyBOT19FUlJPUiA6IE5PX0lOSVQ7Cit9CisKKyNpZmRlZiBBVURJT19QT0xJQ1lfVEVTVAorYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OnRocmVhZExvb3AoKQoreworICAgIEFMT0dWKCJlbnRlcmluZyB0aHJlYWRMb29wKCkiKTsKKyAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpCisgICAgeworICAgICAgICBTdHJpbmc4IGNvbW1hbmQ7CisgICAgICAgIGludCB2YWx1ZUludDsKKyAgICAgICAgU3RyaW5nOCB2YWx1ZTsKKworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBtV2FpdFdvcmtDVi53YWl0UmVsYXRpdmUobUxvY2ssIG1pbGxpc2Vjb25kcyg1MCkpOworCisgICAgICAgIGNvbW1hbmQgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycygwLCBTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3kiKSk7CisgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoY29tbWFuZCk7CisKKyAgICAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3kiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SICYmCisgICAgICAgICAgICB2YWx1ZUludCAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVigiVGVzdCBjb21tYW5kICVzIHJlY2VpdmVkIiwgY29tbWFuZC5zdHJpbmcoKSk7CisgICAgICAgICAgICBTdHJpbmc4IHRhcmdldDsKKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGFyZ2V0IiksIHRhcmdldCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICB0YXJnZXQgPSAiTWFuYWdlciI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9vdXRwdXQiKSwgdmFsdWVJbnQpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcGFyYW0ucmVtb3ZlKFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9vdXRwdXQiKSk7CisgICAgICAgICAgICAgICAgbUN1ck91dHB1dCA9IHZhbHVlSW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfZGlyZWN0IiksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfZGlyZWN0IikpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAiZmFsc2UiKSB7CisgICAgICAgICAgICAgICAgICAgIG1EaXJlY3RPdXRwdXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJ0cnVlIikgeworICAgICAgICAgICAgICAgICAgICBtRGlyZWN0T3V0cHV0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9pbnB1dCIpLCB2YWx1ZUludCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2lucHV0IikpOworICAgICAgICAgICAgICAgIG1UZXN0SW5wdXQgPSB2YWx1ZUludDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcmFtLmdldChTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfZm9ybWF0IiksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfZm9ybWF0IikpOworICAgICAgICAgICAgICAgIGludCBmb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gIlBDTSAxNiBiaXRzIikgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJQQ00gOCBiaXRzIikgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzhfQklUOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gIkNvbXByZXNzZWQgTVAzIikgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBVURJT19GT1JNQVRfTVAzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElEKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gIk1hbmFnZXIiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVGVzdEZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0UGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGFyYW0uYWRkSW50KFN0cmluZzgoImZvcm1hdCIpLCBmb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMobVRlc3RPdXRwdXRzW21DdXJPdXRwdXRdLCBvdXRwdXRQYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X2NoYW5uZWxzIiksIHZhbHVlKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfY2hhbm5lbHMiKSk7CisgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzID0gMDsKKworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAiQ2hhbm5lbHMgU3RlcmVvIikgeworICAgICAgICAgICAgICAgICAgICBjaGFubmVscyA9ICBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAiQ2hhbm5lbHMgTW9ubyIpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMgPSAgQVVESU9fQ0hBTk5FTF9PVVRfTU9OTzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCA9PSAiTWFuYWdlciIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UZXN0Q2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0UGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGFyYW0uYWRkSW50KFN0cmluZzgoImNoYW5uZWxzIiksIGNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSwgb3V0cHV0UGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoInRlc3RfY21kX3BvbGljeV9zYW1wbGVSYXRlIiksIHZhbHVlSW50KSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShTdHJpbmc4KCJ0ZXN0X2NtZF9wb2xpY3lfc2FtcGxlUmF0ZSIpKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWVJbnQgPj0gMCAmJiB2YWx1ZUludCA8PSA5NjAwMCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxpbmdSYXRlID0gdmFsdWVJbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gIk1hbmFnZXIiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVGVzdFNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtVGVzdE91dHB1dHNbbUN1ck91dHB1dF0gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgb3V0cHV0UGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0UGFyYW0uYWRkSW50KFN0cmluZzgoInNhbXBsaW5nX3JhdGUiKSwgc2FtcGxpbmdSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG1UZXN0T3V0cHV0c1ttQ3VyT3V0cHV0XSwgb3V0cHV0UGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXQoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X3Jlb3BlbiIpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoU3RyaW5nOCgidGVzdF9jbWRfcG9saWN5X3Jlb3BlbiIpKTsKKworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQobVByaW1hcnlPdXRwdXQpOyk7CisKKyAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlID0gbVByaW1hcnlPdXRwdXQtPmdldE1vZHVsZUhhbmRsZSgpOworCisgICAgICAgICAgICAgICAgcmVtb3ZlT3V0cHV0KG1QcmltYXJ5T3V0cHV0LT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbmV3IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlKTsKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGNvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IG91dHB1dERlc2MtPm1Gb3JtYXQ7CisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlOworICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuT3V0cHV0KG1vZHVsZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dERlc2MtPm1MYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1GbGFncyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlb3BlbiBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAic2FtcGxpbmdSYXRlOiAlZCwgZm9ybWF0ICVkLCBjaGFubmVscyAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlLCBvdXRwdXREZXNjLT5tRm9ybWF0LCBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OworICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dCA9IG91dHB1dERlc2M7CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIG91dHB1dENtZCA9IEF1ZGlvUGFyYW1ldGVyKCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dENtZC5hZGRJbnQoU3RyaW5nOCgic2V0X2lkIiksIDApOworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhoYW5kbGUsIG91dHB1dENtZC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkT3V0cHV0KGhhbmRsZSwgb3V0cHV0RGVzYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKDAsIFN0cmluZzgoInRlc3RfY21kX3BvbGljeT0iKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZXhpdCgpCit7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgICAgICByZXF1ZXN0RXhpdCgpOworICAgICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKKyAgICB9CisgICAgcmVxdWVzdEV4aXRBbmRXYWl0KCk7Cit9CisKK2ludCBBdWRpb1BvbGljeU1hbmFnZXI6OnRlc3RPdXRwdXRJbmRleChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fVEVTVF9PVVRQVVRTOyBpKyspIHsKKyAgICAgICAgaWYgKG91dHB1dCA9PSBtVGVzdE91dHB1dHNbaV0pIHJldHVybiBpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisKKy8vIC0tLQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YWRkT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MpCit7CisgICAgb3V0cHV0RGVzYy0+c2V0SW9IYW5kbGUob3V0cHV0KTsKKyAgICBtT3V0cHV0cy5hZGQob3V0cHV0LCBvdXRwdXREZXNjKTsKKyAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVtb3ZlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKK3sKKyAgICBtT3V0cHV0cy5yZW1vdmVJdGVtKG91dHB1dCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphZGRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYykKK3sKKyAgICBpbnB1dERlc2MtPnNldElvSGFuZGxlKGlucHV0KTsKKyAgICBtSW5wdXRzLmFkZChpbnB1dCwgaW5wdXREZXNjKTsKKyAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZmluZElvSGFuZGxlc0J5QWRkcmVzcyhzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyAvKmluKi8sCisgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgLyppbiovLAorICAgICAgICBjb25zdCBTdHJpbmc4IGFkZHJlc3MgLyppbiovLAorICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzIC8qb3V0Ki8pIHsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KKyAgICAgICAgZGVzYy0+bVByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmdldERldmljZShkZXZpY2UsIGFkZHJlc3MpOworICAgIGlmIChkZXZEZXNjICE9IDApIHsKKyAgICAgICAgQUxPR1YoImZpbmRJb0hhbmRsZXNCeUFkZHJlc3MoKTogYWRkaW5nIG9wZW5lZCBvdXRwdXQgJWQgb24gc2FtZSBhZGRyZXNzICVzIiwKKyAgICAgICAgICAgICAgZGVzYy0+bUlvSGFuZGxlLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgb3V0cHV0cy5hZGQoZGVzYy0+bUlvSGFuZGxlKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzKQoreworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBkZXZEZXNjLT50eXBlKCk7CisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2M7CisKKyAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlKSkgeworICAgICAgICAvLyBlcmFzZSBhbGwgY3VycmVudCBzYW1wbGUgcmF0ZXMsIGZvcm1hdHMgYW5kIGNoYW5uZWwgbWFza3MKKyAgICAgICAgZGV2RGVzYy0+Y2xlYXJDYXBhYmlsaXRpZXMoKTsKKyAgICB9CisKKyAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpIHsKKyAgICAgICAgLy8gZmlyc3QgbGlzdCBhbHJlYWR5IG9wZW4gb3V0cHV0cyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIChkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3BlbmVkIG91dHB1dCAlZCIsIG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgIGNoZWNraW5nIGFkZHJlc3MgbWF0Y2ggZHVlIHRvIGRldmljZSAweCV4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgZmluZElvSGFuZGxlc0J5QWRkcmVzcyhkZXNjLCBkZXZpY2UsIGFkZHJlc3MsIG91dHB1dHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyB0aGVuIGxvb2sgZm9yIG91dHB1dCBwcm9maWxlcyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKKyAgICAgICAgU29ydGVkVmVjdG9yPCBzcDxJT1Byb2ZpbGU+ID4gcHJvZmlsZXM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdOworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9PSBwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlc1swXS0+bUFkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChwcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJXp1IGZyb20gbW9kdWxlICV6dSIsIGosIGkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoIiAgZm91bmQgJWQgcHJvZmlsZXMsICVkIG91dHB1dHMiLCBwcm9maWxlcy5zaXplKCksIG91dHB1dHMuc2l6ZSgpKTsKKworICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpICYmIG91dHB1dHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IE5vIG91dHB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAlMDR4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICAvLyBvcGVuIG91dHB1dHMgZm9yIG1hdGNoaW5nIHByb2ZpbGVzIGlmIG5lZWRlZC4gRGlyZWN0IG91dHB1dHMgYXJlIGFsc28gb3BlbmVkIHRvCisgICAgICAgIC8vIHF1ZXJ5IGZvciBkeW5hbWljIHBhcmFtZXRlcnMgYW5kIHdpbGwgYmUgY2xvc2VkIGxhdGVyIGJ5IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpCisgICAgICAgIGZvciAoc3NpemVfdCBwcm9maWxlX2luZGV4ID0gMDsgcHJvZmlsZV9pbmRleCA8IChzc2l6ZV90KXByb2ZpbGVzLnNpemUoKTsgcHJvZmlsZV9pbmRleCsrKSB7CisgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBwcm9maWxlc1twcm9maWxlX2luZGV4XTsKKworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyBpZiBvbmUgb3V0cHV0IGlzIGFscmVhZHkgb3BlbmVkIGZvciB0aGlzIHByb2ZpbGUKKyAgICAgICAgICAgIHNpemVfdCBqOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG91dHB1dHMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0cy5pdGVtQXQoaikpOworICAgICAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgZGVzYy0+bVByb2ZpbGUgPT0gcHJvZmlsZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaGluZyBwcm9maWxlOiBzYXZlIHRoZSBzYW1wbGUgcmF0ZXMsIGZvcm1hdCBhbmQgY2hhbm5lbCBtYXNrcyBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gYnkgdGhlIHByb2ZpbGUgaW4gb3VyIGRldmljZSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5pbXBvcnRBdWRpb1BvcnQocHJvZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGogIT0gb3V0cHV0cy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR1YoIm9wZW5pbmcgb3V0cHV0IGZvciBkZXZpY2UgJTA4eCB3aXRoIHBhcmFtcyAlcyBwcm9maWxlICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSwgcHJvZmlsZS5nZXQoKSk7CisgICAgICAgICAgICBkZXNjID0gbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKKyAgICAgICAgICAgIGRlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBkZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGRlc2MtPm1DaGFubmVsTWFzazsKKyAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBkZXNjLT5tRm9ybWF0OworICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5zYW1wbGVfcmF0ZSA9IGRlc2MtPm1TYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmNoYW5uZWxfbWFzayA9IGRlc2MtPm1DaGFubmVsTWFzazsKKyAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uZm9ybWF0ID0gZGVzYy0+bUZvcm1hdDsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5PdXRwdXQocHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tTGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1GbGFncyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgZGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICAgICAgICAgIGRlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OworCisgICAgICAgICAgICAgICAgLy8gSGVyZSBpcyB3aGVyZSB0aGUgb3V0X3NldF9wYXJhbWV0ZXJzKCkgZm9yIGNhcmQgJiBkZXZpY2UgZ2V0cyBjYWxsZWQKKyAgICAgICAgICAgICAgICBpZiAoIWFkZHJlc3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKGRldmljZSwgYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG91dHB1dCwgU3RyaW5nOChwYXJhbSkpOworICAgICAgICAgICAgICAgICAgICBmcmVlKHBhcmFtKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBIZXJlIGlzIHdoZXJlIHdlIHN0ZXAgdGhyb3VnaCBhbmQgcmVzb2x2ZSBhbnkgImR5bmFtaWMiIGZpZWxkcworICAgICAgICAgICAgICAgIFN0cmluZzggcmVwbHk7CisgICAgICAgICAgICAgICAgY2hhciAqdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfU0FNUExJTkdfUkFURVMpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gc3RycGJyaygoY2hhciAqKXJlcGx5LnN0cmluZygpLCAiPSIpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bG9hZFNhbXBsaW5nUmF0ZXModmFsdWUgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0ZPUk1BVFMpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHN1cHBvcnRlZCBmb3JtYXRzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJwYnJrKChjaGFyICopcmVwbHkuc3RyaW5nKCksICI9Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5sb2FkRm9ybWF0cyh2YWx1ZSArIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfQ0hBTk5FTFMpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHN1cHBvcnRlZCBjaGFubmVsIG1hc2tzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJwYnJrKChjaGFyICopcmVwbHkuc3RyaW5nKCksICI9Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5sb2FkT3V0Q2hhbm5lbHModmFsdWUgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKChwcm9maWxlLT5tU2FtcGxpbmdSYXRlc1swXSA9PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5zaXplKCkgPCAyKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICgocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2ZpbGUtPm1Gb3JtYXRzLnNpemUoKSA8IDIpKSB8fAorICAgICAgICAgICAgICAgICAgICAgKChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpIDwgMikpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBtaXNzaW5nIHBhcmFtIik7CisgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDAgfHwgcHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+Y2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gcHJvZmlsZS0+cGlja1NhbXBsaW5nUmF0ZSgpOworICAgICAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gcHJvZmlsZS0+cGlja0NoYW5uZWxNYXNrKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBwcm9maWxlLT5waWNrRm9ybWF0KCk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uc2FtcGxlX3JhdGUgPSBjb25maWcuc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uY2hhbm5lbF9tYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5mb3JtYXQgPSBjb25maWcuZm9ybWF0OworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChwcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT5tTGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1DaGFubmVsTWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tRm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBkZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSAmJiBhZGRyZXNzICE9ICIwIikgeworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMuZ2V0QXVkaW9Qb2xpY3lNaXgoYWRkcmVzcywgcG9saWN5TWl4KSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjYW5ub3QgZmluZCBwb2xpY3kgZm9yIGFkZHJlc3MgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4LT5zZXRPdXRwdXQoZGVzYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tUG9saWN5TWl4ID0gcG9saWN5TWl4LT5nZXRNaXgoKTsKKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSA9PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUHJpbWFyeU91dHB1dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBkdXBsaWNhdGVkIG91dHB1dCBmb3IgZGlyZWN0IG91dHB1dHMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdXRwdXRzIHVzZWQgYnkgZHluYW1pYyBwb2xpY3kgbWl4ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGR1cGxpY2F0ZWRPdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGluaXRpYWwgc3RyZWFtIHZvbHVtZSBmb3IgZGV2aWNlCisgICAgICAgICAgICAgICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMoZGVzYywgZGV2aWNlLCAwLCB0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiBjb25maWd1cmUgYXVkaW8gZWZmZWN0IG91dHB1dCBzdGFnZSBoZXJlCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wZW4gYSBkdXBsaWNhdGluZyBvdXRwdXQgdGhyZWFkIGZvciB0aGUgbmV3IG91dHB1dCBhbmQgdGhlIHByaW1hcnkgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVkT3V0cHV0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9wZW5EdXBsaWNhdGVPdXRwdXQob3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dC0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkdXBsaWNhdGVkT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGR1cGxpY2F0ZWQgb3V0cHV0IGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZHVwT3V0cHV0RGVzYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IoTlVMTCwgbXBDbGllbnRJbnRlcmZhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1PdXRwdXQxID0gbVByaW1hcnlPdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bU91dHB1dDIgPSBkZXNjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUgPSBkZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1Gb3JtYXQgPSBkZXNjLT5tRm9ybWF0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1DaGFubmVsTWFzayA9IGRlc2MtPm1DaGFubmVsTWFzazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBPdXRwdXREZXNjLT5tTGF0ZW5jeSA9IGRlc2MtPm1MYXRlbmN5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dChkdXBsaWNhdGVkT3V0cHV0LCBkdXBPdXRwdXREZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBseVN0cmVhbVZvbHVtZXMoZHVwT3V0cHV0RGVzYywgZGV2aWNlLCAwLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIGNvdWxkIG5vdCBvcGVuIGR1cCBvdXRwdXQgZm9yICVkIGFuZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dC0+bUlvSGFuZGxlLCBvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBvdXRwdXQgZm9yIGRldmljZSAleCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgcHJvZmlsZXMucmVtb3ZlQXQocHJvZmlsZV9pbmRleCk7CisgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleC0tOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChvdXRwdXQpOworICAgICAgICAgICAgICAgIC8vIExvYWQgZGlnaXRhbCBmb3JtYXQgaW5mbyBvbmx5IGZvciBkaWdpdGFsIGRldmljZXMKKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5pbXBvcnRBdWRpb1BvcnQocHJvZmlsZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IHNldE91dHB1dERldmljZShkZXY9MHgleCwgYWRkcj0lcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShkZXNjLCBkZXZpY2UsIHRydWUvKmZvcmNlKi8sIDAvKmRlbGF5Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTC8qcGF0Y2ggaGFuZGxlKi8sIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBObyBvdXRwdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJTA0eCIsIGRldmljZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gRGlzY29ubmVjdAorICAgICAgICAvLyBjaGVjayBpZiBvbmUgb3BlbmVkIG91dHB1dCBpcyBub3QgbmVlZGVkIGFueSBtb3JlIGFmdGVyIGRpc2Nvbm5lY3Rpbmcgb25lIGRldmljZQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBleGFjdCBtYXRjaCBvbiBkZXZpY2UKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpID09IGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluZElvSGFuZGxlc0J5QWRkcmVzcyhkZXNjLCBkZXZpY2UsIGFkZHJlc3MsIG91dHB1dHMpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIShkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGRpc2Nvbm5lY3RpbmcgYWRkaW5nIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIENsZWFyIGFueSBwcm9maWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRpc2Nvbm5lY3RlZCBkZXZpY2UuCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUh3TW9kdWxlcy5zaXplKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bU91dHB1dFByb2ZpbGVzW2pdOworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbGVhcmluZyBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgJXp1IG9uIG1vZHVsZSAlenUiLCBqLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1Gb3JtYXRzWzBdID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tRm9ybWF0cy5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bUZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUNoYW5uZWxNYXNrc1swXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmFkZCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tJbnB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBpbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcykKK3sKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZGV2RGVzYy0+dHlwZSgpOworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBkZXNjOworCisgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKKyAgICAgICAgLy8gZXJhc2UgYWxsIGN1cnJlbnQgc2FtcGxlIHJhdGVzLCBmb3JtYXRzIGFuZCBjaGFubmVsIG1hc2tzCisgICAgICAgIGRldkRlc2MtPmNsZWFyQ2FwYWJpbGl0aWVzKCk7CisgICAgfQorCisgICAgaWYgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKSB7CisgICAgICAgIC8vIGZpcnN0IGxpc3QgYWxyZWFkeSBvcGVuIGlucHV0cyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKKyAgICAgICAgZm9yIChzaXplX3QgaW5wdXRfaW5kZXggPSAwOyBpbnB1dF9pbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbnB1dF9pbmRleCsrKSB7CisgICAgICAgICAgICBkZXNjID0gbUlucHV0cy52YWx1ZUF0KGlucHV0X2luZGV4KTsKKyAgICAgICAgICAgIGlmIChkZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIChkZXZpY2UgJiB+QVVESU9fREVWSUNFX0JJVF9JTikpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG9wZW5lZCBpbnB1dCAlZCIsIG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKKyAgICAgICAgICAgICAgIGlucHV0cy5hZGQobUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdGhlbiBsb29rIGZvciBpbnB1dCBwcm9maWxlcyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKKyAgICAgICAgU29ydGVkVmVjdG9yPCBzcDxJT1Byb2ZpbGU+ID4gcHJvZmlsZXM7CisgICAgICAgIGZvciAoc2l6ZV90IG1vZHVsZV9pZHggPSAwOyBtb2R1bGVfaWR4IDwgbUh3TW9kdWxlcy5zaXplKCk7IG1vZHVsZV9pZHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbbW9kdWxlX2lkeF0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzaXplX3QgcHJvZmlsZV9pbmRleCA9IDA7CisgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXggPCBtSHdNb2R1bGVzW21vZHVsZV9pZHhdLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7CisgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBtSHdNb2R1bGVzW21vZHVsZV9pZHhdLT5tSW5wdXRQcm9maWxlc1twcm9maWxlX2luZGV4XTsKKworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgKGRldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPT0gcHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXNbMF0tPm1BZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQocHJvZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJXp1IGZyb20gbW9kdWxlICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LCBtb2R1bGVfaWR4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkgJiYgaW5wdXRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IE5vIGlucHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlIDB4JVgiLCBkZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG9wZW4gaW5wdXRzIGZvciBtYXRjaGluZyBwcm9maWxlcyBpZiBuZWVkZWQuIERpcmVjdCBpbnB1dHMgYXJlIGFsc28gb3BlbmVkIHRvCisgICAgICAgIC8vIHF1ZXJ5IGZvciBkeW5hbWljIHBhcmFtZXRlcnMgYW5kIHdpbGwgYmUgY2xvc2VkIGxhdGVyIGJ5IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpCisgICAgICAgIGZvciAoc3NpemVfdCBwcm9maWxlX2luZGV4ID0gMDsgcHJvZmlsZV9pbmRleCA8IChzc2l6ZV90KXByb2ZpbGVzLnNpemUoKTsgcHJvZmlsZV9pbmRleCsrKSB7CisKKyAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IHByb2ZpbGVzW3Byb2ZpbGVfaW5kZXhdOworICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyBpZiBvbmUgaW5wdXQgaXMgYWxyZWFkeSBvcGVuZWQgZm9yIHRoaXMgcHJvZmlsZQorICAgICAgICAgICAgc2l6ZV90IGlucHV0X2luZGV4OworICAgICAgICAgICAgZm9yIChpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKKyAgICAgICAgICAgICAgICBkZXNjID0gbUlucHV0cy52YWx1ZUF0KGlucHV0X2luZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAoZGVzYy0+bVByb2ZpbGUgPT0gcHJvZmlsZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbnB1dF9pbmRleCAhPSBtSW5wdXRzLnNpemUoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigib3BlbmluZyBpbnB1dCBmb3IgZGV2aWNlIDB4JVggd2l0aCBwYXJhbXMgJXMiLCBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgZGVzYyA9IG5ldyBBdWRpb0lucHV0RGVzY3JpcHRvcihwcm9maWxlKTsKKyAgICAgICAgICAgIGRlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBkZXNjLT5tU2FtcGxpbmdSYXRlOworICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGRlc2MtPm1DaGFubmVsTWFzazsKKyAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBkZXNjLT5tRm9ybWF0OworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5vcGVuSW5wdXQocHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPm1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSAvKkZJWE1FKi8pOworCisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgZGVzYy0+bVNhbXBsaW5nUmF0ZSA9IGNvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICBkZXNjLT5tQ2hhbm5lbE1hc2sgPSBjb25maWcuY2hhbm5lbF9tYXNrOworICAgICAgICAgICAgICAgIGRlc2MtPm1Gb3JtYXQgPSBjb25maWcuZm9ybWF0OworCisgICAgICAgICAgICAgICAgaWYgKCFhZGRyZXNzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcihkZXZpY2UsIGFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhpbnB1dCwgU3RyaW5nOChwYXJhbSkpOworICAgICAgICAgICAgICAgICAgICBmcmVlKHBhcmFtKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBIZXJlIGlzIHdoZXJlIHdlIHN0ZXAgdGhyb3VnaCBhbmQgcmVzb2x2ZSBhbnkgImR5bmFtaWMiIGZpZWxkcworICAgICAgICAgICAgICAgIFN0cmluZzggcmVwbHk7CisgICAgICAgICAgICAgICAgY2hhciAqdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9TQU1QTElOR19SQVRFUykpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBkaXJlY3QgaW5wdXQgc3VwIHNhbXBsaW5nIHJhdGVzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5LnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJwYnJrKChjaGFyICopcmVwbHkuc3RyaW5nKCksICI9Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5sb2FkU2FtcGxpbmdSYXRlcyh2YWx1ZSArIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tRm9ybWF0c1swXSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICAgICAgICAgICAgICByZXBseSA9IG1wQ2xpZW50SW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9GT1JNQVRTKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpIGRpcmVjdCBpbnB1dCBzdXAgZm9ybWF0cyAlcyIsIHJlcGx5LnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJwYnJrKChjaGFyICopcmVwbHkuc3RyaW5nKCksICI9Iik7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5sb2FkRm9ybWF0cyh2YWx1ZSArIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycyhpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9DSEFOTkVMUykpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBkaXJlY3QgaW5wdXQgc3VwIGNoYW5uZWwgbWFza3MgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cnBicmsoKGNoYXIgKilyZXBseS5zdHJpbmcoKSwgIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmxvYWRJbkNoYW5uZWxzKHZhbHVlICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCgocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgJiYgKHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLnNpemUoKSA8IDIpKSB8fAorICAgICAgICAgICAgICAgICAgICAgKChwcm9maWxlLT5tRm9ybWF0c1swXSA9PSAwKSAmJiAocHJvZmlsZS0+bUZvcm1hdHMuc2l6ZSgpIDwgMikpIHx8CisgICAgICAgICAgICAgICAgICAgICAoKHByb2ZpbGUtPm1DaGFubmVsTWFza3NbMF0gPT0gMCkgJiYgKHByb2ZpbGUtPm1DaGFubmVsTWFza3Muc2l6ZSgpIDwgMikpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja0lucHV0c0ZvckRldmljZSgpIGRpcmVjdCBpbnB1dCBtaXNzaW5nIHBhcmFtIik7CisgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5jbG9zZUlucHV0KGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBhZGRJbnB1dChpbnB1dCwgZGVzYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvLyBlbmRpZiBpbnB1dCAhPSAwCisKKyAgICAgICAgICAgIGlmIChpbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja0lucHV0c0ZvckRldmljZSgpIGNvdWxkIG5vdCBvcGVuIGlucHV0IGZvciBkZXZpY2UgMHglWCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgcHJvZmlsZXMucmVtb3ZlQXQocHJvZmlsZV9pbmRleCk7CisgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleC0tOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnB1dHMuYWRkKGlucHV0KTsKKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5pbXBvcnRBdWRpb1BvcnQocHJvZmlsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gLy8gZW5kIHNjYW4gcHJvZmlsZXMKKworICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogTm8gaW5wdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgMHglWCIsIGRldmljZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRGlzY29ubmVjdAorICAgICAgICAvLyBjaGVjayBpZiBvbmUgb3BlbmVkIGlucHV0IGlzIG5vdCBuZWVkZWQgYW55IG1vcmUgYWZ0ZXIgZGlzY29ubmVjdGluZyBvbmUgZGV2aWNlCisgICAgICAgIGZvciAoc2l6ZV90IGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgeworICAgICAgICAgICAgZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7CisgICAgICAgICAgICBpZiAoIShkZXNjLT5tUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMudHlwZXMoKSAmIG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmCisgICAgICAgICAgICAgICAgICAgIH5BVURJT19ERVZJQ0VfQklUX0lOKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBkaXNjb25uZWN0aW5nIGFkZGluZyBpbnB1dCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgbUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOworICAgICAgICAgICAgICAgIGlucHV0cy5hZGQobUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIENsZWFyIGFueSBwcm9maWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRpc2Nvbm5lY3RlZCBkZXZpY2UuCisgICAgICAgIGZvciAoc2l6ZV90IG1vZHVsZV9pbmRleCA9IDA7IG1vZHVsZV9pbmRleCA8IG1Id01vZHVsZXMuc2l6ZSgpOyBtb2R1bGVfaW5kZXgrKykgeworICAgICAgICAgICAgaWYgKG1Id01vZHVsZXNbbW9kdWxlX2luZGV4XS0+bUhhbmRsZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHNpemVfdCBwcm9maWxlX2luZGV4ID0gMDsKKyAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCA8IG1Id01vZHVsZXNbbW9kdWxlX2luZGV4XS0+bUlucHV0UHJvZmlsZXMuc2l6ZSgpOworICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4KyspIHsKKyAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBtSHdNb2R1bGVzW21vZHVsZV9pbmRleF0tPm1JbnB1dFByb2ZpbGVzW3Byb2ZpbGVfaW5kZXhdOworICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgKGRldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogY2xlYXJpbmcgZGlyZWN0IGlucHV0IHByb2ZpbGUgJXp1IG9uIG1vZHVsZSAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LCBtb2R1bGVfaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXNbMF0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bVNhbXBsaW5nUmF0ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmFkZCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+bUZvcm1hdHNbMF0gPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1Gb3JtYXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5tRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5tQ2hhbm5lbE1hc2tzWzBdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPm1DaGFubmVsTWFza3MuYWRkKDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAvLyBlbmQgZGlzY29ubmVjdAorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpCit7CisgICAgQUxPR1YoImNsb3NlT3V0cHV0KCVkKSIsIG91dHB1dCk7CisKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgaWYgKG91dHB1dERlc2MgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiY2xvc2VPdXRwdXQoKSB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVBvbGljeU1peGVzLmNsb3NlT3V0cHV0KG91dHB1dERlc2MpOworCisgICAgLy8gbG9vayBmb3IgZHVwbGljYXRlZCBvdXRwdXRzIGNvbm5lY3RlZCB0byB0aGUgb3V0cHV0IGJlaW5nIHJlbW92ZWQuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZHVwT3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChkdXBPdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJgorICAgICAgICAgICAgICAgIChkdXBPdXRwdXREZXNjLT5tT3V0cHV0MSA9PSBvdXRwdXREZXNjIHx8CisgICAgICAgICAgICAgICAgZHVwT3V0cHV0RGVzYy0+bU91dHB1dDIgPT0gb3V0cHV0RGVzYykpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYzI7CisgICAgICAgICAgICBpZiAoZHVwT3V0cHV0RGVzYy0+bU91dHB1dDEgPT0gb3V0cHV0RGVzYykgeworICAgICAgICAgICAgICAgIG91dHB1dERlc2MyID0gZHVwT3V0cHV0RGVzYy0+bU91dHB1dDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dHB1dERlc2MyID0gZHVwT3V0cHV0RGVzYy0+bU91dHB1dDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBBcyBhbGwgYWN0aXZlIHRyYWNrcyBvbiBkdXBsaWNhdGVkIG91dHB1dCB3aWxsIGJlIGRlbGV0ZWQsCisgICAgICAgICAgICAvLyBhbmQgYXMgdGhleSB3ZXJlIGFsc28gcmVmZXJlbmNlZCBvbiB0aGUgb3RoZXIgb3V0cHV0LCB0aGUgcmVmZXJlbmNlCisgICAgICAgICAgICAvLyBjb3VudCBmb3IgdGhlaXIgc3RyZWFtIHR5cGUgbXVzdCBiZSBhZGp1c3RlZCBhY2NvcmRpbmdseSBvbgorICAgICAgICAgICAgLy8gdGhlIG90aGVyIG91dHB1dC4KKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgQVVESU9fU1RSRUFNX0NOVDsgaisrKSB7CisgICAgICAgICAgICAgICAgaW50IHJlZkNvdW50ID0gZHVwT3V0cHV0RGVzYy0+bVJlZkNvdW50W2pdOworICAgICAgICAgICAgICAgIG91dHB1dERlc2MyLT5jaGFuZ2VSZWZDb3VudCgoYXVkaW9fc3RyZWFtX3R5cGVfdClqLC1yZWZDb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkdXBsaWNhdGVkT3V0cHV0ID0gbU91dHB1dHMua2V5QXQoaSk7CisgICAgICAgICAgICBBTE9HVigiY2xvc2VPdXRwdXQoKSBjbG9zaW5nIGFsc28gZHVwbGljYXRlZCBvdXRwdXQgJWQiLCBkdXBsaWNhdGVkT3V0cHV0KTsKKworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KGR1cGxpY2F0ZWRPdXRwdXQpOworICAgICAgICAgICAgcmVtb3ZlT3V0cHV0KGR1cGxpY2F0ZWRPdXRwdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkob3V0cHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgIG1BdWRpb1BhdGNoZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgfQorCisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CisgICAgcGFyYW0uYWRkKFN0cmluZzgoImNsb3NpbmciKSwgU3RyaW5nOCgidHJ1ZSIpKTsKKyAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhvdXRwdXQsIHBhcmFtLnRvU3RyaW5nKCkpOworCisgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgcmVtb3ZlT3V0cHV0KG91dHB1dCk7CisgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKK3sKKyAgICBBTE9HVigiY2xvc2VJbnB1dCglZCkiLCBpbnB1dCk7CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUZvcihpbnB1dCk7CisgICAgaWYgKGlucHV0RGVzYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJjbG9zZUlucHV0KCkgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgIG1BdWRpb1BhdGNoZXMucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgfQorCisgICAgbXBDbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQoaW5wdXQpOworICAgIG1JbnB1dHMucmVtb3ZlSXRlbShpbnB1dCk7Cit9CisKK1NvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRzRm9yRGV2aWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gb3Blbk91dHB1dHMpCit7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzOworCisgICAgQUxPR1ZWKCJnZXRPdXRwdXRzRm9yRGV2aWNlKCkgZGV2aWNlICUwNHgiLCBkZXZpY2UpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3Blbk91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQUxPR1ZWKCJvdXRwdXQgJWQgaXNEdXBsaWNhdGVkPSVkIGRldmljZT0lMDR4IiwKKyAgICAgICAgICAgICAgICBpLCBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5pc0R1cGxpY2F0ZWQoKSwKKyAgICAgICAgICAgICAgICBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5zdXBwb3J0ZWREZXZpY2VzKCkpOworICAgICAgICBpZiAoKGRldmljZSAmIG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPnN1cHBvcnRlZERldmljZXMoKSkgPT0gZGV2aWNlKSB7CisgICAgICAgICAgICBBTE9HVlYoImdldE91dHB1dHNGb3JEZXZpY2UoKSBmb3VuZCBvdXRwdXQgJWQiLCBvcGVuT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICBvdXRwdXRzLmFkZChvcGVuT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG91dHB1dHM7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp2ZWN0b3JzRXF1YWwoU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0czEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMyKQoreworICAgIGlmIChvdXRwdXRzMS5zaXplKCkgIT0gb3V0cHV0czIuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzMS5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAob3V0cHV0czFbaV0gIT0gb3V0cHV0czJbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKK3sKKyAgICBhdWRpb19kZXZpY2VzX3Qgb2xkRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNyY091dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKG9sZERldmljZSwgbVByZXZpb3VzT3V0cHV0cyk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBkc3RPdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShuZXdEZXZpY2UsIG1PdXRwdXRzKTsKKworICAgIC8vIGFsc28gdGFrZSBpbnRvIGFjY291bnQgZXh0ZXJuYWwgcG9saWN5LXJlbGF0ZWQgY2hhbmdlczogYWRkIGFsbCBvdXRwdXRzIHdoaWNoIGFyZQorICAgIC8vIGFzc29jaWF0ZWQgd2l0aCBwb2xpY2llcyBpbiB0aGUgImJlZm9yZSIgYW5kICJhZnRlciIgb3V0cHV0IHZlY3RvcnMKKyAgICBBTE9HVlYoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKTogcG9saWN5IHJlbGF0ZWQgb3V0cHV0cyIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IG1QcmV2aW91c091dHB1dHMuc2l6ZSgpIDsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbVByZXZpb3VzT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoZGVzYyAhPSAwICYmIGRlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCkgeworICAgICAgICAgICAgc3JjT3V0cHV0cy5hZGQoZGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIEFMT0dWVigiIHByZXZpb3VzIG91dHB1dHM6IGFkZGluZyAlZCIsIGRlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgbU91dHB1dHMuc2l6ZSgpIDsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGRlc2MgIT0gMCAmJiBkZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRzdE91dHB1dHMuYWRkKGRlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICBBTE9HVlYoIiBuZXcgb3V0cHV0czogYWRkaW5nICVkIiwgZGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghdmVjdG9yc0VxdWFsKHNyY091dHB1dHMsZHN0T3V0cHV0cykpIHsKKyAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBzdHJhdGVneSAlZCwgbW92aW5nIGZyb20gb3V0cHV0ICVkIHRvIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgIHN0cmF0ZWd5LCBzcmNPdXRwdXRzWzBdLCBkc3RPdXRwdXRzWzBdKTsKKyAgICAgICAgLy8gbXV0ZSBzdHJhdGVneSB3aGlsZSBtb3ZpbmcgdHJhY2tzIGZyb20gb25lIG91dHB1dCB0byBhbm90aGVyCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3JjT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihzcmNPdXRwdXRzW2ldKTsKKyAgICAgICAgICAgIGlmIChpc1N0cmF0ZWd5QWN0aXZlKGRlc2MsIHN0cmF0ZWd5KSkgeworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzdHJhdGVneSwgdHJ1ZSwgZGVzYyk7CisgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHN0cmF0ZWd5LCBmYWxzZSwgZGVzYywgTVVURV9USU1FX01TLCBuZXdEZXZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTW92ZSBlZmZlY3RzIGFzc29jaWF0ZWQgdG8gdGhpcyBzdHJhdGVneSBmcm9tIHByZXZpb3VzIG91dHB1dCB0byBuZXcgb3V0cHV0CisgICAgICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgeworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZnhPdXRwdXQgPSBzZWxlY3RPdXRwdXRGb3JFZmZlY3RzKGRzdE91dHB1dHMpOworICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBtb3ZlZDsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3REZXNjID0gbUVmZmVjdHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAoZWZmZWN0RGVzYy0+bVNlc3Npb24gPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYICYmCisgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tSW8gIT0gZnhPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1vdmVkLmluZGV4T2YoZWZmZWN0RGVzYy0+bUlvKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgbW92aW5nIGVmZmVjdCAlZCB0byBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVmZmVjdHMua2V5QXQoaSksIGZ4T3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5tb3ZlRWZmZWN0cyhBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsIGVmZmVjdERlc2MtPm1JbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmeE91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlZC5hZGQoZWZmZWN0RGVzYy0+bUlvKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjLT5tSW8gPSBmeE91dHB1dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gTW92ZSB0cmFja3MgYXNzb2NpYXRlZCB0byB0aGlzIHN0cmF0ZWd5IGZyb20gcHJldmlvdXMgb3V0cHV0IHRvIG5ldyBvdXRwdXQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpID09IEFVRElPX1NUUkVBTV9QQVRDSCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KWkpID09IHN0cmF0ZWd5KSB7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQoreworICAgIGlmIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkKKyAgICAgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FKTsKKyAgICBpZiAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pICE9IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpCisgICAgICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSk7CisgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04pOworICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpOworICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfQUNDRVNTSUJJTElUWSk7CisgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSk7CisgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9EVE1GKTsKKyAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1JFUk9VVElORyk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0EyZHBTdXNwZW5kKCkKK3sKKyAgICBhdWRpb19pb19oYW5kbGVfdCBhMmRwT3V0cHV0ID0gbU91dHB1dHMuZ2V0QTJkcE91dHB1dCgpOworICAgIGlmIChhMmRwT3V0cHV0ID09IDApIHsKKyAgICAgICAgbUEyZHBTdXNwZW5kZWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgaXNTY29Db25uZWN0ZWQgPQorICAgICAgICAgICAgKChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUICYKKyAgICAgICAgICAgICAgICAgICAgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApIHx8CisgICAgICAgICAgICAoKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9TQ08pICE9IDApOworICAgIC8vIHN1c3BlbmQgQTJEUCBvdXRwdXQgaWY6CisgICAgLy8gICAgICAoTk9UIGFscmVhZHkgc3VzcGVuZGVkKSAmJgorICAgIC8vICAgICAgKChTQ08gZGV2aWNlIGlzIGNvbm5lY3RlZCAmJgorICAgIC8vICAgICAgIChmb3JjZWQgdXNhZ2UgZm9yIGNvbW11bmljYXRpb24gfHwgZm9yIHJlY29yZCBpcyBTQ08pKSkgfHwKKyAgICAvLyAgICAgIChwaG9uZSBzdGF0ZSBpcyByaW5naW5nIHx8IGluIGNhbGwpCisgICAgLy8KKyAgICAvLyByZXN0b3JlIEEyRFAgb3V0cHV0IGlmOgorICAgIC8vICAgICAgKEFscmVhZHkgc3VzcGVuZGVkKSAmJgorICAgIC8vICAgICAgKChTQ08gZGV2aWNlIGlzIE5PVCBjb25uZWN0ZWQgfHwKKyAgICAvLyAgICAgICAoZm9yY2VkIHVzYWdlIE5PVCBmb3IgY29tbXVuaWNhdGlvbiAmJiBOT1QgZm9yIHJlY29yZCBpcyBTQ08pKSkgJiYKKyAgICAvLyAgICAgIChwaG9uZSBzdGF0ZSBpcyBOT1QgcmluZ2luZyAmJiBOT1QgaW4gY2FsbCkKKyAgICAvLworICAgIGlmIChtQTJkcFN1c3BlbmRlZCkgeworICAgICAgICBpZiAoKCFpc1Njb0Nvbm5lY3RlZCB8fAorICAgICAgICAgICAgICgobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OKSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSAmJgorICAgICAgICAgICAgICAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkQpICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pKSkgJiYKKyAgICAgICAgICAgICAoKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSAhPSBBVURJT19NT0RFX0lOX0NBTEwpICYmCisgICAgICAgICAgICAgIChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgIT0gQVVESU9fTU9ERV9SSU5HVE9ORSkpKSB7CisKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZXN0b3JlT3V0cHV0KGEyZHBPdXRwdXQpOworICAgICAgICAgICAgbUEyZHBTdXNwZW5kZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgoaXNTY29Db25uZWN0ZWQgJiYKKyAgICAgICAgICAgICAoKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTikgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgfHwKKyAgICAgICAgICAgICAgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSkpIHx8CisgICAgICAgICAgICAgKChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB8fAorICAgICAgICAgICAgICAobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfUklOR1RPTkUpKSkgeworCisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c3VzcGVuZE91dHB1dChhMmRwT3V0cHV0KTsKKyAgICAgICAgICAgIG1BMmRwU3VzcGVuZGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TmV3T3V0cHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpCit7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworCisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShvdXRwdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgICAgIGlmIChwYXRjaERlc2MtPm1VaWQgIT0gbVVpZENhY2hlZCkgeworICAgICAgICAgICAgQUxPR1YoImdldE5ld091dHB1dERldmljZSgpIGRldmljZSAlMDh4IGZvcmNlZCBieSBwYXRjaCAlZCIsCisgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5kZXZpY2UoKSwgb3V0cHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXREZXNjLT5kZXZpY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGNoZWNrIHRoZSBmb2xsb3dpbmcgYnkgb3JkZXIgb2YgcHJpb3JpdHkgdG8gcmVxdWVzdCBhIHJvdXRpbmcgY2hhbmdlIGlmIG5lY2Vzc2FyeToKKyAgICAvLyAxOiB0aGUgc3RyYXRlZ3kgZW5mb3JjZWQgYXVkaWJsZSBpcyBhY3RpdmUgYW5kIGVuZm9yY2VkIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBlbmZvcmNlZCBhdWRpYmxlCisgICAgLy8gMjogd2UgYXJlIGluIGNhbGwgb3IgdGhlIHN0cmF0ZWd5IHBob25lIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgcGhvbmUKKyAgICAvLyAzOiB0aGUgc3RyYXRlZ3kgZm9yIGVuZm9yY2VkIGF1ZGlibGUgaXMgYWN0aXZlIGJ1dCBub3QgZW5mb3JjZWQgb24gdGhlIG91dHB1dDoKKyAgICAvLyAgICAgIHVzZSB0aGUgZGV2aWNlIGZvciBzdHJhdGVneSBlbmZvcmNlZCBhdWRpYmxlCisgICAgLy8gNDogdGhlIHN0cmF0ZWd5IGFjY2Vzc2liaWxpdHkgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBhY2Nlc3NpYmlsaXR5CisgICAgLy8gNTogdGhlIHN0cmF0ZWd5IHNvbmlmaWNhdGlvbiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKKyAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IHNvbmlmaWNhdGlvbgorICAgIC8vIDY6IHRoZSBzdHJhdGVneSAicmVzcGVjdGZ1bCIgc29uaWZpY2F0aW9uIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgorICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgInJlc3BlY3RmdWwiIHNvbmlmaWNhdGlvbgorICAgIC8vIDc6IHRoZSBzdHJhdGVneSBtZWRpYSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKKyAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IG1lZGlhCisgICAgLy8gODogdGhlIHN0cmF0ZWd5IERUTUYgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6CisgICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBEVE1GCisgICAgLy8gOTogdGhlIHN0cmF0ZWd5IGZvciBiZWFjb24sIGEuay5hLiAidHJhbnNtaXR0ZWQgdGhyb3VnaCBzcGVha2VyIiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKKyAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IHQtdC1zCisgICAgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSkgJiYKKyAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwgZnJvbUNhY2hlKTsKKyAgICB9IGVsc2UgaWYgKGlzSW5DYWxsKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9QSE9ORSkpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUsIGZyb21DYWNoZSk7CisgICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIGZyb21DYWNoZSk7CisgICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkpKSB7CisgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0FDQ0VTU0lCSUxJVFksIGZyb21DYWNoZSk7CisgICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX1NPTklGSUNBVElPTikpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBmcm9tQ2FjaGUpOworICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwsIGZyb21DYWNoZSk7CisgICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX01FRElBKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgZnJvbUNhY2hlKTsKKyAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfRFRNRikpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRFRNRiwgZnJvbUNhY2hlKTsKKyAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSKSkgeworICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIsIGZyb21DYWNoZSk7CisgICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX1JFUk9VVElORykpIHsKKyAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUkVST1VUSU5HLCBmcm9tQ2FjaGUpOworICAgIH0KKworICAgIEFMT0dWKCJnZXROZXdPdXRwdXREZXZpY2UoKSBzZWxlY3RlZCBkZXZpY2UgJXgiLCBkZXZpY2UpOworICAgIHJldHVybiBkZXZpY2U7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE5ld0lucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQoreworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGlucHV0KTsKKworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgICAgIGlmIChwYXRjaERlc2MtPm1VaWQgIT0gbVVpZENhY2hlZCkgeworICAgICAgICAgICAgQUxPR1YoImdldE5ld0lucHV0RGV2aWNlKCkgZGV2aWNlICUwOHggZm9yY2VkIGJ5IHBhdGNoICVkIiwKKyAgICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSwgaW5wdXREZXNjLT5tUGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgcmV0dXJuIGlucHV0RGVzYy0+bURldmljZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShpbnB1dERlc2MtPm1JbnB1dFNvdXJjZSk7CisKKyAgICByZXR1cm4gZGV2aWNlOworfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CisgICAgcmV0dXJuICh1aW50MzJfdClnZXRTdHJhdGVneShzdHJlYW0pOworfQorCithdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CisgICAgLy8gQnkgY2hlY2tpbmcgdGhlIHJhbmdlIG9mIHN0cmVhbSBiZWZvcmUgY2FsbGluZyBnZXRTdHJhdGVneSwgd2UgYXZvaWQKKyAgICAvLyBnZXRTdHJhdGVneSdzIGJlaGF2aW9yIGZvciBpbnZhbGlkIHN0cmVhbXMuICBnZXRTdHJhdGVneSB3b3VsZCBkbyBhIEFMT0dFCisgICAgLy8gYW5kIHRoZW4gcmV0dXJuIFNUUkFURUdZX01FRElBLCBidXQgd2Ugd2FudCB0byByZXR1cm4gdGhlIGVtcHR5IHNldC4KKyAgICBpZiAoc3RyZWFtIDwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpIDAgfHwgc3RyZWFtID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7CisgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICB9CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXM7CisgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7CisgICAgZGV2aWNlcyA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UoZGV2aWNlcywgbU91dHB1dHMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXRzW2ldKTsKKyAgICAgICAgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgc3RyYXRlZ3kpKSB7CisgICAgICAgICAgICBkZXZpY2VzID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qRmlsdGVyIFNQRUFLRVJfU0FGRSBvdXQgb2YgcmVzdWx0cywgYXMgQXVkaW9TZXJ2aWNlIGRvZXNuJ3Qga25vdyBhYm91dCBpdAorICAgICAgYW5kIGRvZXNuJ3QgcmVhbGx5IG5lZWQgdG8uKi8KKyAgICBpZiAoZGV2aWNlcyAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSB7CisgICAgICAgIGRldmljZXMgfD0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICBkZXZpY2VzICY9IH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRTsKKyAgICB9CisKKyAgICByZXR1cm4gZGV2aWNlczsKK30KKworcm91dGluZ19zdHJhdGVneSBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmF0ZWd5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAoreworICAgIEFMT0dfQVNTRVJUKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fUEFUQ0gsImdldFN0cmF0ZWd5KCkgY2FsbGVkIGZvciBBVURJT19TVFJFQU1fUEFUQ0giKTsKKyAgICByZXR1cm4gbUVuZ2luZS0+Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKTsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJhdGVneUZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKSB7CisgICAgLy8gZmxhZ3MgdG8gc3RyYXRlZ3kgbWFwcGluZworICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0JFQUNPTikgPT0gQVVESU9fRkxBR19CRUFDT04pIHsKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSOworICAgIH0KKyAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSA9PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpIHsKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRTsKKyAgICB9CisgICAgLy8gdXNhZ2UgdG8gc3RyYXRlZ3kgbWFwcGluZworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4obUVuZ2luZS0+Z2V0U3RyYXRlZ3lGb3JVc2FnZShhdHRyLT51c2FnZSkpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgeworICAgIHN3aXRjaChzdHJlYW0pIHsKKyAgICBjYXNlIEFVRElPX1NUUkVBTV9NVVNJQzoKKyAgICAgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCk7CisgICAgICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpoYW5kbGVFdmVudEZvckJlYWNvbihpbnQgZXZlbnQpIHsKKyAgICBzd2l0Y2goZXZlbnQpIHsKKyAgICBjYXNlIFNUQVJUSU5HX09VVFBVVDoKKyAgICAgICAgbUJlYWNvbk11dGVSZWZDb3VudCsrOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNUT1BQSU5HX09VVFBVVDoKKyAgICAgICAgaWYgKG1CZWFjb25NdXRlUmVmQ291bnQgPiAwKSB7CisgICAgICAgICAgICBtQmVhY29uTXV0ZVJlZkNvdW50LS07CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTVEFSVElOR19CRUFDT046CisgICAgICAgIG1CZWFjb25QbGF5aW5nUmVmQ291bnQrKzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTVE9QUElOR19CRUFDT046CisgICAgICAgIGlmIChtQmVhY29uUGxheWluZ1JlZkNvdW50ID4gMCkgeworICAgICAgICAgICAgbUJlYWNvblBsYXlpbmdSZWZDb3VudC0tOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChtQmVhY29uTXV0ZVJlZkNvdW50ID4gMCkgeworICAgICAgICAvLyBhbnkgcGxheWJhY2sgY2F1c2VzIGJlYWNvbiB0byBiZSBtdXRlZAorICAgICAgICByZXR1cm4gc2V0QmVhY29uTXV0ZSh0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBubyBvdGhlciBwbGF5YmFjazogdW5tdXRlIHdoZW4gYmVhY29uIHN0YXJ0cyBwbGF5aW5nLCBtdXRlIHdoZW4gaXQgc3RvcHMKKyAgICAgICAgcmV0dXJuIHNldEJlYWNvbk11dGUobUJlYWNvblBsYXlpbmdSZWZDb3VudCA9PSAwKTsKKyAgICB9Cit9CisKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0QmVhY29uTXV0ZShib29sIG11dGUpIHsKKyAgICBBTE9HVigic2V0QmVhY29uTXV0ZSglZCkgbUJlYWNvbk11dGVSZWZDb3VudD0lZCBtQmVhY29uUGxheWluZ1JlZkNvdW50PSVkIiwKKyAgICAgICAgICAgIG11dGUsIG1CZWFjb25NdXRlUmVmQ291bnQsIG1CZWFjb25QbGF5aW5nUmVmQ291bnQpOworICAgIC8vIGtlZXAgdHJhY2sgb2YgbXV0ZWQgc3RhdGUgdG8gYXZvaWQgcmVwZWF0aW5nIG11dGUvdW5tdXRlIG9wZXJhdGlvbnMKKyAgICBpZiAobUJlYWNvbk11dGVkICE9IG11dGUpIHsKKyAgICAgICAgLy8gbXV0ZS91bm11dGUgQVVESU9fU1RSRUFNX1RUUyBvbiBhbGwgb3V0cHV0cworICAgICAgICBBTE9HVigiXHQgbXV0aW5nICVkIiwgbXV0ZSk7CisgICAgICAgIHVpbnQzMl90IG1heExhdGVuY3kgPSAwOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBzZXRTdHJlYW1NdXRlKEFVRElPX1NUUkVBTV9UVFMsIG11dGUvKm9uKi8sCisgICAgICAgICAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICAgICAgICAgIDAgLypkZWxheSovLCBBVURJT19ERVZJQ0VfTk9ORSk7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBsYXRlbmN5ID0gZGVzYy0+bGF0ZW5jeSgpICogMjsKKyAgICAgICAgICAgIGlmIChsYXRlbmN5ID4gbWF4TGF0ZW5jeSkgeworICAgICAgICAgICAgICAgIG1heExhdGVuY3kgPSBsYXRlbmN5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1CZWFjb25NdXRlZCA9IG11dGU7CisgICAgICAgIHJldHVybiBtYXhMYXRlbmN5OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKQoreworICAgIC8vIFJvdXRpbmcKKyAgICAvLyBzZWUgaWYgd2UgaGF2ZSBhbiBleHBsaWNpdCByb3V0ZQorICAgIC8vIHNjYW4gdGhlIHdob2xlIFJvdXRlTWFwLCBmb3IgZWFjaCBlbnRyeSwgY29udmVydCB0aGUgc3RyZWFtIHR5cGUgdG8gYSBzdHJhdGVneQorICAgIC8vIChnZXRTdHJhdGVneShzdHJlYW0pKS4KKyAgICAvLyBpZiB0aGUgc3RyYXRlZ3kgZnJvbSB0aGUgc3RyZWFtIHR5cGUgaW4gdGhlIFJvdXRlTWFwIGlzIHRoZSBzYW1lIGFzIHRoZSBhcmd1bWVudCBhYm92ZSwKKyAgICAvLyBhbmQgYWN0aXZpdHkgY291bnQgaXMgbm9uLXplcm8KKyAgICAvLyB0aGUgZGV2aWNlID0gdGhlIGRldmljZSBmcm9tIHRoZSBkZXNjcmlwdG9yIGluIHRoZSBSb3V0ZU1hcCwgYW5kIGV4aXQuCisgICAgZm9yIChzaXplX3Qgcm91dGVJbmRleCA9IDA7IHJvdXRlSW5kZXggPCBtT3V0cHV0Um91dGVzLnNpemUoKTsgcm91dGVJbmRleCsrKSB7CisgICAgICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBtT3V0cHV0Um91dGVzLnZhbHVlQXQocm91dGVJbmRleCk7CisgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXQgPSBnZXRTdHJhdGVneShyb3V0ZS0+bVN0cmVhbVR5cGUpOworICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGFjY2Vzc2liaWxpdHkgc3RyYXRlZ3kgd2hpY2ggbXVzdCBmb2xsb3cgYW55IHN0cmF0ZWd5IGl0IGlzCisgICAgICAgIC8vIGN1cnJlbnRseSByZW1hcHBlZCB0bworICAgICAgICBib29sIHN0cmF0ZWd5TWF0Y2ggPSAoc3RyYXQgPT0gc3RyYXRlZ3kpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfQUNDRVNTSUJJTElUWSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobUVuZ2luZS0+Z2V0U3RyYXRlZ3lGb3JVc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZKSA9PSBzdHJhdCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyYXQgPT0gU1RSQVRFR1lfTUVESUEpKSk7CisgICAgICAgIGlmIChzdHJhdGVneU1hdGNoICYmIHJvdXRlLT5pc0FjdGl2ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yLT50eXBlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZnJvbUNhY2hlKSB7CisgICAgICAgIEFMT0dWVigiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBmcm9tIGNhY2hlIHN0cmF0ZWd5ICVkLCBkZXZpY2UgJXgiLAorICAgICAgICAgICAgICBzdHJhdGVneSwgbURldmljZUZvclN0cmF0ZWd5W3N0cmF0ZWd5XSk7CisgICAgICAgIHJldHVybiBtRGV2aWNlRm9yU3RyYXRlZ3lbc3RyYXRlZ3ldOworICAgIH0KKyAgICByZXR1cm4gbUVuZ2luZS0+Z2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3kpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKQoreworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgeworICAgICAgICBtRGV2aWNlRm9yU3RyYXRlZ3lbaV0gPSBnZXREZXZpY2VGb3JTdHJhdGVneSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICB9CisgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOworfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcmV2RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpCit7CisgICAgLy8gbXV0ZS91bm11dGUgc3RyYXRlZ2llcyB1c2luZyBhbiBpbmNvbXBhdGlibGUgZGV2aWNlIGNvbWJpbmF0aW9uCisgICAgLy8gaWYgbXV0aW5nLCB3YWl0IGZvciB0aGUgYXVkaW8gaW4gcGNtIGJ1ZmZlciB0byBiZSBkcmFpbmVkIGJlZm9yZSBwcm9jZWVkaW5nCisgICAgLy8gaWYgdW5tdXRpbmcsIHVubXV0ZSBvbmx5IGFmdGVyIHRoZSBzcGVjaWZpZWQgZGVsYXkKKyAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdWludDMyX3QgbXV0ZVdhaXRNcyA9IDA7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgIGJvb2wgc2hvdWxkTXV0ZSA9IG91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYgKHBvcGNvdW50KGRldmljZSkgPj0gMik7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE5VTV9TVFJBVEVHSUVTOyBpKyspIHsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1ckRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KChyb3V0aW5nX3N0cmF0ZWd5KWksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBjdXJEZXZpY2UgPSBjdXJEZXZpY2UgJiBvdXRwdXREZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCk7CisgICAgICAgIGJvb2wgbXV0ZSA9IHNob3VsZE11dGUgJiYgKGN1ckRldmljZSAmIGRldmljZSkgJiYgKGN1ckRldmljZSAhPSBkZXZpY2UpOworICAgICAgICBib29sIGRvTXV0ZSA9IGZhbHNlOworCisgICAgICAgIGlmIChtdXRlICYmICFvdXRwdXREZXNjLT5tU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldKSB7CisgICAgICAgICAgICBkb011dGUgPSB0cnVlOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoIW11dGUgJiYgb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSl7CisgICAgICAgICAgICBkb011dGUgPSB0cnVlOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChkb011dGUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbU91dHB1dHMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGopOworICAgICAgICAgICAgICAgIC8vIHNraXAgb3V0cHV0IGlmIGl0IGRvZXMgbm90IHNoYXJlIGFueSBkZXZpY2Ugd2l0aCBjdXJyZW50IG91dHB1dAorICAgICAgICAgICAgICAgIGlmICgoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpICYgb3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWVigiY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcygpICVzIHN0cmF0ZWd5ICVkIChjdXJEZXZpY2UgJTA0eCkiLAorICAgICAgICAgICAgICAgICAgICAgIG11dGUgPyAibXV0aW5nIiA6ICJ1bm11dGluZyIsIGksIGN1ckRldmljZSk7CisgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKChyb3V0aW5nX3N0cmF0ZWd5KWksIG11dGUsIGRlc2MsIG11dGUgPyAwIDogZGVsYXlNcyk7CisgICAgICAgICAgICAgICAgaWYgKGlzU3RyYXRlZ3lBY3RpdmUoZGVzYywgKHJvdXRpbmdfc3RyYXRlZ3kpaSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG11dGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBzaG91bGQgbm90IG5lZWQgdG8gZG91YmxlIGxhdGVuY3kgaWYgdm9sdW1lIGNvdWxkIGJlIGFwcGxpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IGJ5IHRoZSBhdWRpb2ZsaW5nZXIgbWl4ZXIuIFdlIG11c3QgYWNjb3VudCBmb3IgdGhlIGRlbGF5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZXR3ZWVuIG5vdyBhbmQgdGhlIG5leHQgdGltZSB0aGUgYXVkaW9mbGluZ2VyIHRocmVhZCBmb3IgdGhpcyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgcHJvY2VzcyBhIGJ1ZmZlciAod2hpY2ggY29ycmVzcG9uZHMgdG8gb25lIGJ1ZmZlciBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXN1YWxseSAxLzIgb3IgMS80IG9mIHRoZSBsYXRlbmN5KS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdXRlV2FpdE1zIDwgZGVzYy0+bGF0ZW5jeSgpICogMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGVXYWl0TXMgPSBkZXNjLT5sYXRlbmN5KCkgKiAyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gdGVtcG9yYXJ5IG11dGUgb3V0cHV0IGlmIGRldmljZSBzZWxlY3Rpb24gY2hhbmdlcyB0byBhdm9pZCB2b2x1bWUgYnVyc3RzIGR1ZSB0bworICAgIC8vIGRpZmZlcmVudCBwZXIgZGV2aWNlIHZvbHVtZXMKKyAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJiAoZGV2aWNlICE9IHByZXZEZXZpY2UpKSB7CisgICAgICAgIGlmIChtdXRlV2FpdE1zIDwgb3V0cHV0RGVzYy0+bGF0ZW5jeSgpICogMikgeworICAgICAgICAgICAgbXV0ZVdhaXRNcyA9IG91dHB1dERlc2MtPmxhdGVuY3koKSAqIDI7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCAocm91dGluZ19zdHJhdGVneSlpKSkgeworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCB0cnVlLCBvdXRwdXREZXNjKTsKKyAgICAgICAgICAgICAgICAvLyBkbyB0ZW1wTXV0ZSB1bm11dGUgYWZ0ZXIgdHdpY2UgdGhlIG11dGUgd2FpdCB0aW1lCisgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKChyb3V0aW5nX3N0cmF0ZWd5KWksIGZhbHNlLCBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRlV2FpdE1zICoyLCBkZXZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gd2FpdCBmb3IgdGhlIFBDTSBvdXRwdXQgYnVmZmVycyB0byBlbXB0eSBiZWZvcmUgcHJvY2VlZGluZyB3aXRoIHRoZSByZXN0IG9mIHRoZSBjb21tYW5kCisgICAgaWYgKG11dGVXYWl0TXMgPiBkZWxheU1zKSB7CisgICAgICAgIG11dGVXYWl0TXMgLT0gZGVsYXlNczsKKyAgICAgICAgdXNsZWVwKG11dGVXYWl0TXMgKiAxMDAwKTsKKyAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7CisgICAgfQorICAgIHJldHVybiAwOworfQorCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldE91dHB1dERldmljZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MpCit7CisgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIGRldmljZSAlMDR4IGRlbGF5TXMgJWQiLCBkZXZpY2UsIGRlbGF5TXMpOworICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOworICAgIHVpbnQzMl90IG11dGVXYWl0TXM7CisKKyAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgbXV0ZVdhaXRNcyA9IHNldE91dHB1dERldmljZShvdXRwdXREZXNjLT5zdWJPdXRwdXQxKCksIGRldmljZSwgZm9yY2UsIGRlbGF5TXMpOworICAgICAgICBtdXRlV2FpdE1zICs9IHNldE91dHB1dERldmljZShvdXRwdXREZXNjLT5zdWJPdXRwdXQyKCksIGRldmljZSwgZm9yY2UsIGRlbGF5TXMpOworICAgICAgICByZXR1cm4gbXV0ZVdhaXRNczsKKyAgICB9CisgICAgLy8gbm8gbmVlZCB0byBwcm9jZWVkIGlmIG5ldyBkZXZpY2UgaXMgbm90IEFVRElPX0RFVklDRV9OT05FIGFuZCBub3Qgc3VwcG9ydGVkIGJ5IGN1cnJlbnQKKyAgICAvLyBvdXRwdXQgcHJvZmlsZQorICAgIGlmICgoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSAmJgorICAgICAgICAgICAgKChkZXZpY2UgJiBvdXRwdXREZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkpID09IDApKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIGZpbHRlciBkZXZpY2VzIGFjY29yZGluZyB0byBvdXRwdXQgc2VsZWN0ZWQKKyAgICBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KShkZXZpY2UgJiBvdXRwdXREZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkpOworCisgICAgYXVkaW9fZGV2aWNlc190IHByZXZEZXZpY2UgPSBvdXRwdXREZXNjLT5tRGV2aWNlOworCisgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIHByZXZEZXZpY2UgMHglMDR4IiwgcHJldkRldmljZSk7CisKKyAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CisgICAgfQorICAgIG11dGVXYWl0TXMgPSBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKG91dHB1dERlc2MsIHByZXZEZXZpY2UsIGRlbGF5TXMpOworCisgICAgLy8gRG8gbm90IGNoYW5nZSB0aGUgcm91dGluZyBpZjoKKyAgICAvLyAgICAgIHRoZSByZXF1ZXN0ZWQgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9OT05FCisgICAgLy8gICAgICBPUiB0aGUgcmVxdWVzdGVkIGRldmljZSBpcyB0aGUgc2FtZSBhcyBjdXJyZW50IGRldmljZQorICAgIC8vICBBTkQgZm9yY2UgaXMgbm90IHNwZWNpZmllZAorICAgIC8vICBBTkQgdGhlIG91dHB1dCBpcyBjb25uZWN0ZWQgYnkgYSB2YWxpZCBhdWRpbyBwYXRjaC4KKyAgICAvLyBEb2luZyB0aGlzIGNoZWNrIGhlcmUgYWxsb3dzIHRoZSBjYWxsZXIgdG8gY2FsbCBzZXRPdXRwdXREZXZpY2UoKSB3aXRob3V0IGNvbmRpdGlvbnMKKyAgICBpZiAoKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSB8fCBkZXZpY2UgPT0gcHJldkRldmljZSkgJiYKKyAgICAgICAgIWZvcmNlICYmCisgICAgICAgIG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSAhPSAwKSB7CisgICAgICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBzZXR0aW5nIHNhbWUgZGV2aWNlIDB4JTA0eCBvciBudWxsIGRldmljZSIsIGRldmljZSk7CisgICAgICAgIHJldHVybiBtdXRlV2FpdE1zOworICAgIH0KKworICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBjaGFuZ2luZyBkZXZpY2UiKTsKKworICAgIC8vIGRvIHRoZSByb3V0aW5nCisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICByZXNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBkZWxheU1zLCBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IChhZGRyZXNzID09IE5VTEwpID8KKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKQorICAgICAgICAgICAgICAgIDogbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlQWRkcihkZXZpY2UsIFN0cmluZzgoYWRkcmVzcykpOworICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7CisgICAgICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1swXSk7CisgICAgICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7CisgICAgICAgICAgICBwYXRjaC5udW1fc2lua3MgPSAwOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXZpY2VMaXN0LnNpemUoKSAmJiBpIDwgQVVESU9fUEFUQ0hfUE9SVFNfTUFYOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VMaXN0Lml0ZW1BdChpKS0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzW2ldKTsKKyAgICAgICAgICAgICAgICBwYXRjaC5udW1fc2lua3MrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNzaXplX3QgaW5kZXg7CisgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUgJiYgKnBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKnBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkob3V0cHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPCBBdWRpb1BhdGNoPiBwYXRjaERlc2M7CisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7CisgICAgICAgICAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZQYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKKyAgICAgICAgICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBjcmVhdGVBdWRpb1BhdGNoIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIgorICAgICAgICAgICAgICAgICAgICAibnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSwgcGF0Y2gubnVtX3NvdXJjZXMsIHBhdGNoLm51bV9zaW5rcyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgmcGF0Y2gsIG1VaWRDYWNoZWQpOworICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9IHBhdGNoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1VaWQgPSBtVWlkQ2FjaGVkOworICAgICAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAqcGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1QYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKKyAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpbmZvcm0gYWxsIGlucHV0IGFzIHdlbGwKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gIGlucHV0RGVzY3JpcHRvciA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmICghaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoaW5wdXREZXNjcmlwdG9yLT5tRGV2aWNlKSkgeworICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIGlucHV0Q21kID0gQXVkaW9QYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6IGluZm9ybSBpbnB1dCAlZCBvZiBkZXZpY2U6JWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgICBpbnB1dERlc2NyaXB0b3ItPm1Jb0hhbmRsZSwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBpbnB1dENtZC5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhpbnB1dERlc2NyaXB0b3ItPm1Jb0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dENtZC50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gdXBkYXRlIHN0cmVhbSB2b2x1bWVzIGFjY29yZGluZyB0byBuZXcgZGV2aWNlCisgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dERlc2MsIGRldmljZSwgZGVsYXlNcyk7CisKKyAgICByZXR1cm4gbXV0ZVdhaXRNczsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZXNldE91dHB1dERldmljZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlKQoreworICAgIHNzaXplX3QgaW5kZXg7CisgICAgaWYgKHBhdGNoSGFuZGxlKSB7CisgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpwYXRjaEhhbmRsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkob3V0cHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICB9CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHNwPCBBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCBkZWxheU1zKTsKKyAgICBBTE9HVigicmVzZXRPdXRwdXREZXZpY2UoKSByZWxlYXNlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCIsIHN0YXR1cyk7CisgICAgb3V0cHV0RGVzYy0+bVBhdGNoSGFuZGxlID0gMDsKKyAgICByZW1vdmVBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSk7CisgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGlucHV0KTsKKyAgICBpZiAoKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgJiYgKChkZXZpY2UgIT0gaW5wdXREZXNjLT5tRGV2aWNlKSB8fCBmb3JjZSkpIHsKKyAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOworCisgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKKyAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOworICAgICAgICAgICAgaW5wdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc2lua3NbMF0pOworICAgICAgICAgICAgLy8gQVVESU9fU09VUkNFX0hPVFdPUkQgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5OgorICAgICAgICAgICAgLy8gaGFuZGxlZCBhcyBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04gYnkgdGhlIGF1ZGlvIEhBTAorICAgICAgICAgICAgaWYgKHBhdGNoLnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQgJiYKKyAgICAgICAgICAgICAgICAgICAgIWlucHV0RGVzYy0+bUlzU291bmRUcmlnZ2VyKSB7CisgICAgICAgICAgICAgICAgcGF0Y2guc2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgICAgICAgICAvL29ubHkgb25lIGlucHV0IGRldmljZSBmb3Igbm93CisgICAgICAgICAgICBkZXZpY2VMaXN0Lml0ZW1BdCgwKS0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOworICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOworICAgICAgICAgICAgc3NpemVfdCBpbmRleDsKKyAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSAmJiAqcGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjOworICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICAgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZQYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgQUxPR1YoInNldElucHV0RGV2aWNlKCkgY3JlYXRlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgmcGF0Y2gsIG1VaWRDYWNoZWQpOworICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9IHBhdGNoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1VaWQgPSBtVWlkQ2FjaGVkOworICAgICAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAqcGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlc2V0SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlKQoreworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGlucHV0KTsKKyAgICBzc2l6ZV90IGluZGV4OworICAgIGlmIChwYXRjaEhhbmRsZSkgeworICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+bVBhdGNoSGFuZGxlKTsKKyAgICB9CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHNwPCBBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICBBTE9HVigicmVzZXRJbnB1dERldmljZSgpIHJlbGVhc2VBdWRpb1BhdGNoIHJldHVybmVkICVkIiwgc3RhdHVzKTsKKyAgICBpbnB1dERlc2MtPm1QYXRjaEhhbmRsZSA9IDA7CisgICAgcmVtb3ZlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUpOworICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzcDxJT1Byb2ZpbGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SW5wdXRQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QmIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QmIGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQoreworICAgIC8vIENob29zZSBhbiBpbnB1dCBwcm9maWxlIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQgY2FwdHVyZSBwYXJhbWV0ZXJzOiBzZWxlY3QgdGhlIGZpcnN0IGF2YWlsYWJsZQorICAgIC8vIHByb2ZpbGUgc3VwcG9ydGluZyBhbGwgcmVxdWVzdGVkIHBhcmFtZXRlcnMuCisgICAgLy8KKyAgICAvLyBUT0RPOiBwZXJoYXBzIGlzQ29tcGF0aWJsZVByb2ZpbGUgc2hvdWxkIHJldHVybiBhICJtYXRjaGluZyIgc2NvcmUgc28gd2UgY2FuIHJldHVybgorICAgIC8vIHRoZSBiZXN0IG1hdGNoaW5nIHByb2ZpbGUsIG5vdCB0aGUgZmlyc3Qgb25lLgorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSHdNb2R1bGVzLnNpemUoKTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKG1Id01vZHVsZXNbaV0tPm1IYW5kbGUgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtSHdNb2R1bGVzW2ldLT5tSW5wdXRQcm9maWxlcy5zaXplKCk7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbUh3TW9kdWxlc1tpXS0+bUlucHV0UHJvZmlsZXNbal07CisgICAgICAgICAgICAvLyBwcm9maWxlLT5sb2coKTsKKyAgICAgICAgICAgIGlmIChwcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldmljZSwgYWRkcmVzcywgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsaW5nUmF0ZSAvKnVwZGF0ZWRTYW1wbGluZ1JhdGUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JtYXQgLyp1cGRhdGVkRm9ybWF0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsTWFzayAvKnVwZGF0ZWRDaGFubmVsTWFzayovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KSBmbGFncykpIHsKKworICAgICAgICAgICAgICAgIHJldHVybiBwcm9maWxlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXggKipwb2xpY3lNaXgpCit7CisgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZURldmljZVR5cGVzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYgfkFVRElPX0RFVklDRV9CSVRfSU47CisgICAgYXVkaW9fZGV2aWNlc190IHNlbGVjdGVkRGV2aWNlRnJvbU1peCA9CisgICAgICAgICAgIG1Qb2xpY3lNaXhlcy5nZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSwgYXZhaWxhYmxlRGV2aWNlVHlwZXMsIHBvbGljeU1peCk7CisKKyAgICBpZiAoc2VsZWN0ZWREZXZpY2VGcm9tTWl4ICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIHJldHVybiBzZWxlY3RlZERldmljZUZyb21NaXg7CisgICAgfQorICAgIHJldHVybiBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSk7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKQoreworICAgIGZvciAoc2l6ZV90IHJvdXRlSW5kZXggPSAwOyByb3V0ZUluZGV4IDwgbUlucHV0Um91dGVzLnNpemUoKTsgcm91dGVJbmRleCsrKSB7CisgICAgICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gbUlucHV0Um91dGVzLnZhbHVlQXQocm91dGVJbmRleCk7CisgICAgICAgICBpZiAoaW5wdXRTb3VyY2UgPT0gcm91dGUtPm1Tb3VyY2UgJiYgcm91dGUtPmlzQWN0aXZlKCkpIHsKKyAgICAgICAgICAgICByZXR1cm4gcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yLT50eXBlKCk7CisgICAgICAgICB9CisgICAgIH0KKworICAgICByZXR1cm4gbUVuZ2luZS0+Z2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UpOworfQorCitmbG9hdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNvbXB1dGVWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBmbG9hdCB2b2x1bWVEYiA9IG1FbmdpbmUtPnZvbEluZGV4VG9EYihWb2x1bWU6OmdldERldmljZUNhdGVnb3J5KGRldmljZSksIHN0cmVhbSwgaW5kZXgpOworCisgICAgLy8gaWYgYSBoZWFkc2V0IGlzIGNvbm5lY3RlZCwgYXBwbHkgdGhlIGZvbGxvd2luZyBydWxlcyB0byByaW5nIHRvbmVzIGFuZCBub3RpZmljYXRpb25zCisgICAgLy8gdG8gYXZvaWQgc291bmQgbGV2ZWwgYnVyc3RzIGluIHVzZXIncyBlYXJzOgorICAgIC8vIC0gYWx3YXlzIGF0dGVudWF0ZSByaW5nIHRvbmVzIGFuZCBub3RpZmljYXRpb25zIHZvbHVtZSBieSA2ZEIKKyAgICAvLyAtIGlmIG11c2ljIGlzIHBsYXlpbmcsIGFsd2F5cyBsaW1pdCB0aGUgdm9sdW1lIHRvIGN1cnJlbnQgbXVzaWMgdm9sdW1lLAorICAgIC8vIHdpdGggYSBtaW5pbXVtIHRocmVzaG9sZCBhdCAtMzZkQiBzbyB0aGF0IG5vdGlmaWNhdGlvbiBpcyBhbHdheXMgcGVyY2VpdmVkLgorICAgIGNvbnN0IHJvdXRpbmdfc3RyYXRlZ3kgc3RyZWFtX3N0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKKyAgICBpZiAoKGRldmljZSAmIChBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQIHwKKyAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyB8CisgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQgfAorICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUpKSAmJgorICAgICAgICAoKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pCisgICAgICAgICAgICAgICAgfHwgKHN0cmVhbV9zdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkKKyAgICAgICAgICAgICAgICB8fCAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9TWVNURU0pCisgICAgICAgICAgICAgICAgfHwgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkpKSAmJgorICAgICAgICAgICAgbVN0cmVhbXMuY2FuQmVNdXRlZChzdHJlYW0pKSB7CisgICAgICAgIHZvbHVtZURiICs9IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9GQUNUT1JfREI7CisgICAgICAgIC8vIHdoZW4gdGhlIHBob25lIGlzIHJpbmdpbmcgd2UgbXVzdCBjb25zaWRlciB0aGF0IG11c2ljIGNvdWxkIGhhdmUgYmVlbiBwYXVzZWQganVzdCBiZWZvcmUKKyAgICAgICAgLy8gYnkgdGhlIG11c2ljIGFwcGxpY2F0aW9uIGFuZCBiZWhhdmUgYXMgaWYgbXVzaWMgd2FzIGFjdGl2ZSBpZiB0aGUgbGFzdCBtdXNpYyB0cmFjayB3YXMKKyAgICAgICAgLy8ganVzdCBzdG9wcGVkCisgICAgICAgIGlmIChpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZKSB8fAorICAgICAgICAgICAgICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lKSB7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbXVzaWNEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIGZsb2F0IG11c2ljVm9sREIgPSBjb21wdXRlVm9sdW1lKEFVRElPX1NUUkVBTV9NVVNJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1zLnZhbHVlRm9yKEFVRElPX1NUUkVBTV9NVVNJQykuZ2V0Vm9sdW1lSW5kZXgobXVzaWNEZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljRGV2aWNlKTsKKyAgICAgICAgICAgIGZsb2F0IG1pblZvbERCID0gKG11c2ljVm9sREIgPiBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOX0RCKSA/CisgICAgICAgICAgICAgICAgICAgIG11c2ljVm9sREIgOiBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOX0RCOworICAgICAgICAgICAgaWYgKHZvbHVtZURiID4gbWluVm9sREIpIHsKKyAgICAgICAgICAgICAgICB2b2x1bWVEYiA9IG1pblZvbERCOworICAgICAgICAgICAgICAgIEFMT0dWKCJjb21wdXRlVm9sdW1lIGxpbWl0aW5nIHZvbHVtZSB0byAlZiBtdXNpY1ZvbCAlZiIsIG1pblZvbERCLCBtdXNpY1ZvbERCKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB2b2x1bWVEYjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0FuZFNldFZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQoreworICAgIC8vIGRvIG5vdCBjaGFuZ2UgYWN0dWFsIHN0cmVhbSB2b2x1bWUgaWYgdGhlIHN0cmVhbSBpcyBtdXRlZAorICAgIGlmIChvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0gIT0gMCkgeworICAgICAgICBBTE9HVlYoImNoZWNrQW5kU2V0Vm9sdW1lKCkgc3RyZWFtICVkIG11dGVkIGNvdW50ICVkIiwKKyAgICAgICAgICAgICAgc3RyZWFtLCBvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0pOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZm9yY2VVc2VGb3JDb21tID0KKyAgICAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTik7CisgICAgLy8gZG8gbm90IGNoYW5nZSBpbiBjYWxsIHZvbHVtZSBpZiBibHVldG9vdGggaXMgY29ubmVjdGVkIGFuZCB2aWNlIHZlcnNhCisgICAgaWYgKChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgJiYgZm9yY2VVc2VGb3JDb21tID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHx8CisgICAgICAgIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08gJiYgZm9yY2VVc2VGb3JDb21tICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pKSB7CisgICAgICAgIEFMT0dWKCJjaGVja0FuZFNldFZvbHVtZSgpIGNhbm5vdCBzZXQgc3RyZWFtICVkIHZvbHVtZSB3aXRoIGZvcmNlIHVzZSA9ICVkIGZvciBjb21tIiwKKyAgICAgICAgICAgICBzdHJlYW0sIGZvcmNlVXNlRm9yQ29tbSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgIH0KKworICAgIGZsb2F0IHZvbHVtZURiID0gY29tcHV0ZVZvbHVtZShzdHJlYW0sIGluZGV4LCBkZXZpY2UpOworICAgIGlmIChvdXRwdXREZXNjLT5pc0ZpeGVkVm9sdW1lKGRldmljZSkpIHsKKyAgICAgICAgdm9sdW1lRGIgPSAwLjBmOworICAgIH0KKworICAgIG91dHB1dERlc2MtPnNldFZvbHVtZSh2b2x1bWVEYiwgc3RyZWFtLCBkZXZpY2UsIGRlbGF5TXMsIGZvcmNlKTsKKworICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgfHwKKyAgICAgICAgc3RyZWFtID09IEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPKSB7CisgICAgICAgIGZsb2F0IHZvaWNlVm9sdW1lOworICAgICAgICAvLyBGb3JjZSB2b2ljZSB2b2x1bWUgdG8gbWF4IGZvciBibHVldG9vdGggU0NPIGFzIHZvbHVtZSBpcyBtYW5hZ2VkIGJ5IHRoZSBoZWFkc2V0CisgICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpIHsKKyAgICAgICAgICAgIHZvaWNlVm9sdW1lID0gKGZsb2F0KWluZGV4LyhmbG9hdCltU3RyZWFtcy52YWx1ZUZvcihzdHJlYW0pLmdldFZvbHVtZUluZGV4TWF4KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IDEuMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2b2ljZVZvbHVtZSAhPSBtTGFzdFZvaWNlVm9sdW1lICYmIG91dHB1dERlc2MgPT0gbVByaW1hcnlPdXRwdXQpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRWb2ljZVZvbHVtZSh2b2ljZVZvbHVtZSwgZGVsYXlNcyk7CisgICAgICAgICAgICBtTGFzdFZvaWNlVm9sdW1lID0gdm9pY2VWb2x1bWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphcHBseVN0cmVhbVZvbHVtZXMoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCit7CisgICAgQUxPR1ZWKCJhcHBseVN0cmVhbVZvbHVtZXMoKSBmb3IgZGV2aWNlICUwOHgiLCBkZXZpY2UpOworCisgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0NOVDsgc3RyZWFtKyspIHsKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbXMudmFsdWVGb3IoKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKS5nZXRWb2x1bWVJbmRleChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdHJhdGVneU11dGUocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIEFMT0dWVigic2V0U3RyYXRlZ3lNdXRlKCkgc3RyYXRlZ3kgJWQsIG11dGUgJWQsIG91dHB1dCBJRCAlZCIsCisgICAgICAgICAgIHN0cmF0ZWd5LCBvbiwgb3V0cHV0RGVzYy0+Z2V0SWQoKSk7CisgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0NOVDsgc3RyZWFtKyspIHsKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pID09IHN0cmF0ZWd5KSB7CisgICAgICAgICAgICBzZXRTdHJlYW1NdXRlKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgb24sIG91dHB1dERlc2MsIGRlbGF5TXMsIGRldmljZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGNvbnN0IFN0cmVhbURlc2NyaXB0b3ImIHN0cmVhbURlc2MgPSBtU3RyZWFtcy52YWx1ZUZvcihzdHJlYW0pOworICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgfQorCisgICAgQUxPR1ZWKCJzZXRTdHJlYW1NdXRlKCkgc3RyZWFtICVkLCBtdXRlICVkLCBtTXV0ZUNvdW50ICVkIGRldmljZSAlMDR4IiwKKyAgICAgICAgICBzdHJlYW0sIG9uLCBvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0sIGRldmljZSk7CisKKyAgICBpZiAob24pIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoc3RyZWFtRGVzYy5jYW5CZU11dGVkKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpIHx8CisgICAgICAgICAgICAgICAgICAgICAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSkpIHsKKyAgICAgICAgICAgICAgICBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sIDAsIG91dHB1dERlc2MsIGRldmljZSwgZGVsYXlNcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gaW5jcmVtZW50IG1NdXRlQ291bnQgYWZ0ZXIgY2FsbGluZyBjaGVja0FuZFNldFZvbHVtZSgpIHNvIHRoYXQgdm9sdW1lIGNoYW5nZSBpcyBub3QgaWdub3JlZAorICAgICAgICBvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0rKzsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAob3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJzZXRTdHJlYW1NdXRlKCkgdW5tdXRpbmcgbm9uIG11dGVkIHN0cmVhbSEiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoLS1vdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0gPT0gMCkgeworICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtRGVzYy5nZXRWb2x1bWVJbmRleChkZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdGFydGluZywgYm9vbCBzdGF0ZUNoYW5nZSkKK3sKKyAgICBpZighaGFzUHJpbWFyeU91dHB1dCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBpZiB0aGUgc3RyZWFtIHBlcnRhaW5zIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBhbmQgd2UgYXJlIGluIGNhbGwgd2UgbXVzdAorICAgIC8vIG11dGUgdGhlIHN0cmVhbSBpZiBpdCBpcyBsb3cgdmlzaWJpbGl0eS4gSWYgaXQgaXMgaGlnaCB2aXNpYmlsaXR5LCB3ZSBtdXN0IHBsYXkgYSB0b25lCisgICAgLy8gaW4gdGhlIGRldmljZSB1c2VkIGZvciBwaG9uZSBzdHJhdGVneSBhbmQgcGxheSB0aGUgdG9uZSBpZiB0aGUgc2VsZWN0ZWQgZGV2aWNlIGRvZXMgbm90CisgICAgLy8gaW50ZXJmZXJlIHdpdGggdGhlIGRldmljZSB1c2VkIGZvciBwaG9uZSBzdHJhdGVneQorICAgIC8vIGlmIHN0YXRlQ2hhbmdlIGlzIHRydWUsIHdlIGFyZSBjYWxsZWQgZnJvbSBzZXRQaG9uZVN0YXRlKCkgYW5kIHdlIG11c3QgbXV0ZSBvciB1bm11dGUgYXMKKyAgICAvLyBtYW55IHRpbWVzIGFzIHRoZXJlIGFyZSBhY3RpdmUgdHJhY2tzIG9uIHRoZSBvdXRwdXQKKyAgICBjb25zdCByb3V0aW5nX3N0cmF0ZWd5IHN0cmVhbV9zdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7CisgICAgaWYgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAorICAgICAgICAgICAgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpKSkgeworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1QcmltYXJ5T3V0cHV0OworICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgc3RyZWFtICVkIHN0YXJ0aW5nICVkIGRldmljZSAleCBzdGF0ZUNoYW5nZSAlZCIsCisgICAgICAgICAgICAgICAgc3RyZWFtLCBzdGFydGluZywgb3V0cHV0RGVzYy0+bURldmljZSwgc3RhdGVDaGFuZ2UpOworICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0pIHsKKyAgICAgICAgICAgIGludCBtdXRlQ291bnQgPSAxOworICAgICAgICAgICAgaWYgKHN0YXRlQ2hhbmdlKSB7CisgICAgICAgICAgICAgICAgbXV0ZUNvdW50ID0gb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXVkaW9faXNfbG93X3Zpc2liaWxpdHkoc3RyZWFtKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBsb3cgdmlzaWJpbGl0eSwgbXV0ZUNvdW50ICVkIiwgbXV0ZUNvdW50KTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG11dGVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFN0cmVhbU11dGUoc3RyZWFtLCBzdGFydGluZywgbVByaW1hcnlPdXRwdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGhpZ2ggdmlzaWJpbGl0eSIpOworICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5kZXZpY2UoKSAmCisgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSwgdHJ1ZSAvKmZyb21DYWNoZSovKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgaGlnaCB2aXNpYmlsaXR5IG11dGVkLCBtdXRlQ291bnQgJWQiLCBtdXRlQ291bnQpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG11dGVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1NdXRlKHN0cmVhbSwgc3RhcnRpbmcsIG1QcmltYXJ5T3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnN0YXJ0VG9uZShBVURJT19QT0xJQ1lfVE9ORV9JTl9DQUxMX05PVElGSUNBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnN0b3BUb25lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmRlZmF1bHRBdWRpb1BvbGljeUNvbmZpZyh2b2lkKQoreworICAgIHNwPEh3TW9kdWxlPiBtb2R1bGU7CisgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRlZmF1bHRJbnB1dERldmljZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBEZXZpY2VEZXNjcmlwdG9yKEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyk7CisgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuYWRkKG1EZWZhdWx0T3V0cHV0RGV2aWNlKTsKKyAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmFkZChkZWZhdWx0SW5wdXREZXZpY2UpOworCisgICAgbW9kdWxlID0gbmV3IEh3TW9kdWxlKCJwcmltYXJ5Iik7CisKKyAgICBwcm9maWxlID0gbmV3IElPUHJvZmlsZShTdHJpbmc4KCJwcmltYXJ5IiksIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpOworICAgIHByb2ZpbGUtPmF0dGFjaChtb2R1bGUpOworICAgIHByb2ZpbGUtPm1TYW1wbGluZ1JhdGVzLmFkZCg0NDEwMCk7CisgICAgcHJvZmlsZS0+bUZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKKyAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmFkZChBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOworICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmFkZChtRGVmYXVsdE91dHB1dERldmljZSk7CisgICAgcHJvZmlsZS0+bUZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWTsKKyAgICBtb2R1bGUtPm1PdXRwdXRQcm9maWxlcy5hZGQocHJvZmlsZSk7CisKKyAgICBwcm9maWxlID0gbmV3IElPUHJvZmlsZShTdHJpbmc4KCJwcmltYXJ5IiksIEFVRElPX1BPUlRfUk9MRV9TSU5LKTsKKyAgICBwcm9maWxlLT5hdHRhY2gobW9kdWxlKTsKKyAgICBwcm9maWxlLT5tU2FtcGxpbmdSYXRlcy5hZGQoODAwMCk7CisgICAgcHJvZmlsZS0+bUZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKKyAgICBwcm9maWxlLT5tQ2hhbm5lbE1hc2tzLmFkZChBVURJT19DSEFOTkVMX0lOX01PTk8pOworICAgIHByb2ZpbGUtPm1TdXBwb3J0ZWREZXZpY2VzLmFkZChkZWZhdWx0SW5wdXREZXZpY2UpOworICAgIG1vZHVsZS0+bUlucHV0UHJvZmlsZXMuYWRkKHByb2ZpbGUpOworCisgICAgbUh3TW9kdWxlcy5hZGQobW9kdWxlKTsKK30KKworYXVkaW9fc3RyZWFtX3R5cGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpCit7CisgICAgLy8gZmxhZ3MgdG8gc3RyZWFtIHR5cGUgbWFwcGluZworICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpID09IEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgeworICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU7CisgICAgfQorICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX1NDTykgPT0gQVVESU9fRkxBR19TQ08pIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOworICAgIH0KKyAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19CRUFDT04pID09IEFVRElPX0ZMQUdfQkVBQ09OKSB7CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVFRTOworICAgIH0KKworICAgIC8vIHVzYWdlIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKKyAgICBzd2l0Y2ggKGF0dHItPnVzYWdlKSB7CisgICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKKyAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6CisgICAgICAgIGlmIChpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fQUxBUk0pKSB7CisgICAgICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FMQVJNOworICAgICAgICB9CisgICAgICAgIGlmIChpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fUklORykpIHsKKyAgICAgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fUklORzsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNJbkNhbGwoKSkgeworICAgICAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOworICAgICAgICB9CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWTsKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1NZU1RFTTsKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDsKKworICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0RUTUY7CisKKyAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgorICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FMQVJNOworICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKKyAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9SSU5HOworCisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOworCisgICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgfQorfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNWYWxpZEF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICpwYWEpCit7CisgICAgLy8gaGFzIGZsYWdzIHRoYXQgbWFwIHRvIGEgc3RyYXRlZ3k/CisgICAgaWYgKChwYWEtPmZsYWdzICYgKEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCB8IEFVRElPX0ZMQUdfU0NPIHwgQVVESU9fRkxBR19CRUFDT04pKSAhPSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIGhhcyBrbm93biB1c2FnZT8KKyAgICBzd2l0Y2ggKHBhYS0+dXNhZ2UpIHsKKyAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046CisgICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKKyAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6CisgICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgorICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKKyAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6CisgICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKKyAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6CisgICAgY2FzZSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRToKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RyYXRlZ3lBY3RpdmUoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwgdWludDMyX3QgaW5QYXN0TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUpIGNvbnN0Cit7CisgICAgaWYgKChzeXNUaW1lID09IDApICYmIChpblBhc3RNcyAhPSAwKSkgeworICAgICAgICBzeXNUaW1lID0gc3lzdGVtVGltZSgpOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7CisgICAgICAgIGlmIChpID09IEFVRElPX1NUUkVBTV9QQVRDSCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCgoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSkgPT0gc3RyYXRlZ3kpIHx8CisgICAgICAgICAgICAgICAgKE5VTV9TVFJBVEVHSUVTID09IHN0cmF0ZWd5KSkgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkKK3sKKyAgICByZXR1cm4gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UodXNhZ2UpOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNJbkNhbGwoKQoreworICAgIHJldHVybiBpc1N0YXRlSW5DYWxsKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0YXRlSW5DYWxsKGludCBzdGF0ZSkKK3sKKyAgICByZXR1cm4gaXNfc3RhdGVfaW5fY2FsbChzdGF0ZSk7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmM2FlNGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaApAQCAtMCwwICsxLDYxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgorI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5SW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlci5oPgorI2luY2x1ZGUgPEF1ZGlvR2Fpbi5oPgorI2luY2x1ZGUgPEF1ZGlvUG9ydC5oPgorI2luY2x1ZGUgPEF1ZGlvUGF0Y2guaD4KKyNpbmNsdWRlIDxDb25maWdQYXJzaW5nVXRpbHMuaD4KKyNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8SU9Qcm9maWxlLmg+CisjaW5jbHVkZSA8SHdNb2R1bGUuaD4KKyNpbmNsdWRlIDxBdWRpb0lucHV0RGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPEF1ZGlvT3V0cHV0RGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWl4Lmg+CisjaW5jbHVkZSA8RWZmZWN0RGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPFNvdW5kVHJpZ2dlclNlc3Npb24uaD4KKyNpbmNsdWRlIDxTdHJlYW1EZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8U2Vzc2lvblJvdXRlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBBdHRlbnVhdGlvbiBhcHBsaWVkIHRvIFNUUkFURUdZX1NPTklGSUNBVElPTiBzdHJlYW1zIHdoZW4gYSBoZWFkc2V0IGlzIGNvbm5lY3RlZDogNmRCCisjZGVmaW5lIFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9GQUNUT1IgMC41CisjZGVmaW5lIFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9GQUNUT1JfREIgKC02KQorLy8gTWluIHZvbHVtZSBmb3IgU1RSQVRFR1lfU09OSUZJQ0FUSU9OIHN0cmVhbXMgd2hlbiBsaW1pdGVkIGJ5IG11c2ljIHZvbHVtZTogLTM2ZEIKKyNkZWZpbmUgU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX01JTiAgMC4wMTYKKyNkZWZpbmUgU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX01JTl9EQiAgKC0zNikKKworLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgZHVyaW5nIHdoaWNoIHdlIGNvbnNpZGVyIHRoYXQgbXVzaWMgaXMgc3RpbGwgYWN0aXZlIGFmdGVyIGEgbXVzaWMKKy8vIHRyYWNrIHdhcyBzdG9wcGVkIC0gc2VlIGNvbXB1dGVWb2x1bWUoKQorI2RlZmluZSBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSAgNTAwMAorCisvLyBUaW1lIGluIG1pbGxpc2Vjb25kcyBkdXJpbmcgd2l0Y2ggc29tZSBzdHJlYW1zIGFyZSBtdXRlZCB3aGlsZSB0aGUgYXVkaW8gcGF0aAorLy8gaXMgc3dpdGNoZWQKKyNkZWZpbmUgTVVURV9USU1FX01TIDIwMDAKKworI2RlZmluZSBOVU1fVEVTVF9PVVRQVVRTIDUKKworI2RlZmluZSBOVU1fVk9MX0NVUlZFX0tORUVTIDIKKworLy8gRGVmYXVsdCBtaW5pbXVtIGxlbmd0aCBhbGxvd2VkIGZvciBvZmZsb2FkaW5nIGEgY29tcHJlc3NlZCB0cmFjaworLy8gQ2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIGF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MgcHJvcGVydHkKKyNkZWZpbmUgT0ZGTE9BRF9ERUZBVUxUX01JTl9EVVJBVElPTl9TRUNTIDYwCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEF1ZGlvUG9saWN5TWFuYWdlciBpbXBsZW1lbnRzIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGJlaGF2aW9yIGNvbW1vbiB0byBhbGwgcGxhdGZvcm1zLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXIgOiBwdWJsaWMgQXVkaW9Qb2xpY3lJbnRlcmZhY2UsIHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlcgorCisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICAsIHB1YmxpYyBUaHJlYWQKKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCit7CisKK3B1YmxpYzoKKyAgICAgICAgICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CisgICAgICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5TWFuYWdlcigpOworCisgICAgICAgIC8vIEF1ZGlvUG9saWN5SW50ZXJmYWNlCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKTsKKyAgICAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7CisgICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRTeXN0ZW1Qcm9wZXJ0eShjb25zdCBjaGFyKiBwcm9wZXJ0eSwgY29uc3QgY2hhciogdmFsdWUpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOworICAgICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3R5cGVfdCAqaW5wdXRUeXBlKTsKKworICAgICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0YXJ0cyBiZWluZyB1c2VkLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisKKyAgICAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdG9wcyBiZWluZyB1c2VkLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGNsb3NlQWxsSW5wdXRzKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworCisgICAgICAgIC8vIHJldHVybiB0aGUgc3RyYXRlZ3kgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHN0cmVhbSB0eXBlCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKTsKKworICAgICAgICAvLyByZXR1cm4gdGhlIGVuYWJsZWQgb3V0cHV0IGRldmljZXMgZm9yIHRoZSBnaXZlbiBzdHJlYW0gdHlwZQorICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKworICAgICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjID0gTlVMTCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbUVmZmVjdHMudW5yZWdpc3RlckVmZmVjdChpZCk7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbUVmZmVjdHMuc2V0RWZmZWN0RW5hYmxlZChpZCwgZW5hYmxlZCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisgICAgICAgIC8vIHJldHVybiB3aGV0aGVyIGEgc3RyZWFtIGlzIHBsYXlpbmcgcmVtb3RlbHksIG92ZXJyaWRlIHRvIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZgorICAgICAgICAvLyAgIGxvY2FsL3JlbW90ZSBwbGF5YmFjaywgdXNlZCBmb3IgaW5zdGFuY2UgYnkgbm90aWZpY2F0aW9uIG1hbmFnZXIgdG8gbm90IG1ha2UKKyAgICAgICAgLy8gICBtZWRpYSBwbGF5ZXJzIGxvc2UgYXVkaW8gZm9jdXMgd2hlbiBub3QgcGxheWluZyBsb2NhbGx5CisgICAgICAgIC8vICAgRm9yIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uLCAicmVtb3RlbHkiIG1lYW5zIHBsYXlpbmcgZHVyaW5nIHNjcmVlbiBtaXJyb3Jpbmcgd2hpY2gKKyAgICAgICAgLy8gICB1c2VzIGFuIG91dHB1dCBmb3IgcGxheWJhY2sgd2l0aCBhIG5vbi1lbXB0eSwgbm9uICIwIiBhZGRyZXNzLgorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdDsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBvZmZsb2FkSW5mbyk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbik7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqZ2VuZXJhdGlvbik7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGFjcXVpcmVTb3VuZFRyaWdnZXJTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCAqc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy5yZWxlYXNlU2Vzc2lvbihzZXNzaW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhWZWN0b3I8QXVkaW9NaXg+IG1peGVzKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyUG9saWN5TWl4ZXMoVmVjdG9yPEF1ZGlvTWl4PiBtaXhlcyk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmhhbmRsZSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSk7CisKKyAgICAgICAgdmlydHVhbCB2b2lkICAgICByZWxlYXNlUmVzb3VyY2VzRm9yVWlkKHVpZF90IHVpZCk7CisKKyAgICAgICAgLy8gQXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZSBwYXJzaW5nIChhdWRpb19wb2xpY3kuY29uZikKKyAgICAgICAgLy8gVE9ETyBjYW5kaWRhdGVzIHRvIGJlIG1vdmVkIHRvIENvbmZpZ1BhcnNpbmdVdGlscworICAgICAgICAgICAgICAgIHZvaWQgZGVmYXVsdEF1ZGlvUG9saWN5Q29uZmlnKHZvaWQpOworCisgICAgICAgIC8vIHJldHVybiB0aGUgc3RyYXRlZ3kgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHN0cmVhbSB0eXBlCisgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3koYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgICAgIC8vIEZyb20gQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIKKyAgICAgICAgdmlydHVhbCBjb25zdCBBdWRpb1BhdGNoQ29sbGVjdGlvbiAmZ2V0QXVkaW9QYXRjaGVzKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1BdWRpb1BhdGNoZXM7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBjb25zdCBTb3VuZFRyaWdnZXJTZXNzaW9uQ29sbGVjdGlvbiAmZ2V0U291bmRUcmlnZ2VyU2Vzc2lvbkNvbGxlY3Rpb24oKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVNvdW5kVHJpZ2dlclNlc3Npb25zOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgY29uc3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uICZnZXRBdWRpb1BvbGljeU1peENvbGxlY3Rpb24oKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbVBvbGljeU1peGVzOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJmdldE91dHB1dHMoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbU91dHB1dHM7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBjb25zdCBBdWRpb0lucHV0Q29sbGVjdGlvbiAmZ2V0SW5wdXRzKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1JbnB1dHM7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBjb25zdCBEZXZpY2VWZWN0b3IgJmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZU91dHB1dERldmljZXM7CisgICAgICAgIH0KKyAgICAgICAgdmlydHVhbCBjb25zdCBEZXZpY2VWZWN0b3IgJmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtQXZhaWxhYmxlSW5wdXREZXZpY2VzOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24gJmdldFN0cmVhbURlc2NyaXB0b3JzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1TdHJlYW1zOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmdldERlZmF1bHRPdXRwdXREZXZpY2UoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbURlZmF1bHRPdXRwdXREZXZpY2U7CisgICAgICAgIH0KK3Byb3RlY3RlZDoKKyAgICAgICAgdm9pZCBhZGRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyk7CisgICAgICAgIHZvaWQgcmVtb3ZlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CisgICAgICAgIHZvaWQgYWRkSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MpOworCisgICAgICAgIC8vIHJldHVybiBhcHByb3ByaWF0ZSBkZXZpY2UgZm9yIHN0cmVhbXMgaGFuZGxlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmF0ZWd5IGFjY29yZGluZyB0byBjdXJyZW50CisgICAgICAgIC8vIHBob25lIHN0YXRlLCBjb25uZWN0ZWQgZGV2aWNlcy4uLgorICAgICAgICAvLyBpZiBmcm9tQ2FjaGUgaXMgdHJ1ZSwgdGhlIGRldmljZSBpcyByZXR1cm5lZCBmcm9tIG1EZXZpY2VGb3JTdHJhdGVneVtdLAorICAgICAgICAvLyBvdGhlcndpc2UgaXQgaXMgZGV0ZXJtaW5lIGJ5IGN1cnJlbnQgc3RhdGUKKyAgICAgICAgLy8gKGRldmljZSBjb25uZWN0ZWQscGhvbmUgc3RhdGUsIGZvcmNlIHVzZSwgYTJkcCBvdXRwdXQuLi4pCisgICAgICAgIC8vIFRoaXMgYWxsb3dzIHRvOgorICAgICAgICAvLyAgMSBzcGVlZCB1cCBwcm9jZXNzIHdoZW4gdGhlIHN0YXRlIGlzIHN0YWJsZSAod2hlbiBzdGFydGluZyBvciBzdG9wcGluZyBhbiBvdXRwdXQpCisgICAgICAgIC8vICAyIGFjY2VzcyB0byBlaXRoZXIgY3VycmVudCBkZXZpY2Ugc2VsZWN0aW9uIChmcm9tQ2FjaGUgPT0gdHJ1ZSkgb3IKKyAgICAgICAgLy8gImZ1dHVyZSIgZGV2aWNlIHNlbGVjdGlvbiAoZnJvbUNhY2hlID09IGZhbHNlKSB3aGVuIGNhbGxlZCBmcm9tIGEgY29udGV4dAorICAgICAgICAvLyAgd2hlcmUgY29uZGl0aW9ucyBhcmUgY2hhbmdpbmcgKHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpLCBzZXRQaG9uZVN0YXRlKCkuLi4pIEFORAorICAgICAgICAvLyAgYmVmb3JlIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkgaXMgY2FsbGVkLgorICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSk7CisKKyAgICAgICAgYm9vbCBpc1N0cmF0ZWd5QWN0aXZlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYywgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCwgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3Q7CisKKyAgICAgICAgLy8gY2hhbmdlIHRoZSByb3V0ZSBvZiB0aGUgc3BlY2lmaWVkIG91dHB1dC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1zIHdlIGhhdmUgc2xlcHQgdG8KKyAgICAgICAgLy8gYWxsb3cgbmV3IHJvdXRpbmcgdG8gdGFrZSBlZmZlY3QgaW4gY2VydGFpbiBjYXNlcy4KKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBzZXRPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGFkZHJlc3MgPSBOVUxMKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzZXRPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUgPSBOVUxMKTsKKyAgICAgICAgc3RhdHVzX3Qgc2V0SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCk7CisgICAgICAgIHN0YXR1c190IHJlc2V0SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCk7CisKKyAgICAgICAgLy8gc2VsZWN0IGlucHV0IGRldmljZSBjb3JyZXNwb25kaW5nIHRvIHJlcXVlc3RlZCBhdWRpbyBzb3VyY2UKKyAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpOworCisgICAgICAgIC8vIGNvbXB1dGUgdGhlIGFjdHVhbCB2b2x1bWUgZm9yIGEgZ2l2ZW4gc3RyZWFtIGFjY29yZGluZyB0byB0aGUgcmVxdWVzdGVkIGluZGV4IGFuZCBhIHBhcnRpY3VsYXIKKyAgICAgICAgLy8gZGV2aWNlCisgICAgICAgIHZpcnR1YWwgZmxvYXQgY29tcHV0ZVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgdm9sdW1lIGNoYW5nZSBpcyBwZXJtaXR0ZWQsIGNvbXB1dGUgYW5kIHNlbmQgbmV3IHZvbHVtZSB0byBhdWRpbyBoYXJkd2FyZQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNoZWNrQW5kU2V0Vm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwgYm9vbCBmb3JjZSA9IGZhbHNlKTsKKworICAgICAgICAvLyBhcHBseSBhbGwgc3RyZWFtIHZvbHVtZXMgdG8gdGhlIHNwZWNpZmllZCBvdXRwdXQgYW5kIGRldmljZQorICAgICAgICB2b2lkIGFwcGx5U3RyZWFtVm9sdW1lcyhjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgZGVsYXlNcyA9IDAsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CisKKyAgICAgICAgLy8gTXV0ZSBvciB1bm11dGUgYWxsIHN0cmVhbXMgaGFuZGxlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmF0ZWd5IG9uIHRoZSBzcGVjaWZpZWQgb3V0cHV0CisgICAgICAgIHZvaWQgc2V0U3RyYXRlZ3lNdXRlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpMCk7CisKKyAgICAgICAgLy8gTXV0ZSBvciB1bm11dGUgdGhlIHN0cmVhbSBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dAorICAgICAgICB2b2lkIHNldFN0cmVhbU11dGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KTApOworCisgICAgICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2VzIGZvciBzb25pZmljYXRpb24gc3RyYXRlZ3kgd2hpbGUgaW4gY2FsbDogbXV0ZSBzdHJlYW1zIG9yIHJlcGxhY2UgYnkKKyAgICAgICAgLy8gYSBzcGVjaWFsIHRvbmUgaW4gdGhlIGRldmljZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uCisgICAgICAgIHZvaWQgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sIHN0YXJ0aW5nLCBib29sIHN0YXRlQ2hhbmdlKTsKKworICAgICAgICBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpOworCisgICAgICAgIC8vIHRydWUgaWYgZGV2aWNlIGlzIGluIGEgdGVsZXBob255IG9yIFZvSVAgY2FsbAorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNJbkNhbGwoKTsKKyAgICAgICAgLy8gdHJ1ZSBpZiBnaXZlbiBzdGF0ZSByZXByZXNlbnRzIGEgZGV2aWNlIGluIGEgdGVsZXBob255IG9yIFZvSVAgY2FsbAorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTdGF0ZUluQ2FsbChpbnQgc3RhdGUpOworCisgICAgICAgIC8vIHdoZW4gYSBkZXZpY2UgaXMgY29ubmVjdGVkLCBjaGVja3MgaWYgYW4gb3BlbiBvdXRwdXQgY2FuIGJlIHJvdXRlZAorICAgICAgICAvLyB0byB0aGlzIGRldmljZS4gSWYgbm9uZSBpcyBvcGVuLCB0cmllcyB0byBvcGVuIG9uZSBvZiB0aGUgYXZhaWxhYmxlIG91dHB1dHMuCisgICAgICAgIC8vIFJldHVybnMgYW4gb3V0cHV0IHN1aXRhYmxlIHRvIHRoaXMgZGV2aWNlIG9yIDAuCisgICAgICAgIC8vIHdoZW4gYSBkZXZpY2UgaXMgZGlzY29ubmVjdGVkLCBjaGVja3MgaWYgYW4gb3V0cHV0IGlzIG5vdCB1c2VkIGFueSBtb3JlIGFuZAorICAgICAgICAvLyByZXR1cm5zIGl0cyBoYW5kbGUgaWYgYW55LgorICAgICAgICAvLyB0cmFuc2ZlcnMgdGhlIGF1ZGlvIHRyYWNrcyBhbmQgZWZmZWN0cyBmcm9tIG9uZSBvdXRwdXQgdGhyZWFkIHRvIGFub3RoZXIgYWNjb3JkaW5nbHkuCisgICAgICAgIHN0YXR1c190IGNoZWNrT3V0cHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcyk7CisKKyAgICAgICAgc3RhdHVzX3QgY2hlY2tJbnB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBpbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcyk7CisKKyAgICAgICAgLy8gY2xvc2UgYW4gb3V0cHV0IGFuZCBpdHMgY29tcGFuaW9uIGR1cGxpY2F0aW5nIG91dHB1dC4KKyAgICAgICAgdm9pZCBjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOworCisgICAgICAgIC8vIGNsb3NlIGFuIGlucHV0LgorICAgICAgICB2b2lkIGNsb3NlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQpOworCisgICAgICAgIC8vIGNoZWNrcyBhbmQgaWYgbmVjZXNzYXJ5IGNoYW5nZXMgb3V0cHV0cyB1c2VkIGZvciBhbGwgc3RyYXRlZ2llcy4KKyAgICAgICAgLy8gbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIGNvbmRpdGlvbiB0aGF0IGFmZmVjdHMgdGhlIG91dHB1dCBjaG9pY2UgZm9yIGEgZ2l2ZW4gc3RyYXRlZ3kKKyAgICAgICAgLy8gY2hhbmdlczogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZS4uLgorICAgICAgICAvLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKQorICAgICAgICB2b2lkIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSk7CisKKyAgICAgICAgLy8gU2FtZSBhcyBjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgYnV0IGZvciBhIGFsbCBzdHJhdGVnaWVzIGluIG9yZGVyIG9mIHByaW9yaXR5CisgICAgICAgIHZvaWQgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7CisKKyAgICAgICAgLy8gbWFuYWdlcyBBMkRQIG91dHB1dCBzdXNwZW5kL3Jlc3RvcmUgYWNjb3JkaW5nIHRvIHBob25lIHN0YXRlIGFuZCBCVCBTQ08gdXNhZ2UKKyAgICAgICAgdm9pZCBjaGVja0EyZHBTdXNwZW5kKCk7CisKKyAgICAgICAgLy8gc2VsZWN0cyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBkZXZpY2Ugb24gb3V0cHV0IGZvciBjdXJyZW50IHN0YXRlCisgICAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBkZXZpY2UgY2hvaWNlIGZvciBhIGdpdmVuIG91dHB1dCBpcworICAgICAgICAvLyBjaGFuZ2VkOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLCBvdXRwdXQgc3RhcnQsIG91dHB1dCBzdG9wLi4KKyAgICAgICAgLy8gc2VlIGdldERldmljZUZvclN0cmF0ZWd5KCkgZm9yIHRoZSB1c2Ugb2YgZnJvbUNhY2hlIHBhcmFtZXRlcgorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0TmV3T3V0cHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpOworCisgICAgICAgIC8vIHVwZGF0ZXMgY2FjaGUgb2YgZGV2aWNlIHVzZWQgYnkgYWxsIHN0cmF0ZWdpZXMgKG1EZXZpY2VGb3JTdHJhdGVneVtdKQorICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgZGV2aWNlIGNob2ljZSBmb3IgYSBnaXZlbiBzdHJhdGVneSBpcworICAgICAgICAvLyBjaGFuZ2VkOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLi4uCisgICAgICAgIC8vIGNhY2hlZCB2YWx1ZXMgYXJlIHVzZWQgYnkgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBpZiBwYXJhbWV0ZXIgZnJvbUNhY2hlIGlzIHRydWUuCisgICAgICAgICAvLyBNdXN0IGJlIGNhbGxlZCBhZnRlciBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQorICAgICAgICB2b2lkIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisKKyAgICAgICAgLy8gc2VsZWN0cyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBkZXZpY2Ugb24gaW5wdXQgZm9yIGN1cnJlbnQgc3RhdGUKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGdldE5ld0lucHV0RGV2aWNlKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKKworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldE1heEVmZmVjdHNDcHVMb2FkKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1FZmZlY3RzLmdldE1heEVmZmVjdHNDcHVMb2FkKCk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldE1heEVmZmVjdHNNZW1vcnkoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbUVmZmVjdHMuZ2V0TWF4RWZmZWN0c01lbW9yeSgpOworICAgICAgICB9CisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBleGl0KCk7CisgICAgICAgIGludCB0ZXN0T3V0cHV0SW5kZXgoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisKKyAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBnZXRPdXRwdXRzRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiBvcGVuT3V0cHV0cyk7CisgICAgICAgIGJvb2wgdmVjdG9yc0VxdWFsKFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMyKTsKKworICAgICAgICAvLyBtdXRlL3VubXV0ZSBzdHJhdGVnaWVzIHVzaW5nIGFuIGluY29tcGF0aWJsZSBkZXZpY2UgY29tYmluYXRpb24KKyAgICAgICAgLy8gaWYgbXV0aW5nLCB3YWl0IGZvciB0aGUgYXVkaW8gaW4gcGNtIGJ1ZmZlciB0byBiZSBkcmFpbmVkIGJlZm9yZSBwcm9jZWVkaW5nCisgICAgICAgIC8vIGlmIHVubXV0aW5nLCB1bm11dGUgb25seSBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5CisgICAgICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBtcyB3YWl0ZWQKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCAgY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcmV2RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zKTsKKworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzZWxlY3RPdXRwdXQoY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKKyAgICAgICAgLy8gc2FtcGxpbmdSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrIGFyZSBpbi9vdXQgYW5kIHNvIG1heSBiZSBtb2RpZmllZAorICAgICAgICBzcDxJT1Byb2ZpbGU+IGdldElucHV0UHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90JiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190JiBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyk7CisgICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOworCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNlbGVjdE91dHB1dEZvckVmZmVjdHMoY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyk7CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwgY29uc3Qgc3A8QXVkaW9QYXRjaD4mIHBhdGNoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbUF1ZGlvUGF0Y2hlcy5hZGRBdWRpb1BhdGNoKGhhbmRsZSwgcGF0Y2gpOworICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtQXVkaW9QYXRjaGVzLnJlbW92ZUF1ZGlvUGF0Y2goaGFuZGxlKTsKKyAgICAgICAgfQorCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaGFzUHJpbWFyeU91dHB1dCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1QcmltYXJ5T3V0cHV0LT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOworICAgICAgICB9CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFoYXNQcmltYXJ5T3V0cHV0KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKG1QcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHVwZGF0ZUNhbGxSb3V0aW5nKGF1ZGlvX2RldmljZXNfdCByeERldmljZSwgaW50IGRlbGF5TXMgPSAwKTsKKworICAgICAgICAvLyBpZiBhcmd1bWVudCAiZGV2aWNlIiBpcyBkaWZmZXJlbnQgZnJvbSBBVURJT19ERVZJQ0VfTk9ORSwgIHN0YXJ0U291cmNlKCkgd2lsbCBmb3JjZQorICAgICAgICAvLyB0aGUgcmUtZXZhbHVhdGlvbiBvZiB0aGUgb3V0cHV0IGRldmljZS4KKyAgICAgICAgc3RhdHVzX3Qgc3RhcnRTb3VyY2Uoc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRlbGF5TXMpOworICAgICAgICBzdGF0dXNfdCBzdG9wU291cmNlKHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlRGV2aWNlVXBkYXRlKTsKKworICAgICAgICB2b2lkIGNsZWFyQXVkaW9QYXRjaGVzKHVpZF90IHVpZCk7CisgICAgICAgIHZvaWQgY2xlYXJTZXNzaW9uUm91dGVzKHVpZF90IHVpZCk7CisgICAgICAgIHZvaWQgY2hlY2tTdHJhdGVneVJvdXRlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksIGF1ZGlvX2lvX2hhbmRsZV90IG91cHR1dFRvU2tpcCk7CisKKyAgICAgICAgc3RhdHVzX3QgaGFzUHJpbWFyeU91dHB1dCgpIGNvbnN0IHsgcmV0dXJuIG1QcmltYXJ5T3V0cHV0ICE9IDA7IH0KKworICAgICAgICB1aWRfdCBtVWlkQ2FjaGVkOworICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqbXBDbGllbnRJbnRlcmZhY2U7ICAvLyBhdWRpbyBwb2xpY3kgY2xpZW50IGludGVyZmFjZQorICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbVByaW1hcnlPdXRwdXQ7ICAgICAvLyBwcmltYXJ5IG91dHB1dCBkZXNjcmlwdG9yCisgICAgICAgIC8vIGxpc3Qgb2YgZGVzY3JpcHRvcnMgZm9yIG91dHB1dHMgY3VycmVudGx5IG9wZW5lZAorCisgICAgICAgIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uIG1PdXRwdXRzOworICAgICAgICAvLyBjb3B5IG9mIG1PdXRwdXRzIGJlZm9yZSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBvcGVucyBuZXcgb3V0cHV0cworICAgICAgICAvLyByZXNldCB0byBtT3V0cHV0cyB3aGVuIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkgaXMgY2FsbGVkLgorICAgICAgICBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiBtUHJldmlvdXNPdXRwdXRzOworICAgICAgICBBdWRpb0lucHV0Q29sbGVjdGlvbiBtSW5wdXRzOyAgICAgLy8gbGlzdCBvZiBpbnB1dCBkZXNjcmlwdG9ycworCisgICAgICAgIERldmljZVZlY3RvciAgbUF2YWlsYWJsZU91dHB1dERldmljZXM7IC8vIGFsbCBhdmFpbGFibGUgb3V0cHV0IGRldmljZXMKKyAgICAgICAgRGV2aWNlVmVjdG9yICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzOyAgLy8gYWxsIGF2YWlsYWJsZSBpbnB1dCBkZXZpY2VzCisKKyAgICAgICAgU2Vzc2lvblJvdXRlTWFwIG1PdXRwdXRSb3V0ZXMgPSBTZXNzaW9uUm91dGVNYXAoU2Vzc2lvblJvdXRlTWFwOjpNQVBUWVBFX09VVFBVVCk7CisgICAgICAgIFNlc3Npb25Sb3V0ZU1hcCBtSW5wdXRSb3V0ZXMgPSBTZXNzaW9uUm91dGVNYXAoU2Vzc2lvblJvdXRlTWFwOjpNQVBUWVBFX0lOUFVUKTsKKworICAgICAgICBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbiBtU3RyZWFtczsgLy8gc3RyZWFtIGRlc2NyaXB0b3JzIGZvciB2b2x1bWUgY29udHJvbAorICAgICAgICBib29sICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lOyAgICAgICAgLy8gbGltaXQgcmluZ3RvbmUgdm9sdW1lIHRvIG11c2ljIHZvbHVtZSBpZiBoZWFkc2V0IGNvbm5lY3RlZAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgbURldmljZUZvclN0cmF0ZWd5W05VTV9TVFJBVEVHSUVTXTsKKyAgICAgICAgZmxvYXQgICBtTGFzdFZvaWNlVm9sdW1lOyAgICAgICAgICAgIC8vIGxhc3Qgdm9pY2Ugdm9sdW1lIHZhbHVlIHNlbnQgdG8gYXVkaW8gSEFMCisKKyAgICAgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gbUVmZmVjdHM7ICAvLyBsaXN0IG9mIHJlZ2lzdGVyZWQgYXVkaW8gZWZmZWN0cworICAgICAgICBib29sICAgIG1BMmRwU3VzcGVuZGVkOyAgLy8gdHJ1ZSBpZiBBMkRQIG91dHB1dCBpcyBzdXNwZW5kZWQKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbURlZmF1bHRPdXRwdXREZXZpY2U7IC8vIG91dHB1dCBkZXZpY2Ugc2VsZWN0ZWQgYnkgZGVmYXVsdCBhdCBib290IHRpbWUKKyAgICAgICAgYm9vbCBtU3BlYWtlckRyY0VuYWJsZWQ7Ly8gdHJ1ZSBvbiBkZXZpY2VzIHRoYXQgdXNlIERSQyBvbiB0aGUgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIgcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBib29zdCBzb2Z0IHNvdW5kcywgdXNlZCB0byBhZGp1c3Qgdm9sdW1lIGN1cnZlcyBhY2NvcmRpbmdseQorCisgICAgICAgIEh3TW9kdWxlQ29sbGVjdGlvbiBtSHdNb2R1bGVzOworCisgICAgICAgIHZvbGF0aWxlIGludDMyX3QgbUF1ZGlvUG9ydEdlbmVyYXRpb247CisKKyAgICAgICAgQXVkaW9QYXRjaENvbGxlY3Rpb24gbUF1ZGlvUGF0Y2hlczsKKworICAgICAgICBTb3VuZFRyaWdnZXJTZXNzaW9uQ29sbGVjdGlvbiBtU291bmRUcmlnZ2VyU2Vzc2lvbnM7CisKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gbUNhbGxUeFBhdGNoOworICAgICAgICBzcDxBdWRpb1BhdGNoPiBtQ2FsbFJ4UGF0Y2g7CisKKyAgICAgICAgLy8gZm9yIHN1cHBvcnRpbmcgImJlYWNvbiIgc3RyZWFtcywgaS5lLiBzdHJlYW1zIHRoYXQgb25seSBwbGF5IG9uIHNwZWFrZXIsIGFuZCBuZXZlcgorICAgICAgICAvLyB3aGVuIHNvbWV0aGluZyBvdGhlciB0aGFuIFNUUkVBTV9UVFMgKGEuay5hLiAiVHJhbnNtaXR0ZWQgVGhyb3VnaCBTcGVha2VyIikgaXMgcGxheWluZworICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIFNUQVJUSU5HX09VVFBVVCwKKyAgICAgICAgICAgIFNUQVJUSU5HX0JFQUNPTiwKKyAgICAgICAgICAgIFNUT1BQSU5HX09VVFBVVCwKKyAgICAgICAgICAgIFNUT1BQSU5HX0JFQUNPTgorICAgICAgICB9OworICAgICAgICB1aW50MzJfdCBtQmVhY29uTXV0ZVJlZkNvdW50OyAgIC8vIHJlZiBjb3VudCBmb3Igc3RyZWFtIHRoYXQgd291bGQgbXV0ZSBiZWFjb24KKyAgICAgICAgdWludDMyX3QgbUJlYWNvblBsYXlpbmdSZWZDb3VudDsvLyByZWYgY291bnQgZm9yIHRoZSBwbGF5aW5nIGJlYWNvbiBzdHJlYW1zCisgICAgICAgIGJvb2wgbUJlYWNvbk11dGVkOyAgICAgICAgICAgICAgLy8gaGFzIFNUUkVBTV9UVFMgYmVlbiBtdXRlZAorCisgICAgICAgIEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbiBtUG9saWN5TWl4ZXM7IC8vIGxpc3Qgb2YgcmVnaXN0ZXJlZCBtaXhlcworCisjaWZkZWYgQVVESU9fUE9MSUNZX1RFU1QKKyAgICAgICAgTXV0ZXggICBtTG9jazsKKyAgICAgICAgQ29uZGl0aW9uIG1XYWl0V29ya0NWOworCisgICAgICAgIGludCAgICAgICAgICAgICBtQ3VyT3V0cHV0OworICAgICAgICBib29sICAgICAgICAgICAgbURpcmVjdE91dHB1dDsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbVRlc3RPdXRwdXRzW05VTV9URVNUX09VVFBVVFNdOworICAgICAgICBpbnQgICAgICAgICAgICAgbVRlc3RJbnB1dDsKKyAgICAgICAgdWludDMyX3QgICAgICAgIG1UZXN0RGV2aWNlOworICAgICAgICB1aW50MzJfdCAgICAgICAgbVRlc3RTYW1wbGluZ1JhdGU7CisgICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdEZvcm1hdDsKKyAgICAgICAgdWludDMyX3QgICAgICAgIG1UZXN0Q2hhbm5lbHM7CisgICAgICAgIHVpbnQzMl90ICAgICAgICBtVGVzdExhdGVuY3lNczsKKyNlbmRpZiAvL0FVRElPX1BPTElDWV9URVNUCisKKyAgICAgICAgdWludDMyX3QgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKworICAgICAgICAvLyBBdWRpbyBQb2xpY3kgRW5naW5lIEludGVyZmFjZS4KKyAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlICptRW5naW5lOworcHJpdmF0ZToKKyAgICAgICAgLy8gdXBkYXRlcyBkZXZpY2UgY2FjaGluZyBhbmQgb3V0cHV0IGZvciBzdHJlYW1zIHRoYXQgY2FuIGluZmx1ZW5jZSB0aGUKKyAgICAgICAgLy8gICAgcm91dGluZyBvZiBub3RpZmljYXRpb25zCisgICAgICAgIHZvaWQgaGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisgICAgICAgIC8vIGZpbmQgdGhlIG91dHB1dHMgb24gYSBnaXZlbiBvdXRwdXQgZGVzY3JpcHRvciB0aGF0IGhhdmUgdGhlIGdpdmVuIGFkZHJlc3MuCisgICAgICAgIC8vIHRvIGJlIGNhbGxlZCBvbiBhbiBBdWRpb091dHB1dERlc2NyaXB0b3Igd2hvc2Ugc3VwcG9ydGVkIGRldmljZXMgKGFzIGRlZmluZWQKKyAgICAgICAgLy8gICBpbiBtUHJvZmlsZS0+bVN1cHBvcnRlZERldmljZXMpIG1hdGNoZXMgdGhlIGRldmljZSB3aG9zZSBhZGRyZXNzIGlzIHRvIGJlIG1hdGNoZWQuCisgICAgICAgIC8vIHNlZSBkZXZpY2VEaXN0aW5ndWlzaGVzT25BZGRyZXNzKGF1ZGlvX2RldmljZXNfdCkgZm9yIHdoZXRoZXIgdGhlIGRldmljZSB0eXBlIGlzIG9uZQorICAgICAgICAvLyAgIHdoZXJlIGFkZHJlc3NlcyBhcmUgdXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIG9uZSBjb25uZWN0ZWQgZGV2aWNlIGFuZCBhbm90aGVyLgorICAgICAgICB2b2lkIGZpbmRJb0hhbmRsZXNCeUFkZHJlc3Moc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgLyppbiovLAorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgLyppbiovLAorICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggYWRkcmVzcyAvKmluKi8sCisgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyAvKm91dCovKTsKKyAgICAgICAgdWludDMyX3QgY3VyQXVkaW9Qb3J0R2VuZXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1BdWRpb1BvcnRHZW5lcmF0aW9uOyB9CisgICAgICAgIC8vIGludGVybmFsIG1ldGhvZCB0byByZXR1cm4gdGhlIG91dHB1dCBoYW5kbGUgZm9yIHRoZSBnaXZlbiBkZXZpY2UgYW5kIGZvcm1hdAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JEZXZpY2UoCisgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyk7CisgICAgICAgIC8vIGludGVybmFsIGZ1bmN0aW9uIHRvIGRlcml2ZSBhIHN0cmVhbSB0eXBlIHZhbHVlIGZyb20gYXVkaW8gYXR0cmlidXRlcworICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpOworICAgICAgICAvLyBldmVudCBpcyBvbmUgb2YgU1RBUlRJTkdfT1VUUFVULCBTVEFSVElOR19CRUFDT04sIFNUT1BQSU5HX09VVFBVVCwgU1RPUFBJTkdfQkVBQ09OCisgICAgICAgIC8vIHJldHVybnMgMCBpZiBubyBtdXRlL3VubXV0ZSBldmVudCBoYXBwZW5lZCwgdGhlIGxhcmdlc3QgbGF0ZW5jeSBvZiB0aGUgZGV2aWNlIHdoZXJlCisgICAgICAgIC8vICAgdGhlIG11dGUvdW5tdXRlIGhhcHBlbmVkCisgICAgICAgIHVpbnQzMl90IGhhbmRsZUV2ZW50Rm9yQmVhY29uKGludCBldmVudCk7CisgICAgICAgIHVpbnQzMl90IHNldEJlYWNvbk11dGUoYm9vbCBtdXRlKTsKKyAgICAgICAgYm9vbCAgICAgaXNWYWxpZEF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICpwYWEpOworCisgICAgICAgIC8vIHNlbGVjdCBpbnB1dCBkZXZpY2UgY29ycmVzcG9uZGluZyB0byByZXF1ZXN0ZWQgYXVkaW8gc291cmNlIGFuZCByZXR1cm4gYXNzb2NpYXRlZCBwb2xpY3kKKyAgICAgICAgLy8gbWl4IGlmIGFueS4gQ2FsbHMgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoKS4KKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCAqKnBvbGljeU1peCA9IE5VTEwpOworCisgICAgICAgIC8vIENhbGxlZCBieSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKS4KKyAgICAgICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKTsKK307CisKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIHNlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKcmVuYW1lIHRvIHNlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAppbmRleCAzZTA5MGU5Li40ODlhOWJlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcApAQCAtMjEzLDYgKzIxMywxMiBAQAogICAgIG1BdWRpb1BvbGljeVNlcnZpY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZSgKKyAgICAgICAgU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSkKK3sKKyAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShyZWdJZCwgc3RhdGUpOworfQorCiBhdWRpb191bmlxdWVfaWRfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpuZXdBdWRpb1VuaXF1ZUlkKCkKIHsKICAgICByZXR1cm4gQXVkaW9TeXN0ZW06Om5ld0F1ZGlvVW5pcXVlSWQoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5Q2xpZW50SW1wbExlZ2FjeS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbExlZ2FjeS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5Q2xpZW50SW1wbExlZ2FjeS5jcHAKcmVuYW1lIHRvIHNlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsTGVnYWN5LmNwcApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCnJlbmFtZSB0byBzZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKaW5kZXggZTZhY2UyMC4uMjgyZGRlYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKQEAgLTEwOSw4ICsxMDksOCBAQAogICAgICAgICBWZWN0b3IgPEVmZmVjdERlc2MgKj4gZWZmZWN0cyA9IG1JbnB1dFNvdXJjZXMudmFsdWVBdChpbmRleCktPm1FZmZlY3RzOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IGVmZmVjdHNbaV07Ci0gICAgICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZnggPSBuZXcgQXVkaW9FZmZlY3QoTlVMTCwgJmVmZmVjdC0+bVV1aWQsIC0xLCAwLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbiwgaW5wdXQpOworICAgICAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGZ4ID0gbmV3IEF1ZGlvRWZmZWN0KE5VTEwsIFN0cmluZzE2KCJhbmRyb2lkIiksICZlZmZlY3QtPm1VdWlkLCAtMSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBhdWRpb1Nlc3Npb24sIGlucHV0KTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGZ4LT5pbml0Q2hlY2soKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coImFkZElucHV0RWZmZWN0cygpOiBmYWlsZWQgdG8gY3JlYXRlIEZ4ICVzIG9uIHNvdXJjZSAlZCIsCkBAIC0yNTQsNyArMjU0LDcgQEAKICAgICAgICAgVmVjdG9yIDxFZmZlY3REZXNjICo+IGVmZmVjdHMgPSBtT3V0cHV0U3RyZWFtcy52YWx1ZUF0KGluZGV4KS0+bUVmZmVjdHM7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gZWZmZWN0c1tpXTsKLSAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBmeCA9IG5ldyBBdWRpb0VmZmVjdChOVUxMLCAmZWZmZWN0LT5tVXVpZCwgMCwgMCwgMCwKKyAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBmeCA9IG5ldyBBdWRpb0VmZmVjdChOVUxMLCBTdHJpbmcxNigiYW5kcm9pZCIpLCAmZWZmZWN0LT5tVXVpZCwgMCwgMCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24sIG91dHB1dCk7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmeC0+aW5pdENoZWNrKCk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lFZmZlY3RzLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUVmZmVjdHMuaApyZW5hbWUgdG8gc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcApzaW1pbGFyaXR5IGluZGV4IDg5JQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCnJlbmFtZSB0byBzZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKaW5kZXggYTQ1ZGJiMy4uY2EzNjVhNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKQEAgLTI4LDcgKzI4LDggQEAKIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC00Niw4ICs0Nyw4IEBACiAKICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsIGRldmljZV9hZGRyZXNzKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOwogfQogCiBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCkBAIC03NSwxMCArNzYsMTQgQEAKIAogICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkiKTsKIAorICAgIC8vIGFjcXVpcmUgbG9jayBiZWZvcmUgY2FsbGluZyBzZXRNb2RlKCkgc28gdGhhdCBzZXRNb2RlKCkgKyBzZXRQaG9uZVN0YXRlKCkgYXJlIGFuIGF0b21pYworICAgIC8vIG9wZXJhdGlvbiBmcm9tIHBvbGljeSBtYW5hZ2VyIHN0YW5kcG9pbnQgKG5vIG90aGVyIG9wZXJhdGlvbiAoZS5nIHRyYWNrIHN0YXJ0IG9yIHN0b3ApCisgICAgLy8gY2FuIGJlIGludGVybGVhdmVkKS4KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCiAgICAgLy8gVE9ETzogY2hlY2sgaWYgaXQgaXMgbW9yZSBhcHByb3ByaWF0ZSB0byBkbyBpdCBpbiBwbGF0Zm9ybSBzcGVjaWZpYyBwb2xpY3kgbWFuYWdlcgogICAgIEF1ZGlvU3lzdGVtOjpzZXRNb2RlKHN0YXRlKTsKIAotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0UGhvbmVTdGF0ZShzdGF0ZSk7CiAgICAgbVBob25lU3RhdGUgPSBzdGF0ZTsKICAgICByZXR1cm4gTk9fRVJST1I7CkBAIC0xNDUsMTAgKzE1MCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8pCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewpAQCAtMTU2LDggKzE2MywxNyBAQAogICAgIH0KICAgICBBTE9HVigiZ2V0T3V0cHV0KCkiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKGF0dHIsIG91dHB1dCwgc2Vzc2lvbiwgc3RyZWFtLCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncywgb2ZmbG9hZEluZm8pOworCisgICAgLy8gaWYgdGhlIGNhbGxlciBpcyB1cywgdHJ1c3QgdGhlIHNwZWNpZmllZCB1aWQKKyAgICBpZiAoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpICE9IGdldHBpZF9jYWNoZWQgfHwgdWlkID09ICh1aWRfdCktMSkgeworICAgICAgICB1aWRfdCBuZXdjbGllbnRVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgICAgIGlmICh1aWQgIT0gKHVpZF90KS0xICYmIHVpZCAhPSBuZXdjbGllbnRVaWQpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwgX19GVU5DVElPTl9fLCBuZXdjbGllbnRVaWQsIHVpZCk7CisgICAgICAgIH0KKyAgICAgICAgdWlkID0gbmV3Y2xpZW50VWlkOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0Rm9yQXR0cihhdHRyLCBvdXRwdXQsIHNlc3Npb24sIHN0cmVhbSwgdWlkLCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgb2ZmbG9hZEluZm8pOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKQEAgLTI0NiwxMCArMjYyLDEyIEBACiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTI2MCwxOSArMjc4LDI4IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgaWYgKCgoYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJiAhY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHx8Ci0gICAgICAgICgoYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9GTV9UVU5FUikgJiYgIWNhcHR1cmVGbVR1bmVyQWxsb3dlZCgpKSkgeworICAgIGlmICgoYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJiAhY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OmlucHV0X3R5cGVfdCBpbnB1dFR5cGU7CisgICAgLy8gaWYgdGhlIGNhbGxlciBpcyB1cywgdHJ1c3QgdGhlIHNwZWNpZmllZCB1aWQKKyAgICBpZiAoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpICE9IGdldHBpZF9jYWNoZWQgfHwgdWlkID09ICh1aWRfdCktMSkgeworICAgICAgICB1aWRfdCBuZXdjbGllbnRVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgICAgIGlmICh1aWQgIT0gKHVpZF90KS0xICYmIHVpZCAhPSBuZXdjbGllbnRVaWQpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwgX19GVU5DVElPTl9fLCBuZXdjbGllbnRVaWQsIHVpZCk7CisgICAgICAgIH0KKyAgICAgICAgdWlkID0gbmV3Y2xpZW50VWlkOworICAgIH0KKwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgLy8gdGhlIGF1ZGlvX2luX2Fjb3VzdGljc190IHBhcmFtZXRlciBpcyBpZ25vcmVkIGJ5IGdldF9pbnB1dCgpCi0gICAgICAgIHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmdldElucHV0Rm9yQXR0cihhdHRyLCBpbnB1dCwgc2Vzc2lvbiwKKyAgICAgICAgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0SW5wdXRGb3JBdHRyKGF0dHIsIGlucHV0LCBzZXNzaW9uLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsICZpbnB1dFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0VHlwZSk7CiAgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CiAKICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewpAQCAtMjgwLDYgKzMwNyw4IEBACiAgICAgICAgICAgICBzd2l0Y2ggKGlucHV0VHlwZSkgewogICAgICAgICAgICAgY2FzZSBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0xFR0FDWToKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9URUxFUEhPTllfUlg6CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IHVzZSB0aGUgc2FtZSBwZXJtaXNzaW9uIGFzIGZvciByZW1vdGUgc3VibWl4IGZvciBub3cuCiAgICAgICAgICAgICBjYXNlIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfTUlYX0NBUFRVUkU6CiAgICAgICAgICAgICAgICAgaWYgKCFjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKCkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImdldElucHV0Rm9yQXR0cigpIHBlcm1pc3Npb24gZGVuaWVkOiBjYXB0dXJlIG5vdCBhbGxvd2VkIik7CkBAIC01NDUsOSArNTc0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpnZW5lcmF0aW9uKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgewotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQpAQCAtNTU4LDkgKzU4NCw2IEBACiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KQEAgLTYwMSw5ICs2MjQsNiBAQAogICAgICAgICB1bnNpZ25lZCBpbnQgKmdlbmVyYXRpb24pCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZighbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CkBAIC02NjAsNCArNjgwLDI2IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpoYW5kbGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydEF1ZGlvU291cmNlKHNvdXJjZSwgYXR0cmlidXRlcywgaGFuZGxlKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wQXVkaW9Tb3VyY2UoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcEF1ZGlvU291cmNlKGhhbmRsZSk7Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZUltcGxMZWdhY3kuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGxMZWdhY3kuY3BwCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIHNlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbExlZ2FjeS5jcHAKcmVuYW1lIHRvIHNlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsTGVnYWN5LmNwcAppbmRleCBiODg0NmM2Li4xM2FmM2VmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZUltcGxMZWdhY3kuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsTGVnYWN5LmNwcApAQCAtMzMsNyArMzMsOCBAQAogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUgX191bnVzZWQpCiB7CiAgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTIzMywxMCArMjM0LDEyIEBACiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyBfX3VudXNlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgX191bnVzZWQpCiB7CiAgICAgaWYgKG1wQXVkaW9Qb2xpY3kgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTI1NCw4ICsyNTcsNyBAQAogICAgICAgICBpbnB1dFNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUM7CiAgICAgfQogCi0gICAgaWYgKCgoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmICFjYXB0dXJlSG90d29yZEFsbG93ZWQoKSkgfHwKLSAgICAgICAgKChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfRk1fVFVORVIpICYmICFjYXB0dXJlRm1UdW5lckFsbG93ZWQoKSkpIHsKKyAgICBpZiAoKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJiAhY2FwdHVyZUhvdHdvcmRBbGxvd2VkKCkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTU2NCwxMCArNTY2LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkIF9fdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbykKIHsKICAgICBpZiAoYXR0ciAhPSBOVUxMKSB7CkBAIC02MDMsNCArNjA3LDE2IEBACiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpoYW5kbGUpCit7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BBdWRpb1NvdXJjZShhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCnJlbmFtZSB0byBzZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKaW5kZXggZWI5MTE2ZC4uYzc3Y2M0NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKQEAgLTE2Niw2ICsxNjYsMTcgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKKworICAgIHVpZF90IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleSh1aWQpIDwgMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlRm9yKHVpZCktPnNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoZW5hYmxlZCk7Cit9CisKIC8vIHJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCgpIGlzIGNhbGxlZCB3aGVuIHRoZSBjbGllbnQgcHJvY2VzcyBkaWVzLgogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCh1aWRfdCB1aWQpCiB7CkBAIC0xNzcsNyArMTg4LDcgQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7Ci0gICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5jbGVhckF1ZGlvUGF0Y2hlcyh1aWQpOworICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZVJlc291cmNlc0ZvclVpZCh1aWQpOwogICAgICAgICB9CiAgICAgfQogI2VuZGlmCkBAIC0yMjIsNiArMjMzLDIxIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSkKK3sKKyAgICBBTE9HVigiQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZSglcywgJWQpIiwKKyAgICAgICAgICAgIHJlZ0lkLnN0cmluZygpLCBzdGF0ZSk7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPmR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZUNvbW1hbmQocmVnSWQsIHN0YXRlKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvT25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ob3RpZmljYXRpb25DbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKHJlZ0lkLCBzdGF0ZSk7CisgICAgfQorfQorCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmNsaWVudFNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQogewpAQCAtMjMxLDcgKzI1Nyw4IEBACiBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6Tm90aWZpY2F0aW9uQ2xpZW50KGNvbnN0IHNwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKLSAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtVWlkKHVpZCksIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQoY2xpZW50KQorICAgIDogbVNlcnZpY2Uoc2VydmljZSksIG1VaWQodWlkKSwgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudChjbGllbnQpLAorICAgICAgbUF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoZmFsc2UpCiB7CiB9CiAKQEAgLTI1MCwxOCArMjc3LDMyIEBACiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Om9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpCiB7Ci0gICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCkgeworICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgbUF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQpIHsKICAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgfQogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkKIHsKLSAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwKSB7CisgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCAmJiBtQXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZCkgewogICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAgICAgfQogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZSgKKyAgICAgICAgU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwKSB7CisgICAgICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShyZWdJZCwgc3RhdGUpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6c2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgbUF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQgPSBlbmFibGVkOworfQorCisKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKICAgICBBTE9HVygiYmluZGVyRGllZCgpICVwLCBjYWxsaW5nIHBpZCAlZCIsIHdoby51bnNhZmVfZ2V0KCksCiAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwpAQCAtNTExLDYgKzU1MiwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IGFmLT5zZXRBdWRpb1BvcnRDb25maWcoJmRhdGEtPm1Db25maWcpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBEWU5fUE9MSUNZX01JWF9TVEFURV9VUERBVEU6IHsKKyAgICAgICAgICAgICAgICAgICAgRHluUG9saWN5TWl4U3RhdGVVcGRhdGVEYXRhICpkYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRHluUG9saWN5TWl4U3RhdGVVcGRhdGVEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgICAgICAgICAvLyMjI0FMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIGR5biBwb2xpY3kgbWl4IHN0YXRlIHVwZGF0ZSIpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBkeW4gcG9saWN5IG1peCBzdGF0ZSB1cGRhdGUgJXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1SZWdJZC5zdHJpbmcoKSwgZGF0YS0+bVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBzdmMtPmRvT25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoZGF0YS0+bVJlZ0lkLCBkYXRhLT5tU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHVua25vd24gY29tbWFuZCAlZCIsIGNvbW1hbmQtPm1Db21tYW5kKTsKICAgICAgICAgICAgICAgICB9CkBAIC01MjIsMjIgKzU3NywyOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHdhaXRUaW1lID0gSU5UNjRfTUFYOworICAgICAgICAgICAgICAgIC8vIHJlbGVhc2UgbUxvY2sgYmVmb3JlIHJlbGVhc2luZyBzdHJvbmcgcmVmZXJlbmNlIG9uIHRoZSBzZXJ2aWNlIGFzCisgICAgICAgICAgICAgICAgLy8gQXVkaW9Qb2xpY3lTZXJ2aWNlIGRlc3RydWN0b3IgY2FsbHMgQXVkaW9Db21tYW5kVGhyZWFkOjpleGl0KCkgd2hpY2gKKyAgICAgICAgICAgICAgICAvLyBhY3F1aXJlcyBtTG9jay4KKyAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBzdmMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHdhaXRUaW1lID0gbUF1ZGlvQ29tbWFuZHNbMF0tPm1UaW1lIC0gY3VyVGltZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAvLyByZWxlYXNlIG1Mb2NrIGJlZm9yZSByZWxlYXNpbmcgc3Ryb25nIHJlZmVyZW5jZSBvbiB0aGUgc2VydmljZSBhcwotICAgICAgICAvLyBBdWRpb1BvbGljeVNlcnZpY2UgZGVzdHJ1Y3RvciBjYWxscyBBdWRpb0NvbW1hbmRUaHJlYWQ6OmV4aXQoKSB3aGljaCBhY3F1aXJlcyBtTG9jay4KLSAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIHN2Yy5jbGVhcigpOwotICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgIGlmICghZXhpdFBlbmRpbmcoKSAmJiBtQXVkaW9Db21tYW5kcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIC8vIHJlbGVhc2UgZGVsYXllZCBjb21tYW5kcyB3YWtlIGxvY2sKKworICAgICAgICAvLyByZWxlYXNlIGRlbGF5ZWQgY29tbWFuZHMgd2FrZSBsb2NrIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eQorICAgICAgICBpZiAobUF1ZGlvQ29tbWFuZHMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICByZWxlYXNlX3dha2VfbG9jayhtTmFtZS5zdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBdCB0aGlzIHN0YWdlIHdlIGhhdmUgZWl0aGVyIGFuIGVtcHR5IGNvbW1hbmQgcXVldWUgb3IgdGhlIGZpcnN0IGNvbW1hbmQgaW4gdGhlIHF1ZXVlCisgICAgICAgIC8vIGhhcyBhIGZpbml0ZSBkZWxheS4gU28gdW5sZXNzIHdlIGFyZSBleGl0aW5nIGl0IGlzIHNhZmUgdG8gd2FpdC4KKyAgICAgICAgaWYgKCFleGl0UGVuZGluZygpKSB7CiAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgZ29pbmcgdG8gc2xlZXAiKTsKICAgICAgICAgICAgIG1XYWl0V29ya0NWLndhaXRSZWxhdGl2ZShtTG9jaywgd2FpdFRpbWUpOwotICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHdha2luZyB1cCIpOwogICAgICAgICB9CiAgICAgfQogICAgIC8vIHJlbGVhc2UgZGVsYXllZCBjb21tYW5kcyB3YWtlIGxvY2sgYmVmb3JlIHF1aXR0aW5nCkBAIC03NDcsNiArODA4LDIwIEBACiAgICAgcmV0dXJuIHNlbmRDb21tYW5kKGNvbW1hbmQsIGRlbGF5TXMpOwogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpkeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGVDb21tYW5kKAorICAgICAgICBTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IERZTl9QT0xJQ1lfTUlYX1NUQVRFX1VQREFURTsKKyAgICBEeW5Qb2xpY3lNaXhTdGF0ZVVwZGF0ZURhdGEgKmRhdGEgPSBuZXcgRHluUG9saWN5TWl4U3RhdGVVcGRhdGVEYXRhKCk7CisgICAgZGF0YS0+bVJlZ0lkID0gcmVnSWQ7CisgICAgZGF0YS0+bVN0YXRlID0gc3RhdGU7CisgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgc2VuZGluZyBkeW5hbWljIHBvbGljeSBtaXggKGlkPSVzKSBzdGF0ZSB1cGRhdGUgdG8gJWQiLAorICAgICAgICAgICAgcmVnSWQuc3RyaW5nKCksIHN0YXRlKTsKKyAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnNlbmRDb21tYW5kKHNwPEF1ZGlvQ29tbWFuZD4mIGNvbW1hbmQsIGludCBkZWxheU1zKQogewogICAgIHsKQEAgLTg2MSw2ICs5MzYsNyBAQAogICAgICAgICAgICAgICAgIHBhdGNoMiA9ICgoQ3JlYXRlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kMi0+bVBhcmFtLmdldCgpKS0+bVBhdGNoOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBoYW5kbGUyID0gKChSZWxlYXNlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kMi0+bVBhcmFtLmdldCgpKS0+bUhhbmRsZTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJnBhdGNoMiwgMCwgc2l6ZW9mKHBhdGNoMikpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGhhbmRsZSAhPSBoYW5kbGUyKSBicmVhazsKICAgICAgICAgICAgIC8qIEZpbHRlciBDUkVBVEVfQVVESU9fUEFUQ0ggY29tbWFuZHMgb25seSB3aGVuIHRoZXkgYXJlIGlzc3VlZCBmb3IKQEAgLTg4OCw2ICs5NjQsMTAgQEAKICAgICAgICAgICAgIGRlbGF5TXMgPSAxOwogICAgICAgICB9IGJyZWFrOwogCisgICAgICAgIGNhc2UgRFlOX1BPTElDWV9NSVhfU1RBVEVfVVBEQVRFOiB7CisKKyAgICAgICAgfSBicmVhazsKKwogICAgICAgICBjYXNlIFNUQVJUX1RPTkU6CiAgICAgICAgIGNhc2UgU1RPUF9UT05FOgogICAgICAgICBkZWZhdWx0OgpAQCAtOTI5LDYgKzEwMDksOCBAQAogICAgICAgICByZXF1ZXN0RXhpdCgpOwogICAgICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKICAgICB9CisgICAgLy8gTm90ZSB0aGF0IHdlIGNhbiBjYWxsIGl0IGZyb20gdGhlIHRocmVhZCBsb29wIGlmIGFsbCBvdGhlciByZWZlcmVuY2VzIGhhdmUgYmVlbiByZWxlYXNlZAorICAgIC8vIGJ1dCBpdCB3aWxsIHNhZmVseSByZXR1cm4gV09VTERfQkxPQ0sgaW4gdGhpcyBjYXNlCiAgICAgcmVxdWVzdEV4aXRBbmRXYWl0KCk7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5U2VydmljZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaApzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSBzZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeVNlcnZpY2UuaApyZW5hbWUgdG8gc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaAppbmRleCA4MDI4NGE0Li5hMGQ1YWEyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0zNSw3ICszNSw3IEBACiAjaW5jbHVkZSA8aGFyZHdhcmVfbGVnYWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmg+CiAjZW5kaWYKICNpbmNsdWRlICJBdWRpb1BvbGljeUVmZmVjdHMuaCIKLSNpbmNsdWRlICJBdWRpb1BvbGljeU1hbmFnZXIuaCIKKyNpbmNsdWRlICJtYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaCIKIAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC02MSw3ICs2MSw4IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpOwogICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKQEAgLTc5LDEwICs4MCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKQEAgLTk2LDEwICs5OSwxMiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKQEAgLTE4MCw2ICsxODUsOCBAQAogCiAgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyQ2xpZW50KGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+JiBjbGllbnQpOwogCisgICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSk7CkBAIC0xOTAsNiArMTk3LDExIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyUG9saWN5TWl4ZXMoVmVjdG9yPEF1ZGlvTWl4PiBtaXhlcywgYm9vbCByZWdpc3RyYXRpb24pOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpoYW5kbGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSk7CisKICAgICAgICAgICAgIHN0YXR1c190IGRvU3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwpAQCAtMjExLDYgKzIyMyw5IEBACiAgICAgICAgICAgICB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKICAgICAgICAgICAgIHZvaWQgZG9PbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAKKyAgICAgICAgICAgIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CisgICAgICAgICAgICB2b2lkIGRvT25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CisKIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeVNlcnZpY2UoKSBBTkRST0lEX0FQSTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5BdWRpb1BvbGljeVNlcnZpY2UoKTsKQEAgLTI0MSw2ICsyNTYsNyBAQAogICAgICAgICAgICAgVVBEQVRFX0FVRElPUE9SVF9MSVNULAogICAgICAgICAgICAgVVBEQVRFX0FVRElPUEFUQ0hfTElTVCwKICAgICAgICAgICAgIFNFVF9BVURJT1BPUlRfQ09ORklHLAorICAgICAgICAgICAgRFlOX1BPTElDWV9NSVhfU1RBVEVfVVBEQVRFCiAgICAgICAgIH07CiAKICAgICAgICAgQXVkaW9Db21tYW5kVGhyZWFkIChTdHJpbmc4IG5hbWUsIGNvbnN0IHdwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UpOwpAQCAtMjc4LDYgKzI5NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHVwZGF0ZUF1ZGlvUGF0Y2hMaXN0Q29tbWFuZCgpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRBdWRpb1BvcnRDb25maWdDb21tYW5kKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlQ29tbWFuZChTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaW5zZXJ0Q29tbWFuZF9sKEF1ZGlvQ29tbWFuZCAqY29tbWFuZCwgaW50IGRlbGF5TXMgPSAwKTsKIAogICAgIHByaXZhdGU6CkBAIC0zNjIsNiArMzc5LDEyIEBACiAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbUNvbmZpZzsKICAgICAgICAgfTsKIAorICAgICAgICBjbGFzcyBEeW5Qb2xpY3lNaXhTdGF0ZVVwZGF0ZURhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIFN0cmluZzggbVJlZ0lkOworICAgICAgICAgICAgaW50MzJfdCBtU3RhdGU7CisgICAgICAgIH07CisKICAgICAgICAgTXV0ZXggICBtTG9jazsKICAgICAgICAgQ29uZGl0aW9uIG1XYWl0V29ya0NWOwogICAgICAgICBWZWN0b3IgPCBzcDxBdWRpb0NvbW1hbmQ+ID4gbUF1ZGlvQ29tbWFuZHM7IC8vIGxpc3Qgb2YgcGVuZGluZyBjb21tYW5kcwpAQCAtNDY3LDYgKzQ5MCw3IEBACiAKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CiAKICAgICAgICAgdmlydHVhbCBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKCk7CiAKQEAgLTQ4Miw4ICs1MDYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCk7CiAgICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgfk5vdGlmaWNhdGlvbkNsaWVudCgpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgc2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpOwogCiAgICAgICAgICAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQKICAgICAgICAgICAgICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOwpAQCAtNDk1LDYgKzUyMSw3IEBACiAgICAgICAgIGNvbnN0IHdwPEF1ZGlvUG9saWN5U2VydmljZT4gICAgICAgIG1TZXJ2aWNlOwogICAgICAgICBjb25zdCB1aWRfdCAgICAgICAgICAgICAgICAgICAgICAgICBtVWlkOwogICAgICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OworICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZDsKICAgICB9OwogCiAgICAgLy8gSW50ZXJuYWwgZHVtcCB1dGlsaXRpZXMuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS91dGlsaXRpZXMvY29udmVydC9jb252ZXJ0LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS91dGlsaXRpZXMvY29udmVydC9jb252ZXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgwYjVkNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3V0aWxpdGllcy9jb252ZXJ0L2NvbnZlcnQuaApAQCAtMCwwICsxLDM4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxjbWF0aD4KKworbmFtZXNwYWNlIGFuZHJvaWQKK3sKKworbmFtZXNwYWNlIHV0aWxpdGllcworeworCisvKioKKyAqIENvbnZlcnQgYSBnaXZlbiBzb3VyY2UgdHlwZSB0byBhIGdpdmVuIGRlc3RpbmF0aW9uIHR5cGUuCisgKgorICogU3RyaW5nIGNvbnZlcnNpb24gdG8gVCByZWFkcyB0aGUgdmFsdWUgb2YgdGhlIHR5cGUgVCBpbiB0aGUgZ2l2ZW4gc3RyaW5nLgorICogVGhlIGZ1bmN0aW9uIGRvZXMgbm90IGFsbG93IHRvIGhhdmUgd2hpdGUgc3BhY2VzIGFyb3VuZCB0aGUgdmFsdWUgdG8gcGFyc2UKKyAqIGFuZCB0cmllcyB0byBwYXJzZSB0aGUgd2hvbGUgc3RyaW5nLCB3aGljaCBtZWFucyB0aGF0IGlmIHNvbWUgYnl0ZXMgd2VyZSBub3QKKyAqIHJlYWQgaW4gdGhlIHN0cmluZywgdGhlIGZ1bmN0aW9uIGZhaWxzLgorICogSGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24gKGllLiBudW1iZXJzIHN0YXJ0aW5nIHdpdGggMHgpIGlzIHN1cHBvcnRlZCBvbmx5CisgKiBmb3IgaW50ZWdyYWwgdHlwZXMgY29udmVyc2lvbnMuCisgKgorICogTnVtZXJpYyBjb252ZXJzaW9uIHRvIHN0cmluZyBmb3JtYXRzIHRoZSBzb3VyY2UgdmFsdWUgdG8gZGVjaW1hbCBzcGFjZS4KKyAqCisgKiBWZWN0b3IgdG8gdmVjdG9yIGNvbnZlcnNpb24gY2FsbHMgY29udmVydFRvIG9uIGVhY2ggZWxlbWVudC4KKyAqCisgKiBAdHBhcmFtIHNyY1R5cGUgc291cmNlIHR5cGUsIGRlZmF1bHQgdmFsdWUgaXMgc3RyaW5nIHR5cGUKKyAqIEB0cGFyYW0gZHN0VHlwZSBkZXN0aW5hdGlvbiB0eXBlCisgKiBAcGFyYW1baW5dIGlucHV0IFRoZSBzb3VyY2UgdG8gY29udmVydCBmcm9tLgorICogQHBhcmFtW291dF0gcmVzdWx0IENvbnZlcnRlZCB2YWx1ZSBpZiBzdWNjZXNzLCB1bmRlZmluZWQgb24gZmFpbHVyZS4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgY29udmVyc2lvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgc3JjVHlwZSwgdHlwZW5hbWUgZHN0VHlwZT4KK3N0YXRpYyBpbmxpbmUgYm9vbCBjb252ZXJ0VG8oY29uc3Qgc3JjVHlwZSAmaW5wdXQsIGRzdFR5cGUgJnJlc3VsdCk7CisKKy8qIGRldGFpbHMgbmFtZXNwYWNlIGlzIGhlcmUgdG8gaGlkZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIHRvIGhlYWRlciBlbmQgdXNlci4gSXQKKyAqIGlzIE5PVCBpbnRlbmRlZCB0byBiZSB1c2VkIG91dHNpZGUuICovCituYW1lc3BhY2UgZGV0YWlscworeworCisvKiogSGVscGVyIGNsYXNzIHRvIGxpbWl0IGluc3RhbnRpYXRpb24gb2YgdGVtcGxhdGVzICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBDb252ZXJzaW9uRnJvbVN0cmluZ0FsbG93ZWQ7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBDb252ZXJzaW9uVG9TdHJpbmdBbGxvd2VkOworCisvKiBMaXN0IG9mIGFsbG93ZWQgdHlwZXMgZm9yIGNvbnZlcnNpb24gKi8KK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ29udmVyc2lvbkZyb21TdHJpbmdBbGxvd2VkPGJvb2w+IHt9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBDb252ZXJzaW9uRnJvbVN0cmluZ0FsbG93ZWQ8dWludDY0X3Q+IHt9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBDb252ZXJzaW9uRnJvbVN0cmluZ0FsbG93ZWQ8aW50NjRfdD4ge307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IENvbnZlcnNpb25Gcm9tU3RyaW5nQWxsb3dlZDx1aW50MzJfdD4ge307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IENvbnZlcnNpb25Gcm9tU3RyaW5nQWxsb3dlZDxpbnQzMl90PiB7fTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ29udmVyc2lvbkZyb21TdHJpbmdBbGxvd2VkPHVpbnQxNl90PiB7fTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ29udmVyc2lvbkZyb21TdHJpbmdBbGxvd2VkPGludDE2X3Q+IHt9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBDb252ZXJzaW9uRnJvbVN0cmluZ0FsbG93ZWQ8ZmxvYXQ+IHt9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBDb252ZXJzaW9uRnJvbVN0cmluZ0FsbG93ZWQ8ZG91YmxlPiB7fTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBDb252ZXJzaW9uVG9TdHJpbmdBbGxvd2VkPGludDY0X3Q+IHt9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBDb252ZXJzaW9uVG9TdHJpbmdBbGxvd2VkPHVpbnQ2NF90PiB7fTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ29udmVyc2lvblRvU3RyaW5nQWxsb3dlZDx1aW50MzJfdD4ge307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IENvbnZlcnNpb25Ub1N0cmluZ0FsbG93ZWQ8aW50MzJfdD4ge307Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IENvbnZlcnNpb25Ub1N0cmluZ0FsbG93ZWQ8ZG91YmxlPiB7fTsKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ29udmVyc2lvblRvU3RyaW5nQWxsb3dlZDxmbG9hdD4ge307CisKKy8qKgorICogU2V0IHRoZSBkZWNpbWFsIHByZWNpc2lvbiB0byAxMCBkaWdpdHMuCisgKiBOb3RlIHRoYXQgdGhpcyBzZXR0aW5nIGlzIGFsaWduZWQgd2l0aCBBbmRyb2lkIEF1ZGlvIFBhcmFtZXRlcgorICogcG9saWN5IGNvbmNlcm5pbmcgZmxvYXQgc3RvcmFnZSBpbnRvIHN0cmluZy4KKyAqLworc3RhdGljIGNvbnN0IHVpbnQzMl90IGdGbG9hdFByZWNpc2lvbiA9IDEwOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBpbmxpbmUgYm9vbCBmcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIFQgJnJlc3VsdCkKK3sKKyAgICAvKiBDaGVjayB0aGF0IGNvbnZlcnNpb24gdG8gdGhhdCB0eXBlIGlzIGFsbG93ZWQuCisgICAgICogSWYgdGhpcyBmYWlscywgdGhpcyBtZWFucyB0aGF0IHRoaXMgdGVtcGxhdGUgd2FzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkCisgICAgICogd2l0aCB0aGlzIHR5cGUsIHRodXMgdGhhdCB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZC4gKi8KKyAgICBDb252ZXJzaW9uRnJvbVN0cmluZ0FsbG93ZWQ8VD4oKTsKKworICAgIGlmIChzdHIuZmluZF9maXJzdF9vZihzdGQ6OnN0cmluZygiXHJcblx0XHYgIikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBmb3IgYSAnLScgaW4gc3RyaW5nLiBJZiB0eXBlIGlzIHVuc2lnbmVkIGFuZCBhIC0gaXMgZm91bmQsIHRoZQorICAgICAqIHBhcnNpbmcgZmFpbHMuIFRoaXMgaXMgbWFkZSBuZWNlc3NhcnkgYmVjYXVzZSAiLTEiIGlzIHJlYWQgYXMgNjU1MzUgZm9yCisgICAgICogdWludDE2X3QsIGZvciBleGFtcGxlICovCisgICAgaWYgKHN0ci5maW5kKCItIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MKKyAgICAgICAgJiYgIXN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3Moc3RyKTsKKworICAgIC8qIFNhZGx5LCB0aGUgc3RyZWFtIGNvbnZlcnNpb24gZG9lcyBub3QgaGFuZGxlIGhleGFkZWNpbWFsIGZvcm1hdCwgdGh1cworICAgICAqIGNoZWNrIGlzIGRvbmUgbWFudWFsbHkgKi8KKyAgICBpZiAoc3RyLnN1YnN0cigwLCAyKSA9PSAiMHgiKSB7CisgICAgICAgIGlmIChzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19pbnRlZ2VyKSB7CisgICAgICAgICAgICBzcyA+PiBzdGQ6OmhleCA+PiByZXN1bHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBDb252ZXJzaW9uIHVuZGVmaW5lZCBmb3Igbm9uIGludGVnZXJzICovCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzcyA+PiByZXN1bHQ7CisgICAgfQorCisgICAgcmV0dXJuIHNzLmVvZigpICYmICFzcy5mYWlsKCkgJiYgIXNzLmJhZCgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBpbmxpbmUgYm9vbCB0b1N0cmluZyhjb25zdCBUICZ2YWx1ZSwgc3RkOjpzdHJpbmcgJnN0cikKK3sKKyAgICAvKiBDaGVjayB0aGF0IGNvbnZlcnNpb24gZnJvbSB0aGF0IHR5cGUgaXMgYWxsb3dlZC4KKyAgICAgKiBJZiB0aGlzIGZhaWxzLCB0aGlzIG1lYW5zIHRoYXQgdGhpcyB0ZW1wbGF0ZSB3YXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQKKyAgICAgKiB3aXRoIHRoaXMgdHlwZSwgdGh1cyB0aGF0IHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLiAqLworICAgIENvbnZlcnNpb25Ub1N0cmluZ0FsbG93ZWQ8VD4oKTsKKworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIG9zczsKKyAgICBvc3MucHJlY2lzaW9uKGdGbG9hdFByZWNpc2lvbik7CisgICAgb3NzIDw8IHZhbHVlOworICAgIHN0ciA9IG9zcy5zdHIoKTsKKyAgICByZXR1cm4gIW9zcy5mYWlsKCkgJiYgIW9zcy5iYWQoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIHNyY1R5cGUsIHR5cGVuYW1lIGRzdFR5cGU+CitjbGFzcyBDb252ZXJ0ZXI7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBkc3RUeXBlPgorY2xhc3MgQ29udmVydGVyPHN0ZDo6c3RyaW5nLCBkc3RUeXBlPgoreworcHVibGljOgorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBydW4oY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgZHN0VHlwZSAmcmVzdWx0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZyb21TdHJpbmc8ZHN0VHlwZT4oc3RyLCByZXN1bHQpOworICAgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBzcmNUeXBlPgorY2xhc3MgQ29udmVydGVyPHNyY1R5cGUsIHN0ZDo6c3RyaW5nPgoreworcHVibGljOgorICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBydW4oY29uc3Qgc3JjVHlwZSAmc3RyLCBzdGQ6OnN0cmluZyAmcmVzdWx0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nPHNyY1R5cGU+KHN0ciwgcmVzdWx0KTsKKyAgICB9Cit9OworCisvKiogQ29udmVydCBhIHZlY3RvciBieSBhcHBseWluZyBjb252ZXJ0VG8gb24gZWFjaCBlbGVtZW50LgorICoKKyAqIEB0cGFyYW0gU3JjRWxlbSBUeXBlIG9mIHRoZSBzcmMgZWxlbWVudHMuCisgKiBAdHBhcmFtIERzdEVsZW0gVHlwZSBvZiB0aGUgZGVzdGluYXRpb24gZWxlbWVudHMuCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTcmNFbGVtLCB0eXBlbmFtZSBEc3RFbGVtPgorY2xhc3MgQ29udmVydGVyPHN0ZDo6dmVjdG9yPFNyY0VsZW0+LCBzdGQ6OnZlY3RvcjxEc3RFbGVtPiA+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiBjb25zdCBzdGQ6OnZlY3RvcjxTcmNFbGVtPiBTcmM7CisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxEc3RFbGVtPiBEc3Q7CisKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgcnVuKFNyYyAmc3JjLCBEc3QgJmRzdCkKKyAgICB7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgU3JjOjpjb25zdF9pdGVyYXRvciBTcmNJdDsKKyAgICAgICAgZHN0LmNsZWFyKCk7CisgICAgICAgIGRzdC5yZXNlcnZlKHNyYy5zaXplKCkpOworICAgICAgICBmb3IgKFNyY0l0IGl0ID0gc3JjLmJlZ2luKCk7IGl0ICE9IHNyYy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgRHN0RWxlbSBkc3RFbGVtOworICAgICAgICAgICAgaWYgKG5vdCBjb252ZXJ0VG8oKml0LCBkc3RFbGVtKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdC5wdXNoX2JhY2soZHN0RWxlbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgZGV0YWlscworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgc3JjVHlwZSwgdHlwZW5hbWUgZHN0VHlwZT4KK3N0YXRpYyBpbmxpbmUgYm9vbCBjb252ZXJ0VG8oY29uc3Qgc3JjVHlwZSAmaW5wdXQsIGRzdFR5cGUgJnJlc3VsdCkKK3sKKyAgICByZXR1cm4gZGV0YWlsczo6Q29udmVydGVyPHNyY1R5cGUsIGRzdFR5cGU+OjpydW4oaW5wdXQsIHJlc3VsdCk7Cit9CisKKy8qKgorICogU3BlY2lhbGl6YXRpb24gZm9yIGludDE2X3Qgb2YgY29udmVydFRvIHRlbXBsYXRlIGZ1bmN0aW9uLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc2FtZSBwYXJhZGlnbSB0aGFuIGl0J3MgZ2VuZXJpYyB2ZXJzaW9uLgorICoKKyAqIFRoZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBpcyBtYWRlIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBzdGxwb3J0IHZlcnNpb24gb2YKKyAqIHN0cmluZyBzdHJlYW1zIGlzIGJ1Z2dlZCBhbmQgZG9lcyBub3QgZmFpbCB3aGVuIGdpdmluZyBvdmVyZmxvd2VkIHZhbHVlcy4KKyAqIFRoaXMgc3BlY2lhbGlzYXRpb24gY2FuIGJlIHNhZmVseSByZW1vdmVkIHdoZW4gc3RscG9ydCBiZWhhdmlvdXIgaXMgZml4ZWQuCisgKgorICogQHBhcmFtW2luXSAgc3RyICAgIHRoZSBzdHJpbmcgdG8gcGFyc2UuCisgKiBAcGFyYW1bb3V0XSByZXN1bHQgcmVmZXJlbmNlIHRvIG9iamVjdCB3aGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0LgorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiBjb252ZXJzaW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBjb252ZXJ0VG88c3RkOjpzdHJpbmcsIGludDE2X3Q+KGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIGludDE2X3QgJnJlc3VsdCkKK3sKKyAgICBpbnQ2NF90IHJlczsKKworICAgIGlmICghY29udmVydFRvPHN0ZDo6c3RyaW5nLCBpbnQ2NF90PihzdHIsIHJlcykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChyZXMgPiBzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptYXgoKSB8fCByZXMgPCBzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptaW4oKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8aW50MTZfdD4ocmVzKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBTcGVjaWFsaXphdGlvbiBmb3IgZmxvYXQgb2YgY29udmVydFRvIHRlbXBsYXRlIGZ1bmN0aW9uLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc2FtZSBwYXJhZGlnbSB0aGFuIGl0J3MgZ2VuZXJpYyB2ZXJzaW9uIGFuZCBpcworICogYmFzZWQgb24gaXQgYnV0IG1ha2VzIGZ1cnRoZXJzIGNoZWNrcyBvbiB0aGUgcmV0dXJuZWQgdmFsdWUuCisgKgorICogVGhlIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIGlzIG1hZGUgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIHN0bHBvcnQgY29udmVyc2lvbgorICogZnJvbSBzdHJpbmcgdG8gZmxvYXQgYmVoYXZlcyBkaWZmZXJlbnRseSB0aGFuIEdOVSBTVEw6IG92ZXJmbG93IHByb2R1Y2UKKyAqICsvLUluZmluaXR5IHJhdGhlciB0aGFuIGFuIGVycm9yLgorICoKKyAqIEBwYXJhbVtpbl0gIHN0ciAgICB0aGUgc3RyaW5nIHRvIHBhcnNlLgorICogQHBhcmFtW291dF0gcmVzdWx0IHJlZmVyZW5jZSB0byBvYmplY3Qgd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdC4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgY29udmVyc2lvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgY29udmVydFRvPHN0ZDo6c3RyaW5nLCBmbG9hdD4oY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgZmxvYXQgJnJlc3VsdCkKK3sKKyAgICBpZiAoIWRldGFpbHM6OkNvbnZlcnRlcjxzdGQ6OnN0cmluZywgZmxvYXQ+OjpydW4oc3RyLCByZXN1bHQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoc3RkOjphYnMocmVzdWx0KSA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKSB8fAorICAgICAgICByZXN1bHQgPT0gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OnF1aWV0X05hTigpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBTcGVjaWFsaXphdGlvbiBmb3IgZG91YmxlIG9mIGNvbnZlcnRUbyB0ZW1wbGF0ZSBmdW5jdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNhbWUgcGFyYWRpZ20gdGhhbiBpdCdzIGdlbmVyaWMgdmVyc2lvbiBhbmQgaXMKKyAqIGJhc2VkIG9uIGl0IGJ1dCBtYWtlcyBmdXJ0aGVycyBjaGVja3Mgb24gdGhlIHJldHVybmVkIHZhbHVlLgorICoKKyAqIFRoZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBpcyBtYWRlIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBzdGxwb3J0IGNvbnZlcnNpb24KKyAqIGZyb20gc3RyaW5nIHRvIGRvdWJsZSBiZWhhdmVzIGRpZmZlcmVudGx5IHRoYW4gR05VIFNUTDogb3ZlcmZsb3cgcHJvZHVjZQorICogKy8tSW5maW5pdHkgcmF0aGVyIHRoYW4gYW4gZXJyb3IuCisgKgorICogQHBhcmFtW2luXSAgc3RyICAgIHRoZSBzdHJpbmcgdG8gcGFyc2UuCisgKiBAcGFyYW1bb3V0XSByZXN1bHQgcmVmZXJlbmNlIHRvIG9iamVjdCB3aGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0LgorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiBjb252ZXJzaW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBjb252ZXJ0VG88c3RkOjpzdHJpbmcsIGRvdWJsZT4oY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgZG91YmxlICZyZXN1bHQpCit7CisgICAgaWYgKCFkZXRhaWxzOjpDb252ZXJ0ZXI8c3RkOjpzdHJpbmcsIGRvdWJsZT46OnJ1bihzdHIsIHJlc3VsdCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChzdGQ6OmFicyhyZXN1bHQpID09IHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSB8fAorICAgICAgICByZXN1bHQgPT0gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpxdWlldF9OYU4oKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogU3BlY2lhbGl6YXRpb24gZm9yIGJvb2xlYW4gb2YgY29udmVydFRvIHRlbXBsYXRlIGZ1bmN0aW9uLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZm9sbG93cyB0aGUgc2FtZSBwYXJhZGlnbSB0aGFuIGl0J3MgZ2VuZXJpYyB2ZXJzaW9uLgorICogVGhpcyBmdW5jdGlvbiBhY2NlcHRzIHRvIHBhcnNlIGJvb2xlYW4gYXMgIjAvMSIgb3IgImZhbHNlL3RydWUiIG9yCisgKiAiRkFMU0UvVFJVRSIuCisgKiBUaGUgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gaXMgbWFkZSBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgYmVoYXZpb3VyIG9mCisgKiBzdHJpbmcgc3RyZWFtcyB3aGVuIHBhcnNpbmcgYm9vbGVhbiB2YWx1ZXMgaXMgbm90IHN1ZmZpY2llbnQgdG8gZml0IG91cgorICogcmVxdWlyZW1lbnRzLiBJbmRlZWQsIHBhcnNpbmcgInRydWUiIHdpbGwgY29ycmVjdGx5IHBhcnNlIHRoZSB2YWx1ZSwgYnV0IHRoZQorICogZW5kIG9mIHN0cmVhbSBpcyBub3QgcmVhY2hlZCB3aGljaCBtYWtlcyB0aGUgc3MuZW9mKCkgZmFpbHMgaW4gdGhlIGdlbmVyaWMKKyAqIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBwYXJhbVtpbl0gIHN0ciAgICB0aGUgc3RyaW5nIHRvIHBhcnNlLgorICogQHBhcmFtW291dF0gcmVzdWx0IHJlZmVyZW5jZSB0byBvYmplY3Qgd2hlcmUgdG8gc3RvcmUgdGhlIHJlc3VsdC4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgY29udmVyc2lvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCit0ZW1wbGF0ZSA8PgoraW5saW5lIGJvb2wgY29udmVydFRvPHN0ZDo6c3RyaW5nLCBib29sPihjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBib29sICZyZXN1bHQpCit7CisgICAgaWYgKHN0ciA9PSAiMCIgfHwgc3RyID09ICJGQUxTRSIgfHwgc3RyID09ICJmYWxzZSIpIHsKKyAgICAgICAgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChzdHIgPT0gIjEiIHx8IHN0ciA9PSAiVFJVRSIgfHwgc3RyID09ICJ0cnVlIikgeworICAgICAgICByZXN1bHQgPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogU3BlY2lhbGl6YXRpb24gZm9yIGJvb2xlYW4gdG8gc3RyaW5nIG9mIGNvbnZlcnRUbyB0ZW1wbGF0ZSBmdW5jdGlvbi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZvbGxvd3MgdGhlIHNhbWUgcGFyYWRpZ20gdGhhbiBpdCdzIGdlbmVyaWMgdmVyc2lvbi4KKyAqIFRoaXMgZnVuY3Rpb24gYXJiaXRyYXJpbHkgZGVjaWRlcyB0byByZXR1cm4gImZhbHNlL3RydWUiLgorICogSXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBzcGVjaWFsaXphdGlvbiBmcm9tIHN0cmluZyB0byBib29sZWFuLgorICoKKyAqIEBwYXJhbVtpbl0gIGlzU2V0ICBib29sZWFuIHRvIGNvbnZlcnQgdG8gYSBzdHJpbmcuCisgKiBAcGFyYW1bb3V0XSByZXN1bHQgcmVmZXJlbmNlIHRvIG9iamVjdCB3aGVyZSB0byBzdG9yZSB0aGUgcmVzdWx0LgorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiBjb252ZXJzaW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK3RlbXBsYXRlIDw+CitpbmxpbmUgYm9vbCBjb252ZXJ0VG88Ym9vbCwgc3RkOjpzdHJpbmc+KGNvbnN0IGJvb2wgJmlzU2V0LCBzdGQ6OnN0cmluZyAmcmVzdWx0KQoreworICAgIHJlc3VsdCA9IGlzU2V0ID8gInRydWUiIDogImZhbHNlIjsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBTcGVjaWFsaXphdGlvbiBmb3Igc3RyaW5nIHRvIHN0cmluZyBvZiBjb252ZXJ0VG8gdGVtcGxhdGUgZnVuY3Rpb24uCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBhIGR1bW15IGNvbnZlcnNpb24gZnJvbSBzdHJpbmcgdG8gc3RyaW5nLgorICogSW4gY2FzZSBvZiBjbGllbnRzIHVzaW5nIHRlbXBsYXRlIGFzIHdlbGwsIHRoaXMgaW1wbGVtZW50YXRpb24gYXZvaWRzIGFkZGluZyBleHRyYQorICogc3BlY2lhbGl6YXRpb24gdG8gYnlwYXNzIHRoZSBjb252ZXJzaW9uIGZyb20gc3RyaW5nIHRvIHN0cmluZy4KKyAqCisgKiBAcGFyYW1baW5dICBzdHIgICAgdGhlIHN0cmluZyB0byBwYXJzZS4KKyAqIEBwYXJhbVtvdXRdIHJlc3VsdCByZWZlcmVuY2UgdG8gb2JqZWN0IHdoZXJlIHRvIHN0b3JlIHRoZSByZXN1bHQuCisgKgorICogQHJldHVybiB0cnVlIGlmIGNvbnZlcnNpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZS4KKyAqLwordGVtcGxhdGUgPD4KK2lubGluZSBib29sIGNvbnZlcnRUbzxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+KGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIHN0ZDo6c3RyaW5nICZyZXN1bHQpCit7CisgICAgcmVzdWx0ID0gc3RyOworICAgIHJldHVybiB0cnVlOworfQorCit9IC8vIG5hbWVzcGFjZSB1dGlsaXRpZXMKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKaW5kZXggZTE4NGQ5Ny4uZThlZjI0ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCkBAIC0yMyw4ICsyMywxMCBAQAogTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICBcCiAgICAgQ2FtZXJhU2VydmljZS5jcHAgXAogICAgIENhbWVyYURldmljZUZhY3RvcnkuY3BwIFwKKyAgICBDYW1lcmFGbGFzaGxpZ2h0LmNwcCBcCiAgICAgY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcCBcCiAgICAgY29tbW9uL0NhbWVyYURldmljZUJhc2UuY3BwIFwKKyAgICBjb21tb24vQ2FtZXJhTW9kdWxlLmNwcCBcCiAgICAgY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5jcHAgXAogICAgIGFwaTEvQ2FtZXJhQ2xpZW50LmNwcCBcCiAgICAgYXBpMS9DYW1lcmEyQ2xpZW50LmNwcCBcCkBAIC00MCw3ICs0Miw2IEBACiAgICAgYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwIFwKICAgICBhcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5jcHAgXAogICAgIGFwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcCBcCi0gICAgYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmNwcCBcCiAgICAgZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmNwcCBcCiAgICAgZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcCBcCiAgICAgZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcCBcCkBAIC01Miw2ICs1Myw3IEBACiAgICAgZGV2aWNlMy9TdGF0dXNUcmFja2VyLmNwcCBcCiAgICAgZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5jcHAgXAogICAgIHV0aWxzL0NhbWVyYVRyYWNlcy5jcHAgXAorICAgIHV0aWxzL0F1dG9Db25kaXRpb25Mb2NrLmNwcCBcCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PSBcCiAgICAgbGlidWkgXApAQCAtNjAsNiArNjIsNyBAQAogICAgIGxpYmJpbmRlciBcCiAgICAgbGliY3V0aWxzIFwKICAgICBsaWJtZWRpYSBcCisgICAgbGlibWVkaWF1dGlscyBcCiAgICAgbGliY2FtZXJhX2NsaWVudCBcCiAgICAgbGliZ3VpIFwKICAgICBsaWJoYXJkd2FyZSBcCkBAIC03MCw2ICs3Myw3IEBACiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKICAgICBzeXN0ZW0vbWVkaWEvY2FtZXJhL2luY2x1ZGUgXAogICAgIHN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlIFwKKyAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgIGV4dGVybmFsL2pwZWcKIAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFEZXZpY2VGYWN0b3J5LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYURldmljZUZhY3RvcnkuY3BwCmluZGV4IGJmZWY1MGUuLjY1ODllMjcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYURldmljZUZhY3RvcnkuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYURldmljZUZhY3RvcnkuY3BwCkBAIC00OCw2ICs0OCw3IEBACiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM6CiAgICAgICAgICAgICBkZXZpY2UgPSBuZXcgQ2FtZXJhM0RldmljZShjYW1lcmFJZCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgwYmI5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuY3BwCkBAIC0wLDAgKzEsODg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmFGbGFzaGxpZ2h0IgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCisjaW5jbHVkZSAiY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmgiCisjaW5jbHVkZSAiQ2FtZXJhRmxhc2hsaWdodC5oIgorI2luY2x1ZGUgImd1aS9JR3JhcGhpY0J1ZmZlckNvbnN1bWVyLmgiCisjaW5jbHVkZSAiZ3VpL0J1ZmZlclF1ZXVlLmgiCisjaW5jbHVkZSAiY2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuaCIKKyNpbmNsdWRlICJDYW1lcmFEZXZpY2VGYWN0b3J5LmgiCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhbWVyYUZsYXNobGlnaHQgaW1wbGVtZW50YXRpb24gYmVnaW5zCisvLyB1c2VkIGJ5IGNhbWVyYSBzZXJ2aWNlIHRvIGNvbnRyb2wgZmxhc2hmbGlnaHQuCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0NhbWVyYUZsYXNobGlnaHQ6OkNhbWVyYUZsYXNobGlnaHQoQ2FtZXJhTW9kdWxlJiBjYW1lcmFNb2R1bGUsCisgICAgICAgIGNvbnN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QmIGNhbGxiYWNrcykgOgorICAgICAgICBtQ2FtZXJhTW9kdWxlKCZjYW1lcmFNb2R1bGUpLAorICAgICAgICBtQ2FsbGJhY2tzKCZjYWxsYmFja3MpLAorICAgICAgICBtRmxhc2hsaWdodE1hcEluaXRpYWxpemVkKGZhbHNlKSB7Cit9CisKK0NhbWVyYUZsYXNobGlnaHQ6On5DYW1lcmFGbGFzaGxpZ2h0KCkgeworfQorCitzdGF0dXNfdCBDYW1lcmFGbGFzaGxpZ2h0OjpjcmVhdGVGbGFzaGxpZ2h0Q29udHJvbChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCkgeworICAgIEFMT0dWKCIlczogY3JlYXRpbmcgYSBmbGFzaCBsaWdodCBjb250cm9sIGZvciBjYW1lcmEgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgaWYgKG1GbGFzaENvbnRyb2wgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICBpZiAobUNhbWVyYU1vZHVsZS0+Z2V0TW9kdWxlQXBpVmVyc2lvbigpID49IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl80KSB7CisgICAgICAgIG1GbGFzaENvbnRyb2wgPSBuZXcgTW9kdWxlRmxhc2hDb250cm9sKCptQ2FtZXJhTW9kdWxlLCAqbUNhbGxiYWNrcyk7CisgICAgICAgIGlmIChtRmxhc2hDb250cm9sID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogY2Fubm90IGNyZWF0ZSBmbGFzaCBjb250cm9sIGZvciBtb2R1bGUgYXBpIHYyLjQrIiwKKyAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDMyX3QgZGV2aWNlVmVyc2lvbiA9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOworCisgICAgICAgIGlmIChtQ2FtZXJhTW9kdWxlLT5nZXRNb2R1bGVBcGlWZXJzaW9uKCkgPj0KKyAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzApIHsKKyAgICAgICAgICAgIGNhbWVyYV9pbmZvIGluZm87CisgICAgICAgICAgICByZXMgPSBtQ2FtZXJhTW9kdWxlLT5nZXRDYW1lcmFJbmZvKAorICAgICAgICAgICAgICAgICAgICBhdG9pKFN0cmluZzgoY2FtZXJhSWQpLnN0cmluZygpKSwgJmluZm8pOworICAgICAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGdldCBjYW1lcmEgaW5mbyBmb3IgY2FtZXJhICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXZpY2VWZXJzaW9uID0gaW5mby5kZXZpY2VfdmVyc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXZpY2VWZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wKSB7CisgICAgICAgICAgICBDYW1lcmFEZXZpY2VDbGllbnRGbGFzaENvbnRyb2wgKmZsYXNoQ29udHJvbCA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBDYW1lcmFEZXZpY2VDbGllbnRGbGFzaENvbnRyb2woKm1DYW1lcmFNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1DYWxsYmFja3MpOworICAgICAgICAgICAgaWYgKCFmbGFzaENvbnRyb2wpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtRmxhc2hDb250cm9sID0gZmxhc2hDb250cm9sOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUZsYXNoQ29udHJvbCA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbCgqbUNhbWVyYU1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptQ2FsbGJhY2tzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhRmxhc2hsaWdodDo6c2V0VG9yY2hNb2RlKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sIGVuYWJsZWQpIHsKKyAgICBpZiAoIW1GbGFzaGxpZ2h0TWFwSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBmaW5kRmxhc2hVbml0cygpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGlzIG1ldGhvZC4iKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBzZXQgdG9yY2ggbW9kZSBvZiBjYW1lcmEgJXMgdG8gJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgZW5hYmxlZCk7CisKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICBpZiAobU9wZW5lZENhbWVyYUlkcy5pbmRleE9mKGNhbWVyYUlkKSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAvLyBUaGlzIGNhc2UgaXMgbmVlZGVkIHRvIGF2b2lkIHN0YXRlIGNvcnJ1cHRpb24gZHVyaW5nIHRoZSBmb2xsb3dpbmcgY2FsbCBzZXF1ZW5jZToKKyAgICAgICAgLy8gQ2FtZXJhU2VydmljZTo6c2V0VG9yY2hNb2RlIGZvciBjYW1lcmEgSUQgMCBiZWdpbnMsIGRvZXMgdG9yY2ggc3RhdHVzIGNoZWNrcworICAgICAgICAvLyBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IGZvciBjYW1lcmEgSUQgMCBiZWdpbnMsIGNhbGxzIHByZXBhcmVEZXZpY2VPcGVuLCBlbmRzCisgICAgICAgIC8vIENhbWVyYVNlcnZpY2U6OnNldFRvcmNoTW9kZSBmb3IgY2FtZXJhIElEIDAgY29udGludWVzLCBjYWxscworICAgICAgICAvLyAgICAgICAgQ2FtZXJhRmxhc2hsaWdodDo6c2V0VG9yY2hNb2RlCisKKyAgICAgICAgLy8gVE9ETzogTW92ZSB0b3JjaCBzdGF0dXMgY2hlY2tzIGFuZCBzdGF0ZSB1cGRhdGVzIGJlaGluZCB0aGlzIENhbWVyYUZsYXNobGlnaHQgbG9jaworICAgICAgICAvLyB0byBhdm9pZCBvdGhlciBzaW1pbGFyIHJhY2UgY29uZGl0aW9ucy4KKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgZGV2aWNlICVzIGlzIGluIHVzZSwgY2Fubm90IHNldCB0b3JjaCBtb2RlLiIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgfQorCisgICAgaWYgKG1GbGFzaENvbnRyb2wgPT0gTlVMTCkgeworICAgICAgICBpZiAoZW5hYmxlZCA9PSBmYWxzZSkgeworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgcmVzID0gY3JlYXRlRmxhc2hsaWdodENvbnRyb2woY2FtZXJhSWQpOworICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIHJlcyA9ICBtRmxhc2hDb250cm9sLT5zZXRUb3JjaE1vZGUoY2FtZXJhSWQsIGVuYWJsZWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIGlmIGZsYXNoIGNvbnRyb2wgYWxyZWFkeSBleGlzdHMsIHR1cm5pbmcgb24gdG9yY2ggbW9kZSBtYXkgZmFpbCBpZiBpdCdzCisgICAgLy8gdGllZCB0byBhbm90aGVyIGNhbWVyYSBkZXZpY2UgZm9yIG1vZHVsZSB2Mi4zIGFuZCBiZWxvdy4KKyAgICByZXMgPSBtRmxhc2hDb250cm9sLT5zZXRUb3JjaE1vZGUoY2FtZXJhSWQsIGVuYWJsZWQpOworICAgIGlmIChyZXMgPT0gQkFEX0lOREVYKSB7CisgICAgICAgIC8vIGZsYXNoIGNvbnRyb2wgaXMgdGllZCB0byBhbm90aGVyIGNhbWVyYSBkZXZpY2UsIG5lZWQgdG8gY2xvc2UgaXQgYW5kCisgICAgICAgIC8vIHRyeSBhZ2Fpbi4KKyAgICAgICAgbUZsYXNoQ29udHJvbC5jbGVhcigpOworICAgICAgICByZXMgPSBjcmVhdGVGbGFzaGxpZ2h0Q29udHJvbChjYW1lcmFJZCk7CisgICAgICAgIGlmIChyZXMpIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gbUZsYXNoQ29udHJvbC0+c2V0VG9yY2hNb2RlKGNhbWVyYUlkLCBlbmFibGVkKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBDYW1lcmFGbGFzaGxpZ2h0OjpmaW5kRmxhc2hVbml0cygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgc3RhdHVzX3QgcmVzOworICAgIGludDMyX3QgbnVtQ2FtZXJhcyA9IG1DYW1lcmFNb2R1bGUtPmdldE51bWJlck9mQ2FtZXJhcygpOworCisgICAgbUhhc0ZsYXNobGlnaHRNYXAuY2xlYXIoKTsKKyAgICBtRmxhc2hsaWdodE1hcEluaXRpYWxpemVkID0gZmFsc2U7CisKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgYm9vbCBoYXNGbGFzaCA9IGZhbHNlOworICAgICAgICBTdHJpbmc4IGlkID0gU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGkpOworCisgICAgICAgIHJlcyA9IGNyZWF0ZUZsYXNobGlnaHRDb250cm9sKGlkKTsKKyAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gY3JlYXRlIGZsYXNoIGNvbnRyb2wgZm9yICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBpZC5zdHJpbmcoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXMgPSBtRmxhc2hDb250cm9sLT5oYXNGbGFzaFVuaXQoaWQsICZoYXNGbGFzaCk7CisgICAgICAgICAgICBpZiAocmVzID09IC1FVVNFUlMgfHwgcmVzID09IC1FQlVTWSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGNoZWNrIGlmIGNhbWVyYSAlcyBoYXMgYSBmbGFzaCB1bml0LiBTb21lICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjYW1lcmEgZGV2aWNlcyBtYXkgYmUgb3BlbmVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgaWQuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGNoZWNrIGlmIGNhbWVyYSAlcyBoYXMgYSBmbGFzaCB1bml0LiAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgKCVkKSIsIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCksIHN0cmVycm9yKC1yZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbUZsYXNoQ29udHJvbC5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIG1IYXNGbGFzaGxpZ2h0TWFwLmFkZChpZCwgaGFzRmxhc2gpOworICAgIH0KKworICAgIG1GbGFzaGxpZ2h0TWFwSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBDYW1lcmFGbGFzaGxpZ2h0OjpoYXNGbGFzaFVuaXQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpIHsKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgcmV0dXJuIGhhc0ZsYXNoVW5pdExvY2tlZChjYW1lcmFJZCk7Cit9CisKK2Jvb2wgQ2FtZXJhRmxhc2hsaWdodDo6aGFzRmxhc2hVbml0TG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSB7CisgICAgaWYgKCFtRmxhc2hsaWdodE1hcEluaXRpYWxpemVkKSB7CisgICAgICAgIEFMT0dFKCIlczogZmluZEZsYXNoVW5pdHMoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhpcyBtZXRob2QuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzc2l6ZV90IGluZGV4ID0gbUhhc0ZsYXNobGlnaHRNYXAuaW5kZXhPZktleShjYW1lcmFJZCk7CisgICAgaWYgKGluZGV4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIEFMT0dFKCIlczogY2FtZXJhICVzIG5vdCBwcmVzZW50IHdoZW4gZmluZEZsYXNoVW5pdHMoKSB3YXMgY2FsbGVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBtSGFzRmxhc2hsaWdodE1hcC52YWx1ZUF0KGluZGV4KTsKK30KKworc3RhdHVzX3QgQ2FtZXJhRmxhc2hsaWdodDo6cHJlcGFyZURldmljZU9wZW4oY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpIHsKKyAgICBBTE9HVigiJXM6IHByZXBhcmUgZm9yIGRldmljZSBvcGVuIiwgX19GVU5DVElPTl9fKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBpZiAoIW1GbGFzaGxpZ2h0TWFwSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBmaW5kRmxhc2hVbml0cygpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGlzIG1ldGhvZC4iKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaWYgKG1DYW1lcmFNb2R1bGUtPmdldE1vZHVsZUFwaVZlcnNpb24oKSA8IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl80KSB7CisgICAgICAgIC8vIGZyYW1ld29yayBpcyBnb2luZyB0byBvcGVuIGEgY2FtZXJhIGRldmljZSwgYWxsIGZsYXNoIGxpZ2h0IGNvbnRyb2wKKyAgICAgICAgLy8gc2hvdWxkIGJlIGNsb3NlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJsZSBzdXBwb3J0LgorICAgICAgICBtRmxhc2hDb250cm9sLmNsZWFyKCk7CisKKyAgICAgICAgaWYgKG1PcGVuZWRDYW1lcmFJZHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIC8vIG5vdGlmeSB0b3JjaCB1bmF2YWlsYWJsZSBmb3IgYWxsIGNhbWVyYXMgd2l0aCBhIGZsYXNoCisgICAgICAgICAgICBpbnQgbnVtQ2FtZXJhcyA9IG1DYW1lcmFNb2R1bGUtPmdldE51bWJlck9mQ2FtZXJhcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaGFzRmxhc2hVbml0TG9ja2VkKFN0cmluZzg6OmZvcm1hdCgiJWQiLCBpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrcy0+dG9yY2hfbW9kZV9zdGF0dXNfY2hhbmdlKG1DYWxsYmFja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGkpLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPUkNIX01PREVfU1RBVFVTX05PVF9BVkFJTEFCTEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGNsb3NlIGZsYXNoIGNvbnRyb2wgdGhhdCBtYXkgYmUgb3BlbmVkIGJ5IGNhbGxpbmcgaGFzRmxhc2hVbml0TG9ja2VkLgorICAgICAgICBtRmxhc2hDb250cm9sLmNsZWFyKCk7CisgICAgfQorCisgICAgaWYgKG1PcGVuZWRDYW1lcmFJZHMuaW5kZXhPZihjYW1lcmFJZCkgPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgbU9wZW5lZENhbWVyYUlkcy5hZGQoY2FtZXJhSWQpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhRmxhc2hsaWdodDo6ZGV2aWNlQ2xvc2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSB7CisgICAgQUxPR1YoIiVzOiBkZXZpY2UgJXMgaXMgY2xvc2VkIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5zdHJpbmcoKSk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgaWYgKCFtRmxhc2hsaWdodE1hcEluaXRpYWxpemVkKSB7CisgICAgICAgIEFMT0dFKCIlczogZmluZEZsYXNoVW5pdHMoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhpcyBtZXRob2QuIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHNzaXplX3QgaW5kZXggPSBtT3BlbmVkQ2FtZXJhSWRzLmluZGV4T2YoY2FtZXJhSWQpOworICAgIGlmIChpbmRleCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBBTE9HRSgiJXM6IGNvdWxkbid0IGZpbmQgY2FtZXJhICVzIGluIHRoZSBvcGVuZWQgbGlzdCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbU9wZW5lZENhbWVyYUlkcy5yZW1vdmVBdChpbmRleCk7CisgICAgfQorCisgICAgLy8gQ2Fubm90IGRvIGFueXRoaW5nIHVudGlsIGFsbCBjYW1lcmFzIGFyZSBjbG9zZWQuCisgICAgaWYgKG1PcGVuZWRDYW1lcmFJZHMuc2l6ZSgpICE9IDApCisgICAgICAgIHJldHVybiBPSzsKKworICAgIGlmIChtQ2FtZXJhTW9kdWxlLT5nZXRNb2R1bGVBcGlWZXJzaW9uKCkgPCBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfNCkgeworICAgICAgICAvLyBub3RpZnkgdG9yY2ggYXZhaWxhYmxlIGZvciBhbGwgY2FtZXJhcyB3aXRoIGEgZmxhc2gKKyAgICAgICAgaW50IG51bUNhbWVyYXMgPSBtQ2FtZXJhTW9kdWxlLT5nZXROdW1iZXJPZkNhbWVyYXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChoYXNGbGFzaFVuaXRMb2NrZWQoU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGkpKSkgeworICAgICAgICAgICAgICAgIG1DYWxsYmFja3MtPnRvcmNoX21vZGVfc3RhdHVzX2NoYW5nZShtQ2FsbGJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGkpLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgVE9SQ0hfTU9ERV9TVEFUVVNfQVZBSUxBQkxFX09GRik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisvLyBDYW1lcmFGbGFzaGxpZ2h0IGltcGxlbWVudGF0aW9uIGVuZHMKKworCitGbGFzaENvbnRyb2xCYXNlOjp+Rmxhc2hDb250cm9sQmFzZSgpIHsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBNb2R1bGVGbGFzaENvbnRyb2wgaW1wbGVtZW50YXRpb24gYmVnaW5zCisvLyBGbGFzaCBjb250cm9sIGZvciBjYW1lcmEgbW9kdWxlIHYyLjQgYW5kIGFib3ZlLgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitNb2R1bGVGbGFzaENvbnRyb2w6Ok1vZHVsZUZsYXNoQ29udHJvbChDYW1lcmFNb2R1bGUmIGNhbWVyYU1vZHVsZSwKKyAgICAgICAgY29uc3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCYgY2FsbGJhY2tzKSA6CisgICAgbUNhbWVyYU1vZHVsZSgmY2FtZXJhTW9kdWxlKSB7Cit9CisKK01vZHVsZUZsYXNoQ29udHJvbDo6fk1vZHVsZUZsYXNoQ29udHJvbCgpIHsKK30KKworc3RhdHVzX3QgTW9kdWxlRmxhc2hDb250cm9sOjpoYXNGbGFzaFVuaXQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgKmhhc0ZsYXNoKSB7CisgICAgaWYgKCFoYXNGbGFzaCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgICpoYXNGbGFzaCA9IGZhbHNlOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIGNhbWVyYV9pbmZvIGluZm87CisgICAgc3RhdHVzX3QgcmVzID0gbUNhbWVyYU1vZHVsZS0+Z2V0Q2FtZXJhSW5mbyhhdG9pKGNhbWVyYUlkLnN0cmluZygpKSwKKyAgICAgICAgICAgICZpbmZvKTsKKyAgICBpZiAocmVzICE9IDApIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICBtZXRhZGF0YSA9IGluZm8uc3RhdGljX2NhbWVyYV9jaGFyYWN0ZXJpc3RpY3M7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGZsYXNoQXZhaWxhYmxlID0KKyAgICAgICAgICAgIG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9GTEFTSF9JTkZPX0FWQUlMQUJMRSk7CisgICAgaWYgKGZsYXNoQXZhaWxhYmxlLmNvdW50ID09IDEgJiYgZmxhc2hBdmFpbGFibGUuZGF0YS51OFswXSA9PSAxKSB7CisgICAgICAgICpoYXNGbGFzaCA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNb2R1bGVGbGFzaENvbnRyb2w6OnNldFRvcmNoTW9kZShjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgYm9vbCBlbmFibGVkKSB7CisgICAgQUxPR1YoIiVzOiBzZXQgY2FtZXJhICVzIHRvcmNoIG1vZGUgdG8gJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgZW5hYmxlZCk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgcmV0dXJuIG1DYW1lcmFNb2R1bGUtPnNldFRvcmNoTW9kZShjYW1lcmFJZC5zdHJpbmcoKSwgZW5hYmxlZCk7Cit9CisvLyBNb2R1bGVGbGFzaENvbnRyb2wgaW1wbGVtZW50YXRpb24gZW5kcworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIENhbWVyYURldmljZUNsaWVudEZsYXNoQ29udHJvbCBpbXBsZW1lbnRhdGlvbiBiZWdpbnMKKy8vIEZsYXNoIGNvbnRyb2wgZm9yIGNhbWVyYSBtb2R1bGUgPD0gdjIuMyBhbmQgY2FtZXJhIEhBTCB2Mi12MworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitDYW1lcmFEZXZpY2VDbGllbnRGbGFzaENvbnRyb2w6OkNhbWVyYURldmljZUNsaWVudEZsYXNoQ29udHJvbCgKKyAgICAgICAgQ2FtZXJhTW9kdWxlJiBjYW1lcmFNb2R1bGUsCisgICAgICAgIGNvbnN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QmIGNhbGxiYWNrcykgOgorICAgICAgICBtQ2FtZXJhTW9kdWxlKCZjYW1lcmFNb2R1bGUpLAorICAgICAgICBtQ2FsbGJhY2tzKCZjYWxsYmFja3MpLAorICAgICAgICBtVG9yY2hFbmFibGVkKGZhbHNlKSwKKyAgICAgICAgbU1ldGFkYXRhKE5VTEwpLAorICAgICAgICBtU3RyZWFtaW5nKGZhbHNlKSB7Cit9CisKK0NhbWVyYURldmljZUNsaWVudEZsYXNoQ29udHJvbDo6fkNhbWVyYURldmljZUNsaWVudEZsYXNoQ29udHJvbCgpIHsKKyAgICBkaXNjb25uZWN0Q2FtZXJhRGV2aWNlKCk7CisgICAgaWYgKG1NZXRhZGF0YSkgeworICAgICAgICBkZWxldGUgbU1ldGFkYXRhOworICAgIH0KKworICAgIG1TdXJmYWNlLmNsZWFyKCk7CisgICAgbVN1cmZhY2VUZXh0dXJlLmNsZWFyKCk7CisgICAgbVByb2R1Y2VyLmNsZWFyKCk7CisgICAgbUNvbnN1bWVyLmNsZWFyKCk7CisKKyAgICBpZiAobVRvcmNoRW5hYmxlZCkgeworICAgICAgICBpZiAobUNhbGxiYWNrcykgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBub3RpZnkgdGhlIGZyYW1ld29yayB0aGF0IHRvcmNoIHdhcyB0dXJuZWQgb2ZmIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIG1DYWxsYmFja3MtPnRvcmNoX21vZGVfc3RhdHVzX2NoYW5nZShtQ2FsbGJhY2tzLAorICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWQuc3RyaW5nKCksIFRPUkNIX01PREVfU1RBVFVTX0FWQUlMQUJMRV9PRkYpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnRGbGFzaENvbnRyb2w6OmluaXRpYWxpemVTdXJmYWNlKAorICAgICAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiAmZGV2aWNlLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgIHN0YXR1c190IHJlczsKKyAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJm1Qcm9kdWNlciwgJm1Db25zdW1lcik7CisKKyAgICBtU3VyZmFjZVRleHR1cmUgPSBuZXcgR0xDb25zdW1lcihtQ29uc3VtZXIsIDAsIEdMQ29uc3VtZXI6OlRFWFRVUkVfRVhURVJOQUwsCisgICAgICAgICAgICB0cnVlLCB0cnVlKTsKKyAgICBpZiAobVN1cmZhY2VUZXh0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKKyAgICByZXMgPSBtU3VyZmFjZVRleHR1cmUtPnNldERlZmF1bHRCdWZmZXJTaXplKHdpZHRoLCBoZWlnaHQpOworICAgIGlmIChyZXMpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgcmVzID0gbVN1cmZhY2VUZXh0dXJlLT5zZXREZWZhdWx0QnVmZmVyRm9ybWF0KGZvcm1hdCk7CisgICAgaWYgKHJlcykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIG1TdXJmYWNlID0gbmV3IFN1cmZhY2UobVByb2R1Y2VyLCAvKnVzZUFzeW5jKi8gdHJ1ZSk7CisgICAgaWYgKG1TdXJmYWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obVN1cmZhY2UsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwKKyAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwgJm1TdHJlYW1JZCk7CisgICAgaWYgKHJlcykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJlcyA9IGRldmljZS0+Y29uZmlndXJlU3RyZWFtcygpOworICAgIGlmIChyZXMpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnRGbGFzaENvbnRyb2w6OmdldFNtYWxsZXN0U3VyZmFjZVNpemUoCisgICAgICAgIGNvbnN0IGNhbWVyYV9pbmZvJiBpbmZvLCBpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KSB7CisgICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0KSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaW50MzJfdCB3ID0gSU5UMzJfTUFYOworICAgIGludDMyX3QgaCA9IDE7CisKKyAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICBtZXRhZGF0YSA9IGluZm8uc3RhdGljX2NhbWVyYV9jaGFyYWN0ZXJpc3RpY3M7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHN0cmVhbUNvbmZpZ3MgPQorICAgICAgICAgICAgbWV0YWRhdGEuZmluZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0cmVhbUNvbmZpZ3MuY291bnQ7IGkgKz0gNCkgeworICAgICAgICBpbnQzMl90IGZtdCA9IHN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaV07CisgICAgICAgIGlmIChmbXQgPT0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX0ZPUk1BVFNfSU1QTEVNRU5UQVRJT05fREVGSU5FRCkgeworICAgICAgICAgICAgaW50MzJfdCB3dyA9IHN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIDFdOworICAgICAgICAgICAgaW50MzJfdCBoaCA9IHN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIDJdOworCisgICAgICAgICAgICBpZiAodyAqIGggPiB3dyAqIGhoKSB7CisgICAgICAgICAgICAgICAgdyA9IHd3OworICAgICAgICAgICAgICAgIGggPSBoaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGlmIHN0cmVhbSBjb25maWd1cmF0aW9uIGlzIG5vdCBmb3VuZCwgdHJ5IGF2YWlsYWJsZSBwcm9jZXNzZWQgc2l6ZXMuCisgICAgaWYgKHN0cmVhbUNvbmZpZ3MuY291bnQgPT0gMCkgeworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMgPQorICAgICAgICAgICAgbWV0YWRhdGEuZmluZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUFJPQ0VTU0VEX1NJWkVTKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdmFpbGFibGVQcm9jZXNzZWRTaXplcy5jb3VudDsgaSArPSAyKSB7CisgICAgICAgICAgICBpbnQzMl90IHd3ID0gYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuZGF0YS5pMzJbaV07CisgICAgICAgICAgICBpbnQzMl90IGhoID0gYXZhaWxhYmxlUHJvY2Vzc2VkU2l6ZXMuZGF0YS5pMzJbaSArIDFdOworICAgICAgICAgICAgaWYgKHcgKiBoID4gd3cgKiBoaCkgeworICAgICAgICAgICAgICAgIHcgPSB3dzsKKyAgICAgICAgICAgICAgICBoID0gaGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodyA9PSBJTlQzMl9NQVgpIHsKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIH0KKworICAgICp3aWR0aCA9IHc7CisgICAgKmhlaWdodCA9IGg7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudEZsYXNoQ29udHJvbDo6Y29ubmVjdENhbWVyYURldmljZSgKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpIHsKKyAgICBjYW1lcmFfaW5mbyBpbmZvOworICAgIHN0YXR1c190IHJlcyA9IG1DYW1lcmFNb2R1bGUtPmdldENhbWVyYUluZm8oYXRvaShjYW1lcmFJZC5zdHJpbmcoKSksICZpbmZvKTsKKyAgICBpZiAocmVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gZ2V0IGNhbWVyYSBpbmZvIGZvciBjYW1lcmEgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9CisgICAgICAgICAgICBDYW1lcmFEZXZpY2VGYWN0b3J5OjpjcmVhdGVEZXZpY2UoYXRvaShjYW1lcmFJZC5zdHJpbmcoKSkpOworICAgIGlmIChkZXZpY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIHJlcyA9IGRldmljZS0+aW5pdGlhbGl6ZShtQ2FtZXJhTW9kdWxlKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIHJlcyA9IGdldFNtYWxsZXN0U3VyZmFjZVNpemUoaW5mbywgJndpZHRoLCAmaGVpZ2h0KTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHJlcyA9IGluaXRpYWxpemVTdXJmYWNlKGRldmljZSwgd2lkdGgsIGhlaWdodCk7CisgICAgaWYgKHJlcykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIG1DYW1lcmFJZCA9IGNhbWVyYUlkOworICAgIG1TdHJlYW1pbmcgPSAoaW5mby5kZXZpY2VfdmVyc2lvbiA8PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMSk7CisgICAgbURldmljZSA9IGRldmljZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50Rmxhc2hDb250cm9sOjpkaXNjb25uZWN0Q2FtZXJhRGV2aWNlKCkgeworICAgIGlmIChtRGV2aWNlICE9IE5VTEwpIHsKKyAgICAgICAgbURldmljZS0+ZGlzY29ubmVjdCgpOworICAgICAgICBtRGV2aWNlLmNsZWFyKCk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCisKKworc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50Rmxhc2hDb250cm9sOjpoYXNGbGFzaFVuaXQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgIGJvb2wgKmhhc0ZsYXNoKSB7CisgICAgQUxPR1YoIiVzOiBjaGVja2luZyBpZiBjYW1lcmEgJXMgaGFzIGEgZmxhc2ggdW5pdCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICByZXR1cm4gaGFzRmxhc2hVbml0TG9ja2VkKGNhbWVyYUlkLCBoYXNGbGFzaCk7CisKK30KKworc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50Rmxhc2hDb250cm9sOjpoYXNGbGFzaFVuaXRMb2NrZWQoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sICpoYXNGbGFzaCkgeworICAgIGlmICghaGFzRmxhc2gpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjYW1lcmFfaW5mbyBpbmZvOworICAgIHN0YXR1c190IHJlcyA9IG1DYW1lcmFNb2R1bGUtPmdldENhbWVyYUluZm8oCisgICAgICAgICAgICBhdG9pKGNhbWVyYUlkLnN0cmluZygpKSwgJmluZm8pOworICAgIGlmIChyZXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBnZXQgY2FtZXJhIGluZm8gZm9yIGNhbWVyYSAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7CisgICAgbWV0YWRhdGEgPSBpbmZvLnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBmbGFzaEF2YWlsYWJsZSA9CisgICAgICAgICAgICBtZXRhZGF0YS5maW5kKEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEUpOworICAgIGlmIChmbGFzaEF2YWlsYWJsZS5jb3VudCA9PSAxICYmIGZsYXNoQXZhaWxhYmxlLmRhdGEudThbMF0gPT0gMSkgeworICAgICAgICAqaGFzRmxhc2ggPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50Rmxhc2hDb250cm9sOjpzdWJtaXRUb3JjaEVuYWJsZWRSZXF1ZXN0KCkgeworICAgIHN0YXR1c190IHJlczsKKworICAgIGlmIChtTWV0YWRhdGEgPT0gTlVMTCkgeworICAgICAgICBtTWV0YWRhdGEgPSBuZXcgQ2FtZXJhTWV0YWRhdGEoKTsKKyAgICAgICAgaWYgKG1NZXRhZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIHJlcyA9IG1EZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KAorICAgICAgICAgICAgICAgIENBTUVSQTNfVEVNUExBVEVfUFJFVklFVywgbU1ldGFkYXRhKTsKKyAgICAgICAgaWYgKHJlcykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVpbnQ4X3QgdG9yY2hPbiA9IEFORFJPSURfRkxBU0hfTU9ERV9UT1JDSDsKKyAgICBtTWV0YWRhdGEtPnVwZGF0ZShBTkRST0lEX0ZMQVNIX01PREUsICZ0b3JjaE9uLCAxKTsKKyAgICBtTWV0YWRhdGEtPnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfT1VUUFVUX1NUUkVBTVMsICZtU3RyZWFtSWQsIDEpOworCisgICAgdWludDhfdCBhZU1vZGUgPSBBTkRST0lEX0NPTlRST0xfQUVfTU9ERV9PTjsKKyAgICBtTWV0YWRhdGEtPnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUVfTU9ERSwgJmFlTW9kZSwgMSk7CisKKyAgICBpbnQzMl90IHJlcXVlc3RJZCA9IDA7CisgICAgbU1ldGFkYXRhLT51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0lELCAmcmVxdWVzdElkLCAxKTsKKworICAgIGlmIChtU3RyZWFtaW5nKSB7CisgICAgICAgIHJlcyA9IG1EZXZpY2UtPnNldFN0cmVhbWluZ1JlcXVlc3QoKm1NZXRhZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gbURldmljZS0+Y2FwdHVyZSgqbU1ldGFkYXRhKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworCisKKworc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50Rmxhc2hDb250cm9sOjpzZXRUb3JjaE1vZGUoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sIGVuYWJsZWQpIHsKKyAgICBib29sIGhhc0ZsYXNoID0gZmFsc2U7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgc3RhdHVzX3QgcmVzID0gaGFzRmxhc2hVbml0TG9ja2VkKGNhbWVyYUlkLCAmaGFzRmxhc2gpOworCisgICAgLy8gcHJlLWNoZWNrCisgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgLy8gaW52YWxpZCBjYW1lcmE/CisgICAgICAgIGlmIChyZXMpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIC8vIG5vIGZsYXNoIHVuaXQ/CisgICAgICAgIGlmICghaGFzRmxhc2gpIHsKKyAgICAgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgICAgICB9CisgICAgICAgIC8vIGFscmVhZHkgb3BlbmVkIGZvciBhIGRpZmZlcmVudCBkZXZpY2U/CisgICAgICAgIGlmIChtRGV2aWNlICE9IE5VTEwgJiYgY2FtZXJhSWQgIT0gbUNhbWVyYUlkKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX0lOREVYOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtRGV2aWNlID09IE5VTEwgfHwgY2FtZXJhSWQgIT0gbUNhbWVyYUlkKSB7CisgICAgICAgIC8vIGRpc2FibGluZyB0aGUgdG9yY2ggbW9kZSBvZiBhbiB1bi1vcGVuZWQgb3IgZGlmZmVyZW50IGRldmljZS4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGRpc2FibGluZyB0aGUgdG9yY2ggbW9kZSBvZiBjdXJyZW50bHkgb3BlbmVkIGRldmljZQorICAgICAgICBkaXNjb25uZWN0Q2FtZXJhRGV2aWNlKCk7CisgICAgICAgIG1Ub3JjaEVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgbUNhbGxiYWNrcy0+dG9yY2hfbW9kZV9zdGF0dXNfY2hhbmdlKG1DYWxsYmFja3MsCisgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgVE9SQ0hfTU9ERV9TVEFUVVNfQVZBSUxBQkxFX09GRik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBpZiAobURldmljZSA9PSBOVUxMKSB7CisgICAgICAgIHJlcyA9IGNvbm5lY3RDYW1lcmFEZXZpY2UoY2FtZXJhSWQpOworICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzID0gc3VibWl0VG9yY2hFbmFibGVkUmVxdWVzdCgpOworICAgIGlmIChyZXMpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBtVG9yY2hFbmFibGVkID0gdHJ1ZTsKKyAgICBtQ2FsbGJhY2tzLT50b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2UobUNhbGxiYWNrcywKKyAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpLCBUT1JDSF9NT0RFX1NUQVRVU19BVkFJTEFCTEVfT04pOworICAgIHJldHVybiBPSzsKK30KKy8vIENhbWVyYURldmljZUNsaWVudEZsYXNoQ29udHJvbCBpbXBsZW1lbnRhdGlvbiBlbmRzCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbCBpbXBsZW1lbnRhdGlvbiBiZWdpbnMKKy8vIEZsYXNoIGNvbnRyb2wgZm9yIGNhbWVyYSBtb2R1bGUgPD0gdjIuMyBhbmQgY2FtZXJhIEhBTCB2MQorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbDo6Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2woCisgICAgICAgIENhbWVyYU1vZHVsZSYgY2FtZXJhTW9kdWxlLAorICAgICAgICBjb25zdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190JiBjYWxsYmFja3MpIDoKKyAgICAgICAgbUNhbWVyYU1vZHVsZSgmY2FtZXJhTW9kdWxlKSwKKyAgICAgICAgbUNhbGxiYWNrcygmY2FsbGJhY2tzKSwKKyAgICAgICAgbVRvcmNoRW5hYmxlZChmYWxzZSkgeworCit9CisKK0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sOjp+Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2woKSB7CisgICAgZGlzY29ubmVjdENhbWVyYURldmljZSgpOworCisgICAgbVN1cmZhY2UuY2xlYXIoKTsKKyAgICBtU3VyZmFjZVRleHR1cmUuY2xlYXIoKTsKKyAgICBtUHJvZHVjZXIuY2xlYXIoKTsKKyAgICBtQ29uc3VtZXIuY2xlYXIoKTsKKworICAgIGlmIChtVG9yY2hFbmFibGVkKSB7CisgICAgICAgIGlmIChtQ2FsbGJhY2tzKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IG5vdGlmeSB0aGUgZnJhbWV3b3JrIHRoYXQgdG9yY2ggd2FzIHR1cm5lZCBvZmYiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgbUNhbGxiYWNrcy0+dG9yY2hfbW9kZV9zdGF0dXNfY2hhbmdlKG1DYWxsYmFja3MsCisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZC5zdHJpbmcoKSwgVE9SQ0hfTU9ERV9TVEFUVVNfQVZBSUxBQkxFX09GRik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sOjpzZXRUb3JjaE1vZGUoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sIGVuYWJsZWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICAvLyBwcmUtY2hlY2sKKyAgICBzdGF0dXNfdCByZXM7CisgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgYm9vbCBoYXNGbGFzaCA9IGZhbHNlOworICAgICAgICByZXMgPSBoYXNGbGFzaFVuaXRMb2NrZWQoY2FtZXJhSWQsICZoYXNGbGFzaCk7CisgICAgICAgIC8vIGludmFsaWQgY2FtZXJhPworICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICAvLyBoYXNGbGFzaFVuaXRMb2NrZWQoKSByZXR1cm5zIEJBRF9JTkRFWCBpZiBtRGV2aWNlIGlzIGNvbm5lY3RlZCB0bworICAgICAgICAgICAgLy8gYW5vdGhlciBjYW1lcmEgZGV2aWNlLgorICAgICAgICAgICAgcmV0dXJuIHJlcyA9PSBCQURfSU5ERVggPyBCQURfSU5ERVggOiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIC8vIG5vIGZsYXNoIHVuaXQ/CisgICAgICAgIGlmICghaGFzRmxhc2gpIHsKKyAgICAgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtRGV2aWNlID09IE5VTEwgfHwgY2FtZXJhSWQgIT0gbUNhbWVyYUlkKSB7CisgICAgICAgIC8vIGRpc2FibGluZyB0aGUgdG9yY2ggbW9kZSBvZiBhbiB1bi1vcGVuZWQgb3IgZGlmZmVyZW50IGRldmljZS4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGRpc2FibGluZyB0aGUgdG9yY2ggbW9kZSBvZiBjdXJyZW50bHkgb3BlbmVkIGRldmljZQorICAgICAgICBkaXNjb25uZWN0Q2FtZXJhRGV2aWNlKCk7CisgICAgICAgIG1Ub3JjaEVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgbUNhbGxiYWNrcy0+dG9yY2hfbW9kZV9zdGF0dXNfY2hhbmdlKG1DYWxsYmFja3MsCisgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSwgVE9SQ0hfTU9ERV9TVEFUVVNfQVZBSUxBQkxFX09GRik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICByZXMgPSBzdGFydFByZXZpZXdBbmRUb3JjaCgpOworICAgIGlmIChyZXMpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBtVG9yY2hFbmFibGVkID0gdHJ1ZTsKKyAgICBtQ2FsbGJhY2tzLT50b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2UobUNhbGxiYWNrcywKKyAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpLCBUT1JDSF9NT0RFX1NUQVRVU19BVkFJTEFCTEVfT04pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2w6Omhhc0ZsYXNoVW5pdCgKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgKmhhc0ZsYXNoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHJldHVybiBoYXNGbGFzaFVuaXRMb2NrZWQoY2FtZXJhSWQsIGhhc0ZsYXNoKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2w6Omhhc0ZsYXNoVW5pdExvY2tlZCgKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgKmhhc0ZsYXNoKSB7CisgICAgaWYgKCFoYXNGbGFzaCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0YXR1c190IHJlczsKKyAgICBpZiAobURldmljZSA9PSBOVUxMKSB7CisgICAgICAgIHJlcyA9IGNvbm5lY3RDYW1lcmFEZXZpY2UoY2FtZXJhSWQpOworICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNhbWVyYUlkICE9IG1DYW1lcmFJZCkgeworICAgICAgICByZXR1cm4gQkFEX0lOREVYOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKmZsYXNoTW9kZSA9CisgICAgICAgICAgICBtUGFyYW1ldGVycy5nZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1NVUFBPUlRFRF9GTEFTSF9NT0RFUyk7CisgICAgaWYgKGZsYXNoTW9kZSAmJiBzdHJzdHIoZmxhc2hNb2RlLCBDYW1lcmFQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX1RPUkNIKSkgeworICAgICAgICAqaGFzRmxhc2ggPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgICpoYXNGbGFzaCA9IGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2w6OnN0YXJ0UHJldmlld0FuZFRvcmNoKCkgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIHJlcyA9IG1EZXZpY2UtPnN0YXJ0UHJldmlldygpOworICAgIGlmIChyZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzdGFydCBwcmV2aWV3IGZhaWxlZC4gJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBtUGFyYW1ldGVycy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX0ZMQVNIX01PREUsCisgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpGTEFTSF9NT0RFX1RPUkNIKTsKKworICAgIHJldHVybiBtRGV2aWNlLT5zZXRQYXJhbWV0ZXJzKG1QYXJhbWV0ZXJzKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2VGbGFzaENvbnRyb2w6OmdldFNtYWxsZXN0U3VyZmFjZVNpemUoCisgICAgICAgIGludDMyX3QgKndpZHRoLCBpbnQzMl90ICpoZWlnaHQpIHsKKyAgICBpZiAoIXdpZHRoIHx8ICFoZWlnaHQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpbnQzMl90IHcgPSBJTlQzMl9NQVg7CisgICAgaW50MzJfdCBoID0gMTsKKyAgICBWZWN0b3I8U2l6ZT4gc2l6ZXM7CisKKyAgICBtUGFyYW1ldGVycy5nZXRTdXBwb3J0ZWRQcmV2aWV3U2l6ZXMoc2l6ZXMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgU2l6ZSBzID0gc2l6ZXNbaV07CisgICAgICAgIGlmICh3ICogaCA+IHMud2lkdGggKiBzLmhlaWdodCkgeworICAgICAgICAgICAgdyA9IHMud2lkdGg7CisgICAgICAgICAgICBoID0gcy5oZWlnaHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodyA9PSBJTlQzMl9NQVgpIHsKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIH0KKworICAgICp3aWR0aCA9IHc7CisgICAgKmhlaWdodCA9IGg7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sOjppbml0aWFsaXplUHJldmlld1dpbmRvdygKKyAgICAgICAgc3A8Q2FtZXJhSGFyZHdhcmVJbnRlcmZhY2U+IGRldmljZSwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIHsKKyAgICBzdGF0dXNfdCByZXM7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZtUHJvZHVjZXIsICZtQ29uc3VtZXIpOworCisgICAgbVN1cmZhY2VUZXh0dXJlID0gbmV3IEdMQ29uc3VtZXIobUNvbnN1bWVyLCAwLCBHTENvbnN1bWVyOjpURVhUVVJFX0VYVEVSTkFMLAorICAgICAgICAgICAgdHJ1ZSwgdHJ1ZSk7CisgICAgaWYgKG1TdXJmYWNlVGV4dHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgaW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CisgICAgcmVzID0gbVN1cmZhY2VUZXh0dXJlLT5zZXREZWZhdWx0QnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIHJlcyA9IG1TdXJmYWNlVGV4dHVyZS0+c2V0RGVmYXVsdEJ1ZmZlckZvcm1hdChmb3JtYXQpOworICAgIGlmIChyZXMpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBtU3VyZmFjZSA9IG5ldyBTdXJmYWNlKG1Qcm9kdWNlciwgLyp1c2VBc3luYyovIHRydWUpOworICAgIGlmIChtU3VyZmFjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgcmVzID0gbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdChtU3VyZmFjZS5nZXQoKSwgTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbm5lY3QgdG8gbmF0aXZlIHdpbmRvdyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmV0dXJuIGRldmljZS0+c2V0UHJldmlld1dpbmRvdyhtU3VyZmFjZSk7Cit9CisKK3N0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sOjpjb25uZWN0Q2FtZXJhRGV2aWNlKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCkgeworICAgIHNwPENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlPiBkZXZpY2UgPQorICAgICAgICAgICAgbmV3IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlKGNhbWVyYUlkLnN0cmluZygpKTsKKworICAgIHN0YXR1c190IHJlcyA9IGRldmljZS0+aW5pdGlhbGl6ZShtQ2FtZXJhTW9kdWxlKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogaW5pdGlhbGl6aW5nIGNhbWVyYSAlcyBmYWlsZWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIG5lZWQgdG8gc2V0IF9fZ2V0X21lbW9yeSBpbiBzZXRfY2FsbGJhY2tzKCkuCisgICAgZGV2aWNlLT5zZXRDYWxsYmFja3MoTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgICBtUGFyYW1ldGVycyA9IGRldmljZS0+Z2V0UGFyYW1ldGVycygpOworCisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIHJlcyA9IGdldFNtYWxsZXN0U3VyZmFjZVNpemUoJndpZHRoLCAmaGVpZ2h0KTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGdldCBzbWFsbGVzdCBzdXJmYWNlIHNpemUgZm9yIGNhbWVyYSAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmVzID0gaW5pdGlhbGl6ZVByZXZpZXdXaW5kb3coZGV2aWNlLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGluaXRpYWxpemUgcHJldmlldyB3aW5kb3cgZm9yIGNhbWVyYSAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgbUNhbWVyYUlkID0gY2FtZXJhSWQ7CisgICAgbURldmljZSA9IGRldmljZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sOjpkaXNjb25uZWN0Q2FtZXJhRGV2aWNlKCkgeworICAgIGlmIChtRGV2aWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIG1QYXJhbWV0ZXJzLnNldChDYW1lcmFQYXJhbWV0ZXJzOjpLRVlfRkxBU0hfTU9ERSwKKyAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OkZMQVNIX01PREVfT0ZGKTsKKyAgICBtRGV2aWNlLT5zZXRQYXJhbWV0ZXJzKG1QYXJhbWV0ZXJzKTsKKyAgICBtRGV2aWNlLT5zdG9wUHJldmlldygpOworICAgIHN0YXR1c190IHJlcyA9IG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QobVN1cmZhY2UuZ2V0KCksCisgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEpOworICAgIGlmIChyZXMpIHsKKyAgICAgICAgQUxPR1coIiVzOiBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0IGZhaWxlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICB9CisgICAgbURldmljZS0+c2V0UHJldmlld1dpbmRvdyhOVUxMKTsKKyAgICBtRGV2aWNlLT5yZWxlYXNlKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisvLyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbCBpbXBsZW1lbnRhdGlvbiBlbmRzCisKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDVmZThkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhRmxhc2hsaWdodC5oCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQUZMQVNITElHSFRfSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQUZMQVNITElHSFRfSAorCisjaW5jbHVkZSAiaGFyZHdhcmUvY2FtZXJhX2NvbW1vbi5oIgorI2luY2x1ZGUgInV0aWxzL0tleWVkVmVjdG9yLmgiCisjaW5jbHVkZSAidXRpbHMvU29ydGVkVmVjdG9yLmgiCisjaW5jbHVkZSAiZ3VpL0dMQ29uc3VtZXIuaCIKKyNpbmNsdWRlICJndWkvU3VyZmFjZS5oIgorI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogRmxhc2hDb250cm9sQmFzZSBpcyBhIGJhc2UgY2xhc3MgZm9yIGZsYXNoIGNvbnRyb2wuIEl0IGRlZmluZXMgdGhlIGZ1bmN0aW9ucworICogdGhhdCBhIGZsYXNoIGNvbnRyb2wgZm9yIGVhY2ggY2FtZXJhIG1vZHVsZS9kZXZpY2UgdmVyc2lvbiBzaG91bGQgaW1wbGVtZW50LgorICovCitjbGFzcyBGbGFzaENvbnRyb2xCYXNlIDogcHVibGljIHZpcnR1YWwgVmlydHVhbExpZ2h0UmVmQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5GbGFzaENvbnRyb2xCYXNlKCk7CisKKyAgICAgICAgLy8gV2hldGhlciBhIGNhbWVyYSBkZXZpY2UgaGFzIGEgZmxhc2ggdW5pdC4gQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIG1heQorICAgICAgICAvLyBjYXVzZSB0aGUgdG9yY2ggbW9kZSB0byBiZSB0dXJuZWQgb2ZmIGluIEhBTCB2MSBkZXZpY2VzLiBJZgorICAgICAgICAvLyBwcmV2aW91c2x5LW9uIHRvcmNoIG1vZGUgaXMgdHVybmVkIG9mZiwKKyAgICAgICAgLy8gY2FsbGJhY2tzLnRvcmNoX21vZGVfc3RhdHVzX2NoYW5nZSgpIHNob3VsZCBiZSBpbnZva2VkLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGhhc0ZsYXNoVW5pdChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCAqaGFzRmxhc2gpID0gMDsKKworICAgICAgICAvLyBzZXQgdGhlIHRvcmNoIG1vZGUgdG8gb24gb3Igb2ZmLgorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRvcmNoTW9kZShjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkKSA9IDA7Cit9OworCisvKioKKyAqIENhbWVyYUZsYXNobGlnaHQgY2FuIGJlIHVzZWQgYnkgY2FtZXJhIHNlcnZpY2UgdG8gY29udHJvbCBmbGFzaGZsaWdodC4KKyAqLworY2xhc3MgQ2FtZXJhRmxhc2hsaWdodCA6IHB1YmxpYyB2aXJ0dWFsIFZpcnR1YWxMaWdodFJlZkJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgQ2FtZXJhRmxhc2hsaWdodChDYW1lcmFNb2R1bGUmIGNhbWVyYU1vZHVsZSwKKyAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190JiBjYWxsYmFja3MpOworICAgICAgICB2aXJ0dWFsIH5DYW1lcmFGbGFzaGxpZ2h0KCk7CisKKyAgICAgICAgLy8gRmluZCBhbGwgZmxhc2ggdW5pdHMuIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIG90aGVyIG1ldGhvZHMuIEFsbAorICAgICAgICAvLyBjYW1lcmEgZGV2aWNlcyBtdXN0IGJlIGNsb3NlZCB3aGVuIGl0J3MgY2FsbGVkIGJlY2F1c2UgSEFMIHYxIGRldmljZXMKKyAgICAgICAgLy8gbmVlZCB0byBiZSBvcGVuZWQgdG8gcXVlcnkgYXZhaWxhYmxlIGZsYXNoIG1vZGVzLgorICAgICAgICBzdGF0dXNfdCBmaW5kRmxhc2hVbml0cygpOworCisgICAgICAgIC8vIFdoZXRoZXIgYSBjYW1lcmEgZGV2aWNlIGhhcyBhIGZsYXNoIHVuaXQuIEJlZm9yZSBmaW5kRmxhc2hVbml0cygpIGlzCisgICAgICAgIC8vIGNhbGxlZCwgdGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyBmYWxzZS4KKyAgICAgICAgYm9vbCBoYXNGbGFzaFVuaXQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpOworCisgICAgICAgIC8vIHNldCB0aGUgdG9yY2ggbW9kZSB0byBvbiBvciBvZmYuCisgICAgICAgIHN0YXR1c190IHNldFRvcmNoTW9kZShjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgYm9vbCBlbmFibGVkKTsKKworICAgICAgICAvLyBOb3RpZnkgQ2FtZXJhRmxhc2hsaWdodCB0aGF0IGNhbWVyYSBzZXJ2aWNlIGlzIGdvaW5nIHRvIG9wZW4gYSBjYW1lcmEKKyAgICAgICAgLy8gZGV2aWNlLiBDYW1lcmFGbGFzaGxpZ2h0IHdpbGwgZnJlZSB0aGUgcmVzb3VyY2VzIHRoYXQgbWF5IGNhdXNlIHRoZQorICAgICAgICAvLyBjYW1lcmEgb3BlbiB0byBmYWlsLiBDYW1lcmEgc2VydmljZSBtdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUKKyAgICAgICAgLy8gb3BlbmluZyBhIGNhbWVyYSBkZXZpY2UuCisgICAgICAgIHN0YXR1c190IHByZXBhcmVEZXZpY2VPcGVuKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKTsKKworICAgICAgICAvLyBOb3RpZnkgQ2FtZXJhRmxhc2hsaWdodCB0aGF0IGNhbWVyYSBzZXJ2aWNlIGhhcyBjbG9zZWQgYSBjYW1lcmEKKyAgICAgICAgLy8gZGV2aWNlLiBDYW1lcmFGbGFzaGxpZ2h0IG1heSBpbnZva2UgY2FsbGJhY2tzIGZvciB0b3JjaCBtb2RlCisgICAgICAgIC8vIGF2YWlsYWJsZSBkZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uLgorICAgICAgICBzdGF0dXNfdCBkZXZpY2VDbG9zZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gY3JlYXRlIGZsYXNobGlnaHQgY29udHJvbCBiYXNlZCBvbiBjYW1lcmEgbW9kdWxlIEFQSSBhbmQgY2FtZXJhCisgICAgICAgIC8vIGRldmljZSBBUEkgdmVyc2lvbnMuCisgICAgICAgIHN0YXR1c190IGNyZWF0ZUZsYXNobGlnaHRDb250cm9sKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKTsKKworICAgICAgICAvLyBtTG9jayBzaG91bGQgYmUgbG9ja2VkLgorICAgICAgICBib29sIGhhc0ZsYXNoVW5pdExvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCk7CisKKyAgICAgICAgc3A8Rmxhc2hDb250cm9sQmFzZT4gbUZsYXNoQ29udHJvbDsKKyAgICAgICAgQ2FtZXJhTW9kdWxlICptQ2FtZXJhTW9kdWxlOworICAgICAgICBjb25zdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190ICptQ2FsbGJhY2tzOworICAgICAgICBTb3J0ZWRWZWN0b3I8U3RyaW5nOD4gbU9wZW5lZENhbWVyYUlkczsKKworICAgICAgICAvLyBjYW1lcmEgaWQgLT4gaWYgaXQgaGFzIGEgZmxhc2ggdW5pdAorICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBib29sPiBtSGFzRmxhc2hsaWdodE1hcDsKKyAgICAgICAgYm9vbCBtRmxhc2hsaWdodE1hcEluaXRpYWxpemVkOworCisgICAgICAgIE11dGV4IG1Mb2NrOyAvLyBwcm90ZWN0IENhbWVyYUZsYXNobGlnaHQgQVBJCit9OworCisvKioKKyAqIEZsYXNoIGNvbnRyb2wgZm9yIGNhbWVyYSBtb2R1bGUgdjIuNCBhbmQgYWJvdmUuCisgKi8KK2NsYXNzIE1vZHVsZUZsYXNoQ29udHJvbCA6IHB1YmxpYyBGbGFzaENvbnRyb2xCYXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIE1vZHVsZUZsYXNoQ29udHJvbChDYW1lcmFNb2R1bGUmIGNhbWVyYU1vZHVsZSwKKyAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190JiBjYWxsYmFja3MpOworICAgICAgICB2aXJ0dWFsIH5Nb2R1bGVGbGFzaENvbnRyb2woKTsKKworICAgICAgICAvLyBGbGFzaENvbnRyb2xCYXNlCisgICAgICAgIHN0YXR1c190IGhhc0ZsYXNoVW5pdChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgYm9vbCAqaGFzRmxhc2gpOworICAgICAgICBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgZW5hYmxlZCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBDYW1lcmFNb2R1bGUgKm1DYW1lcmFNb2R1bGU7CisKKyAgICAgICAgTXV0ZXggbUxvY2s7Cit9OworCisvKioKKyAqIEZsYXNoIGNvbnRyb2wgZm9yIGNhbWVyYSBtb2R1bGUgPD0gdjIuMyBhbmQgY2FtZXJhIEhBTCB2Mi12MworICovCitjbGFzcyBDYW1lcmFEZXZpY2VDbGllbnRGbGFzaENvbnRyb2wgOiBwdWJsaWMgRmxhc2hDb250cm9sQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICBDYW1lcmFEZXZpY2VDbGllbnRGbGFzaENvbnRyb2woQ2FtZXJhTW9kdWxlJiBjYW1lcmFNb2R1bGUsCisgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCYgY2FsbGJhY2tzKTsKKyAgICAgICAgdmlydHVhbCB+Q2FtZXJhRGV2aWNlQ2xpZW50Rmxhc2hDb250cm9sKCk7CisKKyAgICAgICAgLy8gRmxhc2hDb250cm9sQmFzZQorICAgICAgICBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgZW5hYmxlZCk7CisgICAgICAgIHN0YXR1c190IGhhc0ZsYXNoVW5pdChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgYm9vbCAqaGFzRmxhc2gpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gY29ubmVjdCB0byBhIGNhbWVyYSBkZXZpY2UKKyAgICAgICAgc3RhdHVzX3QgY29ubmVjdENhbWVyYURldmljZShjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCk7CisgICAgICAgIC8vIGRpc2Nvbm5lY3QgYW5kIGZyZWUgbURldmljZQorICAgICAgICBzdGF0dXNfdCBkaXNjb25uZWN0Q2FtZXJhRGV2aWNlKCk7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBhIHN1cmZhY2UKKyAgICAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZVN1cmZhY2Uoc3A8Q2FtZXJhRGV2aWNlQmFzZT4mIGRldmljZSwgaW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCk7CisKKyAgICAgICAgLy8gc3VibWl0IGEgcmVxdWVzdCB0byBlbmFibGUgdGhlIHRvcmNoIG1vZGUKKyAgICAgICAgc3RhdHVzX3Qgc3VibWl0VG9yY2hFbmFibGVkUmVxdWVzdCgpOworCisgICAgICAgIC8vIGdldCB0aGUgc21hbGxlc3Qgc3VyZmFjZSBzaXplIG9mIElNUExFTUVOVEFUSU9OX0RFRklORUQKKyAgICAgICAgc3RhdHVzX3QgZ2V0U21hbGxlc3RTdXJmYWNlU2l6ZShjb25zdCBjYW1lcmFfaW5mbyYgaW5mbywgaW50MzJfdCAqd2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmhlaWdodCk7CisKKyAgICAgICAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCisgICAgICAgIHN0YXR1c190IGhhc0ZsYXNoVW5pdExvY2tlZChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgYm9vbCAqaGFzRmxhc2gpOworCisgICAgICAgIENhbWVyYU1vZHVsZSAqbUNhbWVyYU1vZHVsZTsKKyAgICAgICAgY29uc3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCAqbUNhbGxiYWNrczsKKyAgICAgICAgU3RyaW5nOCBtQ2FtZXJhSWQ7CisgICAgICAgIGJvb2wgbVRvcmNoRW5hYmxlZDsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgKm1NZXRhZGF0YTsKKyAgICAgICAgLy8gV09SS0FST1VORDogd2lsbCBiZSBzZXQgdG8gdHJ1ZSBmb3IgSEFMIHYyIGRldmljZXMgd2hlcmUKKyAgICAgICAgLy8gc2V0U3RyZWFtaW5nUmVxdWVzdCgpIG5lZWRzIHRvIGJlIGNhbGwgZm9yIHRvcmNoIG1vZGUgc2V0dGluZ3MgdG8KKyAgICAgICAgLy8gdGFrZSBlZmZlY3QuCisgICAgICAgIGJvb2wgbVN0cmVhbWluZzsKKworICAgICAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBtRGV2aWNlOworCisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1Qcm9kdWNlcjsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gIG1Db25zdW1lcjsKKyAgICAgICAgc3A8R0xDb25zdW1lcj4gbVN1cmZhY2VUZXh0dXJlOworICAgICAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZTsKKyAgICAgICAgaW50MzJfdCBtU3RyZWFtSWQ7CisKKyAgICAgICAgTXV0ZXggbUxvY2s7Cit9OworCisvKioKKyAqIEZsYXNoIGNvbnRyb2wgZm9yIGNhbWVyYSBtb2R1bGUgPD0gdjIuMyBhbmQgY2FtZXJhIEhBTCB2MQorICovCitjbGFzcyBDYW1lcmFIYXJkd2FyZUludGVyZmFjZUZsYXNoQ29udHJvbCA6IHB1YmxpYyBGbGFzaENvbnRyb2xCYXNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sKENhbWVyYU1vZHVsZSYgY2FtZXJhTW9kdWxlLAorICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzX3QmIGNhbGxiYWNrcyk7CisgICAgICAgIHZpcnR1YWwgfkNhbWVyYUhhcmR3YXJlSW50ZXJmYWNlRmxhc2hDb250cm9sKCk7CisKKyAgICAgICAgLy8gRmxhc2hDb250cm9sQmFzZQorICAgICAgICBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGJvb2wgZW5hYmxlZCk7CisgICAgICAgIHN0YXR1c190IGhhc0ZsYXNoVW5pdChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgYm9vbCAqaGFzRmxhc2gpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gY29ubmVjdCB0byBhIGNhbWVyYSBkZXZpY2UKKyAgICAgICAgc3RhdHVzX3QgY29ubmVjdENhbWVyYURldmljZShjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCk7CisKKyAgICAgICAgLy8gZGlzY29ubmVjdCBhbmQgZnJlZSBtRGV2aWNlCisgICAgICAgIHN0YXR1c190IGRpc2Nvbm5lY3RDYW1lcmFEZXZpY2UoKTsKKworICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBwcmV2aWV3IHdpbmRvdworICAgICAgICBzdGF0dXNfdCBpbml0aWFsaXplUHJldmlld1dpbmRvdyhzcDxDYW1lcmFIYXJkd2FyZUludGVyZmFjZT4gZGV2aWNlLAorICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKworICAgICAgICAvLyBzdGFydCBwcmV2aWV3IGFuZCBlbmFibGUgdG9yY2gKKyAgICAgICAgc3RhdHVzX3Qgc3RhcnRQcmV2aWV3QW5kVG9yY2goKTsKKworICAgICAgICAvLyBnZXQgdGhlIHNtYWxsZXN0IHN1cmZhY2UKKyAgICAgICAgc3RhdHVzX3QgZ2V0U21hbGxlc3RTdXJmYWNlU2l6ZShpbnQzMl90ICp3aWR0aCwgaW50MzJfdCAqaGVpZ2h0KTsKKworICAgICAgICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKKyAgICAgICAgc3RhdHVzX3QgaGFzRmxhc2hVbml0TG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBib29sICpoYXNGbGFzaCk7CisKKyAgICAgICAgQ2FtZXJhTW9kdWxlICptQ2FtZXJhTW9kdWxlOworICAgICAgICBjb25zdCBjYW1lcmFfbW9kdWxlX2NhbGxiYWNrc190ICptQ2FsbGJhY2tzOworICAgICAgICBzcDxDYW1lcmFIYXJkd2FyZUludGVyZmFjZT4gbURldmljZTsKKyAgICAgICAgU3RyaW5nOCBtQ2FtZXJhSWQ7CisgICAgICAgIENhbWVyYVBhcmFtZXRlcnMgbVBhcmFtZXRlcnM7CisgICAgICAgIGJvb2wgbVRvcmNoRW5hYmxlZDsKKworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CisgICAgICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+ICBtQ29uc3VtZXI7CisgICAgICAgIHNwPEdMQ29uc3VtZXI+IG1TdXJmYWNlVGV4dHVyZTsKKyAgICAgICAgc3A8U3VyZmFjZT4gbVN1cmZhY2U7CisKKyAgICAgICAgTXV0ZXggbUxvY2s7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAppbmRleCBhMTQ0NzUzLi44MzkxZjI2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcApAQCAtMTcsOSArMTcsMTQgQEAKICNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhU2VydmljZSIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjbGltaXRzPgogI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxjdGltZT4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvQXBwT3BzTWFuYWdlci5oPgpAQCAtMjcsNiArMzIsOCBAQAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzSW5mb1NlcnZpY2UuaD4KKyNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVNlcnZpY2VQcm94eS5oPgogI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CkBAIC0zNCw2ICs0MSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9CYXR0ZXJ5Tm90aWZpZXIuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgpAQCAtNDUsNyArNTMsNiBAQAogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKICNpbmNsdWRlICJhcGkxL0NhbWVyYUNsaWVudC5oIgogI2luY2x1ZGUgImFwaTEvQ2FtZXJhMkNsaWVudC5oIgotI2luY2x1ZGUgImFwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5oIgogI2luY2x1ZGUgImFwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgiCiAjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVHJhY2VzLmgiCiAjaW5jbHVkZSAiQ2FtZXJhRGV2aWNlRmFjdG9yeS5oIgpAQCAtNjYsMjUgKzczLDQ4IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3RhdGljIGludCBnZXRDYWxsaW5nUGlkKCkgewotICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1VpZCgpIHsKLSAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotfQotCiBleHRlcm4gIkMiIHsKIHN0YXRpYyB2b2lkIGNhbWVyYV9kZXZpY2Vfc3RhdHVzX2NoYW5nZSgKICAgICAgICAgY29uc3Qgc3RydWN0IGNhbWVyYV9tb2R1bGVfY2FsbGJhY2tzKiBjYWxsYmFja3MsCiAgICAgICAgIGludCBjYW1lcmFfaWQsCiAgICAgICAgIGludCBuZXdfc3RhdHVzKSB7CiAgICAgc3A8Q2FtZXJhU2VydmljZT4gY3MgPSBjb25zdF9jYXN0PENhbWVyYVNlcnZpY2UqPigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IENhbWVyYVNlcnZpY2UqPihjYWxsYmFja3MpKTsKKworICAgIGNzLT5vbkRldmljZVN0YXR1c0NoYW5nZWQoc3RhdGljX2Nhc3Q8Y2FtZXJhX2RldmljZV9zdGF0dXNfdD4oY2FtZXJhX2lkKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYV9kZXZpY2Vfc3RhdHVzX3Q+KG5ld19zdGF0dXMpKTsKK30KKworc3RhdGljIHZvaWQgdG9yY2hfbW9kZV9zdGF0dXNfY2hhbmdlKAorICAgICAgICBjb25zdCBzdHJ1Y3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3MqIGNhbGxiYWNrcywKKyAgICAgICAgY29uc3QgY2hhciogY2FtZXJhX2lkLAorICAgICAgICBpbnQgbmV3X3N0YXR1cykgeworICAgIGlmICghY2FsbGJhY2tzIHx8ICFjYW1lcmFfaWQpIHsKKyAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgcGFyYW1ldGVycy4gY2FsbGJhY2tzICVwLCBjYW1lcmFfaWQgJXAiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgY2FsbGJhY2tzLCBjYW1lcmFfaWQpOworICAgIH0KKyAgICBzcDxDYW1lcmFTZXJ2aWNlPiBjcyA9IGNvbnN0X2Nhc3Q8Q2FtZXJhU2VydmljZSo+KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBDYW1lcmFTZXJ2aWNlKj4oY2FsbGJhY2tzKSk7CiAKLSAgICBjcy0+b25EZXZpY2VTdGF0dXNDaGFuZ2VkKAotICAgICAgICBjYW1lcmFfaWQsCi0gICAgICAgIG5ld19zdGF0dXMpOworICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRvcmNoU3RhdHVzIHN0YXR1czsKKyAgICBzd2l0Y2ggKG5ld19zdGF0dXMpIHsKKyAgICAgICAgY2FzZSBUT1JDSF9NT0RFX1NUQVRVU19OT1RfQVZBSUxBQkxFOgorICAgICAgICAgICAgc3RhdHVzID0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VE9SQ0hfU1RBVFVTX05PVF9BVkFJTEFCTEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUT1JDSF9NT0RFX1NUQVRVU19BVkFJTEFCTEVfT0ZGOgorICAgICAgICAgICAgc3RhdHVzID0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VE9SQ0hfU1RBVFVTX0FWQUlMQUJMRV9PRkY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUT1JDSF9NT0RFX1NUQVRVU19BVkFJTEFCTEVfT046CisgICAgICAgICAgICBzdGF0dXMgPSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUT1JDSF9TVEFUVVNfQVZBSUxBQkxFX09OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5rbm93biB0b3JjaCBzdGF0dXMgJWQiLCBuZXdfc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjcy0+b25Ub3JjaFN0YXR1c0NoYW5nZWQoCisgICAgICAgIFN0cmluZzgoY2FtZXJhX2lkKSwKKyAgICAgICAgc3RhdHVzKTsKIH0KIH0gLy8gZXh0ZXJuICJDIgogCkBAIC05NCwxMzQgKzEyNCwyOTQgQEAKIC8vIHNob3VsZCBiZSBvayBmb3Igbm93Lgogc3RhdGljIENhbWVyYVNlcnZpY2UgKmdDYW1lcmFTZXJ2aWNlOwogCi1DYW1lcmFTZXJ2aWNlOjpDYW1lcmFTZXJ2aWNlKCkKLSAgICA6bVNvdW5kUmVmKDApLCBtTW9kdWxlKDApCi17CitDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTZXJ2aWNlKCkgOiBtRXZlbnRMb2coREVGQVVMVF9FVkVOVF9MT0dfTEVOR1RIKSwgbUFsbG93ZWRVc2VycygpLAorICAgICAgICBtU291bmRSZWYoMCksIG1Nb2R1bGUoMCksIG1GbGFzaGxpZ2h0KDApIHsKICAgICBBTE9HSSgiQ2FtZXJhU2VydmljZSBzdGFydGVkIChwaWQ9JWQpIiwgZ2V0cGlkKCkpOwogICAgIGdDYW1lcmFTZXJ2aWNlID0gdGhpczsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX0NBTUVSQVM7ICsraSkgewotICAgICAgICBtU3RhdHVzTGlzdFtpXSA9IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19QUkVTRU5UOwotICAgIH0KLQogICAgIHRoaXMtPmNhbWVyYV9kZXZpY2Vfc3RhdHVzX2NoYW5nZSA9IGFuZHJvaWQ6OmNhbWVyYV9kZXZpY2Vfc3RhdHVzX2NoYW5nZTsKKyAgICB0aGlzLT50b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2UgPSBhbmRyb2lkOjp0b3JjaF9tb2RlX3N0YXR1c19jaGFuZ2U7CisKKyAgICBtU2VydmljZUxvY2tXcmFwcGVyID0gc3RkOjptYWtlX3NoYXJlZDxXYWl0YWJsZU11dGV4V3JhcHBlcj4oJm1TZXJ2aWNlTG9jayk7CiB9CiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6b25GaXJzdFJlZigpCiB7Ci0gICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6b25GaXJzdFJlZiIpOworICAgIEFMT0dJKCJDYW1lcmFTZXJ2aWNlIHByb2Nlc3Mgc3RhcnRpbmciKTsKIAogICAgIEJuQ2FtZXJhU2VydmljZTo6b25GaXJzdFJlZigpOwogCi0gICAgaWYgKGh3X2dldF9tb2R1bGUoQ0FNRVJBX0hBUkRXQVJFX01PRFVMRV9JRCwKLSAgICAgICAgICAgICAgICAoY29uc3QgaHdfbW9kdWxlX3QgKiopJm1Nb2R1bGUpIDwgMCkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGxvYWQgY2FtZXJhIEhBTCBtb2R1bGUiKTsKKyAgICAvLyBVcGRhdGUgYmF0dGVyeSBsaWZlIHRyYWNraW5nIGlmIHNlcnZpY2UgaXMgcmVzdGFydGluZworICAgIEJhdHRlcnlOb3RpZmllciYgbm90aWZpZXIoQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpKTsKKyAgICBub3RpZmllci5ub3RlUmVzZXRDYW1lcmEoKTsKKyAgICBub3RpZmllci5ub3RlUmVzZXRGbGFzaGxpZ2h0KCk7CisKKyAgICBjYW1lcmFfbW9kdWxlX3QgKnJhd01vZHVsZTsKKyAgICBpbnQgZXJyID0gaHdfZ2V0X21vZHVsZShDQU1FUkFfSEFSRFdBUkVfTU9EVUxFX0lELAorICAgICAgICAgICAgKGNvbnN0IGh3X21vZHVsZV90ICoqKSZyYXdNb2R1bGUpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgbG9hZCBjYW1lcmEgSEFMIG1vZHVsZTogJWQgKCVzKSIsIGVyciwgc3RyZXJyb3IoLWVycikpOworICAgICAgICBsb2dTZXJ2aWNlRXJyb3IoIkNvdWxkIG5vdCBsb2FkIGNhbWVyYSBIQUwgbW9kdWxlIiwgZXJyKTsKICAgICAgICAgbU51bWJlck9mQ2FtZXJhcyA9IDA7CisgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIEFMT0dJKCJMb2FkZWQgXCIlc1wiIGNhbWVyYSBtb2R1bGUiLCBtTW9kdWxlLT5jb21tb24ubmFtZSk7Ci0gICAgICAgIG1OdW1iZXJPZkNhbWVyYXMgPSBtTW9kdWxlLT5nZXRfbnVtYmVyX29mX2NhbWVyYXMoKTsKLSAgICAgICAgaWYgKG1OdW1iZXJPZkNhbWVyYXMgPiBNQVhfQ0FNRVJBUykgewotICAgICAgICAgICAgQUxPR0UoIk51bWJlciBvZiBjYW1lcmFzKCVkKSA+IE1BWF9DQU1FUkFTKCVkKS4iLAotICAgICAgICAgICAgICAgICAgICBtTnVtYmVyT2ZDYW1lcmFzLCBNQVhfQ0FNRVJBUyk7Ci0gICAgICAgICAgICBtTnVtYmVyT2ZDYW1lcmFzID0gTUFYX0NBTUVSQVM7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZDYW1lcmFzOyBpKyspIHsKLSAgICAgICAgICAgIHNldENhbWVyYUZyZWUoaSk7Ci0gICAgICAgIH0KIAotICAgICAgICBpZiAobU1vZHVsZS0+Y29tbW9uLm1vZHVsZV9hcGlfdmVyc2lvbiA+PQotICAgICAgICAgICAgICAgIENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8xKSB7Ci0gICAgICAgICAgICBtTW9kdWxlLT5zZXRfY2FsbGJhY2tzKHRoaXMpOwotICAgICAgICB9CisgICAgbU1vZHVsZSA9IG5ldyBDYW1lcmFNb2R1bGUocmF3TW9kdWxlKTsKKyAgICBBTE9HSSgiTG9hZGVkIFwiJXNcIiBjYW1lcmEgbW9kdWxlIiwgbU1vZHVsZS0+Z2V0TW9kdWxlTmFtZSgpKTsKKyAgICBlcnIgPSBtTW9kdWxlLT5pbml0KCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGluaXRpYWxpemUgY2FtZXJhIEhBTCBtb2R1bGU6ICVkICglcykiLCBlcnIsCisgICAgICAgICAgICBzdHJlcnJvcigtZXJyKSk7CisgICAgICAgIGxvZ1NlcnZpY2VFcnJvcigiQ291bGQgbm90IGluaXRpYWxpemUgY2FtZXJhIEhBTCBtb2R1bGUiLCBlcnIpOwogCi0gICAgICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNsZWFyR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOwotCi0gICAgICAgIGlmIChtTW9kdWxlLT5jb21tb24ubW9kdWxlX2FwaV92ZXJzaW9uID49IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8yKSB7Ci0gICAgICAgICAgICBzZXRVcFZlbmRvclRhZ3MoKTsKLSAgICAgICAgfQotCi0gICAgICAgIENhbWVyYURldmljZUZhY3Rvcnk6OnJlZ2lzdGVyU2VydmljZSh0aGlzKTsKKyAgICAgICAgbU51bWJlck9mQ2FtZXJhcyA9IDA7CisgICAgICAgIGRlbGV0ZSBtTW9kdWxlOworICAgICAgICBtTW9kdWxlID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLX0KIAotQ2FtZXJhU2VydmljZTo6fkNhbWVyYVNlcnZpY2UoKSB7CisgICAgbU51bWJlck9mQ2FtZXJhcyA9IG1Nb2R1bGUtPmdldE51bWJlck9mQ2FtZXJhcygpOworICAgIG1OdW1iZXJPZk5vcm1hbENhbWVyYXMgPSBtTnVtYmVyT2ZDYW1lcmFzOworCisgICAgbUZsYXNobGlnaHQgPSBuZXcgQ2FtZXJhRmxhc2hsaWdodCgqbU1vZHVsZSwgKnRoaXMpOworICAgIHN0YXR1c190IHJlcyA9IG1GbGFzaGxpZ2h0LT5maW5kRmxhc2hVbml0cygpOworICAgIGlmIChyZXMpIHsKKyAgICAgICAgLy8gaW1wb3NzaWJsZSBiZWNhdXNlIHdlIGhhdmVuJ3Qgb3BlbiBhbnkgY2FtZXJhIGRldmljZXMuCisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmluZCBmbGFzaCB1bml0cy4iKTsKKyAgICB9CisKKyAgICBpbnQgbGF0ZXN0U3RyYW5nZUNhbWVyYUlkID0gSU5UX01BWDsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1iZXJPZkNhbWVyYXM7IGkrKykgewotICAgICAgICBpZiAobUJ1c3lbaV0pIHsKLSAgICAgICAgICAgIEFMT0dFKCJjYW1lcmEgJWQgaXMgc3RpbGwgaW4gdXNlIGluIGRlc3RydWN0b3IhIiwgaSk7CisgICAgICAgIFN0cmluZzggY2FtZXJhSWQgPSBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgaSk7CisKKyAgICAgICAgLy8gR2V0IGNhbWVyYSBpbmZvCisKKyAgICAgICAgc3RydWN0IGNhbWVyYV9pbmZvIGluZm87CisgICAgICAgIGJvb2wgaGF2ZUluZm8gPSB0cnVlOworICAgICAgICBzdGF0dXNfdCByYyA9IG1Nb2R1bGUtPmdldENhbWVyYUluZm8oaSwgJmluZm8pOworICAgICAgICBpZiAocmMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogUmVjZWl2ZWQgZXJyb3IgbG9hZGluZyBjYW1lcmEgaW5mbyBmb3IgZGV2aWNlICVkLCBjb3N0IGFuZCIKKyAgICAgICAgICAgICAgICAgICAgIiBjb25mbGljdGluZyBkZXZpY2VzIGZpZWxkcyBzZXQgdG8gZGVmYXVsdHMgZm9yIHRoaXMgZGV2aWNlLiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaSk7CisgICAgICAgICAgICBoYXZlSW5mbyA9IGZhbHNlOwogICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHN1cHBvcnQKKyAgICAgICAgaWYgKGhhdmVJbmZvKSB7CisgICAgICAgICAgICBpZiAoY2hlY2tDYW1lcmFDYXBhYmlsaXRpZXMoaSwgaW5mbywgJmxhdGVzdFN0cmFuZ2VDYW1lcmFJZCkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBkZWxldGUgbU1vZHVsZTsKKyAgICAgICAgICAgICAgICBtTW9kdWxlID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEZWZhdWx0cyB0byB1c2UgZm9yIGNvc3QgYW5kIGNvbmZsaWN0aW5nIGRldmljZXMKKyAgICAgICAgaW50IGNvc3QgPSAxMDA7CisgICAgICAgIGNoYXIqKiBjb25mbGljdGluZ19kZXZpY2VzID0gbnVsbHB0cjsKKyAgICAgICAgc2l6ZV90IGNvbmZsaWN0aW5nX2RldmljZXNfbGVuZ3RoID0gMDsKKworICAgICAgICAvLyBJZiB1c2luZyBwb3N0LTIuNCBtb2R1bGUgdmVyc2lvbiwgcXVlcnkgdGhlIGNvc3QgKyBjb25mbGljdGluZyBkZXZpY2VzIGZyb20gdGhlIEhBTAorICAgICAgICBpZiAobU1vZHVsZS0+Z2V0TW9kdWxlQXBpVmVyc2lvbigpID49IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl80ICYmIGhhdmVJbmZvKSB7CisgICAgICAgICAgICBjb3N0ID0gaW5mby5yZXNvdXJjZV9jb3N0OworICAgICAgICAgICAgY29uZmxpY3RpbmdfZGV2aWNlcyA9IGluZm8uY29uZmxpY3RpbmdfZGV2aWNlczsKKyAgICAgICAgICAgIGNvbmZsaWN0aW5nX2RldmljZXNfbGVuZ3RoID0gaW5mby5jb25mbGljdGluZ19kZXZpY2VzX2xlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6c2V0PFN0cmluZzg+IGNvbmZsaWN0aW5nOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbmZsaWN0aW5nX2RldmljZXNfbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGNvbmZsaWN0aW5nLmVtcGxhY2UoU3RyaW5nOChjb25mbGljdGluZ19kZXZpY2VzW2ldKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbml0aWFsaXplIHN0YXRlIGZvciBlYWNoIGNhbWVyYSBkZXZpY2UKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUNhbWVyYVN0YXRlc0xvY2spOworICAgICAgICAgICAgbUNhbWVyYVN0YXRlcy5lbXBsYWNlKGNhbWVyYUlkLCBzdGQ6Om1ha2Vfc2hhcmVkPENhbWVyYVN0YXRlPihjYW1lcmFJZCwgY29zdCwKKyAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RpbmcpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRmxhc2hsaWdodC0+aGFzRmxhc2hVbml0KGNhbWVyYUlkKSkgeworICAgICAgICAgICAgbVRvcmNoU3RhdHVzTWFwLmFkZChjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VE9SQ0hfU1RBVFVTX0FWQUlMQUJMRV9PRkYpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1Nb2R1bGUtPmdldE1vZHVsZUFwaVZlcnNpb24oKSA+PSBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMSkgeworICAgICAgICBtTW9kdWxlLT5zZXRDYWxsYmFja3ModGhpcyk7CiAgICAgfQogCiAgICAgVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y2xlYXJHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7Ci0gICAgZ0NhbWVyYVNlcnZpY2UgPSBOVUxMOworCisgICAgaWYgKG1Nb2R1bGUtPmdldE1vZHVsZUFwaVZlcnNpb24oKSA+PSBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMikgeworICAgICAgICBzZXRVcFZlbmRvclRhZ3MoKTsKKyAgICB9CisKKyAgICBDYW1lcmFEZXZpY2VGYWN0b3J5OjpyZWdpc3RlclNlcnZpY2UodGhpcyk7CisKKyAgICBDYW1lcmFTZXJ2aWNlOjpwaW5nQ2FtZXJhU2VydmljZVByb3h5KCk7CiB9CiAKLXZvaWQgQ2FtZXJhU2VydmljZTo6b25EZXZpY2VTdGF0dXNDaGFuZ2VkKGludCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdTdGF0dXMpCi17Cit2b2lkIENhbWVyYVNlcnZpY2U6OnBpbmdDYW1lcmFTZXJ2aWNlUHJveHkoKSB7CisgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jYW1lcmEucHJveHkiKSk7CisgICAgaWYgKGJpbmRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8SUNhbWVyYVNlcnZpY2VQcm94eT4gcHJveHlCaW5kZXIgPSBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhU2VydmljZVByb3h5PihiaW5kZXIpOworICAgIHByb3h5QmluZGVyLT5waW5nRm9yVXNlclVwZGF0ZSgpOworfQorCitDYW1lcmFTZXJ2aWNlOjp+Q2FtZXJhU2VydmljZSgpIHsKKyAgICBpZiAobU1vZHVsZSkgeworICAgICAgICBkZWxldGUgbU1vZHVsZTsKKyAgICAgICAgbU1vZHVsZSA9IG51bGxwdHI7CisgICAgfQorICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNsZWFyR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOworICAgIGdDYW1lcmFTZXJ2aWNlID0gbnVsbHB0cjsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpvbkRldmljZVN0YXR1c0NoYW5nZWQoY2FtZXJhX2RldmljZV9zdGF0dXNfdCAgY2FtZXJhSWQsCisgICAgICAgIGNhbWVyYV9kZXZpY2Vfc3RhdHVzX3QgbmV3U3RhdHVzKSB7CiAgICAgQUxPR0koIiVzOiBTdGF0dXMgY2hhbmdlZCBmb3IgY2FtZXJhSWQ9JWQsIG5ld1N0YXR1cz0lZCIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICBjYW1lcmFJZCwgbmV3U3RhdHVzKTsKIAotICAgIGlmIChjYW1lcmFJZCA8IDAgfHwgY2FtZXJhSWQgPj0gTUFYX0NBTUVSQVMpIHsKKyAgICBTdHJpbmc4IGlkID0gU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYUlkKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FtZXJhU3RhdGU+IHN0YXRlID0gZ2V0Q2FtZXJhU3RhdGUoaWQpOworCisgICAgaWYgKHN0YXRlID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBCYWQgY2FtZXJhIElEICVkIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAoKGludClnZXRTdGF0dXMoY2FtZXJhSWQpID09IG5ld1N0YXR1cykgewotICAgICAgICBBTE9HRSgiJXM6IFN0YXRlIHRyYW5zaXRpb24gdG8gdGhlIHNhbWUgc3RhdHVzIDB4JXggbm90IGFsbG93ZWQiLAotICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICh1aW50MzJfdCluZXdTdGF0dXMpOworICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cyBvbGRTdGF0dXMgPSBzdGF0ZS0+Z2V0U3RhdHVzKCk7CisKKyAgICBpZiAob2xkU3RhdHVzID09IHN0YXRpY19jYXN0PElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cz4obmV3U3RhdHVzKSkgeworICAgICAgICBBTE9HRSgiJXM6IFN0YXRlIHRyYW5zaXRpb24gdG8gdGhlIHNhbWUgc3RhdHVzICUjeCBub3QgYWxsb3dlZCIsIF9fRlVOQ1RJT05fXywgbmV3U3RhdHVzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8qIGRvbid0IGRvIHRoaXMgaW4gdXBkYXRlU3RhdHVzCi0gICAgICAgc2luY2UgaXQgaXMgYWxzbyBjYWxsZWQgZnJvbSBjb25uZWN0IGFuZCB3ZSBjb3VsZCBnZXQgaW50byBhIGRlYWRsb2NrICovCiAgICAgaWYgKG5ld1N0YXR1cyA9PSBDQU1FUkFfREVWSUNFX1NUQVRVU19OT1RfUFJFU0VOVCkgewotICAgICAgICBWZWN0b3I8c3A8QmFzaWNDbGllbnQ+ID4gY2xpZW50c1RvRGlzY29ubmVjdDsKKyAgICAgICAgbG9nRGV2aWNlUmVtb3ZlZChpZCwgU3RyaW5nODo6Zm9ybWF0KCJEZXZpY2Ugc3RhdHVzIGNoYW5nZWQgZnJvbSAlZCB0byAlZCIsIG9sZFN0YXR1cywKKyAgICAgICAgICAgICAgICBuZXdTdGF0dXMpKTsKKyAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudFRvRGlzY29ubmVjdDsKICAgICAgICAgewotICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVNlcnZpY2VMb2NrKTsKKyAgICAgICAgICAgIC8vIERvbid0IGRvIHRoaXMgaW4gdXBkYXRlU3RhdHVzIHRvIGF2b2lkIGRlYWRsb2NrIG92ZXIgbVNlcnZpY2VMb2NrCisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwogCi0gICAgICAgICAgIC8qIFJlbW92ZSBjYWNoZWQgcGFyYW1ldGVycyBmcm9tIHNoaW0gY2FjaGUgKi8KLSAgICAgICAgICAgbVNoaW1QYXJhbXMucmVtb3ZlSXRlbShjYW1lcmFJZCk7CisgICAgICAgICAgICAvLyBTZXQgdGhlIGRldmljZSBzdGF0dXMgdG8gTk9UX1BSRVNFTlQsIGNsaWVudHMgd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byBjb25uZWN0CisgICAgICAgICAgICAvLyB0byB0aGlzIGRldmljZSB1bnRpbCB0aGUgc3RhdHVzIGNoYW5nZXMKKyAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX1BSRVNFTlQsIGlkKTsKIAotICAgICAgICAgICAvKiBGaW5kIGFsbCBjbGllbnRzIHRoYXQgd2UgbmVlZCB0byBkaXNjb25uZWN0ICovCi0gICAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnQgPSBtQ2xpZW50W2NhbWVyYUlkXS5wcm9tb3RlKCk7Ci0gICAgICAgICAgIGlmIChjbGllbnQuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgY2xpZW50c1RvRGlzY29ubmVjdC5wdXNoX2JhY2soY2xpZW50KTsKLSAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUmVtb3ZlIGNhY2hlZCBzaGltIHBhcmFtZXRlcnMKKyAgICAgICAgICAgIHN0YXRlLT5zZXRTaGltUGFyYW1zKENhbWVyYVBhcmFtZXRlcnMoKSk7CiAKLSAgICAgICAgICAgaW50IGkgPSBjYW1lcmFJZDsKLSAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtUHJvQ2xpZW50TGlzdFtpXS5zaXplKCk7ICsraikgewotICAgICAgICAgICAgICAgc3A8UHJvQ2xpZW50PiBjbCA9IG1Qcm9DbGllbnRMaXN0W2ldW2pdLnByb21vdGUoKTsKLSAgICAgICAgICAgICAgIGlmIChjbCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgY2xpZW50c1RvRGlzY29ubmVjdC5wdXNoX2JhY2soY2wpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGNsaWVudCBmcm9tIHRoZSBsaXN0IG9mIGFjdGl2ZSBjbGllbnRzCisgICAgICAgICAgICBjbGllbnRUb0Rpc2Nvbm5lY3QgPSByZW1vdmVDbGllbnRMb2NrZWQoaWQpOworCisgICAgICAgICAgICAvLyBOb3RpZnkgdGhlIGNsaWVudCBvZiBkaXNjb25uZWN0aW9uCisgICAgICAgICAgICBjbGllbnRUb0Rpc2Nvbm5lY3QtPm5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQsCisgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXN7fSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKiBub3cgZGlzY29ubmVjdCB0aGVtLiBkb24ndCBob2xkIHRoZSBsb2NrCi0gICAgICAgICAgIG9yIHdlIGNhbiBnZXQgaW50byBhIGRlYWRsb2NrICovCisgICAgICAgIEFMT0dJKCIlczogQ2xpZW50IGZvciBjYW1lcmEgSUQgJXMgZXZpY3RlZCBkdWUgdG8gZGV2aWNlIHN0YXR1cyBjaGFuZ2UgZnJvbSBIQUwiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOwogCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2xpZW50c1RvRGlzY29ubmVjdC5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudCA9IGNsaWVudHNUb0Rpc2Nvbm5lY3RbaV07Ci0KLSAgICAgICAgICAgIGNsaWVudC0+ZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGUgcmVtb3RlIGFwcCB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIGNhbGwgbWV0aG9kcyBvbiB0aGUKLSAgICAgICAgICAgICAqIGNsaWVudCBzaW5jZSB0aGUgY2xpZW50IFBJRCB3aWxsIGJlIHJlc2V0IHRvIDAKLSAgICAgICAgICAgICAqLworICAgICAgICAvLyBEaXNjb25uZWN0IGNsaWVudAorICAgICAgICBpZiAoY2xpZW50VG9EaXNjb25uZWN0LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIEVuc3VyZSBub3QgaW4gYmluZGVyIFJQQyBzbyBjbGllbnQgZGlzY29ubmVjdCBQSUQgY2hlY2tzIHdvcmsgY29ycmVjdGx5CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgIm9uRGV2aWNlU3RhdHVzQ2hhbmdlZCBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBjYW1lcmEgc2VydmljZSBwcm9jZXNzISIpOworICAgICAgICAgICAgY2xpZW50VG9EaXNjb25uZWN0LT5kaXNjb25uZWN0KCk7CiAgICAgICAgIH0KIAotICAgICAgICBBTE9HVigiJXM6IEFmdGVyIHVucGx1ZywgZGlzY29ubmVjdGVkICV6dSBjbGllbnRzIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjbGllbnRzVG9EaXNjb25uZWN0LnNpemUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG9sZFN0YXR1cyA9PSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXM6OlNUQVRVU19OT1RfUFJFU0VOVCkgeworICAgICAgICAgICAgbG9nRGV2aWNlQWRkZWQoaWQsIFN0cmluZzg6OmZvcm1hdCgiRGV2aWNlIHN0YXR1cyBjaGFuZ2VkIGZyb20gJWQgdG8gJWQiLCBvbGRTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgIG5ld1N0YXR1cykpOworICAgICAgICB9CisgICAgICAgIHVwZGF0ZVN0YXR1cyhzdGF0aWNfY2FzdDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXM+KG5ld1N0YXR1cyksIGlkKTsKICAgICB9CiAKLSAgICB1cGRhdGVTdGF0dXMoCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXM+KG5ld1N0YXR1cyksIGNhbWVyYUlkKTsKLQogfQogCit2b2lkIENhbWVyYVNlcnZpY2U6Om9uVG9yY2hTdGF0dXNDaGFuZ2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUb3JjaFN0YXR1cyBuZXdTdGF0dXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRvcmNoU3RhdHVzTXV0ZXgpOworICAgIG9uVG9yY2hTdGF0dXNDaGFuZ2VkTG9ja2VkKGNhbWVyYUlkLCBuZXdTdGF0dXMpOworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6Om9uVG9yY2hTdGF0dXNDaGFuZ2VkTG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUb3JjaFN0YXR1cyBuZXdTdGF0dXMpIHsKKyAgICBBTE9HSSgiJXM6IFRvcmNoIHN0YXR1cyBjaGFuZ2VkIGZvciBjYW1lcmFJZD0lcywgbmV3U3RhdHVzPSVkIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuc3RyaW5nKCksIG5ld1N0YXR1cyk7CisKKyAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUb3JjaFN0YXR1cyBzdGF0dXM7CisgICAgc3RhdHVzX3QgcmVzID0gZ2V0VG9yY2hTdGF0dXNMb2NrZWQoY2FtZXJhSWQsICZzdGF0dXMpOworICAgIGlmIChyZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgZ2V0IHRvcmNoIHN0YXR1cyBvZiBjYW1lcmEgJXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuc3RyaW5nKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gbmV3U3RhdHVzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZXMgPSBzZXRUb3JjaFN0YXR1c0xvY2tlZChjYW1lcmFJZCwgbmV3U3RhdHVzKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHNldCB0aGUgdG9yY2ggc3RhdHVzIiwgX19GVU5DVElPTl9fLCAodWludDMyX3QpbmV3U3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gVXBkYXRlIGJhdHRlcnkgbGlmZSBsb2dnaW5nIGZvciBmbGFzaGxpZ2h0CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtVG9yY2hVaWRNYXBNdXRleCk7CisgICAgICAgIGF1dG8gaXRlciA9IG1Ub3JjaFVpZE1hcC5maW5kKGNhbWVyYUlkKTsKKyAgICAgICAgaWYgKGl0ZXIgIT0gbVRvcmNoVWlkTWFwLmVuZCgpKSB7CisgICAgICAgICAgICBpbnQgb2xkVWlkID0gaXRlci0+c2Vjb25kLnNlY29uZDsKKyAgICAgICAgICAgIGludCBuZXdVaWQgPSBpdGVyLT5zZWNvbmQuZmlyc3Q7CisgICAgICAgICAgICBCYXR0ZXJ5Tm90aWZpZXImIG5vdGlmaWVyKEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKSk7CisgICAgICAgICAgICBpZiAob2xkVWlkICE9IG5ld1VpZCkgeworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBVSUQgaGFzIGNoYW5nZWQsIGxvZyB0aGUgc3RhdHVzIGFuZCB1cGRhdGUgY3VycmVudCBVSUQgaW4gbVRvcmNoVWlkTWFwCisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUT1JDSF9TVEFUVVNfQVZBSUxBQkxFX09OKSB7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVyLm5vdGVGbGFzaGxpZ2h0T2ZmKGNhbWVyYUlkLCBvbGRVaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobmV3U3RhdHVzID09IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRPUkNIX1NUQVRVU19BVkFJTEFCTEVfT04pIHsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZpZXIubm90ZUZsYXNobGlnaHRPbihjYW1lcmFJZCwgbmV3VWlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXRlci0+c2Vjb25kLnNlY29uZCA9IG5ld1VpZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIFVJRCBoYXMgbm90IGNoYW5nZWQsIGxvZyB0aGUgc3RhdHVzCisgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXR1cyA9PSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUT1JDSF9TVEFUVVNfQVZBSUxBQkxFX09OKSB7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVyLm5vdGVGbGFzaGxpZ2h0T24oY2FtZXJhSWQsIG9sZFVpZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZpZXIubm90ZUZsYXNobGlnaHRPZmYoY2FtZXJhSWQsIG9sZFVpZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTGlzdGVuZXJMb2NrKTsKKyAgICAgICAgZm9yIChhdXRvJiBpIDogbUxpc3RlbmVyTGlzdCkgeworICAgICAgICAgICAgaS0+b25Ub3JjaFN0YXR1c0NoYW5nZWQobmV3U3RhdHVzLCBTdHJpbmcxNntjYW1lcmFJZH0pOworICAgICAgICB9CisgICAgfQorfQorCiBpbnQzMl90IENhbWVyYVNlcnZpY2U6OmdldE51bWJlck9mQ2FtZXJhcygpIHsKLSAgICByZXR1cm4gbU51bWJlck9mQ2FtZXJhczsKKyAgICByZXR1cm4gZ2V0TnVtYmVyT2ZDYW1lcmFzKENBTUVSQV9UWVBFX0JBQ0tXQVJEX0NPTVBBVElCTEUpOworfQorCitpbnQzMl90IENhbWVyYVNlcnZpY2U6OmdldE51bWJlck9mQ2FtZXJhcyhpbnQgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIENBTUVSQV9UWVBFX0JBQ0tXQVJEX0NPTVBBVElCTEU6CisgICAgICAgICAgICByZXR1cm4gbU51bWJlck9mTm9ybWFsQ2FtZXJhczsKKyAgICAgICAgY2FzZSBDQU1FUkFfVFlQRV9BTEw6CisgICAgICAgICAgICByZXR1cm4gbU51bWJlck9mQ2FtZXJhczsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCIlczogVW5rbm93biBjYW1lcmEgdHlwZSAlZCwgcmV0dXJuaW5nIDAiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHR5cGUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQogfQogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpnZXRDYW1lcmFJbmZvKGludCBjYW1lcmFJZCwKQEAgLTIzNiwxMiArNDI2LDIxIEBACiAKICAgICBzdHJ1Y3QgY2FtZXJhX2luZm8gaW5mbzsKICAgICBzdGF0dXNfdCByYyA9IGZpbHRlckdldEluZm9FcnJvckNvZGUoCi0gICAgICAgIG1Nb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhjYW1lcmFJZCwgJmluZm8pKTsKKyAgICAgICAgbU1vZHVsZS0+Z2V0Q2FtZXJhSW5mbyhjYW1lcmFJZCwgJmluZm8pKTsKICAgICBjYW1lcmFJbmZvLT5mYWNpbmcgPSBpbmZvLmZhY2luZzsKICAgICBjYW1lcmFJbmZvLT5vcmllbnRhdGlvbiA9IGluZm8ub3JpZW50YXRpb247CiAgICAgcmV0dXJuIHJjOwogfQogCitpbnQgQ2FtZXJhU2VydmljZTo6Y2FtZXJhSWRUb0ludChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCkgeworICAgIGVycm5vID0gMDsKKyAgICBzaXplX3QgcG9zID0gMDsKKyAgICBpbnQgcmV0ID0gc3RvaShzdGQ6OnN0cmluZ3tjYW1lcmFJZC5zdHJpbmcoKX0sICZwb3MpOworICAgIGlmIChlcnJubyAhPSAwIHx8IHBvcyAhPSBjYW1lcmFJZC5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpnZW5lcmF0ZVNoaW1NZXRhZGF0YShpbnQgY2FtZXJhSWQsIC8qb3V0Ki9DYW1lcmFNZXRhZGF0YSogY2FtZXJhSW5mbykgewogICAgIHN0YXR1c190IHJldCA9IE9LOwpAQCAtMzQ3LDcgKzU0Niw3IEBACiAKICAgICBpbnQgZmFjaW5nOwogICAgIHN0YXR1c190IHJldCA9IE9LOwotICAgIGlmIChtTW9kdWxlLT5jb21tb24ubW9kdWxlX2FwaV92ZXJzaW9uIDwgQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzAgfHwKKyAgICBpZiAobU1vZHVsZS0+Z2V0TW9kdWxlQXBpVmVyc2lvbigpIDwgQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzAgfHwKICAgICAgICAgICAgIGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsICZmYWNpbmcpIDw9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xICkgewogICAgICAgICAvKioKICAgICAgICAgICogQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgbW9kZSBmb3Igb2xkIEhBTHM6CkBAIC0zNjgsMTMgKzU2NywzOSBAQAogICAgICAgICAgKiBOb3JtYWwgSEFMIDIuMSsgY29kZXBhdGguCiAgICAgICAgICAqLwogICAgICAgICBzdHJ1Y3QgY2FtZXJhX2luZm8gaW5mbzsKLSAgICAgICAgcmV0ID0gZmlsdGVyR2V0SW5mb0Vycm9yQ29kZShtTW9kdWxlLT5nZXRfY2FtZXJhX2luZm8oY2FtZXJhSWQsICZpbmZvKSk7CisgICAgICAgIHJldCA9IGZpbHRlckdldEluZm9FcnJvckNvZGUobU1vZHVsZS0+Z2V0Q2FtZXJhSW5mbyhjYW1lcmFJZCwgJmluZm8pKTsKICAgICAgICAgKmNhbWVyYUluZm8gPSBpbmZvLnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzOwogICAgIH0KIAogICAgIHJldHVybiByZXQ7CiB9CiAKK2ludCBDYW1lcmFTZXJ2aWNlOjpnZXRDYWxsaW5nUGlkKCkgeworICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Cit9CisKK2ludCBDYW1lcmFTZXJ2aWNlOjpnZXRDYWxsaW5nVWlkKCkgeworICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Cit9CisKK1N0cmluZzggQ2FtZXJhU2VydmljZTo6Z2V0Rm9ybWF0dGVkQ3VycmVudFRpbWUoKSB7CisgICAgdGltZV90IG5vdyA9IHRpbWUobnVsbHB0cik7CisgICAgY2hhciBmb3JtYXR0ZWRUaW1lWzY0XTsKKyAgICBzdHJmdGltZShmb3JtYXR0ZWRUaW1lLCBzaXplb2YoZm9ybWF0dGVkVGltZSksICIlbS0lZCAlSDolTTolUyIsIGxvY2FsdGltZSgmbm93KSk7CisgICAgcmV0dXJuIFN0cmluZzgoZm9ybWF0dGVkVGltZSk7Cit9CisKK2ludCBDYW1lcmFTZXJ2aWNlOjpnZXRDYW1lcmFQcmlvcml0eUZyb21Qcm9jU3RhdGUoaW50IHByb2NTdGF0ZSkgeworICAgIC8vIEZpbmQgdGhlIHByaW9yaXR5IGZvciB0aGUgY2FtZXJhIHVzYWdlIGJhc2VkIG9uIHRoZSBwcm9jZXNzIHN0YXRlLiAgSGlnaGVyIHByaW9yaXR5IGNsaWVudHMKKyAgICAvLyB3aW4gZm9yIGV2aWN0aW9ucy4KKyAgICBpZiAocHJvY1N0YXRlIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IFJlY2VpdmVkIGludmFsaWQgcHJvY2VzcyBzdGF0ZSAlZCBmcm9tIEFjdGl2aXR5TWFuYWdlclNlcnZpY2UhIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHByb2NTdGF0ZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIElOVF9NQVggLSBwcm9jU3RhdGU7Cit9CisKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmdldENhbWVyYVZlbmRvclRhZ0Rlc2NyaXB0b3IoLypvdXQqL3NwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+JiBkZXNjKSB7CiAgICAgaWYgKCFtTW9kdWxlKSB7CiAgICAgICAgIEFMT0dFKCIlczogY2FtZXJhIGhhcmR3YXJlIG1vZHVsZSBkb2Vzbid0IGV4aXN0IiwgX19GVU5DVElPTl9fKTsKQEAgLTM4NywxMiArNjEyLDEyIEBACiAKIGludCBDYW1lcmFTZXJ2aWNlOjpnZXREZXZpY2VWZXJzaW9uKGludCBjYW1lcmFJZCwgaW50KiBmYWNpbmcpIHsKICAgICBzdHJ1Y3QgY2FtZXJhX2luZm8gaW5mbzsKLSAgICBpZiAobU1vZHVsZS0+Z2V0X2NhbWVyYV9pbmZvKGNhbWVyYUlkLCAmaW5mbykgIT0gT0spIHsKKyAgICBpZiAobU1vZHVsZS0+Z2V0Q2FtZXJhSW5mbyhjYW1lcmFJZCwgJmluZm8pICE9IE9LKSB7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICBpbnQgZGV2aWNlVmVyc2lvbjsKLSAgICBpZiAobU1vZHVsZS0+Y29tbW9uLm1vZHVsZV9hcGlfdmVyc2lvbiA+PSBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMCkgeworICAgIGlmIChtTW9kdWxlLT5nZXRNb2R1bGVBcGlWZXJzaW9uKCkgPj0gQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzApIHsKICAgICAgICAgZGV2aWNlVmVyc2lvbiA9IGluZm8uZGV2aWNlX3ZlcnNpb247CiAgICAgfSBlbHNlIHsKICAgICAgICAgZGV2aWNlVmVyc2lvbiA9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOwpAQCAtNDA1LDE5ICs2MzAsNiBAQAogICAgIHJldHVybiBkZXZpY2VWZXJzaW9uOwogfQogCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpmaWx0ZXJPcGVuRXJyb3JDb2RlKHN0YXR1c190IGVycikgewotICAgIHN3aXRjaChlcnIpIHsKLSAgICAgICAgY2FzZSBOT19FUlJPUjoKLSAgICAgICAgY2FzZSAtRUJVU1k6Ci0gICAgICAgIGNhc2UgLUVJTlZBTDoKLSAgICAgICAgY2FzZSAtRVVTRVJTOgotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gLUVOT0RFVjsKLX0KLQogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6ZmlsdGVyR2V0SW5mb0Vycm9yQ29kZShzdGF0dXNfdCBlcnIpIHsKICAgICBzd2l0Y2goZXJyKSB7CiAgICAgICAgIGNhc2UgTk9fRVJST1I6CkBAIC00MzMsMTMgKzY0NSwxMyBAQAogICAgIHZlbmRvcl90YWdfb3BzX3Qgdk9wcyA9IHZlbmRvcl90YWdfb3BzX3QoKTsKIAogICAgIC8vIENoZWNrIGlmIHZlbmRvciBvcGVyYXRpb25zIGhhdmUgYmVlbiBpbXBsZW1lbnRlZAotICAgIGlmIChtTW9kdWxlLT5nZXRfdmVuZG9yX3RhZ19vcHMgPT0gTlVMTCkgeworICAgIGlmICghbU1vZHVsZS0+aXNWZW5kb3JUYWdEZWZpbmVkKCkpIHsKICAgICAgICAgQUxPR0koIiVzOiBObyB2ZW5kb3IgdGFncyBkZWZpbmVkIGZvciB0aGlzIGRldmljZS4iLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgQVRSQUNFX0JFR0lOKCJjYW1lcmEzLT5nZXRfbWV0YWRhdGFfdmVuZG9yX3RhZ19vcHMiKTsKLSAgICBtTW9kdWxlLT5nZXRfdmVuZG9yX3RhZ19vcHMoJnZPcHMpOworICAgIG1Nb2R1bGUtPmdldFZlbmRvclRhZ09wcygmdk9wcyk7CiAgICAgQVRSQUNFX0VORCgpOwogCiAgICAgLy8gRW5zdXJlIGFsbCB2ZW5kb3Igb3BlcmF0aW9ucyBhcmUgcHJlc2VudApAQCAtNDY3LDU0ICs2NzksMTA0IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OmluaXRpYWxpemVTaGltTWV0YWRhdGEoaW50IGNhbWVyYUlkKSB7Ci0gICAgaW50IHBpZCA9IGdldENhbGxpbmdQaWQoKTsKLSAgICBpbnQgdWlkID0gZ2V0Q2FsbGluZ1VpZCgpOwotICAgIHN0YXR1c190IHJldCA9IHZhbGlkYXRlQ29ubmVjdChjYW1lcmFJZCwgdWlkKTsKLSAgICBpZiAocmV0ICE9IE9LKSB7Ci0gICAgICAgIC8vIEVycm9yIGFscmVhZHkgbG9nZ2VkIGJ5IGNhbGxlZQotICAgICAgICByZXR1cm4gcmV0Oworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6bWFrZUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKKyAgICAgICAgY29uc3Qgc3A8SUludGVyZmFjZT4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICBpbnQgZmFjaW5nLCBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsIGludCBzZXJ2aWNlUGlkLCBib29sIGxlZ2FjeU1vZGUsCisgICAgICAgIGludCBoYWxWZXJzaW9uLCBpbnQgZGV2aWNlVmVyc2lvbiwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsCisgICAgICAgIC8qb3V0Ki9zcDxCYXNpY0NsaWVudD4qIGNsaWVudCkgeworCisgICAgLy8gVE9ETzogVXBkYXRlIENhbWVyYUNsaWVudHMgKyBIQUwgaW50ZXJmYWNlIHRvIHVzZSBzdHJpbmdzIGZvciBDYW1lcmEgSURzCisgICAgaW50IGlkID0gY2FtZXJhSWRUb0ludChjYW1lcmFJZCk7CisgICAgaWYgKGlkID09IC0xKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgSUQgJXMsIGNhbm5vdCBjb252ZXJ0IHRvIGludGVnZXIuIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBib29sIG5lZWRzTmV3Q2xpZW50ID0gZmFsc2U7Ci0gICAgc3A8Q2xpZW50PiBjbGllbnQ7CisgICAgaWYgKGhhbFZlcnNpb24gPCAwIHx8IGhhbFZlcnNpb24gPT0gZGV2aWNlVmVyc2lvbikgeworICAgICAgICAvLyBEZWZhdWx0IHBhdGg6IEhBTCB2ZXJzaW9uIGlzIHVuc3BlY2lmaWVkIGJ5IGNhbGxlciwgY3JlYXRlIENhbWVyYUNsaWVudAorICAgICAgICAvLyBiYXNlZCBvbiBkZXZpY2UgdmVyc2lvbiByZXBvcnRlZCBieSB0aGUgSEFMLgorICAgICAgICBzd2l0Y2goZGV2aWNlVmVyc2lvbikgeworICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzA6CisgICAgICAgICAgICBpZiAoZWZmZWN0aXZlQXBpTGV2ZWwgPT0gQVBJXzEpIHsgIC8vIENhbWVyYTEgQVBJIHJvdXRlCisgICAgICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gdG1wID0gc3RhdGljX2Nhc3Q8SUNhbWVyYUNsaWVudCo+KGNhbWVyYUNiLmdldCgpKTsKKyAgICAgICAgICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYUNsaWVudChjYW1lcmFTZXJ2aWNlLCB0bXAsIHBhY2thZ2VOYW1lLCBpZCwgZmFjaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsIGdldHBpZCgpLCBsZWdhY3lNb2RlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IC8vIENhbWVyYTIgQVBJIHJvdXRlCisgICAgICAgICAgICAgICAgQUxPR1coIkNhbWVyYSB1c2luZyBvbGQgSEFMIHZlcnNpb246ICVkIiwgZGV2aWNlVmVyc2lvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMDoKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8xOgorICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6CisgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgorICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM6CisgICAgICAgICAgICBpZiAoZWZmZWN0aXZlQXBpTGV2ZWwgPT0gQVBJXzEpIHsgLy8gQ2FtZXJhMSBBUEkgcm91dGUKKyAgICAgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiB0bXAgPSBzdGF0aWNfY2FzdDxJQ2FtZXJhQ2xpZW50Kj4oY2FtZXJhQ2IuZ2V0KCkpOworICAgICAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhMkNsaWVudChjYW1lcmFTZXJ2aWNlLCB0bXAsIHBhY2thZ2VOYW1lLCBpZCwgZmFjaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQsIGxlZ2FjeU1vZGUpOworICAgICAgICAgICAgfSBlbHNlIHsgLy8gQ2FtZXJhMiBBUEkgcm91dGUKKyAgICAgICAgICAgICAgICBzcDxJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiB0bXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SUNhbWVyYURldmljZUNhbGxiYWNrcyo+KGNhbWVyYUNiLmdldCgpKTsKKyAgICAgICAgICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYURldmljZUNsaWVudChjYW1lcmFTZXJ2aWNlLCB0bXAsIHBhY2thZ2VOYW1lLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIFNob3VsZCBub3QgYmUgcmVhY2hhYmxlCisgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBjYW1lcmEgZGV2aWNlIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQSBwYXJ0aWN1bGFyIEhBTCB2ZXJzaW9uIGlzIHJlcXVlc3RlZCBieSBjYWxsZXIuIENyZWF0ZSBDYW1lcmFDbGllbnQKKyAgICAgICAgLy8gYmFzZWQgb24gdGhlIHJlcXVlc3RlZCBIQUwgdmVyc2lvbi4KKyAgICAgICAgaWYgKGRldmljZVZlcnNpb24gPiBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCAmJgorICAgICAgICAgICAgaGFsVmVyc2lvbiA9PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCkgeworICAgICAgICAgICAgLy8gT25seSBzdXBwb3J0IGhpZ2hlciBIQUwgdmVyc2lvbiBkZXZpY2Ugb3BlbmVkIGFzIEhBTDEuMCBkZXZpY2UuCisgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiB0bXAgPSBzdGF0aWNfY2FzdDxJQ2FtZXJhQ2xpZW50Kj4oY2FtZXJhQ2IuZ2V0KCkpOworICAgICAgICAgICAgKmNsaWVudCA9IG5ldyBDYW1lcmFDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwgaWQsIGZhY2luZywKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQsIGxlZ2FjeU1vZGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gT3RoZXIgY29tYmluYXRpb25zIChlLmcuIEhBTDMueCBvcGVuIGFzIEhBTDIueCkgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LgorICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2FtZXJhIEhBTCB2ZXJzaW9uICV4OiBIQUwgJXggZGV2aWNlIGNhbiBvbmx5IGJlIgorICAgICAgICAgICAgICAgICAgICAiIG9wZW5lZCBhcyBIQUwgJXggZGV2aWNlIiwgaGFsVmVyc2lvbiwgZGV2aWNlVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzApOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworU3RyaW5nOCBDYW1lcmFTZXJ2aWNlOjp0b1N0cmluZyhzdGQ6OnNldDx1c2VyaWRfdD4gaW50U2V0KSB7CisgICAgU3RyaW5nOCBzKCIiKTsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHVzZXJpZF90IGkgOiBpbnRTZXQpIHsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICBzLmFwcGVuZEZvcm1hdCgiJWQiLCBpKTsKKyAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLmFwcGVuZEZvcm1hdCgiLCAlZCIsIGkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjppbml0aWFsaXplU2hpbU1ldGFkYXRhKGludCBjYW1lcmFJZCkgeworICAgIGludCB1aWQgPSBnZXRDYWxsaW5nVWlkKCk7CiAKICAgICBTdHJpbmcxNiBpbnRlcm5hbFBhY2thZ2VOYW1lKCJtZWRpYSIpOwotICAgIHsgICAvLyBTY29wZSBmb3Igc2VydmljZSBsb2NrCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7Ci0gICAgICAgIGlmIChtQ2xpZW50W2NhbWVyYUlkXSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjbGllbnQgPSBzdGF0aWNfY2FzdDxDbGllbnQqPihtQ2xpZW50W2NhbWVyYUlkXS5wcm9tb3RlKCkuZ2V0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjbGllbnQgPT0gTlVMTCkgewotICAgICAgICAgICAgbmVlZHNOZXdDbGllbnQgPSB0cnVlOwotICAgICAgICAgICAgcmV0ID0gY29ubmVjdEhlbHBlckxvY2tlZCgvKm91dCovY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNhbWVyYUNsaWVudCovTlVMTCwgLy8gRW1wdHkgYmluZGVyIGNhbGxiYWNrcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWQpOwotCi0gICAgICAgICAgICBpZiAocmV0ICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgLy8gRXJyb3IgYWxyZWFkeSBsb2dnZWQgYnkgY2FsbGVlCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjbGllbnQgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgY29ubmVjdCB0byBjbGllbnQgY2FtZXJhIGRldmljZS4iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZzggcmF3UGFyYW1zID0gY2xpZW50LT5nZXRQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIENhbWVyYVBhcmFtZXRlcnMgcGFyYW1zKHJhd1BhcmFtcyk7Ci0gICAgICAgIG1TaGltUGFyYW1zLmFkZChjYW1lcmFJZCwgcGFyYW1zKTsKKyAgICBTdHJpbmc4IGlkID0gU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYUlkKTsKKyAgICBzdGF0dXNfdCByZXQgPSBOT19FUlJPUjsKKyAgICBzcDxDbGllbnQ+IHRtcCA9IG51bGxwdHI7CisgICAgaWYgKChyZXQgPSBjb25uZWN0SGVscGVyPElDYW1lcmFDbGllbnQsQ2xpZW50PihzcDxJQ2FtZXJhQ2xpZW50PntudWxscHRyfSwgaWQsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQpLCBpbnRlcm5hbFBhY2thZ2VOYW1lLCB1aWQsIEFQSV8xLAorICAgICAgICAgICAgZmFsc2UsIHRydWUsIHRtcCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3IgJWQgKCVzKSBpbml0aWFsaXppbmcgc2hpbSBtZXRhZGF0YS4iLCBfX0ZVTkNUSU9OX18sIHJldCwgc3RyZXJyb3IocmV0KSk7CisgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQotCi0gICAgLy8gQ2xvc2UgY2xpZW50IGlmIG9uZSB3YXMgb3BlbmVkIHNvbGVseSBmb3IgdGhpcyBjYWxsCi0gICAgaWYgKG5lZWRzTmV3Q2xpZW50KSB7Ci0gICAgICAgIGNsaWVudC0+ZGlzY29ubmVjdCgpOwotICAgIH0KLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpnZXRMZWdhY3lQYXJhbWV0ZXJzTGF6eShpbnQgY2FtZXJhSWQsCkBAIC01MzAsNDIgKzc5Miw1NSBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHNzaXplX3QgaW5kZXggPSAtMTsKLSAgICB7ICAgLy8gU2NvcGUgZm9yIHNlcnZpY2UgbG9jaworICAgIFN0cmluZzggaWQgPSBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgY2FtZXJhSWQpOworCisgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIHBhcmFtZXRlcnMKKyAgICB7CisgICAgICAgIC8vIFNjb3BlIGZvciBzZXJ2aWNlIGxvY2sKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKLSAgICAgICAgaW5kZXggPSBtU2hpbVBhcmFtcy5pbmRleE9mS2V5KGNhbWVyYUlkKTsKLSAgICAgICAgLy8gUmVsZWFzZSBzZXJ2aWNlIGxvY2sgc28gaW5pdGlhbGl6ZVNoaW1NZXRhZGF0YSBjYW4gYmUgY2FsbGVkIGNvcnJlY3RseS4KLQotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgKnBhcmFtZXRlcnMgPSBtU2hpbVBhcmFtc1tpbmRleF07CisgICAgICAgIGF1dG8gY2FtZXJhU3RhdGUgPSBnZXRDYW1lcmFTdGF0ZShpZCk7CisgICAgICAgIGlmIChjYW1lcmFTdGF0ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY2FtZXJhIElEOiAlcyIsIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzIHAgPSBjYW1lcmFTdGF0ZS0+Z2V0U2hpbVBhcmFtcygpOworICAgICAgICBpZiAoIXAuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAqcGFyYW1ldGVycyA9IHA7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICByZXQgPSBpbml0aWFsaXplU2hpbU1ldGFkYXRhKGNhbWVyYUlkKTsKLSAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7Ci0gICAgICAgIGlmIChyZXQgIT0gT0spIHsKLSAgICAgICAgICAgIC8vIEVycm9yIGFscmVhZHkgbG9nZ2VkIGJ5IGNhbGxlZQotICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICByZXQgPSBpbml0aWFsaXplU2hpbU1ldGFkYXRhKGNhbWVyYUlkKTsKKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIEVycm9yIGFscmVhZHkgbG9nZ2VkIGJ5IGNhbGxlZQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIENoZWNrIGZvciBwYXJhbWV0ZXJzIGFnYWluCisgICAgeworICAgICAgICAvLyBTY29wZSBmb3Igc2VydmljZSBsb2NrCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgICAgIGF1dG8gY2FtZXJhU3RhdGUgPSBnZXRDYW1lcmFTdGF0ZShpZCk7CisgICAgICAgIGlmIChjYW1lcmFTdGF0ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY2FtZXJhIElEOiAlcyIsIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotCi0gICAgICAgIHsgICAvLyBTY29wZSBmb3Igc2VydmljZSBsb2NrCi0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwotICAgICAgICAgICAgaW5kZXggPSBtU2hpbVBhcmFtcy5pbmRleE9mS2V5KGNhbWVyYUlkKTsKLQotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpbmRleCA8IDAsICJpbmRleCBzaG91bGQgaGF2ZSBiZWVuIGluaXRpYWxpemVkIik7Ci0KLSAgICAgICAgICAgICpwYXJhbWV0ZXJzID0gbVNoaW1QYXJhbXNbaW5kZXhdOworICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzIHAgPSBjYW1lcmFTdGF0ZS0+Z2V0U2hpbVBhcmFtcygpOworICAgICAgICBpZiAoIXAuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAqcGFyYW1ldGVycyA9IHA7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gT0s7CisgICAgQUxPR0UoIiVzOiBQYXJhbWV0ZXJzIHdlcmUgbm90IGluaXRpYWxpemVkLCBvciB3ZXJlIGVtcHR5LiAgRGV2aWNlIG1heSBub3QgYmUgcHJlc2VudC4iLAorICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OnZhbGlkYXRlQ29ubmVjdChpbnQgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmlub3V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgY2xpZW50VWlkKSBjb25zdCB7CitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjp2YWxpZGF0ZUNvbm5lY3RMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIC8qaW5vdXQqL2ludCYgY2xpZW50VWlkKQorICAgICAgICBjb25zdCB7CiAKICAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKIApAQCAtNTc0LDE2MCArODQ5LDI3OCBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIFdlIG9ubHkgdHJ1c3Qgb3VyIG93biBwcm9jZXNzIHRvIGZvcndhcmQgY2xpZW50IFVJRHMKICAgICAgICAgaWYgKGNhbGxpbmdQaWQgIT0gZ2V0cGlkKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKHBpZCAlZCkgcmVqZWN0ZWQgKGRvbid0IHRydXN0IGNsaWVudFVpZCkiLAotICAgICAgICAgICAgICAgICAgICBjYWxsaW5nUGlkKTsKKyAgICAgICAgICAgIEFMT0dFKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKFBJRCAlZCkgcmVqZWN0ZWQgKGRvbid0IHRydXN0IGNsaWVudFVpZCAlZCkiLAorICAgICAgICAgICAgICAgICAgICBjYWxsaW5nUGlkLCBjbGllbnRVaWQpOwogICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKCFtTW9kdWxlKSB7Ci0gICAgICAgIEFMT0dFKCJDYW1lcmEgSEFMIG1vZHVsZSBub3QgbG9hZGVkIik7CisgICAgICAgIEFMT0dFKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKFBJRCAlZCkgcmVqZWN0ZWQgKGNhbWVyYSBIQUwgbW9kdWxlIG5vdCBsb2FkZWQpIiwKKyAgICAgICAgICAgICAgICBjYWxsaW5nUGlkKTsKICAgICAgICAgcmV0dXJuIC1FTk9ERVY7CiAgICAgfQogCi0gICAgaWYgKGNhbWVyYUlkIDwgMCB8fCBjYW1lcmFJZCA+PSBtTnVtYmVyT2ZDYW1lcmFzKSB7Ci0gICAgICAgIEFMT0dFKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKHBpZCAlZCkgcmVqZWN0ZWQgKGludmFsaWQgY2FtZXJhSWQgJWQpLiIsCi0gICAgICAgICAgICBjYWxsaW5nUGlkLCBjYW1lcmFJZCk7CisgICAgaWYgKGdldENhbWVyYVN0YXRlKGNhbWVyYUlkKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKFBJRCAlZCkgcmVqZWN0ZWQgKGludmFsaWQgY2FtZXJhIElEICVzKSIsIGNhbGxpbmdQaWQsCisgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOwogICAgICAgICByZXR1cm4gLUVOT0RFVjsKICAgICB9CiAKKyAgICAvLyBDaGVjayBkZXZpY2UgcG9saWN5IGZvciB0aGlzIGNhbWVyYQogICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBwcm9wZXJ0eV9nZXQoInN5cy5zZWNwb2xpY3kuY2FtZXJhLmRpc2FibGVkIiwgdmFsdWUsICIwIik7CisgICAgY2hhciBrZXlbUFJPUEVSVFlfS0VZX01BWF07CisgICAgdXNlcmlkX3QgY2xpZW50VXNlcklkID0gbXVsdGl1c2VyX2dldF91c2VyX2lkKGNsaWVudFVpZCk7CisgICAgc25wcmludGYoa2V5LCBQUk9QRVJUWV9LRVlfTUFYLCAic3lzLnNlY3BvbGljeS5jYW1lcmEub2ZmXyVkIiwgY2xpZW50VXNlcklkKTsKKyAgICBwcm9wZXJ0eV9nZXQoa2V5LCB2YWx1ZSwgIjAiKTsKICAgICBpZiAoc3RyY21wKHZhbHVlLCAiMSIpID09IDApIHsKICAgICAgICAgLy8gQ2FtZXJhIGlzIGRpc2FibGVkIGJ5IERldmljZVBvbGljeU1hbmFnZXIuCi0gICAgICAgIEFMT0dJKCJDYW1lcmEgaXMgZGlzYWJsZWQuIGNvbm5lY3QgWCAocGlkICVkKSByZWplY3RlZCIsIGNhbGxpbmdQaWQpOworICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChjYW1lcmEgJXMgaXMgZGlzYWJsZWQgYnkgZGV2aWNlICIKKyAgICAgICAgICAgICAgICAicG9saWN5KSIsIGNhbGxpbmdQaWQsIGNhbWVyYUlkLnN0cmluZygpKTsKICAgICAgICAgcmV0dXJuIC1FQUNDRVM7CiAgICAgfQogCi0gICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzIGN1cnJlbnRTdGF0dXMgPSBnZXRTdGF0dXMoY2FtZXJhSWQpOworICAgIC8vIE9ubHkgYWxsb3cgY2xpZW50cyB3aG8gYXJlIGJlaW5nIHVzZWQgYnkgdGhlIGN1cnJlbnQgZm9yZWdyb3VuZCBkZXZpY2UgdXNlciwgdW5sZXNzIGNhbGxpbmcKKyAgICAvLyBmcm9tIG91ciBvd24gcHJvY2Vzcy4KKyAgICBpZiAoY2FsbGluZ1BpZCAhPSBnZXRwaWQoKSAmJiAobUFsbG93ZWRVc2Vycy5maW5kKGNsaWVudFVzZXJJZCkgPT0gbUFsbG93ZWRVc2Vycy5lbmQoKSkpIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoUElEICVkKSByZWplY3RlZCAoY2Fubm90IGNvbm5lY3QgZnJvbSAiCisgICAgICAgICAgICAgICAgImRldmljZSB1c2VyICVkLCBjdXJyZW50bHkgYWxsb3dlZCBkZXZpY2UgdXNlcnM6ICVzKSIsIGNhbGxpbmdQaWQsIGNsaWVudFVzZXJJZCwKKyAgICAgICAgICAgICAgICB0b1N0cmluZyhtQWxsb3dlZFVzZXJzKS5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICByZXR1cm4gY2hlY2tJZkRldmljZUlzVXNhYmxlKGNhbWVyYUlkKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Y2hlY2tJZkRldmljZUlzVXNhYmxlKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSBjb25zdCB7CisgICAgYXV0byBjYW1lcmFTdGF0ZSA9IGdldENhbWVyYVN0YXRlKGNhbWVyYUlkKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpZiAoY2FtZXJhU3RhdGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChpbnZhbGlkIGNhbWVyYSBJRCAlcykiLCBjYWxsaW5nUGlkLAorICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzIGN1cnJlbnRTdGF0dXMgPSBjYW1lcmFTdGF0ZS0+Z2V0U3RhdHVzKCk7CiAgICAgaWYgKGN1cnJlbnRTdGF0dXMgPT0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9QUkVTRU5UKSB7Ci0gICAgICAgIEFMT0dJKCJDYW1lcmEgaXMgbm90IHBsdWdnZWQgaW4sIgotICAgICAgICAgICAgICAgIiBjb25uZWN0IFggKHBpZCAlZCkgcmVqZWN0ZWQiLCBjYWxsaW5nUGlkKTsKKyAgICAgICAgQUxPR0UoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoUElEICVkKSByZWplY3RlZCAoY2FtZXJhICVzIGlzIG5vdCBjb25uZWN0ZWQpIiwKKyAgICAgICAgICAgICAgICBjYWxsaW5nUGlkLCBjYW1lcmFJZC5zdHJpbmcoKSk7CiAgICAgICAgIHJldHVybiAtRU5PREVWOwogICAgIH0gZWxzZSBpZiAoY3VycmVudFN0YXR1cyA9PSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfRU5VTUVSQVRJTkcpIHsKLSAgICAgICAgQUxPR0koIkNhbWVyYSBpcyBlbnVtZXJhdGluZywiCi0gICAgICAgICAgICAgICAiIGNvbm5lY3QgWCAocGlkICVkKSByZWplY3RlZCIsIGNhbGxpbmdQaWQpOworICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkLCAoY2FtZXJhICVzIGlzIGluaXRpYWxpemluZykiLAorICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQsIGNhbWVyYUlkLnN0cmluZygpKTsKICAgICAgICAgcmV0dXJuIC1FQlVTWTsKICAgICB9Ci0gICAgLy8gRWxzZSBkb24ndCBjaGVjayBmb3IgU1RBVFVTX05PVF9BVkFJTEFCTEUuCi0gICAgLy8gIC0tIEl0J3MgZG9uZSBpbXBsaWNpdGx5IGluIGNhbkNvbm5lY3RVbnNhZmUgL3cgdGhlIG1CdXN5IGFycmF5CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1ib29sIENhbWVyYVNlcnZpY2U6OmNhbkNvbm5lY3RVbnNhZmUoaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgcmVtb3RlQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8QmFzaWNDbGllbnQ+ICZjbGllbnQpIHsKLSAgICBTdHJpbmc4IGNsaWVudE5hbWU4KGNsaWVudFBhY2thZ2VOYW1lKTsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6ZmluaXNoQ29ubmVjdExvY2tlZChjb25zdCBzcDxCYXNpY0NsaWVudD4mIGNsaWVudCwKKyAgICAgICAgY29uc3QgQ2FtZXJhU2VydmljZTo6RGVzY3JpcHRvclB0ciYgZGVzYykgewogCi0gICAgaWYgKG1DbGllbnRbY2FtZXJhSWRdICE9IDApIHsKLSAgICAgICAgY2xpZW50ID0gbUNsaWVudFtjYW1lcmFJZF0ucHJvbW90ZSgpOwotICAgICAgICBpZiAoY2xpZW50ICE9IDApIHsKLSAgICAgICAgICAgIGlmIChyZW1vdGVDYWxsYmFjayA9PSBjbGllbnQtPmdldFJlbW90ZSgpKSB7Ci0gICAgICAgICAgICAgICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChwaWQgJWQpICh0aGUgc2FtZSBjbGllbnQpIiwKLSAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPU0M6IG5lZWQgdG8gc3VwcG9ydCAxIHJlZ3VsYXIgY2xpZW50LAotICAgICAgICAgICAgICAgIC8vIG11bHRpcGxlIHNoYXJlZCBjbGllbnRzIGhlcmUKLSAgICAgICAgICAgICAgICBBTE9HVygiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChwaWQgJWQpIHJlamVjdGVkIgotICAgICAgICAgICAgICAgICAgICAgICIgKGV4aXN0aW5nIGNsaWVudCkuIiwgY2FsbGluZ1BpZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIE1ha2UgYSBkZXNjcmlwdG9yIGZvciB0aGUgaW5jb21pbmcgY2xpZW50CisgICAgYXV0byBjbGllbnREZXNjcmlwdG9yID0gQ2FtZXJhU2VydmljZTo6Q2FtZXJhQ2xpZW50TWFuYWdlcjo6bWFrZUNsaWVudERlc2NyaXB0b3IoY2xpZW50LCBkZXNjKTsKKyAgICBhdXRvIGV2aWN0ZWQgPSBtQWN0aXZlQ2xpZW50TWFuYWdlci5hZGRBbmRFdmljdChjbGllbnREZXNjcmlwdG9yKTsKKworICAgIGxvZ0Nvbm5lY3RlZChkZXNjLT5nZXRLZXkoKSwgc3RhdGljX2Nhc3Q8aW50PihkZXNjLT5nZXRPd25lcklkKCkpLAorICAgICAgICAgICAgU3RyaW5nOChjbGllbnQtPmdldFBhY2thZ2VOYW1lKCkpKTsKKworICAgIGlmIChldmljdGVkLnNpemUoKSA+IDApIHsKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIC0gY2xpZW50cyBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gcmVtb3ZlZCBpbiBkaXNjb25uZWN0CisgICAgICAgIGZvciAoYXV0byYgaSA6IGV2aWN0ZWQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBzdGF0ZTogQ2xpZW50IGZvciBjYW1lcmEgJXMgd2FzIG5vdCByZW1vdmVkIGluIGRpc2Nvbm5lY3QiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGktPmdldEtleSgpLnN0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzOiBJbnZhbGlkIHN0YXRlIGZvciBDYW1lcmFTZXJ2aWNlLCBjbGllbnRzIG5vdCBldmljdGVkIHByb3Blcmx5IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgIH0KK30KKworc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6aGFuZGxlRXZpY3Rpb25zTG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQgY2xpZW50UGlkLAorICAgICAgICBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgY29uc3Qgc3A8SUJpbmRlcj4mIHJlbW90ZUNhbGxiYWNrLCBjb25zdCBTdHJpbmc4JiBwYWNrYWdlTmFtZSwKKyAgICAgICAgLypvdXQqLworICAgICAgICBzcDxCYXNpY0NsaWVudD4qIGNsaWVudCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPHJlc291cmNlX3BvbGljeTo6Q2xpZW50RGVzY3JpcHRvcjxTdHJpbmc4LCBzcDxCYXNpY0NsaWVudD4+PiogcGFydGlhbCkgeworCisgICAgc3RhdHVzX3QgcmV0ID0gTk9fRVJST1I7CisgICAgc3RkOjp2ZWN0b3I8RGVzY3JpcHRvclB0cj4gZXZpY3RlZENsaWVudHM7CisgICAgRGVzY3JpcHRvclB0ciBjbGllbnREZXNjcmlwdG9yOworICAgIHsKKyAgICAgICAgaWYgKGVmZmVjdGl2ZUFwaUxldmVsID09IEFQSV8xKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgdXNpbmcgQVBJMSwgYW55IGV4aXN0aW5nIGNsaWVudCBmb3IgdGhpcyBjYW1lcmEgSUQgd2l0aCB0aGUgc2FtZSByZW1vdGUKKyAgICAgICAgICAgIC8vIHNob3VsZCBiZSByZXR1cm5lZCByYXRoZXIgdGhhbiBldmljdGVkIHRvIGFsbG93IE1lZGlhUmVjb3JkZXIgdG8gd29yayBwcm9wZXJseS4KKworICAgICAgICAgICAgYXV0byBjdXJyZW50ID0gbUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0KGNhbWVyYUlkKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGNsaWVudFNwID0gY3VycmVudC0+Z2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50U3AuZ2V0KCkgIT0gbnVsbHB0cikgeyAvLyBzaG91bGQgbmV2ZXIgYmUgbmVlZGVkCisgICAgICAgICAgICAgICAgICAgIGlmICghY2xpZW50U3AtPmNhbkNhc3RUb0FwaUNsaWVudChlZmZlY3RpdmVBcGlMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJDYW1lcmFTZXJ2aWNlIGNvbm5lY3QgY2FsbGVkIGZyb20gc2FtZSBjbGllbnQsIGJ1dCB3aXRoIGEgZGlmZmVyZW50IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEFQSSBsZXZlbCwgZXZpY3RpbmcgcHJpb3IgY2xpZW50Li4uIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xpZW50U3AtPmdldFJlbW90ZSgpID09IHJlbW90ZUNhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIChzZWNvbmQgY2FsbCBmcm9tIHNhbWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYXBwIGJpbmRlciwgcmV0dXJuaW5nIHRoZSBzYW1lIGNsaWVudCkiLCBjbGllbnRQaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgKmNsaWVudCA9IGNsaWVudFNwOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1DbGllbnRbY2FtZXJhSWRdLmNsZWFyKCk7Ci0gICAgfQogCi0gICAgLyoKLSAgICBtQnVzeSBpcyBzZXQgdG8gZmFsc2UgYXMgdGhlIGxhc3Qgc3RlcCBvZiB0aGUgQ2xpZW50IGRlc3RydWN0b3IsCi0gICAgYWZ0ZXIgd2hpY2ggaXQgaXMgZ3VhcmFudGVlZCB0aGF0IHRoZSBDbGllbnQgZGVzdHJ1Y3RvciBoYXMgZmluaXNoZWQgKAotICAgIGluY2x1ZGluZyBhbnkgaW5oZXJpdGVkIGRlc3RydWN0b3JzKQorICAgICAgICAvLyBSZXR1cm4gZXJyb3IgaWYgdGhlIGRldmljZSB3YXMgdW5wbHVnZ2VkIG9yIHJlbW92ZWQgYnkgdGhlIEhBTCBmb3Igc29tZSByZWFzb24KKyAgICAgICAgaWYgKChyZXQgPSBjaGVja0lmRGV2aWNlSXNVc2FibGUoY2FtZXJhSWQpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQogCi0gICAgV2Ugb25seSBuZWVkIHRoaXMgZm9yIGEgQ2xpZW50IHN1YmNsYXNzZXMgc2luY2Ugd2UgZG9uJ3QgYWxsb3cKLSAgICBtdWx0aXBsZSBDbGVudHMgdG8gYmUgb3BlbmVkIGNvbmN1cnJlbnRseSwgYnV0IG11bHRpcGxlIEJhc2ljQ2xpZW50Ci0gICAgd291bGQgYmUgZmluZQotICAgICovCi0gICAgaWYgKG1CdXN5W2NhbWVyYUlkXSkgewotICAgICAgICBBTE9HVygiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChwaWQgJWQsIFwiJXNcIikgcmVqZWN0ZWQiCi0gICAgICAgICAgICAgICAgIiAoY2FtZXJhICVkIGlzIHN0aWxsIGJ1c3kpLiIsIGNhbGxpbmdQaWQsCi0gICAgICAgICAgICAgICAgY2xpZW50TmFtZTguc3RyaW5nKCksIGNhbWVyYUlkKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KKyAgICAgICAgLy8gR2V0IGN1cnJlbnQgYWN0aXZlIGNsaWVudCBQSURzCisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gb3duZXJQaWRzKG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbE93bmVycygpKTsKKyAgICAgICAgb3duZXJQaWRzLnB1c2hfYmFjayhjbGllbnRQaWQpOwogCi0gICAgcmV0dXJuIHRydWU7Ci19CisgICAgICAgIC8vIFVzZSB0aGUgdmFsdWUgK1BST0NFU1NfU1RBVEVfTk9ORVhJU1RFTlQsIHRvIGF2b2lkIHRha2luZworICAgICAgICAvLyBhZGRyZXNzIG9mIFBST0NFU1NfU1RBVEVfTk9ORVhJU1RFTlQgYXMgYSByZWZlcmVuY2UgYXJndW1lbnQKKyAgICAgICAgLy8gZm9yIHRoZSB2ZWN0b3IgY29uc3RydWN0b3IuIFBST0NFU1NfU1RBVEVfTk9ORVhJU1RFTlQgZG9lcworICAgICAgICAvLyBub3QgaGF2ZSBhbiBvdXQtb2YtY2xhc3MgZGVmaW5pdGlvbi4KKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiBwcmlvcml0aWVzKG93bmVyUGlkcy5zaXplKCksICtQUk9DRVNTX1NUQVRFX05PTkVYSVNURU5UKTsKIAotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Y29ubmVjdEhlbHBlckxvY2tlZCgKLSAgICAgICAgLypvdXQqLwotICAgICAgICBzcDxDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgIC8qaW4qLwotICAgICAgICBjb25zdCBzcDxJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAotICAgICAgICBpbnQgY2FtZXJhSWQsCi0gICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgaW50IGNsaWVudFVpZCwKLSAgICAgICAgaW50IGNhbGxpbmdQaWQsCi0gICAgICAgIGludCBoYWxWZXJzaW9uLAotICAgICAgICBib29sIGxlZ2FjeU1vZGUpIHsKKyAgICAgICAgLy8gR2V0IHByaW9yaXRlcyBvZiBhbGwgYWN0aXZlIFBJRHMKKyAgICAgICAgUHJvY2Vzc0luZm9TZXJ2aWNlOjpnZXRQcm9jZXNzU3RhdGVzRnJvbVBpZHMob3duZXJQaWRzLnNpemUoKSwgJm93bmVyUGlkc1swXSwKKyAgICAgICAgICAgICAgICAvKm91dCovJnByaW9yaXRpZXNbMF0pOwogCi0gICAgaW50IGZhY2luZyA9IC0xOwotICAgIGludCBkZXZpY2VWZXJzaW9uID0gZ2V0RGV2aWNlVmVyc2lvbihjYW1lcmFJZCwgJmZhY2luZyk7CisgICAgICAgIC8vIFVwZGF0ZSBhbGwgYWN0aXZlIGNsaWVudHMnIHByaW9yaXRpZXMKKyAgICAgICAgc3RkOjptYXA8aW50LGludD4gcGlkVG9Qcmlvcml0eU1hcDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvd25lclBpZHMuc2l6ZSgpIC0gMTsgaSsrKSB7CisgICAgICAgICAgICBwaWRUb1ByaW9yaXR5TWFwLmVtcGxhY2Uob3duZXJQaWRzW2ldLCBnZXRDYW1lcmFQcmlvcml0eUZyb21Qcm9jU3RhdGUocHJpb3JpdGllc1tpXSkpOworICAgICAgICB9CisgICAgICAgIG1BY3RpdmVDbGllbnRNYW5hZ2VyLnVwZGF0ZVByaW9yaXRpZXMocGlkVG9Qcmlvcml0eU1hcCk7CiAKLSAgICBpZiAoaGFsVmVyc2lvbiA8IDAgfHwgaGFsVmVyc2lvbiA9PSBkZXZpY2VWZXJzaW9uKSB7Ci0gICAgICAgIC8vIERlZmF1bHQgcGF0aDogSEFMIHZlcnNpb24gaXMgdW5zcGVjaWZpZWQgYnkgY2FsbGVyLCBjcmVhdGUgQ2FtZXJhQ2xpZW50Ci0gICAgICAgIC8vIGJhc2VkIG9uIGRldmljZSB2ZXJzaW9uIHJlcG9ydGVkIGJ5IHRoZSBIQUwuCi0gICAgICAgIHN3aXRjaChkZXZpY2VWZXJzaW9uKSB7Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDoKLSAgICAgICAgICAgIGNsaWVudCA9IG5ldyBDYW1lcmFDbGllbnQodGhpcywgY2FtZXJhQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgIGZhY2luZywgY2FsbGluZ1BpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwgbGVnYWN5TW9kZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wOgotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzE6Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6Ci0gICAgICAgICAgICBjbGllbnQgPSBuZXcgQ2FtZXJhMkNsaWVudCh0aGlzLCBjYW1lcmFDbGllbnQsCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgZmFjaW5nLCBjYWxsaW5nUGlkLCBjbGllbnRVaWQsIGdldHBpZCgpLCBsZWdhY3lNb2RlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgLTE6Ci0gICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjYW1lcmEgaWQgJWQiLCBjYW1lcmFJZCk7CisgICAgICAgIC8vIEdldCBzdGF0ZSBmb3IgdGhlIGdpdmVuIGNhbWVyYUlkCisgICAgICAgIGF1dG8gc3RhdGUgPSBnZXRDYW1lcmFTdGF0ZShjYW1lcmFJZCk7CisgICAgICAgIGlmIChzdGF0ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChubyBjYW1lcmEgZGV2aWNlIHdpdGggSUQgJXMpIiwKKyAgICAgICAgICAgICAgICBjbGllbnRQaWQsIGNhbWVyYUlkLnN0cmluZygpKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIGNhbWVyYSBkZXZpY2UgSEFMIHZlcnNpb246ICVkIiwgZGV2aWNlVmVyc2lvbik7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvLyBBIHBhcnRpY3VsYXIgSEFMIHZlcnNpb24gaXMgcmVxdWVzdGVkIGJ5IGNhbGxlci4gQ3JlYXRlIENhbWVyYUNsaWVudAotICAgICAgICAvLyBiYXNlZCBvbiB0aGUgcmVxdWVzdGVkIEhBTCB2ZXJzaW9uLgotICAgICAgICBpZiAoZGV2aWNlVmVyc2lvbiA+IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wICYmCi0gICAgICAgICAgICBoYWxWZXJzaW9uID09IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wKSB7Ci0gICAgICAgICAgICAvLyBPbmx5IHN1cHBvcnQgaGlnaGVyIEhBTCB2ZXJzaW9uIGRldmljZSBvcGVuZWQgYXMgSEFMMS4wIGRldmljZS4KLSAgICAgICAgICAgIGNsaWVudCA9IG5ldyBDYW1lcmFDbGllbnQodGhpcywgY2FtZXJhQ2xpZW50LAotICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgIGZhY2luZywgY2FsbGluZ1BpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwgbGVnYWN5TW9kZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBPdGhlciBjb21iaW5hdGlvbnMgKGUuZy4gSEFMMy54IG9wZW4gYXMgSEFMMi54KSBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuCi0gICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjYW1lcmEgSEFMIHZlcnNpb24gJXg6IEhBTCAleCBkZXZpY2UgY2FuIG9ubHkgYmUiCi0gICAgICAgICAgICAgICAgICAgICIgb3BlbmVkIGFzIEhBTCAleCBkZXZpY2UiLCBoYWxWZXJzaW9uLCBkZXZpY2VWZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMCk7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICAgICAgLy8gTWFrZSBkZXNjcmlwdG9yIGZvciBpbmNvbWluZyBjbGllbnQKKyAgICAgICAgY2xpZW50RGVzY3JpcHRvciA9IENhbWVyYUNsaWVudE1hbmFnZXI6Om1ha2VDbGllbnREZXNjcmlwdG9yKGNhbWVyYUlkLAorICAgICAgICAgICAgICAgIHNwPEJhc2ljQ2xpZW50PntudWxscHRyfSwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdGUtPmdldENvc3QoKSksCisgICAgICAgICAgICAgICAgc3RhdGUtPmdldENvbmZsaWN0aW5nKCksCisgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhUHJpb3JpdHlGcm9tUHJvY1N0YXRlKHByaW9yaXRpZXNbcHJpb3JpdGllcy5zaXplKCkgLSAxXSksIGNsaWVudFBpZCk7CisKKyAgICAgICAgLy8gRmluZCBjbGllbnRzIHRoYXQgd291bGQgYmUgZXZpY3RlZAorICAgICAgICBhdXRvIGV2aWN0ZWQgPSBtQWN0aXZlQ2xpZW50TWFuYWdlci53b3VsZEV2aWN0KGNsaWVudERlc2NyaXB0b3IpOworCisgICAgICAgIC8vIElmIHRoZSBpbmNvbWluZyBjbGllbnQgd2FzICdldmljdGVkLCcgaGlnaGVyIHByaW9yaXR5IGNsaWVudHMgaGF2ZSB0aGUgY2FtZXJhIGluIHRoZQorICAgICAgICAvLyBiYWNrZ3JvdW5kLCBzbyB3ZSBjYW5ub3QgZG8gZXZpY3Rpb25zCisgICAgICAgIGlmIChzdGQ6OmZpbmQoZXZpY3RlZC5iZWdpbigpLCBldmljdGVkLmVuZCgpLCBjbGllbnREZXNjcmlwdG9yKSAhPSBldmljdGVkLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChleGlzdGluZyBjbGllbnQocykgd2l0aCBoaWdoZXIiCisgICAgICAgICAgICAgICAgICAgICIgcHJpb3JpdHkpLiIsIGNsaWVudFBpZCk7CisKKyAgICAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnRTcCA9IGNsaWVudERlc2NyaXB0b3ItPmdldFZhbHVlKCk7CisgICAgICAgICAgICBTdHJpbmc4IGN1clRpbWUgPSBnZXRGb3JtYXR0ZWRDdXJyZW50VGltZSgpOworICAgICAgICAgICAgYXV0byBpbmNvbXBhdGlibGVDbGllbnRzID0KKyAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0SW5jb21wYXRpYmxlQ2xpZW50cyhjbGllbnREZXNjcmlwdG9yKTsKKworICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIiVzIDogREVOSUVEIGNvbm5lY3QgZGV2aWNlICVzIGNsaWVudCBmb3IgcGFja2FnZSAlcyAiCisgICAgICAgICAgICAgICAgICAgICIoUElEICVkLCBwcmlvcml0eSAlZCkgZHVlIHRvIGV2aWN0aW9uIHBvbGljeSIsIGN1clRpbWUuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpLCBwYWNrYWdlTmFtZS5zdHJpbmcoKSwgY2xpZW50UGlkLAorICAgICAgICAgICAgICAgICAgICBnZXRDYW1lcmFQcmlvcml0eUZyb21Qcm9jU3RhdGUocHJpb3JpdGllc1twcmlvcml0aWVzLnNpemUoKSAtIDFdKSk7CisKKyAgICAgICAgICAgIGZvciAoYXV0byYgaSA6IGluY29tcGF0aWJsZUNsaWVudHMpIHsKKyAgICAgICAgICAgICAgICBtc2cuYXBwZW5kRm9ybWF0KCJcbiAgIC0gQmxvY2tlZCBieSBleGlzdGluZyBkZXZpY2UgJXMgY2xpZW50IGZvciBwYWNrYWdlICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgIihQSUQgJSIgUFJJZDMyICIsIHByaW9yaXR5ICUiIFBSSWQzMiAiKSIsIGktPmdldEtleSgpLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOHtpLT5nZXRWYWx1ZSgpLT5nZXRQYWNrYWdlTmFtZSgpfS5zdHJpbmcoKSwgaS0+Z2V0T3duZXJJZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgaS0+Z2V0UHJpb3JpdHkoKSk7CisgICAgICAgICAgICAgICAgQUxPR0UoIiAgIENvbmZsaWN0cyB3aXRoOiBEZXZpY2UgJXMsIGNsaWVudCBwYWNrYWdlICVzIChQSUQgJSIKKyAgICAgICAgICAgICAgICAgICAgICAgIFBSSWQzMiAiLCBwcmlvcml0eSAlIiBQUklkMzIgIikiLCBpLT5nZXRLZXkoKS5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzh7aS0+Z2V0VmFsdWUoKS0+Z2V0UGFja2FnZU5hbWUoKX0uc3RyaW5nKCksIGktPmdldE93bmVySWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGktPmdldFByaW9yaXR5KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBMb2cgdGhlIGNsaWVudCdzIGF0dGVtcHQKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2dMb2NrKTsKKyAgICAgICAgICAgIG1FdmVudExvZy5hZGQobXNnKTsKKworICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoYXV0byYgaSA6IGV2aWN0ZWQpIHsKKyAgICAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnRTcCA9IGktPmdldFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoY2xpZW50U3AuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBzdGF0ZTogTnVsbCBjbGllbnQgaW4gYWN0aXZlIGNsaWVudCBsaXN0LiIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcworICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzOiBJbnZhbGlkIHN0YXRlIGZvciBDYW1lcmFTZXJ2aWNlLCBudWxsIGNsaWVudCBpbiBhY3RpdmUgbGlzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIG1BY3RpdmVDbGllbnRNYW5hZ2VyLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUxPR0UoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgZXZpY3RpbmcgY29uZmxpY3RpbmcgY2xpZW50IGZvciBjYW1lcmEgSUQgJXMiLAorICAgICAgICAgICAgICAgICAgICBpLT5nZXRLZXkoKS5zdHJpbmcoKSk7CisgICAgICAgICAgICBldmljdGVkQ2xpZW50cy5wdXNoX2JhY2soaSk7CisKKyAgICAgICAgICAgIC8vIExvZyB0aGUgY2xpZW50cyBldmljdGVkCisgICAgICAgICAgICBsb2dFdmVudChTdHJpbmc4Ojpmb3JtYXQoIkVWSUNUIGRldmljZSAlcyBjbGllbnQgaGVsZCBieSBwYWNrYWdlICVzIChQSUQiCisgICAgICAgICAgICAgICAgICAgICIgJSIgUFJJZDMyICIsIHByaW9yaXR5ICUiIFBSSWQzMiAiKVxuICAgLSBFdmljdGVkIGJ5IGRldmljZSAlcyBjbGllbnQgZm9yIgorICAgICAgICAgICAgICAgICAgICAiIHBhY2thZ2UgJXMgKFBJRCAlZCwgcHJpb3JpdHkgJSIgUFJJZDMyICIpIiwKKyAgICAgICAgICAgICAgICAgICAgaS0+Z2V0S2V5KCkuc3RyaW5nKCksIFN0cmluZzh7Y2xpZW50U3AtPmdldFBhY2thZ2VOYW1lKCl9LnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBpLT5nZXRPd25lcklkKCksIGktPmdldFByaW9yaXR5KCksIGNhbWVyYUlkLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZS5zdHJpbmcoKSwgY2xpZW50UGlkLAorICAgICAgICAgICAgICAgICAgICBnZXRDYW1lcmFQcmlvcml0eUZyb21Qcm9jU3RhdGUocHJpb3JpdGllc1twcmlvcml0aWVzLnNpemUoKSAtIDFdKSkpOworCisgICAgICAgICAgICAvLyBOb3RpZnkgdGhlIGNsaWVudCBvZiBkaXNjb25uZWN0aW9uCisgICAgICAgICAgICBjbGllbnRTcC0+bm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRCwKKyAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcygpKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3RGaW5pc2hVbnNhZmUoY2xpZW50LCBjbGllbnQtPmdldFJlbW90ZSgpKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIC8vIHRoaXMgaXMgcHJvYmFibHkgbm90IHJlY292ZXJhYmxlLi4gbWF5YmUgdGhlIGNsaWVudCBjYW4gdHJ5IGFnYWluCi0gICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgLy8gRG8gbm90IGhvbGQgbVNlcnZpY2VMb2NrIHdoaWxlIGRpc2Nvbm5lY3RpbmcgY2xpZW50cywgYnV0IHJldGFpbiB0aGUgY29uZGl0aW9uIGJsb2NraW5nCisgICAgLy8gb3RoZXIgY2xpZW50cyBmcm9tIGNvbm5lY3RpbmcgaW4gbVNlcnZpY2VMb2NrV3JhcHBlciBpZiBoZWxkCisgICAgbVNlcnZpY2VMb2NrLnVubG9jaygpOworCisgICAgLy8gQ2xlYXIgY2FsbGVyIGlkZW50aXR5IHRlbXBvcmFyaWx5IHNvIGNsaWVudCBkaXNjb25uZWN0IFBJRCBjaGVja3Mgd29yayBjb3JyZWN0bHkKKyAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKworICAgIC8vIERlc3Ryb3kgZXZpY3RlZCBjbGllbnRzCisgICAgZm9yIChhdXRvJiBpIDogZXZpY3RlZENsaWVudHMpIHsKKyAgICAgICAgLy8gRGlzY29ubmVjdCBpcyBibG9ja2luZywgYW5kIHNob3VsZCBvbmx5IGhhdmUgcmV0dXJuZWQgd2hlbiBIQUwgaGFzIGNsZWFuZWQgdXAKKyAgICAgICAgaS0+Z2V0VmFsdWUoKS0+ZGlzY29ubmVjdCgpOyAvLyBDbGllbnRzIHdpbGwgcmVtb3ZlIHRoZW1zZWx2ZXMgZnJvbSB0aGUgYWN0aXZlIGNsaWVudCBsaXN0CiAgICAgfQogCi0gICAgbUNsaWVudFtjYW1lcmFJZF0gPSBjbGllbnQ7Ci0gICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChpZCAlZCwgdGhpcyBwaWQgaXMgJWQpIiwgY2FtZXJhSWQsCi0gICAgICAgICBnZXRwaWQoKSk7CisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAKLSAgICByZXR1cm4gT0s7CisgICAgZm9yIChjb25zdCBhdXRvJiBpIDogZXZpY3RlZENsaWVudHMpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBXYWl0aW5nIGZvciBkaXNjb25uZWN0IHRvIGNvbXBsZXRlIGZvciBjbGllbnQgZm9yIGRldmljZSAlcyAoUElEICUiIFBSSWQzMiAiKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpLT5nZXRLZXkoKS5zdHJpbmcoKSwgaS0+Z2V0T3duZXJJZCgpKTsKKyAgICAgICAgcmV0ID0gbUFjdGl2ZUNsaWVudE1hbmFnZXIud2FpdFVudGlsUmVtb3ZlZChpLCBERUZBVUxUX0RJU0NPTk5FQ1RfVElNRU9VVF9OUyk7CisgICAgICAgIGlmIChyZXQgPT0gVElNRURfT1VUKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRpbWVkIG91dCB3YWl0aW5nIGZvciBjbGllbnQgZm9yIGRldmljZSAlcyB0byBkaXNjb25uZWN0LCAiCisgICAgICAgICAgICAgICAgICAgICJjdXJyZW50IGNsaWVudHM6XG4lcyIsIF9fRlVOQ1RJT05fXywgaS0+Z2V0S2V5KCkuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVDbGllbnRNYW5hZ2VyLnRvU3RyaW5nKCkuc3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFJlY2VpdmVkIGVycm9yIHdhaXRpbmcgZm9yIGNsaWVudCBmb3IgZGV2aWNlICVzIHRvIGRpc2Nvbm5lY3Q6ICVzICglZCksICIKKyAgICAgICAgICAgICAgICAgICAgImN1cnJlbnQgY2xpZW50czpcbiVzIiwgX19GVU5DVElPTl9fLCBpLT5nZXRLZXkoKS5zdHJpbmcoKSwgc3RyZXJyb3IoLXJldCksCisgICAgICAgICAgICAgICAgICAgIHJldCwgbUFjdGl2ZUNsaWVudE1hbmFnZXIudG9TdHJpbmcoKS5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgZXZpY3RlZENsaWVudHMuY2xlYXIoKTsKKworICAgIC8vIE9uY2UgY2xpZW50cyBoYXZlIGJlZW4gZGlzY29ubmVjdGVkLCByZWxvY2sKKyAgICBtU2VydmljZUxvY2subG9jaygpOworCisgICAgLy8gQ2hlY2sgYWdhaW4gaWYgdGhlIGRldmljZSB3YXMgdW5wbHVnZ2VkIG9yIHNvbWV0aGluZyB3aGlsZSB3ZSB3ZXJlbid0IGhvbGRpbmcgbVNlcnZpY2VMb2NrCisgICAgaWYgKChyZXQgPSBjaGVja0lmRGV2aWNlSXNVc2FibGUoY2FtZXJhSWQpKSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgICpwYXJ0aWFsID0gY2xpZW50RGVzY3JpcHRvcjsKKyAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmNvbm5lY3QoCkBAIC03MzgsNDcgKzExMzEsMjAgQEAKICAgICAgICAgLypvdXQqLwogICAgICAgICBzcDxJQ2FtZXJhPiYgZGV2aWNlKSB7CiAKLSAgICBTdHJpbmc4IGNsaWVudE5hbWU4KGNsaWVudFBhY2thZ2VOYW1lKTsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBzdGF0dXNfdCByZXQgPSBOT19FUlJPUjsKKyAgICBTdHJpbmc4IGlkID0gU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYUlkKTsKKyAgICBzcDxDbGllbnQ+IGNsaWVudCA9IG51bGxwdHI7CisgICAgcmV0ID0gY29ubmVjdEhlbHBlcjxJQ2FtZXJhQ2xpZW50LENsaWVudD4oY2FtZXJhQ2xpZW50LCBpZCwgQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRVaWQsIEFQSV8xLCBmYWxzZSwgZmFsc2UsIC8qb3V0Ki9jbGllbnQpOwogCi0gICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBFIChwaWQgJWQgXCIlc1wiLCBpZCAlZCkiLCBjYWxsaW5nUGlkLAotICAgICAgICAgICAgY2xpZW50TmFtZTguc3RyaW5nKCksIGNhbWVyYUlkKTsKLQotICAgIHN0YXR1c190IHN0YXR1cyA9IHZhbGlkYXRlQ29ubmVjdChjYW1lcmFJZCwgLyppbm91dCovY2xpZW50VWlkKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgaWYocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGxvZ1JlamVjdGVkKGlkLCBnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAorICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiJXMgKCVkKSIsIHN0cmVycm9yKC1yZXQpLCByZXQpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKLQotICAgIHNwPENsaWVudD4gY2xpZW50OwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKLSAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudFRtcDsKLSAgICAgICAgaWYgKCFjYW5Db25uZWN0VW5zYWZlKGNhbWVyYUlkLCBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGNhbWVyYUNsaWVudCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovY2xpZW50VG1wKSkgewotICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKLSAgICAgICAgfSBlbHNlIGlmIChjbGllbnQuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICAgICAgZGV2aWNlID0gc3RhdGljX2Nhc3Q8Q2xpZW50Kj4oY2xpZW50VG1wLmdldCgpKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1cyA9IGNvbm5lY3RIZWxwZXJMb2NrZWQoLypvdXQqL2NsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFDbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgLy8gaW1wb3J0YW50OiByZWxlYXNlIHRoZSBtdXRleCBoZXJlIHNvIHRoZSBjbGllbnQgY2FuIGNhbGwgYmFjawotICAgIC8vICAgIGludG8gdGhlIHNlcnZpY2UgZnJvbSBpdHMgZGVzdHJ1Y3RvciAoY2FuIGJlIGF0IHRoZSBlbmQgb2YgdGhlIGNhbGwpCi0KICAgICBkZXZpY2UgPSBjbGllbnQ7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Y29ubmVjdExlZ2FjeSgKQEAgLTc4OSw4ICsxMTU1LDEwIEBACiAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgc3A8SUNhbWVyYT4mIGRldmljZSkgewogCisgICAgU3RyaW5nOCBpZCA9IFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCk7CisgICAgaW50IGFwaVZlcnNpb24gPSBtTW9kdWxlLT5nZXRNb2R1bGVBcGlWZXJzaW9uKCk7CiAgICAgaWYgKGhhbFZlcnNpb24gIT0gQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCAmJgotICAgICAgICAgICAgbU1vZHVsZS0+Y29tbW9uLm1vZHVsZV9hcGlfdmVyc2lvbiA8IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8zKSB7CisgICAgICAgICAgICBhcGlWZXJzaW9uIDwgQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzMpIHsKICAgICAgICAgLyoKICAgICAgICAgICogRWl0aGVyIHRoZSBIQUwgdmVyc2lvbiBpcyB1bnNwZWNpZmllZCBpbiB3aGljaCBjYXNlIHRoaXMganVzdCBjcmVhdGVzCiAgICAgICAgICAqIGEgY2FtZXJhIGNsaWVudCBzZWxlY3RlZCBieSB0aGUgbGF0ZXN0IGRldmljZSB2ZXJzaW9uLCBvcgpAQCAtNzk4LDE0MiArMTE2NiwyNSBAQAogICAgICAgICAgKiB0aGUgb3Blbl9sZWdhY3kgY2FsbAogICAgICAgICAgKi8KICAgICAgICAgQUxPR0UoIiVzOiBjYW1lcmEgSEFMIG1vZHVsZSB2ZXJzaW9uICV4IGRvZXNuJ3Qgc3VwcG9ydCBjb25uZWN0aW5nIHRvIGxlZ2FjeSBIQUwgZGV2aWNlcyEiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbU1vZHVsZS0+Y29tbW9uLm1vZHVsZV9hcGlfdmVyc2lvbik7CisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhcGlWZXJzaW9uKTsKKyAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIGdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCisgICAgICAgICAgICAgICAgU3RyaW5nOCgiSEFMIG1vZHVsZSB2ZXJzaW9uIGRvZXNuJ3Qgc3VwcG9ydCBsZWdhY3kgSEFMIGNvbm5lY3Rpb25zIikpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgU3RyaW5nOCBjbGllbnROYW1lOChjbGllbnRQYWNrYWdlTmFtZSk7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgc3RhdHVzX3QgcmV0ID0gTk9fRVJST1I7CisgICAgc3A8Q2xpZW50PiBjbGllbnQgPSBudWxscHRyOworICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYUNsaWVudCxDbGllbnQ+KGNhbWVyYUNsaWVudCwgaWQsIGhhbFZlcnNpb24sIGNsaWVudFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgY2xpZW50VWlkLCBBUElfMSwgdHJ1ZSwgZmFsc2UsIC8qb3V0Ki9jbGllbnQpOwogCi0gICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBsZWdhY3kgRSAocGlkICVkIFwiJXNcIiwgaWQgJWQpIiwgY2FsbGluZ1BpZCwKLSAgICAgICAgICAgIGNsaWVudE5hbWU4LnN0cmluZygpLCBjYW1lcmFJZCk7Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSB2YWxpZGF0ZUNvbm5lY3QoY2FtZXJhSWQsIC8qaW5vdXQqL2NsaWVudFVpZCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIGlmKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICBsb2dSZWplY3RlZChpZCwgZ2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKKyAgICAgICAgICAgICAgICBTdHJpbmc4Ojpmb3JtYXQoIiVzICglZCkiLCBzdHJlcnJvcigtcmV0KSwgcmV0KSk7CisgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCi0gICAgc3A8Q2xpZW50PiBjbGllbnQ7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwotICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50VG1wOwotICAgICAgICBpZiAoIWNhbkNvbm5lY3RVbnNhZmUoY2FtZXJhSWQsIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoY2FtZXJhQ2xpZW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki9jbGllbnRUbXApKSB7Ci0gICAgICAgICAgICByZXR1cm4gLUVCVVNZOwotICAgICAgICB9IGVsc2UgaWYgKGNsaWVudC5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBzdGF0aWNfY2FzdDxDbGllbnQqPihjbGllbnRUbXAuZ2V0KCkpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzID0gY29ubmVjdEhlbHBlckxvY2tlZCgvKm91dCovY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxWZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbGVnYWN5TW9kZSovdHJ1ZSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICAvLyBpbXBvcnRhbnQ6IHJlbGVhc2UgdGhlIG11dGV4IGhlcmUgc28gdGhlIGNsaWVudCBjYW4gY2FsbCBiYWNrCi0gICAgLy8gICAgaW50byB0aGUgc2VydmljZSBmcm9tIGl0cyBkZXN0cnVjdG9yIChjYW4gYmUgYXQgdGhlIGVuZCBvZiB0aGUgY2FsbCkKLQogICAgIGRldmljZSA9IGNsaWVudDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IENhbWVyYVNlcnZpY2U6OmNvbm5lY3RGaW5pc2hVbnNhZmUoY29uc3Qgc3A8QmFzaWNDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiByZW1vdGVDYWxsYmFjaykgewotICAgIHN0YXR1c190IHN0YXR1cyA9IGNsaWVudC0+aW5pdGlhbGl6ZShtTW9kdWxlKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGluaXRpYWxpemUgY2xpZW50IGZyb20gSEFMIG1vZHVsZS4iLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBpZiAocmVtb3RlQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICByZW1vdGVDYWxsYmFjay0+bGlua1RvRGVhdGgodGhpcyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0UHJvKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElQcm9DYW1lcmFDYWxsYmFja3M+JiBjYW1lcmFDYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElQcm9DYW1lcmFVc2VyPiYgZGV2aWNlKQotewotICAgIGlmIChjYW1lcmFDYiA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FsbGJhY2sgbXVzdCBub3QgYmUgbnVsbCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgU3RyaW5nOCBjbGllbnROYW1lOChjbGllbnRQYWNrYWdlTmFtZSk7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7Ci0KLSAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0UHJvIEUgKHBpZCAlZCBcIiVzXCIsIGlkICVkKSIsIGNhbGxpbmdQaWQsCi0gICAgICAgICAgICBjbGllbnROYW1lOC5zdHJpbmcoKSwgY2FtZXJhSWQpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHZhbGlkYXRlQ29ubmVjdChjYW1lcmFJZCwgLyppbm91dCovY2xpZW50VWlkKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgc3A8UHJvQ2xpZW50PiBjbGllbnQ7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwotICAgICAgICB7Ci0gICAgICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50OwotICAgICAgICAgICAgaWYgKCFjYW5Db25uZWN0VW5zYWZlKGNhbWVyYUlkLCBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihjYW1lcmFDYiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqL2NsaWVudCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGZhY2luZyA9IC0xOwotICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oY2FtZXJhSWQsICZmYWNpbmcpOwotCi0gICAgICAgIHN3aXRjaChkZXZpY2VWZXJzaW9uKSB7Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDoKLSAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgaWQgJWQgdXNlcyBIQUx2MSwgZG9lc24ndCBzdXBwb3J0IFByb0NhbWVyYSIsCi0gICAgICAgICAgICAgICAgICBjYW1lcmFJZCk7Ci0gICAgICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wOgotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzE6Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6Ci0gICAgICAgICAgICBjbGllbnQgPSBuZXcgUHJvQ2FtZXJhMkNsaWVudCh0aGlzLCBjYW1lcmFDYiwgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBmYWNpbmcsIGNhbGxpbmdQaWQsIGNsaWVudFVpZCwgZ2V0cGlkKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAtMToKLSAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNhbWVyYSBpZCAlZCIsIGNhbWVyYUlkKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIGNhbWVyYSBkZXZpY2UgSEFMIHZlcnNpb246ICVkIiwgZGV2aWNlVmVyc2lvbik7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb25uZWN0RmluaXNoVW5zYWZlKGNsaWVudCwgY2xpZW50LT5nZXRSZW1vdGUoKSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLQotICAgICAgICBtUHJvQ2xpZW50TGlzdFtjYW1lcmFJZF0ucHVzaChjbGllbnQpOwotCi0gICAgICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3RQcm8gWCAoaWQgJWQsIHRoaXMgcGlkIGlzICVkKSIsIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgIGdldHBpZCgpKTsKLSAgICB9Ci0gICAgLy8gaW1wb3J0YW50OiByZWxlYXNlIHRoZSBtdXRleCBoZXJlIHNvIHRoZSBjbGllbnQgY2FuIGNhbGwgYmFjawotICAgIC8vICAgIGludG8gdGhlIHNlcnZpY2UgZnJvbSBpdHMgZGVzdHJ1Y3RvciAoY2FuIGJlIGF0IHRoZSBlbmQgb2YgdGhlIGNhbGwpCi0gICAgZGV2aWNlID0gY2xpZW50OwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmNvbm5lY3REZXZpY2UoCkBAIC05NDIsMTEwICsxMTkzLDE3OCBAQAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgIGludCBjbGllbnRVaWQsCiAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgc3A8SUNhbWVyYURldmljZVVzZXI+JiBkZXZpY2UpCi17CisgICAgICAgIHNwPElDYW1lcmFEZXZpY2VVc2VyPiYgZGV2aWNlKSB7CiAKLSAgICBTdHJpbmc4IGNsaWVudE5hbWU4KGNsaWVudFBhY2thZ2VOYW1lKTsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBzdGF0dXNfdCByZXQgPSBOT19FUlJPUjsKKyAgICBTdHJpbmc4IGlkID0gU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYUlkKTsKKyAgICBzcDxDYW1lcmFEZXZpY2VDbGllbnQ+IGNsaWVudCA9IG51bGxwdHI7CisgICAgcmV0ID0gY29ubmVjdEhlbHBlcjxJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLENhbWVyYURldmljZUNsaWVudD4oY2FtZXJhQ2IsIGlkLAorICAgICAgICAgICAgQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCwgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudFVpZCwgQVBJXzIsIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICAgIC8qb3V0Ki9jbGllbnQpOwogCi0gICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdERldmljZSBFIChwaWQgJWQgXCIlc1wiLCBpZCAlZCkiLCBjYWxsaW5nUGlkLAotICAgICAgICAgICAgY2xpZW50TmFtZTguc3RyaW5nKCksIGNhbWVyYUlkKTsKLQotICAgIHN0YXR1c190IHN0YXR1cyA9IHZhbGlkYXRlQ29ubmVjdChjYW1lcmFJZCwgLyppbm91dCovY2xpZW50VWlkKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgaWYocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGxvZ1JlamVjdGVkKGlkLCBnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAorICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiJXMgKCVkKSIsIHN0cmVycm9yKC1yZXQpLCByZXQpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKLSAgICBzcDxDYW1lcmFEZXZpY2VDbGllbnQ+IGNsaWVudDsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnQ7Ci0gICAgICAgICAgICBpZiAoIWNhbkNvbm5lY3RVbnNhZmUoY2FtZXJhSWQsIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGNhbWVyYUNiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovY2xpZW50KSkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmFjaW5nID0gLTE7Ci0gICAgICAgIGludCBkZXZpY2VWZXJzaW9uID0gZ2V0RGV2aWNlVmVyc2lvbihjYW1lcmFJZCwgJmZhY2luZyk7Ci0KLSAgICAgICAgc3dpdGNoKGRldmljZVZlcnNpb24pIHsKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wOgotICAgICAgICAgICAgQUxPR1coIkNhbWVyYSB1c2luZyBvbGQgSEFMIHZlcnNpb246ICVkIiwgZGV2aWNlVmVyc2lvbik7Ci0gICAgICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7Ci0gICAgICAgICAgIC8vIFRPRE86IGRvbid0IGFsbG93IDIuMCAgT25seSBhbGxvdyAyLjEgYW5kIGhpZ2hlcgotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzA6Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMToKLSAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgotICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6Ci0gICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKLSAgICAgICAgICAgIGNsaWVudCA9IG5ldyBDYW1lcmFEZXZpY2VDbGllbnQodGhpcywgY2FtZXJhQ2IsIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgZmFjaW5nLCBjYWxsaW5nUGlkLCBjbGllbnRVaWQsIGdldHBpZCgpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgLTE6Ci0gICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjYW1lcmEgaWQgJWQiLCBjYW1lcmFJZCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HRSgiVW5rbm93biBjYW1lcmEgZGV2aWNlIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gY29ubmVjdEZpbmlzaFVuc2FmZShjbGllbnQsIGNsaWVudC0+Z2V0UmVtb3RlKCkpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICAvLyB0aGlzIGlzIHByb2JhYmx5IG5vdCByZWNvdmVyYWJsZS4uIG1heWJlIHRoZSBjbGllbnQgY2FuIHRyeSBhZ2FpbgotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotCi0gICAgICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3REZXZpY2UgWCAoaWQgJWQsIHRoaXMgcGlkIGlzICVkKSIsIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgIGdldHBpZCgpKTsKLQotICAgICAgICBtQ2xpZW50W2NhbWVyYUlkXSA9IGNsaWVudDsKLSAgICB9Ci0gICAgLy8gaW1wb3J0YW50OiByZWxlYXNlIHRoZSBtdXRleCBoZXJlIHNvIHRoZSBjbGllbnQgY2FuIGNhbGwgYmFjawotICAgIC8vICAgIGludG8gdGhlIHNlcnZpY2UgZnJvbSBpdHMgZGVzdHJ1Y3RvciAoY2FuIGJlIGF0IHRoZSBlbmQgb2YgdGhlIGNhbGwpCi0KICAgICBkZXZpY2UgPSBjbGllbnQ7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpzZXRUb3JjaE1vZGUoY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLCBib29sIGVuYWJsZWQsCisgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBjbGllbnRCaW5kZXIpIHsKKyAgICBpZiAoZW5hYmxlZCAmJiBjbGllbnRCaW5kZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IHRvcmNoIGNsaWVudCBiaW5kZXIgaXMgTlVMTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIFN0cmluZzggaWQgPSBTdHJpbmc4KGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICBpbnQgdWlkID0gZ2V0Q2FsbGluZ1VpZCgpOworCisgICAgLy8gdmVyaWZ5IGlkIGlzIHZhbGlkLgorICAgIGF1dG8gc3RhdGUgPSBnZXRDYW1lcmFTdGF0ZShpZCk7CisgICAgaWYgKHN0YXRlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW1lcmEgaWQgaXMgaW52YWxpZCAlcyIsIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMgY2FtZXJhU3RhdHVzID0gc3RhdGUtPmdldFN0YXR1cygpOworICAgIGlmIChjYW1lcmFTdGF0dXMgIT0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQgJiYKKyAgICAgICAgICAgIGNhbWVyYVN0YXR1cyAhPSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX0FWQUlMQUJMRSkgeworICAgICAgICBBTE9HRSgiJXM6IGNhbWVyYSBpZCBpcyBpbnZhbGlkICVzIiwgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1Ub3JjaFN0YXR1c011dGV4KTsKKyAgICAgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VG9yY2hTdGF0dXMgc3RhdHVzOworICAgICAgICBzdGF0dXNfdCByZXMgPSBnZXRUb3JjaFN0YXR1c0xvY2tlZChpZCwgJnN0YXR1cyk7CisgICAgICAgIGlmIChyZXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogZ2V0dGluZyBjdXJyZW50IHRvcmNoIHN0YXR1cyBmYWlsZWQgZm9yIGNhbWVyYSAlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhdHVzID09IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRPUkNIX1NUQVRVU19OT1RfQVZBSUxBQkxFKSB7CisgICAgICAgICAgICBpZiAoY2FtZXJhU3RhdHVzID09IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfQVZBSUxBQkxFKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiB0b3JjaCBtb2RlIG9mIGNhbWVyYSAlcyBpcyBub3QgYXZhaWxhYmxlIGJlY2F1c2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgImNhbWVyYSBpcyBpbiB1c2UiLCBfX0ZVTkNUSU9OX18sIGlkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHRvcmNoIG1vZGUgb2YgY2FtZXJhICVzIGlzIG5vdCBhdmFpbGFibGUgZHVlIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnN1ZmZpY2llbnQgcmVzb3VyY2VzIiwgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FVVNFUlM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICAgIC8vIFVwZGF0ZSBVSUQgbWFwIC0gdGhpcyBpcyB1c2VkIGluIHRoZSB0b3JjaCBzdGF0dXMgY2hhbmdlZCBjYWxsYmFja3MsIHNvIG11c3QgYmUgZG9uZQorICAgICAgICAvLyBiZWZvcmUgc2V0VG9yY2hNb2RlCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtVG9yY2hVaWRNYXBNdXRleCk7CisgICAgICAgIGlmIChtVG9yY2hVaWRNYXAuZmluZChpZCkgPT0gbVRvcmNoVWlkTWFwLmVuZCgpKSB7CisgICAgICAgICAgICBtVG9yY2hVaWRNYXBbaWRdLmZpcnN0ID0gdWlkOworICAgICAgICAgICAgbVRvcmNoVWlkTWFwW2lkXS5zZWNvbmQgPSB1aWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTZXQgdGhlIHBlbmRpbmcgVUlECisgICAgICAgICAgICBtVG9yY2hVaWRNYXBbaWRdLmZpcnN0ID0gdWlkOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzX3QgcmVzID0gbUZsYXNobGlnaHQtPnNldFRvcmNoTW9kZShpZCwgZW5hYmxlZCk7CisKKyAgICBpZiAocmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyB0b3JjaCBtb2RlIG9mIGNhbWVyYSAlcyB0byAlZCBmYWlsZWQuICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCksIGVuYWJsZWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gdXBkYXRlIHRoZSBsaW5rIHRvIGNsaWVudCdzIGRlYXRoCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtVG9yY2hDbGllbnRNYXBNdXRleCk7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtVG9yY2hDbGllbnRNYXAuaW5kZXhPZktleShpZCk7CisgICAgICAgIEJhdHRlcnlOb3RpZmllciYgbm90aWZpZXIoQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpKTsKKyAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgIGlmIChpbmRleCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgICAgIG1Ub3JjaENsaWVudE1hcC5hZGQoaWQsIGNsaWVudEJpbmRlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Ub3JjaENsaWVudE1hcC52YWx1ZUF0KGluZGV4KS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICAgICAgICAgICAgICBtVG9yY2hDbGllbnRNYXAucmVwbGFjZVZhbHVlQXQoaW5kZXgsIGNsaWVudEJpbmRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGllbnRCaW5kZXItPmxpbmtUb0RlYXRoKHRoaXMpOworICAgICAgICB9IGVsc2UgaWYgKGluZGV4ICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICBtVG9yY2hDbGllbnRNYXAudmFsdWVBdChpbmRleCktPnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6bm90aWZ5U3lzdGVtRXZlbnQoaW50MzJfdCBldmVudElkLCBjb25zdCBpbnQzMl90KiBhcmdzLCBzaXplX3QgbGVuZ3RoKSB7CisgICAgc3dpdGNoKGV2ZW50SWQpIHsKKyAgICAgICAgY2FzZSBJQ2FtZXJhU2VydmljZTo6VVNFUl9TV0lUQ0hFRDogeworICAgICAgICAgICAgZG9Vc2VyU3dpdGNoKC8qbmV3VXNlcklkcyovYXJncywgLypsZW5ndGgqL2xlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIElDYW1lcmFTZXJ2aWNlOjpOT19FVkVOVDoKKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgQUxPR1coIiVzOiBSZWNlaXZlZCBpbnZhbGlkIHN5c3RlbSBldmVudCBmcm9tIHN5c3RlbV9zZXJ2ZXI6ICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBldmVudElkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQogCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjphZGRMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjphZGRMaXN0ZW5lcihjb25zdCBzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICBBTE9HVigiJXM6IEFkZCBsaXN0ZW5lciAlcCIsIF9fRlVOQ1RJT05fXywgbGlzdGVuZXIuZ2V0KCkpOwogCi0gICAgaWYgKGxpc3RlbmVyID09IDApIHsKKyAgICBpZiAobGlzdGVuZXIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiJXM6IExpc3RlbmVyIG11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7CiAKLSAgICBWZWN0b3I8c3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gPjo6aXRlcmF0b3IgaXQsIGVuZDsKLSAgICBmb3IgKGl0ID0gbUxpc3RlbmVyTGlzdC5iZWdpbigpOyBpdCAhPSBtTGlzdGVuZXJMaXN0LmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIGlmIChJSW50ZXJmYWNlOjphc0JpbmRlcigqaXQpID09IElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSkgewotICAgICAgICAgICAgQUxPR1coIiVzOiBUcmllZCB0byBhZGQgbGlzdGVuZXIgJXAgd2hpY2ggd2FzIGFscmVhZHkgc3Vic2NyaWJlZCIsCi0gICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGxpc3RlbmVyLmdldCgpKTsKLSAgICAgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMaXN0ZW5lckxvY2spOworICAgICAgICBmb3IgKGF1dG8mIGl0IDogbUxpc3RlbmVyTGlzdCkgeworICAgICAgICAgICAgaWYgKElJbnRlcmZhY2U6OmFzQmluZGVyKGl0KSA9PSBJSW50ZXJmYWNlOjphc0JpbmRlcihsaXN0ZW5lcikpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXM6IFRyaWVkIHRvIGFkZCBsaXN0ZW5lciAlcCB3aGljaCB3YXMgYWxyZWFkeSBzdWJzY3JpYmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGxpc3RlbmVyLmdldCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBtTGlzdGVuZXJMaXN0LnB1c2hfYmFjayhsaXN0ZW5lcik7CiAgICAgfQogCi0gICAgbUxpc3RlbmVyTGlzdC5wdXNoX2JhY2sobGlzdGVuZXIpOwogCiAgICAgLyogSW1tZWRpYXRlbHkgc2lnbmFsIGN1cnJlbnQgc3RhdHVzIHRvIHRoaXMgbGlzdGVuZXIgb25seSAqLwogICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIG0obVN0YXR1c011dGV4KSA7Ci0gICAgICAgIGludCBudW1DYW1zID0gZ2V0TnVtYmVyT2ZDYW1lcmFzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2FtczsgKytpKSB7Ci0gICAgICAgICAgICBsaXN0ZW5lci0+b25TdGF0dXNDaGFuZ2VkKG1TdGF0dXNMaXN0W2ldLCBpKTsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUNhbWVyYVN0YXRlc0xvY2spOworICAgICAgICBmb3IgKGF1dG8mIGkgOiBtQ2FtZXJhU3RhdGVzKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBVcGRhdGUgYmluZGVyIHRvIHVzZSBTdHJpbmcxNiBmb3IgY2FtZXJhIElEcyBhbmQgcmVtb3ZlOworICAgICAgICAgICAgaW50IGlkID0gY2FtZXJhSWRUb0ludChpLmZpcnN0KTsKKyAgICAgICAgICAgIGlmIChpZCA9PSAtMSkgY29udGludWU7CisKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vblN0YXR1c0NoYW5nZWQoaS5zZWNvbmQtPmdldFN0YXR1cygpLCBpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBJbW1lZGlhdGVseSBzaWduYWwgY3VycmVudCB0b3JjaCBzdGF0dXMgdG8gdGhpcyBsaXN0ZW5lciBvbmx5ICovCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRvcmNoU3RhdHVzTXV0ZXgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ub3JjaFN0YXR1c01hcC5zaXplKCk7IGkrKyApIHsKKyAgICAgICAgICAgIFN0cmluZzE2IGlkID0gU3RyaW5nMTYobVRvcmNoU3RhdHVzTWFwLmtleUF0KGkpLnN0cmluZygpKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vblRvcmNoU3RhdHVzQ2hhbmdlZChtVG9yY2hTdGF0dXNNYXAudmFsdWVBdChpKSwgaWQpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQotc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6cmVtb3ZlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBsaXN0ZW5lcikgeworCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpyZW1vdmVMaXN0ZW5lcihjb25zdCBzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICBBTE9HVigiJXM6IFJlbW92ZSBsaXN0ZW5lciAlcCIsIF9fRlVOQ1RJT05fXywgbGlzdGVuZXIuZ2V0KCkpOwogCiAgICAgaWYgKGxpc3RlbmVyID09IDApIHsKQEAgLTEwNTUsMTEgKzEzNzQsMTMgQEAKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXJ2aWNlTG9jayk7CiAKLSAgICBWZWN0b3I8c3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gPjo6aXRlcmF0b3IgaXQ7Ci0gICAgZm9yIChpdCA9IG1MaXN0ZW5lckxpc3QuYmVnaW4oKTsgaXQgIT0gbUxpc3RlbmVyTGlzdC5lbmQoKTsgKytpdCkgewotICAgICAgICBpZiAoSUludGVyZmFjZTo6YXNCaW5kZXIoKml0KSA9PSBJSW50ZXJmYWNlOjphc0JpbmRlcihsaXN0ZW5lcikpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lckxpc3QuZXJhc2UoaXQpOwotICAgICAgICAgICAgcmV0dXJuIE9LOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xpc3RlbmVyTG9jayk7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1MaXN0ZW5lckxpc3QuYmVnaW4oKTsgaXQgIT0gbUxpc3RlbmVyTGlzdC5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgaWYgKElJbnRlcmZhY2U6OmFzQmluZGVyKCppdCkgPT0gSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKSB7CisgICAgICAgICAgICAgICAgbUxpc3RlbmVyTGlzdC5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xMDY5LDEwICsxMzkwLDcgQEAKICAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCi1zdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpnZXRMZWdhY3lQYXJhbWV0ZXJzKAotICAgICAgICAgICAgaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgLypvdXQqLwotICAgICAgICAgICAgU3RyaW5nMTYqIHBhcmFtZXRlcnMpIHsKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmdldExlZ2FjeVBhcmFtZXRlcnMoaW50IGNhbWVyYUlkLCAvKm91dCovU3RyaW5nMTYqIHBhcmFtZXRlcnMpIHsKICAgICBBTE9HVigiJXM6IGZvciBjYW1lcmEgSUQgPSAlZCIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQpOwogCiAgICAgaWYgKHBhcmFtZXRlcnMgPT0gTlVMTCkgewpAQCAtMTEyNyw2ICsxNDQ1LDcgQEAKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMjoKKyAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM6CiAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhIGlkICVkIHVzZXMgSEFMMy4yIG9yIG5ld2VyLCBzdXBwb3J0cyBhcGkxL2FwaTIgZGlyZWN0bHkiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQpOwogICAgICAgICByZXR1cm4gT0s7CkBAIC0xMTQxLDE0MCArMTQ2MCwyODEgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgQ2FtZXJhU2VydmljZTo6cmVtb3ZlQ2xpZW50QnlSZW1vdGUoY29uc3Qgd3A8SUJpbmRlcj4mIHJlbW90ZUJpbmRlcikgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwotICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OnJlbW92ZUNsaWVudEJ5UmVtb3RlIEUgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKLQotICAgIC8vIERlY2xhcmUgdGhpcyBiZWZvcmUgdGhlIGxvY2sgdG8gbWFrZSBhYnNvbHV0ZWx5IHN1cmUgdGhlCi0gICAgLy8gZGVzdHJ1Y3RvciB3b24ndCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkLgordm9pZCBDYW1lcmFTZXJ2aWNlOjpyZW1vdmVCeUNsaWVudChjb25zdCBCYXNpY0NsaWVudCogY2xpZW50KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKLQotICAgIGludCBvdXRJbmRleDsKLSAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50ID0gZmluZENsaWVudFVuc2FmZShyZW1vdGVCaW5kZXIsIG91dEluZGV4KTsKLQotICAgIGlmIChjbGllbnQgIT0gMCkgewotICAgICAgICAvLyBGb3VuZCBvdXIgY2FtZXJhLCBjbGVhciBhbmQgbGVhdmUuCi0gICAgICAgIExPRzEoInJlbW92ZUNsaWVudDogY2xlYXIgY2FtZXJhICVkIiwgb3V0SW5kZXgpOwotCi0gICAgICAgIHNwPElCaW5kZXI+IHJlbW90ZSA9IGNsaWVudC0+Z2V0UmVtb3RlKCk7Ci0gICAgICAgIGlmIChyZW1vdGUgIT0gTlVMTCkgewotICAgICAgICAgICAgcmVtb3RlLT51bmxpbmtUb0RlYXRoKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUNsaWVudFtvdXRJbmRleF0uY2xlYXIoKTsKLSAgICB9IGVsc2UgewotCi0gICAgICAgIHNwPFByb0NsaWVudD4gY2xpZW50UHJvID0gZmluZFByb0NsaWVudFVuc2FmZShyZW1vdGVCaW5kZXIpOwotCi0gICAgICAgIGlmIChjbGllbnRQcm8gIT0gTlVMTCkgewotICAgICAgICAgICAgLy8gRm91bmQgb3VyIGNhbWVyYSwgY2xlYXIgYW5kIGxlYXZlLgotICAgICAgICAgICAgTE9HMSgicmVtb3ZlQ2xpZW50OiBjbGVhciBwcm8gJXAiLCBjbGllbnRQcm8uZ2V0KCkpOwotCi0gICAgICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihjbGllbnRQcm8tPmdldFJlbW90ZUNhbGxiYWNrKCkpLT51bmxpbmtUb0RlYXRoKHRoaXMpOworICAgIGZvciAoYXV0byYgaSA6IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbCgpKSB7CisgICAgICAgIGF1dG8gY2xpZW50U3AgPSBpLT5nZXRWYWx1ZSgpOworICAgICAgICBpZiAoY2xpZW50U3AuZ2V0KCkgPT0gY2xpZW50KSB7CisgICAgICAgICAgICBtQWN0aXZlQ2xpZW50TWFuYWdlci5yZW1vdmUoaSk7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBMT0cxKCJDYW1lcmFTZXJ2aWNlOjpyZW1vdmVDbGllbnRCeVJlbW90ZSBYIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CiB9CiAKLXNwPENhbWVyYVNlcnZpY2U6OlByb0NsaWVudD4gQ2FtZXJhU2VydmljZTo6ZmluZFByb0NsaWVudFVuc2FmZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPElCaW5kZXI+JiBjYW1lcmFDYWxsYmFja3NSZW1vdGUpCi17Ci0gICAgc3A8UHJvQ2xpZW50PiBjbGllbnRQcm87Citib29sIENhbWVyYVNlcnZpY2U6OmV2aWN0Q2xpZW50SWRCeVJlbW90ZShjb25zdCB3cDxJQmluZGVyPiYgcmVtb3RlKSB7CisgICAgY29uc3QgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgY29uc3QgaW50IHNlcnZpY2VQaWQgPSBnZXRwaWQoKTsKKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgLy8gQWNxdWlyZSBtU2VydmljZUxvY2sgYW5kIHByZXZlbnQgb3RoZXIgY2xpZW50cyBmcm9tIGNvbm5lY3RpbmcKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEF1dG9Db25kaXRpb25Mb2NrPiBsb2NrID0KKyAgICAgICAgICAgICAgICBBdXRvQ29uZGl0aW9uTG9jazo6d2FpdEFuZEFjcXVpcmUobVNlcnZpY2VMb2NrV3JhcHBlcik7CiAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1iZXJPZkNhbWVyYXM7ICsraSkgewotICAgICAgICBWZWN0b3I8c2l6ZV90PiByZW1vdmVJZHg7CiAKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtUHJvQ2xpZW50TGlzdFtpXS5zaXplKCk7ICsraikgewotICAgICAgICAgICAgd3A8UHJvQ2xpZW50PiBjbCA9IG1Qcm9DbGllbnRMaXN0W2ldW2pdOworICAgICAgICBzdGQ6OnZlY3RvcjxzcDxCYXNpY0NsaWVudD4+IGV2aWN0ZWQ7CisgICAgICAgIGZvciAoYXV0byYgaSA6IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbCgpKSB7CisgICAgICAgICAgICBhdXRvIGNsaWVudFNwID0gaS0+Z2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmIChjbGllbnRTcC5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBEZWFkIGNsaWVudCBzdGlsbCBpbiBtQWN0aXZlQ2xpZW50TWFuYWdlci4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIG1BY3RpdmVDbGllbnRNYW5hZ2VyLnJlbW92ZShpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZW1vdGUgPT0gY2xpZW50U3AtPmdldFJlbW90ZSgpICYmIChjYWxsaW5nUGlkID09IHNlcnZpY2VQaWQgfHwKKyAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCA9PSBjbGllbnRTcC0+Z2V0Q2xpZW50UGlkKCkpKSB7CisgICAgICAgICAgICAgICAgbUFjdGl2ZUNsaWVudE1hbmFnZXIucmVtb3ZlKGkpOworICAgICAgICAgICAgICAgIGV2aWN0ZWQucHVzaF9iYWNrKGNsaWVudFNwKTsKIAotICAgICAgICAgICAgc3A8UHJvQ2xpZW50PiBjbFN0cm9uZyA9IGNsLnByb21vdGUoKTsKLSAgICAgICAgICAgIGlmIChjbFN0cm9uZyAhPSBOVUxMICYmIGNsU3Ryb25nLT5nZXRSZW1vdGUoKSA9PSBjYW1lcmFDYWxsYmFja3NSZW1vdGUpIHsKLSAgICAgICAgICAgICAgICBjbGllbnRQcm8gPSBjbFN0cm9uZzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xTdHJvbmcgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIC8vIG1hcmsgdG8gY2xlYW4gdXAgZGVhZCBwdHIKLSAgICAgICAgICAgICAgICByZW1vdmVJZHgucHVzaChqKTsKKyAgICAgICAgICAgICAgICAvLyBOb3RpZnkgdGhlIGNsaWVudCBvZiBkaXNjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgY2xpZW50U3AtPm5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLy8gcmVtb3ZlIHN0YWxlIHB0cnMgKGluIHJldmVyc2Ugc28gdGhlIGluZGljZXMgZG9udCBjaGFuZ2UpCi0gICAgICAgIGZvciAoc3NpemVfdCBqID0gKHNzaXplX3QpcmVtb3ZlSWR4LnNpemUoKSAtIDE7IGogPj0gMDsgLS1qKSB7Ci0gICAgICAgICAgICBtUHJvQ2xpZW50TGlzdFtpXS5yZW1vdmVBdChyZW1vdmVJZHhbal0pOworICAgICAgICAvLyBEbyBub3QgaG9sZCBtU2VydmljZUxvY2sgd2hpbGUgZGlzY29ubmVjdGluZyBjbGllbnRzLCBidXQgcmV0YWluIHRoZSBjb25kaXRpb24gYmxvY2tpbmcKKyAgICAgICAgLy8gb3RoZXIgY2xpZW50cyBmcm9tIGNvbm5lY3RpbmcgaW4gbVNlcnZpY2VMb2NrV3JhcHBlciBpZiBoZWxkCisgICAgICAgIG1TZXJ2aWNlTG9jay51bmxvY2soKTsKKworICAgICAgICAvLyBEbyBub3QgY2xlYXIgY2FsbGVyIGlkZW50aXR5LCByZW1vdGUgY2FsbGVyIHNob3VsZCBiZSBjbGllbnQgcHJvY2Nlc3MKKworICAgICAgICBmb3IgKGF1dG8mIGkgOiBldmljdGVkKSB7CisgICAgICAgICAgICBpZiAoaS5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgaS0+ZGlzY29ubmVjdCgpOworICAgICAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgIH0KKyAgICAgICAgLy8gUmVhY3F1aXJlIG1TZXJ2aWNlTG9jaworICAgICAgICBtU2VydmljZUxvY2subG9jaygpOwogCi0gICAgcmV0dXJuIGNsaWVudFBybzsKKyAgICB9IC8vIGxvY2sgaXMgZGVzdHJveWVkLCBhbGxvdyBmdXJ0aGVyIGNvbm5lY3QgY2FsbHMKKworICAgIHJldHVybiByZXQ7CiB9CiAKLXNwPENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50PiBDYW1lcmFTZXJ2aWNlOjpmaW5kQ2xpZW50VW5zYWZlKAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8SUJpbmRlcj4mIGNhbWVyYUNsaWVudCwgaW50JiBvdXRJbmRleCkgewotICAgIHNwPEJhc2ljQ2xpZW50PiBjbGllbnQ7CiAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1OdW1iZXJPZkNhbWVyYXM7IGkrKykgeworLyoqCisgKiBDaGVjayBjYW1lcmEgY2FwYWJpbGl0aWVzLCBzdWNoIGFzIHN1cHBvcnQgZm9yIGJhc2ljIGNvbG9yIG9wZXJhdGlvbgorICovCitpbnQgQ2FtZXJhU2VydmljZTo6Y2hlY2tDYW1lcmFDYXBhYmlsaXRpZXMoaW50IGlkLCBjYW1lcmFfaW5mbyBpbmZvLCBpbnQgKmxhdGVzdFN0cmFuZ2VDYW1lcmFJZCkgewogCi0gICAgICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIHdlIGhhdmUgYWxyZWFkeSBkaXNjb25uZWN0ZWQgKG9yIHRoaXMgaXMKLSAgICAgICAgLy8ganVzdCBhbm90aGVyIHVudXNlZCBjYW1lcmEpLgotICAgICAgICBpZiAobUNsaWVudFtpXSA9PSAwKSBjb250aW51ZTsKKyAgICAvLyBBc3N1bWUgYWxsIGRldmljZXMgcHJlLXYzLjMgYXJlIGJhY2t3YXJkLWNvbXBhdGlibGUKKyAgICBib29sIGlzQmFja3dhcmRDb21wYXRpYmxlID0gdHJ1ZTsKKyAgICBpZiAobU1vZHVsZS0+Z2V0TW9kdWxlQXBpVmVyc2lvbigpID49IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8wCisgICAgICAgICAgICAmJiBpbmZvLmRldmljZV92ZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18zKSB7CisgICAgICAgIGlzQmFja3dhcmRDb21wYXRpYmxlID0gZmFsc2U7CisgICAgICAgIHN0YXR1c190IHJlczsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgY2FwczsKKyAgICAgICAgcmVzID0gZmluZF9jYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkoCisgICAgICAgICAgICBpbmZvLnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzLAorICAgICAgICAgICAgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMsCisgICAgICAgICAgICAmY2Fwcyk7CisgICAgICAgIGlmIChyZXMgIT0gMCkgeworICAgICAgICAgICAgQUxPR1coIiVzOiBVbmFibGUgdG8gZmluZCBjYW1lcmEgY2FwYWJpbGl0aWVzIGZvciBjYW1lcmEgZGV2aWNlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZCk7CisgICAgICAgICAgICBjYXBzLmNvdW50ID0gMDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhcHMuY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGNhcHMuZGF0YS51OFtpXSA9PQorICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19CQUNLV0FSRF9DT01QQVRJQkxFKSB7CisgICAgICAgICAgICAgICAgaXNCYWNrd2FyZENvbXBhdGlibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCi0gICAgICAgIC8vIFByb21vdGUgbUNsaWVudC4gSXQgY2FuIGZhaWwgaWYgd2UgYXJlIGNhbGxlZCBmcm9tIHRoaXMgcGF0aDoKLSAgICAgICAgLy8gQ2xpZW50Ojp+Q2xpZW50KCkgLT4gZGlzY29ubmVjdCgpIC0+IHJlbW92ZUNsaWVudEJ5UmVtb3RlKCkuCi0gICAgICAgIGNsaWVudCA9IG1DbGllbnRbaV0ucHJvbW90ZSgpOworICAgIGlmICghaXNCYWNrd2FyZENvbXBhdGlibGUpIHsKKyAgICAgICAgbU51bWJlck9mTm9ybWFsQ2FtZXJhcy0tOworICAgICAgICAqbGF0ZXN0U3RyYW5nZUNhbWVyYUlkID0gaWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGlkID4gKmxhdGVzdFN0cmFuZ2VDYW1lcmFJZCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBOb3JtYWwgY2FtZXJhIElEICVkIGhpZ2hlciB0aGFuIHN0cmFuZ2UgY2FtZXJhIElEICVkLiAiCisgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIG5vdCBhbGxvd2VkIGR1ZSBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IHJlcXVpcmVtZW50cyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQsICpsYXRlc3RTdHJhbmdlQ2FtZXJhSWQpOworICAgICAgICAgICAgbG9nU2VydmljZUVycm9yKCJJbnZhbGlkIG9yZGVyIG9mIGNhbWVyYSBkZXZpY2VzIiwgRU5PREVWKTsKKyAgICAgICAgICAgIG1OdW1iZXJPZkNhbWVyYXMgPSAwOworICAgICAgICAgICAgbU51bWJlck9mTm9ybWFsQ2FtZXJhcyA9IDA7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQogCi0gICAgICAgIC8vIENsZWFuIHVwIHN0YWxlIGNsaWVudCBlbnRyeQotICAgICAgICBpZiAoY2xpZW50ID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1DbGllbnRbaV0uY2xlYXIoKTsKK3N0ZDo6c2hhcmVkX3B0cjxDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTdGF0ZT4gQ2FtZXJhU2VydmljZTo6Z2V0Q2FtZXJhU3RhdGUoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSBjb25zdCB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENhbWVyYVN0YXRlPiBzdGF0ZTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1DYW1lcmFTdGF0ZXNMb2NrKTsKKyAgICAgICAgYXV0byBpdGVyID0gbUNhbWVyYVN0YXRlcy5maW5kKGNhbWVyYUlkKTsKKyAgICAgICAgaWYgKGl0ZXIgIT0gbUNhbWVyYVN0YXRlcy5lbmQoKSkgeworICAgICAgICAgICAgc3RhdGUgPSBpdGVyLT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXRlOworfQorCitzcDxDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudD4gQ2FtZXJhU2VydmljZTo6cmVtb3ZlQ2xpZW50TG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSB7CisgICAgLy8gUmVtb3ZlIGZyb20gYWN0aXZlIGNsaWVudHMgbGlzdAorICAgIGF1dG8gY2xpZW50RGVzY3JpcHRvclB0ciA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLnJlbW92ZShjYW1lcmFJZCk7CisgICAgaWYgKGNsaWVudERlc2NyaXB0b3JQdHIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXM6IENvdWxkIG5vdCBldmljdCBjbGllbnQsIG5vIGNsaWVudCBmb3IgY2FtZXJhIElEICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIHNwPEJhc2ljQ2xpZW50PntudWxscHRyfTsKKyAgICB9CisKKyAgICByZXR1cm4gY2xpZW50RGVzY3JpcHRvclB0ci0+Z2V0VmFsdWUoKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpkb1VzZXJTd2l0Y2goY29uc3QgaW50MzJfdCogbmV3VXNlcklkLCBzaXplX3QgbGVuZ3RoKSB7CisgICAgLy8gQWNxdWlyZSBtU2VydmljZUxvY2sgYW5kIHByZXZlbnQgb3RoZXIgY2xpZW50cyBmcm9tIGNvbm5lY3RpbmcKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QXV0b0NvbmRpdGlvbkxvY2s+IGxvY2sgPQorICAgICAgICAgICAgQXV0b0NvbmRpdGlvbkxvY2s6OndhaXRBbmRBY3F1aXJlKG1TZXJ2aWNlTG9ja1dyYXBwZXIpOworCisgICAgc3RkOjpzZXQ8dXNlcmlkX3Q+IG5ld0FsbG93ZWRVc2VyczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIGlmIChuZXdVc2VySWRbaV0gPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEJhZCB1c2VyIElEICVkIGdpdmVuIGR1cmluZyB1c2VyIHN3aXRjaCwgaWdub3JpbmcuIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBuZXdVc2VySWRbaV0pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG5ld0FsbG93ZWRVc2Vycy5pbnNlcnQoc3RhdGljX2Nhc3Q8dXNlcmlkX3Q+KG5ld1VzZXJJZFtpXSkpOworICAgIH0KKworCisgICAgaWYgKG5ld0FsbG93ZWRVc2VycyA9PSBtQWxsb3dlZFVzZXJzKSB7CisgICAgICAgIEFMT0dXKCIlczogUmVjZWl2ZWQgbm90aWZpY2F0aW9uIG9mIHVzZXIgc3dpdGNoIHdpdGggbm8gdXBkYXRlZCB1c2VyIElEcy4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbG9nVXNlclN3aXRjaChtQWxsb3dlZFVzZXJzLCBuZXdBbGxvd2VkVXNlcnMpOworCisgICAgbUFsbG93ZWRVc2VycyA9IHN0ZDo6bW92ZShuZXdBbGxvd2VkVXNlcnMpOworCisgICAgLy8gQ3VycmVudCB1c2VyIGhhcyBzd2l0Y2hlZCwgZXZpY3QgYWxsIGN1cnJlbnQgY2xpZW50cy4KKyAgICBzdGQ6OnZlY3RvcjxzcDxCYXNpY0NsaWVudD4+IGV2aWN0ZWQ7CisgICAgZm9yIChhdXRvJiBpIDogbUFjdGl2ZUNsaWVudE1hbmFnZXIuZ2V0QWxsKCkpIHsKKyAgICAgICAgYXV0byBjbGllbnRTcCA9IGktPmdldFZhbHVlKCk7CisKKyAgICAgICAgaWYgKGNsaWVudFNwLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRGVhZCBjbGllbnQgc3RpbGwgaW4gbUFjdGl2ZUNsaWVudE1hbmFnZXIuIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGNhbWVyYUNsaWVudCA9PSBjbGllbnQtPmdldFJlbW90ZSgpKSB7Ci0gICAgICAgICAgICAvLyBGb3VuZCBvdXIgY2FtZXJhCi0gICAgICAgICAgICBvdXRJbmRleCA9IGk7Ci0gICAgICAgICAgICByZXR1cm4gY2xpZW50OworICAgICAgICAvLyBEb24ndCBldmljdCBjbGllbnRzIHRoYXQgYXJlIHN0aWxsIGFsbG93ZWQuCisgICAgICAgIHVpZF90IGNsaWVudFVpZCA9IGNsaWVudFNwLT5nZXRDbGllbnRVaWQoKTsKKyAgICAgICAgdXNlcmlkX3QgY2xpZW50VXNlcklkID0gbXVsdGl1c2VyX2dldF91c2VyX2lkKGNsaWVudFVpZCk7CisgICAgICAgIGlmIChtQWxsb3dlZFVzZXJzLmZpbmQoY2xpZW50VXNlcklkKSAhPSBtQWxsb3dlZFVzZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQorCisgICAgICAgIGV2aWN0ZWQucHVzaF9iYWNrKGNsaWVudFNwKTsKKworICAgICAgICBTdHJpbmc4IGN1clRpbWUgPSBnZXRGb3JtYXR0ZWRDdXJyZW50VGltZSgpOworCisgICAgICAgIEFMT0dFKCJFdmljdGluZyBjb25mbGljdGluZyBjbGllbnQgZm9yIGNhbWVyYSBJRCAlcyBkdWUgdG8gdXNlciBjaGFuZ2UiLAorICAgICAgICAgICAgICAgIGktPmdldEtleSgpLnN0cmluZygpKTsKKworICAgICAgICAvLyBMb2cgdGhlIGNsaWVudHMgZXZpY3RlZAorICAgICAgICBsb2dFdmVudChTdHJpbmc4Ojpmb3JtYXQoIkVWSUNUIGRldmljZSAlcyBjbGllbnQgaGVsZCBieSBwYWNrYWdlICVzIChQSUQgJSIKKyAgICAgICAgICAgICAgICBQUklkMzIgIiwgcHJpb3JpdHkgJSIgUFJJZDMyICIpXG4gICAtIEV2aWN0ZWQgZHVlIHRvIHVzZXIgc3dpdGNoLiIsCisgICAgICAgICAgICAgICAgaS0+Z2V0S2V5KCkuc3RyaW5nKCksIFN0cmluZzh7Y2xpZW50U3AtPmdldFBhY2thZ2VOYW1lKCl9LnN0cmluZygpLAorICAgICAgICAgICAgICAgIGktPmdldE93bmVySWQoKSwgaS0+Z2V0UHJpb3JpdHkoKSkpOworCiAgICAgfQogCi0gICAgb3V0SW5kZXggPSAtMTsKLSAgICByZXR1cm4gTlVMTDsKKyAgICAvLyBEbyBub3QgaG9sZCBtU2VydmljZUxvY2sgd2hpbGUgZGlzY29ubmVjdGluZyBjbGllbnRzLCBidXQgcmV0YWluIHRoZSBjb25kaXRpb24KKyAgICAvLyBibG9ja2luZyBvdGhlciBjbGllbnRzIGZyb20gY29ubmVjdGluZyBpbiBtU2VydmljZUxvY2tXcmFwcGVyIGlmIGhlbGQuCisgICAgbVNlcnZpY2VMb2NrLnVubG9jaygpOworCisgICAgLy8gQ2xlYXIgY2FsbGVyIGlkZW50aXR5IHRlbXBvcmFyaWx5IHNvIGNsaWVudCBkaXNjb25uZWN0IFBJRCBjaGVja3Mgd29yayBjb3JyZWN0bHkKKyAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKworICAgIGZvciAoYXV0byYgaSA6IGV2aWN0ZWQpIHsKKyAgICAgICAgaS0+ZGlzY29ubmVjdCgpOworICAgIH0KKworICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworCisgICAgLy8gUmVhY3F1aXJlIG1TZXJ2aWNlTG9jaworICAgIG1TZXJ2aWNlTG9jay5sb2NrKCk7CiB9CiAKLUNhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50KiBDYW1lcmFTZXJ2aWNlOjpnZXRDbGllbnRCeUlkVW5zYWZlKGludCBjYW1lcmFJZCkgewotICAgIGlmIChjYW1lcmFJZCA8IDAgfHwgY2FtZXJhSWQgPj0gbU51bWJlck9mQ2FtZXJhcykgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIG1DbGllbnRbY2FtZXJhSWRdLnVuc2FmZV9nZXQoKTsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6bG9nRXZlbnQoY29uc3QgY2hhciogZXZlbnQpIHsKKyAgICBTdHJpbmc4IGN1clRpbWUgPSBnZXRGb3JtYXR0ZWRDdXJyZW50VGltZSgpOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2dMb2NrKTsKKyAgICBtRXZlbnRMb2cuYWRkKFN0cmluZzg6OmZvcm1hdCgiJXMgOiAlcyIsIGN1clRpbWUuc3RyaW5nKCksIGV2ZW50KSk7CiB9CiAKLU11dGV4KiBDYW1lcmFTZXJ2aWNlOjpnZXRDbGllbnRMb2NrQnlJZChpbnQgY2FtZXJhSWQpIHsKLSAgICBpZiAoY2FtZXJhSWQgPCAwIHx8IGNhbWVyYUlkID49IG1OdW1iZXJPZkNhbWVyYXMpIHJldHVybiBOVUxMOwotICAgIHJldHVybiAmbUNsaWVudExvY2tbY2FtZXJhSWRdOwordm9pZCBDYW1lcmFTZXJ2aWNlOjpsb2dEaXNjb25uZWN0ZWQoY29uc3QgY2hhciogY2FtZXJhSWQsIGludCBjbGllbnRQaWQsCisgICAgICAgIGNvbnN0IGNoYXIqIGNsaWVudFBhY2thZ2UpIHsKKyAgICAvLyBMb2cgdGhlIGNsaWVudHMgZXZpY3RlZAorICAgIGxvZ0V2ZW50KFN0cmluZzg6OmZvcm1hdCgiRElTQ09OTkVDVCBkZXZpY2UgJXMgY2xpZW50IGZvciBwYWNrYWdlICVzIChQSUQgJWQpIiwgY2FtZXJhSWQsCisgICAgICAgICAgICBjbGllbnRQYWNrYWdlLCBjbGllbnRQaWQpKTsKIH0KIAotc3A8Q2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ+IENhbWVyYVNlcnZpY2U6OmdldENsaWVudEJ5UmVtb3RlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxJQmluZGVyPiYgY2FtZXJhQ2xpZW50KSB7Ci0KLSAgICAvLyBEZWNsYXJlIHRoaXMgYmVmb3JlIHRoZSBsb2NrIHRvIG1ha2UgYWJzb2x1dGVseSBzdXJlIHRoZQotICAgIC8vIGRlc3RydWN0b3Igd29uJ3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZC4KLSAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50OwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKLQotICAgIGludCBvdXRJbmRleDsKLSAgICBjbGllbnQgPSBmaW5kQ2xpZW50VW5zYWZlKGNhbWVyYUNsaWVudCwgb3V0SW5kZXgpOwotCi0gICAgcmV0dXJuIGNsaWVudDsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6bG9nQ29ubmVjdGVkKGNvbnN0IGNoYXIqIGNhbWVyYUlkLCBpbnQgY2xpZW50UGlkLAorICAgICAgICBjb25zdCBjaGFyKiBjbGllbnRQYWNrYWdlKSB7CisgICAgLy8gTG9nIHRoZSBjbGllbnRzIGV2aWN0ZWQKKyAgICBsb2dFdmVudChTdHJpbmc4Ojpmb3JtYXQoIkNPTk5FQ1QgZGV2aWNlICVzIGNsaWVudCBmb3IgcGFja2FnZSAlcyAoUElEICVkKSIsIGNhbWVyYUlkLAorICAgICAgICAgICAgY2xpZW50UGFja2FnZSwgY2xpZW50UGlkKSk7CiB9CiAKLXN0YXR1c190IENhbWVyYVNlcnZpY2U6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykgewordm9pZCBDYW1lcmFTZXJ2aWNlOjpsb2dSZWplY3RlZChjb25zdCBjaGFyKiBjYW1lcmFJZCwgaW50IGNsaWVudFBpZCwKKyAgICAgICAgY29uc3QgY2hhciogY2xpZW50UGFja2FnZSwgY29uc3QgY2hhciogcmVhc29uKSB7CisgICAgLy8gTG9nIHRoZSBjbGllbnQgcmVqZWN0ZWQKKyAgICBsb2dFdmVudChTdHJpbmc4Ojpmb3JtYXQoIlJFSkVDVCBkZXZpY2UgJXMgY2xpZW50IGZvciBwYWNrYWdlICVzIChQSUQgJWQpLCByZWFzb246ICglcykiLAorICAgICAgICAgICAgY2FtZXJhSWQsIGNsaWVudFBhY2thZ2UsIGNsaWVudFBpZCwgcmVhc29uKSk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6bG9nVXNlclN3aXRjaChjb25zdCBzdGQ6OnNldDx1c2VyaWRfdD4mIG9sZFVzZXJJZHMsCisgICAgICAgIGNvbnN0IHN0ZDo6c2V0PHVzZXJpZF90PiYgbmV3VXNlcklkcykgeworICAgIFN0cmluZzggbmV3VXNlcnMgPSB0b1N0cmluZyhuZXdVc2VySWRzKTsKKyAgICBTdHJpbmc4IG9sZFVzZXJzID0gdG9TdHJpbmcob2xkVXNlcklkcyk7CisgICAgLy8gTG9nIHRoZSBuZXcgYW5kIG9sZCB1c2VycworICAgIGxvZ0V2ZW50KFN0cmluZzg6OmZvcm1hdCgiVVNFUl9TV0lUQ0ggcHJldmlvdXMgYWxsb3dlZCB1c2VyczogJXMgLCBjdXJyZW50IGFsbG93ZWQgdXNlcnM6ICVzIiwKKyAgICAgICAgICAgIG9sZFVzZXJzLnN0cmluZygpLCBuZXdVc2Vycy5zdHJpbmcoKSkpOworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OmxvZ0RldmljZVJlbW92ZWQoY29uc3QgY2hhciogY2FtZXJhSWQsIGNvbnN0IGNoYXIqIHJlYXNvbikgeworICAgIC8vIExvZyB0aGUgZGV2aWNlIHJlbW92YWwKKyAgICBsb2dFdmVudChTdHJpbmc4Ojpmb3JtYXQoIlJFTU9WRSBkZXZpY2UgJXMsIHJlYXNvbjogKCVzKSIsIGNhbWVyYUlkLCByZWFzb24pKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpsb2dEZXZpY2VBZGRlZChjb25zdCBjaGFyKiBjYW1lcmFJZCwgY29uc3QgY2hhciogcmVhc29uKSB7CisgICAgLy8gTG9nIHRoZSBkZXZpY2UgcmVtb3ZhbAorICAgIGxvZ0V2ZW50KFN0cmluZzg6OmZvcm1hdCgiQUREIGRldmljZSAlcywgcmVhc29uOiAoJXMpIiwgY2FtZXJhSWQsIHJlYXNvbikpOworfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OmxvZ0NsaWVudERpZWQoaW50IGNsaWVudFBpZCwgY29uc3QgY2hhciogcmVhc29uKSB7CisgICAgLy8gTG9nIHRoZSBkZXZpY2UgcmVtb3ZhbAorICAgIGxvZ0V2ZW50KFN0cmluZzg6OmZvcm1hdCgiRElFRCBjbGllbnQocykgd2l0aCBQSUQgJWQsIHJlYXNvbjogKCVzKSIsIGNsaWVudFBpZCwgcmVhc29uKSk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6bG9nU2VydmljZUVycm9yKGNvbnN0IGNoYXIqIG1zZywgaW50IGVycm9yQ29kZSkgeworICAgIFN0cmluZzggY3VyVGltZSA9IGdldEZvcm1hdHRlZEN1cnJlbnRUaW1lKCk7CisgICAgbG9nRXZlbnQoU3RyaW5nODo6Zm9ybWF0KCJTRVJWSUNFIEVSUk9SOiAlcyA6ICVkICglcykiLCBtc2csIGVycm9yQ29kZSwgc3RyZXJyb3IoZXJyb3JDb2RlKSkpOworfQorCitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwgUGFyY2VsKiByZXBseSwKKyAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKKworICAgIGNvbnN0IGludCBwaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgY29uc3QgaW50IHNlbGZQaWQgPSBnZXRwaWQoKTsKKwogICAgIC8vIFBlcm1pc3Npb24gY2hlY2tzCiAgICAgc3dpdGNoIChjb2RlKSB7CiAgICAgICAgIGNhc2UgQm5DYW1lcmFTZXJ2aWNlOjpDT05ORUNUOgotICAgICAgICBjYXNlIEJuQ2FtZXJhU2VydmljZTo6Q09OTkVDVF9QUk86CiAgICAgICAgIGNhc2UgQm5DYW1lcmFTZXJ2aWNlOjpDT05ORUNUX0RFVklDRToKLSAgICAgICAgY2FzZSBCbkNhbWVyYVNlcnZpY2U6OkNPTk5FQ1RfTEVHQUNZOgotICAgICAgICAgICAgY29uc3QgaW50IHBpZCA9IGdldENhbGxpbmdQaWQoKTsKLSAgICAgICAgICAgIGNvbnN0IGludCBzZWxmX3BpZCA9IGdldHBpZCgpOwotICAgICAgICAgICAgaWYgKHBpZCAhPSBzZWxmX3BpZCkgeworICAgICAgICBjYXNlIEJuQ2FtZXJhU2VydmljZTo6Q09OTkVDVF9MRUdBQ1k6IHsKKyAgICAgICAgICAgIGlmIChwaWQgIT0gc2VsZlBpZCkgewogICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGNhbGxlZCBmcm9tIGEgZGlmZmVyZW50IHByb2Nlc3MsIGRvIHRoZSByZWFsIGNoZWNrCiAgICAgICAgICAgICAgICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkEiKSkpIHsKQEAgLTEyODUsMjkgKzE3NDUsMjYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEJuQ2FtZXJhU2VydmljZTo6Tk9USUZZX1NZU1RFTV9FVkVOVDogeworICAgICAgICAgICAgaWYgKHBpZCAhPSBzZWxmUGlkKSB7CisgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHdlJ3JlIGJlaW5nIGNhbGxlZCBieSBzeXN0ZW1fc2VydmVyLCBvciBzaW1pbGFyIHByb2Nlc3Mgd2l0aAorICAgICAgICAgICAgICAgIC8vIHBlcm1pc3Npb25zIHRvIG5vdGlmeSB0aGUgY2FtZXJhIHNlcnZpY2UgYWJvdXQgc3lzdGVtIGV2ZW50cworICAgICAgICAgICAgICAgIGlmICghY2hlY2tDYWxsaW5nUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBX1NFTkRfU1lTVEVNX0VWRU5UUyIpKSkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gZ2V0Q2FsbGluZ1VpZCgpOworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiUGVybWlzc2lvbiBEZW5pYWw6IGNhbm5vdCBzZW5kIHVwZGF0ZXMgdG8gY2FtZXJhIHNlcnZpY2UgYWJvdXQgc3lzdGVtIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZXZlbnRzIGZyb20gcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiBCbkNhbWVyYVNlcnZpY2U6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKIH0KIAotLy8gVGhlIHJlYXNvbiB3ZSBuZWVkIHRoaXMgYnVzeSBiaXQgaXMgYSBuZXcgQ2FtZXJhU2VydmljZTo6Y29ubmVjdCgpIHJlcXVlc3QKLS8vIG1heSBjb21lIGluIHdoaWxlIHRoZSBwcmV2aW91cyBDbGllbnQncyBkZXN0cnVjdG9yIGhhcyBub3QgYmVlbiBydW4gb3IgaXMKLS8vIHN0aWxsIHJ1bm5pbmcuIElmIHRoZSBsYXN0IHN0cm9uZyByZWZlcmVuY2Ugb2YgdGhlIHByZXZpb3VzIENsaWVudCBpcyBnb25lCi0vLyBidXQgdGhlIGRlc3RydWN0b3IgaGFzIG5vdCBiZWVuIGZpbmlzaGVkLCB3ZSBzaG91bGQgbm90IGFsbG93IHRoZSBuZXcgQ2xpZW50Ci0vLyB0byBiZSBjcmVhdGVkIGJlY2F1c2Ugd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgcHJldmlvdXMgQ2xpZW50IHRvIHRlYXIgZG93bgotLy8gdGhlIGhhcmR3YXJlIGZpcnN0Lgotdm9pZCBDYW1lcmFTZXJ2aWNlOjpzZXRDYW1lcmFCdXN5KGludCBjYW1lcmFJZCkgewotICAgIGFuZHJvaWRfYXRvbWljX3dyaXRlKDEsICZtQnVzeVtjYW1lcmFJZF0pOwotCi0gICAgQUxPR1YoInNldENhbWVyYUJ1c3kgY2FtZXJhSWQ9JWQiLCBjYW1lcmFJZCk7Ci19Ci0KLXZvaWQgQ2FtZXJhU2VydmljZTo6c2V0Q2FtZXJhRnJlZShpbnQgY2FtZXJhSWQpIHsKLSAgICBhbmRyb2lkX2F0b21pY193cml0ZSgwLCAmbUJ1c3lbY2FtZXJhSWRdKTsKLQotICAgIEFMT0dWKCJzZXRDYW1lcmFGcmVlIGNhbWVyYUlkPSVkIiwgY2FtZXJhSWQpOwotfQotCiAvLyBXZSBzaGFyZSB0aGUgbWVkaWEgcGxheWVycyBmb3Igc2h1dHRlciBhbmQgcmVjb3JkaW5nIHNvdW5kIGZvciBhbGwgY2xpZW50cy4KIC8vIEEgcmVmZXJlbmNlIGNvdW50IGlzIGtlcHQgdG8gZGV0ZXJtaW5lIHdoZW4gd2Ugd2lsbCBhY3R1YWxseSByZWxlYXNlIHRoZQogLy8gbWVkaWEgcGxheWVycy4KQEAgLTEzNzYsNyArMTgzMyw2IEBACiAKICAgICBtUmVtb3RlQ2FsbGJhY2sgPSBjYW1lcmFDbGllbnQ7CiAKLSAgICBjYW1lcmFTZXJ2aWNlLT5zZXRDYW1lcmFCdXN5KGNhbWVyYUlkKTsKICAgICBjYW1lcmFTZXJ2aWNlLT5sb2FkU291bmQoKTsKIAogICAgIExPRzEoIkNsaWVudDo6Q2xpZW50IFggKHBpZCAlZCwgaWQgJWQpIiwgY2FsbGluZ1BpZCwgY2FtZXJhSWQpOwpAQCAtMTM5OCw3ICsxODU0LDcgQEAKICAgICAgICAgaW50IGNhbWVyYUlkLCBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsCiAgICAgICAgIGludCBzZXJ2aWNlUGlkKToKLSAgICAgICAgbUNsaWVudFBhY2thZ2VOYW1lKGNsaWVudFBhY2thZ2VOYW1lKQorICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWUoY2xpZW50UGFja2FnZU5hbWUpLCBtRGlzY29ubmVjdGVkKGZhbHNlKQogewogICAgIG1DYW1lcmFTZXJ2aWNlID0gY2FtZXJhU2VydmljZTsKICAgICBtUmVtb3RlQmluZGVyID0gcmVtb3RlQ2FsbGJhY2s7CkBAIC0xNDE3LDEwICsxODczLDI1IEBACiB9CiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OmRpc2Nvbm5lY3QoKSB7Ci0gICAgQUxPR1YoIkJhc2ljQ2xpZW50OjpkaXNjb25uZWN0Iik7Ci0gICAgbUNhbWVyYVNlcnZpY2UtPnJlbW92ZUNsaWVudEJ5UmVtb3RlKG1SZW1vdGVCaW5kZXIpOworICAgIGlmIChtRGlzY29ubmVjdGVkKSB7CisgICAgICAgIEFMT0dFKCIlczogRGlzY29ubmVjdCBjYWxsZWQgb24gYWxyZWFkeSBkaXNjb25uZWN0ZWQgY2xpZW50IGZvciBkZXZpY2UgJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgbUNhbWVyYUlkKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtRGlzY29ubmVjdGVkID0gdHJ1ZTs7CisKKyAgICBtQ2FtZXJhU2VydmljZS0+cmVtb3ZlQnlDbGllbnQodGhpcyk7CisgICAgbUNhbWVyYVNlcnZpY2UtPmxvZ0Rpc2Nvbm5lY3RlZChTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgbUNhbWVyYUlkKSwgbUNsaWVudFBpZCwKKyAgICAgICAgICAgIFN0cmluZzgobUNsaWVudFBhY2thZ2VOYW1lKSk7CisKKyAgICBzcDxJQmluZGVyPiByZW1vdGUgPSBnZXRSZW1vdGUoKTsKKyAgICBpZiAocmVtb3RlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmVtb3RlLT51bmxpbmtUb0RlYXRoKG1DYW1lcmFTZXJ2aWNlKTsKKyAgICB9CiAKICAgICBmaW5pc2hDYW1lcmFPcHMoKTsKKyAgICBBTE9HSSgiJXM6IERpc2Nvbm5lY3RlZCBjbGllbnQgZm9yIGNhbWVyYSAlZCBmb3IgUElEICVkIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIG1DbGllbnRQaWQpOworCiAgICAgLy8gY2xpZW50IHNob3VsZG4ndCBiZSBhYmxlIHRvIGNhbGwgaW50byB1cyBhbnltb3JlCiAgICAgbUNsaWVudFBpZCA9IDA7CiB9CkBAIC0xNDMzLDYgKzE5MDQsMjQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK1N0cmluZzE2IENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpnZXRQYWNrYWdlTmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUNsaWVudFBhY2thZ2VOYW1lOworfQorCisKK2ludCBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudDo6Z2V0Q2xpZW50UGlkKCkgY29uc3QgeworICAgIHJldHVybiBtQ2xpZW50UGlkOworfQorCit1aWRfdCBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudDo6Z2V0Q2xpZW50VWlkKCkgY29uc3QgeworICAgIHJldHVybiBtQ2xpZW50VWlkOworfQorCitib29sIENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpjYW5DYXN0VG9BcGlDbGllbnQoYXBpTGV2ZWwgbGV2ZWwpIGNvbnN0IHsKKyAgICAvLyBEZWZhdWx0cyB0byBBUEkyLgorICAgIHJldHVybiBsZXZlbCA9PSBBUElfMjsKK30KKwogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ6OnN0YXJ0Q2FtZXJhT3BzKCkgewogICAgIGludDMyX3QgcmVzOwogICAgIC8vIE5vdGlmeSBhcHAgb3BzIHRoYXQgdGhlIGNhbWVyYSBpcyBub3QgYXZhaWxhYmxlCkBAIC0xNDQ4LDE3ICsxOTM3LDI0IEBACiAgICAgcmVzID0gbUFwcE9wc01hbmFnZXIuc3RhcnRPcChBcHBPcHNNYW5hZ2VyOjpPUF9DQU1FUkEsCiAgICAgICAgICAgICBtQ2xpZW50VWlkLCBtQ2xpZW50UGFja2FnZU5hbWUpOwogCi0gICAgaWYgKHJlcyAhPSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpIHsKKyAgICBpZiAocmVzID09IEFwcE9wc01hbmFnZXI6Ok1PREVfRVJST1JFRCkgewogICAgICAgICBBTE9HSSgiQ2FtZXJhICVkOiBBY2Nlc3MgZm9yIFwiJXNcIiBoYXMgYmVlbiByZXZva2VkIiwKICAgICAgICAgICAgICAgICBtQ2FtZXJhSWQsIFN0cmluZzgobUNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSk7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKKyAgICBpZiAocmVzID09IEFwcE9wc01hbmFnZXI6Ok1PREVfSUdOT1JFRCkgeworICAgICAgICBBTE9HSSgiQ2FtZXJhICVkOiBBY2Nlc3MgZm9yIFwiJXNcIiBoYXMgYmVlbiByZXN0cmljdGVkIiwKKyAgICAgICAgICAgICAgICBtQ2FtZXJhSWQsIFN0cmluZzgobUNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSk7CisgICAgICAgIC8vIFJldHVybiB0aGUgc2FtZSBlcnJvciBhcyBmb3IgZGV2aWNlIHBvbGljeSBtYW5hZ2VyIHJlamVjdGlvbgorICAgICAgICByZXR1cm4gLUVBQ0NFUzsKKyAgICB9CisKICAgICBtT3BzQWN0aXZlID0gdHJ1ZTsKIAogICAgIC8vIFRyYW5zaXRpb24gZGV2aWNlIGF2YWlsYWJpbGl0eSBsaXN0ZW5lcnMgZnJvbSBQUkVTRU5UIC0+IE5PVF9BVkFJTEFCTEUKICAgICBtQ2FtZXJhU2VydmljZS0+dXBkYXRlU3RhdHVzKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfQVZBSUxBQkxFLAotICAgICAgICAgICAgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiJWQiLCBtQ2FtZXJhSWQpKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTE0NzEsMTkgKzE5NjcsMTYgQEAKICAgICAgICAgICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWUpOwogICAgICAgICBtT3BzQWN0aXZlID0gZmFsc2U7CiAKLSAgICAgICAgLy8gTm90aWZ5IGRldmljZSBhdmFpbGFiaWxpdHkgbGlzdGVuZXJzIHRoYXQgdGhpcyBjYW1lcmEgaXMgYXZhaWxhYmxlCi0gICAgICAgIC8vIGFnYWluCisgICAgICAgIGF1dG8gcmVqZWN0ZWQgPSB7SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9QUkVTRU5ULAorICAgICAgICAgICAgICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19FTlVNRVJBVElOR307CiAKLSAgICAgICAgU3RhdHVzVmVjdG9yIHJlamVjdFNvdXJjZVN0YXRlczsKLSAgICAgICAgcmVqZWN0U291cmNlU3RhdGVzLnB1c2hfYmFjayhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX1BSRVNFTlQpOwotICAgICAgICByZWplY3RTb3VyY2VTdGF0ZXMucHVzaF9iYWNrKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19FTlVNRVJBVElORyk7Ci0KLSAgICAgICAgLy8gVHJhbnNpdGlvbiB0byBQUkVTRU5UIGlmIHRoZSBjYW1lcmEgaXMgbm90IGluIGVpdGhlciBvZiBhYm92ZSAyCi0gICAgICAgIC8vIHN0YXRlcworICAgICAgICAvLyBUcmFuc2l0aW9uIHRvIFBSRVNFTlQgaWYgdGhlIGNhbWVyYSBpcyBub3QgaW4gZWl0aGVyIG9mIHRoZSByZWplY3RlZCBzdGF0ZXMKICAgICAgICAgbUNhbWVyYVNlcnZpY2UtPnVwZGF0ZVN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfUFJFU0VOVCwKLSAgICAgICAgICAgICAgICBtQ2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgJnJlamVjdFNvdXJjZVN0YXRlcyk7CisgICAgICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCIlZCIsIG1DYW1lcmFJZCksIHJlamVjdGVkKTsKIAorICAgICAgICAvLyBOb3RpZnkgZmxhc2hsaWdodCB0aGF0IGEgY2FtZXJhIGRldmljZSBpcyBjbG9zZWQuCisgICAgICAgIG1DYW1lcmFTZXJ2aWNlLT5tRmxhc2hsaWdodC0+ZGV2aWNlQ2xvc2VkKAorICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiJWQiLCBtQ2FtZXJhSWQpKTsKICAgICB9CiAgICAgLy8gQWx3YXlzIHN0b3Agd2F0Y2hpbmcsIGV2ZW4gaWYgbm8gY2FtZXJhIG9wIGlzIGFjdGl2ZQogICAgIGlmIChtT3BzQ2FsbGJhY2sgIT0gTlVMTCkgewpAQCAtMTUyNiwyNiArMjAxOSwxNSBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLU11dGV4KiBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmdldENsaWVudExvY2tGcm9tQ29va2llKHZvaWQqIHVzZXIpIHsKLSAgICByZXR1cm4gZ0NhbWVyYVNlcnZpY2UtPmdldENsaWVudExvY2tCeUlkKChpbnQpKGludHB0cl90KSB1c2VyKTsKLX0KLQotLy8gUHJvdmlkZSBjbGllbnQgcG9pbnRlciBmb3IgY2FsbGJhY2tzLiBDbGllbnQgbG9jayByZXR1cm5lZCBmcm9tIGdldENsaWVudExvY2tGcm9tQ29va2llIHNob3VsZAotLy8gYmUgYWNxdWlyZWQgZm9yIHRoaXMgdG8gYmUgc2FmZQotQ2FtZXJhU2VydmljZTo6Q2xpZW50KiBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmdldENsaWVudEZyb21Db29raWUodm9pZCogdXNlcikgewotICAgIEJhc2ljQ2xpZW50ICpiYXNpY0NsaWVudCA9IGdDYW1lcmFTZXJ2aWNlLT5nZXRDbGllbnRCeUlkVW5zYWZlKChpbnQpKGludHB0cl90KSB1c2VyKTsKLSAgICAvLyBPSzogb25seSBDYW1lcmFDbGllbnQgY2FsbHMgdGhpcywgYW5kIHRoZXkgYWxyZWFkeSBjYXN0IGFueXdheS4KLSAgICBDbGllbnQqIGNsaWVudCA9IHN0YXRpY19jYXN0PENsaWVudCo+KGJhc2ljQ2xpZW50KTsKLQotICAgIC8vIFRoaXMgY291bGQgaGFwcGVuIGlmIHRoZSBDbGllbnQgaXMgaW4gdGhlIHByb2Nlc3Mgb2Ygc2h1dHRpbmcgZG93biAodGhlCi0gICAgLy8gbGFzdCBzdHJvbmcgcmVmZXJlbmNlIGlzIGdvbmUsIGJ1dCB0aGUgZGVzdHJ1Y3RvciBoYXNuJ3QgZmluaXNoZWQKLSAgICAvLyBzdG9wcGluZyB0aGUgaGFyZHdhcmUpLgotICAgIGlmIChjbGllbnQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICAvLyBkZXN0cnVjdGlvbiBhbHJlYWR5IHN0YXJ0ZWQsIHNvIHNob3VsZCBub3QgYmUgYWNjZXNzZWQKLSAgICBpZiAoY2xpZW50LT5tRGVzdHJ1Y3Rpb25TdGFydGVkKSByZXR1cm4gTlVMTDsKLQotICAgIHJldHVybiBjbGllbnQ7CisvLyBQcm92aWRlIGNsaWVudCBzdHJvbmcgcG9pbnRlciBmb3IgY2FsbGJhY2tzLgorc3A8Q2FtZXJhU2VydmljZTo6Q2xpZW50PiBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmdldENsaWVudEZyb21Db29raWUodm9pZCogdXNlcikgeworICAgIFN0cmluZzggY2FtZXJhSWQgPSBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgKGludCkoaW50cHRyX3QpIHVzZXIpOworICAgIGF1dG8gY2xpZW50RGVzY3JpcHRvciA9IGdDYW1lcmFTZXJ2aWNlLT5tQWN0aXZlQ2xpZW50TWFuYWdlci5nZXQoY2FtZXJhSWQpOworICAgIGlmIChjbGllbnREZXNjcmlwdG9yICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHNwPENsaWVudD57CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2xpZW50Kj4oY2xpZW50RGVzY3JpcHRvci0+Z2V0VmFsdWUoKS5nZXQoKSl9OworICAgIH0KKyAgICByZXR1cm4gc3A8Q2xpZW50PntudWxscHRyfTsKIH0KIAogdm9pZCBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6Om5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCkBAIC0xNTU3LDcgKzIwMzksMTAgQEAKIHZvaWQgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpkaXNjb25uZWN0KCkgewogICAgIEFMT0dWKCJDbGllbnQ6OmRpc2Nvbm5lY3QiKTsKICAgICBCYXNpY0NsaWVudDo6ZGlzY29ubmVjdCgpOwotICAgIG1DYW1lcmFTZXJ2aWNlLT5zZXRDYW1lcmFGcmVlKG1DYW1lcmFJZCk7Cit9CisKK2Jvb2wgQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpjYW5DYXN0VG9BcGlDbGllbnQoYXBpTGV2ZWwgbGV2ZWwpIGNvbnN0IHsKKyAgICByZXR1cm4gbGV2ZWwgPT0gQVBJXzE7CiB9CiAKIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6T3BzQ2FsbGJhY2s6Ok9wc0NhbGxiYWNrKHdwPEJhc2ljQ2xpZW50PiBjbGllbnQpOgpAQCAtMTU3MywzMCArMjA1OCwxMzggQEAKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gICAgICAgICAgICAgICAgICBJUHJvQ2FtZXJhCisvLyAgICAgICAgICAgICAgICAgIENhbWVyYVN0YXRlCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUNhbWVyYVNlcnZpY2U6OlByb0NsaWVudDo6UHJvQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAotICAgICAgICBjb25zdCBzcDxJUHJvQ2FtZXJhQ2FsbGJhY2tzPiYgcmVtb3RlQ2FsbGJhY2ssCi0gICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgaW50IGNhbWVyYUlkLAotICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAotICAgICAgICBpbnQgY2xpZW50UGlkLAotICAgICAgICB1aWRfdCBjbGllbnRVaWQsCi0gICAgICAgIGludCBzZXJ2aWNlUGlkKQotICAgICAgICA6IENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50KGNhbWVyYVNlcnZpY2UsIElJbnRlcmZhY2U6OmFzQmluZGVyKHJlbW90ZUNhbGxiYWNrKSwKLSAgICAgICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2FtZXJhSWQsIGNhbWVyYUZhY2luZywKLSAgICAgICAgICAgICAgICBjbGllbnRQaWQsICBjbGllbnRVaWQsIHNlcnZpY2VQaWQpCi17Ci0gICAgbVJlbW90ZUNhbGxiYWNrID0gcmVtb3RlQ2FsbGJhY2s7CitDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTdGF0ZTo6Q2FtZXJhU3RhdGUoY29uc3QgU3RyaW5nOCYgaWQsIGludCBjb3N0LAorICAgICAgICBjb25zdCBzdGQ6OnNldDxTdHJpbmc4PiYgY29uZmxpY3RpbmcpIDogbUlkKGlkKSwKKyAgICAgICAgbVN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfUFJFU0VOVCksIG1Db3N0KGNvc3QpLCBtQ29uZmxpY3RpbmcoY29uZmxpY3RpbmcpIHt9CisKK0NhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjp+Q2FtZXJhU3RhdGUoKSB7fQorCitJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMgQ2FtZXJhU2VydmljZTo6Q2FtZXJhU3RhdGU6OmdldFN0YXR1cygpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTG9jayk7CisgICAgcmV0dXJuIG1TdGF0dXM7CiB9CiAKLUNhbWVyYVNlcnZpY2U6OlByb0NsaWVudDo6flByb0NsaWVudCgpIHsKK0NhbWVyYVBhcmFtZXRlcnMgQ2FtZXJhU2VydmljZTo6Q2FtZXJhU3RhdGU6OmdldFNoaW1QYXJhbXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1TaGltUGFyYW1zOwogfQogCi12b2lkIENhbWVyYVNlcnZpY2U6OlByb0NsaWVudDo6bm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKLSAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7Ci0gICAgbVJlbW90ZUNhbGxiYWNrLT5ub3RpZnlDYWxsYmFjayhDQU1FUkFfTVNHX0VSUk9SLCBDQU1FUkFfRVJST1JfUkVMRUFTRUQsIDApOwordm9pZCBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTdGF0ZTo6c2V0U2hpbVBhcmFtcyhjb25zdCBDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpIHsKKyAgICBtU2hpbVBhcmFtcyA9IHBhcmFtczsKK30KKworaW50IENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjpnZXRDb3N0KCkgY29uc3QgeworICAgIHJldHVybiBtQ29zdDsKK30KKworc3RkOjpzZXQ8U3RyaW5nOD4gQ2FtZXJhU2VydmljZTo6Q2FtZXJhU3RhdGU6OmdldENvbmZsaWN0aW5nKCkgY29uc3QgeworICAgIHJldHVybiBtQ29uZmxpY3Rpbmc7Cit9CisKK1N0cmluZzggQ2FtZXJhU2VydmljZTo6Q2FtZXJhU3RhdGU6OmdldElkKCkgY29uc3QgeworICAgIHJldHVybiBtSWQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICAgICAgQ2xpZW50RXZlbnRMaXN0ZW5lcgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudEV2ZW50TGlzdGVuZXI6Om9uQ2xpZW50QWRkZWQoCisgICAgICAgIGNvbnN0IHJlc291cmNlX3BvbGljeTo6Q2xpZW50RGVzY3JpcHRvcjxTdHJpbmc4LAorICAgICAgICBzcDxDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudD4+JiBkZXNjcmlwdG9yKSB7CisgICAgYXV0byBiYXNpY0NsaWVudCA9IGRlc2NyaXB0b3IuZ2V0VmFsdWUoKTsKKyAgICBpZiAoYmFzaWNDbGllbnQuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBCYXR0ZXJ5Tm90aWZpZXImIG5vdGlmaWVyKEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKSk7CisgICAgICAgIG5vdGlmaWVyLm5vdGVTdGFydENhbWVyYShkZXNjcmlwdG9yLmdldEtleSgpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oYmFzaWNDbGllbnQtPmdldENsaWVudFVpZCgpKSk7CisgICAgfQorfQorCit2b2lkIENhbWVyYVNlcnZpY2U6OkNsaWVudEV2ZW50TGlzdGVuZXI6Om9uQ2xpZW50UmVtb3ZlZCgKKyAgICAgICAgY29uc3QgcmVzb3VyY2VfcG9saWN5OjpDbGllbnREZXNjcmlwdG9yPFN0cmluZzgsCisgICAgICAgIHNwPENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50Pj4mIGRlc2NyaXB0b3IpIHsKKyAgICBhdXRvIGJhc2ljQ2xpZW50ID0gZGVzY3JpcHRvci5nZXRWYWx1ZSgpOworICAgIGlmIChiYXNpY0NsaWVudC5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIEJhdHRlcnlOb3RpZmllciYgbm90aWZpZXIoQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpKTsKKyAgICAgICAgbm90aWZpZXIubm90ZVN0b3BDYW1lcmEoZGVzY3JpcHRvci5nZXRLZXkoKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGJhc2ljQ2xpZW50LT5nZXRDbGllbnRVaWQoKSkpOworICAgIH0KK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICAgICAgICAgICAgIENhbWVyYUNsaWVudE1hbmFnZXIKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ2FtZXJhU2VydmljZTo6Q2FtZXJhQ2xpZW50TWFuYWdlcjo6Q2FtZXJhQ2xpZW50TWFuYWdlcigpIHsKKyAgICBzZXRMaXN0ZW5lcihzdGQ6Om1ha2Vfc2hhcmVkPENsaWVudEV2ZW50TGlzdGVuZXI+KCkpOworfQorCitDYW1lcmFTZXJ2aWNlOjpDYW1lcmFDbGllbnRNYW5hZ2VyOjp+Q2FtZXJhQ2xpZW50TWFuYWdlcigpIHt9CisKK3NwPENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50PiBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFDbGllbnRNYW5hZ2VyOjpnZXRDYW1lcmFDbGllbnQoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGlkKSBjb25zdCB7CisgICAgYXV0byBkZXNjcmlwdG9yID0gZ2V0KGlkKTsKKyAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBzcDxCYXNpY0NsaWVudD57bnVsbHB0cn07CisgICAgfQorICAgIHJldHVybiBkZXNjcmlwdG9yLT5nZXRWYWx1ZSgpOworfQorCitTdHJpbmc4IENhbWVyYVNlcnZpY2U6OkNhbWVyYUNsaWVudE1hbmFnZXI6OnRvU3RyaW5nKCkgY29uc3QgeworICAgIGF1dG8gYWxsID0gZ2V0QWxsKCk7CisgICAgU3RyaW5nOCByZXQoIlsiKTsKKyAgICBib29sIGhhc0FueSA9IGZhbHNlOworICAgIGZvciAoYXV0byYgaSA6IGFsbCkgeworICAgICAgICBoYXNBbnkgPSB0cnVlOworICAgICAgICBTdHJpbmc4IGtleSA9IGktPmdldEtleSgpOworICAgICAgICBpbnQzMl90IGNvc3QgPSBpLT5nZXRDb3N0KCk7CisgICAgICAgIGludDMyX3QgcGlkID0gaS0+Z2V0T3duZXJJZCgpOworICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gaS0+Z2V0UHJpb3JpdHkoKTsKKyAgICAgICAgYXV0byBjb25mbGljdGluZyA9IGktPmdldENvbmZsaWN0aW5nKCk7CisgICAgICAgIGF1dG8gY2xpZW50U3AgPSBpLT5nZXRWYWx1ZSgpOworICAgICAgICBTdHJpbmc4IHBhY2thZ2VOYW1lOworICAgICAgICB1c2VyaWRfdCBjbGllbnRVc2VySWQgPSAwOworICAgICAgICBpZiAoY2xpZW50U3AuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcGFja2FnZU5hbWUgPSBTdHJpbmc4e2NsaWVudFNwLT5nZXRQYWNrYWdlTmFtZSgpfTsKKyAgICAgICAgICAgIHVpZF90IGNsaWVudFVpZCA9IGNsaWVudFNwLT5nZXRDbGllbnRVaWQoKTsKKyAgICAgICAgICAgIGNsaWVudFVzZXJJZCA9IG11bHRpdXNlcl9nZXRfdXNlcl9pZChjbGllbnRVaWQpOworICAgICAgICB9CisgICAgICAgIHJldC5hcHBlbmRGb3JtYXQoIlxuKENhbWVyYSBJRDogJXMsIENvc3Q6ICUiIFBSSWQzMiAiLCBQSUQ6ICUiIFBSSWQzMiAiLCBQcmlvcml0eTogJSIKKyAgICAgICAgICAgICAgICBQUklkMzIgIiwgIiwga2V5LnN0cmluZygpLCBjb3N0LCBwaWQsIHByaW9yaXR5KTsKKworICAgICAgICBpZiAoY2xpZW50U3AuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0LmFwcGVuZEZvcm1hdCgiVXNlciBJZDogJWQsICIsIGNsaWVudFVzZXJJZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhY2thZ2VOYW1lLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICByZXQuYXBwZW5kRm9ybWF0KCJDbGllbnQgUGFja2FnZSBOYW1lOiAlcyIsIHBhY2thZ2VOYW1lLnN0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldC5hcHBlbmQoIiwgQ29uZmxpY3RpbmcgQ2xpZW50IERldmljZXM6IHsiKTsKKyAgICAgICAgZm9yIChhdXRvJiBqIDogY29uZmxpY3RpbmcpIHsKKyAgICAgICAgICAgIHJldC5hcHBlbmRGb3JtYXQoIiVzLCAiLCBqLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXQuYXBwZW5kKCJ9KSIpOworICAgIH0KKyAgICBpZiAoaGFzQW55KSByZXQuYXBwZW5kKCJcbiIpOworICAgIHJldC5hcHBlbmQoIl1cbiIpOworICAgIHJldHVybiByZXQ7Cit9CisKK0NhbWVyYVNlcnZpY2U6OkRlc2NyaXB0b3JQdHIgQ2FtZXJhU2VydmljZTo6Q2FtZXJhQ2xpZW50TWFuYWdlcjo6bWFrZUNsaWVudERlc2NyaXB0b3IoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGtleSwgY29uc3Qgc3A8QmFzaWNDbGllbnQ+JiB2YWx1ZSwgaW50MzJfdCBjb3N0LAorICAgICAgICBjb25zdCBzdGQ6OnNldDxTdHJpbmc4PiYgY29uZmxpY3RpbmdLZXlzLCBpbnQzMl90IHByaW9yaXR5LCBpbnQzMl90IG93bmVySWQpIHsKKworICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPHJlc291cmNlX3BvbGljeTo6Q2xpZW50RGVzY3JpcHRvcjxTdHJpbmc4LCBzcDxCYXNpY0NsaWVudD4+PigKKyAgICAgICAgICAgIGtleSwgdmFsdWUsIGNvc3QsIGNvbmZsaWN0aW5nS2V5cywgcHJpb3JpdHksIG93bmVySWQpOworfQorCitDYW1lcmFTZXJ2aWNlOjpEZXNjcmlwdG9yUHRyIENhbWVyYVNlcnZpY2U6OkNhbWVyYUNsaWVudE1hbmFnZXI6Om1ha2VDbGllbnREZXNjcmlwdG9yKAorICAgICAgICBjb25zdCBzcDxCYXNpY0NsaWVudD4mIHZhbHVlLCBjb25zdCBDYW1lcmFTZXJ2aWNlOjpEZXNjcmlwdG9yUHRyJiBwYXJ0aWFsKSB7CisgICAgcmV0dXJuIG1ha2VDbGllbnREZXNjcmlwdG9yKHBhcnRpYWwtPmdldEtleSgpLCB2YWx1ZSwgcGFydGlhbC0+Z2V0Q29zdCgpLAorICAgICAgICAgICAgcGFydGlhbC0+Z2V0Q29uZmxpY3RpbmcoKSwgcGFydGlhbC0+Z2V0UHJpb3JpdHkoKSwgcGFydGlhbC0+Z2V0T3duZXJJZCgpKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTYxOCw3ICsyMjExLDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKLSAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBTdHJpbmc4IHJlc3VsdCgiRHVtcCBvZiB0aGUgQ2FtZXJhIFNlcnZpY2U6XG4iKTsKICAgICBpZiAoY2hlY2tDYWxsaW5nUGVybWlzc2lvbihTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKSkgPT0gZmFsc2UpIHsKICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiUGVybWlzc2lvbiBEZW5pYWw6ICIKICAgICAgICAgICAgICAgICAiY2FuJ3QgZHVtcCBDYW1lcmFTZXJ2aWNlIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCkBAIC0xNjM3LDE5ICsyMjMwLDIyIEBACiAgICAgICAgIGlmICghbU1vZHVsZSkgewogICAgICAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCJObyBjYW1lcmEgbW9kdWxlIGF2YWlsYWJsZSFcbiIpOwogICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisKKyAgICAgICAgICAgIC8vIER1bXAgZXZlbnQgbG9nIGZvciBlcnJvciBpbmZvcm1hdGlvbgorICAgICAgICAgICAgZHVtcEV2ZW50TG9nKGZkKTsKKwogICAgICAgICAgICAgaWYgKGxvY2tlZCkgbVNlcnZpY2VMb2NrLnVubG9jaygpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKLSAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgbW9kdWxlIEhBTCBBUEkgdmVyc2lvbjogMHgleFxuIiwKLSAgICAgICAgICAgICAgICBtTW9kdWxlLT5jb21tb24uaGFsX2FwaV92ZXJzaW9uKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQ2FtZXJhIG1vZHVsZSBBUEkgdmVyc2lvbjogMHgleFxuIiwKLSAgICAgICAgICAgICAgICBtTW9kdWxlLT5jb21tb24ubW9kdWxlX2FwaV92ZXJzaW9uKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQ2FtZXJhIG1vZHVsZSBuYW1lOiAlc1xuIiwKLSAgICAgICAgICAgICAgICBtTW9kdWxlLT5jb21tb24ubmFtZSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNhbWVyYSBtb2R1bGUgYXV0aG9yOiAlc1xuIiwKLSAgICAgICAgICAgICAgICBtTW9kdWxlLT5jb21tb24uYXV0aG9yKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiTnVtYmVyIG9mIGNhbWVyYSBkZXZpY2VzOiAlZFxuXG4iLCBtTnVtYmVyT2ZDYW1lcmFzKTsKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgbW9kdWxlIEhBTCBBUEkgdmVyc2lvbjogMHgleFxuIiwgbU1vZHVsZS0+Z2V0SGFsQXBpVmVyc2lvbigpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQ2FtZXJhIG1vZHVsZSBBUEkgdmVyc2lvbjogMHgleFxuIiwgbU1vZHVsZS0+Z2V0TW9kdWxlQXBpVmVyc2lvbigpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQ2FtZXJhIG1vZHVsZSBuYW1lOiAlc1xuIiwgbU1vZHVsZS0+Z2V0TW9kdWxlTmFtZSgpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQ2FtZXJhIG1vZHVsZSBhdXRob3I6ICVzXG4iLCBtTW9kdWxlLT5nZXRNb2R1bGVBdXRob3IoKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIk51bWJlciBvZiBjYW1lcmEgZGV2aWNlczogJWRcbiIsIG1OdW1iZXJPZkNhbWVyYXMpOworICAgICAgICBTdHJpbmc4IGFjdGl2ZUNsaWVudFN0cmluZyA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLnRvU3RyaW5nKCk7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkFjdGl2ZSBDYW1lcmEgQ2xpZW50czpcbiVzIiwgYWN0aXZlQ2xpZW50U3RyaW5nLnN0cmluZygpKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQWxsb3dlZCB1c2VyczpcbiVzXG4iLCB0b1N0cmluZyhtQWxsb3dlZFVzZXJzKS5zdHJpbmcoKSk7CiAKICAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gZGVzYyA9IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldEdsb2JhbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKICAgICAgICAgaWYgKGRlc2MgPT0gTlVMTCkgewpAQCAtMTY2NCwxMSArMjI2MCwyMSBAQAogICAgICAgICAgICAgZGVzYy0+ZHVtcChmZCwgLyp2ZXJib3NpdHkqLzIsIC8qaW5kZW50YXRpb24qLzQpOwogICAgICAgICB9CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTnVtYmVyT2ZDYW1lcmFzOyBpKyspIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVkIHN0YXRpYyBpbmZvcm1hdGlvbjpcbiIsIGkpOworICAgICAgICBkdW1wRXZlbnRMb2coZmQpOworCisgICAgICAgIGJvb2wgc3RhdGVMb2NrZWQgPSB0cnlMb2NrKG1DYW1lcmFTdGF0ZXNMb2NrKTsKKyAgICAgICAgaWYgKCFzdGF0ZUxvY2tlZCkgeworICAgICAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmFTdGF0ZXMgaW4gdXNlLCBtYXkgYmUgZGVhZGxvY2tlZFxuIik7CisgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoYXV0byYgc3RhdGUgOiBtQ2FtZXJhU3RhdGVzKSB7CisgICAgICAgICAgICBTdHJpbmc4IGNhbWVyYUlkID0gc3RhdGUuZmlyc3Q7CisgICAgICAgICAgICByZXN1bHQgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlcyBpbmZvcm1hdGlvbjpcbiIsIGNhbWVyYUlkLnN0cmluZygpKTsKICAgICAgICAgICAgIGNhbWVyYV9pbmZvIGluZm87CiAKLSAgICAgICAgICAgIHN0YXR1c190IHJjID0gbU1vZHVsZS0+Z2V0X2NhbWVyYV9pbmZvKGksICZpbmZvKTsKKyAgICAgICAgICAgIC8vIFRPRE86IENoYW5nZSBnZXRDYW1lcmFJbmZvICsgSEFMIHRvIHVzZSBTdHJpbmcgY2FtZXJhSWRzCisgICAgICAgICAgICBzdGF0dXNfdCByYyA9IG1Nb2R1bGUtPmdldENhbWVyYUluZm8oY2FtZXJhSWRUb0ludChjYW1lcmFJZCksICZpbmZvKTsKICAgICAgICAgICAgIGlmIChyYyAhPSBPSykgewogICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgRXJyb3IgcmVhZGluZyBzdGF0aWMgaW5mb3JtYXRpb24hXG4iKTsKICAgICAgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKQEAgLTE2NzcsMTMgKzIyODMsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uZmFjaW5nID09IENBTUVSQV9GQUNJTkdfQkFDSyA/ICJCQUNLIiA6ICJGUk9OVCIpOwogICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgT3JpZW50YXRpb246ICVkXG4iLCBpbmZvLm9yaWVudGF0aW9uKTsKICAgICAgICAgICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbjsKLSAgICAgICAgICAgICAgICBpZiAobU1vZHVsZS0+Y29tbW9uLm1vZHVsZV9hcGlfdmVyc2lvbiA8Ci0gICAgICAgICAgICAgICAgICAgICAgICBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMCkgeworICAgICAgICAgICAgICAgIGlmIChtTW9kdWxlLT5nZXRNb2R1bGVBcGlWZXJzaW9uKCkgPCBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfMCkgewogICAgICAgICAgICAgICAgICAgICBkZXZpY2VWZXJzaW9uID0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzA7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgZGV2aWNlVmVyc2lvbiA9IGluZm8uZGV2aWNlX3ZlcnNpb247CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgRGV2aWNlIHZlcnNpb246IDB4JXhcbiIsIGRldmljZVZlcnNpb24pOworCisgICAgICAgICAgICAgICAgYXV0byBjb25mbGljdGluZyA9IHN0YXRlLnNlY29uZC0+Z2V0Q29uZmxpY3RpbmcoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIFJlc291cmNlIENvc3Q6ICVkXG4iLCBzdGF0ZS5zZWNvbmQtPmdldENvc3QoKSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBDb25mbGljdGluZyBEZXZpY2VzOiIpOworICAgICAgICAgICAgICAgIGZvciAoYXV0byYgaWQgOiBjb25mbGljdGluZykgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgJXMiLCBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb25mbGljdGluZy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgTk9ORSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJcbiIpOworCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBEZXZpY2UgdmVyc2lvbjogJSN4XG4iLCBkZXZpY2VWZXJzaW9uKTsKICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlVmVyc2lvbiA+PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzJfMCkgewogICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIERldmljZSBzdGF0aWMgbWV0YWRhdGE6XG4iKTsKICAgICAgICAgICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CkBAIC0xNjkyLDE5ICsyMzA5LDM4IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBwID0gc3RhdGUuc2Vjb25kLT5nZXRTaGltUGFyYW1zKCk7CisgICAgICAgICAgICAgICAgaWYgKCFwLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBTdHJpbmc4Ojpmb3JtYXQoIiAgQ2FtZXJhMSBBUEkgc2hpbSBpcyB1c2luZyBwYXJhbWV0ZXJzOlxuICAgICAgICAiKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIHAuZHVtcChmZCwgYXJncyk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzcDxCYXNpY0NsaWVudD4gY2xpZW50ID0gbUNsaWVudFtpXS5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBpZiAoY2xpZW50ID09IDApIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBTdHJpbmc4Ojpmb3JtYXQoIiAgRGV2aWNlIGlzIGNsb3NlZCwgbm8gY2xpZW50IGluc3RhbmNlXG4iKTsKKyAgICAgICAgICAgIGF1dG8gY2xpZW50RGVzY3JpcHRvciA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldChjYW1lcmFJZCk7CisgICAgICAgICAgICBpZiAoY2xpZW50RGVzY3JpcHRvciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCIgIERldmljZSAlcyBpcyBjbG9zZWQsIG5vIGNsaWVudCBpbnN0YW5jZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGhhc0NsaWVudCA9IHRydWU7Ci0gICAgICAgICAgICByZXN1bHQgPSBTdHJpbmc4Ojpmb3JtYXQoIiAgRGV2aWNlIGlzIG9wZW4uIENsaWVudCBpbnN0YW5jZSBkdW1wOlxuIik7CisgICAgICAgICAgICByZXN1bHQgPSBTdHJpbmc4Ojpmb3JtYXQoIiAgRGV2aWNlICVzIGlzIG9wZW4uIENsaWVudCBpbnN0YW5jZSBkdW1wOlxuXG4iLAorICAgICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJDbGllbnQgcHJpb3JpdHkgbGV2ZWw6ICVkXG4iLCBjbGllbnREZXNjcmlwdG9yLT5nZXRQcmlvcml0eSgpKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNsaWVudCBQSUQ6ICVkXG4iLCBjbGllbnREZXNjcmlwdG9yLT5nZXRPd25lcklkKCkpOworCisgICAgICAgICAgICBhdXRvIGNsaWVudCA9IGNsaWVudERlc2NyaXB0b3ItPmdldFZhbHVlKCk7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJDbGllbnQgcGFja2FnZTogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoY2xpZW50LT5nZXRQYWNrYWdlTmFtZSgpKS5zdHJpbmcoKSk7CiAgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKwogICAgICAgICAgICAgY2xpZW50LT5kdW1wQ2xpZW50KGZkLCBhcmdzKTsKICAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0ZUxvY2tlZCkgbUNhbWVyYVN0YXRlc0xvY2sudW5sb2NrKCk7CisKICAgICAgICAgaWYgKCFoYXNDbGllbnQpIHsKICAgICAgICAgICAgIHJlc3VsdCA9IFN0cmluZzg6OmZvcm1hdCgiXG5ObyBhY3RpdmUgY2FtZXJhIGNsaWVudHMgeWV0LlxuIik7CiAgICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKQEAgLTE3MjgsMTEyICsyMzY0LDE0MyBAQAogICAgICAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi0vKnZpcnR1YWwqL3ZvaWQgQ2FtZXJhU2VydmljZTo6YmluZGVyRGllZCgKLSAgICBjb25zdCB3cDxJQmluZGVyPiAmd2hvKSB7Cit2b2lkIENhbWVyYVNlcnZpY2U6OmR1bXBFdmVudExvZyhpbnQgZmQpIHsKKyAgICBTdHJpbmc4IHJlc3VsdCA9IFN0cmluZzgoIlxuUHJpb3IgY2xpZW50IGV2ZW50cyAobW9zdCByZWNlbnQgYXQgdG9wKTpcbiIpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvZ0xvY2spOworICAgIGZvciAoY29uc3QgYXV0byYgbXNnIDogbUV2ZW50TG9nKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgJXNcbiIsIG1zZy5zdHJpbmcoKSk7CisgICAgfQorCisgICAgaWYgKG1FdmVudExvZy5zaXplKCkgPT0gREVGQVVMVF9FVkVOVF9MT0dfTEVOR1RIKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgLi4uXG4iKTsKKyAgICB9IGVsc2UgaWYgKG1FdmVudExvZy5zaXplKCkgPT0gMCkgeworICAgICAgICByZXN1bHQuYXBwZW5kKCIgIFtubyBldmVudHMgeWV0XVxuIik7CisgICAgfQorICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisKKyAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpoYW5kbGVUb3JjaENsaWVudEJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJndobykgeworICAgIE11dGV4OjpBdXRvbG9jayBhbChtVG9yY2hDbGllbnRNYXBNdXRleCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVG9yY2hDbGllbnRNYXAuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1Ub3JjaENsaWVudE1hcFtpXSA9PSB3aG8pIHsKKyAgICAgICAgICAgIC8vIHR1cm4gb2ZmIHRoZSB0b3JjaCBtb2RlIHRoYXQgd2FzIHR1cm5lZCBvbiBieSBkZWFkIGNsaWVudAorICAgICAgICAgICAgU3RyaW5nOCBjYW1lcmFJZCA9IG1Ub3JjaENsaWVudE1hcC5rZXlBdChpKTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IG1GbGFzaGxpZ2h0LT5zZXRUb3JjaE1vZGUoY2FtZXJhSWQsIGZhbHNlKTsKKyAgICAgICAgICAgIGlmIChyZXMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHRvcmNoIGNsaWVudCBkaWVkIGJ1dCBjb3VsZG4ndCB0dXJuIG9mZiB0b3JjaDogIgorICAgICAgICAgICAgICAgICAgICAiJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRvcmNoQ2xpZW50TWFwLnJlbW92ZUl0ZW1zQXQoaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworLyp2aXJ0dWFsKi92b2lkIENhbWVyYVNlcnZpY2U6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJndobykgewogCiAgICAgLyoqCi0gICAgICAqIFdoaWxlIHRlbXB0aW5nIHRvIHByb21vdGUgdGhlIHdwPElCaW5kZXI+IGludG8gYSBzcCwKLSAgICAgICogaXQncyBhY3R1YWxseSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBiaW5kZXIgZHJpdmVyCisgICAgICAqIFdoaWxlIHRlbXB0aW5nIHRvIHByb21vdGUgdGhlIHdwPElCaW5kZXI+IGludG8gYSBzcCwgaXQncyBhY3R1YWxseSBub3Qgc3VwcG9ydGVkIGJ5IHRoZQorICAgICAgKiBiaW5kZXIgZHJpdmVyCiAgICAgICAqLwogCi0gICAgQUxPR1YoImphdmEgY2xpZW50cycgYmluZGVyIGRpZWQiKTsKKyAgICBsb2dDbGllbnREaWVkKGdldENhbGxpbmdQaWQoKSwgU3RyaW5nOCgiQmluZGVyIGRpZWQgdW5leHBlY3RlZGx5IikpOwogCi0gICAgc3A8QmFzaWNDbGllbnQ+IGNhbWVyYUNsaWVudCA9IGdldENsaWVudEJ5UmVtb3RlKHdobyk7CisgICAgLy8gY2hlY2sgdG9yY2ggY2xpZW50CisgICAgaGFuZGxlVG9yY2hDbGllbnRCaW5kZXJEaWVkKHdobyk7CiAKLSAgICBpZiAoY2FtZXJhQ2xpZW50ID09IDApIHsKLSAgICAgICAgQUxPR1YoImphdmEgY2xpZW50cycgYmluZGVyIGRlYXRoIGFscmVhZHkgY2xlYW5lZCB1cCAobm9ybWFsIGNhc2UpIik7CisgICAgLy8gY2hlY2sgY2FtZXJhIGRldmljZSBjbGllbnQKKyAgICBpZighZXZpY3RDbGllbnRJZEJ5UmVtb3RlKHdobykpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBKYXZhIGNsaWVudCdzIGJpbmRlciBkZWF0aCBhbHJlYWR5IGNsZWFuZWQgdXAgKG5vcm1hbCBjYXNlKSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBBTE9HVygiRGlzY29ubmVjdGluZyBjYW1lcmEgY2xpZW50ICVwIHNpbmNlIHRoZSBiaW5kZXIgZm9yIGl0ICIKLSAgICAgICAgICAiZGllZCAodGhpcyBwaWQgJWQpIiwgY2FtZXJhQ2xpZW50LmdldCgpLCBnZXRDYWxsaW5nUGlkKCkpOwotCi0gICAgY2FtZXJhQ2xpZW50LT5kaXNjb25uZWN0KCk7Ci0KKyAgICBBTE9HRSgiJXM6IEphdmEgY2xpZW50J3MgYmluZGVyIGRpZWQsIHJlbW92aW5nIGl0IGZyb20gdGhlIGxpc3Qgb2YgYWN0aXZlIGNsaWVudHMiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKIH0KIAotdm9pZCBDYW1lcmFTZXJ2aWNlOjp1cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNWZWN0b3IgKnJlamVjdFNvdXJjZVN0YXRlcykgewotICAgIC8vIGRvIG5vdCBsb2NrIG1TZXJ2aWNlTG9jayBoZXJlIG9yIGNhbiBnZXQgaW50byBhIGRlYWRsb2NrIGZyb20KLSAgICAvLyAgY29ubmVjdCgpIC0+IFByb0NsaWVudDo6ZGlzY29ubmVjdCAtPiB1cGRhdGVTdGF0dXMKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTXV0ZXgpOwotCi0gICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzIG9sZFN0YXR1cyA9IG1TdGF0dXNMaXN0W2NhbWVyYUlkXTsKLQotICAgIG1TdGF0dXNMaXN0W2NhbWVyYUlkXSA9IHN0YXR1czsKLQotICAgIGlmIChvbGRTdGF0dXMgIT0gc3RhdHVzKSB7Ci0gICAgICAgIEFMT0dWKCIlczogU3RhdHVzIGhhcyBjaGFuZ2VkIGZvciBjYW1lcmEgSUQgJWQgZnJvbSAweCV4IHRvIDB4JXgiLAotICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLCAodWludDMyX3Qpb2xkU3RhdHVzLCAodWludDMyX3Qpc3RhdHVzKTsKLQotICAgICAgICBpZiAob2xkU3RhdHVzID09IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfUFJFU0VOVCAmJgotICAgICAgICAgICAgKHN0YXR1cyAhPSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfUFJFU0VOVCAmJgotICAgICAgICAgICAgIHN0YXR1cyAhPSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfRU5VTUVSQVRJTkcpKSB7Ci0KLSAgICAgICAgICAgIEFMT0dXKCIlczogRnJvbSBOT1RfUFJFU0VOVCBjYW4gb25seSB0cmFuc2l0aW9uIGludG8gUFJFU0VOVCIKLSAgICAgICAgICAgICAgICAgICIgb3IgRU5VTUVSQVRJTkciLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgbVN0YXR1c0xpc3RbY2FtZXJhSWRdID0gb2xkU3RhdHVzOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlamVjdFNvdXJjZVN0YXRlcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjb25zdCBTdGF0dXNWZWN0b3IgJnJlamVjdExpc3QgPSAqcmVqZWN0U291cmNlU3RhdGVzOwotICAgICAgICAgICAgU3RhdHVzVmVjdG9yOjpjb25zdF9pdGVyYXRvciBpdCA9IHJlamVjdExpc3QuYmVnaW4oKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBTb21ldGltZXMgd2Ugd2FudCB0byBjb25kaXRpb25hbGx5IGRvIGEgdHJhbnNpdGlvbi4KLSAgICAgICAgICAgICAqIEZvciBleGFtcGxlIGlmIGEgY2xpZW50IGRpc2Nvbm5lY3RzLCB3ZSB3YW50IHRvIGdvIHRvIFBSRVNFTlQKLSAgICAgICAgICAgICAqIG9ubHkgaWYgd2Ugd2VyZW4ndCBhbHJlYWR5IGluIE5PVF9QUkVTRU5UIG9yIEVOVU1FUkFUSU5HLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBmb3IgKDsgaXQgIT0gcmVqZWN0TGlzdC5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgICAgIGlmIChvbGRTdGF0dXMgPT0gKml0KSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogUmVqZWN0aW5nIHN0YXR1cyB0cmFuc2l0aW9uIGZvciBDYW1lcmEgSUQgJWQsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzaW5jZSB0aGUgc291cmNlIHN0YXRlIHdhcyB3YXMgaW4gb25lIG9mIHRoZSBiYWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiIHN0YXRlcy4iLCBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkKTsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0xpc3RbY2FtZXJhSWRdID0gb2xkU3RhdHVzOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAgKiBQcm9DbGllbnRzIGxvc2UgdGhlaXIgZXhjbHVzaXZlIGxvY2suCi0gICAgICAgICAgKiAtIERvbmUgYmVmb3JlIHRoZSBDYW1lcmFDbGllbnQgY2FuIGluaXRpYWxpemUgdGhlIEhBTCBkZXZpY2UsCi0gICAgICAgICAgKiAgIHNpbmNlIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBjbG9zZSBpdCBiZWZvcmUgdGhleSBnZXQgdG8gaW5pdGlhbGl6ZQotICAgICAgICAgICovCi0gICAgICAgIGlmIChzdGF0dXMgPT0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9BVkFJTEFCTEUpIHsKLSAgICAgICAgICAgIFZlY3Rvcjx3cDxQcm9DbGllbnQ+ID4gcHJvQ2xpZW50cyhtUHJvQ2xpZW50TGlzdFtjYW1lcmFJZF0pOwotICAgICAgICAgICAgVmVjdG9yPHdwPFByb0NsaWVudD4gPjo6Y29uc3RfaXRlcmF0b3IgaXQ7Ci0KLSAgICAgICAgICAgIGZvciAoaXQgPSBwcm9DbGllbnRzLmJlZ2luKCk7IGl0ICE9IHByb0NsaWVudHMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICAgICAgICBzcDxQcm9DbGllbnQ+IHByb0NsID0gaXQtPnByb21vdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvQ2wuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBwcm9DbC0+b25FeGNsdXNpdmVMb2NrU3RvbGVuKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgVmVjdG9yPHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+ID46OmNvbnN0X2l0ZXJhdG9yIGl0OwotICAgICAgICBmb3IgKGl0ID0gbUxpc3RlbmVyTGlzdC5iZWdpbigpOyBpdCAhPSBtTGlzdGVuZXJMaXN0LmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICAoKml0KS0+b25TdGF0dXNDaGFuZ2VkKHN0YXR1cywgY2FtZXJhSWQpOwotICAgICAgICB9Ci0gICAgfQordm9pZCBDYW1lcmFTZXJ2aWNlOjp1cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzIHN0YXR1cywgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpIHsKKyAgICB1cGRhdGVTdGF0dXMoc3RhdHVzLCBjYW1lcmFJZCwge30pOwogfQogCi1JQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMgQ2FtZXJhU2VydmljZTo6Z2V0U3RhdHVzKGludCBjYW1lcmFJZCkgY29uc3QgewotICAgIGlmIChjYW1lcmFJZCA8IDAgfHwgY2FtZXJhSWQgPj0gTUFYX0NBTUVSQVMpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBJRCAlZCIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQpOwotICAgICAgICByZXR1cm4gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1VOS05PV047Cit2b2lkIENhbWVyYVNlcnZpY2U6OnVwZGF0ZVN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMgc3RhdHVzLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cz4gcmVqZWN0U291cmNlU3RhdGVzKSB7CisgICAgLy8gRG8gbm90IGxvY2sgbVNlcnZpY2VMb2NrIGhlcmUgb3IgY2FuIGdldCBpbnRvIGEgZGVhZGxvY2sgZnJvbQorICAgIC8vIGNvbm5lY3QoKSAtPiBkaXNjb25uZWN0IC0+IHVwZGF0ZVN0YXR1cworCisgICAgYXV0byBzdGF0ZSA9IGdldENhbWVyYVN0YXRlKGNhbWVyYUlkKTsKKworICAgIGlmIChzdGF0ZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlczogQ291bGQgbm90IHVwZGF0ZSB0aGUgc3RhdHVzIGZvciAlcywgbm8gc3VjaCBkZXZpY2UgZXhpc3RzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIE11dGV4OjpBdXRvbG9jayBhbChtU3RhdHVzTXV0ZXgpOwotICAgIHJldHVybiBtU3RhdHVzTGlzdFtjYW1lcmFJZF07CisgICAgLy8gVXBkYXRlIHRoZSBzdGF0dXMgZm9yIHRoaXMgY2FtZXJhIHN0YXRlLCB0aGVuIHNlbmQgdGhlIG9uU3RhdHVzQ2hhbmdlZENhbGxiYWNrcyB0byBlYWNoCisgICAgLy8gb2YgdGhlIGxpc3RlbmVycyB3aXRoIGJvdGggdGhlIG1TdGF0dXNTdGF0dXMgYW5kIG1TdGF0dXNMaXN0ZW5lckxvY2sgaGVsZAorICAgIHN0YXRlLT51cGRhdGVTdGF0dXMoc3RhdHVzLCBjYW1lcmFJZCwgcmVqZWN0U291cmNlU3RhdGVzLCBbdGhpc10KKyAgICAgICAgICAgIChjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzIHN0YXR1cykgeworCisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19FTlVNRVJBVElORykgeworICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0b3JjaCBzdGF0dXMgaWYgaXQgaGFzIGEgZmxhc2ggdW5pdC4KKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobVRvcmNoU3RhdHVzTXV0ZXgpOworICAgICAgICAgICAgICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRvcmNoU3RhdHVzIHRvcmNoU3RhdHVzOworICAgICAgICAgICAgICAgIGlmIChnZXRUb3JjaFN0YXR1c0xvY2tlZChjYW1lcmFJZCwgJnRvcmNoU3RhdHVzKSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VG9yY2hTdGF0dXMgbmV3VG9yY2hTdGF0dXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9PSBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfUFJFU0VOVCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VE9SQ0hfU1RBVFVTX0FWQUlMQUJMRV9PRkYgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRPUkNIX1NUQVRVU19OT1RfQVZBSUxBQkxFOworICAgICAgICAgICAgICAgICAgICBpZiAodG9yY2hTdGF0dXMgIT0gbmV3VG9yY2hTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uVG9yY2hTdGF0dXNDaGFuZ2VkTG9ja2VkKGNhbWVyYUlkLCBuZXdUb3JjaFN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMaXN0ZW5lckxvY2spOworCisgICAgICAgICAgICBmb3IgKGF1dG8mIGxpc3RlbmVyIDogbUxpc3RlbmVyTGlzdCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IFJlZmFjdG9yIHN0YXR1cyBsaXN0ZW5lcnMgdG8gdXNlIHN0cmluZ3MgZm9yIENhbWVyYSBJRHMgYW5kIHJlbW92ZSB0aGlzLgorICAgICAgICAgICAgICAgIGludCBpZCA9IGNhbWVyYUlkVG9JbnQoY2FtZXJhSWQpOworICAgICAgICAgICAgICAgIGlmIChpZCAhPSAtMSkgbGlzdGVuZXItPm9uU3RhdHVzQ2hhbmdlZChzdGF0dXMsIGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OmdldFRvcmNoU3RhdHVzTG9ja2VkKAorICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VG9yY2hTdGF0dXMgKnN0YXR1cykgY29uc3QgeworICAgIGlmICghc3RhdHVzKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNzaXplX3QgaW5kZXggPSBtVG9yY2hTdGF0dXNNYXAuaW5kZXhPZktleShjYW1lcmFJZCk7CisgICAgaWYgKGluZGV4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIC8vIGludmFsaWQgY2FtZXJhIElEIG9yIHRoZSBjYW1lcmEgZG9lc24ndCBoYXZlIGEgZmxhc2ggdW5pdAorICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgKnN0YXR1cyA9IG1Ub3JjaFN0YXR1c01hcC52YWx1ZUF0KGluZGV4KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVNlcnZpY2U6OnNldFRvcmNoU3RhdHVzTG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUb3JjaFN0YXR1cyBzdGF0dXMpIHsKKyAgICBzc2l6ZV90IGluZGV4ID0gbVRvcmNoU3RhdHVzTWFwLmluZGV4T2ZLZXkoY2FtZXJhSWQpOworICAgIGlmIChpbmRleCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUb3JjaFN0YXR1cyYgaXRlbSA9CisgICAgICAgICAgICBtVG9yY2hTdGF0dXNNYXAuZWRpdFZhbHVlQXQoaW5kZXgpOworICAgIGl0ZW0gPSBzdGF0dXM7CisKKyAgICByZXR1cm4gT0s7CiB9CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKaW5kZXggZmQyYTJlZS4uMzkwNWQ2MiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaApAQCAtMTcsNiArMTcsNyBAQAogI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQVNFUlZJQ0VfSAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQVNFUlZJQ0VfSAogCisjaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8YmluZGVyL0FwcE9wc01hbmFnZXIuaD4KQEAgLTI3LDggKzI4LDYgQEAKIAogI2luY2x1ZGUgPGNhbWVyYS9JQ2FtZXJhLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmFDbGllbnQuaD4KLSNpbmNsdWRlIDxjYW1lcmEvSVByb0NhbWVyYVVzZXIuaD4KLSNpbmNsdWRlIDxjYW1lcmEvSVByb0NhbWVyYUNhbGxiYWNrcy5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgogI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CkBAIC0zNiw5ICszNSwxOCBAQAogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+CiAKICNpbmNsdWRlIDxjYW1lcmEvSUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgorI2luY2x1ZGUgIkNhbWVyYUZsYXNobGlnaHQuaCIKIAotLyogVGhpcyBuZWVkcyB0byBiZSBpbmNyZWFzZWQgaWYgd2UgY2FuIGhhdmUgbW9yZSBjYW1lcmFzICovCi0jZGVmaW5lIE1BWF9DQU1FUkFTIDIKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhTW9kdWxlLmgiCisjaW5jbHVkZSAibWVkaWEvUmluZ0J1ZmZlci5oIgorI2luY2x1ZGUgInV0aWxzL0F1dG9Db25kaXRpb25Mb2NrLmgiCisjaW5jbHVkZSAidXRpbHMvQ2xpZW50TWFuYWdlci5oIgorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTgsNiArNjYsMjQgQEAKICAgICBjbGFzcyBDbGllbnQ7CiAgICAgY2xhc3MgQmFzaWNDbGllbnQ7CiAKKyAgICAvLyBUaGUgZWZmZWN0aXZlIEFQSSBsZXZlbC4gIFRoZSBDYW1lcmEyIEFQSSBydW5uaW5nIGluIExFR0FDWSBtb2RlIGNvdW50cyBhcyBBUElfMS4KKyAgICBlbnVtIGFwaUxldmVsIHsKKyAgICAgICAgQVBJXzEgPSAxLAorICAgICAgICBBUElfMiA9IDIKKyAgICB9OworCisgICAgLy8gUHJvY2VzcyBzdGF0ZSAobWlycm9ycyBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvYXBwL0FjdGl2aXR5TWFuYWdlci5qYXZhKQorICAgIHN0YXRpYyBjb25zdCBpbnQgUFJPQ0VTU19TVEFURV9OT05FWElTVEVOVCA9IC0xOworCisgICAgLy8gMyBzZWNvbmQgYnVzeSB0aW1lb3V0IHdoZW4gb3RoZXIgY2xpZW50cyBhcmUgY29ubmVjdGluZworICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IERFRkFVTFRfQ09OTkVDVF9USU1FT1VUX05TID0gMzAwMDAwMDAwMDsKKworICAgIC8vIDEgc2Vjb25kIGJ1c3kgdGltZW91dCB3aGVuIG90aGVyIGNsaWVudHMgYXJlIGRpc2Nvbm5lY3RpbmcKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBERUZBVUxUX0RJU0NPTk5FQ1RfVElNRU9VVF9OUyA9IDEwMDAwMDAwMDA7CisKKyAgICAvLyBEZWZhdWx0IG51bWJlciBvZiBtZXNzYWdlcyB0byBzdG9yZSBpbiBldmljdGlvbiBsb2cKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IERFRkFVTFRfRVZFTlRfTE9HX0xFTkdUSCA9IDEwMDsKKwogICAgIC8vIEV2ZW50IGxvZyBJRAogICAgIHN0YXRpYyBjb25zdCBpbnQgU05fRVZFTlRfTE9HX0lEID0gMHg1MzRlNDU1NDsKIApAQCAtNjksMTIgKzk1LDE3IEBACiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAvLyBIQUwgQ2FsbGJhY2tzCi0gICAgdmlydHVhbCB2b2lkICAgICAgICBvbkRldmljZVN0YXR1c0NoYW5nZWQoaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdTdGF0dXMpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgb25EZXZpY2VTdGF0dXNDaGFuZ2VkKGNhbWVyYV9kZXZpY2Vfc3RhdHVzX3QgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX2RldmljZV9zdGF0dXNfdCBuZXdTdGF0dXMpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgb25Ub3JjaFN0YXR1c0NoYW5nZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUb3JjaFN0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdHVzKTsKIAogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIC8vIElDYW1lcmFTZXJ2aWNlCisgICAgdmlydHVhbCBpbnQzMl90ICAgICBnZXROdW1iZXJPZkNhbWVyYXMoaW50IHR5cGUpOwogICAgIHZpcnR1YWwgaW50MzJfdCAgICAgZ2V0TnVtYmVyT2ZDYW1lcmFzKCk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldENhbWVyYUluZm8oaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ2FtZXJhSW5mbyogY2FtZXJhSW5mbyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaW50IGNhbWVyYUlkLApAQCAtOTEsMTEgKzEyMiw2IEBACiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxJQ2FtZXJhPiYgZGV2aWNlKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdFBybyhjb25zdCBzcDxJUHJvQ2FtZXJhQ2FsbGJhY2tzPiYgY2FtZXJhQ2IsCi0gICAgICAgICAgICBpbnQgY2FtZXJhSWQsIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgaW50IGNsaWVudFVpZCwKLSAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgIHNwPElQcm9DYW1lcmFVc2VyPiYgZGV2aWNlKTsKLQogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdERldmljZSgKICAgICAgICAgICAgIGNvbnN0IHNwPElDYW1lcmFEZXZpY2VDYWxsYmFja3M+JiBjYW1lcmFDYiwKICAgICAgICAgICAgIGludCBjYW1lcmFJZCwKQEAgLTExMyw2ICsxMzksMTEgQEAKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIFN0cmluZzE2KiBwYXJhbWV0ZXJzKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0VG9yY2hNb2RlKGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwgYm9vbCBlbmFibGVkLAorICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIGNsaWVudEJpbmRlcik7CisKKyAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5U3lzdGVtRXZlbnQoaW50MzJfdCBldmVudElkLCBjb25zdCBpbnQzMl90KiBhcmdzLCBzaXplX3QgbGVuZ3RoKTsKKwogICAgIC8vIE9LID0gc3VwcG9ydHMgYXBpIG9mIHRoYXQgdmVyc2lvbiwgLUVPUE5PVFNVUFAgPSBkb2VzIG5vdCBzdXBwb3J0CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdXBwb3J0c0NhbWVyYUFwaSgKICAgICAgICAgICAgIGludCBjYW1lcmFJZCwgaW50IGFwaVZlcnNpb24pOwpAQCAtMTI1LDcgKzE1Niw2IEBACiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAvLyBDbGllbnQgZnVuY3Rpb25hbGl0eQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcmVtb3ZlQ2xpZW50QnlSZW1vdGUoY29uc3Qgd3A8SUJpbmRlcj4mIHJlbW90ZUJpbmRlcik7CiAKICAgICBlbnVtIHNvdW5kX2tpbmQgewogICAgICAgICBTT1VORF9TSFVUVEVSID0gMCwKQEAgLTE0MywyNyArMTczLDIxIEBACiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAvLyBTaGFyZWQgdXRpbGl0aWVzCi0gICAgc3RhdGljIHN0YXR1c190ICAgICBmaWx0ZXJPcGVuRXJyb3JDb2RlKHN0YXR1c190IGVycik7CiAgICAgc3RhdGljIHN0YXR1c190ICAgICBmaWx0ZXJHZXRJbmZvRXJyb3JDb2RlKHN0YXR1c190IGVycik7CiAKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAvLyBDYW1lcmFDbGllbnQgZnVuY3Rpb25hbGl0eQogCi0gICAgLy8gcmV0dXJucyBwbGFpbiBwb2ludGVyIG9mIGNsaWVudC4gTm90ZSB0aGF0IG1DbGllbnRMb2NrIHNob3VsZCBiZSBhY3F1aXJlZCB0bwotICAgIC8vIHByZXZlbnQgdGhlIGNsaWVudCBmcm9tIGRlc3RydWN0aW9uLiBUaGUgcmVzdWx0IGNhbiBiZSBOVUxMLgotICAgIHZpcnR1YWwgQmFzaWNDbGllbnQqIGdldENsaWVudEJ5SWRVbnNhZmUoaW50IGNhbWVyYUlkKTsKLSAgICB2aXJ0dWFsIE11dGV4KiAgICAgIGdldENsaWVudExvY2tCeUlkKGludCBjYW1lcmFJZCk7Ci0KICAgICBjbGFzcyBCYXNpY0NsaWVudCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgewogICAgIHB1YmxpYzoKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBpbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKSA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdGlhbGl6ZShDYW1lcmFNb2R1bGUgKm1vZHVsZSkgPSAwOwogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGRpc2Nvbm5lY3QoKTsKIAogICAgICAgICAvLyBiZWNhdXNlIHdlIGNhbid0IHZpcnR1YWxseSBpbmhlcml0IElJbnRlcmZhY2UsIHdoaWNoIGJyZWFrcwogICAgICAgICAvLyB2aXJ0dWFsIGluaGVyaXRhbmNlCiAgICAgICAgIHZpcnR1YWwgc3A8SUJpbmRlcj4gYXNCaW5kZXJXcmFwcGVyKCkgPSAwOwogCi0gICAgICAgIC8vIFJldHVybiB0aGUgcmVtb3RlIGNhbGxiYWNrIGJpbmRlciBvYmplY3QgKGUuZy4gSVByb0NhbWVyYUNhbGxiYWNrcykKKyAgICAgICAgLy8gUmV0dXJuIHRoZSByZW1vdGUgY2FsbGJhY2sgYmluZGVyIG9iamVjdCAoZS5nLiBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKQogICAgICAgICBzcDxJQmluZGVyPiAgICAgICAgIGdldFJlbW90ZSgpIHsKICAgICAgICAgICAgIHJldHVybiBtUmVtb3RlQmluZGVyOwogICAgICAgICB9CkBAIC0xNzMsNiArMTk3LDIyIEBACiAgICAgICAgIC8vIEludGVybmFsIGR1bXAgbWV0aG9kIHRvIGJlIGNhbGxlZCBieSBDYW1lcmFTZXJ2aWNlCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBkdW1wQ2xpZW50KGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgPSAwOwogCisgICAgICAgIC8vIFJldHVybiB0aGUgcGFja2FnZSBuYW1lIGZvciB0aGlzIGNsaWVudAorICAgICAgICB2aXJ0dWFsIFN0cmluZzE2IGdldFBhY2thZ2VOYW1lKCkgY29uc3Q7CisKKyAgICAgICAgLy8gTm90aWZ5IGNsaWVudCBhYm91dCBhIGZhdGFsIGVycm9yCisgICAgICAgIHZpcnR1YWwgdm9pZCBub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgPSAwOworCisgICAgICAgIC8vIEdldCB0aGUgVUlEIG9mIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgdXNpbmcgdGhpcworICAgICAgICB2aXJ0dWFsIHVpZF90IGdldENsaWVudFVpZCgpIGNvbnN0OworCisgICAgICAgIC8vIEdldCB0aGUgUElEIG9mIHRoZSBhcHBsaWNhdGlvbiBjbGllbnQgdXNpbmcgdGhpcworICAgICAgICB2aXJ0dWFsIGludCBnZXRDbGllbnRQaWQoKSBjb25zdDsKKworICAgICAgICAvLyBDaGVjayB3aGF0IEFQSSBsZXZlbCBpcyB1c2VkIGZvciB0aGlzIGNsaWVudC4gVGhpcyBpcyB1c2VkIHRvIGRldGVybWluZSB3aGljaAorICAgICAgICAvLyBzdXBlcmNsYXNzIHRoaXMgY2FuIGJlIGNhc3QgdG8uCisgICAgICAgIHZpcnR1YWwgYm9vbCBjYW5DYXN0VG9BcGlDbGllbnQoYXBpTGV2ZWwgbGV2ZWwpIGNvbnN0OwogICAgIHByb3RlY3RlZDoKICAgICAgICAgQmFzaWNDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIHJlbW90ZUNhbGxiYWNrLApAQCAtMTk5LDYgKzIzOSw3IEBACiAgICAgICAgIHBpZF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFBpZDsKICAgICAgICAgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50VWlkOyAgICAgIC8vIGltbXV0YWJsZSBhZnRlciBjb25zdHJ1Y3RvcgogICAgICAgICBwaWRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlUGlkOyAgICAgLy8gaW1tdXRhYmxlIGFmdGVyIGNvbnN0cnVjdG9yCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURpc2Nvbm5lY3RlZDsKIAogICAgICAgICAvLyAtIFRoZSBhcHAtc2lkZSBCaW5kZXIgaW50ZXJmYWNlIHRvIHJlY2VpdmUgY2FsbGJhY2tzIGZyb20gdXMKICAgICAgICAgc3A8SUJpbmRlcj4gICAgICAgICAgICAgICAgICAgICBtUmVtb3RlQmluZGVyOyAgIC8vIGltbXV0YWJsZSBhZnRlciBjb25zdHJ1Y3RvcgpAQCAtMjA3LDEwICsyNDgsNiBAQAogICAgICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q2FtZXJhT3BzKCk7CiAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoQ2FtZXJhT3BzKCk7CiAKLSAgICAgICAgLy8gTm90aWZ5IGNsaWVudCBhYm91dCBhIGZhdGFsIGVycm9yCi0gICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoCi0gICAgICAgICAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKLSAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpID0gMDsKICAgICBwcml2YXRlOgogICAgICAgICBBcHBPcHNNYW5hZ2VyICAgICAgICAgICAgICAgICAgIG1BcHBPcHNNYW5hZ2VyOwogCkBAIC0yODIsMTQgKzMxOSwxNiBAQAogICAgICAgICAgICAgcmV0dXJuIGFzQmluZGVyKHRoaXMpOwogICAgICAgICB9CiAKLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIHN0YXRpYyBNdXRleCogICAgICAgIGdldENsaWVudExvY2tGcm9tQ29va2llKHZvaWQqIHVzZXIpOwotICAgICAgICAvLyBjb252ZXJ0IGNsaWVudCBmcm9tIGNvb2tpZS4gQ2xpZW50IGxvY2sgc2hvdWxkIGJlIGFjcXVpcmVkIGJlZm9yZSBnZXR0aW5nIENsaWVudC4KLSAgICAgICAgc3RhdGljIENsaWVudCogICAgICAgZ2V0Q2xpZW50RnJvbUNvb2tpZSh2b2lkKiB1c2VyKTsKLQogICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICBub3RpZnlFcnJvcihJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYW1lcmFFcnJvckNvZGUgZXJyb3JDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpOwogCisgICAgICAgIC8vIENoZWNrIHdoYXQgQVBJIGxldmVsIGlzIHVzZWQgZm9yIHRoaXMgY2xpZW50LiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoCisgICAgICAgIC8vIHN1cGVyY2xhc3MgdGhpcyBjYW4gYmUgY2FzdCB0by4KKyAgICAgICAgdmlydHVhbCBib29sIGNhbkNhc3RUb0FwaUNsaWVudChhcGlMZXZlbCBsZXZlbCkgY29uc3Q7CisgICAgcHJvdGVjdGVkOgorICAgICAgICAvLyBDb252ZXJ0IGNsaWVudCBmcm9tIGNvb2tpZS4KKyAgICAgICAgc3RhdGljIHNwPENhbWVyYVNlcnZpY2U6OkNsaWVudD4gZ2V0Q2xpZW50RnJvbUNvb2tpZSh2b2lkKiB1c2VyKTsKKwogICAgICAgICAvLyBJbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvcgogCiAgICAgICAgIC8vIC0gVGhlIGFwcC1zaWRlIEJpbmRlciBpbnRlcmZhY2UgdG8gcmVjZWl2ZSBjYWxsYmFja3MgZnJvbSB1cwpAQCAtMjk3LDkyICszMzYsMjk0IEBACiAKICAgICB9OyAvLyBjbGFzcyBDbGllbnQKIAotICAgIGNsYXNzIFByb0NsaWVudCA6IHB1YmxpYyBCblByb0NhbWVyYVVzZXIsIHB1YmxpYyBCYXNpY0NsaWVudCB7CisgICAgLyoqCisgICAgICogQSBsaXN0ZW5lciBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIExJU1RFTkVSIGludGVyZmFjZSBmb3IgdXNlIHdpdGggYSBDbGllbnRNYW5hZ2VyLCBhbmQKKyAgICAgKiBpbXBsZW1lbnRzIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKyAgICAgKiAgICB2b2lkIG9uQ2xpZW50UmVtb3ZlZChjb25zdCBDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+JiBkZXNjcmlwdG9yKTsKKyAgICAgKiAgICB2b2lkIG9uQ2xpZW50QWRkZWQoY29uc3QgQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPiYgZGVzY3JpcHRvcik7CisgICAgICovCisgICAgY2xhc3MgQ2xpZW50RXZlbnRMaXN0ZW5lciB7CiAgICAgcHVibGljOgotICAgICAgICB0eXBlZGVmIElQcm9DYW1lcmFDYWxsYmFja3MgVENhbUNhbGxiYWNrczsKKyAgICAgICAgdm9pZCBvbkNsaWVudEFkZGVkKGNvbnN0IHJlc291cmNlX3BvbGljeTo6Q2xpZW50RGVzY3JpcHRvcjxTdHJpbmc4LAorICAgICAgICAgICAgICAgIHNwPENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50Pj4mIGRlc2NyaXB0b3IpOworICAgICAgICB2b2lkIG9uQ2xpZW50UmVtb3ZlZChjb25zdCByZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwKKyAgICAgICAgICAgICAgICBzcDxDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudD4+JiBkZXNjcmlwdG9yKTsKKyAgICB9OyAvLyBjbGFzcyBDbGllbnRFdmVudExpc3RlbmVyCiAKLSAgICAgICAgUHJvQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPElQcm9DYW1lcmFDYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKLSAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCi0gICAgICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKLSAgICAgICAgICAgICAgICB1aWRfdCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQpOworICAgIHR5cGVkZWYgc3RkOjpzaGFyZWRfcHRyPHJlc291cmNlX3BvbGljeTo6Q2xpZW50RGVzY3JpcHRvcjxTdHJpbmc4LAorICAgICAgICAgICAgc3A8Q2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ+Pj4gRGVzY3JpcHRvclB0cjsKIAotICAgICAgICB2aXJ0dWFsIH5Qcm9DbGllbnQoKTsKKyAgICAvKioKKyAgICAgKiBBIGNvbnRhaW5lciBjbGFzcyBmb3IgbWFuYWdpbmcgYWN0aXZlIGNhbWVyYSBjbGllbnRzIHRoYXQgYXJlIHVzaW5nIEhBTCBkZXZpY2VzLiAgQWN0aXZlCisgICAgICogY2xpZW50cyBhcmUgcmVwcmVzZW50ZWQgYnkgQ2xpZW50RGVzY3JpcHRvciBvYmplY3RzIHRoYXQgY29udGFpbiBzdHJvbmcgcG9pbnRlcnMgdG8gdGhlCisgICAgICogYWN0dWFsIEJhc2ljQ2xpZW50IHN1YmNsYXNzIGJpbmRlciBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBUaGlzIGNsYXNzIG1hbmFnZXMgdGhlIGV2aWN0aW9uIGJlaGF2aW9yIGZvciB0aGUgY2FtZXJhIGNsaWVudHMuICBTZWUgdGhlIHBhcmVudCBjbGFzcworICAgICAqIGltcGxlbWVudGF0aW9uIGluIHV0aWxzL0NsaWVudE1hbmFnZXIgZm9yIHRoZSBzcGVjaWZpY3Mgb2YgdGhpcyBiZWhhdmlvci4KKyAgICAgKi8KKyAgICBjbGFzcyBDYW1lcmFDbGllbnRNYW5hZ2VyIDogcHVibGljIHJlc291cmNlX3BvbGljeTo6Q2xpZW50TWFuYWdlcjxTdHJpbmc4LAorICAgICAgICAgICAgc3A8Q2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQ+LCBDbGllbnRFdmVudExpc3RlbmVyPiB7CisgICAgcHVibGljOgorICAgICAgICBDYW1lcmFDbGllbnRNYW5hZ2VyKCk7CisgICAgICAgIHZpcnR1YWwgfkNhbWVyYUNsaWVudE1hbmFnZXIoKTsKIAotICAgICAgICBjb25zdCBzcDxJUHJvQ2FtZXJhQ2FsbGJhY2tzPiYgZ2V0UmVtb3RlQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJlbW90ZUNhbGxiYWNrOwotICAgICAgICB9CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gYSBzdHJvbmcgcG9pbnRlciB0byB0aGUgYWN0aXZlIEJhc2ljQ2xpZW50IGZvciB0aGlzIGNhbWVyYSBJRCwgb3IgYW4gZW1wdHkKKyAgICAgICAgICogaWYgbm9uZSBleGlzdHMuCisgICAgICAgICAqLworICAgICAgICBzcDxDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudD4gZ2V0Q2FtZXJhQ2xpZW50KGNvbnN0IFN0cmluZzgmIGlkKSBjb25zdDsKIAotICAgICAgICAvKioqCi0gICAgICAgICAgICBJUHJvQ2FtZXJhIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAqKiovCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBjb25uZWN0KGNvbnN0IHNwPElQcm9DYW1lcmFDYWxsYmFja3M+JiBjYWxsYmFja3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZXhjbHVzaXZlVHJ5TG9jaygpID0gMDsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGV4Y2x1c2l2ZUxvY2soKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBleGNsdXNpdmVVbmxvY2soKSA9IDA7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgY3VycmVudCBzdGF0ZS4KKyAgICAgICAgICovCisgICAgICAgIFN0cmluZzggdG9TdHJpbmcoKSBjb25zdDsKIAotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgICAgaGFzRXhjbHVzaXZlTG9jaygpID0gMDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1ha2UgYSBDbGllbnREZXNjcmlwdG9yIG9iamVjdCB3cmFwcGluZyB0aGUgZ2l2ZW4gQmFzaWNDbGllbnQgc3Ryb25nIHBvaW50ZXIuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgRGVzY3JpcHRvclB0ciBtYWtlQ2xpZW50RGVzY3JpcHRvcihjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IHNwPEJhc2ljQ2xpZW50PiYgdmFsdWUsCisgICAgICAgICAgICAgICAgaW50MzJfdCBjb3N0LCBjb25zdCBzdGQ6OnNldDxTdHJpbmc4PiYgY29uZmxpY3RpbmdLZXlzLCBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgIGludDMyX3Qgb3duZXJJZCk7CiAKLSAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBjYWxsZWUgZ2V0cyBhIGNvcHkgb2YgdGhlIG1ldGFkYXRhLgotICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgICAgc3VibWl0UmVxdWVzdChjYW1lcmFfbWV0YWRhdGFfdCogbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nID0gZmFsc2UpID0gMDsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGNhbmNlbFJlcXVlc3QoaW50IHJlcXVlc3RJZCkgPSAwOworICAgICAgICAvKioKKyAgICAgICAgICogTWFrZSBhIENsaWVudERlc2NyaXB0b3Igb2JqZWN0IHdyYXBwaW5nIHRoZSBnaXZlbiBCYXNpY0NsaWVudCBzdHJvbmcgcG9pbnRlciB3aXRoCisgICAgICAgICAqIHZhbHVlcyBpbnRpYWxpemVkIGZyb20gYSBwcmlvciBDbGllbnREZXNjcmlwdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIERlc2NyaXB0b3JQdHIgbWFrZUNsaWVudERlc2NyaXB0b3IoY29uc3Qgc3A8QmFzaWNDbGllbnQ+JiB2YWx1ZSwKKyAgICAgICAgICAgICAgICBjb25zdCBDYW1lcmFTZXJ2aWNlOjpEZXNjcmlwdG9yUHRyJiBwYXJ0aWFsKTsKIAotICAgICAgICAvLyBDYWxsYmFja3MgZnJvbSBjYW1lcmEgc2VydmljZQotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgb25FeGNsdXNpdmVMb2NrU3RvbGVuKCkgPSAwOwotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgbm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7Ci0KLSAgICAgICAgc3A8SVByb0NhbWVyYUNhbGxiYWNrcz4gbVJlbW90ZUNhbGxiYWNrOwotICAgIH07IC8vIGNsYXNzIFByb0NsaWVudAorICAgIH07IC8vIGNsYXNzIENhbWVyYUNsaWVudE1hbmFnZXIKIAogcHJpdmF0ZToKIAorICAgIC8qKgorICAgICAqIENvbnRhaW5lciBjbGFzcyBmb3IgdGhlIHN0YXRlIG9mIGVhY2ggbG9naWNhbCBjYW1lcmEgZGV2aWNlLCBpbmNsdWRpbmc6IElELCBzdGF0dXMsIGFuZAorICAgICAqIGRlcGVuZGVuY2llcyBvbiBvdGhlciBkZXZpY2VzLiAgVGhlIG1hcHBpbmcgb2YgY2FtZXJhIElEIC0+IHN0YXRlIHNhdmVkIGluIG1DYW1lcmFTdGF0ZXMKKyAgICAgKiByZXByZXNlbnRzIHRoZSBjYW1lcmEgZGV2aWNlcyBhZHZlcnRpc2VkIGJ5IHRoZSBIQUwgKGFuZCBhbnkgVVNCIGRldmljZXMsIHdoZW4gd2UgYWRkCisgICAgICogdGhvc2UpLgorICAgICAqCisgICAgICogVGhpcyBjb250YWluZXIgZG9lcyBOT1QgcmVwcmVzZW50IGFuIGFjdGl2ZSBjYW1lcmEgY2xpZW50LiAgVGhlc2UgYXJlIHJlcHJlc2VudGVkIHVzaW5nCisgICAgICogdGhlIENsaWVudERlc2NyaXB0b3JzIHN0b3JlZCBpbiBtQWN0aXZlQ2xpZW50TWFuYWdlci4KKyAgICAgKi8KKyAgICBjbGFzcyBDYW1lcmFTdGF0ZSB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogTWFrZSBhIG5ldyBDYW1lcmFTdGF0ZSBhbmQgc2V0IHRoZSBJRCwgY29zdCwgYW5kIGNvbmZsaWN0aW5nIGRldmljZXMgdXNpbmcgdGhlIHZhbHVlcworICAgICAgICAgKiByZXR1cm5lZCBpbiB0aGUgSEFMJ3MgY2FtZXJhX2luZm8gc3RydWN0IGZvciBlYWNoIGRldmljZS4KKyAgICAgICAgICovCisgICAgICAgIENhbWVyYVN0YXRlKGNvbnN0IFN0cmluZzgmIGlkLCBpbnQgY29zdCwgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIGNvbmZsaWN0aW5nKTsKKyAgICAgICAgdmlydHVhbCB+Q2FtZXJhU3RhdGUoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBzdGF0dXMgZm9yIHRoaXMgZGV2aWNlLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBhY3F1aXJlcyBtU3RhdHVzTG9jay4KKyAgICAgICAgICovCisgICAgICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cyBnZXRTdGF0dXMoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBzdGF0dXMgZm9yIHRoaXMgY2FtZXJhIGRldmljZSwgdW5sZXNzIHRoZSBnaXZlbiBzdGF0dXMKKyAgICAgICAgICogaXMgaW4gdGhlIGdpdmVuIGxpc3Qgb2YgcmVqZWN0ZWQgc3RhdHVzIHN0YXRlcywgYW5kIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIHBhc3NlZCBpbgorICAgICAgICAgKiB3aXRoIGEgc2lnbmF0dXJlIG9uU3RhdHVzVXBkYXRlTG9ja2VkKGNvbnN0IFN0cmluZzgmLCBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMpCisgICAgICAgICAqIGlmIHRoZSBzdGF0dXMgaGFzIGNoYW5nZWQuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGlkZW1wb3RlbnQsIGFuZCB3aWxsIG5vdCByZXN1bHQgaW4gdGhlIGZ1bmN0aW9uIHBhc3NlZCB0bworICAgICAgICAgKiBvblN0YXR1c1VwZGF0ZUxvY2tlZCBiZWluZyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UgZm9yIHRoZSBzYW1lIGFyZ3VtZW50cy4KKyAgICAgICAgICogVGhpcyBtZXRob2QgYXF1aXJlcyBtU3RhdHVzTG9jay4KKyAgICAgICAgICovCisgICAgICAgIHRlbXBsYXRlPGNsYXNzIEZ1bmM+CisgICAgICAgIHZvaWQgdXBkYXRlU3RhdHVzKElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cyBzdGF0dXMsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXM+IHJlamVjdFNvdXJjZVN0YXRlcywKKyAgICAgICAgICAgICAgICBGdW5jIG9uU3RhdHVzVXBkYXRlZExvY2tlZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgbGFzdCBzZXQgQ2FtZXJhUGFyYW1ldGVycyBvYmplY3QgZ2VuZXJhdGVkIGZyb20gdGhlIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5CisgICAgICAgICAqIHRoZSBIQUwgZm9yIHRoaXMgZGV2aWNlIChvciBhbiBlbXB0eSBDYW1lcmFQYXJhbWV0ZXJzIG9iamVjdCBpZiBub25lIGhhcyBiZWVuIHNldCkuCisgICAgICAgICAqLworICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzIGdldFNoaW1QYXJhbXMoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBDYW1lcmFQYXJhbWV0ZXJzIGZvciB0aGlzIGRldmljZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc2V0U2hpbVBhcmFtcyhjb25zdCBDYW1lcmFQYXJhbWV0ZXJzJiBwYXJhbXMpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIHJlc291cmNlX2Nvc3QgYWR2ZXJ0aXNlZCBieSB0aGUgSEFMIGZvciB0aGlzIGRldmljZS4KKyAgICAgICAgICovCisgICAgICAgIGludCBnZXRDb3N0KCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiBhIHNldCBvZiB0aGUgSURzIG9mIGNvbmZsaWN0aW5nIGRldmljZXMgYWR2ZXJ0aXNlZCBieSB0aGUgSEFMIGZvciB0aGlzIGRldmljZS4KKyAgICAgICAgICovCisgICAgICAgIHN0ZDo6c2V0PFN0cmluZzg+IGdldENvbmZsaWN0aW5nKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgSUQgb2YgdGhpcyBjYW1lcmEgZGV2aWNlLgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nOCBnZXRJZCgpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgU3RyaW5nOCBtSWQ7CisgICAgICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cyBtU3RhdHVzOyAvLyBwcm90ZWN0ZWQgYnkgbVN0YXR1c0xvY2sKKyAgICAgICAgY29uc3QgaW50IG1Db3N0OworICAgICAgICBzdGQ6OnNldDxTdHJpbmc4PiBtQ29uZmxpY3Rpbmc7CisgICAgICAgIG11dGFibGUgTXV0ZXggbVN0YXR1c0xvY2s7CisgICAgICAgIENhbWVyYVBhcmFtZXRlcnMgbVNoaW1QYXJhbXM7CisgICAgfTsgLy8gY2xhc3MgQ2FtZXJhU3RhdGUKKwogICAgIC8vIERlbGF5LWxvYWQgdGhlIENhbWVyYSBIQUwgbW9kdWxlCiAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKTsKIAotICAgIC8vIFN0ZXAgMS4gQ2hlY2sgaWYgd2UgY2FuIGNvbm5lY3QsIGJlZm9yZSB3ZSBhY3F1aXJlIHRoZSBzZXJ2aWNlIGxvY2suCi0gICAgc3RhdHVzX3QgICAgICAgICAgICB2YWxpZGF0ZUNvbm5lY3QoaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaW5vdXQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgY2xpZW50VWlkKSBjb25zdDsKKyAgICAvLyBDaGVjayBpZiB3ZSBjYW4gY29ubmVjdCwgYmVmb3JlIHdlIGFjcXVpcmUgdGhlIHNlcnZpY2UgbG9jay4KKyAgICBzdGF0dXNfdCB2YWxpZGF0ZUNvbm5lY3RMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIC8qaW5vdXQqL2ludCYgY2xpZW50VWlkKSBjb25zdDsKIAotICAgIC8vIFN0ZXAgMi4gQ2hlY2sgaWYgd2UgY2FuIGNvbm5lY3QsIGFmdGVyIHdlIGFjcXVpcmUgdGhlIHNlcnZpY2UgbG9jay4KLSAgICBib29sICAgICAgICAgICAgICAgIGNhbkNvbm5lY3RVbnNhZmUoaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiByZW1vdGVDYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxCYXNpY0NsaWVudD4gJmNsaWVudCk7CisgICAgLy8gSGFuZGxlIGFjdGl2ZSBjbGllbnQgZXZpY3Rpb25zLCBhbmQgdXBkYXRlIHNlcnZpY2Ugc3RhdGUuCisgICAgLy8gT25seSBjYWxsIHdpdGggd2l0aCBtU2VydmljZUxvY2sgaGVsZC4KKyAgICBzdGF0dXNfdCBoYW5kbGVFdmljdGlvbnNMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludCBjbGllbnRQaWQsCisgICAgICAgIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBjb25zdCBzcDxJQmluZGVyPiYgcmVtb3RlQ2FsbGJhY2ssIGNvbnN0IFN0cmluZzgmIHBhY2thZ2VOYW1lLAorICAgICAgICAvKm91dCovCisgICAgICAgIHNwPEJhc2ljQ2xpZW50PiogY2xpZW50LAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cmVzb3VyY2VfcG9saWN5OjpDbGllbnREZXNjcmlwdG9yPFN0cmluZzgsIHNwPEJhc2ljQ2xpZW50Pj4+KiBwYXJ0aWFsKTsKIAotICAgIC8vIFdoZW4gY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsLCBpbml0aWFsaXplIGNsaWVudCBhbmQgdHJhY2sgaXRzIGRlYXRoCi0gICAgc3RhdHVzX3QgICAgICAgICAgICBjb25uZWN0RmluaXNoVW5zYWZlKGNvbnN0IHNwPEJhc2ljQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgcmVtb3RlQ2FsbGJhY2spOworICAgIC8vIFNpbmdsZSBpbXBsZW1lbnRhdGlvbiBzaGFyZWQgYmV0d2VlbiB0aGUgdmFyaW91cyBjb25uZWN0IGNhbGxzCisgICAgdGVtcGxhdGU8Y2xhc3MgQ0FMTEJBQ0ssIGNsYXNzIENMSUVOVD4KKyAgICBzdGF0dXNfdCBjb25uZWN0SGVscGVyKGNvbnN0IHNwPENBTExCQUNLPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgaW50IGNsaWVudFVpZCwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsCisgICAgICAgICAgICBib29sIGxlZ2FjeU1vZGUsIGJvb2wgc2hpbVVwZGF0ZU9ubHksIC8qb3V0Ki9zcDxDTElFTlQ+JiBkZXZpY2UpOwogCi0gICAgdmlydHVhbCBzcDxCYXNpY0NsaWVudD4gIGdldENsaWVudEJ5UmVtb3RlKGNvbnN0IHdwPElCaW5kZXI+JiBjYW1lcmFDbGllbnQpOwotCisgICAgLy8gTG9jayBndWFyZGluZyBjYW1lcmEgc2VydmljZSBzdGF0ZQogICAgIE11dGV4ICAgICAgICAgICAgICAgbVNlcnZpY2VMb2NrOwotICAgIC8vIGVpdGhlciBhIENsaWVudCBvciBDYW1lcmFEZXZpY2VDbGllbnQKLSAgICB3cDxCYXNpY0NsaWVudD4gICAgIG1DbGllbnRbTUFYX0NBTUVSQVNdOyAgLy8gcHJvdGVjdGVkIGJ5IG1TZXJ2aWNlTG9jawotICAgIE11dGV4ICAgICAgICAgICAgICAgbUNsaWVudExvY2tbTUFYX0NBTUVSQVNdOyAvLyBwcmV2ZW50IENsaWVudCBkZXN0cnVjdGlvbiBpbnNpZGUgY2FsbGJhY2tzCisKKyAgICAvLyBDb25kaXRpb24gdG8gdXNlIHdpdGggbVNlcnZpY2VMb2NrLCB1c2VkIHRvIGhhbmRsZSBzaW11bHRhbmVvdXMgY29ubmVjdCBjYWxscyBmcm9tIGNsaWVudHMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8V2FpdGFibGVNdXRleFdyYXBwZXI+IG1TZXJ2aWNlTG9ja1dyYXBwZXI7CisKKyAgICAvLyBSZXR1cm4gTk9fRVJST1IgaWYgdGhlIGRldmljZSB3aXRoIGEgZ2l2ZSBJRCBjYW4gYmUgY29ubmVjdGVkIHRvCisgICAgc3RhdHVzX3QgY2hlY2tJZkRldmljZUlzVXNhYmxlKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSBjb25zdDsKKworICAgIC8vIENvbnRhaW5lciBmb3IgbWFuYWdpbmcgY3VycmVudGx5IGFjdGl2ZSBhcHBsaWNhdGlvbi1sYXllciBjbGllbnRzCisgICAgQ2FtZXJhQ2xpZW50TWFuYWdlciBtQWN0aXZlQ2xpZW50TWFuYWdlcjsKKworICAgIC8vIE1hcHBpbmcgZnJvbSBjYW1lcmEgSUQgLT4gc3RhdGUgZm9yIGVhY2ggZGV2aWNlLCBtYXAgaXMgcHJvdGVjdGVkIGJ5IG1DYW1lcmFTdGF0ZXNMb2NrCisgICAgc3RkOjptYXA8U3RyaW5nOCwgc3RkOjpzaGFyZWRfcHRyPENhbWVyYVN0YXRlPj4gbUNhbWVyYVN0YXRlczsKKworICAgIC8vIE11dGV4IGd1YXJkaW5nIG1DYW1lcmFTdGF0ZXMgbWFwCisgICAgbXV0YWJsZSBNdXRleCBtQ2FtZXJhU3RhdGVzTG9jazsKKworICAgIC8vIENpcmN1bGFyIGJ1ZmZlciBmb3Igc3RvcmluZyBldmVudCBsb2dnaW5nIGZvciBkdW1wcworICAgIFJpbmdCdWZmZXI8U3RyaW5nOD4gbUV2ZW50TG9nOworICAgIE11dGV4IG1Mb2dMb2NrOworCisgICAgLy8gQ3VycmVudGx5IGFsbG93ZWQgdXNlciBJRHMKKyAgICBzdGQ6OnNldDx1c2VyaWRfdD4gbUFsbG93ZWRVc2VyczsKKworICAgIC8qKgorICAgICAqIENoZWNrIGNhbWVyYSBjYXBhYmlsaXRpZXMsIHN1Y2ggYXMgc3VwcG9ydCBmb3IgYmFzaWMgY29sb3Igb3BlcmF0aW9uCisgICAgICovCisgICAgaW50IGNoZWNrQ2FtZXJhQ2FwYWJpbGl0aWVzKGludCBpZCwgY2FtZXJhX2luZm8gaW5mbywgaW50ICpsYXRlc3RTdHJhbmdlQ2FtZXJhSWQpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjYW1lcmEgc3RhdGUgZm9yIGEgZ2l2ZW4gY2FtZXJhIGlkLgorICAgICAqCisgICAgICogVGhpcyBhY3F1aXJlcyBtQ2FtZXJhU3RhdGVzTG9jay4KKyAgICAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FtZXJhU2VydmljZTo6Q2FtZXJhU3RhdGU+IGdldENhbWVyYVN0YXRlKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEV2aWN0IGNsaWVudCB3aG8ncyByZW1vdGUgYmluZGVyIGhhcyBkaWVkLiAgUmV0dXJucyB0cnVlIGlmIHRoaXMgY2xpZW50IHdhcyBpbiB0aGUgYWN0aXZlCisgICAgICogbGlzdCBhbmQgd2FzIGRpc2Nvbm5lY3RlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGFjcXVpcmVzIG1TZXJ2aWNlTG9jay4KKyAgICAgKi8KKyAgICBib29sIGV2aWN0Q2xpZW50SWRCeVJlbW90ZShjb25zdCB3cDxJQmluZGVyPiYgY2FtZXJhQ2xpZW50KTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgZ2l2ZW4gY2xpZW50IGZyb20gdGhlIGFjdGl2ZSBjbGllbnRzIGxpc3Q7IGRvZXMgbm90IGRpc2Nvbm5lY3QgdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGFjcXVpcmVzIG1TZXJ2aWNlTG9jay4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZUJ5Q2xpZW50KGNvbnN0IEJhc2ljQ2xpZW50KiBjbGllbnQpOworCisgICAgLyoqCisgICAgICogQWRkIG5ldyBjbGllbnQgdG8gYWN0aXZlIGNsaWVudHMgbGlzdCBhZnRlciBjb25mbGljdGluZyBjbGllbnRzIGhhdmUgZGlzY29ubmVjdGVkIHVzaW5nIHRoZQorICAgICAqIHZhbHVlcyBzZXQgaW4gdGhlIHBhcnRpYWwgZGVzY3JpcHRvciBwYXNzZWQgaW4gdG8gY29uc3RydWN0IHRoZSBhY3R1YWwgY2xpZW50IGRlc2NyaXB0b3IuCisgICAgICogVGhpcyBpcyB0eXBpY2FsbHkgY2FsbGVkIGF0IHRoZSBlbmQgb2YgYSBjb25uZWN0IGNhbGwuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCB3aXRoIG1TZXJ2aWNlTG9jayBoZWxkLgorICAgICAqLworICAgIHZvaWQgZmluaXNoQ29ubmVjdExvY2tlZChjb25zdCBzcDxCYXNpY0NsaWVudD4mIGNsaWVudCwgY29uc3QgRGVzY3JpcHRvclB0ciYgZGVzYyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbnRlZ2VyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGNhbWVyYSBJRCBzdHJpbmcsIG9yIC0xIG9uIGZhaWx1cmUuCisgICAgICovCisgICAgc3RhdGljIGludCBjYW1lcmFJZFRvSW50KGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSBhIHNpbmdsZSBjbGllbnQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gY2FtZXJhIGlkIGZyb20gdGhlIGxpc3Qgb2YgYWN0aXZlIGNsaWVudHMuCisgICAgICogSWYgbm9uZSBleGlzdHMsIHJldHVybiBhbiBlbXB0eSBzdHJvbmdwb2ludGVyLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgd2l0aCBtU2VydmljZUxvY2sgaGVsZC4KKyAgICAgKi8KKyAgICBzcDxDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudD4gcmVtb3ZlQ2xpZW50TG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKTsKKworICAgIC8qKgorICAgICAqIEhhbmRsZSBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBjdXJyZW50IGRldmljZSB1c2VyIGhhcyBjaGFuZ2VkLgorICAgICAqLworICAgIHZvaWQgZG9Vc2VyU3dpdGNoKGNvbnN0IGludDMyX3QqIG5ld1VzZXJJZCwgc2l6ZV90IGxlbmd0aCk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gZXZlbnQgbG9nIG1lc3NhZ2UuCisgICAgICovCisgICAgdm9pZCBsb2dFdmVudChjb25zdCBjaGFyKiBldmVudCk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gZXZlbnQgbG9nIG1lc3NhZ2UgdGhhdCBhIGNsaWVudCBoYXMgYmVlbiBkaXNjb25uZWN0ZWQuCisgICAgICovCisgICAgdm9pZCBsb2dEaXNjb25uZWN0ZWQoY29uc3QgY2hhciogY2FtZXJhSWQsIGludCBjbGllbnRQaWQsIGNvbnN0IGNoYXIqIGNsaWVudFBhY2thZ2UpOworCisgICAgLyoqCisgICAgICogQWRkIGFuIGV2ZW50IGxvZyBtZXNzYWdlIHRoYXQgYSBjbGllbnQgaGFzIGJlZW4gY29ubmVjdGVkLgorICAgICAqLworICAgIHZvaWQgbG9nQ29ubmVjdGVkKGNvbnN0IGNoYXIqIGNhbWVyYUlkLCBpbnQgY2xpZW50UGlkLCBjb25zdCBjaGFyKiBjbGllbnRQYWNrYWdlKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBldmVudCBsb2cgbWVzc2FnZSB0aGF0IGEgY2xpZW50J3MgY29ubmVjdCBhdHRlbXB0IGhhcyBiZWVuIHJlamVjdGVkLgorICAgICAqLworICAgIHZvaWQgbG9nUmVqZWN0ZWQoY29uc3QgY2hhciogY2FtZXJhSWQsIGludCBjbGllbnRQaWQsIGNvbnN0IGNoYXIqIGNsaWVudFBhY2thZ2UsCisgICAgICAgICAgICBjb25zdCBjaGFyKiByZWFzb24pOworCisgICAgLyoqCisgICAgICogQWRkIGFuIGV2ZW50IGxvZyBtZXNzYWdlIHRoYXQgdGhlIGN1cnJlbnQgZGV2aWNlIHVzZXIgaGFzIGJlZW4gc3dpdGNoZWQuCisgICAgICovCisgICAgdm9pZCBsb2dVc2VyU3dpdGNoKGNvbnN0IHN0ZDo6c2V0PHVzZXJpZF90PiYgb2xkVXNlcklkcywKKyAgICAgICAgY29uc3Qgc3RkOjpzZXQ8dXNlcmlkX3Q+JiBuZXdVc2VySWRzKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBldmVudCBsb2cgbWVzc2FnZSB0aGF0IGEgZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgYnkgdGhlIEhBTAorICAgICAqLworICAgIHZvaWQgbG9nRGV2aWNlUmVtb3ZlZChjb25zdCBjaGFyKiBjYW1lcmFJZCwgY29uc3QgY2hhciogcmVhc29uKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhbiBldmVudCBsb2cgbWVzc2FnZSB0aGF0IGEgZGV2aWNlIGhhcyBiZWVuIGFkZGVkIGJ5IHRoZSBIQUwKKyAgICAgKi8KKyAgICB2b2lkIGxvZ0RldmljZUFkZGVkKGNvbnN0IGNoYXIqIGNhbWVyYUlkLCBjb25zdCBjaGFyKiByZWFzb24pOworCisgICAgLyoqCisgICAgICogQWRkIGFuIGV2ZW50IGxvZyBtZXNzYWdlIHRoYXQgYSBjbGllbnQgaGFzIHVuZXhwZWN0ZWRseSBkaWVkLgorICAgICAqLworICAgIHZvaWQgbG9nQ2xpZW50RGllZChpbnQgY2xpZW50UGlkLCBjb25zdCBjaGFyKiByZWFzb24pOworCisgICAgLyoqCisgICAgICogQWRkIGEgZXZlbnQgbG9nIG1lc3NhZ2UgdGhhdCBhIHNlcmlvdXMgc2VydmljZS1sZXZlbCBlcnJvciBoYXMgb2NjdXJlZAorICAgICAqLworICAgIHZvaWQgbG9nU2VydmljZUVycm9yKGNvbnN0IGNoYXIqIG1zZywgaW50IGVycm9yQ29kZSk7CisKKyAgICAvKioKKyAgICAgKiBEdW1wIHRoZSBldmVudCBsb2cgdG8gYW4gRkQKKyAgICAgKi8KKyAgICB2b2lkIGR1bXBFdmVudExvZyhpbnQgZmQpOworCiAgICAgaW50ICAgICAgICAgICAgICAgICBtTnVtYmVyT2ZDYW1lcmFzOwotCi0gICAgdHlwZWRlZiB3cDxQcm9DbGllbnQ+IHdlYWtfcHJvX2NsaWVudF9wdHI7Ci0gICAgVmVjdG9yPHdlYWtfcHJvX2NsaWVudF9wdHI+IG1Qcm9DbGllbnRMaXN0W01BWF9DQU1FUkFTXTsKLQotICAgIC8vIG5lZWRzIHRvIGJlIGNhbGxlZCB3aXRoIG1TZXJ2aWNlTG9jayBoZWxkCi0gICAgc3A8QmFzaWNDbGllbnQ+ICAgICBmaW5kQ2xpZW50VW5zYWZlKGNvbnN0IHdwPElCaW5kZXI+JiBjYW1lcmFDbGllbnQsIGludCYgb3V0SW5kZXgpOwotICAgIHNwPFByb0NsaWVudD4gICAgICAgZmluZFByb0NsaWVudFVuc2FmZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxJQmluZGVyPiYgY2FtZXJhQ2FsbGJhY2tzUmVtb3RlKTsKLQotICAgIC8vIGF0b21pY3MgdG8gcmVjb3JkIHdoZXRoZXIgdGhlIGhhcmR3YXJlIGlzIGFsbG9jYXRlZCB0byBzb21lIGNsaWVudC4KLSAgICB2b2xhdGlsZSBpbnQzMl90ICAgIG1CdXN5W01BWF9DQU1FUkFTXTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIHNldENhbWVyYUJ1c3koaW50IGNhbWVyYUlkKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIHNldENhbWVyYUZyZWUoaW50IGNhbWVyYUlkKTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1OdW1iZXJPZk5vcm1hbENhbWVyYXM7CiAKICAgICAvLyBzb3VuZHMKICAgICBNZWRpYVBsYXllciogICAgICAgIG5ld01lZGlhUGxheWVyKGNvbnN0IGNoYXIgKmZpbGUpOwpAQCAtMzkxLDQ1ICs2MzIsNjQgQEAKICAgICBzcDxNZWRpYVBsYXllcj4gICAgIG1Tb3VuZFBsYXllcltOVU1fU09VTkRTXTsKICAgICBpbnQgICAgICAgICAgICAgICAgIG1Tb3VuZFJlZjsgIC8vIHJlZmVyZW5jZSBjb3VudCAocmVsZWFzZSBhbGwgTWVkaWFQbGF5ZXIgd2hlbiAwKQogCi0gICAgY2FtZXJhX21vZHVsZV90ICptTW9kdWxlOworICAgIENhbWVyYU1vZHVsZSogICAgIG1Nb2R1bGU7CiAKLSAgICBWZWN0b3I8c3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gPgotICAgICAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyTGlzdDsKKyAgICAvLyBHdWFyZGVkIGJ5IG1TdGF0dXNMaXN0ZW5lck11dGV4CisgICAgc3RkOjp2ZWN0b3I8c3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4+IG1MaXN0ZW5lckxpc3Q7CisgICAgTXV0ZXggICAgICAgbVN0YXR1c0xpc3RlbmVyTG9jazsKIAotICAgIC8vIGd1YXJkIG9ubHkgbVN0YXR1c0xpc3QgYW5kIHRoZSBicm9hZGNhc3Rpbmcgb2YgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcgotICAgIG11dGFibGUgTXV0ZXggICAgICAgbVN0YXR1c011dGV4OwotICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cwotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0xpc3RbTUFYX0NBTUVSQVNdOworICAgIC8qKgorICAgICAqIFVwZGF0ZSB0aGUgc3RhdHVzIGZvciB0aGUgZ2l2ZW4gY2FtZXJhIGlkIChpZiB0aGF0IGRldmljZSBleGlzdHMpLCBhbmQgYnJvYWRjYXN0IHRoZQorICAgICAqIHN0YXR1cyB1cGRhdGUgdG8gYWxsIGN1cnJlbnQgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcnMgaWYgdGhlIHN0YXR1cyBoYXMgY2hhbmdlZC4gIEFueQorICAgICAqIHN0YXR1c2VzIGluIHJlamVjdGVkU291cmNlU3RhdGVzIHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgaWRlbXBvdGVudC4KKyAgICAgKiBUaGlzIG1ldGhvZCBhY3F1aXJlcyBtU3RhdHVzTG9jayBhbmQgbVN0YXR1c0xpc3RlbmVyTG9jay4KKyAgICAgKi8KKyAgICB2b2lkIHVwZGF0ZVN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMgc3RhdHVzLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXM+IHJlamVjdGVkU291cmNlU3RhdGVzKTsKKyAgICB2b2lkIHVwZGF0ZVN0YXR1cyhJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXMgc3RhdHVzLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCk7CiAKLSAgICAvLyBSZWFkIHRoZSBjdXJyZW50IHN0YXR1cyAobG9ja3MgbVN0YXR1c011dGV4KQotICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cwotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3RhdHVzKGludCBjYW1lcmFJZCkgY29uc3Q7CisgICAgLy8gZmxhc2hsaWdodCBjb250cm9sCisgICAgc3A8Q2FtZXJhRmxhc2hsaWdodD4gbUZsYXNobGlnaHQ7CisgICAgLy8gZ3VhcmQgbVRvcmNoU3RhdHVzTWFwCisgICAgTXV0ZXggICAgICAgICAgICAgICAgbVRvcmNoU3RhdHVzTXV0ZXg7CisgICAgLy8gZ3VhcmQgbVRvcmNoQ2xpZW50TWFwCisgICAgTXV0ZXggICAgICAgICAgICAgICAgbVRvcmNoQ2xpZW50TWFwTXV0ZXg7CisgICAgLy8gZ3VhcmQgbVRvcmNoVWlkTWFwCisgICAgTXV0ZXggICAgICAgICAgICAgICAgbVRvcmNoVWlkTWFwTXV0ZXg7CisgICAgLy8gY2FtZXJhIGlkIC0+IHRvcmNoIHN0YXR1cworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlRvcmNoU3RhdHVzPiBtVG9yY2hTdGF0dXNNYXA7CisgICAgLy8gY2FtZXJhIGlkIC0+IHRvcmNoIGNsaWVudCBiaW5kZXIKKyAgICAvLyBvbmx5IHN0b3JlIHRoZSBsYXN0IGNsaWVudCB0aGF0IHR1cm5zIG9uIGVhY2ggY2FtZXJhJ3MgdG9yY2ggbW9kZQorICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIHNwPElCaW5kZXI+PiBtVG9yY2hDbGllbnRNYXA7CisgICAgLy8gY2FtZXJhIGlkIC0+IFtpbmNvbWluZyB1aWQsIGN1cnJlbnQgdWlkXSBwYWlyCisgICAgc3RkOjptYXA8U3RyaW5nOCwgc3RkOjpwYWlyPGludCwgaW50Pj4gbVRvcmNoVWlkTWFwOwogCi0gICAgdHlwZWRlZiBWZWN0b3I8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzPiBTdGF0dXNWZWN0b3I7Ci0gICAgLy8gQnJvYWRjYXN0IHRoZSBuZXcgc3RhdHVzIGlmIGl0IGNoYW5nZWQgKGxvY2tzIHRoZSBzZXJ2aWNlIG11dGV4KQotICAgIHZvaWQgICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlN0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNWZWN0b3IgKnJlamVjdFNvdXJjZVN0YXRlcyA9IE5VTEwpOworICAgIC8vIGNoZWNrIGFuZCBoYW5kbGUgaWYgdG9yY2ggY2xpZW50J3MgcHJvY2VzcyBoYXMgZGllZAorICAgIHZvaWQgaGFuZGxlVG9yY2hDbGllbnRCaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pOworCisgICAgLy8gaGFuZGxlIHRvcmNoIG1vZGUgc3RhdHVzIGNoYW5nZSBhbmQgaW52b2tlIGNhbGxiYWNrcy4gbVRvcmNoU3RhdHVzTXV0ZXgKKyAgICAvLyBzaG91bGQgYmUgbG9ja2VkLgorICAgIHZvaWQgb25Ub3JjaFN0YXR1c0NoYW5nZWRMb2NrZWQoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgICAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUb3JjaFN0YXR1cyBuZXdTdGF0dXMpOworCisgICAgLy8gZ2V0IGEgY2FtZXJhJ3MgdG9yY2ggc3RhdHVzLiBtVG9yY2hTdGF0dXNNdXRleCBzaG91bGQgYmUgbG9ja2VkLgorICAgIHN0YXR1c190IGdldFRvcmNoU3RhdHVzTG9ja2VkKGNvbnN0IFN0cmluZzggJmNhbWVyYUlkLAorICAgICAgICAgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6VG9yY2hTdGF0dXMgKnN0YXR1cykgY29uc3Q7CisKKyAgICAvLyBzZXQgYSBjYW1lcmEncyB0b3JjaCBzdGF0dXMuIG1Ub3JjaFN0YXR1c011dGV4IHNob3VsZCBiZSBsb2NrZWQuCisgICAgc3RhdHVzX3Qgc2V0VG9yY2hTdGF0dXNMb2NrZWQoY29uc3QgU3RyaW5nOCAmY2FtZXJhSWQsCisgICAgICAgICAgICBJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpUb3JjaFN0YXR1cyBzdGF0dXMpOwogCiAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgaW1wbGVtZW50YXRpb24KICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJndobyk7CiAKICAgICAvLyBIZWxwZXJzCiAKLSAgICBib29sICAgICAgICAgICAgICAgIGlzVmFsaWRDYW1lcmFJZChpbnQgY2FtZXJhSWQpOwotCiAgICAgYm9vbCAgICAgICAgICAgICAgICBzZXRVcFZlbmRvclRhZ3MoKTsKIAogICAgIC8qKgotICAgICAqIEEgbWFwcGluZyBvZiBjYW1lcmEgaWRzIHRvIENhbWVyYVBhcmFtZXRlcnMgcmV0dXJuZWQgYnkgdGhhdCBjYW1lcmEgZGV2aWNlLgotICAgICAqCi0gICAgICogVGhpcyBjYWNoZSBpcyB1c2VkIHRvIGdlbmVyYXRlIENhbWVyYUNoYXJhY3RlcmlzdGljIG1ldGFkYXRhIHdoZW4gdXNpbmcKLSAgICAgKiB0aGUgSEFMMSBzaGltLgotICAgICAqLwotICAgIEtleWVkVmVjdG9yPGludCwgQ2FtZXJhUGFyYW1ldGVycz4gICAgbVNoaW1QYXJhbXM7Ci0KLSAgICAvKioKICAgICAgKiBJbml0aWFsaXplIGFuZCBjYWNoZSB0aGUgbWV0YWRhdGEgdXNlZCBieSB0aGUgSEFMMSBzaGltIGZvciBhIGdpdmVuIGNhbWVyYUlkLgogICAgICAqCiAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCkBAIC00NTIsMjUgKzcxMiwxOTkgQEAKICAgICAgKi8KICAgICBzdGF0dXNfdCAgICAgICAgICAgIGdlbmVyYXRlU2hpbU1ldGFkYXRhKGludCBjYW1lcmFJZCwgLypvdXQqL0NhbWVyYU1ldGFkYXRhKiBjYW1lcmFJbmZvKTsKIAorICAgIHN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1BpZCgpOworCisgICAgc3RhdGljIGludCBnZXRDYWxsaW5nVWlkKCk7CisKICAgICAvKioKLSAgICAgKiBDb25uZWN0IGEgbmV3IGNhbWVyYSBjbGllbnQuICBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hpbGUgaG9sZGluZyB0aGUKLSAgICAgKiBtdXRleCBmb3IgbVNlcnZpY2VMb2NrLgotICAgICAqCi0gICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICogR2V0IHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lIGFzIGEgZm9ybWF0dGVkIHN0cmluZy4KICAgICAgKi8KLSAgICBzdGF0dXNfdCAgICAgICAgICAgIGNvbm5lY3RIZWxwZXJMb2NrZWQoCi0gICAgICAgICAgICAvKm91dCovCi0gICAgICAgICAgICBzcDxDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAvKmluKi8KLSAgICAgICAgICAgIGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCi0gICAgICAgICAgICBpbnQgY2FtZXJhSWQsCi0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBpbnQgY2xpZW50VWlkLAotICAgICAgICAgICAgaW50IGNhbGxpbmdQaWQsCi0gICAgICAgICAgICBpbnQgaGFsVmVyc2lvbiA9IENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQsCi0gICAgICAgICAgICBib29sIGxlZ2FjeU1vZGUgPSBmYWxzZSk7CisgICAgc3RhdGljIFN0cmluZzggZ2V0Rm9ybWF0dGVkQ3VycmVudFRpbWUoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY2FtZXJhIGV2aWN0aW9uIHByaW9yaXR5IGZyb20gdGhlIGN1cnJlbnQgcHJvY2VzcyBzdGF0ZSBnaXZlbiBieSBBY3Rpdml0eU1hbmFnZXIuCisgICAgICovCisgICAgc3RhdGljIGludCBnZXRDYW1lcmFQcmlvcml0eUZyb21Qcm9jU3RhdGUoaW50IHByb2NTdGF0ZSk7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgbWFrZUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElJbnRlcmZhY2U+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgICAgIGludCBmYWNpbmcsIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsIGJvb2wgbGVnYWN5TW9kZSwKKyAgICAgICAgICAgIGludCBoYWxWZXJzaW9uLCBpbnQgZGV2aWNlVmVyc2lvbiwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsCisgICAgICAgICAgICAvKm91dCovc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQpOworCisgICAgc3RhdHVzX3QgY2hlY2tDYW1lcmFBY2Nlc3MoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOworCisgICAgc3RhdGljIFN0cmluZzggdG9TdHJpbmcoc3RkOjpzZXQ8dXNlcmlkX3Q+IGludFNldCk7CisKKyAgICBzdGF0aWMgdm9pZCBwaW5nQ2FtZXJhU2VydmljZVByb3h5KCk7CisKIH07CiAKK3RlbXBsYXRlPGNsYXNzIEZ1bmM+Cit2b2lkIENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjp1cGRhdGVTdGF0dXMoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzIHN0YXR1cywKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCisgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTdGF0dXM+IHJlamVjdFNvdXJjZVN0YXRlcywKKyAgICAgICAgRnVuYyBvblN0YXR1c1VwZGF0ZWRMb2NrZWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTG9jayk7CisgICAgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U3RhdHVzIG9sZFN0YXR1cyA9IG1TdGF0dXM7CisgICAgbVN0YXR1cyA9IHN0YXR1czsKKworICAgIGlmIChvbGRTdGF0dXMgPT0gc3RhdHVzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiJXM6IFN0YXR1cyBoYXMgY2hhbmdlZCBmb3IgY2FtZXJhIElEICVzIGZyb20gJSN4IHRvICUjeCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpLCBvbGRTdGF0dXMsIHN0YXR1cyk7CisKKyAgICBpZiAob2xkU3RhdHVzID09IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfUFJFU0VOVCAmJgorICAgICAgICAoc3RhdHVzICE9IElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19QUkVTRU5UICYmCisgICAgICAgICBzdGF0dXMgIT0gSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX0VOVU1FUkFUSU5HKSkgeworCisgICAgICAgIEFMT0dXKCIlczogRnJvbSBOT1RfUFJFU0VOVCBjYW4gb25seSB0cmFuc2l0aW9uIGludG8gUFJFU0VOVCBvciBFTlVNRVJBVElORyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgbVN0YXR1cyA9IG9sZFN0YXR1czsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNvbWV0aW1lcyB3ZSB3YW50IHRvIGNvbmRpdGlvbmFsbHkgZG8gYSB0cmFuc2l0aW9uLgorICAgICAqIEZvciBleGFtcGxlIGlmIGEgY2xpZW50IGRpc2Nvbm5lY3RzLCB3ZSB3YW50IHRvIGdvIHRvIFBSRVNFTlQKKyAgICAgKiBvbmx5IGlmIHdlIHdlcmVuJ3QgYWxyZWFkeSBpbiBOT1RfUFJFU0VOVCBvciBFTlVNRVJBVElORy4KKyAgICAgKi8KKyAgICBmb3IgKGF1dG8mIHJlamVjdFN0YXR1cyA6IHJlamVjdFNvdXJjZVN0YXRlcykgeworICAgICAgICBpZiAob2xkU3RhdHVzID09IHJlamVjdFN0YXR1cykgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBSZWplY3Rpbmcgc3RhdHVzIHRyYW5zaXRpb24gZm9yIENhbWVyYSBJRCAlcywgIHNpbmNlIHRoZSBzb3VyY2UgIgorICAgICAgICAgICAgICAgICAgICAic3RhdGUgd2FzIHdhcyBpbiBvbmUgb2YgdGhlIGJhZCBzdGF0ZXMuIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgICAgICBtU3RhdHVzID0gb2xkU3RhdHVzOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgb25TdGF0dXNVcGRhdGVkTG9ja2VkKGNhbWVyYUlkLCBzdGF0dXMpOworfQorCisKK3RlbXBsYXRlPGNsYXNzIENBTExCQUNLLCBjbGFzcyBDTElFTlQ+CitzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0SGVscGVyKGNvbnN0IHNwPENBTExCQUNLPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAorICAgICAgICBpbnQgaGFsVmVyc2lvbiwgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBpbnQgY2xpZW50VWlkLAorICAgICAgICBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBsZWdhY3lNb2RlLCBib29sIHNoaW1VcGRhdGVPbmx5LAorICAgICAgICAvKm91dCovc3A8Q0xJRU5UPiYgZGV2aWNlKSB7CisgICAgc3RhdHVzX3QgcmV0ID0gTk9fRVJST1I7CisgICAgU3RyaW5nOCBjbGllbnROYW1lOChjbGllbnRQYWNrYWdlTmFtZSk7CisgICAgaW50IGNsaWVudFBpZCA9IGdldENhbGxpbmdQaWQoKTsKKworICAgIEFMT0dJKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IGNhbGwgKFBJRCAlZCBcIiVzXCIsIGNhbWVyYSBJRCAlcykgZm9yIEhBTCB2ZXJzaW9uICVzIGFuZCAiCisgICAgICAgICAgICAiQ2FtZXJhIEFQSSB2ZXJzaW9uICVkIiwgY2xpZW50UGlkLCBjbGllbnROYW1lOC5zdHJpbmcoKSwgY2FtZXJhSWQuc3RyaW5nKCksCisgICAgICAgICAgICAoaGFsVmVyc2lvbiA9PSAtMSkgPyAiZGVmYXVsdCIgOiBzdGQ6OnRvX3N0cmluZyhoYWxWZXJzaW9uKS5jX3N0cigpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihlZmZlY3RpdmVBcGlMZXZlbCkpOworCisgICAgc3A8Q0xJRU5UPiBjbGllbnQgPSBudWxscHRyOworICAgIHsKKyAgICAgICAgLy8gQWNxdWlyZSBtU2VydmljZUxvY2sgYW5kIHByZXZlbnQgb3RoZXIgY2xpZW50cyBmcm9tIGNvbm5lY3RpbmcKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEF1dG9Db25kaXRpb25Mb2NrPiBsb2NrID0KKyAgICAgICAgICAgICAgICBBdXRvQ29uZGl0aW9uTG9jazo6d2FpdEFuZEFjcXVpcmUobVNlcnZpY2VMb2NrV3JhcHBlciwgREVGQVVMVF9DT05ORUNUX1RJTUVPVVRfTlMpOworCisgICAgICAgIGlmIChsb2NrID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKFBJRCAlZCkgcmVqZWN0ZWQgKHRvbyBtYW55IG90aGVyIGNsaWVudHMgY29ubmVjdGluZykuIgorICAgICAgICAgICAgICAgICAgICAsIGNsaWVudFBpZCk7CisgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICB9CisKKyAgICAgICAgLy8gRW5mb3JjZSBjbGllbnQgcGVybWlzc2lvbnMgYW5kIGRvIGJhc2ljIHNhbml0eSBjaGVja3MKKyAgICAgICAgaWYoKHJldCA9IHZhbGlkYXRlQ29ubmVjdExvY2tlZChjYW1lcmFJZCwgLyppbm91dCovY2xpZW50VWlkKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayB0aGUgc2hpbSBwYXJhbWV0ZXJzIGFmdGVyIGFjcXVpcmluZyBsb2NrLCBpZiB0aGV5IGhhdmUgYWxyZWFkeSBiZWVuIHVwZGF0ZWQgYW5kCisgICAgICAgIC8vIHdlIHdlcmUgZG9pbmcgYSBzaGltIHVwZGF0ZSwgcmV0dXJuIGltbWVkaWF0ZWx5CisgICAgICAgIGlmIChzaGltVXBkYXRlT25seSkgeworICAgICAgICAgICAgYXV0byBjYW1lcmFTdGF0ZSA9IGdldENhbWVyYVN0YXRlKGNhbWVyYUlkKTsKKyAgICAgICAgICAgIGlmIChjYW1lcmFTdGF0ZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjYW1lcmFTdGF0ZS0+Z2V0U2hpbVBhcmFtcygpLmlzRW1wdHkoKSkgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3A8QmFzaWNDbGllbnQ+IGNsaWVudFRtcCA9IG51bGxwdHI7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxyZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwgc3A8QmFzaWNDbGllbnQ+Pj4gcGFydGlhbDsKKyAgICAgICAgaWYgKChyZXQgPSBoYW5kbGVFdmljdGlvbnNMb2NrZWQoY2FtZXJhSWQsIGNsaWVudFBpZCwgZWZmZWN0aXZlQXBpTGV2ZWwsCisgICAgICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoY2FtZXJhQ2IpLCBjbGllbnROYW1lOCwgLypvdXQqLyZjbGllbnRUbXAsCisgICAgICAgICAgICAgICAgLypvdXQqLyZwYXJ0aWFsKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2xpZW50VG1wLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIEhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIEFQSTEgTWVkaWFSZWNvcmRlciB3aGVyZSB0aGUgZXhpc3RpbmcgY2xpZW50IGlzIHJldHVybmVkCisgICAgICAgICAgICBkZXZpY2UgPSBzdGF0aWNfY2FzdDxDTElFTlQqPihjbGllbnRUbXAuZ2V0KCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgLy8gZ2l2ZSBmbGFzaGxpZ2h0IGEgY2hhbmNlIHRvIGNsb3NlIGRldmljZXMgaWYgbmVjZXNzYXJ5LgorICAgICAgICBtRmxhc2hsaWdodC0+cHJlcGFyZURldmljZU9wZW4oY2FtZXJhSWQpOworCisgICAgICAgIC8vIFRPRE86IFVwZGF0ZSBnZXREZXZpY2VWZXJzaW9uICsgSEFMIGludGVyZmFjZSB0byB1c2Ugc3RyaW5ncyBmb3IgQ2FtZXJhIElEcworICAgICAgICBpbnQgaWQgPSBjYW1lcmFJZFRvSW50KGNhbWVyYUlkKTsKKyAgICAgICAgaWYgKGlkID09IC0xKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY2FtZXJhIElEICVzLCBjYW5ub3QgZ2V0IGRldmljZSB2ZXJzaW9uIGZyb20gSEFMLiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBmYWNpbmcgPSAtMTsKKyAgICAgICAgaW50IGRldmljZVZlcnNpb24gPSBnZXREZXZpY2VWZXJzaW9uKGlkLCAvKm91dCovJmZhY2luZyk7CisgICAgICAgIHNwPEJhc2ljQ2xpZW50PiB0bXAgPSBudWxscHRyOworICAgICAgICBpZigocmV0ID0gbWFrZUNsaWVudCh0aGlzLCBjYW1lcmFDYiwgY2xpZW50UGFja2FnZU5hbWUsIGNhbWVyYUlkLCBmYWNpbmcsIGNsaWVudFBpZCwKKyAgICAgICAgICAgICAgICBjbGllbnRVaWQsIGdldHBpZCgpLCBsZWdhY3lNb2RlLCBoYWxWZXJzaW9uLCBkZXZpY2VWZXJzaW9uLCBlZmZlY3RpdmVBcGlMZXZlbCwKKyAgICAgICAgICAgICAgICAvKm91dCovJnRtcCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IHN0YXRpY19jYXN0PENMSUVOVCo+KHRtcC5nZXQoKSk7CisKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihjbGllbnQuZ2V0KCkgPT0gbnVsbHB0ciwgIiVzOiBDYW1lcmFTZXJ2aWNlIGluIGludmFsaWQgc3RhdGUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisKKyAgICAgICAgaWYgKChyZXQgPSBjbGllbnQtPmluaXRpYWxpemUobU1vZHVsZSkpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBpbml0aWFsaXplIGNsaWVudCBmcm9tIEhBTCBtb2R1bGUuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBzcDxJQmluZGVyPiByZW1vdGVDYWxsYmFjayA9IGNsaWVudC0+Z2V0UmVtb3RlKCk7CisgICAgICAgIGlmIChyZW1vdGVDYWxsYmFjayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZW1vdGVDYWxsYmFjay0+bGlua1RvRGVhdGgodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBVcGRhdGUgc2hpbSBwYXJlbWV0ZXJzIGZvciBsZWdhY3kgY2xpZW50cworICAgICAgICBpZiAoZWZmZWN0aXZlQXBpTGV2ZWwgPT0gQVBJXzEpIHsKKyAgICAgICAgICAgIC8vIEFzc3VtZSB3ZSBoYXZlIGFsd2F5cyByZWNlaXZlZCBhIENsaWVudCBzdWJjbGFzcyBmb3IgQVBJMQorICAgICAgICAgICAgc3A8Q2xpZW50PiBzaGltQ2xpZW50ID0gcmVpbnRlcnByZXRfY2FzdDxDbGllbnQqPihjbGllbnQuZ2V0KCkpOworICAgICAgICAgICAgU3RyaW5nOCByYXdQYXJhbXMgPSBzaGltQ2xpZW50LT5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzIHBhcmFtcyhyYXdQYXJhbXMpOworCisgICAgICAgICAgICBhdXRvIGNhbWVyYVN0YXRlID0gZ2V0Q2FtZXJhU3RhdGUoY2FtZXJhSWQpOworICAgICAgICAgICAgaWYgKGNhbWVyYVN0YXRlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBjYW1lcmFTdGF0ZS0+c2V0U2hpbVBhcmFtcyhwYXJhbXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCB1cGRhdGUgc2hpbSBwYXJhbWV0ZXJzIGZvciBjYW1lcmEgJXMsIG5vIHN1Y2ggZGV2aWNlIGV4aXN0cy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2hpbVVwZGF0ZU9ubHkpIHsKKyAgICAgICAgICAgIC8vIElmIG9ubHkgdXBkYXRpbmcgbGVnYWN5IHNoaW0gcGFyYW1ldGVycywgaW1tZWRpYXRlbHkgZGlzY29ubmVjdCBjbGllbnQKKyAgICAgICAgICAgIG1TZXJ2aWNlTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIGNsaWVudC0+ZGlzY29ubmVjdCgpOworICAgICAgICAgICAgbVNlcnZpY2VMb2NrLmxvY2soKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgYWRkIGNsaWVudCB0byBhY3RpdmUgY2xpZW50cyBsaXN0CisgICAgICAgICAgICBmaW5pc2hDb25uZWN0TG9ja2VkKGNsaWVudCwgcGFydGlhbCk7CisgICAgICAgIH0KKyAgICB9IC8vIGxvY2sgaXMgZGVzdHJveWVkLCBhbGxvdyBmdXJ0aGVyIGNvbm5lY3QgY2FsbHMKKworICAgIC8vIEltcG9ydGFudDogcmVsZWFzZSB0aGUgbXV0ZXggaGVyZSBzbyB0aGUgY2xpZW50IGNhbiBjYWxsIGJhY2sgaW50byB0aGUgc2VydmljZSBmcm9tIGl0cworICAgIC8vIGRlc3RydWN0b3IgKGNhbiBiZSBhdCB0aGUgZW5kIG9mIHRoZSBjYWxsKQorICAgIGRldmljZSA9IGNsaWVudDsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAppbmRleCBjZDgwOGRiLi4xNjk1MzA5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKQEAgLTY3LDcgKzY3LDcgQEAKICAgICBtTGVnYWN5TW9kZSA9IGxlZ2FjeU1vZGU7CiB9CiAKLXN0YXR1c190IENhbWVyYTJDbGllbnQ6OmluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpCitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50Ojppbml0aWFsaXplKENhbWVyYU1vZHVsZSAqbW9kdWxlKQogewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzOiBJbml0aWFsaXppbmcgY2xpZW50IGZvciBjYW1lcmEgJWQiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CkBAIC0xMjEsNyArMTIxLDggQEAKICAgICAgICAgfQogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOgogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18xOgotICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOiB7CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM6IHsKICAgICAgICAgICAgIHNwPFpzbFByb2Nlc3NvcjM+IHpzbFByb2MgPQogICAgICAgICAgICAgICAgICAgICBuZXcgWnNsUHJvY2Vzc29yMyh0aGlzLCBtQ2FwdHVyZVNlcXVlbmNlcik7CiAgICAgICAgICAgICBtWnNsUHJvY2Vzc29yID0genNsUHJvYzsKQEAgLTE2NywxMSArMTY4LDkgQEAKIAogc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6ZHVtcENsaWVudChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKICAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJDbGllbnQyWyVkXSAoJXApIENsaWVudDogJXMgUElEOiAlZCwgZHVtcDpcbiIsCi0gICAgICAgICAgICBtQ2FtZXJhSWQsCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQ2xpZW50MlslZF0gKCVwKSBQSUQ6ICVkLCBkdW1wOlxuIiwgbUNhbWVyYUlkLAogICAgICAgICAgICAgKGdldFJlbW90ZUNhbGxiYWNrKCkgIT0gTlVMTCA/CiAgICAgICAgICAgICAgICAgICAgIChJSW50ZXJmYWNlOjphc0JpbmRlcihnZXRSZW1vdGVDYWxsYmFjaygpKS5nZXQoKSkgOiBOVUxMKSwKLSAgICAgICAgICAgIFN0cmluZzgobUNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwKICAgICAgICAgICAgIG1DbGllbnRQaWQpOwogICAgIHJlc3VsdC5hcHBlbmQoIiAgU3RhdGU6ICIpOwogI2RlZmluZSBDQVNFX0FQUEVORF9FTlVNKHgpIGNhc2UgeDogcmVzdWx0LmFwcGVuZCgjeCAiXG4iKTsgYnJlYWs7CkBAIC01MzQsNyArNTMzLDcgQEAKICAgICBpZiAoIChyZXMgPSBjaGVja1BpZChfX0ZVTkNUSU9OX18pICkgIT0gT0spIHJldHVybiByZXM7CiAKICAgICBzcDxJQmluZGVyPiBiaW5kZXI7Ci0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93OworICAgIHNwPFN1cmZhY2U+IHdpbmRvdzsKICAgICBpZiAoYnVmZmVyUHJvZHVjZXIgIT0gMCkgewogICAgICAgICBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihidWZmZXJQcm9kdWNlcik7CiAgICAgICAgIC8vIFVzaW5nIGNvbnRyb2xsZWRCeUFwcCBmbGFnIHRvIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgcXVldWUgcmVtYWlucyBpbgpAQCAtNTQ2LDcgKzU0NSw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTJDbGllbnQ6OnNldFByZXZpZXdXaW5kb3dMKGNvbnN0IHNwPElCaW5kZXI+JiBiaW5kZXIsCi0gICAgICAgIHNwPEFOYXRpdmVXaW5kb3c+IHdpbmRvdykgeworICAgICAgICBzcDxTdXJmYWNlPiB3aW5kb3cpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlczsKIApAQCAtNjcxLDcgKzY3MCw3IEBACiAgICAgc3RhdHVzX3QgcmVzOwogICAgIGlmICggKHJlcyA9IGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgKSAhPSBPSykgcmV0dXJuIHJlczsKIAotICAgIHNwPEFOYXRpdmVXaW5kb3c+IHdpbmRvdzsKKyAgICBzcDxTdXJmYWNlPiB3aW5kb3c7CiAgICAgaWYgKGNhbGxiYWNrUHJvZHVjZXIgIT0gMCkgewogICAgICAgICB3aW5kb3cgPSBuZXcgU3VyZmFjZShjYWxsYmFja1Byb2R1Y2VyKTsKICAgICB9CkBAIC03NjksMTYgKzc2OCwyMiBAQAogICAgIC8vIGZpcnN0IGNhcHR1cmUgbGF0ZW5jeSBvbiBIQUwzIGRldmljZXMsIGFuZCBwb3RlbnRpYWxseSBvbiBzb21lIEhBTDIKICAgICAvLyBkZXZpY2VzLiBTbyBjcmVhdGUgaXQgdW5jb25kaXRpb25hbGx5IGF0IHByZXZpZXcgc3RhcnQuIEFzIGEgZHJhd2JhY2ssCiAgICAgLy8gdGhpcyBpbmNyZWFzZXMgZ3JhbGxvYyBtZW1vcnkgY29uc3VtcHRpb24gZm9yIGFwcGxpY2F0aW9ucyB0aGF0IGRvbid0Ci0gICAgLy8gZXZlciB0YWtlIGEgcGljdHVyZS4KKyAgICAvLyBldmVyIHRha2UgYSBwaWN0dXJlLiBEbyBub3QgZW50ZXIgdGhpcyBtb2RlIHdoZW4ganBlZyBzdHJlYW0gd2lsbCBzbG93CisgICAgLy8gZG93biBwcmV2aWV3LgogICAgIC8vIFRPRE86IEZpbmQgYSBiZXR0ZXIgY29tcHJvbWlzZSwgdGhvdWdoIHRoaXMgbGlrZWx5IHdvdWxkIGludm9sdmUgSEFMCiAgICAgLy8gY2hhbmdlcy4KICAgICBpbnQgbGFzdEpwZWdTdHJlYW1JZCA9IG1KcGVnUHJvY2Vzc29yLT5nZXRTdHJlYW1JZCgpOwotICAgIHJlcyA9IHVwZGF0ZVByb2Nlc3NvclN0cmVhbShtSnBlZ1Byb2Nlc3NvciwgcGFyYW1zKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBwcmUtY29uZmlndXJlIHN0aWxsIGltYWdlICIKLSAgICAgICAgICAgICAgICAic3RyZWFtOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgIHJldHVybiByZXM7CisgICAgLy8gSWYganBlZyBzdHJlYW0gd2lsbCBzbG93IGRvd24gcHJldmlldywgbWFrZSBzdXJlIHdlIHJlbW92ZSBpdCBiZWZvcmUgc3RhcnRpbmcgcHJldmlldworICAgIGlmIChwYXJhbXMuc2xvd0pwZWdNb2RlKSB7CisgICAgICAgIG1KcGVnUHJvY2Vzc29yLT5kZWxldGVTdHJlYW0oKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW0obUpwZWdQcm9jZXNzb3IsIHBhcmFtcyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBwcmUtY29uZmlndXJlIHN0aWxsIGltYWdlICIKKyAgICAgICAgICAgICAgICAgICAgInN0cmVhbTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KICAgICB9CiAgICAgYm9vbCBqcGVnU3RyZWFtQ2hhbmdlZCA9IG1KcGVnUHJvY2Vzc29yLT5nZXRTdHJlYW1JZCgpICE9IGxhc3RKcGVnU3RyZWFtSWQ7CiAKQEAgLTE0NTgsOSArMTQ2MywxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFN0YXJ0aW5nIHBpY3R1cmUgY2FwdHVyZSIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKLQogICAgICAgICBpbnQgbGFzdEpwZWdTdHJlYW1JZCA9IG1KcGVnUHJvY2Vzc29yLT5nZXRTdHJlYW1JZCgpOwotICAgICAgICByZXMgPSB1cGRhdGVQcm9jZXNzb3JTdHJlYW0obUpwZWdQcm9jZXNzb3IsIGwubVBhcmFtZXRlcnMpOworICAgICAgICAvLyBzbG93SnBlZ01vZGUgd2lsbCBjcmVhdGUganBlZyBzdHJlYW0gaW4gQ2FwdHVyZVNlcXVlbmNlciBiZWZvcmUgY2FwdHVyaW5nCisgICAgICAgIGlmICghbC5tUGFyYW1ldGVycy5zbG93SnBlZ01vZGUpIHsKKyAgICAgICAgICAgIHJlcyA9IHVwZGF0ZVByb2Nlc3NvclN0cmVhbShtSnBlZ1Byb2Nlc3NvciwgbC5tUGFyYW1ldGVycyk7CisgICAgICAgIH0KKwogICAgICAgICAvLyBJZiB2aWRlbyBzbmFwc2hvdCBmYWlsIHRvIGNvbmZpZ3VyZVN0cmVhbSwgdHJ5IG92ZXJyaWRlIHZpZGVvIHNuYXBzaG90IHNpemUgdG8KICAgICAgICAgLy8gdmlkZW8gc2l6ZQogICAgICAgICBpZiAocmVzID09IEJBRF9WQUxVRSAmJiBsLm1QYXJhbWV0ZXJzLnN0YXRlID09IFBhcmFtZXRlcnM6OlZJREVPX1NOQVBTSE9UKSB7CkBAIC0xNTY0LDYgKzE1NzIsOSBAQAogICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmRQaW5nTCgpOwogICAgICAgICBjYXNlIENBTUVSQV9DTURfU0VUX1ZJREVPX0JVRkZFUl9DT1VOVDoKICAgICAgICAgICAgIHJldHVybiBjb21tYW5kU2V0VmlkZW9CdWZmZXJDb3VudEwoYXJnMSk7CisgICAgICAgIGNhc2UgQ0FNRVJBX0NNRF9TRVRfVklERU9fRk9STUFUOgorICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmRTZXRWaWRlb0Zvcm1hdEwoYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KGFyZzIpKTsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCIlczogVW5rbm93biBjb21tYW5kICVkIChhcmd1bWVudHMgJWQsICVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY21kLCBhcmcxLCBhcmcyKTsKQEAgLTE3MTUsNiArMTcyNiw1MSBAQAogICAgIHJldHVybiBtU3RyZWFtaW5nUHJvY2Vzc29yLT5zZXRSZWNvcmRpbmdCdWZmZXJDb3VudChjb3VudCk7CiB9CiAKK3N0YXR1c190IENhbWVyYTJDbGllbnQ6OmNvbW1hbmRTZXRWaWRlb0Zvcm1hdEwoaW50IGZvcm1hdCwKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YXNwYWNlKSB7CisgICAgaWYgKHJlY29yZGluZ0VuYWJsZWRMKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHNldHRpbmcgdmlkZW8gZm9ybWF0IGFmdGVyICIKKyAgICAgICAgICAgICAgICAicmVjb3JkaW5nIHdhcyBzdGFydGVkIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmV0dXJuIG1TdHJlYW1pbmdQcm9jZXNzb3ItPnNldFJlY29yZGluZ0Zvcm1hdChmb3JtYXQsIGRhdGFzcGFjZSk7Cit9CisKK3ZvaWQgQ2FtZXJhMkNsaWVudDo6bm90aWZ5RXJyb3IoSUNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FtZXJhRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgaW50MzJfdCBlcnIgPSBDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICBzd2l0Y2goZXJyb3JDb2RlKSB7CisgICAgICAgIGNhc2UgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIGVyciA9IENBTUVSQV9FUlJPUl9SRUxFQVNFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ERVZJQ0U6CisgICAgICAgICAgICBlcnIgPSBDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9TRVJWSUNFOgorICAgICAgICAgICAgZXJyID0gQ0FNRVJBX0VSUk9SX1NFUlZFUl9ESUVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFU1VMVDoKKyAgICAgICAgY2FzZSBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfQlVGRkVSOgorICAgICAgICAgICAgQUxPR1coIiVzOiBSZWNlaXZlZCByZWNvdmVyYWJsZSBlcnJvciAlZCBmcm9tIEhBTCAtIGlnbm9yaW5nLCByZXF1ZXN0SWQgJSIgUFJJZDMyLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGVycm9yQ29kZSwgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBlcnIgPSBDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIEFMT0dFKCIlczogRXJyb3IgY29uZGl0aW9uICVkIHJlcG9ydGVkIGJ5IEhBTCwgcmVxdWVzdElkICUiIFBSSWQzMiwgX19GVU5DVElPTl9fLCBlcnJvckNvZGUsCisgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQpOworCisgICAgU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzOjpMb2NrIGwobVNoYXJlZENhbWVyYUNhbGxiYWNrcyk7CisgICAgaWYgKGwubVJlbW90ZUNhbGxiYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbC5tUmVtb3RlQ2FsbGJhY2stPm5vdGlmeUNhbGxiYWNrKENBTUVSQV9NU0dfRVJST1IsIGVyciwgMCk7CisgICAgfQorfQorCisKIC8qKiBEZXZpY2UtcmVsYXRlZCBtZXRob2RzICovCiB2b2lkIENhbWVyYTJDbGllbnQ6Om5vdGlmeUF1dG9Gb2N1cyh1aW50OF90IG5ld1N0YXRlLCBpbnQgdHJpZ2dlcklkKSB7CiAgICAgQUxPR1YoIiVzOiBBdXRvZm9jdXMgc3RhdGUgbm93ICVkLCBsYXN0IHRyaWdnZXIgJWQiLApAQCAtMTg1Miw2ICsxOTA4LDE2IEBACiAgICAgbUNhcHR1cmVTZXF1ZW5jZXItPm5vdGlmeUF1dG9FeHBvc3VyZShuZXdTdGF0ZSwgdHJpZ2dlcklkKTsKIH0KIAordm9pZCBDYW1lcmEyQ2xpZW50Ojpub3RpZnlTaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgeworICAgICh2b2lkKXJlc3VsdEV4dHJhczsKKyAgICAodm9pZCl0aW1lc3RhbXA7CisKKyAgICBBTE9HVigiJXM6IFNodXR0ZXIgbm90aWZpY2F0aW9uIGZvciByZXF1ZXN0IGlkICUiIFBSSWQzMiAiIGF0IHRpbWUgJSIgUFJJZDY0LAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHRFeHRyYXMucmVxdWVzdElkLCB0aW1lc3RhbXApOworICAgIG1DYXB0dXJlU2VxdWVuY2VyLT5ub3RpZnlTaHV0dGVyKHJlc3VsdEV4dHJhcywgdGltZXN0YW1wKTsKK30KKwogY2FtZXJhMjo6U2hhcmVkUGFyYW1ldGVycyYgQ2FtZXJhMkNsaWVudDo6Z2V0UGFyYW1ldGVycygpIHsKICAgICByZXR1cm4gbVBhcmFtZXRlcnM7CiB9CkBAIC0xODkwLDYgKzE5NTYsMzkgQEAKICAgICByZXR1cm4gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+c3RvcFN0cmVhbSgpOwogfQogCitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50OjpjcmVhdGVKcGVnU3RyZWFtTChQYXJhbWV0ZXJzICZwYXJhbXMpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBpbnQgbGFzdEpwZWdTdHJlYW1JZCA9IG1KcGVnUHJvY2Vzc29yLT5nZXRTdHJlYW1JZCgpOworICAgIGlmIChsYXN0SnBlZ1N0cmVhbUlkICE9IE5PX1NUUkVBTSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmVzID0gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+dG9nZ2xlUGF1c2VTdHJlYW0oLypwYXVzZSovdHJ1ZSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgcGF1c2Ugc3RyZWFtaW5nOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmVzID0gbURldmljZS0+Zmx1c2goKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgZmx1c2ggZGV2aWNlOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gSWRlYWxseSB3ZSBkb24ndCBuZWVkIHRoaXMsIGJ1dCBjdXJyZW50IGNhbWVyYSBkZXZpY2UKKyAgICAvLyBzdGF0dXMgdHJhY2tpbmcgbWVjaGFuaXNtIGRlbWFuZHMgaXQuCisgICAgcmVzID0gbURldmljZS0+d2FpdFVudGlsRHJhaW5lZCgpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFdhaXRpbmcgZGV2aWNlIGRyYWluIGZhaWxlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgIH0KKworICAgIHJlcyA9IHVwZGF0ZVByb2Nlc3NvclN0cmVhbShtSnBlZ1Byb2Nlc3NvciwgcGFyYW1zKTsKKyAgICByZXR1cm4gcmVzOworfQorCiBjb25zdCBpbnQzMl90IENhbWVyYTJDbGllbnQ6OmtQcmV2aWV3UmVxdWVzdElkU3RhcnQ7CiBjb25zdCBpbnQzMl90IENhbWVyYTJDbGllbnQ6OmtQcmV2aWV3UmVxdWVzdElkRW5kOwogY29uc3QgaW50MzJfdCBDYW1lcmEyQ2xpZW50OjprUmVjb3JkaW5nUmVxdWVzdElkU3RhcnQ7CkBAIC0xOTYzLDcgKzIwNjIsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHdpZHRoICogaGVpZ2h0ICogMjsKICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4ODoKICAgICAgICAgICAgIHJldHVybiB3aWR0aCAqIGhlaWdodCAqIDQ7Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVdfU0VOU09SOgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkFXMTY6CiAgICAgICAgICAgICByZXR1cm4gd2lkdGggKiBoZWlnaHQgKiAyOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmtub3duIHByZXZpZXcgZm9ybWF0OiAleCIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCmluZGV4IGFiZWU3OTcuLjdlN2EyODQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCkBAIC03Nyw2ICs3Nyw4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpOwogICAgIHZpcnR1YWwgU3RyaW5nOCAgICAgICAgIGdldFBhcmFtZXRlcnMoKSBjb25zdDsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgICBzZW5kQ29tbWFuZChpbnQzMl90IGNtZCwgaW50MzJfdCBhcmcxLCBpbnQzMl90IGFyZzIpOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICAgIG5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKIAogICAgIC8qKgogICAgICAqIEludGVyZmFjZSB1c2VkIGJ5IENhbWVyYVNlcnZpY2UKQEAgLTk0LDcgKzk2LDcgQEAKIAogICAgIHZpcnR1YWwgfkNhbWVyYTJDbGllbnQoKTsKIAotICAgIHN0YXR1c190IGluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpOworICAgIHN0YXR1c190IGluaXRpYWxpemUoQ2FtZXJhTW9kdWxlICptb2R1bGUpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKQEAgLTEwNiw2ICsxMDgsOCBAQAogCiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeUF1dG9Gb2N1cyh1aW50OF90IG5ld1N0YXRlLCBpbnQgdHJpZ2dlcklkKTsKICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5QXV0b0V4cG9zdXJlKHVpbnQ4X3QgbmV3U3RhdGUsIGludCB0cmlnZ2VySWQpOworICAgIHZpcnR1YWwgdm9pZCBub3RpZnlTaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCk7CiAKICAgICAvKioKICAgICAgKiBJbnRlcmZhY2UgdXNlZCBieSBpbmRlcGVuZGVudCBjb21wb25lbnRzIG9mIENhbWVyYTJDbGllbnQuCkBAIC0xMjcsNiArMTMxLDkgQEAKIAogICAgIHN0YXR1c190IHN0b3BTdHJlYW0oKTsKIAorICAgIC8vIEZvciB0aGUgc2xvd0pwZWdNb2RlIHRvIGNyZWF0ZSBqcGVnIHN0cmVhbSB3aGVuIHByZWNhcHR1cmUgc2VxdWVuY2UgaXMgZG9uZQorICAgIHN0YXR1c190IGNyZWF0ZUpwZWdTdHJlYW1MKGNhbWVyYTI6OlBhcmFtZXRlcnMgJnBhcmFtcyk7CisKICAgICBzdGF0aWMgc2l6ZV90IGNhbGN1bGF0ZUJ1ZmZlclNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgaW50IGZvcm1hdCwgaW50IHN0cmlkZSk7CiAKQEAgLTE0MywxMiArMTUwLDE1IEBACiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtBdXRvZm9jdXNMYWJlbDsKICAgICBzdGF0aWMgY29uc3QgY2hhcioga1Rha2VwaWN0dXJlTGFiZWw7CiAKKyAgICAvLyBVc2VkIHdpdGggc3RyZWFtIElEcworICAgIHN0YXRpYyBjb25zdCBpbnQgTk9fU1RSRUFNID0gLTE7CisKIHByaXZhdGU6CiAgICAgLyoqIElDYW1lcmEgaW50ZXJmYWNlLXJlbGF0ZWQgcHJpdmF0ZSBtZW1iZXJzICovCiAgICAgdHlwZWRlZiBjYW1lcmEyOjpQYXJhbWV0ZXJzIFBhcmFtZXRlcnM7CiAKICAgICBzdGF0dXNfdCBzZXRQcmV2aWV3V2luZG93TChjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyLAotICAgICAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93KTsKKyAgICAgICAgICAgIHNwPFN1cmZhY2U+IHdpbmRvdyk7CiAgICAgc3RhdHVzX3Qgc3RhcnRQcmV2aWV3TChQYXJhbWV0ZXJzICZwYXJhbXMsIGJvb2wgcmVzdGFydCk7CiAgICAgdm9pZCAgICAgc3RvcFByZXZpZXdMKCk7CiAgICAgc3RhdHVzX3Qgc3RhcnRSZWNvcmRpbmdMKFBhcmFtZXRlcnMgJnBhcmFtcywgYm9vbCByZXN0YXJ0KTsKQEAgLTE2NSw2ICsxNzUsNyBAQAogICAgIHN0YXR1c190IGNvbW1hbmRFbmFibGVGb2N1c01vdmVNc2dMKGJvb2wgZW5hYmxlKTsKICAgICBzdGF0dXNfdCBjb21tYW5kUGluZ0woKTsKICAgICBzdGF0dXNfdCBjb21tYW5kU2V0VmlkZW9CdWZmZXJDb3VudEwoc2l6ZV90IGNvdW50KTsKKyAgICBzdGF0dXNfdCBjb21tYW5kU2V0VmlkZW9Gb3JtYXRMKGludCBmb3JtYXQsIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSk7CiAKICAgICAvLyBDdXJyZW50IGNhbWVyYSBkZXZpY2UgY29uZmlndXJhdGlvbgogICAgIGNhbWVyYTI6OlNoYXJlZFBhcmFtZXRlcnMgbVBhcmFtZXRlcnM7CkBAIC0xNzQsOSArMTg1LDYgQEAKICAgICB2b2lkICAgICBzZXRQcmV2aWV3Q2FsbGJhY2tGbGFnTChQYXJhbWV0ZXJzICZwYXJhbXMsIGludCBmbGFnKTsKICAgICBzdGF0dXNfdCB1cGRhdGVSZXF1ZXN0cyhQYXJhbWV0ZXJzICZwYXJhbXMpOwogCi0gICAgLy8gVXNlZCB3aXRoIHN0cmVhbSBJRHMKLSAgICBzdGF0aWMgY29uc3QgaW50IE5PX1NUUkVBTSA9IC0xOwotCiAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb2Nlc3NvclQ+CiAgICAgc3RhdHVzX3QgdXBkYXRlUHJvY2Vzc29yU3RyZWFtKHNwPFByb2Nlc3NvclQ+IHByb2Nlc3NvciwgUGFyYW1ldGVycyBwYXJhbXMpOwogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9jZXNzb3JULApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCmluZGV4IGQxYjkyOWUuLjllNmVkNGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKQEAgLTU5LDcgKzU5LDcgQEAKICAgICBMT0cxKCJDYW1lcmFDbGllbnQ6OkNhbWVyYUNsaWVudCBYIChwaWQgJWQsIGlkICVkKSIsIGNhbGxpbmdQaWQsIGNhbWVyYUlkKTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhQ2xpZW50Ojppbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKSB7CitzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmluaXRpYWxpemUoQ2FtZXJhTW9kdWxlICptb2R1bGUpIHsKICAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKICAgICBzdGF0dXNfdCByZXM7CiAKQEAgLTc1LDcgKzc1LDcgQEAKICAgICBzbnByaW50ZihjYW1lcmFfZGV2aWNlX25hbWUsIHNpemVvZihjYW1lcmFfZGV2aWNlX25hbWUpLCAiJWQiLCBtQ2FtZXJhSWQpOwogCiAgICAgbUhhcmR3YXJlID0gbmV3IENhbWVyYUhhcmR3YXJlSW50ZXJmYWNlKGNhbWVyYV9kZXZpY2VfbmFtZSk7Ci0gICAgcmVzID0gbUhhcmR3YXJlLT5pbml0aWFsaXplKCZtb2R1bGUtPmNvbW1vbik7CisgICAgcmVzID0gbUhhcmR3YXJlLT5pbml0aWFsaXplKG1vZHVsZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogdW5hYmxlIHRvIGluaXRpYWxpemUgZGV2aWNlOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC05OSwxMiArOTksNyBAQAogCiAvLyB0ZWFyIGRvd24gdGhlIGNsaWVudAogQ2FtZXJhQ2xpZW50Ojp+Q2FtZXJhQ2xpZW50KCkgewotICAgIC8vIHRoaXMgbG9jayBzaG91bGQgbmV2ZXIgYmUgTlVMTAotICAgIE11dGV4KiBsb2NrID0gbUNhbWVyYVNlcnZpY2UtPmdldENsaWVudExvY2tCeUlkKG1DYW1lcmFJZCk7Ci0gICAgbG9jay0+bG9jaygpOwogICAgIG1EZXN0cnVjdGlvblN0YXJ0ZWQgPSB0cnVlOwotICAgIC8vIGNsaWVudCB3aWxsIG5vdCBiZSBhY2Nlc3NlZCBmcm9tIGNhbGxiYWNrLiBzaG91bGQgdW5sb2NrIHRvIHByZXZlbnQgZGVhZC1sb2NrIGluIGRpc2Nvbm5lY3QKLSAgICBsb2NrLT51bmxvY2soKTsKICAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJDYW1lcmFDbGllbnQ6On5DYW1lcmFDbGllbnQgRSAocGlkICVkLCB0aGlzICVwKSIsIGNhbGxpbmdQaWQsIHRoaXMpOwogCkBAIC0xMjAsMTEgKzExNSwxMSBAQAogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogCi0gICAgc2l6ZV90IGxlbiA9IHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkNsaWVudFslZF0gKCVwKSBQSUQ6ICVkXG4iLAorICAgIHNpemVfdCBsZW4gPSBzbnByaW50ZihidWZmZXIsIFNJWkUsICJDbGllbnRbJWRdICglcCkgd2l0aCBVSUQgJWRcbiIsCiAgICAgICAgICAgICBtQ2FtZXJhSWQsCiAgICAgICAgICAgICAoZ2V0UmVtb3RlQ2FsbGJhY2soKSAhPSBOVUxMID8KICAgICAgICAgICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoZ2V0UmVtb3RlQ2FsbGJhY2soKSkuZ2V0KCkgOiBOVUxMKSwKLSAgICAgICAgICAgIG1DbGllbnRQaWQpOworICAgICAgICAgICAgbUNsaWVudFVpZCk7CiAgICAgbGVuID0gKGxlbiA+IFNJWkUgLSAxKSA/IFNJWkUgLSAxIDogbGVuOwogICAgIHdyaXRlKGZkLCBidWZmZXIsIGxlbik7CiAKQEAgLTY4MSw2ICs2NzYsMTMgQEAKICAgICAgICAgICAgICAgICBMT0cxKCJsb2NrSWZNZXNzYWdlV2FudGVkKCVkKTogd2FpdGVkIGZvciAlZCBtcyIsCiAgICAgICAgICAgICAgICAgICAgIG1zZ1R5cGUsIHNsZWVwQ291bnQgKiBDSEVDS19NRVNTQUdFX0lOVEVSVkFMKTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgbWVzc2FnZXMgYXJlIG5vIGxvbmdlciBlbmFibGVkIGFmdGVyIGFjcXVpcmluZyBsb2NrLCByZWxlYXNlIGFuZCBkcm9wIG1lc3NhZ2UKKyAgICAgICAgICAgIGlmICgobU1zZ0VuYWJsZWQgJiBtc2dUeXBlKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGlmIChzbGVlcENvdW50KysgPT0gMCkgewpAQCAtNzA2LDI2ICs3MDgsMTMgQEAKIC8vICAgICAgKG90aGVycykgICAgICAgICAgICAgICAgICAgICAgICBjLT5kYXRhQ2FsbGJhY2sKIC8vIGRhdGFDYWxsYmFja1RpbWVzdGFtcAogLy8gICAgICAob3RoZXJzKSAgICAgICAgICAgICAgICAgICAgICAgIGMtPmRhdGFDYWxsYmFja1RpbWVzdGFtcAotLy8KLS8vIE5PVEU6IHRoZSAqQ2FsbGJhY2sgZnVuY3Rpb25zIGdyYWIgbUxvY2sgb2YgdGhlIGNsaWVudCBiZWZvcmUgcGFzc2luZwotLy8gY29udHJvbCB0byBoYW5kbGUqIGZ1bmN0aW9ucy4gU28gdGhlIGhhbmRsZSogZnVuY3Rpb25zIG11c3QgcmVsZWFzZSB0aGUKLS8vIGxvY2sgYmVmb3JlIGNhbGxpbmcgdGhlIElDYW1lcmFDbGllbnQncyBjYWxsYmFja3MsIHNvIHRob3NlIGNhbGxiYWNrcyBjYW4KLS8vIGludm9rZSBtZXRob2RzIGluIHRoZSBDbGllbnQgY2xhc3MgYWdhaW4gKEZvciBleGFtcGxlLCB0aGUgcHJldmlldyBmcmFtZQotLy8gY2FsbGJhY2sgbWF5IHdhbnQgdG8gcmVsZWFzZVJlY29yZGluZ0ZyYW1lKS4gVGhlIGhhbmRsZSogZnVuY3Rpb25zIG11c3QKLS8vIHJlbGVhc2UgdGhlIGxvY2sgYWZ0ZXIgYWxsIGFjY2Vzc2VzIHRvIG1lbWJlciB2YXJpYWJsZXMsIHNvIGl0IG11c3QgYmUKLS8vIGhhbmRsZWQgdmVyeSBjYXJlZnVsbHkuCiAKIHZvaWQgQ2FtZXJhQ2xpZW50Ojpub3RpZnlDYWxsYmFjayhpbnQzMl90IG1zZ1R5cGUsIGludDMyX3QgZXh0MSwKICAgICAgICAgaW50MzJfdCBleHQyLCB2b2lkKiB1c2VyKSB7CiAgICAgTE9HMigibm90aWZ5Q2FsbGJhY2soJWQpIiwgbXNnVHlwZSk7CiAKLSAgICBNdXRleCogbG9jayA9IGdldENsaWVudExvY2tGcm9tQ29va2llKHVzZXIpOwotICAgIGlmIChsb2NrID09IE5VTEwpIHJldHVybjsKLSAgICBNdXRleDo6QXV0b2xvY2sgYWxvY2soKmxvY2spOwotCi0gICAgQ2FtZXJhQ2xpZW50KiBjbGllbnQgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhQ2xpZW50Kj4oZ2V0Q2xpZW50RnJvbUNvb2tpZSh1c2VyKSk7Ci0gICAgaWYgKGNsaWVudCA9PSBOVUxMKSByZXR1cm47CisgICAgc3A8Q2FtZXJhQ2xpZW50PiBjbGllbnQgPSBzdGF0aWNfY2FzdDxDYW1lcmFDbGllbnQqPihnZXRDbGllbnRGcm9tQ29va2llKHVzZXIpLmdldCgpKTsKKyAgICBpZiAoY2xpZW50LmdldCgpID09IG51bGxwdHIpIHJldHVybjsKIAogICAgIGlmICghY2xpZW50LT5sb2NrSWZNZXNzYWdlV2FudGVkKG1zZ1R5cGUpKSByZXR1cm47CiAKQEAgLTc0NCwxMyArNzMzLDggQEAKICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFQdHIsIGNhbWVyYV9mcmFtZV9tZXRhZGF0YV90ICptZXRhZGF0YSwgdm9pZCogdXNlcikgewogICAgIExPRzIoImRhdGFDYWxsYmFjayglZCkiLCBtc2dUeXBlKTsKIAotICAgIE11dGV4KiBsb2NrID0gZ2V0Q2xpZW50TG9ja0Zyb21Db29raWUodXNlcik7Ci0gICAgaWYgKGxvY2sgPT0gTlVMTCkgcmV0dXJuOwotICAgIE11dGV4OjpBdXRvbG9jayBhbG9jaygqbG9jayk7Ci0KLSAgICBDYW1lcmFDbGllbnQqIGNsaWVudCA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFDbGllbnQqPihnZXRDbGllbnRGcm9tQ29va2llKHVzZXIpKTsKLSAgICBpZiAoY2xpZW50ID09IE5VTEwpIHJldHVybjsKKyAgICBzcDxDYW1lcmFDbGllbnQ+IGNsaWVudCA9IHN0YXRpY19jYXN0PENhbWVyYUNsaWVudCo+KGdldENsaWVudEZyb21Db29raWUodXNlcikuZ2V0KCkpOworICAgIGlmIChjbGllbnQuZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuOwogCiAgICAgaWYgKCFjbGllbnQtPmxvY2tJZk1lc3NhZ2VXYW50ZWQobXNnVHlwZSkpIHJldHVybjsKICAgICBpZiAoZGF0YVB0ciA9PSAwICYmIG1ldGFkYXRhID09IE5VTEwpIHsKQEAgLTc4MiwxMyArNzY2LDggQEAKICAgICAgICAgaW50MzJfdCBtc2dUeXBlLCBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YVB0ciwgdm9pZCogdXNlcikgewogICAgIExPRzIoImRhdGFDYWxsYmFja1RpbWVzdGFtcCglZCkiLCBtc2dUeXBlKTsKIAotICAgIE11dGV4KiBsb2NrID0gZ2V0Q2xpZW50TG9ja0Zyb21Db29raWUodXNlcik7Ci0gICAgaWYgKGxvY2sgPT0gTlVMTCkgcmV0dXJuOwotICAgIE11dGV4OjpBdXRvbG9jayBhbG9jaygqbG9jayk7Ci0KLSAgICBDYW1lcmFDbGllbnQqIGNsaWVudCA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFDbGllbnQqPihnZXRDbGllbnRGcm9tQ29va2llKHVzZXIpKTsKLSAgICBpZiAoY2xpZW50ID09IE5VTEwpIHJldHVybjsKKyAgICBzcDxDYW1lcmFDbGllbnQ+IGNsaWVudCA9IHN0YXRpY19jYXN0PENhbWVyYUNsaWVudCo+KGdldENsaWVudEZyb21Db29raWUodXNlcikuZ2V0KCkpOworICAgIGlmIChjbGllbnQuZ2V0KCkgPT0gbnVsbHB0cikgcmV0dXJuOwogCiAgICAgaWYgKCFjbGllbnQtPmxvY2tJZk1lc3NhZ2VXYW50ZWQobXNnVHlwZSkpIHJldHVybjsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKaW5kZXggZWRhMWE5Zi4uMTc5OTlhNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCkBAIC02OCw3ICs2OCw3IEBACiAgICAgICAgICAgICBib29sIGxlZ2FjeU1vZGUgPSBmYWxzZSk7CiAgICAgfkNhbWVyYUNsaWVudCgpOwogCi0gICAgc3RhdHVzX3QgaW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSk7CisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZShDYW1lcmFNb2R1bGUgKm1vZHVsZSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAKaW5kZXggZWFkYWEwMC4uNWY0ZmIyMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwCkBAIC01NSw3ICs1NSw3IEBACiB9CiAKIHN0YXR1c190IENhbGxiYWNrUHJvY2Vzc29yOjpzZXRDYWxsYmFja1dpbmRvdygKLSAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gY2FsbGJhY2tXaW5kb3cpIHsKKyAgICAgICAgc3A8U3VyZmFjZT4gY2FsbGJhY2tXaW5kb3cpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlczsKIApAQCAtMTE1LDcgKzExNSw3IEBACiAgICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CiAgICAgICAgIG1DYWxsYmFja0NvbnN1bWVyID0gbmV3IENwdUNvbnN1bWVyKGNvbnN1bWVyLCBrQ2FsbGJhY2tIZWFwQ291bnQpOwogICAgICAgICBtQ2FsbGJhY2tDb25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgbUNhbGxiYWNrQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMkNsaWVudDo6Q2FsbGJhY2tDb25zdW1lciIpKTsKKyAgICAgICAgbUNhbGxiYWNrQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMi1DYWxsYmFja0NvbnN1bWVyIikpOwogICAgICAgICBtQ2FsbGJhY2tXaW5kb3cgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CiAgICAgfQogCkBAIC0xMjMsNyArMTIzLDcgQEAKICAgICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIHBhcmFtZXRlcnMgaGF2ZSB0byBjaGFuZ2UKICAgICAgICAgdWludDMyX3QgY3VycmVudFdpZHRoLCBjdXJyZW50SGVpZ2h0LCBjdXJyZW50Rm9ybWF0OwogICAgICAgICByZXMgPSBkZXZpY2UtPmdldFN0cmVhbUluZm8obUNhbGxiYWNrU3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsICZjdXJyZW50Rm9ybWF0KTsKKyAgICAgICAgICAgICAgICAmY3VycmVudFdpZHRoLCAmY3VycmVudEhlaWdodCwgJmN1cnJlbnRGb3JtYXQsIDApOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRXJyb3IgcXVlcnlpbmcgY2FsbGJhY2sgb3V0cHV0IHN0cmVhbSBpbmZvOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCkBAIC0xNTQsOCArMTU0LDggQEAKICAgICAgICAgICAgICAgICBwYXJhbXMucHJldmlld1dpZHRoLCBwYXJhbXMucHJldmlld0hlaWdodCwKICAgICAgICAgICAgICAgICBjYWxsYmFja0Zvcm1hdCwgcGFyYW1zLnByZXZpZXdGb3JtYXQpOwogICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtQ2FsbGJhY2tXaW5kb3csCi0gICAgICAgICAgICAgICAgcGFyYW1zLnByZXZpZXdXaWR0aCwgcGFyYW1zLnByZXZpZXdIZWlnaHQsCi0gICAgICAgICAgICAgICAgY2FsbGJhY2tGb3JtYXQsICZtQ2FsbGJhY2tTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgcGFyYW1zLnByZXZpZXdXaWR0aCwgcGFyYW1zLnByZXZpZXdIZWlnaHQsIGNhbGxiYWNrRm9ybWF0LAorICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfSkZJRiwgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwgJm1DYWxsYmFja1N0cmVhbUlkKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGNyZWF0ZSBvdXRwdXQgc3RyZWFtIGZvciBjYWxsYmFja3M6ICIKICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKQEAgLTM5NSw3ICszOTUsNyBAQAogCiAgICAgICAgIGhlYXBJZHggPSBtQ2FsbGJhY2tIZWFwSGVhZDsKIAotICAgICAgICBtQ2FsbGJhY2tIZWFwSGVhZCA9IChtQ2FsbGJhY2tIZWFwSGVhZCArIDEpICYga0NhbGxiYWNrSGVhcENvdW50OworICAgICAgICBtQ2FsbGJhY2tIZWFwSGVhZCA9IChtQ2FsbGJhY2tIZWFwSGVhZCArIDEpICUga0NhbGxiYWNrSGVhcENvdW50OwogICAgICAgICBtQ2FsbGJhY2tIZWFwRnJlZS0tOwogCiAgICAgICAgIC8vIFRPRE86IEdldCByaWQgb2YgdGhpcyBjb3B5IGJ5IHBhc3NpbmcgdGhlIGdyYWxsb2MgcXVldWUgYWxsIHRoZSB3YXkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmgKaW5kZXggN2ZkYzMyOS4uYTI5MDUzNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmgKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgICB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSk7CiAKICAgICAvLyBTZXQgdG8gTlVMTCB0byBkaXNhYmxlIHRoZSBkaXJlY3QtdG8tYXBwIGNhbGxiYWNrIHdpbmRvdwotICAgIHN0YXR1c190IHNldENhbGxiYWNrV2luZG93KHNwPEFOYXRpdmVXaW5kb3c+IGNhbGxiYWNrV2luZG93KTsKKyAgICBzdGF0dXNfdCBzZXRDYWxsYmFja1dpbmRvdyhzcDxTdXJmYWNlPiBjYWxsYmFja1dpbmRvdyk7CiAgICAgc3RhdHVzX3QgdXBkYXRlU3RyZWFtKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcyk7CiAgICAgc3RhdHVzX3QgZGVsZXRlU3RyZWFtKCk7CiAgICAgaW50IGdldFN0cmVhbUlkKCkgY29uc3Q7CkBAIC03Myw3ICs3Myw3IEBACiAgICAgaW50IG1DYWxsYmFja1N0cmVhbUlkOwogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0NhbGxiYWNrSGVhcENvdW50ID0gNjsKICAgICBzcDxDcHVDb25zdW1lcj4gICAgbUNhbGxiYWNrQ29uc3VtZXI7Ci0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gIG1DYWxsYmFja1dpbmRvdzsKKyAgICBzcDxTdXJmYWNlPiAgICAgICAgbUNhbGxiYWNrV2luZG93OwogICAgIHNwPENhbWVyYTJIZWFwPiAgICBtQ2FsbGJhY2tIZWFwOwogICAgIGludCBtQ2FsbGJhY2tIZWFwSWQ7CiAgICAgc2l6ZV90IG1DYWxsYmFja0hlYXBIZWFkLCBtQ2FsbGJhY2tIZWFwRnJlZTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcAppbmRleCA5ODQ5ZjRkLi41ZjdmZDc0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwCkBAIC00Myw2ICs0Myw4IEBACiAgICAgICAgIG1OZXdGcmFtZVJlY2VpdmVkKGZhbHNlKSwKICAgICAgICAgbU5ld0NhcHR1cmVSZWNlaXZlZChmYWxzZSksCiAgICAgICAgIG1TaHV0dGVyTm90aWZpZWQoZmFsc2UpLAorICAgICAgICBtSGFsTm90aWZpZWRTaHV0dGVyKGZhbHNlKSwKKyAgICAgICAgbVNodXR0ZXJDYXB0dXJlSWQoLTEpLAogICAgICAgICBtQ2xpZW50KGNsaWVudCksCiAgICAgICAgIG1DYXB0dXJlU3RhdGUoSURMRSksCiAgICAgICAgIG1TdGF0ZVRyYW5zaXRpb25Db3VudCgwKSwKQEAgLTEwNiw2ICsxMDgsMTYgQEAKICAgICB9CiB9CiAKK3ZvaWQgQ2FwdHVyZVNlcXVlbmNlcjo6bm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbnB1dE11dGV4KTsKKyAgICBpZiAoIW1IYWxOb3RpZmllZFNodXR0ZXIgJiYgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCA9PSBtU2h1dHRlckNhcHR1cmVJZCkgeworICAgICAgICBtSGFsTm90aWZpZWRTaHV0dGVyID0gdHJ1ZTsKKyAgICAgICAgbVNodXR0ZXJOb3RpZnlTaWduYWwuc2lnbmFsKCk7CisgICAgfQorfQorCiB2b2lkIENhcHR1cmVTZXF1ZW5jZXI6Om9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQgJnJlc3VsdCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzOiBOZXcgcmVzdWx0IGF2YWlsYWJsZS4iLCBfX0ZVTkNUSU9OX18pOwpAQCAtMzM1LDYgKzM0NywxMSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG5leHRTdGF0ZSA9IFNUQU5EQVJEX1NUQVJUOwogICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbnB1dE11dGV4KTsKKyAgICAgICAgbVNodXR0ZXJDYXB0dXJlSWQgPSBtQ2FwdHVyZUlkOworICAgICAgICBtSGFsTm90aWZpZWRTaHV0dGVyID0gZmFsc2U7CisgICAgfQogICAgIG1TaHV0dGVyTm90aWZpZWQgPSBmYWxzZTsKIAogICAgIHJldHVybiBuZXh0U3RhdGU7CkBAIC00ODcsNiArNTA0LDE3IEBACiAgICAgICogIC0gcmVjb3JkaW5nIChpZiByZWNvcmRpbmcgZW5hYmxlZCkKICAgICAgKi8KICAgICBvdXRwdXRTdHJlYW1zLnB1c2goY2xpZW50LT5nZXRQcmV2aWV3U3RyZWFtSWQoKSk7CisKKyAgICBpbnQgY2FwdHVyZVN0cmVhbUlkID0gY2xpZW50LT5nZXRDYXB0dXJlU3RyZWFtSWQoKTsKKyAgICBpZiAoY2FwdHVyZVN0cmVhbUlkID09IENhbWVyYTJDbGllbnQ6Ok5PX1NUUkVBTSkgeworICAgICAgICByZXMgPSBjbGllbnQtPmNyZWF0ZUpwZWdTdHJlYW1MKGwubVBhcmFtZXRlcnMpOworICAgICAgICBpZiAocmVzICE9IE9LIHx8IGNsaWVudC0+Z2V0Q2FwdHVyZVN0cmVhbUlkKCkgPT0gQ2FtZXJhMkNsaWVudDo6Tk9fU1RSRUFNKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogY2Fubm90IGNyZWF0ZSBqcGVnIHN0cmVhbSBmb3Igc2xvd0pwZWcgbW9kZTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNsaWVudC0+Z2V0Q2FtZXJhSWQoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gRE9ORTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIG91dHB1dFN0cmVhbXMucHVzaChjbGllbnQtPmdldENhcHR1cmVTdHJlYW1JZCgpKTsKIAogICAgIGlmIChsLm1QYXJhbWV0ZXJzLnByZXZpZXdDYWxsYmFja0ZsYWdzICYKQEAgLTU0MSw2ICs1NjksNyBAQAogICAgICAgICAgICAgcmV0dXJuIERPTkU7CiAgICAgICAgIH0KICAgICB9CisKICAgICAvLyBUT0RPOiBDYXB0dXJlIHNob3VsZCBiZSBhdG9taWMgd2l0aCBzZXRTdHJlYW1pbmdSZXF1ZXN0IGhlcmUKICAgICByZXMgPSBjbGllbnQtPmdldENhbWVyYURldmljZSgpLT5jYXB0dXJlKGNhcHR1cmVDb3B5KTsKICAgICBpZiAocmVzICE9IE9LKSB7CkBAIC01NjAsNiArNTg5LDMxIEBACiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CiAKKworICAgIC8vIFdhaXQgZm9yIHNodXR0ZXIgY2FsbGJhY2sKKyAgICB3aGlsZSAoIW1IYWxOb3RpZmllZFNodXR0ZXIpIHsKKyAgICAgICAgaWYgKG1UaW1lb3V0Q291bnQgPD0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gbVNodXR0ZXJOb3RpZnlTaWduYWwud2FpdFJlbGF0aXZlKG1JbnB1dE11dGV4LCBrV2FpdER1cmF0aW9uKTsKKyAgICAgICAgaWYgKHJlcyA9PSBUSU1FRF9PVVQpIHsKKyAgICAgICAgICAgIG1UaW1lb3V0Q291bnQtLTsKKyAgICAgICAgICAgIHJldHVybiBTVEFOREFSRF9DQVBUVVJFX1dBSVQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUhhbE5vdGlmaWVkU2h1dHRlcikgeworICAgICAgICBpZiAoIW1TaHV0dGVyTm90aWZpZWQpIHsKKyAgICAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChjbGllbnQtPmdldFBhcmFtZXRlcnMoKSk7CisgICAgICAgICAgICAvKiB3YXJuaW5nOiB0aGlzIGFsc28gbG9ja3MgYSBTaGFyZWRDYW1lcmFDYWxsYmFja3MgKi8KKyAgICAgICAgICAgIHNodXR0ZXJOb3RpZnlMb2NrZWQobC5tUGFyYW1ldGVycywgY2xpZW50LCBtTXNnVHlwZSk7CisgICAgICAgICAgICBtU2h1dHRlck5vdGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAobVRpbWVvdXRDb3VudCA8PSAwKSB7CisgICAgICAgIEFMT0dXKCJUaW1lZCBvdXQgd2FpdGluZyBmb3Igc2h1dHRlciBub3RpZmljYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIERPTkU7CisgICAgfQorCiAgICAgLy8gV2FpdCBmb3IgbmV3IG1ldGFkYXRhIHJlc3VsdCAobU5ld0ZyYW1lKQogICAgIHdoaWxlICghbU5ld0ZyYW1lUmVjZWl2ZWQpIHsKICAgICAgICAgcmVzID0gbU5ld0ZyYW1lU2lnbmFsLndhaXRSZWxhdGl2ZShtSW5wdXRNdXRleCwga1dhaXREdXJhdGlvbik7CkBAIC01NjksMTUgKzYyMyw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBBcHByb3hpbWF0aW9uIG9mIHRoZSBzaHV0dGVyIGJlaW5nIGNsb3NlZAotICAgIC8vIC0gVE9ETzogdXNlIHRoZSBoYWwzIGV4cG9zdXJlIGNhbGxiYWNrIGluIENhbWVyYTNEZXZpY2UgaW5zdGVhZAotICAgIGlmIChtTmV3RnJhbWVSZWNlaXZlZCAmJiAhbVNodXR0ZXJOb3RpZmllZCkgewotICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwoY2xpZW50LT5nZXRQYXJhbWV0ZXJzKCkpOwotICAgICAgICAvKiB3YXJuaW5nOiB0aGlzIGFsc28gbG9ja3MgYSBTaGFyZWRDYW1lcmFDYWxsYmFja3MgKi8KLSAgICAgICAgc2h1dHRlck5vdGlmeUxvY2tlZChsLm1QYXJhbWV0ZXJzLCBjbGllbnQsIG1Nc2dUeXBlKTsKLSAgICAgICAgbVNodXR0ZXJOb3RpZmllZCA9IHRydWU7Ci0gICAgfQotCiAgICAgLy8gV2FpdCB1bnRpbCBqcGVnIHdhcyBjYXB0dXJlZCBieSBKcGVnUHJvY2Vzc29yCiAgICAgd2hpbGUgKG1OZXdGcmFtZVJlY2VpdmVkICYmICFtTmV3Q2FwdHVyZVJlY2VpdmVkKSB7CiAgICAgICAgIHJlcyA9IG1OZXdDYXB0dXJlU2lnbmFsLndhaXRSZWxhdGl2ZShtSW5wdXRNdXRleCwga1dhaXREdXJhdGlvbik7CkBAIC01OTEsNiArNjM2LDcgQEAKICAgICAgICAgcmV0dXJuIERPTkU7CiAgICAgfQogICAgIGlmIChtTmV3RnJhbWVSZWNlaXZlZCAmJiBtTmV3Q2FwdHVyZVJlY2VpdmVkKSB7CisKICAgICAgICAgaWYgKG1OZXdGcmFtZUlkICE9IG1DYXB0dXJlSWQpIHsKICAgICAgICAgICAgIEFMT0dXKCJNaXNtYXRjaGVkIGNhcHR1cmUgZnJhbWUgSURzOiBFeHBlY3RlZCAlZCwgZ290ICVkIiwKICAgICAgICAgICAgICAgICAgICAgbUNhcHR1cmVJZCwgbU5ld0ZyYW1lSWQpOwpAQCAtNjY3LDcgKzcxMyw2IEBACiAgICAgICAgIHNwPENhbWVyYTJDbGllbnQ+ICYvKmNsaWVudCovKSB7CiAgICAgc3RhdHVzX3QgcmVzOwogICAgIEFUUkFDRV9DQUxMKCk7Ci0KICAgICB3aGlsZSAoIW1OZXdDYXB0dXJlUmVjZWl2ZWQpIHsKICAgICAgICAgcmVzID0gbU5ld0NhcHR1cmVTaWduYWwud2FpdFJlbGF0aXZlKG1JbnB1dE11dGV4LCBrV2FpdER1cmF0aW9uKTsKICAgICAgICAgaWYgKHJlcyA9PSBUSU1FRF9PVVQpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oCmluZGV4IGQ0MmFiMTMuLjEwMjUyZmIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaApAQCAtNjIsNiArNjIsMTAgQEAKICAgICAvLyBOb3RpZmljYXRpb25zIGFib3V0IEFFIHN0YXRlIGNoYW5nZXMKICAgICB2b2lkIG5vdGlmeUF1dG9FeHBvc3VyZSh1aW50OF90IG5ld1N0YXRlLCBpbnQgdHJpZ2dlcklkKTsKIAorICAgIC8vIE5vdGlmaWNhdGlvbnMgYWJvdXQgc2h1dHRlciAoY2FwdHVyZSBzdGFydCkKKyAgICB2b2lkIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCk7CisKICAgICAvLyBOb3RpZmljYXRpb24gZnJvbSB0aGUgZnJhbWUgcHJvY2Vzc29yCiAgICAgdmlydHVhbCB2b2lkIG9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQgJnJlc3VsdCk7CiAKQEAgLTk1LDcgKzk5LDEwIEBACiAgICAgc3A8TWVtb3J5QmFzZT4gbUNhcHR1cmVCdWZmZXI7CiAgICAgQ29uZGl0aW9uIG1OZXdDYXB0dXJlU2lnbmFsOwogCi0gICAgYm9vbCBtU2h1dHRlck5vdGlmaWVkOworICAgIGJvb2wgbVNodXR0ZXJOb3RpZmllZDsgLy8gSGFzIENhcHR1cmVTZXF1ZW5jZXIgc2VudCBzaHV0dGVyIHRvIENsaWVudAorICAgIGJvb2wgbUhhbE5vdGlmaWVkU2h1dHRlcjsgLy8gSGFzIEhBTCBzZW50IHNodXR0ZXIgdG8gQ2FwdHVyZVNlcXVlbmNlcgorICAgIGludDMyX3QgbVNodXR0ZXJDYXB0dXJlSWQ7IC8vIFRoZSBjYXB0dXJlSWQgd2hpY2ggaXMgd2FpdGluZyBmb3Igc2h1dHRlciBub3RpZmljYXRpb24KKyAgICBDb25kaXRpb24gbVNodXR0ZXJOb3RpZnlTaWduYWw7CiAKICAgICAvKioKICAgICAgKiBJbnRlcm5hbCB0byBDYXB0dXJlU2VxdWVuY2VyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKaW5kZXggMjc3MjI2Ny4uYmQ5Nzg2ZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcApAQCAtODcsNyArODcsNyBAQAogICAgICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOwogICAgICAgICBtQ2FwdHVyZUNvbnN1bWVyID0gbmV3IENwdUNvbnN1bWVyKGNvbnN1bWVyLCAxKTsKICAgICAgICAgbUNhcHR1cmVDb25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgbUNhcHR1cmVDb25zdW1lci0+c2V0TmFtZShTdHJpbmc4KCJDYW1lcmEyQ2xpZW50OjpDYXB0dXJlQ29uc3VtZXIiKSk7CisgICAgICAgIG1DYXB0dXJlQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMi1KcGVnQ29uc3VtZXIiKSk7CiAgICAgICAgIG1DYXB0dXJlV2luZG93ID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOwogICAgIH0KIApAQCAtMTE1LDcgKzExNSw3IEBACiAgICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBwYXJhbWV0ZXJzIGhhdmUgdG8gY2hhbmdlCiAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodDsKICAgICAgICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1DYXB0dXJlU3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsIDApOworICAgICAgICAgICAgICAgICZjdXJyZW50V2lkdGgsICZjdXJyZW50SGVpZ2h0LCAwLCAwKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHF1ZXJ5aW5nIGNhcHR1cmUgb3V0cHV0IHN0cmVhbSBpbmZvOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLApAQCAtMTQ1LDcgKzE0NSw4IEBACiAgICAgICAgIC8vIENyZWF0ZSBzdHJlYW0gZm9yIEhBTCBwcm9kdWN0aW9uCiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1DYXB0dXJlV2luZG93LAogICAgICAgICAgICAgICAgIHBhcmFtcy5waWN0dXJlV2lkdGgsIHBhcmFtcy5waWN0dXJlSGVpZ2h0LAotICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfQkxPQiwgJm1DYXB0dXJlU3RyZWFtSWQpOworICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfQkxPQiwgSEFMX0RBVEFTUEFDRV9KRklGLAorICAgICAgICAgICAgICAgIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzAsICZtQ2FwdHVyZVN0cmVhbUlkKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGNyZWF0ZSBvdXRwdXQgc3RyZWFtIGZvciBjYXB0dXJlOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuaAppbmRleCAyMDQwYjMwLi5mYmRhZTExIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmgKQEAgLTcwLDggKzcwLDggQEAKIAogICAgIGludCBtQ2FwdHVyZVN0cmVhbUlkOwogICAgIHNwPENwdUNvbnN1bWVyPiAgICBtQ2FwdHVyZUNvbnN1bWVyOwotICAgIHNwPEFOYXRpdmVXaW5kb3c+ICBtQ2FwdHVyZVdpbmRvdzsKLSAgICBzcDxNZW1vcnlIZWFwQmFzZT4gICAgbUNhcHR1cmVIZWFwOworICAgIHNwPFN1cmZhY2U+ICAgICAgICBtQ2FwdHVyZVdpbmRvdzsKKyAgICBzcDxNZW1vcnlIZWFwQmFzZT4gbUNhcHR1cmVIZWFwOwogCiAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCmluZGV4IDRmNGNmYjAuLjQ0MmViNzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKQEAgLTY1LDE1ICs2NSwyOSBAQAogICAgIGNvbnN0IFNpemUgTUFYX1BSRVZJRVdfU0laRSA9IHsgTUFYX1BSRVZJRVdfV0lEVEgsIE1BWF9QUkVWSUVXX0hFSUdIVCB9OwogICAgIC8vIFRyZWF0IHRoZSBILjI2NCBtYXggc2l6ZSBhcyB0aGUgbWF4IHN1cHBvcnRlZCB2aWRlbyBzaXplLgogICAgIE1lZGlhUHJvZmlsZXMgKnZpZGVvRW5jb2RlclByb2ZpbGVzID0gTWVkaWFQcm9maWxlczo6Z2V0SW5zdGFuY2UoKTsKLSAgICBpbnQzMl90IG1heFZpZGVvV2lkdGggPSB2aWRlb0VuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVyUGFyYW1CeU5hbWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuYy52aWQud2lkdGgubWF4IiwgVklERU9fRU5DT0RFUl9IMjY0KTsKLSAgICBpbnQzMl90IG1heFZpZGVvSGVpZ2h0ID0gdmlkZW9FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlclBhcmFtQnlOYW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmMudmlkLmhlaWdodC5tYXgiLCBWSURFT19FTkNPREVSX0gyNjQpOwotICAgIGNvbnN0IFNpemUgTUFYX1ZJREVPX1NJWkUgPSB7bWF4VmlkZW9XaWR0aCwgbWF4VmlkZW9IZWlnaHR9OworICAgIFZlY3Rvcjx2aWRlb19lbmNvZGVyPiBlbmNvZGVycyA9IHZpZGVvRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJzKCk7CisgICAgaW50MzJfdCBtYXhWaWRlb1dpZHRoID0gMDsKKyAgICBpbnQzMl90IG1heFZpZGVvSGVpZ2h0ID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVuY29kZXJzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGludCB3aWR0aCA9IHZpZGVvRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJQYXJhbUJ5TmFtZSgKKyAgICAgICAgICAgICAgICAiZW5jLnZpZC53aWR0aC5tYXgiLCBlbmNvZGVyc1tpXSk7CisgICAgICAgIGludCBoZWlnaHQgPSB2aWRlb0VuY29kZXJQcm9maWxlcy0+Z2V0VmlkZW9FbmNvZGVyUGFyYW1CeU5hbWUoCisgICAgICAgICAgICAgICAgImVuYy52aWQuaGVpZ2h0Lm1heCIsIGVuY29kZXJzW2ldKTsKKyAgICAgICAgLy8gVHJlYXQgd2lkdGgvaGVpZ2h0IHNlcGFyYXRlbHkgaGVyZSB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgZGlmZmVyZW50CisgICAgICAgIC8vIHByb2ZpbGUgbWlnaHQgcmVwb3J0IG1heCBzaXplIG9mIGRpZmZlcmVudCBhc3BlY3QgcmF0aW8KKyAgICAgICAgaWYgKHdpZHRoID4gbWF4VmlkZW9XaWR0aCkgeworICAgICAgICAgICAgbWF4VmlkZW9XaWR0aCA9IHdpZHRoOworICAgICAgICB9CisgICAgICAgIGlmIChoZWlnaHQgPiBtYXhWaWRlb0hlaWdodCkgeworICAgICAgICAgICAgbWF4VmlkZW9IZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gVGhpcyBpcyBqdXN0IGFuIHVwcGVyIGJvdW5kIGFuZCBtYXkgbm90IGJlIGFuIGFjdHVhbGx5IHZhbGlkIHZpZGVvIHNpemUKKyAgICBjb25zdCBTaXplIFZJREVPX1NJWkVfVVBQRVJfQk9VTkQgPSB7bWF4VmlkZW9XaWR0aCwgbWF4VmlkZW9IZWlnaHR9OwogCiAgICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhNQVhfUFJFVklFV19TSVpFLCAmYXZhaWxhYmxlUHJldmlld1NpemVzKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwotICAgIHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMoTUFYX1ZJREVPX1NJWkUsICZhdmFpbGFibGVWaWRlb1NpemVzKTsKKyAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKFZJREVPX1NJWkVfVVBQRVJfQk9VTkQsICZhdmFpbGFibGVWaWRlb1NpemVzKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogCiAgICAgLy8gU2VsZWN0IGluaXRpYWwgcHJldmlldyBhbmQgdmlkZW8gc2l6ZSB0aGF0J3MgdW5kZXIgdGhlIGluaXRpYWwgYm91bmQgYW5kCkBAIC0xODIsOSArMTk2LDkgQEAKICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRQcmV2aWV3Rm9ybWF0cyArPQogICAgICAgICAgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfWVVWNDIwU1A7CiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAvLyBOb3QgYWR2ZXJ0aXppbmcgSlBFRywgUkFXX1NFTlNPUiwgZXRjLCBmb3IgcHJldmlldyBmb3JtYXRzCisgICAgICAgICAgICAvLyBOb3QgYWR2ZXJ0aXppbmcgSlBFRywgUkFXMTYsIGV0YywgZm9yIHByZXZpZXcgZm9ybWF0cwogICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ6Ci0gICAgICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkFXX1NFTlNPUjoKKyAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVcxNjoKICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9CTE9COgogICAgICAgICAgICAgICAgIGFkZENvbW1hID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC04NzUsMTUgKzg4OSwzMCBAQAogICAgIHByZXZpZXdDYWxsYmFja09uZVNob3QgPSBmYWxzZTsKICAgICBwcmV2aWV3Q2FsbGJhY2tTdXJmYWNlID0gZmFsc2U7CiAKKyAgICBTaXplIG1heEpwZWdTaXplID0gZ2V0TWF4U2l6ZShnZXRBdmFpbGFibGVKcGVnU2l6ZXMoKSk7CisgICAgaW50NjRfdCBtaW5GcmFtZUR1cmF0aW9uTnMgPSBnZXRKcGVnU3RyZWFtTWluRnJhbWVEdXJhdGlvbk5zKG1heEpwZWdTaXplKTsKKworICAgIHNsb3dKcGVnTW9kZSA9IGZhbHNlOworICAgIGlmIChtaW5GcmFtZUR1cmF0aW9uTnMgPiBrU2xvd0pwZWdNb2RlVGhyZXNob2xkKSB7CisgICAgICAgIHNsb3dKcGVnTW9kZSA9IHRydWU7CisgICAgICAgIC8vIFNsb3cganBlZyBkZXZpY2VzIGRvZXMgbm90IHN1cHBvcnQgdmlkZW8gc25hcHNob3Qgd2l0aG91dAorICAgICAgICAvLyBzbG93aW5nIGRvd24gcHJldmlldy4KKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCB2aWRlbyBzaXplIHZpZGVvIHNuYXBzaG90IG9ubHk/CisgICAgICAgIHBhcmFtcy5zZXQoQ2FtZXJhUGFyYW1ldGVyczo6S0VZX1ZJREVPX1NOQVBTSE9UX1NVUFBPUlRFRCwKKyAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnM6OkZBTFNFKTsKKyAgICB9CisKICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CiAgICAgcHJvcGVydHlfZ2V0KCJjYW1lcmEuZGlzYWJsZV96c2xfbW9kZSIsIHZhbHVlLCAiMCIpOwotICAgIGlmICghc3RyY21wKHZhbHVlLCIxIikpIHsKKyAgICBpZiAoIXN0cmNtcCh2YWx1ZSwiMSIpIHx8IHNsb3dKcGVnTW9kZSkgewogICAgICAgICBBTE9HSSgiQ2FtZXJhICVkOiBEaXNhYmxpbmcgWlNMIG1vZGUiLCBjYW1lcmFJZCk7CiAgICAgICAgIHpzbE1vZGUgPSBmYWxzZTsKICAgICB9IGVsc2UgewogICAgICAgICB6c2xNb2RlID0gdHJ1ZTsKICAgICB9CiAKKyAgICBBTE9HSSgiJXM6IHpzbE1vZGU6ICVkIHNsb3dKcGVnTW9kZSAlZCIsIF9fRlVOQ1RJT05fXywgenNsTW9kZSwgc2xvd0pwZWdNb2RlKTsKKwogICAgIGxpZ2h0RnggPSBMSUdIVEZYX05PTkU7CiAKICAgICBzdGF0ZSA9IFNUT1BQRUQ7CkBAIC0yMDg2LDEyICsyMTE1LDcgQEAKIAogICAgIGRlbGV0ZVtdIHJlcU1ldGVyaW5nQXJlYXM7CiAKLSAgICAvKiBkb24ndCBpbmNsdWRlIGpwZWcgdGh1bWJuYWlsIHNpemUgLSBpdCdzIHZhbGlkIGZvcgotICAgICAgIGl0IHRvIGJlIHNldCB0byAoMCwwKSwgbWVhbmluZyAnbm8gdGh1bWJuYWlsJyAqLwotICAgIENyb3BSZWdpb24gY3JvcCA9IGNhbGN1bGF0ZUNyb3BSZWdpb24oIChDcm9wUmVnaW9uOjpPdXRwdXRzKSgKLSAgICAgICAgICAgIENyb3BSZWdpb246Ok9VVFBVVF9QUkVWSUVXICAgICB8Ci0gICAgICAgICAgICBDcm9wUmVnaW9uOjpPVVRQVVRfVklERU8gICAgICAgfAotICAgICAgICAgICAgQ3JvcFJlZ2lvbjo6T1VUUFVUX1BJQ1RVUkUgICAgKSk7CisgICAgQ3JvcFJlZ2lvbiBjcm9wID0gY2FsY3VsYXRlQ3JvcFJlZ2lvbigvKnByZXZpZXdPbmx5Ki8gZmFsc2UpOwogICAgIGludDMyX3QgcmVxQ3JvcFJlZ2lvbls0XSA9IHsKICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oY3JvcC5sZWZ0KSwKICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oY3JvcC50b3ApLApAQCAtMjI1Myw3ICsyMjc3LDcgQEAKICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4ODogICAvLyBSR0JBODg4OAogICAgICAgICAgICAgZm10ID0gQ2FtZXJhUGFyYW1ldGVyczo6UElYRUxfRk9STUFUX1JHQkE4ODg4OwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SQVdfU0VOU09SOgorICAgICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkFXMTY6CiAgICAgICAgICAgICBBTE9HVygiUmF3IHNlbnNvciBwcmV2aWV3IGZvcm1hdCByZXF1ZXN0ZWQuIik7CiAgICAgICAgICAgICBmbXQgPSBDYW1lcmFQYXJhbWV0ZXJzOjpQSVhFTF9GT1JNQVRfQkFZRVJfUkdHQjsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjU4OSw3ICsyNjEzLDcgQEAKICAgICBBTE9HX0FTU0VSVCh4ID49IDAsICJDcm9wLXJlbGF0aXZlIFggY29vcmRpbmF0ZSA9ICclZCcgaXMgb3V0IG9mIGJvdW5kcyIKICAgICAgICAgICAgICAgICAgICAgICAgICAiKGxvd2VyID0gMCkiLCB4KTsKIAotICAgIENyb3BSZWdpb24gcHJldmlld0Nyb3AgPSBjYWxjdWxhdGVDcm9wUmVnaW9uKENyb3BSZWdpb246Ok9VVFBVVF9QUkVWSUVXKTsKKyAgICBDcm9wUmVnaW9uIHByZXZpZXdDcm9wID0gY2FsY3VsYXRlQ3JvcFJlZ2lvbigvKnByZXZpZXdPbmx5Ki8gdHJ1ZSk7CiAgICAgQUxPR19BU1NFUlQoeCA8IHByZXZpZXdDcm9wLndpZHRoLCAiQ3JvcC1yZWxhdGl2ZSBYIGNvb3JkaW5hdGUgPSAnJWQnICIKICAgICAgICAgICAgICAgICAgICAgImlzIG91dCBvZiBib3VuZHMgKHVwcGVyID0gJWYpIiwgeCwgcHJldmlld0Nyb3Aud2lkdGgpOwogCkBAIC0yNjA1LDcgKzI2MjksNyBAQAogICAgIEFMT0dfQVNTRVJUKHkgPj0gMCwgIkNyb3AtcmVsYXRpdmUgWSBjb29yZGluYXRlID0gJyVkJyBpcyBvdXQgb2YgYm91bmRzICIKICAgICAgICAgIihsb3dlciA9IDApIiwgeSk7CiAKLSAgICBDcm9wUmVnaW9uIHByZXZpZXdDcm9wID0gY2FsY3VsYXRlQ3JvcFJlZ2lvbihDcm9wUmVnaW9uOjpPVVRQVVRfUFJFVklFVyk7CisgICAgQ3JvcFJlZ2lvbiBwcmV2aWV3Q3JvcCA9IGNhbGN1bGF0ZUNyb3BSZWdpb24oLypwcmV2aWV3T25seSovIHRydWUpOwogICAgIEFMT0dfQVNTRVJUKHkgPCBwcmV2aWV3Q3JvcC5oZWlnaHQsICJDcm9wLXJlbGF0aXZlIFkgY29vcmRpbmF0ZSA9ICclZCcgaXMgIgogICAgICAgICAgICAgICAgICJvdXQgb2YgYm91bmRzICh1cHBlciA9ICVmKSIsIHksIHByZXZpZXdDcm9wLmhlaWdodCk7CiAKQEAgLTI2MjAsMTIgKzI2NDQsMTIgQEAKIH0KIAogaW50IFBhcmFtZXRlcnM6Om5vcm1hbGl6ZWRYVG9Dcm9wKGludCB4KSBjb25zdCB7Ci0gICAgQ3JvcFJlZ2lvbiBwcmV2aWV3Q3JvcCA9IGNhbGN1bGF0ZUNyb3BSZWdpb24oQ3JvcFJlZ2lvbjo6T1VUUFVUX1BSRVZJRVcpOworICAgIENyb3BSZWdpb24gcHJldmlld0Nyb3AgPSBjYWxjdWxhdGVDcm9wUmVnaW9uKC8qcHJldmlld09ubHkqLyB0cnVlKTsKICAgICByZXR1cm4gKHggKyAxMDAwKSAqIChwcmV2aWV3Q3JvcC53aWR0aCAtIDEpIC8gMjAwMDsKIH0KIAogaW50IFBhcmFtZXRlcnM6Om5vcm1hbGl6ZWRZVG9Dcm9wKGludCB5KSBjb25zdCB7Ci0gICAgQ3JvcFJlZ2lvbiBwcmV2aWV3Q3JvcCA9IGNhbGN1bGF0ZUNyb3BSZWdpb24oQ3JvcFJlZ2lvbjo6T1VUUFVUX1BSRVZJRVcpOworICAgIENyb3BSZWdpb24gcHJldmlld0Nyb3AgPSBjYWxjdWxhdGVDcm9wUmVnaW9uKC8qcHJldmlld09ubHkqLyB0cnVlKTsKICAgICByZXR1cm4gKHkgKyAxMDAwKSAqIChwcmV2aWV3Q3JvcC5oZWlnaHQgLSAxKSAvIDIwMDA7CiB9CiAKQEAgLTI3NjksNiArMjc5MywxNyBAQAogICAgIHJldHVybiBtYXhTaXplOwogfQogCitQYXJhbWV0ZXJzOjpTaXplIFBhcmFtZXRlcnM6OmdldE1heFNpemUoY29uc3QgVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+ICZzaXplcykgeworICAgIFNpemUgbWF4U2l6ZSA9IHstMSwgLTF9OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKHNpemVzW2ldLndpZHRoID4gbWF4U2l6ZS53aWR0aCB8fAorICAgICAgICAgICAgICAgIChzaXplc1tpXS53aWR0aCA9PSBtYXhTaXplLndpZHRoICYmIHNpemVzW2ldLmhlaWdodCA+IG1heFNpemUuaGVpZ2h0ICkpIHsKKyAgICAgICAgICAgIG1heFNpemUgPSBzaXplc1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbWF4U2l6ZTsKK30KKwogVmVjdG9yPFBhcmFtZXRlcnM6OlN0cmVhbUNvbmZpZ3VyYXRpb24+IFBhcmFtZXRlcnM6OmdldFN0cmVhbUNvbmZpZ3VyYXRpb25zKCkgewogICAgIGNvbnN0IGludCBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFID0gNDsKICAgICBjb25zdCBpbnQgU1RSRUFNX0ZPUk1BVF9PRkZTRVQgPSAwOwpAQCAtMjc4Myw3ICsyODE4LDcgQEAKIAogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MgPQogICAgICAgICAgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7Ci0gICAgZm9yIChzaXplX3QgaT0wOyBpIDwgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudDsgaSs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuY291bnQ7IGkrPSBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFKSB7CiAgICAgICAgIGludDMyX3QgZm9ybWF0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOwogICAgICAgICBpbnQzMl90IHdpZHRoID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX1dJRFRIX09GRlNFVF07CiAgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0hFSUdIVF9PRkZTRVRdOwpAQCAtMjc5NCwxMSArMjgyOSw1MiBAQAogICAgIHJldHVybiBzY3M7CiB9CiAKK2ludDY0X3QgUGFyYW1ldGVyczo6Z2V0SnBlZ1N0cmVhbU1pbkZyYW1lRHVyYXRpb25OcyhQYXJhbWV0ZXJzOjpTaXplIHNpemUpIHsKKyAgICBpZiAobURldmljZVZlcnNpb24gPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKKyAgICAgICAgY29uc3QgaW50IFNUUkVBTV9EVVJBVElPTl9TSVpFID0gNDsKKyAgICAgICAgY29uc3QgaW50IFNUUkVBTV9GT1JNQVRfT0ZGU0VUID0gMDsKKyAgICAgICAgY29uc3QgaW50IFNUUkVBTV9XSURUSF9PRkZTRVQgPSAxOworICAgICAgICBjb25zdCBpbnQgU1RSRUFNX0hFSUdIVF9PRkZTRVQgPSAyOworICAgICAgICBjb25zdCBpbnQgU1RSRUFNX0RVUkFUSU9OX09GRlNFVCA9IDM7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZVN0cmVhbU1pbkR1cmF0aW9ucyA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY0luZm8oQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX01JTl9GUkFNRV9EVVJBVElPTlMpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZVN0cmVhbU1pbkR1cmF0aW9ucy5jb3VudDsgaSs9IFNUUkVBTV9EVVJBVElPTl9TSVpFKSB7CisgICAgICAgICAgICBpbnQ2NF90IGZvcm1hdCA9IGF2YWlsYWJsZVN0cmVhbU1pbkR1cmF0aW9ucy5kYXRhLmk2NFtpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAgICAgICAgaW50NjRfdCB3aWR0aCA9IGF2YWlsYWJsZVN0cmVhbU1pbkR1cmF0aW9ucy5kYXRhLmk2NFtpICsgU1RSRUFNX1dJRFRIX09GRlNFVF07CisgICAgICAgICAgICBpbnQ2NF90IGhlaWdodCA9IGF2YWlsYWJsZVN0cmVhbU1pbkR1cmF0aW9ucy5kYXRhLmk2NFtpICsgU1RSRUFNX0hFSUdIVF9PRkZTRVRdOworICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvbiA9IGF2YWlsYWJsZVN0cmVhbU1pbkR1cmF0aW9ucy5kYXRhLmk2NFtpICsgU1RSRUFNX0RVUkFUSU9OX09GRlNFVF07CisgICAgICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQiAmJiB3aWR0aCA9PSBzaXplLndpZHRoICYmIGhlaWdodCA9PSBzaXplLmhlaWdodCkgeworICAgICAgICAgICAgICAgIHJldHVybiBkdXJhdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIFZlY3RvcjxTaXplPiBhdmFpbGFibGVKcGVnU2l6ZXMgPSBnZXRBdmFpbGFibGVKcGVnU2l6ZXMoKTsKKyAgICAgICAgc2l6ZV90IHN0cmVhbUlkeCA9IGF2YWlsYWJsZUpwZWdTaXplcy5zaXplKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlSnBlZ1NpemVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXZhaWxhYmxlSnBlZ1NpemVzW2ldLndpZHRoID09IHNpemUud2lkdGggJiYKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSnBlZ1NpemVzW2ldLmhlaWdodCA9PSBzaXplLmhlaWdodCkgeworICAgICAgICAgICAgICAgIHN0cmVhbUlkeCA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmVhbUlkeCAhPSBhdmFpbGFibGVKcGVnU2l6ZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBqcGVnTWluRHVyYXRpb25zID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljSW5mbyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfSlBFR19NSU5fRFVSQVRJT05TKTsKKyAgICAgICAgICAgIGlmIChzdHJlYW1JZHggPCBqcGVnTWluRHVyYXRpb25zLmNvdW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGpwZWdNaW5EdXJhdGlvbnMuZGF0YS5pNjRbc3RyZWFtSWR4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HRSgiJXM6IGNhbm5vdCBmaW5kIG1pbiBmcmFtZSBkdXJhdGlvbiBmb3IganBlZyBzaXplICVkeCVkIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpOworICAgIHJldHVybiAtMTsKK30KKwogU29ydGVkVmVjdG9yPGludDMyX3Q+IFBhcmFtZXRlcnM6OmdldEF2YWlsYWJsZU91dHB1dEZvcm1hdHMoKSB7CiAgICAgU29ydGVkVmVjdG9yPGludDMyX3Q+IG91dHB1dEZvcm1hdHM7IC8vIE5vbi1kdXBsaWNhdGVkIG91dHB1dCBmb3JtYXRzCiAgICAgaWYgKG1EZXZpY2VWZXJzaW9uID49IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CiAgICAgICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBzY3MgPSBnZXRTdHJlYW1Db25maWd1cmF0aW9ucygpOwotICAgICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBzY3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzY3Muc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIGNvbnN0IFN0cmVhbUNvbmZpZ3VyYXRpb24gJnNjID0gc2NzW2ldOwogICAgICAgICAgICAgaWYgKHNjLmlzSW5wdXQgPT0gQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQpIHsKICAgICAgICAgICAgICAgICBvdXRwdXRGb3JtYXRzLmFkZChzYy5mb3JtYXQpOwpAQCAtMjgwNiw3ICsyODgyLDcgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZUZvcm1hdHMgPSBzdGF0aWNJbmZvKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9GT1JNQVRTKTsKLSAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgYXZhaWxhYmxlRm9ybWF0cy5jb3VudDsgaSsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlRm9ybWF0cy5jb3VudDsgaSsrKSB7CiAgICAgICAgICAgICBvdXRwdXRGb3JtYXRzLmFkZChhdmFpbGFibGVGb3JtYXRzLmRhdGEuaTMyW2ldKTsKICAgICAgICAgfQogICAgIH0KQEAgLTI4MTcsNyArMjg5Myw3IEBACiAgICAgVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IGpwZWdTaXplczsKICAgICBpZiAobURldmljZVZlcnNpb24gPj0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpIHsKICAgICAgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IHNjcyA9IGdldFN0cmVhbUNvbmZpZ3VyYXRpb25zKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IHNjcy5zaXplKCk7IGkrKykgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNjcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgY29uc3QgU3RyZWFtQ29uZmlndXJhdGlvbiAmc2MgPSBzY3NbaV07CiAgICAgICAgICAgICBpZiAoc2MuaXNJbnB1dCA9PSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVCAmJgogICAgICAgICAgICAgICAgICAgICBzYy5mb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CkBAIC0yODMxLDcgKzI5MDcsNyBAQAogICAgICAgICBjb25zdCBpbnQgSEVJR0hUX09GRlNFVCA9IDE7CiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZUpwZWdTaXplcyA9CiAgICAgICAgICAgICBzdGF0aWNJbmZvKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9KUEVHX1NJWkVTKTsKLSAgICAgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgYXZhaWxhYmxlSnBlZ1NpemVzLmNvdW50OyBpKz0gSlBFR19TSVpFX0VOVFJZX0NPVU5UKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlSnBlZ1NpemVzLmNvdW50OyBpKz0gSlBFR19TSVpFX0VOVFJZX0NPVU5UKSB7CiAgICAgICAgICAgICBpbnQgd2lkdGggPSBhdmFpbGFibGVKcGVnU2l6ZXMuZGF0YS5pMzJbaSArIFdJRFRIX09GRlNFVF07CiAgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gYXZhaWxhYmxlSnBlZ1NpemVzLmRhdGEuaTMyW2kgKyBIRUlHSFRfT0ZGU0VUXTsKICAgICAgICAgICAgIFNpemUgc3ogPSB7d2lkdGgsIGhlaWdodH07CkBAIC0yODQxLDggKzI5MTcsNyBAQAogICAgIHJldHVybiBqcGVnU2l6ZXM7CiB9CiAKLVBhcmFtZXRlcnM6OkNyb3BSZWdpb24gUGFyYW1ldGVyczo6Y2FsY3VsYXRlQ3JvcFJlZ2lvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzOjpDcm9wUmVnaW9uOjpPdXRwdXRzIG91dHB1dHMpIGNvbnN0IHsKK1BhcmFtZXRlcnM6OkNyb3BSZWdpb24gUGFyYW1ldGVyczo6Y2FsY3VsYXRlQ3JvcFJlZ2lvbihib29sIHByZXZpZXdPbmx5KSBjb25zdCB7CiAKICAgICBmbG9hdCB6b29tTGVmdCwgem9vbVRvcCwgem9vbVdpZHRoLCB6b29tSGVpZ2h0OwogCkBAIC0yODY2LDkwICsyOTQxLDQ1IEBACiAgICAgICAgICAgbWF4RGlnaXRhbFpvb20uZGF0YS5mWzBdLCB6b29tSW5jcmVtZW50LCB6b29tUmF0aW8sIHByZXZpZXdXaWR0aCwKICAgICAgICAgICBwcmV2aWV3SGVpZ2h0LCBmYXN0SW5mby5hcnJheVdpZHRoLCBmYXN0SW5mby5hcnJheUhlaWdodCk7CiAKLSAgICAvKgotICAgICAqIEFzc3VtcHRpb246IE9uIHRoZSBIQUwgc2lkZSBlYWNoIHN0cmVhbSBidWZmZXIgY2FsY3VsYXRlcyBpdHMgY3JvcAotICAgICAqIHJlY3RhbmdsZSBhcyBmb2xsb3dzOgotICAgICAqICAgY3JvcFJlY3QgPSAoem9vbUxlZnQsIHpvb21SaWdodCwKLSAgICAgKiAgICAgICAgICAgICAgIHpvb21XaWR0aCwgem9vbUhlaWdodCAqIHpvb21XaWR0aCAvIG91dHB1dFdpZHRoKTsKLSAgICAgKgotICAgICAqIE5vdGUgdGhhdCBpZiB6b29tV2lkdGggPiBidWZmZXJXaWR0aCwgdGhlIG5ldyBjcm9wSGVpZ2h0ID4gem9vbUhlaWdodAotICAgICAqICAgICAgKHdlIGNhbiB0aGVuIGdldCBpbnRvIHRyb3VibGUgaWYgdGhlIGNyb3BIZWlnaHQgPiBhcnJheUhlaWdodCkuCi0gICAgICogQnkgc2VsZWN0aW5nIHRoZSB6b29tUmF0aW8gYmFzZWQgb24gdGhlIHNtYWxsZXN0IG91dHB1dFJhdGlvLCB3ZQotICAgICAqIGd1YXJhbnRlZSB0aGlzIHdpbGwgbmV2ZXIgaGFwcGVuLgotICAgICAqLworICAgIGlmIChwcmV2aWV3T25seSkgeworICAgICAgICAvLyBDYWxjdWxhdGUgYSB0aWdodCBjcm9wIHJlZ2lvbiBmb3IgdGhlIHByZXZpZXcgc3RyZWFtIG9ubHkKKyAgICAgICAgZmxvYXQgcHJldmlld1JhdGlvID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHByZXZpZXdXaWR0aCkgLyBwcmV2aWV3SGVpZ2h0OwogCi0gICAgLy8gRW51bWVyYXRlIGFsbCBwb3NzaWJsZSBvdXRwdXQgc2l6ZXMsIHNlbGVjdCB0aGUgb25lIHdpdGggdGhlIHNtYWxsZXN0Ci0gICAgLy8gYXNwZWN0IHJhdGlvCi0gICAgZmxvYXQgbWluT3V0cHV0V2lkdGgsIG1pbk91dHB1dEhlaWdodCwgbWluT3V0cHV0UmF0aW87Ci0gICAgewotICAgICAgICBmbG9hdCBvdXRwdXRTaXplc1tdWzJdID0gewotICAgICAgICAgICAgeyBzdGF0aWNfY2FzdDxmbG9hdD4ocHJldmlld1dpZHRoKSwKLSAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHByZXZpZXdIZWlnaHQpIH0sCi0gICAgICAgICAgICB7IHN0YXRpY19jYXN0PGZsb2F0Pih2aWRlb1dpZHRoKSwKLSAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZpZGVvSGVpZ2h0KSB9LAotICAgICAgICAgICAgeyBzdGF0aWNfY2FzdDxmbG9hdD4oanBlZ1RodW1iU2l6ZVswXSksCi0gICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihqcGVnVGh1bWJTaXplWzFdKSB9LAotICAgICAgICAgICAgeyBzdGF0aWNfY2FzdDxmbG9hdD4ocGljdHVyZVdpZHRoKSwKLSAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBpY3R1cmVIZWlnaHQpIH0sCi0gICAgICAgIH07CisgICAgICAgIC8qIEVuc3VyZSB0aGF0IHRoZSB3aWR0aC9oZWlnaHQgbmV2ZXIgZ28gb3V0IG9mIGJvdW5kcworICAgICAgICAgKiBieSBzY2FsaW5nIGFjcm9zcyBhIGRpZmZlbnQgZGltZW5zaW9uIGlmIGFuIG91dC1vZi1ib3VuZHMKKyAgICAgICAgICogcG9zc2liaWxpdHkgZXhpc3RzLgorICAgICAgICAgKgorICAgICAgICAgKiBlLmcuIGlmIHRoZSBwcmV2aWV3cmF0aW8gPCBhcnJheXJhdGlvIGFuZCBlLmcuIHpvb21yYXRpbyA9IDEuMCwgdGhlbiBieQorICAgICAgICAgKiBjYWxjdWxhdGluZyB0aGUgem9vbVdpZHRoIGZyb20gem9vbUhlaWdodCB3ZSdsbCBhY3R1YWxseSBnZXQgYQorICAgICAgICAgKiB6b29taGVpZ2h0ID4gYXJyYXloZWlnaHQKKyAgICAgICAgICovCisgICAgICAgIGZsb2F0IGFycmF5UmF0aW8gPSAxLmYgKiBmYXN0SW5mby5hcnJheVdpZHRoIC8gZmFzdEluZm8uYXJyYXlIZWlnaHQ7CisgICAgICAgIGlmIChwcmV2aWV3UmF0aW8gPj0gYXJyYXlSYXRpbykgeworICAgICAgICAgICAgLy8gQWRqdXN0IHRoZSBoZWlnaHQgYmFzZWQgb24gdGhlIHdpZHRoCisgICAgICAgICAgICB6b29tV2lkdGggPSAgZmFzdEluZm8uYXJyYXlXaWR0aCAvIHpvb21SYXRpbzsKKyAgICAgICAgICAgIHpvb21IZWlnaHQgPSB6b29tV2lkdGggKgorICAgICAgICAgICAgICAgICAgICBwcmV2aWV3SGVpZ2h0IC8gcHJldmlld1dpZHRoOwogCi0gICAgICAgIG1pbk91dHB1dFdpZHRoID0gb3V0cHV0U2l6ZXNbMF1bMF07Ci0gICAgICAgIG1pbk91dHB1dEhlaWdodCA9IG91dHB1dFNpemVzWzBdWzFdOwotICAgICAgICBtaW5PdXRwdXRSYXRpbyA9IG1pbk91dHB1dFdpZHRoIC8gbWluT3V0cHV0SGVpZ2h0OwotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsKLSAgICAgICAgICAgICBpIDwgc2l6ZW9mKG91dHB1dFNpemVzKSAvIHNpemVvZihvdXRwdXRTaXplc1swXSk7Ci0gICAgICAgICAgICAgKytpKSB7Ci0KLSAgICAgICAgICAgIC8vIHNraXAgb3ZlciBvdXRwdXRzIHdlIGRvbid0IHdhbnQgdG8gY29uc2lkZXIgZm9yIHRoZSBjcm9wIHJlZ2lvbgotICAgICAgICAgICAgaWYgKCAhKCgxIDw8IGkpICYgb3V0cHV0cykgKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZsb2F0IG91dHB1dFdpZHRoID0gb3V0cHV0U2l6ZXNbaV1bMF07Ci0gICAgICAgICAgICBmbG9hdCBvdXRwdXRIZWlnaHQgPSBvdXRwdXRTaXplc1tpXVsxXTsKLSAgICAgICAgICAgIGZsb2F0IG91dHB1dFJhdGlvID0gb3V0cHV0V2lkdGggLyBvdXRwdXRIZWlnaHQ7Ci0KLSAgICAgICAgICAgIGlmIChtaW5PdXRwdXRSYXRpbyA+IG91dHB1dFJhdGlvKSB7Ci0gICAgICAgICAgICAgICAgbWluT3V0cHV0UmF0aW8gPSBvdXRwdXRSYXRpbzsKLSAgICAgICAgICAgICAgICBtaW5PdXRwdXRXaWR0aCA9IG91dHB1dFdpZHRoOwotICAgICAgICAgICAgICAgIG1pbk91dHB1dEhlaWdodCA9IG91dHB1dEhlaWdodDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYW5kIHRoZW4gdXNlIHRoaXMgb3V0cHV0IHJhdGlvIGluc3RlYWQgb2YgcHJldmlldyBvdXRwdXQgcmF0aW8KLSAgICAgICAgICAgIEFMT0dWKCJFbnVtZXJhdGluZyBvdXRwdXQgcmF0aW8gJWYgPSAlZiAvICVmLCBtaW4gaXMgJWYiLAotICAgICAgICAgICAgICAgICAgb3V0cHV0UmF0aW8sIG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQsIG1pbk91dHB1dFJhdGlvKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEFkanVzdCB0aGUgd2lkdGggYmFzZWQgb24gdGhlIGhlaWdodAorICAgICAgICAgICAgem9vbUhlaWdodCA9IGZhc3RJbmZvLmFycmF5SGVpZ2h0IC8gem9vbVJhdGlvOworICAgICAgICAgICAgem9vbVdpZHRoID0gem9vbUhlaWdodCAqCisgICAgICAgICAgICAgICAgICAgIHByZXZpZXdXaWR0aCAvIHByZXZpZXdIZWlnaHQ7CiAgICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBFbnN1cmUgdGhhdCB0aGUgd2lkdGgvaGVpZ2h0IG5ldmVyIGdvIG91dCBvZiBib3VuZHMKLSAgICAgKiBieSBzY2FsaW5nIGFjcm9zcyBhIGRpZmZlbnQgZGltZW5zaW9uIGlmIGFuIG91dC1vZi1ib3VuZHMKLSAgICAgKiBwb3NzaWJpbGl0eSBleGlzdHMuCi0gICAgICoKLSAgICAgKiBlLmcuIGlmIHRoZSBwcmV2aWV3cmF0aW8gPCBhcnJheXJhdGlvIGFuZCBlLmcuIHpvb21yYXRpbyA9IDEuMCwgdGhlbiBieQotICAgICAqIGNhbGN1bGF0aW5nIHRoZSB6b29tV2lkdGggZnJvbSB6b29tSGVpZ2h0IHdlJ2xsIGFjdHVhbGx5IGdldCBhCi0gICAgICogem9vbWhlaWdodCA+IGFycmF5aGVpZ2h0Ci0gICAgICovCi0gICAgZmxvYXQgYXJyYXlSYXRpbyA9IDEuZiAqIGZhc3RJbmZvLmFycmF5V2lkdGggLyBmYXN0SW5mby5hcnJheUhlaWdodDsKLSAgICBpZiAobWluT3V0cHV0UmF0aW8gPj0gYXJyYXlSYXRpbykgewotICAgICAgICAvLyBBZGp1c3QgdGhlIGhlaWdodCBiYXNlZCBvbiB0aGUgd2lkdGgKLSAgICAgICAgem9vbVdpZHRoID0gIGZhc3RJbmZvLmFycmF5V2lkdGggLyB6b29tUmF0aW87Ci0gICAgICAgIHpvb21IZWlnaHQgPSB6b29tV2lkdGggKgotICAgICAgICAgICAgICAgIG1pbk91dHB1dEhlaWdodCAvIG1pbk91dHB1dFdpZHRoOwotCiAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQWRqdXN0IHRoZSB3aWR0aCBiYXNlZCBvbiB0aGUgaGVpZ2h0CisgICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZ2xvYmFsIGNyb3AgcmVnaW9uIHdpdGggYSBzaGFwZSBtYXRjaGluZyB0aGUgYWN0aXZlCisgICAgICAgIC8vIGFycmF5LgorICAgICAgICB6b29tV2lkdGggPSBmYXN0SW5mby5hcnJheVdpZHRoIC8gem9vbVJhdGlvOwogICAgICAgICB6b29tSGVpZ2h0ID0gZmFzdEluZm8uYXJyYXlIZWlnaHQgLyB6b29tUmF0aW87Ci0gICAgICAgIHpvb21XaWR0aCA9IHpvb21IZWlnaHQgKgotICAgICAgICAgICAgICAgIG1pbk91dHB1dFdpZHRoIC8gbWluT3V0cHV0SGVpZ2h0OwogICAgIH0KLSAgICAvLyBjZW50ZXJpbmcgdGhlIHpvb20gYXJlYSB3aXRoaW4gdGhlIGFjdGl2ZSBhcmVhCisKKyAgICAvLyBjZW50ZXIgdGhlIHpvb20gYXJlYSB3aXRoaW4gdGhlIGFjdGl2ZSBhcmVhCiAgICAgem9vbUxlZnQgPSAoZmFzdEluZm8uYXJyYXlXaWR0aCAtIHpvb21XaWR0aCkgLyAyOwogICAgIHpvb21Ub3AgPSAoZmFzdEluZm8uYXJyYXlIZWlnaHQgLSB6b29tSGVpZ2h0KSAvIDI7CiAKICAgICBBTE9HVigiQ3JvcCByZWdpb24gY2FsY3VsYXRlZCAoeD0lZCx5PSVkLHc9JWYsaD0lZikgZm9yIHpvb209JWQiLAogICAgICAgICAoaW50MzJfdCl6b29tTGVmdCwgKGludDMyX3Qpem9vbVRvcCwgem9vbVdpZHRoLCB6b29tSGVpZ2h0LCB0aGlzLT56b29tKTsKIAotCiAgICAgQ3JvcFJlZ2lvbiBjcm9wID0geyB6b29tTGVmdCwgem9vbVRvcCwgem9vbVdpZHRoLCB6b29tSGVpZ2h0IH07CiAgICAgcmV0dXJuIGNyb3A7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaAppbmRleCBlNjI4YTdlLi45NzJkMDA3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKQEAgLTE2Niw2ICsxNjYsOSBAQAogICAgIGJvb2wgcHJldmlld0NhbGxiYWNrU3VyZmFjZTsKIAogICAgIGJvb2wgenNsTW9kZTsKKyAgICAvLyBXaGV0aGVyIHRoZSBqcGVnIHN0cmVhbSBpcyBzbG93ZXIgdGhhbiAzMEZQUyBhbmQgY2FuIHNsb3cgZG93biBwcmV2aWV3LgorICAgIC8vIFdoZW4gc2xvd0pwZWdNb2RlIGlzIHRydWUsIHpzbE1vZGUgbXVzdCBiZSBmYWxzZSB0byBhdm9pZCBzbG93aW5nIGRvd24gcHJldmlldy4KKyAgICBib29sIHNsb3dKcGVnTW9kZTsKIAogICAgIC8vIE92ZXJhbGwgY2FtZXJhIHN0YXRlCiAgICAgZW51bSBTdGF0ZSB7CkBAIC0xOTAsNiArMTkzLDggQEAKICAgICBzdGF0aWMgY29uc3QgaW50IE1BWF9JTklUSUFMX1BSRVZJRVdfSEVJR0hUID0gMTA4MDsKICAgICAvLyBBc3BlY3QgcmF0aW8gdG9sZXJhbmNlCiAgICAgc3RhdGljIGNvbnN0IENPTlNURVhQUiBmbG9hdCBBU1BFQ1RfUkFUSU9fVE9MRVJBTkNFID0gMC4wMDE7CisgICAgLy8gVGhyZXNob2xkIGZvciBzbG93IGpwZWcgbW9kZQorICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtTbG93SnBlZ01vZGVUaHJlc2hvbGQgPSAzMzQwMDAwMExMOyAvLyAzMy40IG1zCiAKICAgICAvLyBGdWxsIHN0YXRpYyBjYW1lcmEgaW5mbywgb2JqZWN0IG93bmVkIGJ5IHNvbWVvbmUgZWxzZSwgc3VjaCBhcwogICAgIC8vIENhbWVyYTJEZXZpY2UuCkBAIC0yNzEsMjEgKzI3NiwxNiBAQAogICAgIC8vIGlmIHZpZGVvIHNuYXBzaG90IHNpemUgaXMgY3VycmVudGx5IG92ZXJyaWRkZW4KICAgICBib29sIGlzSnBlZ1NpemVPdmVycmlkZGVuKCk7CiAKLSAgICAvLyBDYWxjdWxhdGUgdGhlIGNyb3AgcmVnaW9uIHJlY3RhbmdsZSBiYXNlZCBvbiBjdXJyZW50IHN0cmVhbSBzaXplcworICAgIC8vIENhbGN1bGF0ZSB0aGUgY3JvcCByZWdpb24gcmVjdGFuZ2xlLCBlaXRoZXIgdGlnaHRseSBhYm91dCB0aGUgcHJldmlldworICAgIC8vIHJlc29sdXRpb24sIG9yIGEgcmVnaW9uIGp1c3QgYmFzZWQgb24gdGhlIGFjdGl2ZSBhcnJheTsgYm90aCB0YWtlCisgICAgLy8gaW50byBhY2NvdW50IHRoZSBjdXJyZW50IHpvb20gbGV2ZWwuCiAgICAgc3RydWN0IENyb3BSZWdpb24gewogICAgICAgICBmbG9hdCBsZWZ0OwogICAgICAgICBmbG9hdCB0b3A7CiAgICAgICAgIGZsb2F0IHdpZHRoOwogICAgICAgICBmbG9hdCBoZWlnaHQ7Ci0KLSAgICAgICAgZW51bSBPdXRwdXRzIHsKLSAgICAgICAgICAgIE9VVFBVVF9QUkVWSUVXICAgICAgICAgPSAweDAxLAotICAgICAgICAgICAgT1VUUFVUX1ZJREVPICAgICAgICAgICA9IDB4MDIsCi0gICAgICAgICAgICBPVVRQVVRfSlBFR19USFVNQk5BSUwgID0gMHgwNCwKLSAgICAgICAgICAgIE9VVFBVVF9QSUNUVVJFICAgICAgICAgPSAweDA4LAotICAgICAgICB9OwogICAgIH07Ci0gICAgQ3JvcFJlZ2lvbiBjYWxjdWxhdGVDcm9wUmVnaW9uKENyb3BSZWdpb246Ok91dHB1dHMgb3V0cHV0cykgY29uc3Q7CisgICAgQ3JvcFJlZ2lvbiBjYWxjdWxhdGVDcm9wUmVnaW9uKGJvb2wgcHJldmlld09ubHkpIGNvbnN0OwogCiAgICAgLy8gQ2FsY3VsYXRlIHRoZSBmaWVsZCBvZiB2aWV3IG9mIHRoZSBoaWdoLXJlc29sdXRpb24gSlBFRyBjYXB0dXJlCiAgICAgc3RhdHVzX3QgY2FsY3VsYXRlUGljdHVyZUZvdnMoZmxvYXQgKmhvcml6Rm92LCBmbG9hdCAqdmVydEZvdikgY29uc3Q7CkBAIC0zODIsMTUgKzM4MiwyMyBAQAogICAgICAgICBpbnQzMl90IGhlaWdodDsKICAgICAgICAgaW50MzJfdCBpc0lucHV0OwogICAgIH07CisKICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gZXh0cmFjdCBhdmFpbGFibGUgc3RyZWFtIGNvbmZpZ3VyYXRpb24KICAgICAvLyBPbmx5IHZhbGlkIHNpbmNlIGRldmljZSBIQUwgdmVyc2lvbiAzLjIKICAgICAvLyByZXR1cm5zIGFuIGVtcHR5IFZlY3RvciBpZiBkZXZpY2UgSEFMIHZlcnNpb24gZG9lcyBzdXBwb3J0IGl0CiAgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IGdldFN0cmVhbUNvbmZpZ3VyYXRpb25zKCk7CiAKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IG1pbmltdW0gZnJhbWUgZHVyYXRpb24gZm9yIGEganBlZyBzaXplCisgICAgLy8gcmV0dXJuIC0xIGlmIGlucHV0IGpwZWcgc2l6ZSBjYW5ub3QgYmUgZm91bmQgaW4gc3VwcG9ydGVkIHNpemUgbGlzdAorICAgIGludDY0X3QgZ2V0SnBlZ1N0cmVhbU1pbkZyYW1lRHVyYXRpb25OcyhQYXJhbWV0ZXJzOjpTaXplIHNpemUpOworCiAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBub24tZHVwbGljYXRlZCBhdmFpbGFibGUgb3V0cHV0IGZvcm1hdHMKICAgICBTb3J0ZWRWZWN0b3I8aW50MzJfdD4gZ2V0QXZhaWxhYmxlT3V0cHV0Rm9ybWF0cygpOwogICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgYXZhaWxhYmxlIG91dHB1dCBqcGVnIHNpemVzCiAgICAgVmVjdG9yPFNpemU+IGdldEF2YWlsYWJsZUpwZWdTaXplcygpOworICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgbWF4aW11bSBzaXplIGluIGlucHV0IFNpemUgdmVjdG9yLgorICAgIC8vIFRoZSBtYXhpbXVtIHNpemUgaXMgZGVmaW5lZCBieSBjb21wYXJpbmcgd2lkdGggZmlyc3QsIHdoZW4gd2lkdGggdGllcyBjb21wYXJpbmcgaGVpZ2h0LgorICAgIFNpemUgZ2V0TWF4U2l6ZShjb25zdCBWZWN0b3I8U2l6ZT4mIHNpemVzKTsKIAogICAgIGludCBtRGV2aWNlVmVyc2lvbjsKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwCmluZGV4IDE0NmQ1NzIuLjllNmMwZGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwCkBAIC0yNSwxMSArMjUsMTMgQEAKICNkZWZpbmUgQUxPR1ZWKC4uLikgKCh2b2lkKTApCiAjZW5kaWYKIAorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDxndWkvQnVmZmVySXRlbS5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0lDYW1lcmFSZWNvcmRpbmdQcm94eS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAKICNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgogI2luY2x1ZGUgImFwaTEvQ2FtZXJhMkNsaWVudC5oIgpAQCAtNTEsNyArNTMsMTAgQEAKICAgICAgICAgbVJlY29yZGluZ1N0cmVhbUlkKE5PX1NUUkVBTSksCiAgICAgICAgIG1SZWNvcmRpbmdGcmFtZUF2YWlsYWJsZShmYWxzZSksCiAgICAgICAgIG1SZWNvcmRpbmdIZWFwQ291bnQoa0RlZmF1bHRSZWNvcmRpbmdIZWFwQ291bnQpLAotICAgICAgICBtUmVjb3JkaW5nSGVhcEZyZWUoa0RlZmF1bHRSZWNvcmRpbmdIZWFwQ291bnQpCisgICAgICAgIG1SZWNvcmRpbmdIZWFwRnJlZShrRGVmYXVsdFJlY29yZGluZ0hlYXBDb3VudCksCisgICAgICAgIG1SZWNvcmRpbmdGb3JtYXQoa0RlZmF1bHRSZWNvcmRpbmdGb3JtYXQpLAorICAgICAgICBtUmVjb3JkaW5nRGF0YVNwYWNlKGtEZWZhdWx0UmVjb3JkaW5nRGF0YVNwYWNlKSwKKyAgICAgICAgbVJlY29yZGluZ0dyYWxsb2NVc2FnZShrRGVmYXVsdFJlY29yZGluZ0dyYWxsb2NVc2FnZSkKIHsKIH0KIApAQCAtNjAsNyArNjUsNyBAQAogICAgIGRlbGV0ZVJlY29yZGluZ1N0cmVhbSgpOwogfQogCi1zdGF0dXNfdCBTdHJlYW1pbmdQcm9jZXNzb3I6OnNldFByZXZpZXdXaW5kb3coc3A8QU5hdGl2ZVdpbmRvdz4gd2luZG93KSB7CitzdGF0dXNfdCBTdHJlYW1pbmdQcm9jZXNzb3I6OnNldFByZXZpZXdXaW5kb3coc3A8U3VyZmFjZT4gd2luZG93KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CiAKQEAgLTE1MSw3ICsxNTYsNyBAQAogICAgICAgICAvLyBDaGVjayBpZiBzdHJlYW0gcGFyYW1ldGVycyBoYXZlIHRvIGNoYW5nZQogICAgICAgICB1aW50MzJfdCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQ7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtUHJldmlld1N0cmVhbUlkLAotICAgICAgICAgICAgICAgICZjdXJyZW50V2lkdGgsICZjdXJyZW50SGVpZ2h0LCAwKTsKKyAgICAgICAgICAgICAgICAmY3VycmVudFdpZHRoLCAmY3VycmVudEhlaWdodCwgMCwgMCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBFcnJvciBxdWVyeWluZyBwcmV2aWV3IHN0cmVhbSBpbmZvOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMTgyLDcgKzE4Nyw4IEBACiAgICAgaWYgKG1QcmV2aWV3U3RyZWFtSWQgPT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1QcmV2aWV3V2luZG93LAogICAgICAgICAgICAgICAgIHBhcmFtcy5wcmV2aWV3V2lkdGgsIHBhcmFtcy5wcmV2aWV3SGVpZ2h0LAotICAgICAgICAgICAgICAgIENBTUVSQTJfSEFMX1BJWEVMX0ZPUk1BVF9PUEFRVUUsICZtUHJldmlld1N0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBDQU1FUkEyX0hBTF9QSVhFTF9GT1JNQVRfT1BBUVVFLCBIQUxfREFUQVNQQUNFX1VOS05PV04sCisgICAgICAgICAgICAgICAgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwgJm1QcmV2aWV3U3RyZWFtSWQpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIGNyZWF0ZSBwcmV2aWV3IHN0cmVhbTogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTI3OSw2ICsyODUsNDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IFN0cmVhbWluZ1Byb2Nlc3Nvcjo6c2V0UmVjb3JkaW5nRm9ybWF0KGludCBmb3JtYXQsCisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSkgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbShtTXV0ZXgpOworCisgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IE5ldyByZWNvcmRpbmcgZm9ybWF0L2RhdGFzcGFjZSBmcm9tIGVuY29kZXI6ICVYLCAlWCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgZm9ybWF0LCBkYXRhU3BhY2UpOworCisgICAgbVJlY29yZGluZ0Zvcm1hdCA9IGZvcm1hdDsKKyAgICBtUmVjb3JkaW5nRGF0YVNwYWNlID0gZGF0YVNwYWNlOworICAgIGludCBwcmV2R3JhbGxvY1VzYWdlID0gbVJlY29yZGluZ0dyYWxsb2NVc2FnZTsKKyAgICBpZiAobVJlY29yZGluZ0Zvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpIHsKKyAgICAgICAgbVJlY29yZGluZ0dyYWxsb2NVc2FnZSA9IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUjsKKyAgICB9IGVsc2UgeworICAgICAgICBtUmVjb3JkaW5nR3JhbGxvY1VzYWdlID0gR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOOworICAgIH0KKworICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBOZXcgcmVjb3JkaW5nIGdyYWxsb2MgdXNhZ2U6ICUwOFgiLCBfX0ZVTkNUSU9OX18sIG1JZCwKKyAgICAgICAgICAgIG1SZWNvcmRpbmdHcmFsbG9jVXNhZ2UpOworCisgICAgaWYgKHByZXZHcmFsbG9jVXNhZ2UgIT0gbVJlY29yZGluZ0dyYWxsb2NVc2FnZSkgeworICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogUmVzZXR0aW5nIHJlY29yZGluZyBjb25zdW1lciBmb3IgbmV3IHVzYWdlIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkKTsKKworICAgICAgICBpZiAoaXNTdHJlYW1BY3RpdmUobUFjdGl2ZVN0cmVhbUlkcywgbVJlY29yZGluZ1N0cmVhbUlkKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENoYW5naW5nIHJlY29yZGluZyBmb3JtYXQgd2hlbiAiCisgICAgICAgICAgICAgICAgICAgICJyZWNvcmRpbmcgc3RyZWFtIGlzIGFscmVhZHkgYWN0aXZlISIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgbUlkKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCisgICAgICAgIHJlbGVhc2VBbGxSZWNvcmRpbmdGcmFtZXNMb2NrZWQoKTsKKworICAgICAgICBtUmVjb3JkaW5nQ29uc3VtZXIuY2xlYXIoKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IFN0cmVhbWluZ1Byb2Nlc3Nvcjo6dXBkYXRlUmVjb3JkaW5nUmVxdWVzdChjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIHN0YXR1c190IHJlczsKQEAgLTMzOSw5ICszODUsMTAgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHVpbnQzMl90IGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodDsKKyAgICB1aW50MzJfdCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQsIGN1cnJlbnRGb3JtYXQ7CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgY3VycmVudERhdGFTcGFjZTsKICAgICByZXMgPSBkZXZpY2UtPmdldFN0cmVhbUluZm8obVJlY29yZGluZ1N0cmVhbUlkLAotICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsIDApOworICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsICZjdXJyZW50Rm9ybWF0LCAmY3VycmVudERhdGFTcGFjZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRXJyb3IgcXVlcnlpbmcgcmVjb3JkaW5nIG91dHB1dCBzdHJlYW0gaW5mbzogIgogICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCkBAIC0zNDksOCArMzk2LDExIEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgaWYgKG1SZWNvcmRpbmdDb25zdW1lciA9PSAwIHx8IGN1cnJlbnRXaWR0aCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvV2lkdGggfHwKLSAgICAgICAgICAgIGN1cnJlbnRIZWlnaHQgIT0gKHVpbnQzMl90KXBhcmFtcy52aWRlb0hlaWdodCkgeworICAgIGlmIChtUmVjb3JkaW5nQ29uc3VtZXIgPT0gMCB8fAorICAgICAgICAgICAgY3VycmVudFdpZHRoICE9ICh1aW50MzJfdClwYXJhbXMudmlkZW9XaWR0aCB8fAorICAgICAgICAgICAgY3VycmVudEhlaWdodCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvSGVpZ2h0IHx8CisgICAgICAgICAgICBjdXJyZW50Rm9ybWF0ICE9ICh1aW50MzJfdCltUmVjb3JkaW5nRm9ybWF0IHx8CisgICAgICAgICAgICBjdXJyZW50RGF0YVNwYWNlICE9IG1SZWNvcmRpbmdEYXRhU3BhY2UpIHsKICAgICAgICAgKm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgICB9CiAgICAgKm5lZWRzVXBkYXRlID0gZmFsc2U7CkBAIC0zNzksNyArNDI5LDcgQEAKICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CiAgICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CiAgICAgICAgIG1SZWNvcmRpbmdDb25zdW1lciA9IG5ldyBCdWZmZXJJdGVtQ29uc3VtZXIoY29uc3VtZXIsCi0gICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSLAorICAgICAgICAgICAgICAgIG1SZWNvcmRpbmdHcmFsbG9jVXNhZ2UsCiAgICAgICAgICAgICAgICAgbVJlY29yZGluZ0hlYXBDb3VudCArIDEpOwogICAgICAgICBtUmVjb3JkaW5nQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CiAgICAgICAgIG1SZWNvcmRpbmdDb25zdW1lci0+c2V0TmFtZShTdHJpbmc4KCJDYW1lcmEyLVJlY29yZGluZ0NvbnN1bWVyIikpOwpAQCAtMzkxLDggKzQ0MSwxMSBAQAogICAgIGlmIChtUmVjb3JkaW5nU3RyZWFtSWQgIT0gTk9fU1RSRUFNKSB7CiAgICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBwYXJhbWV0ZXJzIGhhdmUgdG8gY2hhbmdlCiAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodDsKKyAgICAgICAgdWludDMyX3QgY3VycmVudEZvcm1hdDsKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgY3VycmVudERhdGFTcGFjZTsKICAgICAgICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1SZWNvcmRpbmdTdHJlYW1JZCwKLSAgICAgICAgICAgICAgICAmY3VycmVudFdpZHRoLCAmY3VycmVudEhlaWdodCwgMCk7CisgICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsCisgICAgICAgICAgICAgICAgJmN1cnJlbnRGb3JtYXQsICZjdXJyZW50RGF0YVNwYWNlKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHF1ZXJ5aW5nIHJlY29yZGluZyBvdXRwdXQgc3RyZWFtIGluZm86ICIKICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKQEAgLTQwMCw3ICs0NTMsMTAgQEAKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGN1cnJlbnRXaWR0aCAhPSAodWludDMyX3QpcGFyYW1zLnZpZGVvV2lkdGggfHwKLSAgICAgICAgICAgICAgICBjdXJyZW50SGVpZ2h0ICE9ICh1aW50MzJfdClwYXJhbXMudmlkZW9IZWlnaHQgfHwgbmV3Q29uc3VtZXIpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50SGVpZ2h0ICE9ICh1aW50MzJfdClwYXJhbXMudmlkZW9IZWlnaHQgfHwKKyAgICAgICAgICAgICAgICBjdXJyZW50Rm9ybWF0ICE9ICh1aW50MzJfdCltUmVjb3JkaW5nRm9ybWF0IHx8CisgICAgICAgICAgICAgICAgY3VycmVudERhdGFTcGFjZSAhPSBtUmVjb3JkaW5nRGF0YVNwYWNlIHx8CisgICAgICAgICAgICAgICAgbmV3Q29uc3VtZXIpIHsKICAgICAgICAgICAgIC8vIFRPRE86IFNob3VsZCB3YWl0IHRvIGJlIHN1cmUgcHJldmlvdXMgcmVjb3JkaW5nIGhhcyBmaW5pc2hlZAogICAgICAgICAgICAgcmVzID0gZGV2aWNlLT5kZWxldGVTdHJlYW0obVJlY29yZGluZ1N0cmVhbUlkKTsKIApAQCAtNDIzLDcgKzQ3OSw4IEBACiAgICAgICAgIG1SZWNvcmRpbmdGcmFtZUNvdW50ID0gMDsKICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obVJlY29yZGluZ1dpbmRvdywKICAgICAgICAgICAgICAgICBwYXJhbXMudmlkZW9XaWR0aCwgcGFyYW1zLnZpZGVvSGVpZ2h0LAotICAgICAgICAgICAgICAgIENBTUVSQTJfSEFMX1BJWEVMX0ZPUk1BVF9PUEFRVUUsICZtUmVjb3JkaW5nU3RyZWFtSWQpOworICAgICAgICAgICAgICAgIG1SZWNvcmRpbmdGb3JtYXQsIG1SZWNvcmRpbmdEYXRhU3BhY2UsCisgICAgICAgICAgICAgICAgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwgJm1SZWNvcmRpbmdTdHJlYW1JZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBjcmVhdGUgb3V0cHV0IHN0cmVhbSBmb3IgcmVjb3JkaW5nOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsCkBAIC03MTgsMTIgKzc3NSwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKG1SZWNvcmRpbmdIZWFwID09IDApIHsKLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBidWZmZXJTaXplID0gNCArIHNpemVvZihidWZmZXJfaGFuZGxlX3QpOworICAgICAgICAgICAgc2l6ZV90IHBheWxvYWRTaXplID0gc2l6ZW9mKFZpZGVvTmF0aXZlTWV0YWRhdGEpOwogICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IENyZWF0aW5nIHJlY29yZGluZyBoZWFwIHdpdGggJXp1IGJ1ZmZlcnMgb2YgIgogICAgICAgICAgICAgICAgICAgICAic2l6ZSAlenUgYnl0ZXMiLCBfX0ZVTkNUSU9OX18sIG1JZCwKLSAgICAgICAgICAgICAgICAgICAgbVJlY29yZGluZ0hlYXBDb3VudCwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1SZWNvcmRpbmdIZWFwQ291bnQsIHBheWxvYWRTaXplKTsKIAotICAgICAgICAgICAgbVJlY29yZGluZ0hlYXAgPSBuZXcgQ2FtZXJhMkhlYXAoYnVmZmVyU2l6ZSwgbVJlY29yZGluZ0hlYXBDb3VudCwKKyAgICAgICAgICAgIG1SZWNvcmRpbmdIZWFwID0gbmV3IENhbWVyYTJIZWFwKHBheWxvYWRTaXplLCBtUmVjb3JkaW5nSGVhcENvdW50LAogICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhMkNsaWVudDo6UmVjb3JkaW5nSGVhcCIpOwogICAgICAgICAgICAgaWYgKG1SZWNvcmRpbmdIZWFwLT5tSGVhcC0+Z2V0U2l6ZSgpID09IDApIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVjb3JkaW5nIiwKQEAgLTc0Niw3ICs4MDMsNyBAQAogICAgICAgICAgICAgbVJlY29yZGluZ0hlYXBGcmVlID0gbVJlY29yZGluZ0hlYXBDb3VudDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICggbVJlY29yZGluZ0hlYXBGcmVlID09IDApIHsKKyAgICAgICAgaWYgKG1SZWNvcmRpbmdIZWFwRnJlZSA9PSAwKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogTm8gZnJlZSByZWNvcmRpbmcgYnVmZmVycywgZHJvcHBpbmcgZnJhbWUiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCk7CiAgICAgICAgICAgICBtUmVjb3JkaW5nQ29uc3VtZXItPnJlbGVhc2VCdWZmZXIoaW1nQnVmZmVyKTsKQEAgLTc2NiwxMyArODIzLDE4IEBACiAgICAgICAgICAgICAgICAgbVJlY29yZGluZ0hlYXAtPm1CdWZmZXJzW2hlYXBJZHhdLT5nZXRNZW1vcnkoJm9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKIAotICAgICAgICB1aW50OF90ICpkYXRhID0gKHVpbnQ4X3QqKWhlYXAtPmdldEJhc2UoKSArIG9mZnNldDsKLSAgICAgICAgdWludDMyX3QgdHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlOwotICAgICAgICAqKCh1aW50MzJfdCopZGF0YSkgPSB0eXBlOwotICAgICAgICAqKChidWZmZXJfaGFuZGxlX3QqKShkYXRhICsgNCkpID0gaW1nQnVmZmVyLm1HcmFwaGljQnVmZmVyLT5oYW5kbGU7Ci0gICAgICAgIEFMT0dWVigiJXM6IENhbWVyYSAlZDogU2VuZGluZyBvdXQgYnVmZmVyX2hhbmRsZV90ICVwIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwKLSAgICAgICAgICAgICAgICBpbWdCdWZmZXIubUdyYXBoaWNCdWZmZXItPmhhbmRsZSk7CisgICAgICAgIFZpZGVvTmF0aXZlTWV0YWRhdGEgKnBheWxvYWQgPSByZWludGVycHJldF9jYXN0PFZpZGVvTmF0aXZlTWV0YWRhdGEqPigKKyAgICAgICAgICAgICh1aW50OF90KiloZWFwLT5nZXRCYXNlKCkgKyBvZmZzZXQpOworICAgICAgICBwYXlsb2FkLT5lVHlwZSA9IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXI7CisgICAgICAgIHBheWxvYWQtPnBCdWZmZXIgPSBpbWdCdWZmZXIubUdyYXBoaWNCdWZmZXItPmdldE5hdGl2ZUJ1ZmZlcigpOworICAgICAgICAvLyBiLzI4NDY2NzAxCisgICAgICAgIHBheWxvYWQtPnBCdWZmZXIgPSAoQU5hdGl2ZVdpbmRvd0J1ZmZlciopKCh1aW50OF90KilwYXlsb2FkLT5wQnVmZmVyIC0KKyAgICAgICAgICAgICAgICBJQ2FtZXJhUmVjb3JkaW5nUHJveHk6OmdldENvbW1vbkJhc2VBZGRyZXNzKCkpOworICAgICAgICBwYXlsb2FkLT5uRmVuY2VGZCA9IC0xOworCisgICAgICAgIEFMT0dWVigiJXM6IENhbWVyYSAlZDogU2VuZGluZyBvdXQgQU5XQnVmZmVyICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgcGF5bG9hZC0+cEJ1ZmZlcik7CisKICAgICAgICAgbVJlY29yZGluZ0J1ZmZlcnMucmVwbGFjZUF0KGltZ0J1ZmZlciwgaGVhcElkeCk7CiAgICAgICAgIHJlY29yZGluZ0hlYXAgPSBtUmVjb3JkaW5nSGVhcDsKICAgICB9CkBAIC04MDUsNDIgKzg2Nyw0NiBAQAogICAgICAgICAgICAgICAgIGhlYXAtPmdldEhlYXBJRCgpLCBtUmVjb3JkaW5nSGVhcC0+bUhlYXAtPmdldEhlYXBJRCgpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICB1aW50OF90ICpkYXRhID0gKHVpbnQ4X3QqKWhlYXAtPmdldEJhc2UoKSArIG9mZnNldDsKLSAgICB1aW50MzJfdCB0eXBlID0gKih1aW50MzJfdCopZGF0YTsKLSAgICBpZiAodHlwZSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgeworCisgICAgVmlkZW9OYXRpdmVNZXRhZGF0YSAqcGF5bG9hZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VmlkZW9OYXRpdmVNZXRhZGF0YSo+KAorICAgICAgICAodWludDhfdCopaGVhcC0+Z2V0QmFzZSgpICsgb2Zmc2V0KTsKKworICAgIGlmIChwYXlsb2FkLT5lVHlwZSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBSZWNvcmRpbmcgZnJhbWUgdHlwZSBpbnZhbGlkIChnb3QgJXgsIGV4cGVjdGVkICV4KSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHR5cGUsCi0gICAgICAgICAgICAgICAga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBwYXlsb2FkLT5lVHlwZSwKKyAgICAgICAgICAgICAgICBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIC8vIGIvMjg0NjY3MDEKKyAgICBwYXlsb2FkLT5wQnVmZmVyID0gKEFOYXRpdmVXaW5kb3dCdWZmZXIqKSgoKHVpbnQ4X3QqKXBheWxvYWQtPnBCdWZmZXIpICsKKyAgICAgICAgICAgIElDYW1lcmFSZWNvcmRpbmdQcm94eTo6Z2V0Q29tbW9uQmFzZUFkZHJlc3MoKSk7CisKICAgICAvLyBSZWxlYXNlIHRoZSBidWZmZXIgYmFjayB0byB0aGUgcmVjb3JkaW5nIHF1ZXVlCi0KLSAgICBidWZmZXJfaGFuZGxlX3QgaW1nSGFuZGxlID0gKihidWZmZXJfaGFuZGxlX3QqKShkYXRhICsgNCk7Ci0KICAgICBzaXplX3QgaXRlbUluZGV4OwogICAgIGZvciAoaXRlbUluZGV4ID0gMDsgaXRlbUluZGV4IDwgbVJlY29yZGluZ0J1ZmZlcnMuc2l6ZSgpOyBpdGVtSW5kZXgrKykgewogICAgICAgICBjb25zdCBCdWZmZXJJdGVtIGl0ZW0gPSBtUmVjb3JkaW5nQnVmZmVyc1tpdGVtSW5kZXhdOwogICAgICAgICBpZiAoaXRlbS5tQnVmICE9IEJ1ZmZlckl0ZW1Db25zdW1lcjo6SU5WQUxJRF9CVUZGRVJfU0xPVCAmJgotICAgICAgICAgICAgICAgIGl0ZW0ubUdyYXBoaWNCdWZmZXItPmhhbmRsZSA9PSBpbWdIYW5kbGUpIHsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGl0ZW0ubUdyYXBoaWNCdWZmZXItPmdldE5hdGl2ZUJ1ZmZlcigpID09IHBheWxvYWQtPnBCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KKwogICAgIGlmIChpdGVtSW5kZXggPT0gbVJlY29yZGluZ0J1ZmZlcnMuc2l6ZSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCBmaW5kIGJ1ZmZlcl9oYW5kbGVfdCAlcCBpbiBsaXN0IG9mICIKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGZpbmQgcmV0dXJuZWQgQU5XIEJ1ZmZlciAlcCBpbiBsaXN0IG9mICIKICAgICAgICAgICAgICAgICAib3V0c3RhbmRpbmcgYnVmZmVycyIsIF9fRlVOQ1RJT05fXywgbUlkLAotICAgICAgICAgICAgICAgIGltZ0hhbmRsZSk7CisgICAgICAgICAgICAgICAgcGF5bG9hZC0+cEJ1ZmZlcik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBBTE9HVlYoIiVzOiBDYW1lcmEgJWQ6IEZyZWVpbmcgYnVmZmVyX2hhbmRsZV90ICVwIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgbUlkLCBpbWdIYW5kbGUpOworICAgIEFMT0dWVigiJXM6IENhbWVyYSAlZDogRnJlZWluZyByZXR1cm5lZCBBTlcgYnVmZmVyICVwIGluZGV4ICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgbUlkLCBwYXlsb2FkLT5wQnVmZmVyLCBpdGVtSW5kZXgpOwogCiAgICAgcmVzID0gbVJlY29yZGluZ0NvbnN1bWVyLT5yZWxlYXNlQnVmZmVyKG1SZWNvcmRpbmdCdWZmZXJzW2l0ZW1JbmRleF0pOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byBmcmVlIHJlY29yZGluZyBmcmFtZSAiCi0gICAgICAgICAgICAgICAgIihidWZmZXJfaGFuZGxlX3Q6ICVwKTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBtSWQsIGltZ0hhbmRsZSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgIihSZXR1cm5lZCBBTlcgYnVmZmVyOiAlcCk6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgbUlkLCBwYXlsb2FkLT5wQnVmZmVyLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtUmVjb3JkaW5nQnVmZmVycy5yZXBsYWNlQXQoaXRlbUluZGV4KTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuaAppbmRleCAyNDc0MDYyLi5lMGNhZDNhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1N0cmVhbWluZ1Byb2Nlc3Nvci5oCkBAIC00Myw3ICs0Myw3IEBACiAgICAgU3RyZWFtaW5nUHJvY2Vzc29yKHNwPENhbWVyYTJDbGllbnQ+IGNsaWVudCk7CiAgICAgflN0cmVhbWluZ1Byb2Nlc3NvcigpOwogCi0gICAgc3RhdHVzX3Qgc2V0UHJldmlld1dpbmRvdyhzcDxBTmF0aXZlV2luZG93PiB3aW5kb3cpOworICAgIHN0YXR1c190IHNldFByZXZpZXdXaW5kb3coc3A8U3VyZmFjZT4gd2luZG93KTsKIAogICAgIGJvb2wgaGF2ZVZhbGlkUHJldmlld1dpbmRvdygpIGNvbnN0OwogCkBAIC01Myw2ICs1Myw4IEBACiAgICAgaW50IGdldFByZXZpZXdTdHJlYW1JZCgpIGNvbnN0OwogCiAgICAgc3RhdHVzX3Qgc2V0UmVjb3JkaW5nQnVmZmVyQ291bnQoc2l6ZV90IGNvdW50KTsKKyAgICBzdGF0dXNfdCBzZXRSZWNvcmRpbmdGb3JtYXQoaW50IGZvcm1hdCwgYW5kcm9pZF9kYXRhc3BhY2VfdCBkYXRhc3BhY2UpOworCiAgICAgc3RhdHVzX3QgdXBkYXRlUmVjb3JkaW5nUmVxdWVzdChjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMpOwogICAgIC8vIElmIG5lZWRzVXBkYXRlIGlzIHNldCB0byB0cnVlLCBhIHVwZGF0ZVJlY29yZGluZ1N0cmVhbSBjYWxsIHdpdGggcGFyYW1zIHdpbGwgcmVjcmVhdGUKICAgICAvLyByZWNvcmRpbmcgc3RyZWFtCkBAIC0xMDYsNyArMTA4LDcgQEAKICAgICBpbnQzMl90IG1QcmV2aWV3UmVxdWVzdElkOwogICAgIGludCBtUHJldmlld1N0cmVhbUlkOwogICAgIENhbWVyYU1ldGFkYXRhIG1QcmV2aWV3UmVxdWVzdDsKLSAgICBzcDxBTmF0aXZlV2luZG93PiBtUHJldmlld1dpbmRvdzsKKyAgICBzcDxTdXJmYWNlPiBtUHJldmlld1dpbmRvdzsKIAogICAgIC8vIFJlY29yZGluZy1yZWxhdGVkIG1lbWJlcnMKICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrV2FpdER1cmF0aW9uID0gNTAwMDAwMDA7IC8vIDUwIG1zCkBAIC0xMTUsNyArMTE3LDcgQEAKICAgICBpbnQgbVJlY29yZGluZ1N0cmVhbUlkOwogICAgIGludCBtUmVjb3JkaW5nRnJhbWVDb3VudDsKICAgICBzcDxCdWZmZXJJdGVtQ29uc3VtZXI+IG1SZWNvcmRpbmdDb25zdW1lcjsKLSAgICBzcDxBTmF0aXZlV2luZG93PiAgbVJlY29yZGluZ1dpbmRvdzsKKyAgICBzcDxTdXJmYWNlPiAgbVJlY29yZGluZ1dpbmRvdzsKICAgICBDYW1lcmFNZXRhZGF0YSBtUmVjb3JkaW5nUmVxdWVzdDsKICAgICBzcDxjYW1lcmEyOjpDYW1lcmEySGVhcD4gbVJlY29yZGluZ0hlYXA7CiAKQEAgLTEyNyw2ICsxMjksMTggQEAKICAgICBWZWN0b3I8QnVmZmVySXRlbT4gbVJlY29yZGluZ0J1ZmZlcnM7CiAgICAgc2l6ZV90IG1SZWNvcmRpbmdIZWFwSGVhZCwgbVJlY29yZGluZ0hlYXBGcmVlOwogCisgICAgc3RhdGljIGNvbnN0IGludCBrRGVmYXVsdFJlY29yZGluZ0Zvcm1hdCA9CisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CisgICAgaW50IG1SZWNvcmRpbmdGb3JtYXQ7CisKKyAgICBzdGF0aWMgY29uc3QgYW5kcm9pZF9kYXRhc3BhY2Uga0RlZmF1bHRSZWNvcmRpbmdEYXRhU3BhY2UgPQorICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9CVDcwOTsKKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBtUmVjb3JkaW5nRGF0YVNwYWNlOworCisgICAgc3RhdGljIGNvbnN0IGludCBrRGVmYXVsdFJlY29yZGluZ0dyYWxsb2NVc2FnZSA9CisgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVI7CisgICAgaW50IG1SZWNvcmRpbmdHcmFsbG9jVXNhZ2U7CisKICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOwogCiAgICAgc3RhdHVzX3QgcHJvY2Vzc1JlY29yZGluZ0ZyYW1lKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCmluZGV4IDE4NmNlNmMuLjBiNzliMzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwCkBAIC0xMzksNyArMTM5LDcgQEAKICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1pTTCwKICAgICAgICAgICAgIGtac2xCdWZmZXJEZXB0aCk7CiAgICAgICAgIG1ac2xDb25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgbVpzbENvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTJDbGllbnQ6OlpzbENvbnN1bWVyIikpOworICAgICAgICBtWnNsQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMi1ac2xDb25zdW1lciIpKTsKICAgICAgICAgbVpzbFdpbmRvdyA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKICAgICB9CiAKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICAgICAgICAvLyBDaGVjayBpZiBzdHJlYW0gcGFyYW1ldGVycyBoYXZlIHRvIGNoYW5nZQogICAgICAgICB1aW50MzJfdCBjdXJyZW50V2lkdGgsIGN1cnJlbnRIZWlnaHQ7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Z2V0U3RyZWFtSW5mbyhtWnNsU3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsIDApOworICAgICAgICAgICAgICAgICZjdXJyZW50V2lkdGgsICZjdXJyZW50SGVpZ2h0LCAwLCAwKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEVycm9yIHF1ZXJ5aW5nIGNhcHR1cmUgb3V0cHV0IHN0cmVhbSBpbmZvOiAiCiAgICAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLApAQCAtMTg1LDggKzE4NSw4IEBACiAgICAgICAgICAgICAgICAgKGludClDQU1FUkEyX0hBTF9QSVhFTF9GT1JNQVRfWlNMIDoKICAgICAgICAgICAgICAgICAoaW50KUhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKICAgICAgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obVpzbFdpbmRvdywKLSAgICAgICAgICAgICAgICBwYXJhbXMuZmFzdEluZm8uYXJyYXlXaWR0aCwgcGFyYW1zLmZhc3RJbmZvLmFycmF5SGVpZ2h0LAotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsICZtWnNsU3RyZWFtSWQpOworICAgICAgICAgICAgICAgIHBhcmFtcy5mYXN0SW5mby5hcnJheVdpZHRoLCBwYXJhbXMuZmFzdEluZm8uYXJyYXlIZWlnaHQsIHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9VTktOT1dOLCBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wLCAmbVpzbFN0cmVhbUlkKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGNyZWF0ZSBvdXRwdXQgc3RyZWFtIGZvciBaU0w6ICIKICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaAppbmRleCA1ZjUwZDdiLi41ODcwYmQzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5oCkBAIC0xMDEsNyArMTAxLDcgQEAKICAgICBpbnQgbVpzbFN0cmVhbUlkOwogICAgIGludCBtWnNsUmVwcm9jZXNzU3RyZWFtSWQ7CiAgICAgc3A8QnVmZmVySXRlbUNvbnN1bWVyPiBtWnNsQ29uc3VtZXI7Ci0gICAgc3A8QU5hdGl2ZVdpbmRvdz4gICAgICBtWnNsV2luZG93OworICAgIHNwPFN1cmZhY2U+ICAgICAgICAgICAgbVpzbFdpbmRvdzsKIAogICAgIHN0cnVjdCBac2xQYWlyIHsKICAgICAgICAgQnVmZmVySXRlbSBidWZmZXI7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yMy5jcHAKaW5kZXggNDcwYTZkNi4uNjk2MjBhYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1pzbFByb2Nlc3NvcjMuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IzLmNwcApAQCAtMTUwLDcgKzE1MCw3IEBACiAgICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBwYXJhbWV0ZXJzIGhhdmUgdG8gY2hhbmdlCiAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRXaWR0aCwgY3VycmVudEhlaWdodDsKICAgICAgICAgcmVzID0gZGV2aWNlLT5nZXRTdHJlYW1JbmZvKG1ac2xTdHJlYW1JZCwKLSAgICAgICAgICAgICAgICAmY3VycmVudFdpZHRoLCAmY3VycmVudEhlaWdodCwgMCk7CisgICAgICAgICAgICAgICAgJmN1cnJlbnRXaWR0aCwgJmN1cnJlbnRIZWlnaHQsIDAsIDApOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRXJyb3IgcXVlcnlpbmcgY2FwdHVyZSBvdXRwdXQgc3RyZWFtIGluZm86ICIKICAgICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKaW5kZXggOGYyZDNjYy4uODRjMGMzZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcApAQCAtNjUsMTMgKzY1LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKSA6CiAgICAgQ2FtZXJhMkNsaWVudEJhc2UoY2FtZXJhU2VydmljZSwgcmVtb3RlQ2FsbGJhY2ssIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKSwKKyAgICBtSW5wdXRTdHJlYW0oKSwKICAgICBtUmVxdWVzdElkQ291bnRlcigwKSB7CiAKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dJKCJDYW1lcmFEZXZpY2VDbGllbnQgJWQ6IE9wZW5lZCIsIGNhbWVyYUlkKTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50Ojppbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKQorc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50Ojppbml0aWFsaXplKENhbWVyYU1vZHVsZSAqbW9kdWxlKQogewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3QgcmVzOwpAQCAtMTM0LDYgKzEzNSwxNSBAQAogICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFNlbnQgbnVsbCByZXF1ZXN0LiIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC0+bUlzUmVwcm9jZXNzKSB7CisgICAgICAgICAgICBpZiAoIW1JbnB1dFN0cmVhbS5jb25maWd1cmVkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IG5vIGlucHV0IHN0cmVhbSBpcyBjb25maWd1cmVkLiIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW1pbmcpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogc3RyZWFtaW5nIHJlcHJvY2VzcyByZXF1ZXN0cyBub3Qgc3VwcG9ydGVkLiIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhKHJlcXVlc3QtPm1NZXRhZGF0YSk7CkBAIC0xODIsNiArMTkyLDEwIEBACiAgICAgICAgIG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfT1VUUFVUX1NUUkVBTVMsICZvdXRwdXRTdHJlYW1JZHNbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW1JZHMuc2l6ZSgpKTsKIAorICAgICAgICBpZiAocmVxdWVzdC0+bUlzUmVwcm9jZXNzKSB7CisgICAgICAgICAgICBtZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0lOUFVUX1NUUkVBTVMsICZtSW5wdXRTdHJlYW0uaWQsIDEpOworICAgICAgICB9CisKICAgICAgICAgbWV0YWRhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9JRCwgJnJlcXVlc3RJZCwgLypzaXplKi8xKTsKICAgICAgICAgbG9vcENvdW50ZXIrKzsgLy8gbG9vcENvdW50ZXIgc3RhcnRzIGZyb20gMQogICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQ3JlYXRpbmcgcmVxdWVzdCB3aXRoIElEICVkICglZCBvZiAlenUpIiwKQEAgLTI1NSwxMyArMjY5LDMzIEBACiAKIHN0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6YmVnaW5Db25maWd1cmUoKSB7CiAgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMuCi0gICAgQUxPR0UoIiVzOiBOb3QgaW1wbGVtZW50ZWQgeWV0LiIsIF9fRlVOQ1RJT05fXyk7CisgICAgQUxPR1YoIiVzOiBOb3QgaW1wbGVtZW50ZWQgeWV0LiIsIF9fRlVOQ1RJT05fXyk7CiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmVuZENvbmZpZ3VyZSgpIHsKLSAgICBBTE9HVigiJXM6IGVuZGluZyBjb25maWd1cmUgKCV6dSBzdHJlYW1zKSIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1TdHJlYW1NYXAuc2l6ZSgpKTsKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6ZW5kQ29uZmlndXJlKGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCkgeworICAgIEFMT0dWKCIlczogZW5kaW5nIGNvbmZpZ3VyZSAoJWQgaW5wdXQgc3RyZWFtLCAlenUgb3V0cHV0IHN0cmVhbXMpIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlucHV0U3RyZWFtLmNvbmZpZ3VyZWQgPyAxIDogMCwgbVN0cmVhbU1hcC5zaXplKCkpOworCisgICAgLy8gU2FuaXRpemUgdGhlIGhpZ2ggc3BlZWQgc2Vzc2lvbiBhZ2FpbnN0IG5lY2Vzc2FyeSBjYXBhYmlsaXR5IGJpdC4KKyAgICBpZiAoaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCkgeworICAgICAgICBDYW1lcmFNZXRhZGF0YSBzdGF0aWNJbmZvID0gbURldmljZS0+aW5mbygpOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgICAgIGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZFN1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7ICsraSkgeworICAgICAgICAgICAgdWludDhfdCBjYXBhYmlsaXR5ID0gZW50cnkuZGF0YS51OFtpXTsKKyAgICAgICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0NPTlNUUkFJTkVEX0hJR0hfU1BFRURfVklERU8pIHsKKyAgICAgICAgICAgICAgICBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWlzQ29uc3RyYWluZWRIaWdoU3BlZWRTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBUcnkgdG8gY3JlYXRlIGEgY29uc3RyYWluZWQgaGlnaCBzcGVlZCBjb25maWd1cmF0aW9uIG9uIGEgZGV2aWNlIgorICAgICAgICAgICAgICAgICAgICAiIHRoYXQgZG9lc24ndCBzdXBwb3J0IGl0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0KIAogICAgIHN0YXR1c190IHJlczsKICAgICBpZiAoIChyZXMgPSBjaGVja1BpZChfX0ZVTkNUSU9OX18pICkgIT0gT0spIHJldHVybiByZXM7CkBAIC0yNzAsNyArMzA0LDcgQEAKIAogICAgIGlmICghbURldmljZS5nZXQoKSkgcmV0dXJuIERFQURfT0JKRUNUOwogCi0gICAgcmV0dXJuIG1EZXZpY2UtPmNvbmZpZ3VyZVN0cmVhbXMoKTsKKyAgICByZXR1cm4gbURldmljZS0+Y29uZmlndXJlU3RyZWFtcyhpc0NvbnN0cmFpbmVkSGlnaFNwZWVkKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpkZWxldGVTdHJlYW0oaW50IHN0cmVhbUlkKSB7CkBAIC0yODQsMTkgKzMxOCwyNSBAQAogCiAgICAgaWYgKCFtRGV2aWNlLmdldCgpKSByZXR1cm4gREVBRF9PQkpFQ1Q7CiAKLSAgICAvLyBHdWFyZCBhZ2FpbnN0IHRyeWluZyB0byBkZWxldGUgbm9uLWNyZWF0ZWQgc3RyZWFtcworICAgIGJvb2wgaXNJbnB1dCA9IGZhbHNlOwogICAgIHNzaXplX3QgaW5kZXggPSBOQU1FX05PVF9GT1VORDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdHJlYW1NYXAuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgaWYgKHN0cmVhbUlkID09IG1TdHJlYW1NYXAudmFsdWVBdChpKSkgewotICAgICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9CiAKLSAgICBpZiAoaW5kZXggPT0gTkFNRV9OT1RfRk9VTkQpIHsKLSAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgJWQ6IEludmFsaWQgc3RyZWFtIElEICglZCkgc3BlY2lmaWVkLCBubyBzdHJlYW0gIgotICAgICAgICAgICAgICAiY3JlYXRlZCB5ZXQiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZWFtSWQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGlmIChtSW5wdXRTdHJlYW0uY29uZmlndXJlZCAmJiBtSW5wdXRTdHJlYW0uaWQgPT0gc3RyZWFtSWQpIHsKKyAgICAgICAgaXNJbnB1dCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCB0cnlpbmcgdG8gZGVsZXRlIG5vbi1jcmVhdGVkIHN0cmVhbXMKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RyZWFtTWFwLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAoc3RyZWFtSWQgPT0gbVN0cmVhbU1hcC52YWx1ZUF0KGkpKSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGluZGV4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IENhbWVyYSAlZDogSW52YWxpZCBzdHJlYW0gSUQgKCVkKSBzcGVjaWZpZWQsIG5vIHN0cmVhbSAiCisgICAgICAgICAgICAgICAgICAiY3JlYXRlZCB5ZXQiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZWFtSWQpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIEFsc28gcmV0dXJucyBCQURfVkFMVUUgaWYgc3RyZWFtIElEIHdhcyBub3QgdmFsaWQKQEAgLTMwNywyNCArMzQ3LDI3IEBACiAgICAgICAgICAgICAgICIgYWxyZWFkeSBjaGVja2VkIGFuZCB0aGUgc3RyZWFtIElEICglZCkgc2hvdWxkIGJlIHZhbGlkLiIsCiAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlYW1JZCk7CiAgICAgfSBlbHNlIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgbVN0cmVhbU1hcC5yZW1vdmVJdGVtc0F0KGluZGV4KTsKLQorICAgICAgICBpZiAoaXNJbnB1dCkgeworICAgICAgICAgICAgbUlucHV0U3RyZWFtLmNvbmZpZ3VyZWQgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdHJlYW1NYXAucmVtb3ZlSXRlbXNBdChpbmRleCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcmVzOwogfQogCi1zdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmNyZWF0ZVN0cmVhbShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyKQorc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpjcmVhdGVTdHJlYW0oY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3V0cHV0Q29uZmlndXJhdGlvbikKIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCIlcyAodyA9ICVkLCBoID0gJWQsIGYgPSAweCV4KSIsIF9fRlVOQ1RJT05fXywgd2lkdGgsIGhlaWdodCwgZm9ybWF0KTsKIAogICAgIHN0YXR1c190IHJlczsKICAgICBpZiAoIChyZXMgPSBjaGVja1BpZChfX0ZVTkNUSU9OX18pICkgIT0gT0spIHJldHVybiByZXM7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAKKworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGJ1ZmZlclByb2R1Y2VyID0gb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKICAgICBpZiAoYnVmZmVyUHJvZHVjZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiJXM6IGJ1ZmZlclByb2R1Y2VyIG11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMzY4LDI1ICs0MTEsMzMgQEAKICAgICAgICAgICAgIChjb25zdW1lclVzYWdlICYgYWxsb3dlZEZsYWdzKSAhPSAwOwogCiAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyUHJvZHVjZXIpOwotICAgIHNwPEFOYXRpdmVXaW5kb3c+IGFudyA9IG5ldyBTdXJmYWNlKGJ1ZmZlclByb2R1Y2VyLCB1c2VBc3luYyk7CisgICAgc3A8U3VyZmFjZT4gc3VyZmFjZSA9IG5ldyBTdXJmYWNlKGJ1ZmZlclByb2R1Y2VyLCB1c2VBc3luYyk7CisgICAgQU5hdGl2ZVdpbmRvdyAqYW53ID0gc3VyZmFjZS5nZXQoKTsKIAotICAgIC8vIFRPRE86IHJlbW92ZSB3LGgsZiBzaW5jZSB3ZSBhcmUgaWdub3JpbmcgdGhlbQorICAgIGludCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQ7CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlOwogCi0gICAgaWYgKChyZXMgPSBhbnctPnF1ZXJ5KGFudy5nZXQoKSwgTkFUSVZFX1dJTkRPV19XSURUSCwgJndpZHRoKSkgIT0gT0spIHsKKyAgICBpZiAoKHJlcyA9IGFudy0+cXVlcnkoYW53LCBOQVRJVkVfV0lORE9XX1dJRFRILCAmd2lkdGgpKSAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2Ugd2lkdGgiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgIG1DYW1lcmFJZCk7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQotICAgIGlmICgocmVzID0gYW53LT5xdWVyeShhbncuZ2V0KCksIE5BVElWRV9XSU5ET1dfSEVJR0hULCAmaGVpZ2h0KSkgIT0gT0spIHsKKyAgICBpZiAoKHJlcyA9IGFudy0+cXVlcnkoYW53LCBOQVRJVkVfV0lORE9XX0hFSUdIVCwgJmhlaWdodCkpICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBGYWlsZWQgdG8gcXVlcnkgU3VyZmFjZSBoZWlnaHQiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgIG1DYW1lcmFJZCk7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQotICAgIGlmICgocmVzID0gYW53LT5xdWVyeShhbncuZ2V0KCksIE5BVElWRV9XSU5ET1dfRk9STUFULCAmZm9ybWF0KSkgIT0gT0spIHsKKyAgICBpZiAoKHJlcyA9IGFudy0+cXVlcnkoYW53LCBOQVRJVkVfV0lORE9XX0ZPUk1BVCwgJmZvcm1hdCkpICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBGYWlsZWQgdG8gcXVlcnkgU3VyZmFjZSBmb3JtYXQiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgIG1DYW1lcmFJZCk7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQorICAgIGlmICgocmVzID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfREVGQVVMVF9EQVRBU1BBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnQqPigmZGF0YVNwYWNlKSkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBGYWlsZWQgdG8gcXVlcnkgU3VyZmFjZSBkYXRhU3BhY2UiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIG1DYW1lcmFJZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQogCiAgICAgLy8gRklYTUU6IHJlbW92ZSB0aGlzIG92ZXJyaWRlIHNpbmNlIHRoZSBkZWZhdWx0IGZvcm1hdCBzaG91bGQgYmUKICAgICAvLyAgICAgICBJTVBMRU1FTlRBVElPTl9ERUZJTkVELiBiLzk0ODc0ODIKQEAgLTM5OSwxNCArNDUwLDE3IEBACiAKICAgICAvLyBSb3VuZCBkaW1lbnNpb25zIHRvIHRoZSBuZWFyZXN0IGRpbWVuc2lvbnMgYXZhaWxhYmxlIGZvciB0aGlzIGZvcm1hdAogICAgIGlmIChmbGV4aWJsZUNvbnN1bWVyICYmICFDYW1lcmFEZXZpY2VDbGllbnQ6OnJvdW5kQnVmZmVyRGltZW5zaW9uTmVhcmVzdCh3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgZm9ybWF0LCBtRGV2aWNlLT5pbmZvKCksIC8qb3V0Ki8md2lkdGgsIC8qb3V0Ki8maGVpZ2h0KSkgeworICAgICAgICAgICAgZm9ybWF0LCBkYXRhU3BhY2UsIG1EZXZpY2UtPmluZm8oKSwgLypvdXQqLyZ3aWR0aCwgLypvdXQqLyZoZWlnaHQpKSB7CiAgICAgICAgIEFMT0dFKCIlczogTm8gc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdpdGggdGhlIGZvcm1hdCAlI3ggZGVmaW5lZCwgZmFpbGVkIHRvIGNyZWF0ZSBzdHJlYW0uIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGZvcm1hdCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgaW50IHN0cmVhbUlkID0gLTE7Ci0gICAgcmVzID0gbURldmljZS0+Y3JlYXRlU3RyZWFtKGFudywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCAmc3RyZWFtSWQpOworICAgIHJlcyA9IG1EZXZpY2UtPmNyZWF0ZVN0cmVhbShzdXJmYWNlLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGRhdGFTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2FtZXJhM19zdHJlYW1fcm90YXRpb25fdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRSb3RhdGlvbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbUlkKTsKIAogICAgIGlmIChyZXMgPT0gT0spIHsKICAgICAgICAgbVN0cmVhbU1hcC5hZGQoYmluZGVyLCBzdHJlYW1JZCk7CkBAIC00NDAsMTEgKzQ5NCw2NSBAQAogfQogCiAKK3N0YXR1c190IENhbWVyYURldmljZUNsaWVudDo6Y3JlYXRlSW5wdXRTdHJlYW0oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICBpbnQgZm9ybWF0KSB7CisKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCIlcyAodyA9ICVkLCBoID0gJWQsIGYgPSAweCV4KSIsIF9fRlVOQ1RJT05fXywgd2lkdGgsIGhlaWdodCwgZm9ybWF0KTsKKworICAgIHN0YXR1c190IHJlczsKKyAgICBpZiAoIChyZXMgPSBjaGVja1BpZChfX0ZVTkNUSU9OX18pICkgIT0gT0spIHJldHVybiByZXM7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CisgICAgaWYgKCFtRGV2aWNlLmdldCgpKSByZXR1cm4gREVBRF9PQkpFQ1Q7CisKKyAgICBpZiAobUlucHV0U3RyZWFtLmNvbmZpZ3VyZWQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IEFscmVhZHkgaGFzIGFuIGlucHV0IHN0cmVhbSAiCisgICAgICAgICAgICAgICAgIiBjb25maWd1cmF0aW9uLiAoSUQgJXpkKSIsIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLAorICAgICAgICAgICAgICAgIG1JbnB1dFN0cmVhbS5pZCk7CisgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICB9CisKKyAgICBpbnQgc3RyZWFtSWQgPSAtMTsKKyAgICByZXMgPSBtRGV2aWNlLT5jcmVhdGVJbnB1dFN0cmVhbSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsICZzdHJlYW1JZCk7CisgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICBtSW5wdXRTdHJlYW0uY29uZmlndXJlZCA9IHRydWU7CisgICAgICAgIG1JbnB1dFN0cmVhbS53aWR0aCA9IHdpZHRoOworICAgICAgICBtSW5wdXRTdHJlYW0uaGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBtSW5wdXRTdHJlYW0uZm9ybWF0ID0gZm9ybWF0OworICAgICAgICBtSW5wdXRTdHJlYW0uaWQgPSBzdHJlYW1JZDsKKworICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogU3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYSBuZXcgaW5wdXQgc3RyZWFtIElEICVkIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVhbUlkKTsKKworICAgICAgICByZXR1cm4gc3RyZWFtSWQ7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyKAorICAgICAgICAvKm91dCovc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKnByb2R1Y2VyKSB7CisgICAgc3RhdHVzX3QgcmVzOworICAgIGlmICggKHJlcyA9IGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgKSAhPSBPSykgcmV0dXJuIHJlczsKKworICAgIGlmIChwcm9kdWNlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOworICAgIGlmICghbURldmljZS5nZXQoKSkgcmV0dXJuIERFQURfT0JKRUNUOworCisgICAgcmV0dXJuIG1EZXZpY2UtPmdldElucHV0QnVmZmVyUHJvZHVjZXIocHJvZHVjZXIpOworfQorCiBib29sIENhbWVyYURldmljZUNsaWVudDo6cm91bmRCdWZmZXJEaW1lbnNpb25OZWFyZXN0KGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LAotICAgICAgICBpbnQzMl90IGZvcm1hdCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8sCisgICAgICAgIGludDMyX3QgZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvLAogICAgICAgICAvKm91dCovaW50MzJfdCogb3V0V2lkdGgsIC8qb3V0Ki9pbnQzMl90KiBvdXRIZWlnaHQpIHsKIAogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBzdHJlYW1Db25maWdzID0KKyAgICAgICAgICAgIChkYXRhU3BhY2UgPT0gSEFMX0RBVEFTUEFDRV9ERVBUSCkgPworICAgICAgICAgICAgaW5mby5maW5kKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUykgOgogICAgICAgICAgICAgaW5mby5maW5kKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMpOwogCiAgICAgaW50MzJfdCBiZXN0V2lkdGggPSAtMTsKQEAgLTU4MCw2ICs2ODgsNjggQEAKICAgICByZXR1cm4gbURldmljZS0+Zmx1c2gobGFzdEZyYW1lTnVtYmVyKTsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50OjpwcmVwYXJlKGludCBzdHJlYW1JZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmICggKHJlcyA9IGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgKSAhPSBPSykgcmV0dXJuIHJlczsKKworICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKKworICAgIC8vIEd1YXJkIGFnYWluc3QgdHJ5aW5nIHRvIHByZXBhcmUgbm9uLWNyZWF0ZWQgc3RyZWFtcworICAgIHNzaXplX3QgaW5kZXggPSBOQU1FX05PVF9GT1VORDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TdHJlYW1NYXAuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKHN0cmVhbUlkID09IG1TdHJlYW1NYXAudmFsdWVBdChpKSkgeworICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW5kZXggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgQUxPR1coIiVzOiBDYW1lcmEgJWQ6IEludmFsaWQgc3RyZWFtIElEICglZCkgc3BlY2lmaWVkLCBubyBzdHJlYW0gIgorICAgICAgICAgICAgICAiY3JlYXRlZCB5ZXQiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZWFtSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEFsc28gcmV0dXJucyBCQURfVkFMVUUgaWYgc3RyZWFtIElEIHdhcyBub3QgdmFsaWQsIG9yIHN0cmVhbSBhbHJlYWR5CisgICAgLy8gaGFzIGJlZW4gdXNlZAorICAgIHJlcyA9IG1EZXZpY2UtPnByZXBhcmUoc3RyZWFtSWQpOworCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQ2FtZXJhRGV2aWNlQ2xpZW50Ojp0ZWFyRG93bihpbnQgc3RyZWFtSWQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBpZiAoIChyZXMgPSBjaGVja1BpZChfX0ZVTkNUSU9OX18pICkgIT0gT0spIHJldHVybiByZXM7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CisKKyAgICAvLyBHdWFyZCBhZ2FpbnN0IHRyeWluZyB0byBwcmVwYXJlIG5vbi1jcmVhdGVkIHN0cmVhbXMKKyAgICBzc2l6ZV90IGluZGV4ID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU3RyZWFtTWFwLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChzdHJlYW1JZCA9PSBtU3RyZWFtTWFwLnZhbHVlQXQoaSkpIHsKKyAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluZGV4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhICVkOiBJbnZhbGlkIHN0cmVhbSBJRCAoJWQpIHNwZWNpZmllZCwgbm8gc3RyZWFtICIKKyAgICAgICAgICAgICAgImNyZWF0ZWQgeWV0IiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBBbHNvIHJldHVybnMgQkFEX1ZBTFVFIGlmIHN0cmVhbSBJRCB3YXMgbm90IHZhbGlkIG9yIGlmIHRoZSBzdHJlYW0gaXMgaW4KKyAgICAvLyB1c2UKKyAgICByZXMgPSBtRGV2aWNlLT50ZWFyRG93bihzdHJlYW1JZCk7CisKKyAgICByZXR1cm4gcmVzOworfQorCiBzdGF0dXNfdCBDYW1lcmFEZXZpY2VDbGllbnQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CiAgICAgcmV0dXJuIEJhc2ljQ2xpZW50OjpkdW1wKGZkLCBhcmdzKTsKIH0KQEAgLTU5MCwxOSArNzYwLDIzIEBACiAgICAgICAgICAgICBtQ2FtZXJhSWQsCiAgICAgICAgICAgICAoZ2V0UmVtb3RlQ2FsbGJhY2soKSAhPSBOVUxMID8KICAgICAgICAgICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoZ2V0UmVtb3RlQ2FsbGJhY2soKSkuZ2V0KCkgOiBOVUxMKSApOwotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgQ3VycmVudCBjbGllbnQ6ICVzIChQSUQgJWQsIFVJRCAldSlcbiIsCi0gICAgICAgICAgICBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCksCi0gICAgICAgICAgICBtQ2xpZW50UGlkLCBtQ2xpZW50VWlkKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIEN1cnJlbnQgY2xpZW50IFVJRCAldVxuIiwgbUNsaWVudFVpZCk7CiAKICAgICByZXN1bHQuYXBwZW5kKCIgIFN0YXRlOlxuIik7CiAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgIFJlcXVlc3QgSUQgY291bnRlcjogJWRcbiIsIG1SZXF1ZXN0SWRDb3VudGVyKTsKKyAgICBpZiAobUlucHV0U3RyZWFtLmNvbmZpZ3VyZWQpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgIEN1cnJlbnQgaW5wdXQgc3RyZWFtIElEOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgbUlucHV0U3RyZWFtLmlkKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kKCIgICAgTm8gaW5wdXQgc3RyZWFtIGNvbmZpZ3VyZWQuXG4iKTsKKyAgICB9CiAgICAgaWYgKCFtU3RyZWFtTWFwLmlzRW1wdHkoKSkgewotICAgICAgICByZXN1bHQuYXBwZW5kKCIgICAgQ3VycmVudCBzdHJlYW0gSURzOlxuIik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgICBDdXJyZW50IG91dHB1dCBzdHJlYW0gSURzOlxuIik7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVN0cmVhbU1hcC5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgICAgU3RyZWFtICVkXG4iLCBtU3RyZWFtTWFwLnZhbHVlQXQoaSkpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgIE5vIHN0cmVhbXMgY29uZmlndXJlZC5cbiIpOworICAgICAgICByZXN1bHQuYXBwZW5kKCIgICAgTm8gb3V0cHV0IHN0cmVhbXMgY29uZmlndXJlZC5cbiIpOwogICAgIH0KICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICAvLyBUT0RPOiBwcmludCBkeW5hbWljL3JlcXVlc3Qgc2VjdGlvbiBmcm9tIG1vc3QgcmVjZW50IHJlcXVlc3RzCkBAIC02MzksOCArODEzLDEzIEBACiAgICAgfQogfQogCi0vLyBUT0RPOiByZWZhY3RvciB0aGUgY29kZSBiZWxvdyB0aGlzIHdpdGggSVByb0NhbWVyYVVzZXIuCi0vLyBpdCdzIDEwMCUgY29weS1wYXN0ZWQsIHNvIGxldHMgbm90IGNoYW5nZSBpdCByaWdodCBub3cgdG8gbWFrZSBpdCBlYXNpZXIuCit2b2lkIENhbWVyYURldmljZUNsaWVudDo6bm90aWZ5UHJlcGFyZWQoaW50IHN0cmVhbUlkKSB7CisgICAgLy8gVGhyZWFkIHNhZmUuIERvbid0IGJvdGhlciBsb2NraW5nLgorICAgIHNwPElDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHJlbW90ZUNiID0gZ2V0UmVtb3RlQ2FsbGJhY2soKTsKKyAgICBpZiAocmVtb3RlQ2IgIT0gMCkgeworICAgICAgICByZW1vdGVDYi0+b25QcmVwYXJlZChzdHJlYW1JZCk7CisgICAgfQorfQogCiB2b2lkIENhbWVyYURldmljZUNsaWVudDo6ZGV0YWNoRGV2aWNlKCkgewogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCmluZGV4IGJiZWRiNzAuLjQ4NmU2OGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oPgogCiAjaW5jbHVkZSAiQ2FtZXJhU2VydmljZS5oIgogI2luY2x1ZGUgImNvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuaCIKQEAgLTI2LDggKzI3LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgQ2FtZXJhRGV2aWNlQ2xpZW50QmFzZSA6Ci0gICAgICAgIHB1YmxpYyBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudCwgcHVibGljIEJuQ2FtZXJhRGV2aWNlVXNlcgorc3RydWN0IENhbWVyYURldmljZUNsaWVudEJhc2UgOiBwdWJsaWMgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQsIHB1YmxpYyBCbkNhbWVyYURldmljZVVzZXIKIHsKICAgICB0eXBlZGVmIElDYW1lcmFEZXZpY2VDYWxsYmFja3MgVENhbUNhbGxiYWNrczsKIApAQCAtNzgsMTYgKzc4LDE5IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGJlZ2luQ29uZmlndXJlKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGVuZENvbmZpZ3VyZSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5kQ29uZmlndXJlKGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCA9IGZhbHNlKTsKIAogICAgIC8vIFJldHVybnMgLUVCVVNZIGlmIGRldmljZSBpcyBub3QgaWRsZQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBkZWxldGVTdHJlYW0oaW50IHN0cmVhbUlkKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBjcmVhdGVTdHJlYW0oCi0gICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBidWZmZXJQcm9kdWNlcik7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGNyZWF0ZVN0cmVhbShjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICZvdXRwdXRDb25maWd1cmF0aW9uKTsKKworICAgIC8vIENyZWF0ZSBhbiBpbnB1dCBzdHJlYW0gb2Ygd2lkdGgsIGhlaWdodCwgYW5kIGZvcm1hdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgY3JlYXRlSW5wdXRTdHJlYW0oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZm9ybWF0KTsKKworICAgIC8vIEdldCB0aGUgYnVmZmVyIHByb2R1Y2VyIG9mIHRoZSBpbnB1dCBzdHJlYW0KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZ2V0SW5wdXRCdWZmZXJQcm9kdWNlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqL3NwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpwcm9kdWNlcik7CiAKICAgICAvLyBDcmVhdGUgYSByZXF1ZXN0IG9iamVjdCBmcm9tIGEgdGVtcGxhdGUuCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGNyZWF0ZURlZmF1bHRSZXF1ZXN0KGludCB0ZW1wbGF0ZUlkLApAQCAtMTA1LDYgKzEwOCwxMiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBmbHVzaCgvKm91dCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIGxhc3RGcmFtZU51bWJlciA9IE5VTEwpOwogCisgICAgLy8gUHJlcGFyZSBzdHJlYW0gYnkgcHJlYWxsb2NhdGluZyBpdHMgYnVmZmVycworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBwcmVwYXJlKGludCBzdHJlYW1JZCk7CisKKyAgICAvLyBUZWFyIGRvd24gc3RyZWFtIHJlc291cmNlcyBieSBmcmVlaW5nIGl0cyB1bnVzZWQgYnVmZmVycworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICB0ZWFyRG93bihpbnQgc3RyZWFtSWQpOworCiAgICAgLyoqCiAgICAgICogSW50ZXJmYWNlIHVzZWQgYnkgQ2FtZXJhU2VydmljZQogICAgICAqLwpAQCAtMTE5LDcgKzEyOCw3IEBACiAgICAgICAgICAgICBpbnQgc2VydmljZVBpZCk7CiAgICAgdmlydHVhbCB+Q2FtZXJhRGV2aWNlQ2xpZW50KCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgaW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGluaXRpYWxpemUoQ2FtZXJhTW9kdWxlICptb2R1bGUpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIApAQCAtMTMzLDYgKzE0Miw3IEBACiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeUVycm9yKElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbWVyYUVycm9yQ29kZSBlcnJvckNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CiAgICAgdmlydHVhbCB2b2lkIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLCBuc2Vjc190IHRpbWVzdGFtcCk7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeVByZXBhcmVkKGludCBzdHJlYW1JZCk7CiAKICAgICAvKioKICAgICAgKiBJbnRlcmZhY2UgdXNlZCBieSBpbmRlcGVuZGVudCBjb21wb25lbnRzIG9mIENhbWVyYURldmljZUNsaWVudC4KQEAgLTE2MSwxNCArMTcxLDIzIEBACiAKICAgICAvLyBGaW5kIHRoZSBjbG9zZXN0IGRpbWVuc2lvbnMgZm9yIGEgZ2l2ZW4gZm9ybWF0IGluIGF2YWlsYWJsZSBzdHJlYW0gY29uZmlndXJhdGlvbnMgd2l0aAogICAgIC8vIGEgd2lkdGggPD0gUk9VTkRJTkdfV0lEVEhfQ0FQCi0gICAgc3RhdGljIGNvbnN0IGludDMyX3QgUk9VTkRJTkdfV0lEVEhfQ0FQID0gMTA4MDsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBST1VORElOR19XSURUSF9DQVAgPSAxOTIwOwogICAgIHN0YXRpYyBib29sIHJvdW5kQnVmZmVyRGltZW5zaW9uTmVhcmVzdChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBmb3JtYXQsCi0gICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgaW5mbywgLypvdXQqL2ludDMyX3QqIG91dFdpZHRoLCAvKm91dCovaW50MzJfdCogb3V0SGVpZ2h0KTsKKyAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8sCisgICAgICAgICAgICAvKm91dCovaW50MzJfdCogb3V0V2lkdGgsIC8qb3V0Ki9pbnQzMl90KiBvdXRIZWlnaHQpOwogCi0gICAgLy8gSUdyYXBoaWNzQnVmZmVyUHJvZHVjZXIgYmluZGVyIC0+IFN0cmVhbSBJRAorICAgIC8vIElHcmFwaGljc0J1ZmZlclByb2R1Y2VyIGJpbmRlciAtPiBTdHJlYW0gSUQgZm9yIG91dHB1dCBzdHJlYW1zCiAgICAgS2V5ZWRWZWN0b3I8c3A8SUJpbmRlcj4sIGludD4gbVN0cmVhbU1hcDsKIAotICAgIC8vIFN0cmVhbSBJRAorICAgIHN0cnVjdCBJbnB1dFN0cmVhbUNvbmZpZ3VyYXRpb24geworICAgICAgICBib29sIGNvbmZpZ3VyZWQ7CisgICAgICAgIGludDMyX3Qgd2lkdGg7CisgICAgICAgIGludDMyX3QgaGVpZ2h0OworICAgICAgICBpbnQzMl90IGZvcm1hdDsKKyAgICAgICAgaW50MzJfdCBpZDsKKyAgICB9IG1JbnB1dFN0cmVhbTsKKworICAgIC8vIFJlcXVlc3QgSUQKICAgICBWZWN0b3I8aW50PiBtU3RyZWFtaW5nUmVxdWVzdExpc3Q7CiAKICAgICBpbnQzMl90IG1SZXF1ZXN0SWRDb3VudGVyOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNDVjN2QuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJQcm9DYW1lcmEyQ2xpZW50IgotI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgotCi0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJhcGlfcHJvL1Byb0NhbWVyYTJDbGllbnQuaCIKLSNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci11c2luZyBuYW1lc3BhY2UgY2FtZXJhMjsKLQotLy8gSW50ZXJmYWNlIHVzZWQgYnkgQ2FtZXJhU2VydmljZQotCi1Qcm9DYW1lcmEyQ2xpZW50OjpQcm9DYW1lcmEyQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJUHJvQ2FtZXJhQ2FsbGJhY2tzPiYgcmVtb3RlQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50UGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKSA6Ci0gICAgQ2FtZXJhMkNsaWVudEJhc2UoY2FtZXJhU2VydmljZSwgcmVtb3RlQ2FsbGJhY2ssIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKQotewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR0koIlByb0NhbWVyYSAlZDogT3BlbmVkIiwgY2FtZXJhSWQpOwotCi0gICAgbUV4Y2x1c2l2ZUxvY2sgPSBmYWxzZTsKLX0KLQotc3RhdHVzX3QgUHJvQ2FtZXJhMkNsaWVudDo6aW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSkKLXsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIHN0YXR1c190IHJlczsKLQotICAgIHJlcyA9IENhbWVyYTJDbGllbnRCYXNlOjppbml0aWFsaXplKG1vZHVsZSk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotICAgIFN0cmluZzggdGhyZWFkTmFtZTsKLSAgICBtRnJhbWVQcm9jZXNzb3IgPSBuZXcgRnJhbWVQcm9jZXNzb3JCYXNlKG1EZXZpY2UpOwotICAgIHRocmVhZE5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoIlBDMi0lZC1GcmFtZVByb2MiLCBtQ2FtZXJhSWQpOwotICAgIG1GcmFtZVByb2Nlc3Nvci0+cnVuKHRocmVhZE5hbWUuc3RyaW5nKCkpOwotCi0gICAgbUZyYW1lUHJvY2Vzc29yLT5yZWdpc3Rlckxpc3RlbmVyKEZSQU1FX1BST0NFU1NPUl9MSVNURU5FUl9NSU5fSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX1BST0NFU1NPUl9MSVNURU5FUl9NQVhfSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbGlzdGVuZXIqL3RoaXMpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1Qcm9DYW1lcmEyQ2xpZW50Ojp+UHJvQ2FtZXJhMkNsaWVudCgpIHsKLX0KLQotc3RhdHVzX3QgUHJvQ2FtZXJhMkNsaWVudDo6ZXhjbHVzaXZlVHJ5TG9jaygpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7Ci0gICAgU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzOjpMb2NrIGwobVNoYXJlZENhbWVyYUNhbGxiYWNrcyk7Ci0KLSAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLQotICAgIGlmICghbUV4Y2x1c2l2ZUxvY2spIHsKLSAgICAgICAgbUV4Y2x1c2l2ZUxvY2sgPSB0cnVlOwotCi0gICAgICAgIGlmIChtUmVtb3RlQ2FsbGJhY2sgIT0gTlVMTCkgewotICAgICAgICAgICAgbVJlbW90ZUNhbGxiYWNrLT5vbkxvY2tTdGF0dXNDaGFuZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb0NhbWVyYUNhbGxiYWNrczo6TE9DS19BQ1FVSVJFRCk7Ci0gICAgICAgIH0KLQotICAgICAgICBBTE9HVigiJXM6IGV4Y2x1c2l2ZSBsb2NrIGFjcXVpcmVkIiwgX19GVU5DVElPTl9fKTsKLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogaGF2ZSBhIFBFUk1JU1NJT05fREVOSUVEIGNhc2UgZm9yIHdoZW4gc29tZW9uZSBlbHNlIG93bnMgdGhlIGxvY2sKLQotICAgIC8vIGRvbid0IGFsbG93IHJlY3Vyc2l2ZSBsb2NraW5nCi0gICAgQUxPR1coIiVzOiBleGNsdXNpdmUgbG9jayBhbHJlYWR5IGV4aXN0cyAtIHJlY3Vyc2l2ZSBsb2NraW5nIGlzIG5vdCIKLSAgICAgICAgICAiYWxsb3dlZCIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7Ci19Ci0KLXN0YXR1c190IFByb0NhbWVyYTJDbGllbnQ6OmV4Y2x1c2l2ZUxvY2soKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwotICAgIFNoYXJlZENhbWVyYUNhbGxiYWNrczo6TG9jayBsKG1TaGFyZWRDYW1lcmFDYWxsYmFja3MpOwotCi0gICAgaWYgKCFtRGV2aWNlLmdldCgpKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0KLSAgICAvKioKLSAgICAgKiBUT0RPOiB0aGlzIHNob3VsZCBhc3luY2hyb25vdXNseSAnd2FpdCcgdW50aWwgdGhlIGxvY2sgYmVjb21lcyBhdmFpbGFibGUKLSAgICAgKiBpZiBhbm90aGVyIGNsaWVudCBhbHJlYWR5IGhhcyBhbiBleGNsdXNpdmUgbG9jay4KLSAgICAgKgotICAgICAqIG9uY2Ugd2UgaGF2ZSBwcm9wZXIgc2hhcmluZyBzdXBwb3J0IHRoaXMgd2lsbCBuZWVkIHRvIGRvCi0gICAgICogbW9yZSB0aGFuIGp1c3QgcmV0dXJuIGltbWVkaWF0ZWx5Ci0gICAgICovCi0gICAgaWYgKCFtRXhjbHVzaXZlTG9jaykgewotICAgICAgICBtRXhjbHVzaXZlTG9jayA9IHRydWU7Ci0KLSAgICAgICAgaWYgKG1SZW1vdGVDYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtUmVtb3RlQ2FsbGJhY2stPm9uTG9ja1N0YXR1c0NoYW5nZWQoSVByb0NhbWVyYUNhbGxiYWNrczo6TE9DS19BQ1FVSVJFRCk7Ci0gICAgICAgIH0KLQotICAgICAgICBBTE9HVigiJXM6IGV4Y2x1c2l2ZSBsb2NrIGFjcXVpcmVkIiwgX19GVU5DVElPTl9fKTsKLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgLy8gZG9uJ3QgYWxsb3cgcmVjdXJzaXZlIGxvY2tpbmcKLSAgICBBTE9HVygiJXM6IGV4Y2x1c2l2ZSBsb2NrIGFscmVhZHkgZXhpc3RzIC0gcmVjdXJzaXZlIGxvY2tpbmcgaXMgbm90IGFsbG93ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBfX0ZVTkNUSU9OX18pOwotICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKLX0KLQotc3RhdHVzX3QgUHJvQ2FtZXJhMkNsaWVudDo6ZXhjbHVzaXZlVW5sb2NrKCkgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKLSAgICBTaGFyZWRDYW1lcmFDYWxsYmFja3M6OkxvY2sgbChtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzKTsKLQotICAgIC8vIGRvbid0IGFsbG93IHVubG9ja2luZyBpZiB3ZSBoYXZlIG5vIGxvY2sKLSAgICBpZiAoIW1FeGNsdXNpdmVMb2NrKSB7Ci0gICAgICAgIEFMT0dXKCIlczogY2Fubm90IHVubG9jaywgbm8gbG9jayB3YXMgaGVsZCBpbiB0aGUgZmlyc3QgcGxhY2UiLAotICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIG1FeGNsdXNpdmVMb2NrID0gZmFsc2U7Ci0gICAgaWYgKG1SZW1vdGVDYWxsYmFjayAhPSBOVUxMICkgewotICAgICAgICBtUmVtb3RlQ2FsbGJhY2stPm9uTG9ja1N0YXR1c0NoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvQ2FtZXJhQ2FsbGJhY2tzOjpMT0NLX1JFTEVBU0VEKTsKLSAgICB9Ci0gICAgQUxPR1YoIiVzOiBleGNsdXNpdmUgbG9jayByZWxlYXNlZCIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgUHJvQ2FtZXJhMkNsaWVudDo6aGFzRXhjbHVzaXZlTG9jaygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7Ci0gICAgcmV0dXJuIG1FeGNsdXNpdmVMb2NrOwotfQotCi12b2lkIFByb0NhbWVyYTJDbGllbnQ6Om9uRXhjbHVzaXZlTG9ja1N0b2xlbigpIHsKLSAgICBBTE9HVigiJXM6IFByb0NsaWVudCBsb3N0IGV4Y2x1c2l2aXR5IChpZCAlZCkiLAotICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKLSAgICBTaGFyZWRDYW1lcmFDYWxsYmFja3M6OkxvY2sgbChtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzKTsKLQotICAgIGlmIChtRXhjbHVzaXZlTG9jayAmJiBtUmVtb3RlQ2FsbGJhY2suZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICBtUmVtb3RlQ2FsbGJhY2stPm9uTG9ja1N0YXR1c0NoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvQ2FtZXJhQ2FsbGJhY2tzOjpMT0NLX1NUT0xFTik7Ci0gICAgfQotCi0gICAgbUV4Y2x1c2l2ZUxvY2sgPSBmYWxzZTsKLQotICAgIC8vVE9ETzogd2Ugc2hvdWxkIG5vdCBuZWVkIHRvIGRldGFjaCB0aGUgZGV2aWNlLCBtZXJlbHkgcmVzZXQgaXQuCi0gICAgZGV0YWNoRGV2aWNlKCk7Ci19Ci0KLXN0YXR1c190IFByb0NhbWVyYTJDbGllbnQ6OnN1Ym1pdFJlcXVlc3QoY2FtZXJhX21ldGFkYXRhX3QqIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwotCi0gICAgaWYgKCFtRGV2aWNlLmdldCgpKSByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0KLSAgICBpZiAoIW1FeGNsdXNpdmVMb2NrKSB7Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICB9Ci0KLSAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YShyZXF1ZXN0KTsKLQotICAgIGlmICghZW5mb3JjZVJlcXVlc3RQZXJtaXNzaW9ucyhtZXRhZGF0YSkpIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLQotICAgIGlmIChzdHJlYW1pbmcpIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2UtPnNldFN0cmVhbWluZ1JlcXVlc3QobWV0YWRhdGEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlLT5jYXB0dXJlKG1ldGFkYXRhKTsKLSAgICB9Ci0KLSAgICAvLyB1bnJlYWNoYWJsZS4gdGh4IGdjYyBmb3IgYSB1c2VsZXNzIHdhcm5pbmcKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFByb0NhbWVyYTJDbGllbnQ6OmNhbmNlbFJlcXVlc3QoaW50IHJlcXVlc3RJZCkgewotICAgICh2b2lkKXJlcXVlc3RJZDsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7Ci0KLSAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHJldHVybiBERUFEX09CSkVDVDsKLQotICAgIGlmICghbUV4Y2x1c2l2ZUxvY2spIHsKLSAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIH0KLQotICAgIC8vIFRPRE86IGltcGxlbWVudAotICAgIEFMT0dFKCIlczogbm90IGZ1bGx5IGltcGxlbWVudGVkIHlldCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBQcm9DYW1lcmEyQ2xpZW50OjpkZWxldGVTdHJlYW0oaW50IHN0cmVhbUlkKSB7Ci0gICAgQVRSQUNFX0NBTEwoKTsKLSAgICBBTE9HVigiJXMgKHN0cmVhbUlkID0gMHgleCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKLQotICAgIHN0YXR1c190IHJlczsKLSAgICBpZiAoIChyZXMgPSBjaGVja1BpZChfX0ZVTkNUSU9OX18pICkgIT0gT0spIHJldHVybiByZXM7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7Ci0KLSAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHJldHVybiBERUFEX09CSkVDVDsKLSAgICBtRGV2aWNlLT5jbGVhclN0cmVhbWluZ1JlcXVlc3QoKTsKLQotICAgIHN0YXR1c190IGNvZGU7Ci0gICAgaWYgKChjb2RlID0gbURldmljZS0+d2FpdFVudGlsRHJhaW5lZCgpKSAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IHdhaXRVbnRpbERyYWluZWQgZmFpbGVkIHdpdGggY29kZSAweCV4IiwgX19GVU5DVElPTl9fLCBjb2RlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbURldmljZS0+ZGVsZXRlU3RyZWFtKHN0cmVhbUlkKTsKLX0KLQotc3RhdHVzX3QgUHJvQ2FtZXJhMkNsaWVudDo6Y3JlYXRlU3RyZWFtKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIsCi0gICAgICAgICAgICAgICAgICAgICAgLypvdXQqLwotICAgICAgICAgICAgICAgICAgICAgIGludCogc3RyZWFtSWQpCi17Ci0gICAgaWYgKHN0cmVhbUlkKSB7Ci0gICAgICAgICpzdHJlYW1JZCA9IC0xOwotICAgIH0KLQotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgQUxPR1YoIiVzICh3ID0gJWQsIGggPSAlZCwgZiA9IDB4JXgpIiwgX19GVU5DVElPTl9fLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOwotCi0gICAgc3RhdHVzX3QgcmVzOwotICAgIGlmICggKHJlcyA9IGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgKSAhPSBPSykgcmV0dXJuIHJlczsKLQotICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKLQotICAgIGlmICghbURldmljZS5nZXQoKSkgcmV0dXJuIERFQURfT0JKRUNUOwotCi0gICAgc3A8SUJpbmRlcj4gYmluZGVyOwotICAgIHNwPEFOYXRpdmVXaW5kb3c+IHdpbmRvdzsKLSAgICBpZiAoYnVmZmVyUHJvZHVjZXIgIT0gMCkgewotICAgICAgICBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihidWZmZXJQcm9kdWNlcik7Ci0gICAgICAgIHdpbmRvdyA9IG5ldyBTdXJmYWNlKGJ1ZmZlclByb2R1Y2VyKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbURldmljZS0+Y3JlYXRlU3RyZWFtKHdpbmRvdywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtSWQpOwotfQotCi0vLyBDcmVhdGUgYSByZXF1ZXN0IG9iamVjdCBmcm9tIGEgdGVtcGxhdGUuCi0vLyAtLSBDYWxsZXIgb3ducyB0aGUgbmV3bHkgYWxsb2NhdGVkIG1ldGFkYXRhCi1zdGF0dXNfdCBQcm9DYW1lcmEyQ2xpZW50OjpjcmVhdGVEZWZhdWx0UmVxdWVzdChpbnQgdGVtcGxhdGVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypvdXQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhKiogcmVxdWVzdCkKLXsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCIlcyAodGVtcGxhdGVJZCA9IDB4JXgpIiwgX19GVU5DVElPTl9fLCB0ZW1wbGF0ZUlkKTsKLQotICAgIGlmIChyZXF1ZXN0KSB7Ci0gICAgICAgICpyZXF1ZXN0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCByZXM7Ci0gICAgaWYgKCAocmVzID0gY2hlY2tQaWQoX19GVU5DVElPTl9fKSApICE9IE9LKSByZXR1cm4gcmVzOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwotCi0gICAgaWYgKCFtRGV2aWNlLmdldCgpKSByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0KLSAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKLSAgICBpZiAoIChyZXMgPSBtRGV2aWNlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdCh0ZW1wbGF0ZUlkLCAmbWV0YWRhdGEpICkgPT0gT0spIHsKLSAgICAgICAgKnJlcXVlc3QgPSBtZXRhZGF0YS5yZWxlYXNlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotc3RhdHVzX3QgUHJvQ2FtZXJhMkNsaWVudDo6Z2V0Q2FtZXJhSW5mbyhpbnQgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhKiogaW5mbykKLXsKLSAgICBpZiAoY2FtZXJhSWQgIT0gbUNhbWVyYUlkKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7Ci0KLSAgICBpZiAoIW1EZXZpY2UuZ2V0KCkpIHJldHVybiBERUFEX09CSkVDVDsKLQotICAgIENhbWVyYU1ldGFkYXRhIGRldmljZUluZm8gPSBtRGV2aWNlLT5pbmZvKCk7Ci0gICAgKmluZm8gPSBkZXZpY2VJbmZvLnJlbGVhc2UoKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgUHJvQ2FtZXJhMkNsaWVudDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKLSAgICByZXR1cm4gQmFzaWNDbGllbnQ6OmR1bXAoZmQsIGFyZ3MpOwotfQotCi1zdGF0dXNfdCBQcm9DYW1lcmEyQ2xpZW50OjpkdW1wQ2xpZW50KGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgewotICAgIFN0cmluZzggcmVzdWx0OwotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlByb0NhbWVyYTJDbGllbnRbJWRdICglcCkgUElEOiAlZCwgZHVtcDpcbiIsCi0gICAgICAgICAgICBtQ2FtZXJhSWQsCi0gICAgICAgICAgICAoZ2V0UmVtb3RlQ2FsbGJhY2soKSAhPSBOVUxMID8KLSAgICAgICAgICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIoZ2V0UmVtb3RlQ2FsbGJhY2soKSkuZ2V0KCkgOiBOVUxMKSwKLSAgICAgICAgICAgIG1DbGllbnRQaWQpOwotICAgIHJlc3VsdC5hcHBlbmQoIiAgU3RhdGU6XG4iKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIC8vIFRPRE86IHByaW50IGR5bmFtaWMvcmVxdWVzdCBzZWN0aW9uIGZyb20gbW9zdCByZWNlbnQgcmVxdWVzdHMKLSAgICBtRnJhbWVQcm9jZXNzb3ItPmR1bXAoZmQsIGFyZ3MpOwotICAgIHJldHVybiBkdW1wRGV2aWNlKGZkLCBhcmdzKTsKLX0KLQotLy8gSVByb0NhbWVyYVVzZXIgaW50ZXJmYWNlCi0KLXZvaWQgUHJvQ2FtZXJhMkNsaWVudDo6ZGV0YWNoRGV2aWNlKCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybjsKLQotICAgIEFMT0dWKCJDYW1lcmEgJWQ6IFN0b3BwaW5nIHByb2Nlc3NvcnMiLCBtQ2FtZXJhSWQpOwotCi0gICAgbUZyYW1lUHJvY2Vzc29yLT5yZW1vdmVMaXN0ZW5lcihGUkFNRV9QUk9DRVNTT1JfTElTVEVORVJfTUlOX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfUFJPQ0VTU09SX0xJU1RFTkVSX01BWF9JRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbGlzdGVuZXIqL3RoaXMpOwotICAgIG1GcmFtZVByb2Nlc3Nvci0+cmVxdWVzdEV4aXQoKTsKLSAgICBBTE9HVigiQ2FtZXJhICVkOiBXYWl0aW5nIGZvciB0aHJlYWRzIiwgbUNhbWVyYUlkKTsKLSAgICBtRnJhbWVQcm9jZXNzb3ItPmpvaW4oKTsKLSAgICBBTE9HVigiQ2FtZXJhICVkOiBEaXNjb25uZWN0aW5nIGRldmljZSIsIG1DYW1lcmFJZCk7Ci0KLSAgICAvLyBXT1JLQVJPVU5EOiBIQUwgcmVmdXNlcyB0byBkaXNjb25uZWN0IHdoaWxlIHRoZXJlJ3Mgc3RyZWFtcyBpbiBmbGlnaHQKLSAgICB7Ci0gICAgICAgIG1EZXZpY2UtPmNsZWFyU3RyZWFtaW5nUmVxdWVzdCgpOwotCi0gICAgICAgIHN0YXR1c190IGNvZGU7Ci0gICAgICAgIGlmICgoY29kZSA9IG1EZXZpY2UtPndhaXRVbnRpbERyYWluZWQoKSkgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogd2FpdFVudGlsRHJhaW5lZCBmYWlsZWQgd2l0aCBjb2RlIDB4JXgiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICBjb2RlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIENhbWVyYTJDbGllbnRCYXNlOjpkZXRhY2hEZXZpY2UoKTsKLX0KLQotdm9pZCBQcm9DYW1lcmEyQ2xpZW50OjpvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0JiByZXN1bHQpIHsKLSAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7Ci0gICAgU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzOjpMb2NrIGwobVNoYXJlZENhbWVyYUNhbGxiYWNrcyk7Ci0KLSAgICBpZiAobVJlbW90ZUNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgQ2FtZXJhTWV0YWRhdGEgdG1wKHJlc3VsdC5tTWV0YWRhdGEpOwotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCogbWV0YSA9IHRtcC5yZWxlYXNlKCk7Ci0gICAgICAgIEFMT0dWKCIlczogbWV0YSA9ICVwICIsIF9fRlVOQ1RJT05fXywgbWV0YSk7Ci0gICAgICAgIG1SZW1vdGVDYWxsYmFjay0+b25SZXN1bHRSZWNlaXZlZChyZXN1bHQubVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQsIG1ldGEpOwotICAgICAgICB0bXAuYWNxdWlyZShtZXRhKTsKLSAgICB9Ci19Ci0KLWJvb2wgUHJvQ2FtZXJhMkNsaWVudDo6ZW5mb3JjZVJlcXVlc3RQZXJtaXNzaW9ucyhDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEpIHsKLQotICAgIGNvbnN0IGludCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci0gICAgY29uc3QgaW50IHNlbGZQaWQgPSBnZXRwaWQoKTsKLSAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeTsKLQotICAgIC8qKgotICAgICAqIE1peGluIGRlZmF1bHQgaW1wb3J0YW50IHNlY3VyaXR5IHZhbHVlcwotICAgICAqIC0gYW5kcm9pZC5sZWQudHJhbnNtaXQgPSBkZWZhdWx0ZWQgT04KLSAgICAgKi8KLSAgICBDYW1lcmFNZXRhZGF0YSBzdGF0aWNJbmZvID0gbURldmljZS0+aW5mbygpOwotICAgIGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfTEVEX0FWQUlMQUJMRV9MRURTKTsKLSAgICBmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7ICsraSkgewotICAgICAgICB1aW50OF90IGxlZCA9IGVudHJ5LmRhdGEudThbaV07Ci0KLSAgICAgICAgc3dpdGNoKGxlZCkgewotICAgICAgICAgICAgY2FzZSBBTkRST0lEX0xFRF9BVkFJTEFCTEVfTEVEU19UUkFOU01JVDogewotICAgICAgICAgICAgICAgIHVpbnQ4X3QgdHJhbnNtaXREZWZhdWx0ID0gQU5EUk9JRF9MRURfVFJBTlNNSVRfT047Ci0gICAgICAgICAgICAgICAgaWYgKCFtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9MRURfVFJBTlNNSVQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnVwZGF0ZShBTkRST0lEX0xFRF9UUkFOU01JVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc21pdERlZmF1bHQsIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFdlIGNhbiBkbyBhbnl0aGluZyEKLSAgICBpZiAocGlkID09IHNlbGZQaWQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVybWlzc2lvbiBjaGVjayBzcGVjaWFsIGZpZWxkcyBpbiB0aGUgcmVxdWVzdAotICAgICAqIC0gYW5kcm9pZC5sZWQudHJhbnNtaXQgPSBhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBX0RJU0FCTEVfVFJBTlNNSVQKLSAgICAgKi8KLSAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9MRURfVFJBTlNNSVQpOwotICAgIGlmIChlbnRyeS5jb3VudCA+IDAgJiYgZW50cnkuZGF0YS51OFswXSAhPSBBTkRST0lEX0xFRF9UUkFOU01JVF9PTikgewotICAgICAgICBTdHJpbmcxNiBwZXJtaXNzaW9uU3RyaW5nID0KLSAgICAgICAgICAgIFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBX0RJU0FCTEVfVFJBTlNNSVRfTEVEIik7Ci0gICAgICAgIGlmICghY2hlY2tDYWxsaW5nUGVybWlzc2lvbihwZXJtaXNzaW9uU3RyaW5nKSkgewotICAgICAgICAgICAgY29uc3QgaW50IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICAgICAgICAgIEFMT0dFKCJQZXJtaXNzaW9uIERlbmlhbDogIgotICAgICAgICAgICAgICAgICAgImNhbid0IGRpc2FibGUgdHJhbnNtaXQgTEVEIHBpZD0lZCwgdWlkPSVkIiwgcGlkLCB1aWQpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaV9wcm8vUHJvQ2FtZXJhMkNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZDg2OWQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpX3Byby9Qcm9DYW1lcmEyQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9QUk9DQU1FUkEyQ0xJRU5UX0gKLSNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9QUk9DQU1FUkEyQ0xJRU5UX0gKLQotI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKLSNpbmNsdWRlICJjb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmgiCi0jaW5jbHVkZSAiY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgiCi0jaW5jbHVkZSAiZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmgiCi0jaW5jbHVkZSAiY2FtZXJhL0NhcHR1cmVSZXN1bHQuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBJTWVtb3J5OwotLyoqCi0gKiBJbXBsZW1lbnRzIHRoZSBiaW5kZXIgSVByb0NhbWVyYVVzZXIgQVBJLAotICogbWVhbnQgZm9yIEhBTDItbGV2ZWwgcHJpdmF0ZSBBUEkgYWNjZXNzLgotICovCi1jbGFzcyBQcm9DYW1lcmEyQ2xpZW50IDoKLSAgICAgICAgcHVibGljIENhbWVyYTJDbGllbnRCYXNlPENhbWVyYVNlcnZpY2U6OlByb0NsaWVudD4sCi0gICAgICAgIHB1YmxpYyBjYW1lcmEyOjpGcmFtZVByb2Nlc3NvckJhc2U6OkZpbHRlcmVkTGlzdGVuZXIKLXsKLXB1YmxpYzoKLSAgICAvKioKLSAgICAgKiBJUHJvQ2FtZXJhVXNlciBpbnRlcmZhY2UgKHNlZSBJUHJvQ2FtZXJhVXNlciBmb3IgZGV0YWlscykKLSAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZXhjbHVzaXZlVHJ5TG9jaygpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBleGNsdXNpdmVMb2NrKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGV4Y2x1c2l2ZVVubG9jaygpOwotCi0gICAgdmlydHVhbCBib29sICAgICAgICAgIGhhc0V4Y2x1c2l2ZUxvY2soKTsKLQotICAgIC8vIE5vdGUgdGhhdCB0aGUgY2FsbGVlIGdldHMgYSBjb3B5IG9mIHRoZSBtZXRhZGF0YS4KLSAgICB2aXJ0dWFsIGludCAgICAgICAgICAgc3VibWl0UmVxdWVzdChjYW1lcmFfbWV0YWRhdGFfdCogbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcgPSBmYWxzZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGNhbmNlbFJlcXVlc3QoaW50IHJlcXVlc3RJZCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZGVsZXRlU3RyZWFtKGludCBzdHJlYW1JZCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgY3JlYXRlU3RyZWFtKAotICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIsCi0gICAgICAgICAgICAvKm91dCovCi0gICAgICAgICAgICBpbnQqIHN0cmVhbUlkKTsKLQotICAgIC8vIENyZWF0ZSBhIHJlcXVlc3Qgb2JqZWN0IGZyb20gYSB0ZW1wbGF0ZS4KLSAgICAvLyAtLSBDYWxsZXIgb3ducyB0aGUgbmV3bHkgYWxsb2NhdGVkIG1ldGFkYXRhCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGNyZWF0ZURlZmF1bHRSZXF1ZXN0KGludCB0ZW1wbGF0ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YSoqIHJlcXVlc3QpOwotCi0gICAgLy8gR2V0IHRoZSBzdGF0aWMgbWV0YWRhdGEgZm9yIHRoZSBjYW1lcmEKLSAgICAvLyAtLSBDYWxsZXIgb3ducyB0aGUgbmV3bHkgYWxsb2NhdGVkIG1ldGFkYXRhCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGdldENhbWVyYUluZm8oaW50IGNhbWVyYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGEqKiBpbmZvKTsKLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSB1c2VkIGJ5IENhbWVyYVNlcnZpY2UKLSAgICAgKi8KLQotICAgIFByb0NhbWVyYTJDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCi0gICAgICAgICAgICBjb25zdCBzcDxJUHJvQ2FtZXJhQ2FsbGJhY2tzPiYgcmVtb3RlQ2FsbGJhY2ssCi0gICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBpbnQgY2FtZXJhSWQsCi0gICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAotICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKLSAgICAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKLSAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKTsKLSAgICB2aXJ0dWFsIH5Qcm9DYW1lcmEyQ2xpZW50KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgaW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGR1bXBDbGllbnQoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLQotICAgIC8vIENhbGxiYWNrcyBmcm9tIGNhbWVyYSBzZXJ2aWNlCi0gICAgdmlydHVhbCB2b2lkIG9uRXhjbHVzaXZlTG9ja1N0b2xlbigpOwotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIHVzZWQgYnkgaW5kZXBlbmRlbnQgY29tcG9uZW50cyBvZiBQcm9DYW1lcmEyQ2xpZW50LgotICAgICAqLwotCi1wcm90ZWN0ZWQ6Ci0gICAgLyoqIEZpbHRlcmVkTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKiovCi0gICAgdmlydHVhbCB2b2lkIG9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQmIHJlc3VsdCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgZGV0YWNoRGV2aWNlKCk7Ci0KLXByaXZhdGU6Ci0gICAgLyoqIElQcm9DYW1lcmFVc2VyIGludGVyZmFjZS1yZWxhdGVkIHByaXZhdGUgbWVtYmVycyAqLwotCi0gICAgLyoqIFByZXZpZXcgY2FsbGJhY2sgcmVsYXRlZCBtZW1iZXJzICovCi0gICAgc3A8Y2FtZXJhMjo6RnJhbWVQcm9jZXNzb3JCYXNlPiBtRnJhbWVQcm9jZXNzb3I7Ci0gICAgc3RhdGljIGNvbnN0IGludDMyX3QgRlJBTUVfUFJPQ0VTU09SX0xJU1RFTkVSX01JTl9JRCA9IDA7Ci0gICAgc3RhdGljIGNvbnN0IGludDMyX3QgRlJBTUVfUFJPQ0VTU09SX0xJU1RFTkVSX01BWF9JRCA9IDB4N2ZmZmZmZmZMOwotCi0gICAgLyoqIFV0aWxpdHkgbWVtYmVycyAqLwotICAgIGJvb2wgZW5mb3JjZVJlcXVlc3RQZXJtaXNzaW9ucyhDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEpOwotCi0gICAgLy8gV2hldGhlciBvciBub3Qgd2UgaGF2ZSBhbiBleGNsdXNpdmUgbG9jayBvbiB0aGUgZGV2aWNlCi0gICAgLy8gLSBpZiBubyB3ZSBjYW4ndCBtb2RpZnkgdGhlIHJlcXVlc3QgcXVldWUuCi0gICAgLy8gbm90ZSB0aGF0IGNyZWF0aW5nL2RlbGV0aW5nIHN0cmVhbXMgd2Ugb3duIGlzIHN0aWxsIE9LCi0gICAgYm9vbCBtRXhjbHVzaXZlTG9jazsKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKaW5kZXggMjRhY2ZiZi4uZmRiODAxZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCkBAIC03OCw3ICs3OCw3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KLXN0YXR1c190IENhbWVyYTJDbGllbnRCYXNlPFRDbGllbnRCYXNlPjo6aW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSkgeworc3RhdHVzX3QgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+Ojppbml0aWFsaXplKENhbWVyYU1vZHVsZSAqbW9kdWxlKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IEluaXRpYWxpemluZyBjbGllbnQgZm9yIGNhbWVyYSAlZCIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkKTsKQEAgLTI4MCw2ICsyODAsMTQgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFRDbGllbnRCYXNlPgordm9pZCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46Om5vdGlmeVByZXBhcmVkKGludCBzdHJlYW1JZCkgeworICAgICh2b2lkKXN0cmVhbUlkOworCisgICAgQUxPR1YoIiVzOiBTdHJlYW0gJWQgbm93IHByZXBhcmVkIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CiBpbnQgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+OjpnZXRDYW1lcmFJZCgpIGNvbnN0IHsKICAgICByZXR1cm4gVENsaWVudEJhc2U6Om1DYW1lcmFJZDsKIH0KQEAgLTMzNyw3ICszNDUsNiBAQAogICAgIG1SZW1vdGVDYWxsYmFjay5jbGVhcigpOwogfQogCi10ZW1wbGF0ZSBjbGFzcyBDYW1lcmEyQ2xpZW50QmFzZTxDYW1lcmFTZXJ2aWNlOjpQcm9DbGllbnQ+OwogdGVtcGxhdGUgY2xhc3MgQ2FtZXJhMkNsaWVudEJhc2U8Q2FtZXJhU2VydmljZTo6Q2xpZW50PjsKIHRlbXBsYXRlIGNsYXNzIENhbWVyYTJDbGllbnRCYXNlPENhbWVyYURldmljZUNsaWVudEJhc2U+OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCmluZGV4IDc3YWU0ZmMuLmQ2NmUxMWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBMkNMSUVOVF9CQVNFX0gKIAogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCisjaW5jbHVkZSAiY29tbW9uL0NhbWVyYU1vZHVsZS5oIgogI2luY2x1ZGUgImNhbWVyYS9DYXB0dXJlUmVzdWx0LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTM1LDcgKzM2LDcgQEAKICAgICB0eXBlZGVmIHR5cGVuYW1lIFRDbGllbnRCYXNlOjpUQ2FtQ2FsbGJhY2tzIFRDYW1DYWxsYmFja3M7CiAKICAgICAvKioKLSAgICAgKiBCYXNlIGJpbmRlciBpbnRlcmZhY2UgKHNlZSBJQ2FtZXJhL0lQcm9DYW1lcmFVc2VyIGZvciBkZXRhaWxzKQorICAgICAqIEJhc2UgYmluZGVyIGludGVyZmFjZSAoc2VlIElDYW1lcmEvSUNhbWVyYURldmljZVVzZXIgZm9yIGRldGFpbHMpCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGNvbm5lY3QoY29uc3Qgc3A8VENhbUNhbGxiYWNrcz4mIGNhbGxiYWNrcyk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKQEAgLTU1LDcgKzU2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VydmljZVBpZCk7CiAgICAgdmlydHVhbCB+Q2FtZXJhMkNsaWVudEJhc2UoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgICBpbml0aWFsaXplKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgICAgaW5pdGlhbGl6ZShDYW1lcmFNb2R1bGUgKm1vZHVsZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICAgIGR1bXBDbGllbnQoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgIC8qKgpAQCAtNzEsNyArNzIsNyBAQAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlBdXRvRXhwb3N1cmUodWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICAgIG5vdGlmeUF1dG9XaGl0ZWJhbGFuY2UodWludDhfdCBuZXdTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJpZ2dlcklkKTsKLQorICAgIHZpcnR1YWwgdm9pZCAgICAgICAgICBub3RpZnlQcmVwYXJlZChpbnQgc3RyZWFtSWQpOwogCiAgICAgaW50ICAgICAgICAgICAgICAgICAgIGdldENhbWVyYUlkKCkgY29uc3Q7CiAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4mCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaAppbmRleCBkMjZlMjBjLi5jZDI1OTQ5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgKQEAgLTI5LDYgKzI5LDggQEAKICNpbmNsdWRlICJoYXJkd2FyZS9jYW1lcmEzLmgiCiAjaW5jbHVkZSAiY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmgiCiAjaW5jbHVkZSAiY2FtZXJhL0NhcHR1cmVSZXN1bHQuaCIKKyNpbmNsdWRlICJjb21tb24vQ2FtZXJhTW9kdWxlLmgiCisjaW5jbHVkZSAiZ3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00NSw3ICs0Nyw3IEBACiAgICAgICovCiAgICAgdmlydHVhbCBpbnQgICAgICBnZXRJZCgpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZShDYW1lcmFNb2R1bGUgKm1vZHVsZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdCgpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJmFyZ3MpID0gMDsKQEAgLTk5LDE3ICsxMDEsMjIgQEAKICAgICAgICAgICAgIG5zZWNzX3QgdGltZW91dCkgPSAwOwogCiAgICAgLyoqCi0gICAgICogQ3JlYXRlIGFuIG91dHB1dCBzdHJlYW0gb2YgdGhlIHJlcXVlc3RlZCBzaXplIGFuZCBmb3JtYXQuCisgICAgICogQ3JlYXRlIGFuIG91dHB1dCBzdHJlYW0gb2YgdGhlIHJlcXVlc3RlZCBzaXplLCBmb3JtYXQsIHJvdGF0aW9uIGFuZCBkYXRhc3BhY2UKICAgICAgKgotICAgICAqIElmIGZvcm1hdCBpcyBDQU1FUkEyX0hBTF9QSVhFTF9GT1JNQVRfT1BBUVVFLCB0aGVuIHRoZSBIQUwgZGV2aWNlIHNlbGVjdHMKLSAgICAgKiBhbiBhcHByb3ByaWF0ZSBmb3JtYXQ7IGl0IGNhbiBiZSBxdWVyaWVkIHdpdGggZ2V0U3RyZWFtSW5mby4KLSAgICAgKgotICAgICAqIElmIGZvcm1hdCBpcyBIQUxfUElYRUxfRk9STUFUX0NPTVBSRVNTRUQsIHRoZSBzaXplIHBhcmFtZXRlciBtdXN0IGJlCi0gICAgICogZXF1YWwgdG8gdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGJ1ZmZlcnMgdG8gYWxsb2NhdGUgZm9yIHRoZSBzdHJlYW0uIEZvcgotICAgICAqIG90aGVyIGZvcm1hdHMsIHRoZSBzaXplIHBhcmFtZXRlciBpcyBpZ25vcmVkLgorICAgICAqIEZvciBIQUxfUElYRUxfRk9STUFUX0JMT0IgZm9ybWF0cywgdGhlIHdpZHRoIGFuZCBoZWlnaHQgc2hvdWxkIGJlIHRoZQorICAgICAqIGxvZ2ljYWwgZGltZW5zaW9ucyBvZiB0aGUgYnVmZmVyLCBub3QgdGhlIG51bWJlciBvZiBieXRlcy4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVN0cmVhbShzcDxBTmF0aXZlV2luZG93PiBjb25zdW1lciwKLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIGludCAqaWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVN0cmVhbShzcDxTdXJmYWNlPiBjb25zdW1lciwKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQpID0gMDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBpbnB1dCBzdHJlYW0gb2Ygd2lkdGgsIGhlaWdodCwgYW5kIGZvcm1hdC4KKyAgICAgKgorICAgICAqIFJldHVybiB2YWx1ZSBpcyB0aGUgc3RyZWFtIElEIGlmIG5vbi1uZWdhdGl2ZSBhbmQgYW4gZXJyb3IgaWYgbmVnYXRpdmUuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVJbnB1dFN0cmVhbSh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQsIC8qb3V0Ki8gaW50MzJfdCAqaWQpID0gMDsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhbiBpbnB1dCByZXByb2Nlc3Mgc3RyZWFtIHRoYXQgdXNlcyBidWZmZXJzIGZyb20gYW4gZXhpc3RpbmcKQEAgLTEyMSw3ICsxMjgsOCBAQAogICAgICAqIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhIGdpdmVuIHN0cmVhbS4KICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbUluZm8oaW50IGlkLAotICAgICAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LCB1aW50MzJfdCAqZm9ybWF0KSA9IDA7CisgICAgICAgICAgICB1aW50MzJfdCAqd2lkdGgsIHVpbnQzMl90ICpoZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCAqZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZSAqZGF0YVNwYWNlKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBTZXQgc3RyZWFtIGdyYWxsb2MgYnVmZmVyIHRyYW5zZm9ybQpAQCAtMTUwLDcgKzE1OCwxMSBAQAogICAgICAqIC0gQkFEX1ZBTFVFIGlmIHRoZSBzZXQgb2Ygc3RyZWFtcyB3YXMgaW52YWxpZCAoZS5nLiBmbXRzIG9yIHNpemVzKQogICAgICAqIC0gSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlIGRldmljZSB3YXMgaW4gdGhlIHdyb25nIHN0YXRlCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtcyhib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWQgPSBmYWxzZSkgPSAwOworCisgICAgLy8gZ2V0IHRoZSBidWZmZXIgcHJvZHVjZXIgb2YgdGhlIGlucHV0IHN0cmVhbQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJQcm9kdWNlcigKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpwcm9kdWNlcikgPSAwOwogCiAgICAgLyoqCiAgICAgICogQ3JlYXRlIGEgbWV0YWRhdGEgYnVmZmVyIHdpdGggZmllbGRzIHRoYXQgdGhlIEhBTCBkZXZpY2UgYmVsaWV2ZXMgYXJlCkBAIC0xODgsNiArMjAwLDcgQEAKICAgICAgICAgdmlydHVhbCB2b2lkIG5vdGlmeUlkbGUoKSA9IDA7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBub3RpZnlTaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgJnJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5UHJlcGFyZWQoaW50IHN0cmVhbUlkKSA9IDA7CiAKICAgICAgICAgLy8gUmVxdWlyZWQgb25seSBmb3IgQVBJMQogICAgICAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5QXV0b0ZvY3VzKHVpbnQ4X3QgbmV3U3RhdGUsIGludCB0cmlnZ2VySWQpID0gMDsKQEAgLTI3MCw2ICsyODMsMTcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpID0gMDsKIAogICAgIC8qKgorICAgICAqIFByZXBhcmUgc3RyZWFtIGJ5IHByZWFsbG9jYXRpbmcgYnVmZmVycyBmb3IgaXQgYXN5bmNocm9ub3VzbHkuCisgICAgICogQ2FsbHMgbm90aWZ5UHJlcGFyZWQoKSBvbmNlIGFsbG9jYXRpb24gaXMgY29tcGxldGUuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlKGludCBzdHJlYW1JZCkgPSAwOworCisgICAgLyoqCisgICAgICogRnJlZSBzdHJlYW0gcmVzb3VyY2VzIGJ5IGR1bXBpbmcgaXRzIHVudXNlZCBncmFsbG9jIGJ1ZmZlcnMuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCB0ZWFyRG93bihpbnQgc3RyZWFtSWQpID0gMDsKKworICAgIC8qKgogICAgICAqIEdldCB0aGUgSEFMIGRldmljZSB2ZXJzaW9uLgogICAgICAqLwogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0RGV2aWNlVmVyc2lvbigpID0gMDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFNb2R1bGUuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYU1vZHVsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE0ZGZlMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFNb2R1bGUuY3BwCkBAIC0wLDAgKzEsMjgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmFNb2R1bGUiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJDYW1lcmFNb2R1bGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIENhbWVyYU1vZHVsZTo6ZGVyaXZlQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzS2V5cygKKyAgICAgICAgdWludDMyX3QgZGV2aWNlVmVyc2lvbiwgQ2FtZXJhTWV0YWRhdGEgJmNoYXJzKSB7CisgICAgLy8gSEFMMSBkZXZpY2VzIHNob3VsZCBub3QgcmVhY2ggaGVyZQorICAgIGlmIChkZXZpY2VWZXJzaW9uIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8yXzApIHsKKyAgICAgICAgQUxPR1YoIiVzOiBDYW5ub3QgZGVyaXZlIGtleXMgZm9yIEhBTCB2ZXJzaW9uIDwgMi4wIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBLZXlzIGFkZGVkIGluIEhBTDMuMworICAgIGlmIChkZXZpY2VWZXJzaW9uIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzMpIHsKKyAgICAgICAgY29uc3Qgc2l6ZV90IE5VTV9ERVJJVkVEX0tFWVNfSEFMM18zID0gNTsKKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnRyb2xNb2RlczsKKyAgICAgICAgdWludDhfdCBkYXRhID0gQU5EUk9JRF9DT05UUk9MX0FFX0xPQ0tfQVZBSUxBQkxFX1RSVUU7CisgICAgICAgIGNoYXJzLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUVfTE9DS19BVkFJTEFCTEUsICZkYXRhLCAvKmNvdW50Ki8xKTsKKyAgICAgICAgZGF0YSA9IEFORFJPSURfQ09OVFJPTF9BV0JfTE9DS19BVkFJTEFCTEVfVFJVRTsKKyAgICAgICAgY2hhcnMudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BV0JfTE9DS19BVkFJTEFCTEUsICZkYXRhLCAvKmNvdW50Ki8xKTsKKyAgICAgICAgY29udHJvbE1vZGVzLnB1c2goQU5EUk9JRF9DT05UUk9MX01PREVfQVVUTyk7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBlbnRyeSA9IGNoYXJzLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FWQUlMQUJMRV9TQ0VORV9NT0RFUyk7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDEgfHwgZW50cnkuZGF0YS51OFswXSAhPSBBTkRST0lEX0NPTlRST0xfU0NFTkVfTU9ERV9ESVNBQkxFRCkgeworICAgICAgICAgICAgY29udHJvbE1vZGVzLnB1c2goQU5EUk9JRF9DT05UUk9MX01PREVfVVNFX1NDRU5FX01PREUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gT25seSBhZHZlcnRpc2UgQ09OVFJPTF9PRkYgbW9kZSBpZiAzQSBtYW51YWwgY29udHJvbHMgYXJlIHN1cHBvcnRlZC4KKyAgICAgICAgYm9vbCBpc01hbnVhbEFlU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIGJvb2wgaXNNYW51YWxBZlN1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICBib29sIGlzTWFudWFsQXdiU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIGVudHJ5ID0gY2hhcnMuZmluZChBTkRST0lEX0NPTlRST0xfQUVfQVZBSUxBQkxFX01PREVTKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmRhdGEudThbaV0gPT0gQU5EUk9JRF9DT05UUk9MX0FFX01PREVfT0ZGKSB7CisgICAgICAgICAgICAgICAgICAgIGlzTWFudWFsQWVTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZW50cnkgPSBjaGFycy5maW5kKEFORFJPSURfQ09OVFJPTF9BRl9BVkFJTEFCTEVfTU9ERVMpOworICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkuZGF0YS51OFtpXSA9PSBBTkRST0lEX0NPTlRST0xfQUZfTU9ERV9PRkYpIHsKKyAgICAgICAgICAgICAgICAgICAgaXNNYW51YWxBZlN1cHBvcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbnRyeSA9IGNoYXJzLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FXQl9BVkFJTEFCTEVfTU9ERVMpOworICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkuZGF0YS51OFtpXSA9PSBBTkRST0lEX0NPTlRST0xfQVdCX01PREVfT0ZGKSB7CisgICAgICAgICAgICAgICAgICAgIGlzTWFudWFsQXdiU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpc01hbnVhbEFlU3VwcG9ydGVkICYmIGlzTWFudWFsQWZTdXBwb3J0ZWQgJiYgaXNNYW51YWxBd2JTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGNvbnRyb2xNb2Rlcy5wdXNoKEFORFJPSURfQ09OVFJPTF9NT0RFX09GRik7CisgICAgICAgIH0KKworICAgICAgICBjaGFycy51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0FWQUlMQUJMRV9NT0RFUywgY29udHJvbE1vZGVzKTsKKworICAgICAgICBlbnRyeSA9IGNoYXJzLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9SRVFVRVNUX0tFWVMpOworICAgICAgICAvLyBIQUwzLjIgZGV2aWNlcyBwYXNzaW5nIGV4aXN0aW5nIENUUyB0ZXN0IHNob3VsZCBhbGwgc3VwcG9ydCBhbGwgTFNDIG1vZGVzIGFuZCBMU0MgbWFwCisgICAgICAgIGJvb2wgbGVuc1NoYWRpbmdNb2RlU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5kYXRhLmkzMltpXSA9PSBBTkRST0lEX1NIQURJTkdfTU9ERSkgeworICAgICAgICAgICAgICAgICAgICBsZW5zU2hhZGluZ01vZGVTdXBwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGxzY01vZGVzOworICAgICAgICBWZWN0b3I8dWludDhfdD4gbHNjTWFwTW9kZXM7CisgICAgICAgIGxzY01vZGVzLnB1c2goQU5EUk9JRF9TSEFESU5HX01PREVfRkFTVCk7CisgICAgICAgIGxzY01vZGVzLnB1c2goQU5EUk9JRF9TSEFESU5HX01PREVfSElHSF9RVUFMSVRZKTsKKyAgICAgICAgbHNjTWFwTW9kZXMucHVzaChBTkRST0lEX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUF9NT0RFX09GRik7CisgICAgICAgIGlmIChsZW5zU2hhZGluZ01vZGVTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGxzY01vZGVzLnB1c2goQU5EUk9JRF9TSEFESU5HX01PREVfT0ZGKTsKKyAgICAgICAgICAgIGxzY01hcE1vZGVzLnB1c2goQU5EUk9JRF9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVBfTU9ERV9PTik7CisgICAgICAgIH0KKyAgICAgICAgY2hhcnMudXBkYXRlKEFORFJPSURfU0hBRElOR19BVkFJTEFCTEVfTU9ERVMsIGxzY01vZGVzKTsKKyAgICAgICAgY2hhcnMudXBkYXRlKEFORFJPSURfU1RBVElTVElDU19JTkZPX0FWQUlMQUJMRV9MRU5TX1NIQURJTkdfTUFQX01PREVTLCBsc2NNYXBNb2Rlcyk7CisKKyAgICAgICAgZW50cnkgPSBjaGFycy5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVMpOworICAgICAgICBWZWN0b3I8aW50MzJfdD4gYXZhaWxhYmxlQ2hhcnNLZXlzOworICAgICAgICBhdmFpbGFibGVDaGFyc0tleXMuc2V0Q2FwYWNpdHkoZW50cnkuY291bnQgKyBOVU1fREVSSVZFRF9LRVlTX0hBTDNfMyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7IGkrKykgeworICAgICAgICAgICAgYXZhaWxhYmxlQ2hhcnNLZXlzLnB1c2goZW50cnkuZGF0YS5pMzJbaV0pOworICAgICAgICB9CisgICAgICAgIGF2YWlsYWJsZUNoYXJzS2V5cy5wdXNoKEFORFJPSURfQ09OVFJPTF9BRV9MT0NLX0FWQUlMQUJMRSk7CisgICAgICAgIGF2YWlsYWJsZUNoYXJzS2V5cy5wdXNoKEFORFJPSURfQ09OVFJPTF9BV0JfTE9DS19BVkFJTEFCTEUpOworICAgICAgICBhdmFpbGFibGVDaGFyc0tleXMucHVzaChBTkRST0lEX0NPTlRST0xfQVZBSUxBQkxFX01PREVTKTsKKyAgICAgICAgYXZhaWxhYmxlQ2hhcnNLZXlzLnB1c2goQU5EUk9JRF9TSEFESU5HX0FWQUlMQUJMRV9NT0RFUyk7CisgICAgICAgIGF2YWlsYWJsZUNoYXJzS2V5cy5wdXNoKEFORFJPSURfU1RBVElTVElDU19JTkZPX0FWQUlMQUJMRV9MRU5TX1NIQURJTkdfTUFQX01PREVTKTsKKyAgICAgICAgY2hhcnMudXBkYXRlKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVMsIGF2YWlsYWJsZUNoYXJzS2V5cyk7CisKKyAgICAgICAgLy8gTmVlZCB1cGRhdGUgYW5kcm9pZC5jb250cm9sLmF2YWlsYWJsZUhpZ2hTcGVlZFZpZGVvQ29uZmlndXJhdGlvbnMgc2luY2UgSEFMMy4zCisgICAgICAgIC8vIGFkZHMgYmF0Y2ggc2l6ZSB0byB0aGlzIGFycmF5LgorICAgICAgICBlbnRyeSA9IGNoYXJzLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FWQUlMQUJMRV9ISUdIX1NQRUVEX1ZJREVPX0NPTkZJR1VSQVRJT05TKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAgICAgVmVjdG9yPGludDMyX3Q+IGhpZ2hTcGVlZENvbmZpZzsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7IGkgKz0gNCkgeworICAgICAgICAgICAgICAgIGhpZ2hTcGVlZENvbmZpZy5hZGQoZW50cnkuZGF0YS5pMzJbaV0pOyAvLyB3aWR0aAorICAgICAgICAgICAgICAgIGhpZ2hTcGVlZENvbmZpZy5hZGQoZW50cnkuZGF0YS5pMzJbaSArIDFdKTsgLy8gaGVpZ2h0CisgICAgICAgICAgICAgICAgaGlnaFNwZWVkQ29uZmlnLmFkZChlbnRyeS5kYXRhLmkzMltpICsgMl0pOyAvLyBmcHNfbWluCisgICAgICAgICAgICAgICAgaGlnaFNwZWVkQ29uZmlnLmFkZChlbnRyeS5kYXRhLmkzMltpICsgM10pOyAvLyBmcHNfbWF4CisgICAgICAgICAgICAgICAgaGlnaFNwZWVkQ29uZmlnLmFkZCgxKTsgLy8gYmF0Y2hTaXplX21heC4gZGVmYXVsdCB0byAxIGZvciBIQUwzLjIKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYXJzLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQVZBSUxBQkxFX0hJR0hfU1BFRURfVklERU9fQ09ORklHVVJBVElPTlMsCisgICAgICAgICAgICAgICAgICAgIGhpZ2hTcGVlZENvbmZpZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBbHdheXMgYWRkIGEgZGVmYXVsdCBmb3IgdGhlIHByZS1jb3JyZWN0aW9uIGFjdGl2ZSBhcnJheSBpZiB0aGUgdmVuZG9yIGNob29zZXMgdG8gb21pdCB0aGlzCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGVudHJ5ID0gY2hhcnMuZmluZChBTkRST0lEX1NFTlNPUl9JTkZPX1BSRV9DT1JSRUNUSU9OX0FDVElWRV9BUlJBWV9TSVpFKTsKKyAgICBpZiAoZW50cnkuY291bnQgPT0gMCkgeworICAgICAgICBWZWN0b3I8aW50MzJfdD4gcHJlQ29ycmVjdGlvbkFycmF5OworICAgICAgICBlbnRyeSA9IGNoYXJzLmZpbmQoQU5EUk9JRF9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRSk7CisgICAgICAgIHByZUNvcnJlY3Rpb25BcnJheS5hcHBlbmRBcnJheShlbnRyeS5kYXRhLmkzMiwgZW50cnkuY291bnQpOworICAgICAgICBjaGFycy51cGRhdGUoQU5EUk9JRF9TRU5TT1JfSU5GT19QUkVfQ09SUkVDVElPTl9BQ1RJVkVfQVJSQVlfU0laRSwgcHJlQ29ycmVjdGlvbkFycmF5KTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKK0NhbWVyYU1vZHVsZTo6Q2FtZXJhTW9kdWxlKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKSB7CisgICAgaWYgKG1vZHVsZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogY2FtZXJhIGhhcmR3YXJlIG1vZHVsZSBtdXN0IG5vdCBiZSBudWxsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgYXNzZXJ0KDApOworICAgIH0KKworICAgIG1Nb2R1bGUgPSBtb2R1bGU7CisgICAgbUNhbWVyYUluZm9NYXAuc2V0Q2FwYWNpdHkoZ2V0TnVtYmVyT2ZDYW1lcmFzKCkpOworfQorCitDYW1lcmFNb2R1bGU6On5DYW1lcmFNb2R1bGUoKQoreworICAgIHdoaWxlIChtQ2FtZXJhSW5mb01hcC5zaXplKCkgPiAwKSB7CisgICAgICAgIGNhbWVyYV9pbmZvIGNhbWVyYUluZm8gPSBtQ2FtZXJhSW5mb01hcC5lZGl0VmFsdWVBdCgwKTsKKyAgICAgICAgaWYgKGNhbWVyYUluZm8uc3RhdGljX2NhbWVyYV9jaGFyYWN0ZXJpc3RpY3MgIT0gTlVMTCkgeworICAgICAgICAgICAgZnJlZV9jYW1lcmFfbWV0YWRhdGEoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihjYW1lcmFJbmZvLnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzKSk7CisgICAgICAgIH0KKyAgICAgICAgbUNhbWVyYUluZm9NYXAucmVtb3ZlSXRlbXNBdCgwKTsKKyAgICB9Cit9CisKK2ludCBDYW1lcmFNb2R1bGU6OmluaXQoKSB7CisgICAgaWYgKGdldE1vZHVsZUFwaVZlcnNpb24oKSA+PSBDQU1FUkFfTU9EVUxFX0FQSV9WRVJTSU9OXzJfNCAmJgorICAgICAgICAgICAgbU1vZHVsZS0+aW5pdCAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtTW9kdWxlLT5pbml0KCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworaW50IENhbWVyYU1vZHVsZTo6Z2V0Q2FtZXJhSW5mbyhpbnQgY2FtZXJhSWQsIHN0cnVjdCBjYW1lcmFfaW5mbyAqaW5mbykgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1DYW1lcmFJbmZvTG9jayk7CisgICAgaWYgKGNhbWVyYUlkIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY2FtZXJhIElEICVkIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZCk7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIC8vIE9ubHkgb3ZlcnJpZGUgc3RhdGljX2NhbWVyYV9jaGFyYWN0ZXJpc3RpY3MgZm9yIEFQSTIgZGV2aWNlcworICAgIGludCBhcGlWZXJzaW9uID0gbU1vZHVsZS0+Y29tbW9uLm1vZHVsZV9hcGlfdmVyc2lvbjsKKyAgICBpZiAoYXBpVmVyc2lvbiA8IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8wKSB7CisgICAgICAgIHJldHVybiBtTW9kdWxlLT5nZXRfY2FtZXJhX2luZm8oY2FtZXJhSWQsIGluZm8pOworICAgIH0KKworICAgIHNzaXplX3QgaW5kZXggPSBtQ2FtZXJhSW5mb01hcC5pbmRleE9mS2V5KGNhbWVyYUlkKTsKKyAgICBpZiAoaW5kZXggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgLy8gR2V0IGNhbWVyYSBpbmZvIGZyb20gcmF3IG1vZHVsZSBhbmQgY2FjaGUgaXQKKyAgICAgICAgY2FtZXJhX2luZm8gcmF3SW5mbywgY2FtZXJhSW5mbzsKKyAgICAgICAgaW50IHJldCA9IG1Nb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhjYW1lcmFJZCwgJnJhd0luZm8pOworICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgaW50IGRldmljZVZlcnNpb24gPSByYXdJbmZvLmRldmljZV92ZXJzaW9uOworICAgICAgICBpZiAoZGV2aWNlVmVyc2lvbiA8IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMl8wKSB7CisgICAgICAgICAgICAvLyBzdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljcyBpcyBpbnZhbGlkCisgICAgICAgICAgICAqaW5mbyA9IHJhd0luZm87CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIENhbWVyYU1ldGFkYXRhIG07CisgICAgICAgIG0gPSByYXdJbmZvLnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzOworICAgICAgICBkZXJpdmVDYW1lcmFDaGFyYWN0ZXJpc3RpY3NLZXlzKHJhd0luZm8uZGV2aWNlX3ZlcnNpb24sIG0pOworICAgICAgICBjYW1lcmFJbmZvID0gcmF3SW5mbzsKKyAgICAgICAgY2FtZXJhSW5mby5zdGF0aWNfY2FtZXJhX2NoYXJhY3RlcmlzdGljcyA9IG0ucmVsZWFzZSgpOworICAgICAgICBpbmRleCA9IG1DYW1lcmFJbmZvTWFwLmFkZChjYW1lcmFJZCwgY2FtZXJhSW5mbyk7CisgICAgfQorCisgICAgYXNzZXJ0KGluZGV4ICE9IE5BTUVfTk9UX0ZPVU5EKTsKKyAgICAvLyByZXR1cm4gdGhlIGNhY2hlZCBjYW1lcmEgaW5mbworICAgICppbmZvID0gbUNhbWVyYUluZm9NYXBbaW5kZXhdOworICAgIHJldHVybiBPSzsKK30KKworaW50IENhbWVyYU1vZHVsZTo6b3Blbihjb25zdCBjaGFyKiBpZCwgc3RydWN0IGh3X2RldmljZV90KiogZGV2aWNlKSB7CisgICAgcmV0dXJuIGZpbHRlck9wZW5FcnJvckNvZGUobU1vZHVsZS0+Y29tbW9uLm1ldGhvZHMtPm9wZW4oJm1Nb2R1bGUtPmNvbW1vbiwgaWQsIGRldmljZSkpOworfQorCitpbnQgQ2FtZXJhTW9kdWxlOjpvcGVuTGVnYWN5KAorICAgICAgICBjb25zdCBjaGFyKiBpZCwgdWludDMyX3QgaGFsVmVyc2lvbiwgc3RydWN0IGh3X2RldmljZV90KiogZGV2aWNlKSB7CisgICAgcmV0dXJuIG1Nb2R1bGUtPm9wZW5fbGVnYWN5KCZtTW9kdWxlLT5jb21tb24sIGlkLCBoYWxWZXJzaW9uLCBkZXZpY2UpOworfQorCitpbnQgQ2FtZXJhTW9kdWxlOjpnZXROdW1iZXJPZkNhbWVyYXMoKSB7CisgICAgcmV0dXJuIG1Nb2R1bGUtPmdldF9udW1iZXJfb2ZfY2FtZXJhcygpOworfQorCitpbnQgQ2FtZXJhTW9kdWxlOjpzZXRDYWxsYmFja3MoY29uc3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCAqY2FsbGJhY2tzKSB7CisgICAgcmV0dXJuIG1Nb2R1bGUtPnNldF9jYWxsYmFja3MoY2FsbGJhY2tzKTsKK30KKworYm9vbCBDYW1lcmFNb2R1bGU6OmlzVmVuZG9yVGFnRGVmaW5lZCgpIHsKKyAgICByZXR1cm4gbU1vZHVsZS0+Z2V0X3ZlbmRvcl90YWdfb3BzICE9IE5VTEw7Cit9CisKK3ZvaWQgQ2FtZXJhTW9kdWxlOjpnZXRWZW5kb3JUYWdPcHModmVuZG9yX3RhZ19vcHNfdCogb3BzKSB7CisgICAgaWYgKG1Nb2R1bGUtPmdldF92ZW5kb3JfdGFnX29wcykgeworICAgICAgICBtTW9kdWxlLT5nZXRfdmVuZG9yX3RhZ19vcHMob3BzKTsKKyAgICB9Cit9CisKK2ludCBDYW1lcmFNb2R1bGU6OnNldFRvcmNoTW9kZShjb25zdCBjaGFyKiBjYW1lcmFfaWQsIGJvb2wgZW5hYmxlKSB7CisgICAgcmV0dXJuIG1Nb2R1bGUtPnNldF90b3JjaF9tb2RlKGNhbWVyYV9pZCwgZW5hYmxlKTsKK30KKworc3RhdHVzX3QgQ2FtZXJhTW9kdWxlOjpmaWx0ZXJPcGVuRXJyb3JDb2RlKHN0YXR1c190IGVycikgeworICAgIHN3aXRjaChlcnIpIHsKKyAgICAgICAgY2FzZSBOT19FUlJPUjoKKyAgICAgICAgY2FzZSAtRUJVU1k6CisgICAgICAgIGNhc2UgLUVJTlZBTDoKKyAgICAgICAgY2FzZSAtRVVTRVJTOgorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gLUVOT0RFVjsKK30KKwordWludDE2X3QgQ2FtZXJhTW9kdWxlOjpnZXRNb2R1bGVBcGlWZXJzaW9uKCkgeworICAgIHJldHVybiBtTW9kdWxlLT5jb21tb24ubW9kdWxlX2FwaV92ZXJzaW9uOworfQorCitjb25zdCBjaGFyKiBDYW1lcmFNb2R1bGU6OmdldE1vZHVsZU5hbWUoKSB7CisgICAgcmV0dXJuIG1Nb2R1bGUtPmNvbW1vbi5uYW1lOworfQorCit1aW50MTZfdCBDYW1lcmFNb2R1bGU6OmdldEhhbEFwaVZlcnNpb24oKSB7CisgICAgcmV0dXJuIG1Nb2R1bGUtPmNvbW1vbi5oYWxfYXBpX3ZlcnNpb247Cit9CisKK2NvbnN0IGNoYXIqIENhbWVyYU1vZHVsZTo6Z2V0TW9kdWxlQXV0aG9yKCkgeworICAgIHJldHVybiBtTW9kdWxlLT5jb21tb24uYXV0aG9yOworfQorCit2b2lkKiBDYW1lcmFNb2R1bGU6OmdldERzbygpIHsKKyAgICByZXR1cm4gbU1vZHVsZS0+Y29tbW9uLmRzbzsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFNb2R1bGUuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFNb2R1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjgyMmM3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYU1vZHVsZS5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBTU9EVUxFX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFNT0RVTEVfSAorCisjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisvKioKKyAqIEEgd3JhcHBlciBjbGFzcyBmb3IgSEFMIGNhbWVyYSBtb2R1bGUuCisgKgorICogVGhpcyBjbGFzcyB3cmFwcyBjYW1lcmFfbW9kdWxlX3QgcmV0dXJuZWQgZnJvbSBIQUwgdG8gcHJvdmlkZSBhIHdyYXBwZWQKKyAqIGdldF9jYW1lcmFfaW5mbyBpbXBsZW1lbnRhdGlvbiB3aGljaCBDYW1lcmFTZXJ2aWNlIGdlbmVyYXRlcyBzb21lCisgKiBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGtleXMgZGVmaW5lZCBpbiBuZXdlciBIQUwgdmVyc2lvbiBvbiBhbiBvbGRlciBIQUwuCisgKi8KK2NsYXNzIENhbWVyYU1vZHVsZSB7CitwdWJsaWM6CisgICAgQ2FtZXJhTW9kdWxlKGNhbWVyYV9tb2R1bGVfdCAqbW9kdWxlKTsKKyAgICB2aXJ0dWFsIH5DYW1lcmFNb2R1bGUoKTsKKworICAgIC8vIE11c3QgYmUgY2FsbGVkIGFmdGVyIGNvbnN0cnVjdGlvbgorICAgIC8vIFJldHVybnMgT0sgb24gc3VjY2VzcywgTk9fSU5JVCBvbiBmYWlsdXJlCisgICAgaW50IGluaXQoKTsKKworICAgIGludCBnZXRDYW1lcmFJbmZvKGludCBjYW1lcmFJZCwgc3RydWN0IGNhbWVyYV9pbmZvICppbmZvKTsKKyAgICBpbnQgZ2V0TnVtYmVyT2ZDYW1lcmFzKHZvaWQpOworICAgIGludCBvcGVuKGNvbnN0IGNoYXIqIGlkLCBzdHJ1Y3QgaHdfZGV2aWNlX3QqKiBkZXZpY2UpOworICAgIGludCBvcGVuTGVnYWN5KGNvbnN0IGNoYXIqIGlkLCB1aW50MzJfdCBoYWxWZXJzaW9uLCBzdHJ1Y3QgaHdfZGV2aWNlX3QqKiBkZXZpY2UpOworICAgIGludCBzZXRDYWxsYmFja3MoY29uc3QgY2FtZXJhX21vZHVsZV9jYWxsYmFja3NfdCAqY2FsbGJhY2tzKTsKKyAgICBib29sIGlzVmVuZG9yVGFnRGVmaW5lZCgpOworICAgIHZvaWQgZ2V0VmVuZG9yVGFnT3BzKHZlbmRvcl90YWdfb3BzX3QqIG9wcyk7CisgICAgaW50IHNldFRvcmNoTW9kZShjb25zdCBjaGFyKiBjYW1lcmFfaWQsIGJvb2wgZW5hYmxlKTsKKyAgICB1aW50MTZfdCBnZXRNb2R1bGVBcGlWZXJzaW9uKCk7CisgICAgY29uc3QgY2hhciogZ2V0TW9kdWxlTmFtZSgpOworICAgIHVpbnQxNl90IGdldEhhbEFwaVZlcnNpb24oKTsKKyAgICBjb25zdCBjaGFyKiBnZXRNb2R1bGVBdXRob3IoKTsKKyAgICAvLyBPbmx5IHVzZWQgYnkgQ2FtZXJhTW9kdWxlRml4dHVyZSBuYXRpdmUgdGVzdC4gRG8gTk9UIHVzZSBlbHNld2hlcmUuCisgICAgdm9pZCAqZ2V0RHNvKCk7CisKK3ByaXZhdGU6CisgICAgLy8gRGVyaXZlIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3Mga2V5cyBkZWZpbmVkIGFmdGVyIEhBTCBkZXZpY2UgdmVyc2lvbgorICAgIHN0YXRpYyB2b2lkIGRlcml2ZUNhbWVyYUNoYXJhY3RlcmlzdGljc0tleXModWludDMyX3QgZGV2aWNlVmVyc2lvbiwgQ2FtZXJhTWV0YWRhdGEgJmNoYXJzKTsKKyAgICBzdGF0dXNfdCBmaWx0ZXJPcGVuRXJyb3JDb2RlKHN0YXR1c190IGVycik7CisKKyAgICBjYW1lcmFfbW9kdWxlX3QgKm1Nb2R1bGU7CisgICAgS2V5ZWRWZWN0b3I8aW50LCBjYW1lcmFfaW5mbz4gbUNhbWVyYUluZm9NYXA7CisgICAgTXV0ZXggbUNhbWVyYUluZm9Mb2NrOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaAppbmRleCAxOTM1YzJiLi43ZjE0Y2Q0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oCkBAIC04OSwyNCArODksMjIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHN0YXR1c190IGluaXRpYWxpemUoaHdfbW9kdWxlX3QgKm1vZHVsZSkKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplKENhbWVyYU1vZHVsZSAqbW9kdWxlKQogICAgIHsKICAgICAgICAgQUxPR0koIk9wZW5pbmcgY2FtZXJhICVzIiwgbU5hbWUuc3RyaW5nKCkpOwotICAgICAgICBjYW1lcmFfbW9kdWxlX3QgKmNhbWVyYU1vZHVsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2FtZXJhX21vZHVsZV90ICo+KG1vZHVsZSk7CiAgICAgICAgIGNhbWVyYV9pbmZvIGluZm87Ci0gICAgICAgIHN0YXR1c190IHJlcyA9IGNhbWVyYU1vZHVsZS0+Z2V0X2NhbWVyYV9pbmZvKGF0b2kobU5hbWUuc3RyaW5nKCkpLCAmaW5mbyk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IG1vZHVsZS0+Z2V0Q2FtZXJhSW5mbyhhdG9pKG1OYW1lLnN0cmluZygpKSwgJmluZm8pOwogICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogCiAgICAgICAgIGludCByYyA9IE9LOwotICAgICAgICBpZiAobW9kdWxlLT5tb2R1bGVfYXBpX3ZlcnNpb24gPj0gQ0FNRVJBX01PRFVMRV9BUElfVkVSU0lPTl8yXzMgJiYKKyAgICAgICAgaWYgKG1vZHVsZS0+Z2V0TW9kdWxlQXBpVmVyc2lvbigpID49IENBTUVSQV9NT0RVTEVfQVBJX1ZFUlNJT05fMl8zICYmCiAgICAgICAgICAgICBpbmZvLmRldmljZV92ZXJzaW9uID4gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzApIHsKICAgICAgICAgICAgIC8vIE9wZW4gaGlnaGVyIHZlcnNpb24gY2FtZXJhIGRldmljZSBhcyBIQUwxLjAgZGV2aWNlLgotICAgICAgICAgICAgcmMgPSBjYW1lcmFNb2R1bGUtPm9wZW5fbGVnYWN5KG1vZHVsZSwgbU5hbWUuc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaHdfZGV2aWNlX3QgKiopJm1EZXZpY2UpOworICAgICAgICAgICAgcmMgPSBtb2R1bGUtPm9wZW5MZWdhY3kobU5hbWUuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGh3X2RldmljZV90ICoqKSZtRGV2aWNlKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJjID0gQ2FtZXJhU2VydmljZTo6ZmlsdGVyT3BlbkVycm9yQ29kZShtb2R1bGUtPm1ldGhvZHMtPm9wZW4oCi0gICAgICAgICAgICAgICAgbW9kdWxlLCBtTmFtZS5zdHJpbmcoKSwgKGh3X2RldmljZV90ICoqKSZtRGV2aWNlKSk7CisgICAgICAgICAgICByYyA9IG1vZHVsZS0+b3BlbihtTmFtZS5zdHJpbmcoKSwgKGh3X2RldmljZV90ICoqKSZtRGV2aWNlKTsKICAgICAgICAgfQogICAgICAgICBpZiAocmMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3Qgb3BlbiBjYW1lcmEgJXM6ICVkIiwgbU5hbWUuc3RyaW5nKCksIHJjKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuY3BwCmluZGV4IGQxMTU4ZDYuLmM5Yzk5MGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMi9DYW1lcmEyRGV2aWNlLmNwcApAQCAtNTMsNyArNTMsNyBAQAogICAgIHJldHVybiBtSWQ7CiB9CiAKLXN0YXR1c190IENhbWVyYTJEZXZpY2U6OmluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpCitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjppbml0aWFsaXplKENhbWVyYU1vZHVsZSAqbW9kdWxlKQogewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzOiBJbml0aWFsaXppbmcgZGV2aWNlIGZvciBjYW1lcmEgJWQiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CkBAIC02OCw4ICs2OCw3IEBACiAKICAgICBjYW1lcmEyX2RldmljZV90ICpkZXZpY2U7CiAKLSAgICByZXMgPSBDYW1lcmFTZXJ2aWNlOjpmaWx0ZXJPcGVuRXJyb3JDb2RlKG1vZHVsZS0+Y29tbW9uLm1ldGhvZHMtPm9wZW4oCi0gICAgICAgICZtb2R1bGUtPmNvbW1vbiwgbmFtZSwgcmVpbnRlcnByZXRfY2FzdDxod19kZXZpY2VfdCoqPigmZGV2aWNlKSkpOworICAgIHJlcyA9IG1vZHVsZS0+b3BlbihuYW1lLCByZWludGVycHJldF9jYXN0PGh3X2RldmljZV90Kio+KCZkZXZpY2UpKTsKIAogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3Qgb3BlbiBjYW1lcmEgJWQ6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCkBAIC04Nyw3ICs4Niw3IEBACiAgICAgfQogCiAgICAgY2FtZXJhX2luZm8gaW5mbzsKLSAgICByZXMgPSBtb2R1bGUtPmdldF9jYW1lcmFfaW5mbyhtSWQsICZpbmZvKTsKKyAgICByZXMgPSBtb2R1bGUtPmdldENhbWVyYUluZm8obUlkLCAmaW5mbyk7CiAgICAgaWYgKHJlcyAhPSBPSyApIHJldHVybiByZXM7CiAKICAgICBpZiAoaW5mby5kZXZpY2VfdmVyc2lvbiAhPSBkZXZpY2UtPmNvbW1vbi52ZXJzaW9uKSB7CkBAIC0yNDEsOCArMjQwLDkgQEAKICAgICByZXR1cm4gbVJlcXVlc3RRdWV1ZS53YWl0Rm9yRGVxdWV1ZShyZXF1ZXN0SWQsIHRpbWVvdXQpOwogfQogCi1zdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjcmVhdGVTdHJlYW0oc3A8QU5hdGl2ZVdpbmRvdz4gY29uc3VtZXIsCi0gICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIGludCAqaWQpIHsKK3N0YXR1c190IENhbWVyYTJEZXZpY2U6OmNyZWF0ZVN0cmVhbShzcDxTdXJmYWNlPiBjb25zdW1lciwKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgLypkYXRhU3BhY2UqLywgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgc3RhdHVzX3QgcmVzOwogICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CkBAIC0zMTUsNyArMzE1LDggQEAKIAogCiBzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpnZXRTdHJlYW1JbmZvKGludCBpZCwKLSAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LCB1aW50MzJfdCAqZm9ybWF0KSB7CisgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwKKyAgICAgICAgdWludDMyX3QgKmZvcm1hdCwgYW5kcm9pZF9kYXRhc3BhY2UgKmRhdGFTcGFjZSkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKICAgICBib29sIGZvdW5kID0gZmFsc2U7CkBAIC0zMzYsNiArMzM3LDcgQEAKICAgICBpZiAod2lkdGgpICp3aWR0aCA9ICgqc3RyZWFtSSktPmdldFdpZHRoKCk7CiAgICAgaWYgKGhlaWdodCkgKmhlaWdodCA9ICgqc3RyZWFtSSktPmdldEhlaWdodCgpOwogICAgIGlmIChmb3JtYXQpICpmb3JtYXQgPSAoKnN0cmVhbUkpLT5nZXRGb3JtYXQoKTsKKyAgICBpZiAoZGF0YVNwYWNlKSAqZGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNDE1LDcgKzQxNyw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpjb25maWd1cmVTdHJlYW1zKCkgeworc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Y29uZmlndXJlU3RyZWFtcyhib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CiAKQEAgLTYxOCw2ICs2MjAsMTggQEAKICAgICByZXR1cm4gd2FpdFVudGlsRHJhaW5lZCgpOwogfQogCitzdGF0dXNfdCBDYW1lcmEyRGV2aWNlOjpwcmVwYXJlKGludCBzdHJlYW1JZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IHVuaW1wbGVtZW50ZWQiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3N0YXR1c190IENhbWVyYTJEZXZpY2U6OnRlYXJEb3duKGludCBzdHJlYW1JZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IHVuaW1wbGVtZW50ZWQiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKIHVpbnQzMl90IENhbWVyYTJEZXZpY2U6OmdldERldmljZVZlcnNpb24oKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICByZXR1cm4gbURldmljZVZlcnNpb247CkBAIC0xNTgxLDQgKzE1OTUsMTggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKKy8vIGNhbWVyYSAyIGRldmljZXMgZG9uJ3Qgc3VwcG9ydCByZXByb2Nlc3NpbmcKK3N0YXR1c190IENhbWVyYTJEZXZpY2U6OmNyZWF0ZUlucHV0U3RyZWFtKAorICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIGludCAqaWQpIHsKKyAgICBBTE9HRSgiJXM6IGNhbWVyYSAyIGRldmljZXMgZG9uJ3Qgc3VwcG9ydCByZXByb2Nlc3NpbmciLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworLy8gY2FtZXJhIDIgZGV2aWNlcyBkb24ndCBzdXBwb3J0IHJlcHJvY2Vzc2luZworc3RhdHVzX3QgQ2FtZXJhMkRldmljZTo6Z2V0SW5wdXRCdWZmZXJQcm9kdWNlcigKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKnByb2R1Y2VyKSB7CisgICAgQUxPR0UoIiVzOiBjYW1lcmEgMiBkZXZpY2VzIGRvbid0IHN1cHBvcnQgcmVwcm9jZXNzaW5nIiwgX19GVU5DVElPTl9fKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UyL0NhbWVyYTJEZXZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5oCmluZGV4IDRkZWY4YWUuLjM0YzFkZWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTIvQ2FtZXJhMkRldmljZS5oCkBAIC00Myw3ICs0Myw3IEBACiAgICAgICogQ2FtZXJhRGV2aWNlIGludGVyZmFjZQogICAgICAqLwogICAgIHZpcnR1YWwgaW50ICAgICAgZ2V0SWQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemUoY2FtZXJhX21vZHVsZV90ICptb2R1bGUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZShDYW1lcmFNb2R1bGUgKm1vZHVsZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0KCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgdmlydHVhbCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgaW5mbygpIGNvbnN0OwpAQCAtNTYsMTYgKzU2LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGNsZWFyU3RyZWFtaW5nUmVxdWVzdChpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHdhaXRVbnRpbFJlcXVlc3RSZWNlaXZlZChpbnQzMl90IHJlcXVlc3RJZCwgbnNlY3NfdCB0aW1lb3V0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVN0cmVhbShzcDxBTmF0aXZlV2luZG93PiBjb25zdW1lciwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVN0cmVhbShzcDxTdXJmYWNlPiBjb25zdW1lciwKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlSW5wdXRTdHJlYW0oCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LCBpbnQgKmlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVJlcHJvY2Vzc1N0cmVhbUZyb21TdHJlYW0oaW50IG91dHB1dElkLCBpbnQgKmlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbUluZm8oaW50IGlkLAotICAgICAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LCB1aW50MzJfdCAqZm9ybWF0KTsKKyAgICAgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90ICpmb3JtYXQsIGFuZHJvaWRfZGF0YXNwYWNlICpkYXRhU3BhY2UpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVHJhbnNmb3JtKGludCBpZCwgaW50IHRyYW5zZm9ybSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZWxldGVTdHJlYW0oaW50IGlkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGRlbGV0ZVJlcHJvY2Vzc1N0cmVhbShpbnQgaWQpOwogICAgIC8vIE5vLW9wIG9uIEhBTDIgZGV2aWNlcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtcygpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtcyhib29sIGlzQ29uc3RyYWluZWRIaWdoU3BlZWQgPSBmYWxzZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyKAorICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKnByb2R1Y2VyKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZURlZmF1bHRSZXF1ZXN0KGludCB0ZW1wbGF0ZUlkLCBDYW1lcmFNZXRhZGF0YSAqcmVxdWVzdCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB3YWl0VW50aWxEcmFpbmVkKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXROb3RpZnlDYWxsYmFjayhOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXIpOwpAQCAtNzksNiArODUsMTAgQEAKICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyLCB3cDxCdWZmZXJSZWxlYXNlZExpc3RlbmVyPiBsaXN0ZW5lcik7CiAgICAgLy8gRmx1c2ggaW1wbGVtZW50ZWQgYXMganVzdCBhIHdhaXQKICAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOworICAgIC8vIFByZXBhcmUgYW5kIHRlYXJEb3duIGFyZSBuby1vcHMKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmUoaW50IHN0cmVhbUlkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHRlYXJEb3duKGludCBzdHJlYW1JZCk7CisKICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldERldmljZVZlcnNpb24oKTsKICAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0SnBlZ0J1ZmZlclNpemUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgY29uc3Q7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCmluZGV4IDk2NGZhMzUuLjY3YmQyMmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcApAQCAtNTgsMTEgKzU4LDE0IEBACiAKIENhbWVyYTNEZXZpY2U6OkNhbWVyYTNEZXZpY2UoaW50IGlkKToKICAgICAgICAgbUlkKGlkKSwKKyAgICAgICAgbUlzQ29uc3RyYWluZWRIaWdoU3BlZWRDb25maWd1cmF0aW9uKGZhbHNlKSwKICAgICAgICAgbUhhbDNEZXZpY2UoTlVMTCksCiAgICAgICAgIG1TdGF0dXMoU1RBVFVTX1VOSU5JVElBTElaRUQpLAorICAgICAgICBtU3RhdHVzV2FpdGVycygwKSwKICAgICAgICAgbVVzZVBhcnRpYWxSZXN1bHQoZmFsc2UpLAogICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMoMSksCiAgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIoMCksCisgICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIoMCksCiAgICAgICAgIG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyKDApLAogICAgICAgICBtTGlzdGVuZXIoTlVMTCkKIHsKQEAgLTg3LDcgKzkwLDcgQEAKICAqIENhbWVyYURldmljZUJhc2UgaW50ZXJmYWNlCiAgKi8KIAotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6aW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSkKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmluaXRpYWxpemUoQ2FtZXJhTW9kdWxlICptb2R1bGUpCiB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwpAQCAtMTA3LDkgKzExMCw4IEBACiAgICAgY2FtZXJhM19kZXZpY2VfdCAqZGV2aWNlOwogCiAgICAgQVRSQUNFX0JFR0lOKCJjYW1lcmEzLT5vcGVuIik7Ci0gICAgcmVzID0gQ2FtZXJhU2VydmljZTo6ZmlsdGVyT3BlbkVycm9yQ29kZShtb2R1bGUtPmNvbW1vbi5tZXRob2RzLT5vcGVuKAotICAgICAgICAmbW9kdWxlLT5jb21tb24sIGRldmljZU5hbWUuc3RyaW5nKCksCi0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aHdfZGV2aWNlX3QqKj4oJmRldmljZSkpKTsKKyAgICByZXMgPSBtb2R1bGUtPm9wZW4oZGV2aWNlTmFtZS5zdHJpbmcoKSwKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aHdfZGV2aWNlX3QqKj4oJmRldmljZSkpOwogICAgIEFUUkFDRV9FTkQoKTsKIAogICAgIGlmIChyZXMgIT0gT0spIHsKQEAgLTEyOCw3ICsxMzAsNyBAQAogICAgIH0KIAogICAgIGNhbWVyYV9pbmZvIGluZm87Ci0gICAgcmVzID0gQ2FtZXJhU2VydmljZTo6ZmlsdGVyR2V0SW5mb0Vycm9yQ29kZShtb2R1bGUtPmdldF9jYW1lcmFfaW5mbygKKyAgICByZXMgPSBDYW1lcmFTZXJ2aWNlOjpmaWx0ZXJHZXRJbmZvRXJyb3JDb2RlKG1vZHVsZS0+Z2V0Q2FtZXJhSW5mbygKICAgICAgICAgbUlkLCAmaW5mbykpOwogICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CiAKQEAgLTE2NCw5ICsxNjYsMTcgQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICAvKiogU3RhcnQgdXAgcmVxdWVzdCBxdWV1ZSB0aHJlYWQgKi8KKyAgICBib29sIGFlTG9ja0F2YWlsYWJsZSA9IGZhbHNlOworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBhZUxvY2tBdmFpbGFibGVFbnRyeTsKKyAgICByZXMgPSBmaW5kX2NhbWVyYV9tZXRhZGF0YV9yb19lbnRyeShpbmZvLnN0YXRpY19jYW1lcmFfY2hhcmFjdGVyaXN0aWNzLAorICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX0FFX0xPQ0tfQVZBSUxBQkxFLCAmYWVMb2NrQXZhaWxhYmxlRW50cnkpOworICAgIGlmIChyZXMgPT0gT0sgJiYgYWVMb2NrQXZhaWxhYmxlRW50cnkuY291bnQgPiAwKSB7CisgICAgICAgIGFlTG9ja0F2YWlsYWJsZSA9IChhZUxvY2tBdmFpbGFibGVFbnRyeS5kYXRhLnU4WzBdID09CisgICAgICAgICAgICAgICAgQU5EUk9JRF9DT05UUk9MX0FFX0xPQ0tfQVZBSUxBQkxFX1RSVUUpOworICAgIH0KIAotICAgIG1SZXF1ZXN0VGhyZWFkID0gbmV3IFJlcXVlc3RUaHJlYWQodGhpcywgbVN0YXR1c1RyYWNrZXIsIGRldmljZSk7CisgICAgLyoqIFN0YXJ0IHVwIHJlcXVlc3QgcXVldWUgdGhyZWFkICovCisgICAgbVJlcXVlc3RUaHJlYWQgPSBuZXcgUmVxdWVzdFRocmVhZCh0aGlzLCBtU3RhdHVzVHJhY2tlciwgZGV2aWNlLCBhZUxvY2tBdmFpbGFibGUpOwogICAgIHJlcyA9IG1SZXF1ZXN0VGhyZWFkLT5ydW4oU3RyaW5nODo6Zm9ybWF0KCJDM0Rldi0lZC1SZXFRdWV1ZSIsIG1JZCkuc3RyaW5nKCkpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgU0VUX0VSUl9MKCJVbmFibGUgdG8gc3RhcnQgcmVxdWVzdCBxdWV1ZSB0aHJlYWQ6ICVzICglZCkiLApAQCAtMTc2LDEyICsxODYsMTUgQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKKyAgICBtUHJlcGFyZXJUaHJlYWQgPSBuZXcgUHJlcGFyZXJUaHJlYWQoKTsKKwogICAgIC8qKiBFdmVyeXRoaW5nIGlzIGdvb2QgdG8gZ28gKi8KIAogICAgIG1EZXZpY2VWZXJzaW9uID0gZGV2aWNlLT5jb21tb24udmVyc2lvbjsKICAgICBtRGV2aWNlSW5mbyA9IGluZm8uc3RhdGljX2NhbWVyYV9jaGFyYWN0ZXJpc3RpY3M7CiAgICAgbUhhbDNEZXZpY2UgPSBkZXZpY2U7Ci0gICAgbVN0YXR1cyA9IFNUQVRVU19VTkNPTkZJR1VSRUQ7CisKKyAgICBpbnRlcm5hbFVwZGF0ZVN0YXR1c0xvY2tlZChTVEFUVVNfVU5DT05GSUdVUkVEKTsKICAgICBtTmV4dFN0cmVhbUlkID0gMDsKICAgICBtRHVtbXlTdHJlYW1JZCA9IE5PX1NUUkVBTTsKICAgICBtTmVlZENvbmZpZyA9IHRydWU7CkBAIC0yMDMsNiArMjE2LDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgY29uZmlncyA9CisgICAgICAgICAgICBtRGV2aWNlSW5mby5maW5kKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb25maWdzLmNvdW50OyBpICs9IDQpIHsKKyAgICAgICAgaWYgKGNvbmZpZ3MuZGF0YS5pMzJbaV0gPT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEICYmCisgICAgICAgICAgICAgICAgY29uZmlncy5kYXRhLmkzMltpICsgM10gPT0KKyAgICAgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX0lOUFVUKSB7CisgICAgICAgICAgICBtU3VwcG9ydGVkT3BhcXVlSW5wdXRTaXplcy5hZGQoU2l6ZShjb25maWdzLmRhdGEuaTMyW2kgKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgY29uZmlncy5kYXRhLmkzMltpICsgMl0pKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjc1LDcgKzI5OSw3IEBACiAgICAgICAgICAgICBtSGFsM0RldmljZSA9IE5VTEw7CiAgICAgICAgIH0KIAotICAgICAgICBtU3RhdHVzID0gU1RBVFVTX1VOSU5JVElBTElaRUQ7CisgICAgICAgIGludGVybmFsVXBkYXRlU3RhdHVzTG9ja2VkKFNUQVRVU19VTklOSVRJQUxJWkVEKTsKICAgICB9CiAKICAgICBBTE9HVigiJXM6IFgiLCBfX0ZVTkNUSU9OX18pOwpAQCAtMzQ5LDcgKzM3Myw3IEBACiAgICAgLy8gR2V0IG1heCBqcGVnIHNpemUgKGFyZWEtd2lzZSkuCiAgICAgU2l6ZSBtYXhKcGVnUmVzb2x1dGlvbiA9IGdldE1heEpwZWdSZXNvbHV0aW9uKCk7CiAgICAgaWYgKG1heEpwZWdSZXNvbHV0aW9uLndpZHRoID09IDApIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGZpbmQgZmluZCB2YWxpZCBhdmFpbGFibGUganBlZyBzaXplcyBpbiBzdGF0aWMgbWV0YWRhdGEhIiwKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGZpbmQgdmFsaWQgYXZhaWxhYmxlIGpwZWcgc2l6ZXMgaW4gc3RhdGljIG1ldGFkYXRhISIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KQEAgLTM3Niw2ICs0MDAsMjEgQEAKICAgICByZXR1cm4ganBlZ0J1ZmZlclNpemU7CiB9CiAKK3NzaXplX3QgQ2FtZXJhM0RldmljZTo6Z2V0UG9pbnRDbG91ZEJ1ZmZlclNpemUoKSBjb25zdCB7CisgICAgY29uc3QgaW50IEZMT0FUU19QRVJfUE9JTlQ9NDsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgbWF4UG9pbnRDb3VudCA9IG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9ERVBUSF9NQVhfREVQVEhfU0FNUExFUyk7CisgICAgaWYgKG1heFBvaW50Q291bnQuY291bnQgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgZmluZCBtYXhpbXVtIGRlcHRoIHBvaW50IGNsb3VkIHNpemUgaW4gc3RhdGljIG1ldGFkYXRhISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzc2l6ZV90IG1heEJ5dGVzRm9yUG9pbnRDbG91ZCA9IHNpemVvZihhbmRyb2lkX2RlcHRoX3BvaW50cykgKworICAgICAgICAgICAgbWF4UG9pbnRDb3VudC5kYXRhLmkzMlswXSAqIHNpemVvZihmbG9hdCkgKiBGTE9BVFNfUEVSX1BPSU5UOworICAgIHJldHVybiBtYXhCeXRlc0ZvclBvaW50Q2xvdWQ7Cit9CisKKworCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgKHZvaWQpYXJnczsKQEAgLTQwNyw2ICs0NDYsOCBAQAogICAgICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICBFcnJvciBjYXVzZTogJXNcbiIsIG1FcnJvckNhdXNlLnN0cmluZygpKTsKICAgICB9CiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgU3RyZWFtIGNvbmZpZ3VyYXRpb246XG4iKTsKKyAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICBPcGVyYXRpb24gbW9kZTogJXMgXG4iLCBtSXNDb25zdHJhaW5lZEhpZ2hTcGVlZENvbmZpZ3VyYXRpb24gPworICAgICAgICAgICAgIkNPTlNUUkFJTkVEIEhJR0ggU1BFRUQgVklERU8iIDogIk5PUk1BTCIpOwogCiAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBOVUxMKSB7CiAgICAgICAgIHdyaXRlKGZkLCBsaW5lcy5zdHJpbmcoKSwgbGluZXMuc2l6ZSgpKTsKQEAgLTgwMiwxMyArODQzLDE0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjcmVhdGVTdHJlYW0oc3A8QU5hdGl2ZVdpbmRvdz4gY29uc3VtZXIsCi0gICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIGludCAqaWQpIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmNyZWF0ZVN0cmVhbShzcDxTdXJmYWNlPiBjb25zdW1lciwKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAorICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKLSAgICBBTE9HVigiQ2FtZXJhICVkOiBDcmVhdGluZyBuZXcgc3RyZWFtICVkOiAlZCB4ICVkLCBmb3JtYXQgJWQiLAotICAgICAgICAgICAgbUlkLCBtTmV4dFN0cmVhbUlkLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOworICAgIEFMT0dWKCJDYW1lcmEgJWQ6IENyZWF0aW5nIG5ldyBzdHJlYW0gJWQ6ICVkIHggJWQsIGZvcm1hdCAlZCwgZGF0YXNwYWNlICVkIHJvdGF0aW9uICVkIiwKKyAgICAgICAgICAgIG1JZCwgbU5leHRTdHJlYW1JZCwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uKTsKIAogICAgIHN0YXR1c190IHJlczsKICAgICBib29sIHdhc0FjdGl2ZSA9IGZhbHNlOwpAQCAtODQxLDE3ICs4ODMsMjUgQEAKIAogICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW0+IG5ld1N0cmVhbTsKICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgewotICAgICAgICBzc2l6ZV90IGpwZWdCdWZmZXJTaXplID0gZ2V0SnBlZ0J1ZmZlclNpemUod2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGlmIChqcGVnQnVmZmVyU2l6ZSA8PSAwKSB7Ci0gICAgICAgICAgICBTRVRfRVJSX0woIkludmFsaWQganBlZyBidWZmZXIgc2l6ZSAlemQiLCBqcGVnQnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBzc2l6ZV90IGJsb2JCdWZmZXJTaXplOworICAgICAgICBpZiAoZGF0YVNwYWNlICE9IEhBTF9EQVRBU1BBQ0VfREVQVEgpIHsKKyAgICAgICAgICAgIGJsb2JCdWZmZXJTaXplID0gZ2V0SnBlZ0J1ZmZlclNpemUod2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBpZiAoYmxvYkJ1ZmZlclNpemUgPD0gMCkgeworICAgICAgICAgICAgICAgIFNFVF9FUlJfTCgiSW52YWxpZCBqcGVnIGJ1ZmZlciBzaXplICV6ZCIsIGJsb2JCdWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmxvYkJ1ZmZlclNpemUgPSBnZXRQb2ludENsb3VkQnVmZmVyU2l6ZSgpOworICAgICAgICAgICAgaWYgKGJsb2JCdWZmZXJTaXplIDw9IDApIHsKKyAgICAgICAgICAgICAgICBTRVRfRVJSX0woIkludmFsaWQgcG9pbnQgY2xvdWQgYnVmZmVyIHNpemUgJXpkIiwgYmxvYkJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLQogICAgICAgICBuZXdTdHJlYW0gPSBuZXcgQ2FtZXJhM091dHB1dFN0cmVhbShtTmV4dFN0cmVhbUlkLCBjb25zdW1lciwKLSAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBqcGVnQnVmZmVyU2l6ZSwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBibG9iQnVmZmVyU2l6ZSwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uKTsKICAgICB9IGVsc2UgewogICAgICAgICBuZXdTdHJlYW0gPSBuZXcgQ2FtZXJhM091dHB1dFN0cmVhbShtTmV4dFN0cmVhbUlkLCBjb25zdW1lciwKLSAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpOworICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbik7CiAgICAgfQogICAgIG5ld1N0cmVhbS0+c2V0U3RhdHVzVHJhY2tlcihtU3RhdHVzVHJhY2tlcik7CiAKQEAgLTg4OSw3ICs5MzksOCBAQAogCiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmdldFN0cmVhbUluZm8oaW50IGlkLAotICAgICAgICB1aW50MzJfdCAqd2lkdGgsIHVpbnQzMl90ICpoZWlnaHQsIHVpbnQzMl90ICpmb3JtYXQpIHsKKyAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LAorICAgICAgICB1aW50MzJfdCAqZm9ybWF0LCBhbmRyb2lkX2RhdGFzcGFjZSAqZGF0YVNwYWNlKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKQEAgLTkyMCw3ICs5NzEsNyBAQAogICAgIGlmICh3aWR0aCkgKndpZHRoICA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldFdpZHRoKCk7CiAgICAgaWYgKGhlaWdodCkgKmhlaWdodCA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldEhlaWdodCgpOwogICAgIGlmIChmb3JtYXQpICpmb3JtYXQgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRGb3JtYXQoKTsKLQorICAgIGlmIChkYXRhU3BhY2UpICpkYXRhU3BhY2UgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXREYXRhU3BhY2UoKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTEwMTAsMTYgKzEwNjEsMzUgQEAKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OmNvbmZpZ3VyZVN0cmVhbXMoKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjb25maWd1cmVTdHJlYW1zKGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCisgICAgaWYgKG1Jc0NvbnN0cmFpbmVkSGlnaFNwZWVkQ29uZmlndXJhdGlvbiAhPSBpc0NvbnN0cmFpbmVkSGlnaFNwZWVkKSB7CisgICAgICAgIG1OZWVkQ29uZmlnID0gdHJ1ZTsKKyAgICAgICAgbUlzQ29uc3RyYWluZWRIaWdoU3BlZWRDb25maWd1cmF0aW9uID0gaXNDb25zdHJhaW5lZEhpZ2hTcGVlZDsKKyAgICB9CisKICAgICByZXR1cm4gY29uZmlndXJlU3RyZWFtc0xvY2tlZCgpOwogfQogCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyKAorICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqcHJvZHVjZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIGlmIChwcm9kdWNlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmIChtSW5wdXRTdHJlYW0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmV0dXJuIG1JbnB1dFN0cmVhbS0+Z2V0SW5wdXRCdWZmZXJQcm9kdWNlcihwcm9kdWNlcik7Cit9CisKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmNyZWF0ZURlZmF1bHRSZXF1ZXN0KGludCB0ZW1wbGF0ZUlkLAogICAgICAgICBDYW1lcmFNZXRhZGF0YSAqcmVxdWVzdCkgewogICAgIEFUUkFDRV9DQUxMKCk7CkBAIC0xMDYyLDkgKzExMzIsOSBAQAogICAgICAgICBtSGFsM0RldmljZSwgdGVtcGxhdGVJZCk7CiAgICAgQVRSQUNFX0VORCgpOwogICAgIGlmIChyYXdSZXF1ZXN0ID09IE5VTEwpIHsKLSAgICAgICAgU0VUX0VSUl9MKCJIQUwgaXMgdW5hYmxlIHRvIGNvbnN0cnVjdCBkZWZhdWx0IHNldHRpbmdzIGZvciB0ZW1wbGF0ZSAlZCIsCi0gICAgICAgICAgICAgICAgdGVtcGxhdGVJZCk7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgQUxPR0koIiVzOiB0ZW1wbGF0ZSAlZCBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgY2FtZXJhIGRldmljZSIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdGVtcGxhdGVJZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgICpyZXF1ZXN0ID0gcmF3UmVxdWVzdDsKICAgICBtUmVxdWVzdFRlbXBsYXRlQ2FjaGVbdGVtcGxhdGVJZF0gPSByYXdSZXF1ZXN0OwpAQCAtMTEwNiw2ICsxMTc2LDEzIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorCit2b2lkIENhbWVyYTNEZXZpY2U6OmludGVybmFsVXBkYXRlU3RhdHVzTG9ja2VkKFN0YXR1cyBzdGF0dXMpIHsKKyAgICBtU3RhdHVzID0gc3RhdHVzOworICAgIG1SZWNlbnRTdGF0dXNVcGRhdGVzLmFkZChtU3RhdHVzKTsKKyAgICBtU3RhdHVzQ2hhbmdlZC5icm9hZGNhc3QoKTsKK30KKwogLy8gUGF1c2UgdG8gcmVjb25maWd1cmUKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmludGVybmFsUGF1c2VBbmRXYWl0TG9ja2VkKCkgewogICAgIG1SZXF1ZXN0VGhyZWFkLT5zZXRQYXVzZWQodHJ1ZSk7CkBAIC0xMTM2LDIzICsxMjEzLDQwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjp3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soYm9vbCBhY3RpdmUsCi0gICAgICAgIG5zZWNzX3QgdGltZW91dCkgeworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6d2FpdFVudGlsU3RhdGVUaGVuUmVsb2NrKGJvb2wgYWN0aXZlLCBuc2Vjc190IHRpbWVvdXQpIHsKICAgICBzdGF0dXNfdCByZXMgPSBPSzsKLSAgICBpZiAoYWN0aXZlID09IChtU3RhdHVzID09IFNUQVRVU19BQ1RJVkUpKSB7Ci0gICAgICAgIC8vIERlc2lyZWQgc3RhdGUgYWxyZWFkeSByZWFjaGVkCi0gICAgICAgIHJldHVybiByZXM7CisKKyAgICBzaXplX3Qgc3RhcnRJbmRleCA9IDA7CisgICAgaWYgKG1TdGF0dXNXYWl0ZXJzID09IDApIHsKKyAgICAgICAgLy8gQ2xlYXIgdGhlIGxpc3Qgb2YgcmVjZW50IHN0YXR1c2VzIGlmIHRoZXJlIGFyZSBubyBleGlzdGluZyB0aHJlYWRzIHdhaXRpbmcgb24gdXBkYXRlcyB0bworICAgICAgICAvLyB0aGlzIHN0YXR1cyBsaXN0CisgICAgICAgIG1SZWNlbnRTdGF0dXNVcGRhdGVzLmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSWYgb3RoZXIgdGhyZWFkcyBhcmUgd2FpdGluZyBvbiB1cGRhdGVzIHRvIHRoaXMgc3RhdHVzIGxpc3QsIHNldCB0aGUgcG9zaXRpb24gb2YgdGhlCisgICAgICAgIC8vIGZpcnN0IGVsZW1lbnQgdGhhdCB0aGlzIGxpc3Qgd2lsbCBjaGVjayByYXRoZXIgdGhhbiBjbGVhcmluZyB0aGUgbGlzdC4KKyAgICAgICAgc3RhcnRJbmRleCA9IG1SZWNlbnRTdGF0dXNVcGRhdGVzLnNpemUoKTsKICAgICB9CiAKKyAgICBtU3RhdHVzV2FpdGVycysrOworCiAgICAgYm9vbCBzdGF0ZVNlZW4gPSBmYWxzZTsKICAgICBkbyB7Ci0gICAgICAgIG1SZWNlbnRTdGF0dXNVcGRhdGVzLmNsZWFyKCk7CisgICAgICAgIGlmIChhY3RpdmUgPT0gKG1TdGF0dXMgPT0gU1RBVFVTX0FDVElWRSkpIHsKKyAgICAgICAgICAgIC8vIERlc2lyZWQgc3RhdGUgaXMgY3VycmVudAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAogICAgICAgICByZXMgPSBtU3RhdHVzQ2hhbmdlZC53YWl0UmVsYXRpdmUobUxvY2ssIHRpbWVvdXQpOwogICAgICAgICBpZiAocmVzICE9IE9LKSBicmVhazsKIAotICAgICAgICAvLyBDaGVjayBzdGF0ZSBjaGFuZ2UgaGlzdG9yeSBkdXJpbmcgd2FpdAotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1SZWNlbnRTdGF0dXNVcGRhdGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIC8vIFRoaXMgaXMgaW1wb3NzaWJsZSwgYnV0IGlmIG5vdCwgY291bGQgcmVzdWx0IGluIHN1YnRsZSBkZWFkbG9ja3MgYW5kIGludmFsaWQgc3RhdGUKKyAgICAgICAgLy8gdHJhbnNpdGlvbnMuCisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhcnRJbmRleCA+IG1SZWNlbnRTdGF0dXNVcGRhdGVzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAiJXM6IFNraXBwaW5nIHN0YXR1cyB1cGRhdGVzIGluIENhbWVyYTNEZXZpY2UsIG1heSByZXN1bHQgaW4gZGVhZGxvY2suIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworCisgICAgICAgIC8vIEVuY291bnRlcmVkIGRlc2lyZWQgc3RhdGUgc2luY2Ugd2UgYmVnYW4gd2FpdGluZworICAgICAgICBmb3IgKHNpemVfdCBpID0gc3RhcnRJbmRleDsgaSA8IG1SZWNlbnRTdGF0dXNVcGRhdGVzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoYWN0aXZlID09IChtUmVjZW50U3RhdHVzVXBkYXRlc1tpXSA9PSBTVEFUVVNfQUNUSVZFKSApIHsKICAgICAgICAgICAgICAgICBzdGF0ZVNlZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTE2MCw2ICsxMjU0LDggQEAKICAgICAgICAgfQogICAgIH0gd2hpbGUgKCFzdGF0ZVNlZW4pOwogCisgICAgbVN0YXR1c1dhaXRlcnMtLTsKKwogICAgIHJldHVybiByZXM7CiB9CiAKQEAgLTExNzIsNyArMTI2OCw4IEBACiAgICAgICAgIEFMT0dXKCIlczogUmVwbGFjaW5nIG9sZCBjYWxsYmFjayBsaXN0ZW5lciIsIF9fRlVOQ1RJT05fXyk7CiAgICAgfQogICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIG1SZXF1ZXN0VGhyZWFkLT5zZXROb3RpZnlDYWxsYmFjayhsaXN0ZW5lcik7CisgICAgbVJlcXVlc3RUaHJlYWQtPnNldE5vdGlmaWNhdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICBtUHJlcGFyZXJUaHJlYWQtPnNldE5vdGlmaWNhdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTEzMTgsNiArMTQxNSw2NSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OnByZXBhcmUoaW50IHN0cmVhbUlkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogUHJlcGFyaW5nIHN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlYW1JZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW07CisgICAgc3NpemVfdCBvdXRwdXRTdHJlYW1JZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbUlkKTsKKyAgICBpZiAob3V0cHV0U3RyZWFtSWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZG9lcyBub3QgZXhpc3QiLCBzdHJlYW1JZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQob3V0cHV0U3RyZWFtSWR4KTsKKworICAgIGlmIChzdHJlYW0tPmlzVW5wcmVwYXJhYmxlKCkgfHwgc3RyZWFtLT5oYXNPdXRzdGFuZGluZ0J1ZmZlcnMoKSApIHsKKyAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBoYXMgYWxyZWFkeSBiZWVuIGEgcmVxdWVzdCB0YXJnZXQiLCBzdHJlYW1JZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKG1SZXF1ZXN0VGhyZWFkLT5pc1N0cmVhbVBlbmRpbmcoc3RyZWFtKSkgeworICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGlzIGFscmVhZHkgYSB0YXJnZXQgaW4gYSBwZW5kaW5nIHJlcXVlc3QiLCBzdHJlYW1JZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIG1QcmVwYXJlclRocmVhZC0+cHJlcGFyZShzdHJlYW0pOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjp0ZWFyRG93bihpbnQgc3RyZWFtSWQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBUZWFyaW5nIGRvd24gc3RyZWFtICVkIiwgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVhbUlkKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIC8vIFRlYXJkb3duIGNhbiBvbmx5IGJlIGFjY29tcGxpc2hlZCBvbiBkZXZpY2VzIHRoYXQgZG9uJ3QgcmVxdWlyZSByZWdpc3Rlcl9zdHJlYW1fYnVmZmVycywKKyAgICAvLyBzaW5jZSB3ZSBjYW5ub3QgY2FsbCByZWdpc3Rlcl9zdHJlYW1fYnVmZmVycyBleGNlcHQgcmlnaHQgYWZ0ZXIgY29uZmlndXJlX3N0cmVhbXMuCisgICAgaWYgKG1IYWwzRGV2aWNlLT5jb21tb24udmVyc2lvbiA8IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHRlYXIgZG93biBzdHJlYW1zIG9uIGRldmljZSBIQUwgdiV4IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1IYWwzRGV2aWNlLT5jb21tb24udmVyc2lvbik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbTsKKyAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOworICAgIGlmIChvdXRwdXRTdHJlYW1JZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBkb2VzIG5vdCBleGlzdCIsIHN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChvdXRwdXRTdHJlYW1JZHgpOworCisgICAgaWYgKHN0cmVhbS0+aGFzT3V0c3RhbmRpbmdCdWZmZXJzKCkgfHwgbVJlcXVlc3RUaHJlYWQtPmlzU3RyZWFtUGVuZGluZyhzdHJlYW0pKSB7CisgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgaXMgYSB0YXJnZXQgb2YgYSBpbi1wcm9ncmVzcyByZXF1ZXN0Iiwgc3RyZWFtSWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJldHVybiBzdHJlYW0tPnRlYXJEb3duKCk7Cit9CisKIHVpbnQzMl90IENhbWVyYTNEZXZpY2U6OmdldERldmljZVZlcnNpb24oKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwpAQCAtMTM0MSw5ICsxNDk3LDcgQEAKICAgICAgICAgfQogICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogTm93ICVzIiwgX19GVU5DVElPTl9fLCBtSWQsCiAgICAgICAgICAgICAgICAgaWRsZSA/ICJpZGxlIiA6ICJhY3RpdmUiKTsKLSAgICAgICAgbVN0YXR1cyA9IGlkbGUgPyBTVEFUVVNfQ09ORklHVVJFRCA6IFNUQVRVU19BQ1RJVkU7Ci0gICAgICAgIG1SZWNlbnRTdGF0dXNVcGRhdGVzLmFkZChtU3RhdHVzKTsKLSAgICAgICAgbVN0YXR1c0NoYW5nZWQuc2lnbmFsKCk7CisgICAgICAgIGludGVybmFsVXBkYXRlU3RhdHVzTG9ja2VkKGlkbGUgPyBTVEFUVVNfQ09ORklHVVJFRCA6IFNUQVRVU19BQ1RJVkUpOwogCiAgICAgICAgIC8vIFNraXAgbm90aWZ5aW5nIGxpc3RlbmVyIGlmIHdlJ3JlIGRvaW5nIHNvbWUgdXNlci10cmFuc3BhcmVudAogICAgICAgICAvLyBzdGF0ZSBjaGFuZ2VzCkBAIC0xMzkxLDYgKzE1NDUsMTEgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAvLyBDaGVjayBpZiBzdHJlYW0gaXMgYmVpbmcgcHJlcGFyZWQKKyAgICAgICAgaWYgKG1JbnB1dFN0cmVhbS0+aXNQcmVwYXJpbmcoKSkgeworICAgICAgICAgICAgQ0xPR0UoIlJlcXVlc3QgcmVmZXJlbmNlcyBhbiBpbnB1dCBzdHJlYW0gdGhhdCdzIGJlaW5nIHByZXBhcmVkISIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KIAogICAgICAgICBuZXdSZXF1ZXN0LT5tSW5wdXRTdHJlYW0gPSBtSW5wdXRTdHJlYW07CiAgICAgICAgIG5ld1JlcXVlc3QtPm1TZXR0aW5ncy5lcmFzZShBTkRST0lEX1JFUVVFU1RfSU5QVVRfU1RSRUFNUyk7CkBAIC0xNDIzLDYgKzE1ODIsMTEgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAvLyBDaGVjayBpZiBzdHJlYW0gaXMgYmVpbmcgcHJlcGFyZWQKKyAgICAgICAgaWYgKHN0cmVhbS0+aXNQcmVwYXJpbmcoKSkgeworICAgICAgICAgICAgQ0xPR0UoIlJlcXVlc3QgcmVmZXJlbmNlcyBhbiBvdXRwdXQgc3RyZWFtIHRoYXQncyBiZWluZyBwcmVwYXJlZCEiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKICAgICAgICAgbmV3UmVxdWVzdC0+bU91dHB1dFN0cmVhbXMucHVzaChzdHJlYW0pOwogICAgIH0KQEAgLTE0MzEsNiArMTU5NSwxNyBAQAogICAgIHJldHVybiBuZXdSZXF1ZXN0OwogfQogCitib29sIENhbWVyYTNEZXZpY2U6OmlzT3BhcXVlSW5wdXRTaXplU3VwcG9ydGVkKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbVN1cHBvcnRlZE9wYXF1ZUlucHV0U2l6ZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgU2l6ZSBzaXplID0gbVN1cHBvcnRlZE9wYXF1ZUlucHV0U2l6ZXNbaV07CisgICAgICAgIGlmIChzaXplLndpZHRoID09IHdpZHRoICYmIHNpemUuaGVpZ2h0ID09IGhlaWdodCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CkBAIC0xNDU4LDcgKzE2MzMsOSBAQAogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBTdGFydGluZyBzdHJlYW0gY29uZmlndXJhdGlvbiIsIF9fRlVOQ1RJT05fXywgbUlkKTsKIAogICAgIGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb24gY29uZmlnOwotCisgICAgY29uZmlnLm9wZXJhdGlvbl9tb2RlID0gbUlzQ29uc3RyYWluZWRIaWdoU3BlZWRDb25maWd1cmF0aW9uID8KKyAgICAgICAgICAgIENBTUVSQTNfU1RSRUFNX0NPTkZJR1VSQVRJT05fQ09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFIDoKKyAgICAgICAgICAgIENBTUVSQTNfU1RSRUFNX0NPTkZJR1VSQVRJT05fTk9STUFMX01PREU7CiAgICAgY29uZmlnLm51bV9zdHJlYW1zID0gKG1JbnB1dFN0cmVhbSAhPSBOVUxMKSArIG1PdXRwdXRTdHJlYW1zLnNpemUoKTsKIAogICAgIFZlY3RvcjxjYW1lcmEzX3N0cmVhbV90Kj4gc3RyZWFtczsKQEAgLTE1MjksNyArMTcwNiw3IEBACiAKICAgICAgICAgLy8gUmV0dXJuIHN0YXRlIHRvIHRoYXQgYXQgc3RhcnQgb2YgY2FsbCwgc28gdGhhdCBmdXR1cmUgY29uZmlndXJlcwogICAgICAgICAvLyBwcm9wZXJseSBjbGVhbiB0aGluZ3MgdXAKLSAgICAgICAgbVN0YXR1cyA9IFNUQVRVU19VTkNPTkZJR1VSRUQ7CisgICAgICAgIGludGVybmFsVXBkYXRlU3RhdHVzTG9ja2VkKFNUQVRVU19VTkNPTkZJR1VSRUQpOwogICAgICAgICBtTmVlZENvbmZpZyA9IHRydWU7CiAKICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFN0cmVhbSBjb25maWd1cmF0aW9uIGZhaWxlZCIsIF9fRlVOQ1RJT05fXywgbUlkKTsKQEAgLTE1NzYsMTEgKzE3NTMsOCBAQAogCiAgICAgbU5lZWRDb25maWcgPSBmYWxzZTsKIAotICAgIGlmIChtRHVtbXlTdHJlYW1JZCA9PSBOT19TVFJFQU0pIHsKLSAgICAgICAgbVN0YXR1cyA9IFNUQVRVU19DT05GSUdVUkVEOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TdGF0dXMgPSBTVEFUVVNfVU5DT05GSUdVUkVEOwotICAgIH0KKyAgICBpbnRlcm5hbFVwZGF0ZVN0YXR1c0xvY2tlZCgobUR1bW15U3RyZWFtSWQgPT0gTk9fU1RSRUFNKSA/CisgICAgICAgICAgICBTVEFUVVNfQ09ORklHVVJFRCA6IFNUQVRVU19VTkNPTkZJR1VSRUQpOwogCiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFN0cmVhbSBjb25maWd1cmF0aW9uIGNvbXBsZXRlIiwgX19GVU5DVElPTl9fLCBtSWQpOwogCkBAIC0xNjg4LDcgKzE4NjIsNyBAQAogICAgIG1FcnJvckNhdXNlID0gZXJyb3JDYXVzZTsKIAogICAgIG1SZXF1ZXN0VGhyZWFkLT5zZXRQYXVzZWQodHJ1ZSk7Ci0gICAgbVN0YXR1cyA9IFNUQVRVU19FUlJPUjsKKyAgICBpbnRlcm5hbFVwZGF0ZVN0YXR1c0xvY2tlZChTVEFUVVNfRVJST1IpOwogCiAgICAgLy8gTm90aWZ5IHVwc3RyZWFtIGFib3V0IGEgZGV2aWNlIGVycm9yCiAgICAgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CkBAIC0xNzA2LDEyICsxODgwLDE0IEBACiAgKi8KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6cmVnaXN0ZXJJbkZsaWdodCh1aW50MzJfdCBmcmFtZU51bWJlciwKLSAgICAgICAgaW50MzJfdCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcywgYm9vbCBoYXNJbnB1dCkgeworICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLCBib29sIGhhc0lucHV0LAorICAgICAgICBjb25zdCBBZVRyaWdnZXJDYW5jZWxPdmVycmlkZV90ICZhZVRyaWdnZXJDYW5jZWxPdmVycmlkZSkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUluRmxpZ2h0TG9jayk7CiAKICAgICBzc2l6ZV90IHJlczsKLSAgICByZXMgPSBtSW5GbGlnaHRNYXAuYWRkKGZyYW1lTnVtYmVyLCBJbkZsaWdodFJlcXVlc3QobnVtQnVmZmVycywgcmVzdWx0RXh0cmFzLCBoYXNJbnB1dCkpOworICAgIHJlcyA9IG1JbkZsaWdodE1hcC5hZGQoZnJhbWVOdW1iZXIsIEluRmxpZ2h0UmVxdWVzdChudW1CdWZmZXJzLCByZXN1bHRFeHRyYXMsIGhhc0lucHV0LAorICAgICAgICAgICAgYWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUpKTsKICAgICBpZiAocmVzIDwgMCkgcmV0dXJuIHJlczsKIAogICAgIHJldHVybiBPSzsKQEAgLTE4ODcsNyArMjA2Myw2IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLQogdm9pZCBDYW1lcmEzRGV2aWNlOjpyZXR1cm5PdXRwdXRCdWZmZXJzKAogICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqb3V0cHV0QnVmZmVycywgc2l6ZV90IG51bUJ1ZmZlcnMsCiAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSB7CkBAIC0xOTQ2LDggKzIxMjEsMTIgQEAKIAogICAgIC8vIFNhbml0eSBjaGVjayAtIGlmIHdlIGhhdmUgdG9vIG1hbnkgaW4tZmxpZ2h0IGZyYW1lcywgc29tZXRoaW5nIGhhcwogICAgIC8vIGxpa2VseSBnb25lIHdyb25nCi0gICAgaWYgKG1JbkZsaWdodE1hcC5zaXplKCkgPiBrSW5GbGlnaHRXYXJuTGltaXQpIHsKKyAgICBpZiAoIW1Jc0NvbnN0cmFpbmVkSGlnaFNwZWVkQ29uZmlndXJhdGlvbiAmJiBtSW5GbGlnaHRNYXAuc2l6ZSgpID4ga0luRmxpZ2h0V2FybkxpbWl0KSB7CiAgICAgICAgIENMT0dFKCJJbi1mbGlnaHQgbGlzdCB0b28gbGFyZ2U6ICV6dSIsIG1JbkZsaWdodE1hcC5zaXplKCkpOworICAgIH0gZWxzZSBpZiAobUlzQ29uc3RyYWluZWRIaWdoU3BlZWRDb25maWd1cmF0aW9uICYmIG1JbkZsaWdodE1hcC5zaXplKCkgPgorICAgICAgICAgICAga0luRmxpZ2h0V2FybkxpbWl0SGlnaFNwZWVkKSB7CisgICAgICAgIENMT0dFKCJJbi1mbGlnaHQgbGlzdCB0b28gbGFyZ2UgZm9yIGhpZ2ggc3BlZWQgY29uZmlndXJhdGlvbjogJXp1IiwKKyAgICAgICAgICAgICAgICBtSW5GbGlnaHRNYXAuc2l6ZSgpKTsKICAgICB9CiB9CiAKQEAgLTE5NTUsMjAgKzIxMzQsMzIgQEAKIHZvaWQgQ2FtZXJhM0RldmljZTo6c2VuZENhcHR1cmVSZXN1bHQoQ2FtZXJhTWV0YWRhdGEgJnBlbmRpbmdNZXRhZGF0YSwKICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzLAogICAgICAgICBDYW1lcmFNZXRhZGF0YSAmY29sbGVjdGVkUGFydGlhbFJlc3VsdCwKLSAgICAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIpIHsKKyAgICAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIsCisgICAgICAgIGJvb2wgcmVwcm9jZXNzLAorICAgICAgICBjb25zdCBBZVRyaWdnZXJDYW5jZWxPdmVycmlkZV90ICZhZVRyaWdnZXJDYW5jZWxPdmVycmlkZSkgewogICAgIGlmIChwZW5kaW5nTWV0YWRhdGEuaXNFbXB0eSgpKQogICAgICAgICByZXR1cm47CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbChtT3V0cHV0TG9jayk7CiAKICAgICAvLyBUT0RPOiBuZWVkIHRvIHRyYWNrIGVycm9ycyBmb3IgdGlnaHRlciBib3VuZHMgb24gZXhwZWN0ZWQgZnJhbWUgbnVtYmVyCi0gICAgaWYgKGZyYW1lTnVtYmVyIDwgbU5leHRSZXN1bHRGcmFtZU51bWJlcikgewotICAgICAgICBTRVRfRVJSKCJPdXQtb2Ytb3JkZXIgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEgc3VibWl0dGVkISAiCisgICAgaWYgKHJlcHJvY2VzcykgeworICAgICAgICBpZiAoZnJhbWVOdW1iZXIgPCBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICBTRVRfRVJSKCJPdXQtb2Ytb3JkZXIgcmVwcm9jZXNzIGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIHN1Ym1pdHRlZCEgIgogICAgICAgICAgICAgICAgICIoZ290IGZyYW1lIG51bWJlciAlZCwgZXhwZWN0aW5nICVkKSIsCi0gICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIpOwotICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlciArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGZyYW1lTnVtYmVyIDwgbU5leHRSZXN1bHRGcmFtZU51bWJlcikgeworICAgICAgICAgICAgU0VUX0VSUigiT3V0LW9mLW9yZGVyIGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIHN1Ym1pdHRlZCEgIgorICAgICAgICAgICAgICAgICAgICAiKGdvdCBmcmFtZSBudW1iZXIgJWQsIGV4cGVjdGluZyAlZCkiLAorICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgbU5leHRSZXN1bHRGcmFtZU51bWJlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyICsgMTsKICAgICB9Ci0gICAgbU5leHRSZXN1bHRGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyICsgMTsKIAogICAgIENhcHR1cmVSZXN1bHQgY2FwdHVyZVJlc3VsdDsKICAgICBjYXB0dXJlUmVzdWx0Lm1SZXN1bHRFeHRyYXMgPSByZXN1bHRFeHRyYXM7CkBAIC0yMDAwLDYgKzIxOTEsOCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgb3ZlcnJpZGVSZXN1bHRGb3JQcmVjYXB0dXJlQ2FuY2VsKCZjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YSwgYWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUpOworCiAgICAgLy8gVmFsaWQgcmVzdWx0LCBpbnNlcnQgaW50byBxdWV1ZQogICAgIExpc3Q8Q2FwdHVyZVJlc3VsdD46Oml0ZXJhdG9yIHF1ZXVlZFJlc3VsdCA9CiAgICAgICAgICAgICBtUmVzdWx0UXVldWUuaW5zZXJ0KG1SZXN1bHRRdWV1ZS5lbmQoKSwgQ2FwdHVyZVJlc3VsdChjYXB0dXJlUmVzdWx0KSk7CkBAIC0yMTc4LDcgKzIzNzEsOCBAQAogICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhOwogICAgICAgICAgICAgICAgIG1ldGFkYXRhID0gcmVzdWx0LT5yZXN1bHQ7CiAgICAgICAgICAgICAgICAgc2VuZENhcHR1cmVSZXN1bHQobWV0YWRhdGEsIHJlcXVlc3QucmVzdWx0RXh0cmFzLAotICAgICAgICAgICAgICAgICAgICBjb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0LCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICAgICAgICAgIGNvbGxlY3RlZFBhcnRpYWxSZXN1bHQsIGZyYW1lTnVtYmVyLCBoYXNJbnB1dEJ1ZmZlckluUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hZVRyaWdnZXJDYW5jZWxPdmVycmlkZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjM0MCw3ICsyNTM0LDggQEAKIAogICAgICAgICAgICAgLy8gc2VuZCBwZW5kaW5nIHJlc3VsdCBhbmQgYnVmZmVycwogICAgICAgICAgICAgc2VuZENhcHR1cmVSZXN1bHQoci5wZW5kaW5nTWV0YWRhdGEsIHIucmVzdWx0RXh0cmFzLAotICAgICAgICAgICAgICAgIHIucGFydGlhbFJlc3VsdC5jb2xsZWN0ZWRSZXN1bHQsIG1zZy5mcmFtZV9udW1iZXIpOworICAgICAgICAgICAgICAgIHIucGFydGlhbFJlc3VsdC5jb2xsZWN0ZWRSZXN1bHQsIG1zZy5mcmFtZV9udW1iZXIsCisgICAgICAgICAgICAgICAgci5oYXNJbnB1dEJ1ZmZlciwgci5hZVRyaWdnZXJDYW5jZWxPdmVycmlkZSk7CiAgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHIucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXJyYXkoKSwKICAgICAgICAgICAgICAgICByLnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgci5zaHV0dGVyVGltZXN0YW1wKTsKICAgICAgICAgICAgIHIucGVuZGluZ091dHB1dEJ1ZmZlcnMuY2xlYXIoKTsKQEAgLTIzNzQsOCArMjU2OSw5IEBACiAKIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OlJlcXVlc3RUaHJlYWQod3A8Q2FtZXJhM0RldmljZT4gcGFyZW50LAogICAgICAgICBzcDxTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyLAotICAgICAgICBjYW1lcmEzX2RldmljZV90ICpoYWwzRGV2aWNlKSA6Ci0gICAgICAgIFRocmVhZChmYWxzZSksCisgICAgICAgIGNhbWVyYTNfZGV2aWNlX3QgKmhhbDNEZXZpY2UsCisgICAgICAgIGJvb2wgYWVMb2NrQXZhaWxhYmxlKSA6CisgICAgICAgIFRocmVhZCgvKmNhbkNhbGxKYXZhKi9mYWxzZSksCiAgICAgICAgIG1QYXJlbnQocGFyZW50KSwKICAgICAgICAgbVN0YXR1c1RyYWNrZXIoc3RhdHVzVHJhY2tlciksCiAgICAgICAgIG1IYWwzRGV2aWNlKGhhbDNEZXZpY2UpLApAQCAtMjM4NywxMSArMjU4MywxMiBAQAogICAgICAgICBtTGF0ZXN0UmVxdWVzdElkKE5BTUVfTk9UX0ZPVU5EKSwKICAgICAgICAgbUN1cnJlbnRBZlRyaWdnZXJJZCgwKSwKICAgICAgICAgbUN1cnJlbnRQcmVDYXB0dXJlVHJpZ2dlcklkKDApLAotICAgICAgICBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyKE5PX0lOX0ZMSUdIVF9SRVBFQVRJTkdfRlJBTUVTKSB7CisgICAgICAgIG1SZXBlYXRpbmdMYXN0RnJhbWVOdW1iZXIoTk9fSU5fRkxJR0hUX1JFUEVBVElOR19GUkFNRVMpLAorICAgICAgICBtQWVMb2NrQXZhaWxhYmxlKGFlTG9ja0F2YWlsYWJsZSkgewogICAgIG1TdGF0dXNJZCA9IHN0YXR1c1RyYWNrZXItPmFkZENvbXBvbmVudCgpOwogfQogCi12b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnNldE5vdGlmeUNhbGxiYWNrKAordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpzZXROb3RpZmljYXRpb25MaXN0ZW5lcigKICAgICAgICAgTm90aWZpY2F0aW9uTGlzdGVuZXIgKmxpc3RlbmVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKQEAgLTI1MzIsNiArMjcyOSwyMSBAQAogICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CiAgICAgICAgIGZvciAoUmVxdWVzdExpc3Q6Oml0ZXJhdG9yIGl0ID0gbVJlcXVlc3RRdWV1ZS5iZWdpbigpOwogICAgICAgICAgICAgICAgICBpdCAhPSBtUmVxdWVzdFF1ZXVlLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAvLyBBYm9ydCB0aGUgaW5wdXQgYnVmZmVycyBmb3IgcmVwcm9jZXNzIHJlcXVlc3RzLgorICAgICAgICAgICAgaWYgKCgqaXQpLT5tSW5wdXRTdHJlYW0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90IGlucHV0QnVmZmVyOworICAgICAgICAgICAgICAgIHN0YXR1c190IHJlcyA9ICgqaXQpLT5tSW5wdXRTdHJlYW0tPmdldElucHV0QnVmZmVyKCZpbnB1dEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXM6ICVkOiBjb3VsZG4ndCBnZXQgaW5wdXQgYnVmZmVyIHdoaWxlIGNsZWFyaW5nIHRoZSByZXF1ZXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlzdDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9ICgqaXQpLT5tSW5wdXRTdHJlYW0tPnJldHVybklucHV0QnVmZmVyKGlucHV0QnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiAlZDogY291bGRuJ3QgcmV0dXJuIGlucHV0IGJ1ZmZlciB3aGlsZSBjbGVhcmluZyB0aGUgcmVxdWVzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0OiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBTZXQgdGhlIGZyYW1lIG51bWJlciB0aGlzIHJlcXVlc3Qgd291bGQgaGF2ZSBoYWQsIGlmIGl0CiAgICAgICAgICAgICAvLyBoYWQgYmVlbiBzdWJtaXR0ZWQ7IHRoaXMgZnJhbWUgbnVtYmVyIHdpbGwgbm90IGJlIHJldXNlZC4KICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0SWQgYW5kIGJ1cnN0SWQgZmllbGRzIHdlcmUgc2V0IHdoZW4gdGhlIHJlcXVlc3Qgd2FzCkBAIC0yNTgwLDYgKzI3OTIsNjUgQEAKICAgICBtUmVxdWVzdFNpZ25hbC5zaWduYWwoKTsKIH0KIAorCisvKioKKyAqIEZvciBkZXZpY2VzIDw9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yLCBBRV9QUkVDQVBUVVJFX1RSSUdHRVJfQ0FOQ0VMIGlzIG5vdCBzdXBwb3J0ZWQgc28KKyAqIHdlIG5lZWQgdG8gb3ZlcnJpZGUgQUVfUFJFQ0FQVFVSRV9UUklHR0VSX0NBTkNFTCB0byBBRV9QUkVDQVBUVVJFX1RSSUdHRVJfSURMRSBhbmQgQUVfTE9DS19PRkYKKyAqIHRvIEFFX0xPQ0tfT04gdG8gc3RhcnQgY2FuY2VsbGluZyBBRSBwcmVjYXB0dXJlLiBJZiBBRSBsb2NrIGlzIG5vdCBhdmFpbGFibGUsIGl0IHN0aWxsIG92ZXJyaWRlcworICogQUVfUFJFQ0FQVFVSRV9UUklHR0VSX0NBTkNFTCB0byBBRV9QUkVDQVBUVVJFX1RSSUdHRVJfSURMRSBidXQgZG9lc24ndCBhZGQgQUVfTE9DS19PTiB0byB0aGUKKyAqIHJlcXVlc3QuCisgKi8KK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6aGFuZGxlQWVQcmVjYXB0dXJlQ2FuY2VsUmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCkgeworICAgIHJlcXVlc3QtPm1BZVRyaWdnZXJDYW5jZWxPdmVycmlkZS5hcHBseUFlTG9jayA9IGZhbHNlOworICAgIHJlcXVlc3QtPm1BZVRyaWdnZXJDYW5jZWxPdmVycmlkZS5hcHBseUFlUHJlY2FwdHVyZVRyaWdnZXIgPSBmYWxzZTsKKworICAgIGlmIChtSGFsM0RldmljZS0+Y29tbW9uLnZlcnNpb24gPiBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgYWVQcmVjYXB0dXJlVHJpZ2dlciA9CisgICAgICAgICAgICByZXF1ZXN0LT5tU2V0dGluZ3MuZmluZChBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9UUklHR0VSKTsKKyAgICBpZiAoYWVQcmVjYXB0dXJlVHJpZ2dlci5jb3VudCA+IDAgJiYKKyAgICAgICAgICAgIGFlUHJlY2FwdHVyZVRyaWdnZXIuZGF0YS51OFswXSA9PSBBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9UUklHR0VSX0NBTkNFTCkgeworICAgICAgICAvLyBBbHdheXMgb3ZlcnJpZGUgQ0FOQ0VMIHRvIElETEUKKyAgICAgICAgdWludDhfdCBhZVByZWNhcHR1cmVUcmlnZ2VyID0gQU5EUk9JRF9DT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUl9JRExFOworICAgICAgICByZXF1ZXN0LT5tU2V0dGluZ3MudXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVIsICZhZVByZWNhcHR1cmVUcmlnZ2VyLCAxKTsKKyAgICAgICAgcmVxdWVzdC0+bUFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlLmFwcGx5QWVQcmVjYXB0dXJlVHJpZ2dlciA9IHRydWU7CisgICAgICAgIHJlcXVlc3QtPm1BZVRyaWdnZXJDYW5jZWxPdmVycmlkZS5hZVByZWNhcHR1cmVUcmlnZ2VyID0KKyAgICAgICAgICAgICAgICBBTkRST0lEX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9UUklHR0VSX0NBTkNFTDsKKworICAgICAgICBpZiAobUFlTG9ja0F2YWlsYWJsZSA9PSB0cnVlKSB7CisgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBhZUxvY2sgPSByZXF1ZXN0LT5tU2V0dGluZ3MuZmluZChBTkRST0lEX0NPTlRST0xfQUVfTE9DSyk7CisgICAgICAgICAgICBpZiAoYWVMb2NrLmNvdW50ID09IDAgfHwgIGFlTG9jay5kYXRhLnU4WzBdID09IEFORFJPSURfQ09OVFJPTF9BRV9MT0NLX09GRikgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWVMb2NrID0gQU5EUk9JRF9DT05UUk9MX0FFX0xPQ0tfT047CisgICAgICAgICAgICAgICAgcmVxdWVzdC0+bVNldHRpbmdzLnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUVfTE9DSywgJmFlTG9jaywgMSk7CisgICAgICAgICAgICAgICAgcmVxdWVzdC0+bUFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlLmFwcGx5QWVMb2NrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LT5tQWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUuYWVMb2NrID0gQU5EUk9JRF9DT05UUk9MX0FFX0xPQ0tfT0ZGOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIE92ZXJyaWRlIHJlc3VsdCBtZXRhZGF0YSBmb3IgY2FuY2VsbGluZyBBRSBwcmVjYXB0dXJlIHRyaWdnZXIgYXBwbGllZCBpbgorICogaGFuZGxlQWVQcmVjYXB0dXJlQ2FuY2VsUmVxdWVzdCgpLgorICovCit2b2lkIENhbWVyYTNEZXZpY2U6Om92ZXJyaWRlUmVzdWx0Rm9yUHJlY2FwdHVyZUNhbmNlbCgKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgKnJlc3VsdCwgY29uc3QgQWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGVfdCAmYWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUpIHsKKyAgICBpZiAoYWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUuYXBwbHlBZUxvY2spIHsKKyAgICAgICAgLy8gT25seSBkZXZpY2VzIDw9IHYzLjIgc2hvdWxkIGhhdmUgdGhpcyBvdmVycmlkZQorICAgICAgICBhc3NlcnQobURldmljZVZlcnNpb24gPD0gQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzIpOworICAgICAgICByZXN1bHQtPnVwZGF0ZShBTkRST0lEX0NPTlRST0xfQUVfTE9DSywgJmFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlLmFlTG9jaywgMSk7CisgICAgfQorCisgICAgaWYgKGFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlLmFwcGx5QWVQcmVjYXB0dXJlVHJpZ2dlcikgeworICAgICAgICAvLyBPbmx5IGRldmljZXMgPD0gdjMuMiBzaG91bGQgaGF2ZSB0aGlzIG92ZXJyaWRlCisgICAgICAgIGFzc2VydChtRGV2aWNlVmVyc2lvbiA8PSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMik7CisgICAgICAgIHJlc3VsdC0+dXBkYXRlKEFORFJPSURfQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVIsCisgICAgICAgICAgICAgICAgJmFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlLmFlUHJlY2FwdHVyZVRyaWdnZXIsIDEpOworICAgIH0KK30KKwogYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjp0aHJlYWRMb29wKCkgewogCiAgICAgc3RhdHVzX3QgcmVzOwpAQCAtMjY3MSwyOSArMjk0MiwxMSBAQAogICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKICAgICB9CiAKLSAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCBpbnB1dEJ1ZmZlcjsKICAgICB1aW50MzJfdCB0b3RhbE51bUJ1ZmZlcnMgPSAwOwogCiAgICAgLy8gRmlsbCBpbiBidWZmZXJzCi0KICAgICBpZiAobmV4dFJlcXVlc3QtPm1JbnB1dFN0cmVhbSAhPSBOVUxMKSB7Ci0gICAgICAgIHJlcXVlc3QuaW5wdXRfYnVmZmVyID0gJmlucHV0QnVmZmVyOwotICAgICAgICByZXMgPSBuZXh0UmVxdWVzdC0+bUlucHV0U3RyZWFtLT5nZXRJbnB1dEJ1ZmZlcigmaW5wdXRCdWZmZXIpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAvLyBDYW4ndCBnZXQgaW5wdXQgYnVmZmVyIGZyb20gZ3JhbGxvYyBxdWV1ZSAtIHRoaXMgY291bGQgYmUgZHVlIHRvCi0gICAgICAgICAgICAvLyBkaXNjb25uZWN0ZWQgcXVldWUgb3Igb3RoZXIgcHJvZHVjZXIgbWlzYmVoYXZpb3IsIHNvIG5vdCBhIGZhdGFsCi0gICAgICAgICAgICAvLyBlcnJvcgotICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3RUaHJlYWQ6IENhbid0IGdldCBpbnB1dCBidWZmZXIsIHNraXBwaW5nIHJlcXVlc3Q6IgotICAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7Ci0gICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtTGlzdGVuZXItPm5vdGlmeUVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdChyZXF1ZXN0LCBuZXh0UmVxdWVzdCwgb3V0cHV0QnVmZmVycyk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQorICAgICAgICByZXF1ZXN0LmlucHV0X2J1ZmZlciA9ICZuZXh0UmVxdWVzdC0+bUlucHV0QnVmZmVyOwogICAgICAgICB0b3RhbE51bUJ1ZmZlcnMgKz0gMTsKICAgICB9IGVsc2UgewogICAgICAgICByZXF1ZXN0LmlucHV0X2J1ZmZlciA9IE5VTEw7CkBAIC0yNzExLDExICsyOTY0LDEzIEBACiAgICAgICAgICAgICAvLyBlcnJvcgogICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3RUaHJlYWQ6IENhbid0IGdldCBvdXRwdXQgYnVmZmVyLCBza2lwcGluZyByZXF1ZXN0OiIKICAgICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOwotICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbUxpc3RlbmVyLT5ub3RpZnlFcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIElDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1SZXF1ZXN0TG9jayk7CisgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci0+bm90aWZ5RXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNsZWFuVXBGYWlsZWRSZXF1ZXN0KHJlcXVlc3QsIG5leHRSZXF1ZXN0LCBvdXRwdXRCdWZmZXJzKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtMjczNSw3ICsyOTkwLDggQEAKIAogICAgIHJlcyA9IHBhcmVudC0+cmVnaXN0ZXJJbkZsaWdodChyZXF1ZXN0LmZyYW1lX251bWJlciwKICAgICAgICAgICAgIHRvdGFsTnVtQnVmZmVycywgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMsCi0gICAgICAgICAgICAvKmhhc0lucHV0Ki9yZXF1ZXN0LmlucHV0X2J1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgICAgIC8qaGFzSW5wdXQqL3JlcXVlc3QuaW5wdXRfYnVmZmVyICE9IE5VTEwsCisgICAgICAgICAgICBuZXh0UmVxdWVzdC0+bUFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlKTsKICAgICBBTE9HVlYoIiVzOiByZWdpc3RlcmVkIGluIGZsaWdodCByZXF1ZXN0SWQgPSAlIiBQUklkMzIgIiwgZnJhbWVOdW1iZXIgPSAlIiBQUklkNjQKICAgICAgICAgICAgIiwgYnVyc3RJZCA9ICUiIFBSSWQzMiAiLiIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCkBAIC0yNzg0LDYgKzMwNDAsMTIgQEAKICAgICAgICAgbmV4dFJlcXVlc3QtPm1TZXR0aW5ncy51bmxvY2socmVxdWVzdC5zZXR0aW5ncyk7CiAgICAgfQogCisgICAgLy8gVW5zZXQgYXMgY3VycmVudCByZXF1ZXN0CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOworICAgICAgICBtTmV4dFJlcXVlc3QuY2xlYXIoKTsKKyAgICB9CisKICAgICAvLyBSZW1vdmUgYW55IHByZXZpb3VzbHkgcXVldWVkIHRyaWdnZXJzIChhZnRlciB1bmxvY2spCiAgICAgcmVzID0gcmVtb3ZlVHJpZ2dlcnMobVByZXZSZXF1ZXN0KTsKICAgICBpZiAocmVzICE9IE9LKSB7CkBAIC0yODA1LDYgKzMwNjcsMzMgQEAKICAgICByZXR1cm4gbUxhdGVzdFJlcXVlc3Q7CiB9CiAKK2Jvb2wgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6aXNTdHJlYW1QZW5kaW5nKAorICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiYgc3RyZWFtKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVJlcXVlc3RMb2NrKTsKKworICAgIGlmIChtTmV4dFJlcXVlc3QgIT0gbnVsbHB0cikgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHMgOiBtTmV4dFJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zKSB7CisgICAgICAgICAgICBpZiAoc3RyZWFtID09IHMpIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJlYW0gPT0gbU5leHRSZXF1ZXN0LT5tSW5wdXRTdHJlYW0pIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byYgcmVxdWVzdCA6IG1SZXF1ZXN0UXVldWUpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzIDogcmVxdWVzdC0+bU91dHB1dFN0cmVhbXMpIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gcykgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmVhbSA9PSByZXF1ZXN0LT5tSW5wdXRTdHJlYW0pIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byYgcmVxdWVzdCA6IG1SZXBlYXRpbmdSZXF1ZXN0cykgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHMgOiByZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcykgeworICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBzKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyZWFtID09IHJlcXVlc3QtPm1JbnB1dFN0cmVhbSkgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQogCiB2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNsZWFuVXBGYWlsZWRSZXF1ZXN0KAogICAgICAgICBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90ICZyZXF1ZXN0LApAQCAtMjgxNCwxNSArMzEwMywxOCBAQAogICAgIGlmIChyZXF1ZXN0LnNldHRpbmdzICE9IE5VTEwpIHsKICAgICAgICAgbmV4dFJlcXVlc3QtPm1TZXR0aW5ncy51bmxvY2socmVxdWVzdC5zZXR0aW5ncyk7CiAgICAgfQotICAgIGlmIChyZXF1ZXN0LmlucHV0X2J1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIHJlcXVlc3QuaW5wdXRfYnVmZmVyLT5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7Ci0gICAgICAgIG5leHRSZXF1ZXN0LT5tSW5wdXRTdHJlYW0tPnJldHVybklucHV0QnVmZmVyKCoocmVxdWVzdC5pbnB1dF9idWZmZXIpKTsKKyAgICBpZiAobmV4dFJlcXVlc3QtPm1JbnB1dFN0cmVhbSAhPSBOVUxMKSB7CisgICAgICAgIG5leHRSZXF1ZXN0LT5tSW5wdXRCdWZmZXIuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgICAgICBuZXh0UmVxdWVzdC0+bUlucHV0U3RyZWFtLT5yZXR1cm5JbnB1dEJ1ZmZlcihuZXh0UmVxdWVzdC0+bUlucHV0QnVmZmVyKTsKICAgICB9CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXF1ZXN0Lm51bV9vdXRwdXRfYnVmZmVyczsgaSsrKSB7CiAgICAgICAgIG91dHB1dEJ1ZmZlcnMuZWRpdEl0ZW1BdChpKS5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CiAgICAgICAgIG5leHRSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcy5lZGl0SXRlbUF0KGkpLT5yZXR1cm5CdWZmZXIoCiAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzW2ldLCAwKTsKICAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtUmVxdWVzdExvY2spOworICAgIG1OZXh0UmVxdWVzdC5jbGVhcigpOwogfQogCiBzcDxDYW1lcmEzRGV2aWNlOjpDYXB0dXJlUmVxdWVzdD4KQEAgLTI5MDUsNyArMzE5NywzMSBAQAogICAgICAgICBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciA9IG1GcmFtZU51bWJlcisrOwogICAgICAgICBuZXh0UmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5hZlRyaWdnZXJJZCA9IG1DdXJyZW50QWZUcmlnZ2VySWQ7CiAgICAgICAgIG5leHRSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLnByZWNhcHR1cmVUcmlnZ2VySWQgPSBtQ3VycmVudFByZUNhcHR1cmVUcmlnZ2VySWQ7CisKKyAgICAgICAgLy8gU2luY2UgUmVxdWVzdFRocmVhZDo6Y2xlYXIoKSByZW1vdmVzIGJ1ZmZlcnMgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLAorICAgICAgICAvLyBnZXQgdGhlIHJpZ2h0IGJ1ZmZlciBoZXJlIGJlZm9yZSB1bmxvY2tpbmcgbVJlcXVlc3RMb2NrCisgICAgICAgIGlmIChuZXh0UmVxdWVzdC0+bUlucHV0U3RyZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHJlcyA9IG5leHRSZXF1ZXN0LT5tSW5wdXRTdHJlYW0tPmdldElucHV0QnVmZmVyKCZuZXh0UmVxdWVzdC0+bUlucHV0QnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyBDYW4ndCBnZXQgaW5wdXQgYnVmZmVyIGZyb20gZ3JhbGxvYyBxdWV1ZSAtIHRoaXMgY291bGQgYmUgZHVlIHRvCisgICAgICAgICAgICAgICAgLy8gZGlzY29ubmVjdGVkIHF1ZXVlIG9yIG90aGVyIHByb2R1Y2VyIG1pc2JlaGF2aW9yLCBzbyBub3QgYSBmYXRhbAorICAgICAgICAgICAgICAgIC8vIGVycm9yCisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBnZXQgaW5wdXQgYnVmZmVyLCBza2lwcGluZyByZXF1ZXN0OiIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci0+bm90aWZ5RXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFJlcXVlc3QtPm1SZXN1bHRFeHRyYXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KKworICAgIGhhbmRsZUFlUHJlY2FwdHVyZUNhbmNlbFJlcXVlc3QobmV4dFJlcXVlc3QpOworCisgICAgbU5leHRSZXF1ZXN0ID0gbmV4dFJlcXVlc3Q7CisKICAgICByZXR1cm4gbmV4dFJlcXVlc3Q7CiB9CiAKQEAgLTMxNTIsNiArMzQ2OCwxMzggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKKy8qKgorICogUHJlcGFyZXJUaHJlYWQgaW5uZXIgY2xhc3MgbWV0aG9kcworICovCisKK0NhbWVyYTNEZXZpY2U6OlByZXBhcmVyVGhyZWFkOjpQcmVwYXJlclRocmVhZCgpIDoKKyAgICAgICAgVGhyZWFkKC8qY2FuQ2FsbEphdmEqL2ZhbHNlKSwgbUFjdGl2ZShmYWxzZSksIG1DYW5jZWxOb3coZmFsc2UpIHsKK30KKworQ2FtZXJhM0RldmljZTo6UHJlcGFyZXJUaHJlYWQ6On5QcmVwYXJlclRocmVhZCgpIHsKKyAgICBUaHJlYWQ6OnJlcXVlc3RFeGl0QW5kV2FpdCgpOworICAgIGlmIChtQ3VycmVudFN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgIG1DdXJyZW50U3RyZWFtLT5jYW5jZWxQcmVwYXJlKCk7CisgICAgICAgIEFUUkFDRV9BU1lOQ19FTkQoInN0cmVhbSBwcmVwYXJlIiwgbUN1cnJlbnRTdHJlYW0tPmdldElkKCkpOworICAgICAgICBtQ3VycmVudFN0cmVhbS5jbGVhcigpOworICAgIH0KKyAgICBjbGVhcigpOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpQcmVwYXJlclRocmVhZDo6cHJlcGFyZShzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiYgc3RyZWFtKSB7CisgICAgc3RhdHVzX3QgcmVzOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgcmVzID0gc3RyZWFtLT5zdGFydFByZXBhcmUoKTsKKyAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIC8vIE5vIHByZXBhcmF0aW9uIG5lZWRlZCwgZmlyZSBsaXN0ZW5lciByaWdodCBvZmYKKyAgICAgICAgQUxPR1YoIiVzOiBTdHJlYW0gJWQgYWxyZWFkeSBwcmVwYXJlZCIsIF9fRlVOQ1RJT05fXywgc3RyZWFtLT5nZXRJZCgpKTsKKyAgICAgICAgaWYgKG1MaXN0ZW5lcikgeworICAgICAgICAgICAgbUxpc3RlbmVyLT5ub3RpZnlQcmVwYXJlZChzdHJlYW0tPmdldElkKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgaWYgKHJlcyAhPSBOT1RfRU5PVUdIX0RBVEEpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBOZWVkIHRvIHByZXBhcmUsIHN0YXJ0IHVwIHRocmVhZCBpZiBuZWNlc3NhcnkKKyAgICBpZiAoIW1BY3RpdmUpIHsKKyAgICAgICAgLy8gbVJ1bm5pbmcgd2lsbCBjaGFuZ2UgdG8gZmFsc2UgYmVmb3JlIHRoZSB0aHJlYWQgZnVsbHkgc2h1dHMgZG93biwgc28gd2FpdCB0byBiZSBzdXJlIGl0CisgICAgICAgIC8vIGlzbid0IHJ1bm5pbmcKKyAgICAgICAgVGhyZWFkOjpyZXF1ZXN0RXhpdEFuZFdhaXQoKTsKKyAgICAgICAgcmVzID0gVGhyZWFkOjpydW4oIkMzUHJlcFRocmVhZCIsIFBSSU9SSVRZX0JBQ0tHUk9VTkQpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBzdGFydCBwcmVwYXJlciBzdHJlYW06ICVkICglcykiLCBfX0ZVTkNUSU9OX18sIHJlcywgc3RyZXJyb3IoLXJlcykpOworICAgICAgICAgICAgaWYgKG1MaXN0ZW5lcikgeworICAgICAgICAgICAgICAgIG1MaXN0ZW5lci0+bm90aWZ5UHJlcGFyZWQoc3RyZWFtLT5nZXRJZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgbUNhbmNlbE5vdyA9IGZhbHNlOworICAgICAgICBtQWN0aXZlID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoIiVzOiBQcmVwYXJlciBzdHJlYW0gc3RhcnRlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorCisgICAgLy8gcXVldWUgdXAgdGhlIHdvcmsKKyAgICBtUGVuZGluZ1N0cmVhbXMucHVzaF9iYWNrKHN0cmVhbSk7CisgICAgQUxPR1YoIiVzOiBTdHJlYW0gJWQgcXVldWVkIGZvciBwcmVwYXJpbmciLCBfX0ZVTkNUSU9OX18sIHN0cmVhbS0+Z2V0SWQoKSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OlByZXBhcmVyVGhyZWFkOjpjbGVhcigpIHsKKyAgICBzdGF0dXNfdCByZXM7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHN0cmVhbSA6IG1QZW5kaW5nU3RyZWFtcykgeworICAgICAgICBzdHJlYW0tPmNhbmNlbFByZXBhcmUoKTsKKyAgICB9CisgICAgbVBlbmRpbmdTdHJlYW1zLmNsZWFyKCk7CisgICAgbUNhbmNlbE5vdyA9IHRydWU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UHJlcGFyZXJUaHJlYWQ6OnNldE5vdGlmaWNhdGlvbkxpc3RlbmVyKE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcikgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKK30KKworYm9vbCBDYW1lcmEzRGV2aWNlOjpQcmVwYXJlclRocmVhZDo6dGhyZWFkTG9vcCgpIHsKKyAgICBzdGF0dXNfdCByZXM7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgICAgIGlmIChtQ3VycmVudFN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBFbmQgdGhyZWFkIGlmIGRvbmUgd2l0aCB3b3JrCisgICAgICAgICAgICBpZiAobVBlbmRpbmdTdHJlYW1zLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6IFByZXBhcmVyIHN0cmVhbSBvdXQgb2Ygd29yayIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgLy8gdGhyZWFkTG9vcCBfbXVzdCBub3RfIHJlLWFjcXVpcmUgbUxvY2sgYWZ0ZXIgaXQgc2V0cyBtQWN0aXZlIHRvIGZhbHNlOyB3b3VsZAorICAgICAgICAgICAgICAgIC8vIGNhdXNlIGRlYWRsb2NrIHdpdGggcHJlcGFyZSgpJ3MgcmVxdWVzdEV4aXRBbmRXYWl0IHRyaWdnZXJlZCBieSAhbUFjdGl2ZS4KKyAgICAgICAgICAgICAgICBtQWN0aXZlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBHZXQgbmV4dCBzdHJlYW0gdG8gcHJlcGFyZQorICAgICAgICAgICAgYXV0byBpdCA9IG1QZW5kaW5nU3RyZWFtcy5iZWdpbigpOworICAgICAgICAgICAgbUN1cnJlbnRTdHJlYW0gPSAqaXQ7CisgICAgICAgICAgICBtUGVuZGluZ1N0cmVhbXMuZXJhc2UoaXQpOworICAgICAgICAgICAgQVRSQUNFX0FTWU5DX0JFR0lOKCJzdHJlYW0gcHJlcGFyZSIsIG1DdXJyZW50U3RyZWFtLT5nZXRJZCgpKTsKKyAgICAgICAgICAgIEFMT0dWKCIlczogUHJlcGFyaW5nIHN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywgbUN1cnJlbnRTdHJlYW0tPmdldElkKCkpOworICAgICAgICB9IGVsc2UgaWYgKG1DYW5jZWxOb3cpIHsKKyAgICAgICAgICAgIG1DdXJyZW50U3RyZWFtLT5jYW5jZWxQcmVwYXJlKCk7CisgICAgICAgICAgICBBVFJBQ0VfQVNZTkNfRU5EKCJzdHJlYW0gcHJlcGFyZSIsIG1DdXJyZW50U3RyZWFtLT5nZXRJZCgpKTsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FuY2VsbGluZyBzdHJlYW0gJWQgcHJlcGFyZSIsIF9fRlVOQ1RJT05fXywgbUN1cnJlbnRTdHJlYW0tPmdldElkKCkpOworICAgICAgICAgICAgbUN1cnJlbnRTdHJlYW0uY2xlYXIoKTsKKyAgICAgICAgICAgIG1DYW5jZWxOb3cgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzID0gbUN1cnJlbnRTdHJlYW0tPnByZXBhcmVOZXh0QnVmZmVyKCk7CisgICAgaWYgKHJlcyA9PSBOT1RfRU5PVUdIX0RBVEEpIHJldHVybiB0cnVlOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgLy8gU29tZXRoaW5nIGJhZCBoYXBwZW5lZDsgdHJ5IHRvIHJlY292ZXIgYnkgY2FuY2VsbGluZyBwcmVwYXJlIGFuZAorICAgICAgICAvLyBzaWduYWxsaW5nIGxpc3RlbmVyIGFueXdheQorICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZCByZXR1cm5lZCBlcnJvciAlZCAoJXMpIGR1cmluZyBwcmVwYXJlIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIG1DdXJyZW50U3RyZWFtLT5nZXRJZCgpLCByZXMsIHN0cmVycm9yKC1yZXMpKTsKKyAgICAgICAgbUN1cnJlbnRTdHJlYW0tPmNhbmNlbFByZXBhcmUoKTsKKyAgICB9CisKKyAgICAvLyBUaGlzIHN0cmVhbSBoYXMgZmluaXNoZWQsIG5vdGlmeSBsaXN0ZW5lcgorICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBpZiAobUxpc3RlbmVyKSB7CisgICAgICAgIEFMT0dWKCIlczogU3RyZWFtICVkIHByZXBhcmUgZG9uZSwgc2lnbmFsaW5nIGxpc3RlbmVyIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIG1DdXJyZW50U3RyZWFtLT5nZXRJZCgpKTsKKyAgICAgICAgbUxpc3RlbmVyLT5ub3RpZnlQcmVwYXJlZChtQ3VycmVudFN0cmVhbS0+Z2V0SWQoKSk7CisgICAgfQorCisgICAgQVRSQUNFX0FTWU5DX0VORCgic3RyZWFtIHByZXBhcmUiLCBtQ3VycmVudFN0cmVhbS0+Z2V0SWQoKSk7CisgICAgbUN1cnJlbnRTdHJlYW0uY2xlYXIoKTsKKworICAgIHJldHVybiB0cnVlOworfQogCiAvKioKICAqIFN0YXRpYyBjYWxsYmFjayBmb3J3YXJkaW5nIG1ldGhvZHMgZnJvbSBIQUwgdG8gaW5zdGFuY2UKQEAgLTMxNjEsNiArMzYwOSw3IEBACiAgICAgICAgIGNvbnN0IGNhbWVyYTNfY2FwdHVyZV9yZXN1bHQgKnJlc3VsdCkgewogICAgIENhbWVyYTNEZXZpY2UgKmQgPQogICAgICAgICAgICAgY29uc3RfY2FzdDxDYW1lcmEzRGV2aWNlKj4oc3RhdGljX2Nhc3Q8Y29uc3QgQ2FtZXJhM0RldmljZSo+KGNiKSk7CisKICAgICBkLT5wcm9jZXNzQ2FwdHVyZVJlc3VsdChyZXN1bHQpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCmluZGV4IGVjOGRjMTAuLjUyODcwNTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCkBAIC03Myw3ICs3Myw3IEBACiAgICAgdmlydHVhbCBpbnQgICAgICBnZXRJZCgpIGNvbnN0OwogCiAgICAgLy8gVHJhbnNpdGlvbnMgdG8gaWRsZSBzdGF0ZSBvbiBzdWNjZXNzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZShjYW1lcmFfbW9kdWxlX3QgKm1vZHVsZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplKENhbWVyYU1vZHVsZSAqbW9kdWxlKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3QoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKTsKICAgICB2aXJ0dWFsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvKCkgY29uc3Q7CkBAIC05NCw4ICs5NCw5IEBACiAgICAgLy8gQWN0dWFsIHN0cmVhbSBjcmVhdGlvbi9kZWxldGlvbiBpcyBkZWxheWVkIHVudGlsIGZpcnN0IHJlcXVlc3QgaXMgc3VibWl0dGVkCiAgICAgLy8gSWYgYWRkaW5nIHN0cmVhbXMgd2hpbGUgYWN0aXZlbHkgY2FwdHVyaW5nLCB3aWxsIHBhdXNlIGRldmljZSBiZWZvcmUgYWRkaW5nCiAgICAgLy8gc3RyZWFtLCByZWNvbmZpZ3VyaW5nIGRldmljZSwgYW5kIHVucGF1c2luZy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVN0cmVhbShzcDxBTmF0aXZlV2luZG93PiBjb25zdW1lciwKLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsIGludCAqaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlU3RyZWFtKHNwPFN1cmZhY2U+IGNvbnN1bWVyLAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVJbnB1dFN0cmVhbSgKICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCiAgICAgICAgICAgICBpbnQgKmlkKTsKQEAgLTEwOCwxMyArMTA5LDE2IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVSZXByb2Nlc3NTdHJlYW1Gcm9tU3RyZWFtKGludCBvdXRwdXRJZCwgaW50ICppZCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0cmVhbUluZm8oaW50IGlkLAotICAgICAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LCB1aW50MzJfdCAqZm9ybWF0KTsKKyAgICAgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90ICpmb3JtYXQsIGFuZHJvaWRfZGF0YXNwYWNlICpkYXRhU3BhY2UpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVHJhbnNmb3JtKGludCBpZCwgaW50IHRyYW5zZm9ybSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGRlbGV0ZVN0cmVhbShpbnQgaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVsZXRlUmVwcm9jZXNzU3RyZWFtKGludCBpZCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbXMoYm9vbCBpc0NvbnN0cmFpZWRIaWdoU3BlZWQgPSBmYWxzZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyKAorICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKnByb2R1Y2VyKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlRGVmYXVsdFJlcXVlc3QoaW50IHRlbXBsYXRlSWQsIENhbWVyYU1ldGFkYXRhICpyZXF1ZXN0KTsKIApAQCAtMTM1LDkgKzEzOSwxNCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaChpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZShpbnQgc3RyZWFtSWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCB0ZWFyRG93bihpbnQgc3RyZWFtSWQpOworCiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXREZXZpY2VWZXJzaW9uKCk7CiAKICAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0SnBlZ0J1ZmZlclNpemUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgY29uc3Q7CisgICAgc3NpemVfdCBnZXRQb2ludENsb3VkQnVmZmVyU2l6ZSgpIGNvbnN0OwogCiAgICAgLy8gTWV0aG9kcyBjYWxsZWQgYnkgc3ViY2xhc3NlcwogICAgIHZvaWQgICAgICAgICAgICAgbm90aWZ5U3RhdHVzKGJvb2wgaWRsZSk7IC8vIHVwZGF0ZXMgZnJvbSBTdGF0dXNUcmFja2VyCkBAIC0xNDUsOSArMTU0LDExIEBACiAgIHByaXZhdGU6CiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCAgICAgICAga0R1bXBMb2NrQXR0ZW1wdHMgID0gMTA7CiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCAgICAgICAga0R1bXBTbGVlcER1cmF0aW9uID0gMTAwMDAwOyAvLyAwLjEwIHNlYwotICAgIHN0YXRpYyBjb25zdCBzaXplX3QgICAgICAgIGtJbkZsaWdodFdhcm5MaW1pdCA9IDIwOwogICAgIHN0YXRpYyBjb25zdCBuc2Vjc190ICAgICAgIGtTaHV0ZG93blRpbWVvdXQgICA9IDUwMDAwMDAwMDA7IC8vIDUgc2VjCiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3QgICAgICAga0FjdGl2ZVRpbWVvdXQgICAgID0gNTAwMDAwMDAwOyAgLy8gNTAwIG1zCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCAgICAgICAga0luRmxpZ2h0V2FybkxpbWl0ID0gMjA7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCAgICAgICAga0luRmxpZ2h0V2FybkxpbWl0SGlnaFNwZWVkID0gMjU2OyAvLyBiYXRjaCBzaXplIDMyICogcGlwZSBkZXB0aCA4CisKICAgICBzdHJ1Y3QgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0VHJpZ2dlcjsKICAgICAvLyBtaW5pbWFsIGpwZWcgYnVmZmVyIHNpemU6IDI1NktCICsgYmxvYiBoZWFkZXIKICAgICBzdGF0aWMgY29uc3Qgc3NpemVfdCAgICAgICBrTWluSnBlZ0J1ZmZlclNpemUgPSAyNTYgKiAxMDI0ICsgc2l6ZW9mKGNhbWVyYTNfanBlZ19ibG9iKTsKQEAgLTE2OCw2ICsxNzksOSBAQAogICAgIC8vIENhbWVyYSBkZXZpY2UgSUQKICAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgICBtSWQ7CiAKKyAgICAvLyBGbGFnIGluZGljYXRpbmcgaXMgdGhlIGN1cnJlbnQgYWN0aXZlIHN0cmVhbSBjb25maWd1cmF0aW9uIGlzIGNvbnN0cmFpbmVkIGhpZ2ggc3BlZWQuCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbUlzQ29uc3RyYWluZWRIaWdoU3BlZWRDb25maWd1cmF0aW9uOworCiAgICAgLyoqKiogU2NvcGUgZm9yIG1Mb2NrICoqKiovCiAKICAgICBjYW1lcmEzX2RldmljZV90ICAgICAgICAgICptSGFsM0RldmljZTsKQEAgLTE3OCw2ICsxOTIsMTQgQEAKIAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgIG1EZXZpY2VWZXJzaW9uOwogCisgICAgc3RydWN0IFNpemUgeworICAgICAgICB1aW50MzJfdCB3aWR0aDsKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0OworICAgICAgICBTaXplKHVpbnQzMl90IHcgPSAwLCB1aW50MzJfdCBoID0gMCkgOiB3aWR0aCh3KSwgaGVpZ2h0KGgpe30KKyAgICB9OworICAgIC8vIE1hcCBmcm9tIGZvcm1hdCB0byBzaXplLgorICAgIFZlY3RvcjxTaXplPiAgICAgICAgICAgICAgIG1TdXBwb3J0ZWRPcGFxdWVJbnB1dFNpemVzOworCiAgICAgZW51bSBTdGF0dXMgewogICAgICAgICBTVEFUVVNfRVJST1IsCiAgICAgICAgIFNUQVRVU19VTklOSVRJQUxJWkVELApAQCAtMTg1LDcgKzIwNywxMSBAQAogICAgICAgICBTVEFUVVNfQ09ORklHVVJFRCwKICAgICAgICAgU1RBVFVTX0FDVElWRQogICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXM7CisKKyAgICAvLyBPbmx5IGNsZWFyIG1SZWNlbnRTdGF0dXNVcGRhdGVzLCBtU3RhdHVzV2FpdGVycyBmcm9tIHdhaXRVbnRpbFN0YXRlVGhlblJlbG9jawogICAgIFZlY3RvcjxTdGF0dXM+ICAgICAgICAgICAgIG1SZWNlbnRTdGF0dXNVcGRhdGVzOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXNXYWl0ZXJzOworCiAgICAgQ29uZGl0aW9uICAgICAgICAgICAgICAgICAgbVN0YXR1c0NoYW5nZWQ7CiAKICAgICAvLyBUcmFja2luZyBjYXVzZSBvZiBmYXRhbCBlcnJvcnMgd2hlbiBpbiBTVEFUVVNfRVJST1IKQEAgLTIxNywxMyArMjQzLDI0IEBACiAKICAgICAvKioqKiBFbmQgc2NvcGUgZm9yIG1Mb2NrICoqKiovCiAKKyAgICB0eXBlZGVmIHN0cnVjdCBBZVRyaWdnZXJDYW5jZWxPdmVycmlkZSB7CisgICAgICAgIGJvb2wgYXBwbHlBZUxvY2s7CisgICAgICAgIHVpbnQ4X3QgYWVMb2NrOworICAgICAgICBib29sIGFwcGx5QWVQcmVjYXB0dXJlVHJpZ2dlcjsKKyAgICAgICAgdWludDhfdCBhZVByZWNhcHR1cmVUcmlnZ2VyOworICAgIH0gQWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGVfdDsKKwogICAgIGNsYXNzIENhcHR1cmVSZXF1ZXN0IDogcHVibGljIExpZ2h0UmVmQmFzZTxDYXB0dXJlUmVxdWVzdD4gewogICAgICAgcHVibGljOgogICAgICAgICBDYW1lcmFNZXRhZGF0YSAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3M7CiAgICAgICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW0+ICAgICAgICAgIG1JbnB1dFN0cmVhbTsKKyAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgICAgICAgICAgICAgbUlucHV0QnVmZmVyOwogICAgICAgICBWZWN0b3I8c3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0U3RyZWFtczsKICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyAgICAgICAgICAgICAgICAgbVJlc3VsdEV4dHJhczsKKyAgICAgICAgLy8gVXNlZCB0byBjYW5jZWwgQUUgcHJlY2FwdHVyZSB0cmlnZ2VyIGZvciBkZXZpY2VzIGRvZXNuJ3Qgc3VwcG9ydAorICAgICAgICAvLyBDT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUl9DQU5DRUwKKyAgICAgICAgQWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGVfdCAgICAgICAgICAgbUFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlOwogICAgIH07CiAgICAgdHlwZWRlZiBMaXN0PHNwPENhcHR1cmVSZXF1ZXN0PiA+IFJlcXVlc3RMaXN0OwogCkBAIC0yNDUsNiArMjgyLDEzIEBACiAgICAgdmlydHVhbCBDYW1lcmFNZXRhZGF0YSBnZXRMYXRlc3RSZXF1ZXN0TG9ja2VkKCk7CiAKICAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIGN1cnJlbnQgZGV2aWNlIHN0YXR1cyBhbmQgd2FrZSBhbGwgd2FpdGluZyB0aHJlYWRzLgorICAgICAqCisgICAgICogTXVzdCBiZSBjYWxsZWQgd2l0aCBtTG9jayBoZWxkLgorICAgICAqLworICAgIHZvaWQgaW50ZXJuYWxVcGRhdGVTdGF0dXNMb2NrZWQoU3RhdHVzIHN0YXR1cyk7CisKKyAgICAvKioKICAgICAgKiBQYXVzZSBwcm9jZXNzaW5nIGFuZCBmbHVzaCBldmVyeXRoaW5nLCBidXQgZG9uJ3QgdGVsbCB0aGUgY2xpZW50cy4KICAgICAgKiBUaGlzIGlzIGZvciByZWNvbmZpZ3VyaW5nIG91dHB1dHMgdHJhbnNwYXJlbnRseSB3aGVuIGFjY29yZGluZyB0byB0aGUKICAgICAgKiBDYW1lcmFEZXZpY2VCYXNlIGludGVyZmFjZSB3ZSBzaG91bGRuJ3QgbmVlZCB0by4KQEAgLTMyMywxMSArMzY3LDExIEBACiAgICAgICovCiAgICAgYm9vbCAgICAgICAgICAgICAgIHRyeUxvY2tTcGluUmlnaHRSb3VuZChNdXRleCYgbG9jayk7CiAKLSAgICBzdHJ1Y3QgU2l6ZSB7Ci0gICAgICAgIGludCB3aWR0aDsKLSAgICAgICAgaW50IGhlaWdodDsKLSAgICAgICAgU2l6ZShpbnQgdywgaW50IGgpIDogd2lkdGgodyksIGhlaWdodChoKXt9Ci0gICAgfTsKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGFuIGlucHV0IHNpemUgZm9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQKKyAgICAgKiBmb3JtYXQgaXMgc3VwcG9ydGVkLgorICAgICAqLworICAgIGJvb2wgaXNPcGFxdWVJbnB1dFNpemVTdXBwb3J0ZWQodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCk7CiAKICAgICAvKioKICAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBsYXJnZXN0IEpwZWcgcmVzb2x1dGlvbiAoaW4gYXJlYSkKQEAgLTM2MSw5ICs0MDUsMTAgQEAKIAogICAgICAgICBSZXF1ZXN0VGhyZWFkKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCwKICAgICAgICAgICAgICAgICBzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyLAotICAgICAgICAgICAgICAgIGNhbWVyYTNfZGV2aWNlX3QgKmhhbDNEZXZpY2UpOworICAgICAgICAgICAgICAgIGNhbWVyYTNfZGV2aWNlX3QgKmhhbDNEZXZpY2UsCisgICAgICAgICAgICAgICAgYm9vbCBhZUxvY2tBdmFpbGFibGUpOwogCi0gICAgICAgIHZvaWQgICAgIHNldE5vdGlmeUNhbGxiYWNrKE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcik7CisgICAgICAgIHZvaWQgICAgIHNldE5vdGlmaWNhdGlvbkxpc3RlbmVyKE5vdGlmaWNhdGlvbkxpc3RlbmVyICpsaXN0ZW5lcik7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENhbGwgYWZ0ZXIgc3RyZWFtIChyZSktY29uZmlndXJhdGlvbiBpcyBjb21wbGV0ZWQuCkBAIC00MjcsNiArNDcyLDEyIEBACiAgICAgICAgICAqLwogICAgICAgICBDYW1lcmFNZXRhZGF0YSBnZXRMYXRlc3RSZXF1ZXN0KCkgY29uc3Q7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RyZWFtIGlzIGEgdGFyZ2V0IG9mIGFueSBxdWV1ZWQgb3IgcmVwZWF0aW5nCisgICAgICAgICAqIGNhcHR1cmUgcmVxdWVzdAorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBpc1N0cmVhbVBlbmRpbmcoc3A8Y2FtZXJhMzo6Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4mIHN0cmVhbSk7CisKICAgICAgIHByb3RlY3RlZDoKIAogICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOwpAQCAtNDY4LDYgKzUxOSw5IEBACiAgICAgICAgIC8vIElmIHRoZSBpbnB1dCByZXF1ZXN0IGlzIGluIG1SZXBlYXRpbmdSZXF1ZXN0cy4gTXVzdCBiZSBjYWxsZWQgd2l0aCBtUmVxdWVzdExvY2sgaG9sZAogICAgICAgICBib29sIGlzUmVwZWF0aW5nUmVxdWVzdExvY2tlZChjb25zdCBzcDxDYXB0dXJlUmVxdWVzdD4pOwogCisgICAgICAgIC8vIEhhbmRsZSBBRSBwcmVjYXB0dXJlIHRyaWdnZXIgY2FuY2VsIGZvciBkZXZpY2VzIDw9IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yLgorICAgICAgICB2b2lkIGhhbmRsZUFlUHJlY2FwdHVyZUNhbmNlbFJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QpOworCiAgICAgICAgIHdwPENhbWVyYTNEZXZpY2U+ICBtUGFyZW50OwogICAgICAgICB3cDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiAgbVN0YXR1c1RyYWNrZXI7CiAgICAgICAgIGNhbWVyYTNfZGV2aWNlX3QgICptSGFsM0RldmljZTsKQEAgLTQ4Miw2ICs1MzYsMTAgQEAKICAgICAgICAgQ29uZGl0aW9uICAgICAgICAgIG1SZXF1ZXN0U2lnbmFsOwogICAgICAgICBSZXF1ZXN0TGlzdCAgICAgICAgbVJlcXVlc3RRdWV1ZTsKICAgICAgICAgUmVxdWVzdExpc3QgICAgICAgIG1SZXBlYXRpbmdSZXF1ZXN0czsKKyAgICAgICAgLy8gVGhlIG5leHQgcmVxdWVzdCBiZWluZyBwcmVwcGVkIGZvciBzdWJtaXNzaW9uIHRvIHRoZSBIQUwsIG5vIGxvbmdlcgorICAgICAgICAvLyBvbiB0aGUgcmVxdWVzdCBxdWV1ZS4gUmVhZC1vbmx5IGV2ZW4gd2l0aCBtUmVxdWVzdExvY2sgaGVsZCwgb3V0c2lkZQorICAgICAgICAvLyBvZiB0aHJlYWRMb29wCisgICAgICAgIHNwPGNvbnN0IENhcHR1cmVSZXF1ZXN0PiBtTmV4dFJlcXVlc3Q7CiAKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG1SZWNvbmZpZ3VyZWQ7CiAKQEAgLTUxMiw2ICs1NzAsOSBAQAogICAgICAgICB1aW50MzJfdCAgICAgICAgICAgbUN1cnJlbnRQcmVDYXB0dXJlVHJpZ2dlcklkOwogCiAgICAgICAgIGludDY0X3QgICAgICAgICAgICBtUmVwZWF0aW5nTGFzdEZyYW1lTnVtYmVyOworCisgICAgICAgIC8vIFdoZXRoZXIgdGhlIGRldmljZSBzdXBwb3J0cyBBRSBsb2NrCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICBtQWVMb2NrQXZhaWxhYmxlOwogICAgIH07CiAgICAgc3A8UmVxdWVzdFRocmVhZD4gbVJlcXVlc3RUaHJlYWQ7CiAKQEAgLTUzNCw3ICs1OTUsNiBAQAogICAgICAgICAvLyBJZiB0aGlzIHJlcXVlc3QgaGFzIGFueSBpbnB1dCBidWZmZXIKICAgICAgICAgYm9vbCBoYXNJbnB1dEJ1ZmZlcjsKIAotCiAgICAgICAgIC8vIFRoZSBsYXN0IG1ldGFkYXRhIHRoYXQgZnJhbWV3b3JrIHJlY2VpdmVzIGZyb20gSEFMIGFuZAogICAgICAgICAvLyBub3QgeWV0IHNlbmQgb3V0IGJlY2F1c2UgdGhlIHNodXR0ZXIgZXZlbnQgaGFzbid0IGFycml2ZWQuCiAgICAgICAgIC8vIEl0J3MgYWRkZWQgYnkgcHJvY2Vzc19jYXB0dXJlX3Jlc3VsdCBhbmQgc2VudCB3aGVuIGZyYW1ld29yawpAQCAtNTQ3LDYgKzYwNyw5IEBACiAgICAgICAgIC8vIHRoZSBzaHV0dGVyIGV2ZW50LgogICAgICAgICBWZWN0b3I8Y2FtZXJhM19zdHJlYW1fYnVmZmVyX3Q+IHBlbmRpbmdPdXRwdXRCdWZmZXJzOwogCisgICAgICAgIC8vIFVzZWQgdG8gY2FuY2VsIEFFIHByZWNhcHR1cmUgdHJpZ2dlciBmb3IgZGV2aWNlcyBkb2Vzbid0IHN1cHBvcnQKKyAgICAgICAgLy8gQ09OVFJPTF9BRV9QUkVDQVBUVVJFX1RSSUdHRVJfQ0FOQ0VMCisgICAgICAgIEFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlX3QgYWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGU7CiAKIAogICAgICAgICAvLyBGaWVsZHMgdXNlZCBieSB0aGUgcGFydGlhbCByZXN1bHQgb25seQpAQCAtNTY4LDM4ICs2MzEsMjMgQEAKICAgICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzKE9LKSwKICAgICAgICAgICAgICAgICBoYXZlUmVzdWx0TWV0YWRhdGEoZmFsc2UpLAogICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNMZWZ0KDApLAotICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGZhbHNlKXsKKyAgICAgICAgICAgICAgICBoYXNJbnB1dEJ1ZmZlcihmYWxzZSksCisgICAgICAgICAgICAgICAgYWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUoe2ZhbHNlLCAwLCBmYWxzZSwgMH0pewogICAgICAgICB9CiAKLSAgICAgICAgSW5GbGlnaHRSZXF1ZXN0KGludCBudW1CdWZmZXJzKSA6Ci0gICAgICAgICAgICAgICAgc2h1dHRlclRpbWVzdGFtcCgwKSwKLSAgICAgICAgICAgICAgICBzZW5zb3JUaW1lc3RhbXAoMCksCi0gICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cyhPSyksCi0gICAgICAgICAgICAgICAgaGF2ZVJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKLSAgICAgICAgICAgICAgICBudW1CdWZmZXJzTGVmdChudW1CdWZmZXJzKSwKLSAgICAgICAgICAgICAgICBoYXNJbnB1dEJ1ZmZlcihmYWxzZSl7Ci0gICAgICAgIH0KLQotICAgICAgICBJbkZsaWdodFJlcXVlc3QoaW50IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgZXh0cmFzKSA6CisgICAgICAgIEluRmxpZ2h0UmVxdWVzdChpbnQgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyBleHRyYXMsIGJvb2wgaGFzSW5wdXQsCisgICAgICAgICAgICAgICAgQWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUgYWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUpIDoKICAgICAgICAgICAgICAgICBzaHV0dGVyVGltZXN0YW1wKDApLAogICAgICAgICAgICAgICAgIHNlbnNvclRpbWVzdGFtcCgwKSwKICAgICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzKE9LKSwKICAgICAgICAgICAgICAgICBoYXZlUmVzdWx0TWV0YWRhdGEoZmFsc2UpLAogICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNMZWZ0KG51bUJ1ZmZlcnMpLAogICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcyhleHRyYXMpLAotICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGZhbHNlKXsKKyAgICAgICAgICAgICAgICBoYXNJbnB1dEJ1ZmZlcihoYXNJbnB1dCksCisgICAgICAgICAgICAgICAgYWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUoYWVUcmlnZ2VyQ2FuY2VsT3ZlcnJpZGUpewogICAgICAgICB9CisgICAgfTsKIAotICAgICAgICBJbkZsaWdodFJlcXVlc3QoaW50IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgZXh0cmFzLCBib29sIGhhc0lucHV0KSA6Ci0gICAgICAgICAgICAgICAgc2h1dHRlclRpbWVzdGFtcCgwKSwKLSAgICAgICAgICAgICAgICBzZW5zb3JUaW1lc3RhbXAoMCksCi0gICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cyhPSyksCi0gICAgICAgICAgICAgICAgaGF2ZVJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKLSAgICAgICAgICAgICAgICBudW1CdWZmZXJzTGVmdChudW1CdWZmZXJzKSwKLSAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMoZXh0cmFzKSwKLSAgICAgICAgICAgICAgICBoYXNJbnB1dEJ1ZmZlcihoYXNJbnB1dCl7Ci0gICAgICAgIH0KLX07CiAgICAgLy8gTWFwIGZyb20gZnJhbWUgbnVtYmVyIHRvIHRoZSBpbi1mbGlnaHQgcmVxdWVzdCBzdGF0ZQogICAgIHR5cGVkZWYgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEluRmxpZ2h0UmVxdWVzdD4gSW5GbGlnaHRNYXA7CiAKQEAgLTYwNyw3ICs2NTUsOCBAQAogICAgIEluRmxpZ2h0TWFwICAgICAgICAgICAgbUluRmxpZ2h0TWFwOwogCiAgICAgc3RhdHVzX3QgcmVnaXN0ZXJJbkZsaWdodCh1aW50MzJfdCBmcmFtZU51bWJlciwKLSAgICAgICAgICAgIGludDMyX3QgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMsIGJvb2wgaGFzSW5wdXQpOworICAgICAgICAgICAgaW50MzJfdCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcywgYm9vbCBoYXNJbnB1dCwKKyAgICAgICAgICAgIGNvbnN0IEFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlX3QgJmFlVHJpZ2dlckNhbmNlbE92ZXJyaWRlKTsKIAogICAgIC8qKgogICAgICAqIEZvciB0aGUgcGFydGlhbCByZXN1bHQsIGNoZWNrIGlmIGFsbCAzQSBzdGF0ZSBmaWVsZHMgYXJlIGF2YWlsYWJsZQpAQCAtNjI1LDEyICs2NzQsNTkgQEAKICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgIGJvb2wgaW5zZXJ0M0FSZXN1bHQoQ2FtZXJhTWV0YWRhdGEgJnJlc3VsdCwgaW50MzJfdCB0YWcsIGNvbnN0IFQqIHZhbHVlLAogICAgICAgICAgICAgdWludDMyX3QgZnJhbWVOdW1iZXIpOworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgcmVzdWx0IG1ldGFkYXRhIGZvciBjYW5jZWxsaW5nIEFFIHByZWNhcHR1cmUgdHJpZ2dlciBhcHBsaWVkIGluCisgICAgICogaGFuZGxlQWVQcmVjYXB0dXJlQ2FuY2VsUmVxdWVzdCgpLgorICAgICAqLworICAgIHZvaWQgb3ZlcnJpZGVSZXN1bHRGb3JQcmVjYXB0dXJlQ2FuY2VsKENhbWVyYU1ldGFkYXRhKiByZXN1bHQsCisgICAgICAgICAgICBjb25zdCBBZVRyaWdnZXJDYW5jZWxPdmVycmlkZV90ICZhZVRyaWdnZXJDYW5jZWxPdmVycmlkZSk7CisKICAgICAvKioKICAgICAgKiBUcmFja2luZyBmb3IgaWRsZSBkZXRlY3Rpb24KICAgICAgKi8KICAgICBzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBtU3RhdHVzVHJhY2tlcjsKIAogICAgIC8qKgorICAgICAqIFRocmVhZCBmb3IgcHJlcGFyaW5nIHN0cmVhbXMKKyAgICAgKi8KKyAgICBjbGFzcyBQcmVwYXJlclRocmVhZCA6IHByaXZhdGUgVGhyZWFkLCBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgUHJlcGFyZXJUaHJlYWQoKTsKKyAgICAgICAgflByZXBhcmVyVGhyZWFkKCk7CisKKyAgICAgICAgdm9pZCBzZXROb3RpZmljYXRpb25MaXN0ZW5lcihOb3RpZmljYXRpb25MaXN0ZW5lciAqbGlzdGVuZXIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBRdWV1ZSB1cCBhIHN0cmVhbSB0byBiZSBwcmVwYXJlZC4gU3RyZWFtcyBhcmUgcHJvY2Vzc2VkIGJ5CisgICAgICAgICAqIGEgYmFja2dyb3VuZCB0aHJlYWQgaW4gRklGTyBvcmRlcgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdHVzX3QgcHJlcGFyZShzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiYgc3RyZWFtKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FuY2VsIGFsbCBjdXJyZW50IGFuZCBwZW5kaW5nIHN0cmVhbSBwcmVwYXJhdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdHVzX3QgY2xlYXIoKTsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgTXV0ZXggbUxvY2s7CisKKyAgICAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKKworICAgICAgICAvLyBHdWFyZGVkIGJ5IG1Mb2NrCisKKyAgICAgICAgTm90aWZpY2F0aW9uTGlzdGVuZXIgKm1MaXN0ZW5lcjsKKyAgICAgICAgTGlzdDxzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiA+IG1QZW5kaW5nU3RyZWFtczsKKyAgICAgICAgYm9vbCBtQWN0aXZlOworICAgICAgICBib29sIG1DYW5jZWxOb3c7CisKKyAgICAgICAgLy8gT25seSBhY2Nlc3NlZCBieSB0aHJlYWRMb29wIGFuZCB0aGUgZGVzdHJ1Y3RvcgorCisgICAgICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IG1DdXJyZW50U3RyZWFtOworICAgIH07CisgICAgc3A8UHJlcGFyZXJUaHJlYWQ+IG1QcmVwYXJlclRocmVhZDsKKworICAgIC8qKgogICAgICAqIE91dHB1dCByZXN1bHQgcXVldWUgYW5kIGN1cnJlbnQgSEFMIGRldmljZSAzQSBzdGF0ZQogICAgICAqLwogCkBAIC02MzgsOCArNzM0LDEwIEBACiAgICAgTXV0ZXggICAgICAgICAgICAgICAgICBtT3V0cHV0TG9jazsKIAogICAgIC8qKioqIFNjb3BlIGZvciBtT3V0cHV0TG9jayAqKioqLwotCisgICAgLy8gdGhlIG1pbmltYWwgZnJhbWUgbnVtYmVyIG9mIHRoZSBuZXh0IG5vbi1yZXByb2Nlc3MgcmVzdWx0CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyOworICAgIC8vIHRoZSBtaW5pbWFsIGZyYW1lIG51bWJlciBvZiB0aGUgbmV4dCByZXByb2Nlc3MgcmVzdWx0CisgICAgdWludDMyX3QgICAgICAgICAgICAgICBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXI7CiAgICAgTGlzdDxDYXB0dXJlUmVzdWx0PiAgIG1SZXN1bHRRdWV1ZTsKICAgICBDb25kaXRpb24gICAgICAgICAgICAgIG1SZXN1bHRTaWduYWw7CkBAIC02NjgsNyArNzY2LDggQEAKICAgICAvLyBwYXJ0aWFsIHJlc3VsdHMsIGFuZCB0aGUgZnJhbWUgbnVtYmVyIHRvIHRoZSByZXN1bHQgcXVldWUuCiAgICAgdm9pZCBzZW5kQ2FwdHVyZVJlc3VsdChDYW1lcmFNZXRhZGF0YSAmcGVuZGluZ01ldGFkYXRhLAogICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzLAotICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgJmNvbGxlY3RlZFBhcnRpYWxSZXN1bHQsIHVpbnQzMl90IGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhICZjb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0LCB1aW50MzJfdCBmcmFtZU51bWJlciwKKyAgICAgICAgICAgIGJvb2wgcmVwcm9jZXNzLCBjb25zdCBBZVRyaWdnZXJDYW5jZWxPdmVycmlkZV90ICZhZVRyaWdnZXJDYW5jZWxPdmVycmlkZSk7CiAKICAgICAvKioqKiBTY29wZSBmb3IgbUluRmxpZ2h0TG9jayAqKioqLwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKaW5kZXggNjY1NmIwOS4uZWNiOGFjOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcApAQCAtMjgsNyArMjgsNyBAQAogCiBDYW1lcmEzRHVtbXlTdHJlYW06OkNhbWVyYTNEdW1teVN0cmVhbShpbnQgaWQpIDoKICAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCBEVU1NWV9XSURUSCwgRFVNTVlfSEVJR0hULAotICAgICAgICAgICAgICAgIC8qbWF4U2l6ZSovMCwgRFVNTVlfRk9STUFUKSB7CisgICAgICAgICAgICAgICAgLyptYXhTaXplKi8wLCBEVU1NWV9GT1JNQVQsIERVTU1ZX0RBVEFTUEFDRSwgRFVNTVlfUk9UQVRJT04pIHsKIAogfQogCkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OmdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSB7CitzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OmdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSBjb25zdCB7CiAgICAgKnVzYWdlID0gRFVNTVlfVVNBR0U7CiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKaW5kZXggM2U0MjYyMy4uM2EzZGJmNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oCkBAIC03NSw2ICs3NSw4IEBACiAgICAgc3RhdGljIGNvbnN0IGludCBEVU1NWV9XSURUSCA9IDMyMDsKICAgICBzdGF0aWMgY29uc3QgaW50IERVTU1ZX0hFSUdIVCA9IDI0MDsKICAgICBzdGF0aWMgY29uc3QgaW50IERVTU1ZX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKKyAgICBzdGF0aWMgY29uc3QgYW5kcm9pZF9kYXRhc3BhY2UgRFVNTVlfREFUQVNQQUNFID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOOworICAgIHN0YXRpYyBjb25zdCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IERVTU1ZX1JPVEFUSU9OID0gQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMDsKICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgRFVNTVlfVVNBR0UgPSBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSOwogCiAgICAgLyoqCkBAIC04Nyw3ICs4OSw3IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSBjb25zdDsKIAogfTsgLy8gY2xhc3MgQ2FtZXJhM0R1bW15U3RyZWFtCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCmluZGV4IGNjNjY0NTkuLjIzYjFjNDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcApAQCAtMzAsOSArMzAsMTAgQEAKIG5hbWVzcGFjZSBjYW1lcmEzIHsKIAogQ2FtZXJhM0lPU3RyZWFtQmFzZTo6Q2FtZXJhM0lPU3RyZWFtQmFzZShpbnQgaWQsIGNhbWVyYTNfc3RyZWFtX3R5cGVfdCB0eXBlLAotICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBzaXplX3QgbWF4U2l6ZSwgaW50IGZvcm1hdCkgOgorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBzaXplX3QgbWF4U2l6ZSwgaW50IGZvcm1hdCwKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKSA6CiAgICAgICAgIENhbWVyYTNTdHJlYW0oaWQsIHR5cGUsCi0gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgbWF4U2l6ZSwgZm9ybWF0KSwKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBtYXhTaXplLCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24pLAogICAgICAgICBtVG90YWxCdWZmZXJDb3VudCgwKSwKICAgICAgICAgbUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50KDApLAogICAgICAgICBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50KDApLApAQCAtNjYsMTMgKzY3LDE4IEBACiB2b2lkIENhbWVyYTNJT1N0cmVhbUJhc2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBjb25zdCB7CiAgICAgKHZvaWQpIGFyZ3M7CiAgICAgU3RyaW5nOCBsaW5lczsKKworICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2UgPSAwOworICAgIHN0YXR1c190IHJlcyA9IGdldEVuZHBvaW50VXNhZ2UoJmNvbnN1bWVyVXNhZ2UpOworICAgIGlmIChyZXMgIT0gT0spIGNvbnN1bWVyVXNhZ2UgPSAwOworCiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBTdGF0ZTogJWRcbiIsIG1TdGF0ZSk7Ci0gICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBEaW1zOiAlZCB4ICVkLCBmb3JtYXQgMHgleFxuIiwKKyAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIERpbXM6ICVkIHggJWQsIGZvcm1hdCAweCV4LCBkYXRhc3BhY2UgMHgleFxuIiwKICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjp3aWR0aCwgY2FtZXJhM19zdHJlYW06OmhlaWdodCwKLSAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQpOworICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06OmZvcm1hdCwgY2FtZXJhM19zdHJlYW06OmRhdGFfc3BhY2UpOwogICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgTWF4IHNpemU6ICV6dVxuIiwgbU1heFNpemUpOwotICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgVXNhZ2U6ICVkLCBtYXggSEFMIGJ1ZmZlcnM6ICVkXG4iLAotICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06OnVzYWdlLCBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpOworICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgQ29tYmluZWQgdXNhZ2U6ICVkLCBtYXggSEFMIGJ1ZmZlcnM6ICVkXG4iLAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06OnVzYWdlIHwgY29uc3VtZXJVc2FnZSwgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKTsKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIEZyYW1lcyBwcm9kdWNlZDogJWQsIGxhc3QgdGltZXN0YW1wOiAlIiBQUklkNjQgIiBuc1xuIiwKICAgICAgICAgICAgIG1GcmFtZUNvdW50LCBtTGFzdFRpbWVzdGFtcCk7CiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBUb3RhbCBidWZmZXJzOiAlenUsIGN1cnJlbnRseSBkZXF1ZXVlZDogJXp1XG4iLApAQCAtMTU1LDEzICsxNjEsMTEgQEAKIAogICAgIC8vIEluZm9ybSB0cmFja2VyIGFib3V0IGJlY29taW5nIGJ1c3kKICAgICBpZiAobUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50ID09IDAgJiYgbVN0YXRlICE9IFNUQVRFX0lOX0NPTkZJRyAmJgotICAgICAgICAgICAgbVN0YXRlICE9IFNUQVRFX0lOX1JFQ09ORklHKSB7CisgICAgICAgICAgICBtU3RhdGUgIT0gU1RBVEVfSU5fUkVDT05GSUcgJiYgbVN0YXRlICE9IFNUQVRFX1BSRVBBUklORykgewogICAgICAgICAvKioKICAgICAgICAgICogQXZvaWQgYSBzcHVyaW91cyBJRExFLT5BQ1RJVkUtPklETEUgdHJhbnNpdGlvbiB3aGVuIHVzaW5nIGJ1ZmZlcnMKICAgICAgICAgICogYmVmb3JlL2FmdGVyIHJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIGR1cmluZyBpbml0aWFsIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICogb3IgcmUtY29uZmlndXJhdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogVE9ETzogSU5fQ09ORklHIGFuZCBJTl9SRUNPTkZJRyBjaGVja3Mgb25seSBtYWtlIHNlbnNlIGZvciA8SEFMMy4yCisgICAgICAgICAqIG9yIHJlLWNvbmZpZ3VyYXRpb24sIG9yIGR1cmluZyBwcmVwYXJlIHByZS1hbGxvY2F0aW9uCiAgICAgICAgICAqLwogICAgICAgICBzcDxTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyID0gbVN0YXR1c1RyYWNrZXIucHJvbW90ZSgpOwogICAgICAgICBpZiAoc3RhdHVzVHJhY2tlciAhPSAwKSB7CkBAIC0xNzYsOSArMTgwLDExIEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNJT1N0cmVhbUJhc2U6OmdldEJ1ZmZlclByZWNvbmRpdGlvbkNoZWNrTG9ja2VkKCkgY29uc3QgewotICAgIC8vIEFsbG93IGRlcXVldWUgZHVyaW5nIElOX1tSRV1DT05GSUcgZm9yIHJlZ2lzdHJhdGlvbgorICAgIC8vIEFsbG93IGRlcXVldWUgZHVyaW5nIElOX1tSRV1DT05GSUcgZm9yIHJlZ2lzdHJhdGlvbiwgaW4KKyAgICAvLyBQUkVQQVJJTkcgZm9yIHByZS1hbGxvY2F0aW9uCiAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9DT05GSUdVUkVEICYmCi0gICAgICAgICAgICBtU3RhdGUgIT0gU1RBVEVfSU5fQ09ORklHICYmIG1TdGF0ZSAhPSBTVEFURV9JTl9SRUNPTkZJRykgeworICAgICAgICAgICAgbVN0YXRlICE9IFNUQVRFX0lOX0NPTkZJRyAmJiBtU3RhdGUgIT0gU1RBVEVfSU5fUkVDT05GSUcgJiYKKyAgICAgICAgICAgIG1TdGF0ZSAhPSBTVEFURV9QUkVQQVJJTkcpIHsKICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IGdldCBidWZmZXJzIGluIHVuY29uZmlndXJlZCBzdGF0ZSAlZCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIG1TdGF0ZSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTIzOSwxMyArMjQ1LDExIEBACiAKICAgICBtSGFuZG91dFRvdGFsQnVmZmVyQ291bnQtLTsKICAgICBpZiAobUhhbmRvdXRUb3RhbEJ1ZmZlckNvdW50ID09IDAgJiYgbVN0YXRlICE9IFNUQVRFX0lOX0NPTkZJRyAmJgotICAgICAgICAgICAgbVN0YXRlICE9IFNUQVRFX0lOX1JFQ09ORklHKSB7CisgICAgICAgICAgICBtU3RhdGUgIT0gU1RBVEVfSU5fUkVDT05GSUcgJiYgbVN0YXRlICE9IFNUQVRFX1BSRVBBUklORykgewogICAgICAgICAvKioKICAgICAgICAgICogQXZvaWQgYSBzcHVyaW91cyBJRExFLT5BQ1RJVkUtPklETEUgdHJhbnNpdGlvbiB3aGVuIHVzaW5nIGJ1ZmZlcnMKICAgICAgICAgICogYmVmb3JlL2FmdGVyIHJlZ2lzdGVyX3N0cmVhbV9idWZmZXJzIGR1cmluZyBpbml0aWFsIGNvbmZpZ3VyYXRpb24KLSAgICAgICAgICogb3IgcmUtY29uZmlndXJhdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogVE9ETzogSU5fQ09ORklHIGFuZCBJTl9SRUNPTkZJRyBjaGVja3Mgb25seSBtYWtlIHNlbnNlIGZvciA8SEFMMy4yCisgICAgICAgICAqIG9yIHJlLWNvbmZpZ3VyYXRpb24sIG9yIGR1cmluZyBwcmVwYXJlIHByZS1hbGxvY2F0aW9uCiAgICAgICAgICAqLwogICAgICAgICBBTE9HVigiJXM6IFN0cmVhbSAlZDogQWxsIGJ1ZmZlcnMgcmV0dXJuZWQ7IG5vdyBpZGxlIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgIG1JZCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCmluZGV4IGEzNWMyOTAuLmY1NzI3ZTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCkBAIC0zMyw3ICszMyw4IEBACiAgICAgICAgIHB1YmxpYyBDYW1lcmEzU3RyZWFtIHsKICAgcHJvdGVjdGVkOgogICAgIENhbWVyYTNJT1N0cmVhbUJhc2UoaW50IGlkLCBjYW1lcmEzX3N0cmVhbV90eXBlX3QgdHlwZSwKLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHNpemVfdCBtYXhTaXplLCBpbnQgZm9ybWF0KTsKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHNpemVfdCBtYXhTaXplLCBpbnQgZm9ybWF0LAorICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKTsKIAogICBwdWJsaWM6CiAKQEAgLTgzLDcgKzg0LDcgQEAKIAogICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dElucHV0QnVmZmVyQ291bnRMb2NrZWQoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSBjb25zdCA9IDA7CiAKICAgICBzdGF0dXNfdCBnZXRCdWZmZXJQcmVjb25kaXRpb25DaGVja0xvY2tlZCgpIGNvbnN0OwogICAgIHN0YXR1c190IHJldHVybkJ1ZmZlclByZWNvbmRpdGlvbkNoZWNrTG9ja2VkKCkgY29uc3Q7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKaW5kZXggOWMxZTI4Yi4uMjUwNGJmZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcApAQCAtMjksOCArMjksOCBAQAogCiBDYW1lcmEzSW5wdXRTdHJlYW06OkNhbWVyYTNJbnB1dFN0cmVhbShpbnQgaWQsCiAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQpIDoKLSAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBM19TVFJFQU1fSU5QVVQsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXhTaXplKi8wLCBmb3JtYXQpIHsKKyAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBM19TVFJFQU1fSU5QVVQsIHdpZHRoLCBoZWlnaHQsIC8qbWF4U2l6ZSovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCkgewogCiAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKICAgICAgICAgQUxPR0UoIiVzOiBCYWQgZm9ybWF0LCBCTE9CIG5vdCBzdXBwb3J0ZWQiLCBfX0ZVTkNUSU9OX18pOwpAQCAtNjUsOCArNjUsOCBAQAogICAgIGFzc2VydChtQ29uc3VtZXIgIT0gMCk7CiAKICAgICBCdWZmZXJJdGVtIGJ1ZmZlckl0ZW07Ci0gICAgcmVzID0gbUNvbnN1bWVyLT5hY3F1aXJlQnVmZmVyKCZidWZmZXJJdGVtLCAvKndhaXRGb3JGZW5jZSovZmFsc2UpOwogCisgICAgcmVzID0gbUNvbnN1bWVyLT5hY3F1aXJlQnVmZmVyKCZidWZmZXJJdGVtLCAvKndhaXRGb3JGZW5jZSovZmFsc2UpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IGFjcXVpcmUgbmV4dCBvdXRwdXQgYnVmZmVyOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0xNjIsNiArMTYyLDIxIEBACiAgICAgcmV0dXJuIHJldHVybkFueUJ1ZmZlckxvY2tlZChidWZmZXIsIC8qdGltZXN0YW1wKi8wLCAvKm91dHB1dCovZmFsc2UpOwogfQogCitzdGF0dXNfdCBDYW1lcmEzSW5wdXRTdHJlYW06OmdldElucHV0QnVmZmVyUHJvZHVjZXJMb2NrZWQoCisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqcHJvZHVjZXIpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgaWYgKHByb2R1Y2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKG1Qcm9kdWNlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gaW5wdXQgc3RyZWFtIGlzIGNvbmZpZ3VyZWQiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgICpwcm9kdWNlciA9IG1Qcm9kdWNlcjsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IENhbWVyYTNJbnB1dFN0cmVhbTo6ZGlzY29ubmVjdExvY2tlZCgpIHsKIAogICAgIHN0YXR1c190IHJlczsKQEAgLTE3Miw2ICsxODcsOCBAQAogCiAgICAgYXNzZXJ0KG1CdWZmZXJzSW5GbGlnaHQuc2l6ZSgpID09IDApOwogCisgICAgbUNvbnN1bWVyLT5hYmFuZG9uKCk7CisKICAgICAvKioKICAgICAgKiAgbm8tb3Agc2luY2Ugd2UgY2FuJ3QgZGlzY29ubmVjdCB0aGUgcHJvZHVjZXIgZnJvbSB0aGUgY29uc3VtZXItc2lkZQogICAgICAqLwpAQCAtMjEyLDEwICsyMjksMTcgQEAKICAgICAgICAgcmVzID0gcHJvZHVjZXItPnF1ZXJ5KE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywgJm1pblVuZGVxdWV1ZWRCdWZmZXJzKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSyB8fCBtaW5VbmRlcXVldWVkQnVmZmVycyA8IDApIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDb3VsZCBub3QgcXVlcnkgbWluIHVuZGVxdWV1ZWQgYnVmZmVycyAoZXJyb3IgJWQsIGJ1ZkNvdW50ICVkKSIsCi0gICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgcmVzLCBtaW5VbmRlcXVldWVkQnVmZmVycyk7CisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCByZXMsIG1pblVuZGVxdWV1ZWRCdWZmZXJzKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICAgICAgc2l6ZV90IG1pbkJ1ZnMgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KG1pblVuZGVxdWV1ZWRCdWZmZXJzKTsKKworICAgICAgICBpZiAoY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogJWQ6IEhBTCBzZXRzIG1heF9idWZmZXIgdG8gMC4gTXVzdCBiZSBhdCBsZWFzdCAxLiIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKICAgICAgICAgLyoKICAgICAgICAgICogV2UgcHJvbWlzZSBuZXZlciB0byAnYWNxdWlyZScgbW9yZSB0aGFuIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycwogICAgICAgICAgKiBhdCBhbnkgb25lIHRpbWUuCkBAIC0yMzIsNiArMjU2LDggQEAKICAgICAgICAgbUNvbnN1bWVyID0gbmV3IEJ1ZmZlckl0ZW1Db25zdW1lcihjb25zdW1lciwgY2FtZXJhM19zdHJlYW06OnVzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbEJ1ZmZlckNvdW50KTsKICAgICAgICAgbUNvbnN1bWVyLT5zZXROYW1lKFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhMy1JbnB1dFN0cmVhbS0lZCIsIG1JZCkpOworCisgICAgICAgIG1Qcm9kdWNlciA9IHByb2R1Y2VyOwogICAgIH0KIAogICAgIHJlcyA9IG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlclNpemUoY2FtZXJhM19zdHJlYW06OndpZHRoLApAQCAtMjUxLDcgKzI3Nyw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzSW5wdXRTdHJlYW06OmdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSB7CitzdGF0dXNfdCBDYW1lcmEzSW5wdXRTdHJlYW06OmdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSBjb25zdCB7CiAgICAgLy8gUGVyIEhBTDMgc3BlYywgaW5wdXQgc3RyZWFtcyBoYXZlIDAgZm9yIHRoZWlyIGluaXRpYWwgdXNhZ2UgZmllbGQuCiAgICAgKnVzYWdlID0gMDsKICAgICByZXR1cm4gT0s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaAppbmRleCBmZDE3ZjRmLi45ZjNkZTEwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKQEAgLTQ5LDYgKzQ5LDcgQEAKICAgcHJpdmF0ZToKIAogICAgIHNwPEJ1ZmZlckl0ZW1Db25zdW1lcj4gbUNvbnN1bWVyOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1Qcm9kdWNlcjsKICAgICBWZWN0b3I8QnVmZmVySXRlbT4gbUJ1ZmZlcnNJbkZsaWdodDsKIAogICAgIC8qKgpAQCAtNjgsMTEgKzY5LDEzIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlcik7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5JbnB1dEJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyUHJvZHVjZXJMb2NrZWQoCisgICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqcHJvZHVjZXIpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY29ubmVjdExvY2tlZCgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVRdWV1ZUxvY2tlZCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgY29uc3Q7CiAKIH07IC8vIGNsYXNzIENhbWVyYTNJbnB1dFN0cmVhbQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcAppbmRleCA3N2FkNTAzLi44YzYxMWQ1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKQEAgLTMyLDEwICszMiwxMSBAQAogbmFtZXNwYWNlIGNhbWVyYTMgewogCiBDYW1lcmEzT3V0cHV0U3RyZWFtOjpDYW1lcmEzT3V0cHV0U3RyZWFtKGludCBpZCwKLSAgICAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gY29uc3VtZXIsCi0gICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQpIDoKKyAgICAgICAgc3A8U3VyZmFjZT4gY29uc3VtZXIsCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbikgOgogICAgICAgICBDYW1lcmEzSU9TdHJlYW1CYXNlKGlkLCBDQU1FUkEzX1NUUkVBTV9PVVRQVVQsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXhTaXplKi8wLCBmb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWF4U2l6ZSovMCwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uKSwKICAgICAgICAgbUNvbnN1bWVyKGNvbnN1bWVyKSwKICAgICAgICAgbVRyYW5zZm9ybSgwKSwKICAgICAgICAgbVRyYWNlRmlyc3RCdWZmZXIodHJ1ZSkgewpAQCAtNDcsMTAgKzQ4LDExIEBACiB9CiAKIENhbWVyYTNPdXRwdXRTdHJlYW06OkNhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLAotICAgICAgICBzcDxBTmF0aXZlV2luZG93PiBjb25zdW1lciwKLSAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgc2l6ZV90IG1heFNpemUsIGludCBmb3JtYXQpIDoKKyAgICAgICAgc3A8U3VyZmFjZT4gY29uc3VtZXIsCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHNpemVfdCBtYXhTaXplLCBpbnQgZm9ybWF0LAorICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pIDoKICAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCB3aWR0aCwgaGVpZ2h0LCBtYXhTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uKSwKICAgICAgICAgbUNvbnN1bWVyKGNvbnN1bWVyKSwKICAgICAgICAgbVRyYW5zZm9ybSgwKSwKICAgICAgICAgbVRyYWNlRmlyc3RCdWZmZXIodHJ1ZSkgewpAQCAtNjksMTAgKzcxLDEyIEBACiAKIENhbWVyYTNPdXRwdXRTdHJlYW06OkNhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLCBjYW1lcmEzX3N0cmVhbV90eXBlX3QgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pIDoKICAgICAgICAgQ2FtZXJhM0lPU3RyZWFtQmFzZShpZCwgdHlwZSwgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1heFNpemUqLzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24pLAogICAgICAgICBtVHJhbnNmb3JtKDApIHsKIAogICAgIC8vIFN1YmNsYXNzZXMgZXhwZWN0ZWQgdG8gaW5pdGlhbGl6ZSBtQ29uc3VtZXIgdGhlbXNlbHZlcwpAQCAtMTUzLDMzICsxNTcsOSBAQAogICAgIEFMT0dfQVNTRVJUKG91dHB1dCwgIkV4cGVjdGVkIG91dHB1dCB0byBiZSB0cnVlIik7CiAKICAgICBzdGF0dXNfdCByZXM7Ci0gICAgc3A8RmVuY2U+IHJlbGVhc2VGZW5jZTsKIAotICAgIC8qKgotICAgICAqIEZlbmNlIG1hbmFnZW1lbnQgLSBjYWxjdWxhdGUgUmVsZWFzZSBGZW5jZQotICAgICAqLwotICAgIGlmIChidWZmZXIuc3RhdHVzID09IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUikgewotICAgICAgICBpZiAoYnVmZmVyLnJlbGVhc2VfZmVuY2UgIT0gLTEpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBIQUwgc2hvdWxkIG5vdCBzZXQgcmVsZWFzZV9mZW5jZSglZCkgd2hlbiAiCi0gICAgICAgICAgICAgICAgICAidGhlcmUgaXMgYW4gZXJyb3IiLCBfX0ZVTkNUSU9OX18sIG1JZCwgYnVmZmVyLnJlbGVhc2VfZmVuY2UpOwotICAgICAgICAgICAgY2xvc2UoYnVmZmVyLnJlbGVhc2VfZmVuY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYXNzaWduIHJlbGVhc2UgZmVuY2UgYXMgdGhlIGFjcXVpcmUgZmVuY2UgaW4gY2FzZSBvZiBlcnJvcgotICAgICAgICAgKi8KLSAgICAgICAgcmVsZWFzZUZlbmNlID0gbmV3IEZlbmNlKGJ1ZmZlci5hY3F1aXJlX2ZlbmNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX3RpbWVzdGFtcChtQ29uc3VtZXIuZ2V0KCksIHRpbWVzdGFtcCk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBFcnJvciBzZXR0aW5nIHRpbWVzdGFtcDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVsZWFzZUZlbmNlID0gbmV3IEZlbmNlKGJ1ZmZlci5yZWxlYXNlX2ZlbmNlKTsKLSAgICB9Ci0KKyAgICAvLyBGZW5jZSBtYW5hZ2VtZW50IC0gYWx3YXlzIGhvbm9yIHJlbGVhc2UgZmVuY2UgZnJvbSBIQUwKKyAgICBzcDxGZW5jZT4gcmVsZWFzZUZlbmNlID0gbmV3IEZlbmNlKGJ1ZmZlci5yZWxlYXNlX2ZlbmNlKTsKICAgICBpbnQgYW53UmVsZWFzZUZlbmNlID0gcmVsZWFzZUZlbmNlLT5kdXAoKTsKIAogICAgIC8qKgpAQCAtMjEzLDYgKzE5MywxMyBAQAogICAgICAgICAgICAgbVRyYWNlRmlyc3RCdWZmZXIgPSBmYWxzZTsKICAgICAgICAgfQogCisgICAgICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdGltZXN0YW1wKG1Db25zdW1lci5nZXQoKSwgdGltZXN0YW1wKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEVycm9yIHNldHRpbmcgdGltZXN0YW1wOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKwogICAgICAgICByZXMgPSBjdXJyZW50Q29uc3VtZXItPnF1ZXVlQnVmZmVyKGN1cnJlbnRDb25zdW1lci5nZXQoKSwKICAgICAgICAgICAgICAgICBjb250YWluZXJfb2YoYnVmZmVyLmJ1ZmZlciwgQU5hdGl2ZVdpbmRvd0J1ZmZlciwgaGFuZGxlKSwKICAgICAgICAgICAgICAgICBhbndSZWxlYXNlRmVuY2UpOwpAQCAtMjIyLDYgKzIwOSwxMyBAQAogICAgICAgICB9CiAgICAgfQogICAgIG1Mb2NrLmxvY2soKTsKKworICAgIC8vIE9uY2UgYSB2YWxpZCBidWZmZXIgaGFzIGJlZW4gcmV0dXJuZWQgdG8gdGhlIHF1ZXVlLCBjYW4gbm8gbG9uZ2VyCisgICAgLy8gZGVxdWV1ZSBhbGwgYnVmZmVycyBmb3IgcHJlYWxsb2NhdGlvbi4KKyAgICBpZiAoYnVmZmVyLnN0YXR1cyAhPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1IpIHsKKyAgICAgICAgbVN0cmVhbVVucHJlcGFyYWJsZSA9IHRydWU7CisgICAgfQorCiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBjbG9zZShhbndSZWxlYXNlRmVuY2UpOwogICAgIH0KQEAgLTIzNSw2ICsyMjksNyBAQAogICAgICh2b2lkKSBhcmdzOwogICAgIFN0cmluZzggbGluZXM7CiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgU3RyZWFtWyVkXTogT3V0cHV0XG4iLCBtSWQpOworICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgQ29uc3VtZXIgbmFtZTogJXNcbiIsIG1Db25zdW1lck5hbWUuc3RyaW5nKCkpOwogICAgIHdyaXRlKGZkLCBsaW5lcy5zdHJpbmcoKSwgbGluZXMuc2l6ZSgpKTsKIAogICAgIENhbWVyYTNJT1N0cmVhbUJhc2U6OmR1bXAoZmQsIGFyZ3MpOwpAQCAtMjg0LDYgKzI3OSw4IEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCisgICAgbUNvbnN1bWVyTmFtZSA9IG1Db25zdW1lci0+Z2V0Q29uc3VtZXJOYW1lKCk7CisKICAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF91c2FnZShtQ29uc3VtZXIuZ2V0KCksIGNhbWVyYTNfc3RyZWFtOjp1c2FnZSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgdXNhZ2UgJTA4eCBmb3Igc3RyZWFtICVkIiwKQEAgLTMyMyw4ICszMjAsMTcgQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKKyAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RhdGFfc3BhY2UobUNvbnN1bWVyLmdldCgpLAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW06OmRhdGFfc3BhY2UpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHN0cmVhbSBkYXRhc3BhY2UgJSN4IGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhM19zdHJlYW06OmRhdGFfc3BhY2UsIG1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCiAgICAgaW50IG1heENvbnN1bWVyQnVmZmVyczsKLSAgICByZXMgPSBtQ29uc3VtZXItPnF1ZXJ5KG1Db25zdW1lci5nZXQoKSwKKyAgICByZXMgPSBzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93Kj4obUNvbnN1bWVyLmdldCgpKS0+cXVlcnkoCisgICAgICAgICAgICBtQ29uc3VtZXIuZ2V0KCksCiAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsICZtYXhDb25zdW1lckJ1ZmZlcnMpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gcXVlcnkgY29uc3VtZXIgdW5kZXF1ZXVlZCIKQEAgLTM5NSwxNCArNDAxLDI4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgeworc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpIGNvbnN0IHsKIAogICAgIHN0YXR1c190IHJlczsKICAgICBpbnQzMl90IHUgPSAwOwotICAgIHJlcyA9IG1Db25zdW1lci0+cXVlcnkobUNvbnN1bWVyLmdldCgpLAorICAgIHJlcyA9IHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cqPihtQ29uc3VtZXIuZ2V0KCkpLT5xdWVyeShtQ29uc3VtZXIuZ2V0KCksCiAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0NPTlNVTUVSX1VTQUdFX0JJVFMsICZ1KTsKLSAgICAqdXNhZ2UgPSB1OwogCisgICAgLy8gSWYgYW4gb3BhcXVlIG91dHB1dCBzdHJlYW0ncyBlbmRwb2ludCBpcyBJbWFnZVJlYWRlciwgYWRkCisgICAgLy8gR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfWlNMIHRvIHRoZSB1c2FnZSBzbyBIQUwga25vd3MgaXQgd2lsbCBiZSB1c2VkCisgICAgLy8gZm9yIHRoZSBaU0wgdXNlIGNhc2UuCisgICAgLy8gQXNzdW1lIGl0J3MgZm9yIEltYWdlUmVhZGVyIGlmIHRoZSBjb25zdW1lciB1c2FnZSBkb2Vzbid0IGhhdmUgYW55IG9mIHRoZXNlIGJpdHMgc2V0OgorICAgIC8vICAgICAxLiBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUKKyAgICAvLyAgICAgMi4gR1JBTExPQ19VU0FHRV9IV19SRU5ERVIKKyAgICAvLyAgICAgMy4gR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUgorICAgIC8vICAgICA0LiBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIKKyAgICBpZiAoY2FtZXJhM19zdHJlYW06OmZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQgJiYKKyAgICAgICAgICAgICh1ICYgKEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSB8IEdSQUxMT0NfVVNBR0VfSFdfUkVOREVSIHwgR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUiB8CisgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIpKSA9PSAwKSB7CisgICAgICAgIHUgfD0gR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfWlNMOworICAgIH0KKworICAgICp1c2FnZSA9IHU7CiAgICAgcmV0dXJuIHJlczsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaAppbmRleCBiZTI3OGM1Li45NDFkNjkzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaApAQCAtMzgsMTUgKzM4LDE3IEBACiAgICAgLyoqCiAgICAgICogU2V0IHVwIGEgc3RyZWFtIGZvciBmb3JtYXRzIHRoYXQgaGF2ZSAyIGRpbWVuc2lvbnMsIHN1Y2ggYXMgUkFXIGFuZCBZVVYuCiAgICAgICovCi0gICAgQ2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsIHNwPEFOYXRpdmVXaW5kb3c+IGNvbnN1bWVyLAotICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCk7CisgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsIHNwPFN1cmZhY2U+IGNvbnN1bWVyLAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbik7CiAKICAgICAvKioKICAgICAgKiBTZXQgdXAgYSBzdHJlYW0gZm9yIGZvcm1hdHMgdGhhdCBoYXZlIGEgdmFyaWFibGUgYnVmZmVyIHNpemUgZm9yIHRoZSBzYW1lCiAgICAgICogZGltZW5zaW9ucywgc3VjaCBhcyBjb21wcmVzc2VkIEpQRUcuCiAgICAgICovCi0gICAgQ2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsIHNwPEFOYXRpdmVXaW5kb3c+IGNvbnN1bWVyLAotICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgc2l6ZV90IG1heFNpemUsIGludCBmb3JtYXQpOworICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLCBzcDxTdXJmYWNlPiBjb25zdW1lciwKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHNpemVfdCBtYXhTaXplLCBpbnQgZm9ybWF0LAorICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKTsKIAogICAgIHZpcnR1YWwgfkNhbWVyYTNPdXRwdXRTdHJlYW0oKTsKIApAQCAtNjQsNyArNjYsOCBAQAogCiAgIHByb3RlY3RlZDoKICAgICBDYW1lcmEzT3V0cHV0U3RyZWFtKGludCBpZCwgY2FtZXJhM19zdHJlYW1fdHlwZV90IHR5cGUsCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0KTsKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pOwogCiAgICAgLyoqCiAgICAgICogTm90ZSB0aGF0IHdlIHJlbGVhc2UgdGhlIGxvY2sgYnJpZWZseSBpbiB0aGlzIGZ1bmN0aW9uCkBAIC03OCw3ICs4MSw3IEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGRpc2Nvbm5lY3RMb2NrZWQoKTsKIAotICAgIHNwPEFOYXRpdmVXaW5kb3c+IG1Db25zdW1lcjsKKyAgICBzcDxTdXJmYWNlPiBtQ29uc3VtZXI7CiAgIHByaXZhdGU6CiAgICAgaW50ICAgICAgICAgICAgICAgbVRyYW5zZm9ybTsKIApAQCAtODYsNiArODksOSBAQAogCiAgICAgYm9vbCBtVHJhY2VGaXJzdEJ1ZmZlcjsKIAorICAgIC8vIE5hbWUgb2YgU3VyZmFjZSBjb25zdW1lcgorICAgIFN0cmluZzggICAgICAgICAgIG1Db25zdW1lck5hbWU7CisKICAgICAvKioKICAgICAgKiBJbnRlcm5hbCBDYW1lcmEzU3RyZWFtIGludGVyZmFjZQogICAgICAqLwpAQCAtOTYsNyArMTAyLDcgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RW5kcG9pbnRVc2FnZSh1aW50MzJfdCAqdXNhZ2UpIGNvbnN0OwogCiB9OyAvLyBjbGFzcyBDYW1lcmEzT3V0cHV0U3RyZWFtCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCmluZGV4IDNjMGU5MDguLjI1MjdmZDYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcApAQCAtNDYsNyArNDYsOCBAQAogCiBDYW1lcmEzU3RyZWFtOjpDYW1lcmEzU3RyZWFtKGludCBpZCwKICAgICAgICAgY2FtZXJhM19zdHJlYW1fdHlwZSB0eXBlLAotICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBzaXplX3QgbWF4U2l6ZSwgaW50IGZvcm1hdCkgOgorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBzaXplX3QgbWF4U2l6ZSwgaW50IGZvcm1hdCwKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKSA6CiAgICAgY2FtZXJhM19zdHJlYW0oKSwKICAgICBtSWQoaWQpLAogICAgIG1OYW1lKFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhM1N0cmVhbVslZF0iLCBpZCkpLApAQCAtNTgsNiArNTksOCBAQAogICAgIGNhbWVyYTNfc3RyZWFtOjp3aWR0aCA9IHdpZHRoOwogICAgIGNhbWVyYTNfc3RyZWFtOjpoZWlnaHQgPSBoZWlnaHQ7CiAgICAgY2FtZXJhM19zdHJlYW06OmZvcm1hdCA9IGZvcm1hdDsKKyAgICBjYW1lcmEzX3N0cmVhbTo6ZGF0YV9zcGFjZSA9IGRhdGFTcGFjZTsKKyAgICBjYW1lcmEzX3N0cmVhbTo6cm90YXRpb24gPSByb3RhdGlvbjsKICAgICBjYW1lcmEzX3N0cmVhbTo6dXNhZ2UgPSAwOwogICAgIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyA9IDA7CiAgICAgY2FtZXJhM19zdHJlYW06OnByaXYgPSBOVUxMOwpAQCAtODQsNiArODcsMTAgQEAKICAgICByZXR1cm4gY2FtZXJhM19zdHJlYW06OmZvcm1hdDsKIH0KIAorYW5kcm9pZF9kYXRhc3BhY2UgQ2FtZXJhM1N0cmVhbTo6Z2V0RGF0YVNwYWNlKCkgY29uc3QgeworICAgIHJldHVybiBjYW1lcmEzX3N0cmVhbTo6ZGF0YV9zcGFjZTsKK30KKwogY2FtZXJhM19zdHJlYW0qIENhbWVyYTNTdHJlYW06OnN0YXJ0Q29uZmlndXJhdGlvbigpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKQEAgLTEwMiwxMSArMTA5LDcgQEAKICAgICAgICAgICAgIC8vIG9sZFVzYWdlL29sZE1heEJ1ZmZlcnMKICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICBjYXNlIFNUQVRFX0NPTkZJR1VSRUQ6Ci0gICAgICAgICAgICBpZiAoc3RyZWFtX3R5cGUgPT0gQ0FNRVJBM19TVFJFQU1fSU5QVVQpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBjb25maWd1cmUgYW4gaW5wdXQgc3RyZWFtIHR3aWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGhhc091dHN0YW5kaW5nQnVmZmVyc0xvY2tlZCgpKSB7CisgICAgICAgICAgICBpZiAoaGFzT3V0c3RhbmRpbmdCdWZmZXJzTG9ja2VkKCkpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBjb25maWd1cmUgc3RyZWFtOyBoYXMgb3V0c3RhbmRpbmcgYnVmZmVycyIsCiAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMTg3LDYgKzE5MCwxMSBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCisgICAgLy8gUmVzZXQgcHJlcGFyZWQgc3RhdGUsIHNpbmNlIGJ1ZmZlciBjb25maWcgaGFzIGNoYW5nZWQsIGFuZCBleGlzdGluZworICAgIC8vIGFsbG9jYXRpb25zIGFyZSBubyBsb25nZXIgdmFsaWQKKyAgICBtUHJlcGFyZWQgPSBmYWxzZTsKKyAgICBtU3RyZWFtVW5wcmVwYXJhYmxlID0gZmFsc2U7CisKICAgICBzdGF0dXNfdCByZXM7CiAgICAgcmVzID0gY29uZmlndXJlUXVldWVMb2NrZWQoKTsKICAgICBpZiAocmVzICE9IE9LKSB7CkBAIC0yMzcsNiArMjQ1LDE4MCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorYm9vbCBDYW1lcmEzU3RyZWFtOjppc1VucHJlcGFyYWJsZSgpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHJldHVybiBtU3RyZWFtVW5wcmVwYXJhYmxlOworfQorCitzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpzdGFydFByZXBhcmUoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9ubHkgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBjb25maWd1cmVkIGFscmVhZHkuCisgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9DT05GSUdVUkVEKSB7CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBwcmVwYXJlIHN0cmVhbSBpZiBzdHJlYW0gaXMgbm90IGluIENPTkZJR1VSRUQgIgorICAgICAgICAgICAgICAgICJzdGF0ZSAlZCIsIF9fRlVOQ1RJT05fXywgbUlkLCBtU3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgLy8gVGhpcyBmdW5jdGlvbiBjYW4ndCBiZSBjYWxsZWQgaWYgdGhlIHN0cmVhbSBoYXMgYWxyZWFkeSByZWNlaXZlZCBmaWxsZWQKKyAgICAvLyBidWZmZXJzCisgICAgaWYgKG1TdHJlYW1VbnByZXBhcmFibGUpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IHByZXBhcmUgc3RyZWFtIHRoYXQncyBhbHJlYWR5IGluIHVzZSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpID4gMCkgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgcHJlcGFyZSBzdHJlYW0gdGhhdCBoYXMgb3V0c3RhbmRpbmcgYnVmZmVycyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaWYgKG1QcmVwYXJlZCkgcmV0dXJuIE9LOworCisgICAgc2l6ZV90IGJ1ZmZlckNvdW50ID0gZ2V0QnVmZmVyQ291bnRMb2NrZWQoKTsKKworICAgIG1QcmVwYXJlZEJ1ZmZlcnMuaW5zZXJ0QXQoY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QoKSwgLyppbmRleCovMCwgYnVmZmVyQ291bnQpOworICAgIG1QcmVwYXJlZEJ1ZmZlcklkeCA9IDA7CisKKyAgICBtU3RhdGUgPSBTVEFURV9QUkVQQVJJTkc7CisKKyAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworfQorCitib29sIENhbWVyYTNTdHJlYW06OmlzUHJlcGFyaW5nKCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICByZXR1cm4gbVN0YXRlID09IFNUQVRFX1BSRVBBUklORzsKK30KKworc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6cHJlcGFyZU5leHRCdWZmZXIoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9ubHkgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBwcmVwYXJpbmcKKyAgICBpZiAobVN0YXRlICE9IFNUQVRFX1BSRVBBUklORykgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgcHJlcGFyZSBidWZmZXIgaWYgc3RyZWFtIGlzIG5vdCBpbiBQUkVQQVJJTkcgIgorICAgICAgICAgICAgICAgICJzdGF0ZSAlZCIsIF9fRlVOQ1RJT05fXywgbUlkLCBtU3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgLy8gR2V0IG5leHQgYnVmZmVyIC0gdGhpcyBtYXkgYWxsb2NhdGUsIGFuZCB0YWtlIGEgd2hpbGUgZm9yIGxhcmdlIGJ1ZmZlcnMKKyAgICByZXMgPSBnZXRCdWZmZXJMb2NrZWQoICZtUHJlcGFyZWRCdWZmZXJzLmVkaXRJdGVtQXQobVByZXBhcmVkQnVmZmVySWR4KSApOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IFVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIgJWQgZHVyaW5nIHByZXBhcmF0aW9uIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbVByZXBhcmVkQnVmZmVySWR4KTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgbVByZXBhcmVkQnVmZmVySWR4Kys7CisKKyAgICAvLyBDaGVjayBpZiB3ZSBzdGlsbCBoYXZlIGJ1ZmZlcnMgbGVmdCB0byBhbGxvY2F0ZQorICAgIGlmIChtUHJlcGFyZWRCdWZmZXJJZHggPCBtUHJlcGFyZWRCdWZmZXJzLnNpemUoKSkgeworICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgIH0KKworICAgIC8vIERvbmUgd2l0aCBwcmVwYXJlIC0gbWFyayBzdHJlYW0gYXMgc3VjaCwgYW5kIHJldHVybiBhbGwgYnVmZmVycworICAgIC8vIHZpYSBjYW5jZWxQcmVwYXJlCisgICAgbVByZXBhcmVkID0gdHJ1ZTsKKworICAgIHJldHVybiBjYW5jZWxQcmVwYXJlTG9ja2VkKCk7Cit9CisKK3N0YXR1c190IENhbWVyYTNTdHJlYW06OmNhbmNlbFByZXBhcmUoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIHJldHVybiBjYW5jZWxQcmVwYXJlTG9ja2VkKCk7Cit9CisKK3N0YXR1c190IENhbWVyYTNTdHJlYW06OmNhbmNlbFByZXBhcmVMb2NrZWQoKSB7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvbmx5IGNhbGxlZCB3aGVuIHRoZSBzdHJlYW0gaXMgbWlkLXByZXBhcmluZy4KKyAgICBpZiAobVN0YXRlICE9IFNUQVRFX1BSRVBBUklORykgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgY2FuY2VsIHByZXBhcmUgc3RyZWFtIGlmIHN0cmVhbSBpcyBub3QgaW4gIgorICAgICAgICAgICAgICAgICJQUkVQQVJJTkcgc3RhdGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1JZCwgbVN0YXRlKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIC8vIFJldHVybiBhbGwgdmFsaWQgYnVmZmVycyB0byBzdHJlYW0sIGluIEVSUk9SIHN0YXRlIHRvIGluZGljYXRlCisgICAgLy8gdGhleSB3ZXJlbid0IGZpbGxlZC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QcmVwYXJlZEJ1ZmZlcklkeDsgaSsrKSB7CisgICAgICAgIG1QcmVwYXJlZEJ1ZmZlcnMuZWRpdEl0ZW1BdChpKS5yZWxlYXNlX2ZlbmNlID0gLTE7CisgICAgICAgIG1QcmVwYXJlZEJ1ZmZlcnMuZWRpdEl0ZW1BdChpKS5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgIHJldHVybkJ1ZmZlckxvY2tlZChtUHJlcGFyZWRCdWZmZXJzW2ldLCAwKTsKKyAgICB9CisgICAgbVByZXBhcmVkQnVmZmVycy5jbGVhcigpOworICAgIG1QcmVwYXJlZEJ1ZmZlcklkeCA9IDA7CisKKyAgICBtU3RhdGUgPSBTVEFURV9DT05GSUdVUkVEOworCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6dGVhckRvd24oKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9ubHkgY2FsbGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBjb25maWd1cmVkLgorICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQ09ORklHVVJFRCkgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgdGVhciBkb3duIHN0cmVhbSBpZiBzdHJlYW0gaXMgbm90IGluICIKKyAgICAgICAgICAgICAgICAiQ09ORklHVVJFRCBzdGF0ZSAlZCIsIF9fRlVOQ1RJT05fXywgbUlkLCBtU3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgLy8gSWYgYW55IGJ1ZmZlcnMgaGF2ZSBiZWVuIGhhbmRlZCB0byB0aGUgSEFMLCB0aGUgc3RyZWFtIGNhbm5vdCBiZSB0b3JuIGRvd24uCisgICAgaWYgKGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpID4gMCkgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgdGVhciBkb3duIGEgc3RyZWFtIHRoYXQgaGFzIG91dHN0YW5kaW5nIGJ1ZmZlcnMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIC8vIEZyZWUgYnVmZmVycyBieSBkaXNjb25uZWN0aW5nIGFuZCB0aGVuIHJlY29ubmVjdGluZyB0byB0aGUgYnVmZmVyIHF1ZXVlCisgICAgLy8gT25seSB1bnVzZWQgYnVmZmVycyB3aWxsIGJlIGRyb3BwZWQgaW1tZWRpYXRlbHk7IGJ1ZmZlcnMgdGhhdCBoYXZlIGJlZW4gZmlsbGVkCisgICAgLy8gYW5kIGFyZSB3YWl0aW5nIHRvIGJlIGFjcXVpcmVkIGJ5IHRoZSBjb25zdW1lciBhbmQgYnVmZmVycyB0aGF0IGFyZSBjdXJyZW50bHkKKyAgICAvLyBhY3F1aXJlZCB3aWxsIGJlIGZyZWVkIG9uY2UgdGhleSBhcmUgcmVsZWFzZWQgYnkgdGhlIGNvbnN1bWVyLgorCisgICAgcmVzID0gZGlzY29ubmVjdExvY2tlZCgpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgaWYgKHJlcyA9PSAtRU5PVENPTk4pIHsKKyAgICAgICAgICAgIC8vIHF1ZXVlIGhhcyBiZWVuIGRpc2Nvbm5lY3RlZCwgbm90aGluZyBsZWZ0IHRvIGRvLCBzbyBleGl0IHdpdGggc3VjY2VzcworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBVbmFibGUgdG8gZGlzY29ubmVjdCB0byB0ZWFyIGRvd24gYnVmZmVyczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIG1TdGF0ZSA9IFNUQVRFX0lOX0NPTkZJRzsKKworICAgIHJlcyA9IGNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtICVkIHF1ZXVlOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0VSUk9SOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIFJlc2V0IHByZXBhcmVkIHN0YXRlLCBzaW5jZSB3ZSd2ZSByZWNvbm5lY3RlZCB0byB0aGUgcXVldWUgYW5kIGNhbiBwcmVwYXJlIGFnYWluLgorICAgIG1QcmVwYXJlZCA9IGZhbHNlOworICAgIG1TdHJlYW1VbnByZXBhcmFibGUgPSBmYWxzZTsKKworICAgIG1TdGF0ZSA9IFNUQVRFX0NPTkZJR1VSRUQ7CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IENhbWVyYTNTdHJlYW06OmdldEJ1ZmZlcihjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwpAQCAtMzM5LDYgKzUyMSwxMyBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYTNTdHJlYW06OmdldElucHV0QnVmZmVyUHJvZHVjZXIoc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKnByb2R1Y2VyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICByZXR1cm4gZ2V0SW5wdXRCdWZmZXJQcm9kdWNlckxvY2tlZChwcm9kdWNlcik7Cit9CisKIHZvaWQgQ2FtZXJhM1N0cmVhbTo6ZmlyZUJ1ZmZlckxpc3RlbmVyc0xvY2tlZCgKICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyJiAvKmJ1ZmZlciovLCBib29sIGFjcXVpcmVkLCBib29sIG91dHB1dCkgewogICAgIExpc3Q8d3A8Q2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyPiA+OjppdGVyYXRvciBpdCwgZW5kOwpAQCAtNDEzLDE1ICs2MDIsMTMgQEAKICAgICAgICAgICAgIEFMT0dFKCIlczogcmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMgaXMgZGVwcmVjYXRlZCBpbiBIQUwzLjI7ICIKICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgc2V0IHRvIE5VTEwgaW4gY2FtZXJhM19kZXZpY2U6Om9wcyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRCgiJXM6IFNraXBwaW5nIE5VTEwgY2hlY2sgZm9yIGRlcHJlY2F0ZWQgcmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCIlczogcmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMgdXNpbmcgZGVwcmVjYXRlZCBjb2RlIHBhdGgiLCBfX0ZVTkNUSU9OX18pOwogICAgIH0KIAorICAgIEFMT0dWKCIlczogcmVnaXN0ZXJfc3RyZWFtX2J1ZmZlcnMgdXNpbmcgZGVwcmVjYXRlZCBjb2RlIHBhdGgiLCBfX0ZVTkNUSU9OX18pOworCiAgICAgc3RhdHVzX3QgcmVzOwogCiAgICAgc2l6ZV90IGJ1ZmZlckNvdW50ID0gZ2V0QnVmZmVyQ291bnRMb2NrZWQoKTsKQEAgLTQ3Nyw2ICs2NjQsOCBAQAogICAgICAgICByZXR1cm5CdWZmZXJMb2NrZWQoc3RyZWFtQnVmZmVyc1tpXSwgMCk7CiAgICAgfQogCisgICAgbVByZXBhcmVkID0gdHJ1ZTsKKwogICAgIHJldHVybiByZXM7CiB9CiAKQEAgLTQ5OCw2ICs2ODcsMTAgQEAKICAgICBBTE9HRSgiJXM6IFRoaXMgdHlwZSBvZiBzdHJlYW0gZG9lcyBub3Qgc3VwcG9ydCBpbnB1dCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogfQorc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6Z2V0SW5wdXRCdWZmZXJQcm9kdWNlckxvY2tlZChzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqcHJvZHVjZXIpIHsKKyAgICBBTE9HRSgiJXM6IFRoaXMgdHlwZSBvZiBzdHJlYW0gZG9lcyBub3Qgc3VwcG9ydCBpbnB1dCIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQogCiB2b2lkIENhbWVyYTNTdHJlYW06OmFkZEJ1ZmZlckxpc3RlbmVyKAogICAgICAgICB3cDxDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI+IGxpc3RlbmVyKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCmluZGV4IGQwZTEzMzcuLmJhYjIxNzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCkBAIC01Nyw4ICs1NywxNSBAQAogICogICAgcmUtcmVnaXN0ZXJpbmcgYnVmZmVycyB3aXRoIEhBTC4KICAqCiAgKiAgU1RBVEVfQ09ORklHVVJFRDogU3RyZWFtIGlzIGNvbmZpZ3VyZWQsIGFuZCBoYXMgcmVnaXN0ZXJlZCBidWZmZXJzIHdpdGggdGhlCi0gKiAgICBIQUwuIFRoZSBzdHJlYW0ncyBnZXRCdWZmZXIvcmV0dXJuQnVmZmVyIHdvcmsuIFRoZSBwcml2IHBvaW50ZXIgbWF5IHN0aWxsIGJlCi0gKiAgICBtb2RpZmllZC4KKyAqICAgIEhBTCAoaWYgbmVjZXNzYXJ5KS4gVGhlIHN0cmVhbSdzIGdldEJ1ZmZlci9yZXR1cm5CdWZmZXIgd29yay4gVGhlIHByaXYKKyAqICAgIHBvaW50ZXIgbWF5IHN0aWxsIGJlIG1vZGlmaWVkLgorICoKKyAqICBTVEFURV9QUkVQQVJJTkc6IFRoZSBzdHJlYW0ncyBidWZmZXJzIGFyZSBiZWluZyBwcmUtYWxsb2NhdGVkIGZvciB1c2UuICBPbgorICogICAgb2xkZXIgSEFMcywgdGhpcyBpcyBkb25lIGFzIHBhcnQgb2YgY29uZmlndXJhdGlvbiwgYnV0IGluIG5ld2VyIEhBTHMKKyAqICAgIGJ1ZmZlcnMgbWF5IGJlIGFsbG9jYXRlZCBhdCB0aW1lIG9mIGZpcnN0IHVzZS4gQnV0IHNvbWUgdXNlIGNhc2VzIHJlcXVpcmUKKyAqICAgIGJ1ZmZlciBhbGxvY2F0aW9uIHVwZnJvbnQsIHRvIG1pbm1pemUgZGlzcnVwdGlvbiBkdWUgdG8gbGVuZ3RoeSBhbGxvY2F0aW9uCisgKiAgICBkdXJhdGlvbi4gIEluIHRoaXMgc3RhdGUsIG9ubHkgcHJlcGFyZU5leHRCdWZmZXIoKSBhbmQgY2FuY2VsUHJlcGFyZSgpCisgKiAgICBtYXkgYmUgY2FsbGVkLgogICoKICAqIFRyYW5zaXRpb24gdGFibGU6CiAgKgpAQCAtODIsNiArODksMTIgQEAKICAqICAgIFNUQVRFX0NPTkZJR1VSRUQgICAgID0+IFNUQVRFX0NPTlNUUlVDVEVEOgogICogICAgICAgIFdoZW4gZGlzY29ubmVjdCgpIGlzIGNhbGxlZCBhZnRlciBtYWtpbmcgc3VyZSBzdHJlYW0gaXMgaWRsZSB3aXRoCiAgKiAgICAgICAgd2FpdFVudGlsSWRsZSgpLgorICogICAgU1RBVEVfQ09ORklHVVJFRCAgICAgPT4gU1RBVEVfUFJFUEFSSU5HOgorICogICAgICAgIFdoZW4gc3RhcnRQcmVwYXJlIGlzIGNhbGxlZCBiZWZvcmUgdGhlIHN0cmVhbSBoYXMgYSBidWZmZXIKKyAqICAgICAgICBxdWV1ZWQgYmFjayBpbnRvIGl0IGZvciB0aGUgZmlyc3QgdGltZS4KKyAqICAgIFNUQVRFX1BSRVBBUklORyAgICAgID0+IFNUQVRFX0NPTkZJR1VSRUQ6CisgKiAgICAgICAgV2hlbiBzdWZmaWNpZW50IHByZXBhcmVOZXh0QnVmZmVyIGNhbGxzIGhhdmUgYmVlbiBtYWRlIHRvIGFsbG9jYXRlCisgKiAgICAgICAgYWxsIHN0cmVhbSBidWZmZXJzLCBvciBjYW5jZWxQcmVwYXJlIGlzIGNhbGxlZC4KICAqCiAgKiBTdGF0dXMgVHJhY2tpbmc6CiAgKiAgICBFYWNoIHN0cmVhbSBpcyB0cmFja2VkIGJ5IFN0YXR1c1RyYWNrZXIgYXMgYSBzZXBhcmF0ZSBjb21wb25lbnQsCkBAIC0xMTksOSArMTMyLDEwIEBACiAgICAgLyoqCiAgICAgICogR2V0IHRoZSBzdHJlYW0ncyBkaW1lbnNpb25zIGFuZCBmb3JtYXQKICAgICAgKi8KLSAgICB1aW50MzJfdCAgICAgICAgIGdldFdpZHRoKCkgY29uc3Q7Ci0gICAgdWludDMyX3QgICAgICAgICBnZXRIZWlnaHQoKSBjb25zdDsKLSAgICBpbnQgICAgICAgICAgICAgIGdldEZvcm1hdCgpIGNvbnN0OworICAgIHVpbnQzMl90ICAgICAgICAgIGdldFdpZHRoKCkgY29uc3Q7CisgICAgdWludDMyX3QgICAgICAgICAgZ2V0SGVpZ2h0KCkgY29uc3Q7CisgICAgaW50ICAgICAgICAgICAgICAgZ2V0Rm9ybWF0KCkgY29uc3Q7CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgZ2V0RGF0YVNwYWNlKCkgY29uc3Q7CiAKICAgICAvKioKICAgICAgKiBTdGFydCB0aGUgc3RyZWFtIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcy4gUmV0dXJucyBhIGhhbmRsZSB0byB0aGUgc3RyZWFtJ3MKQEAgLTE2Niw2ICsxODAsODcgQEAKICAgICBzdGF0dXNfdCAgICAgICAgIGNhbmNlbENvbmZpZ3VyYXRpb24oKTsKIAogICAgIC8qKgorICAgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBzdHJlYW0gaGFzIGFscmVhZHkgYmVjb21lIGluLXVzZSAoaGFzIHJlY2VpdmVkCisgICAgICogYSB2YWxpZCBmaWxsZWQgYnVmZmVyKSwgd2hpY2ggZGV0ZXJtaW5lcyBpZiBhIHN0cmVhbSBjYW4gc3RpbGwgaGF2ZQorICAgICAqIHByZXBhcmVOZXh0QnVmZmVyIGNhbGxlZCBvbiBpdC4KKyAgICAgKi8KKyAgICBib29sICAgICAgICAgICAgIGlzVW5wcmVwYXJhYmxlKCk7CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBzdHJlYW0gcHJlcGFyYXRpb24uIE1heSBvbmx5IGJlIGNhbGxlZCBpbiB0aGUgQ09ORklHVVJFRCBzdGF0ZSwKKyAgICAgKiB3aGVuIG5vIHZhbGlkIGJ1ZmZlcnMgaGF2ZSB5ZXQgYmVlbiByZXR1cm5lZCB0byB0aGlzIHN0cmVhbS4KKyAgICAgKgorICAgICAqIElmIG5vIHByZXBhcnRpb24gaXMgbmVjZXNzYXJ5LCByZXR1cm5zIE9LIGFuZCBkb2VzIG5vdCB0cmFuc2l0aW9uIHRvCisgICAgICogUFJFUEFSSU5HIHN0YXRlLiBPdGhlcndpc2UsIHJldHVybnMgTk9UX0VOT1VHSF9EQVRBIGFuZCB0cmFuc2l0aW9ucworICAgICAqIHRvIFBSRVBBUklORy4KKyAgICAgKgorICAgICAqIFRoaXMgY2FsbCBwZXJmb3JtcyBubyBhbGxvY2F0aW9uLCBzbyBpcyBxdWljayB0byBjYWxsLgorICAgICAqCisgICAgICogUmV0dXJuczoKKyAgICAgKiAgICBPSyBpZiBubyBtb3JlIGJ1ZmZlcnMgbmVlZCB0byBiZSBwcmVhbGxvY2F0ZWQKKyAgICAgKiAgICBOT1RfRU5PVUdIX0RBVEEgaWYgY2FsbHMgdG8gcHJlcGFyZU5leHRCdWZmZXIgYXJlIG5lZWRlZCB0byBmaW5pc2gKKyAgICAgKiAgICAgICAgYnVmZmVyIHByZS1hbGxvY2F0aW9uLCBhbmQgdHJhbnNpdGlvbnMgdG8gdGhlIFBSRVBBUklORyBzdGF0ZS4KKyAgICAgKiAgICBOT19JTklUIGluIGNhc2Ugb2YgYSBzZXJpb3VzIGVycm9yIGZyb20gdGhlIEhBTCBkZXZpY2UKKyAgICAgKiAgICBJTlZBTElEX09QRVJBVElPTiBpZiBjYWxsZWQgd2hlbiBub3QgaW4gQ09ORklHVVJFRCBzdGF0ZSwgb3IgYQorICAgICAqICAgICAgICB2YWxpZCBidWZmZXIgaGFzIGFscmVhZHkgYmVlbiByZXR1cm5lZCB0byB0aGlzIHN0cmVhbS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCAgICAgICAgIHN0YXJ0UHJlcGFyZSgpOworCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIHN0cmVhbSBpcyBtaWQtcHJlcGFyaW5nLgorICAgICAqLworICAgIGJvb2wgICAgICAgICAgICAgaXNQcmVwYXJpbmcoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENvbnRpbnVlIHN0cmVhbSBidWZmZXIgcHJlcGFyYXRpb24gYnkgYWxsb2NhdGluZyB0aGUgbmV4dAorICAgICAqIGJ1ZmZlciBmb3IgdGhpcyBzdHJlYW0uICBNYXkgb25seSBiZSBjYWxsZWQgaW4gdGhlIFBSRVBBUkVEIHN0YXRlLgorICAgICAqCisgICAgICogUmV0dXJucyBPSyBhbmQgdHJhbnNpdGlvbnMgdG8gdGhlIENPTkZJR1VSRUQgc3RhdGUgaWYgYWxsIGJ1ZmZlcnMKKyAgICAgKiBhcmUgYWxsb2NhdGVkIGFmdGVyIHRoZSBjYWxsIGNvbmNsdWRlcy4gT3RoZXJ3aXNlIHJldHVybnMgTk9UX0VOT1VHSF9EQVRBLgorICAgICAqCisgICAgICogVGhpcyBjYWxsIGFsbG9jYXRlcyBvbmUgYnVmZmVyLCB3aGljaCBtYXkgdGFrZSBzZXZlcmFsIG1pbGxpc2Vjb25kcyBmb3IKKyAgICAgKiBsYXJnZSBidWZmZXJzLgorICAgICAqCisgICAgICogUmV0dXJuczoKKyAgICAgKiAgICBPSyBpZiBubyBtb3JlIGJ1ZmZlcnMgbmVlZCB0byBiZSBwcmVhbGxvY2F0ZWQsIGFuZCB0cmFuc2l0aW9ucworICAgICAqICAgICAgICB0byB0aGUgQ09ORklHVVJFRCBzdGF0ZS4KKyAgICAgKiAgICBOT1RfRU5PVUdIX0RBVEEgaWYgbW9yZSBjYWxscyB0byBwcmVwYXJlTmV4dEJ1ZmZlciBhcmUgbmVlZGVkIHRvIGZpbmlzaAorICAgICAqICAgICAgICBidWZmZXIgcHJlLWFsbG9jYXRpb24uCisgICAgICogICAgTk9fSU5JVCBpbiBjYXNlIG9mIGEgc2VyaW91cyBlcnJvciBmcm9tIHRoZSBIQUwgZGV2aWNlCisgICAgICogICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgY2FsbGVkIHdoZW4gbm90IGluIENPTkZJR1VSRUQgc3RhdGUsIG9yIGEKKyAgICAgKiAgICAgICAgdmFsaWQgYnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gcmV0dXJuZWQgdG8gdGhpcyBzdHJlYW0uCisgICAgICovCisgICAgc3RhdHVzX3QgICAgICAgICBwcmVwYXJlTmV4dEJ1ZmZlcigpOworCisgICAgLyoqCisgICAgICogQ2FuY2VsIHN0cmVhbSBwcmVwYXJhdGlvbiBlYXJseS4gSW4gY2FzZSBhbGxvY2F0aW9uIG5lZWRzIHRvIGJlCisgICAgICogc3RvcHBlZCwgdGhpcyBtZXRob2QgdHJhbnNpdGlvbnMgdGhlIHN0cmVhbSBiYWNrIHRvIHRoZSBDT05GSUdVUkVEIHN0YXRlLgorICAgICAqIEJ1ZmZlcnMgdGhhdCBoYXZlIGJlZW4gYWxsb2NhdGVkIHdpdGggcHJlcGFyZU5leHRCdWZmZXIgcmVtYWluIHRoYXQgd2F5LAorICAgICAqIGJ1dCBhIGxhdGVyIHVzZSBvZiBwcmVwYXJlTmV4dEJ1ZmZlciB3aWxsIHJlcXVpcmUganVzdCBhcyBtYW55CisgICAgICogY2FsbHMgYXMgaWYgdGhlIGVhcmxpZXIgcHJlcGFyZSBhdHRlbXB0IGhhZCBub3QgZXhpc3RlZC4KKyAgICAgKgorICAgICAqIFJldHVybnM6CisgICAgICogICAgT0sgaWYgY2FuY2VsbGF0aW9uIHN1Y2NlZWRlZCwgYW5kIHRyYW5zaXRpb25zIHRvIHRoZSBDT05GSUdVUkVEIHN0YXRlCisgICAgICogICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgbm90IGluIHRoZSBQUkVQQVJJTkcgc3RhdGUKKyAgICAgKiAgICBOT19JTklUIGluIGNhc2Ugb2YgYSBzZXJpb3VzIGVycm9yIGZyb20gdGhlIEhBTCBkZXZpY2UKKyAgICAgKi8KKyAgICBzdGF0dXNfdCAgICAgICAgY2FuY2VsUHJlcGFyZSgpOworCisgICAgLyoqCisgICAgICogVGVhciBkb3duIG1lbW9yeSBmb3IgdGhpcyBzdHJlYW0uIFRoaXMgZnJlZXMgYWxsIHVudXNlZCBncmFsbG9jIGJ1ZmZlcnMKKyAgICAgKiBhbGxvY2F0ZWQgZm9yIHRoaXMgc3RyZWFtLCBidXQgbGVhdmVzIGl0IHJlYWR5IGZvciBvcGVyYXRpb24gYWZ0ZXJ3YXJkLgorICAgICAqCisgICAgICogTWF5IG9ubHkgYmUgY2FsbGVkIGluIHRoZSBDT05GSUdVUkVEIHN0YXRlLCBhbmQga2VlcHMgdGhlIHN0cmVhbSBpbgorICAgICAqIHRoZSBDT05GSUdVUkVEIHN0YXRlLgorICAgICAqCisgICAgICogUmV0dXJuczoKKyAgICAgKiAgICBPSyBpZiB0ZWFyZG93biBzdWNjZWVkZWQuCisgICAgICogICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgbm90IGluIHRoZSBDT05GSUdVUkVEIHN0YXRlCisgICAgICogICAgTk9fSU5JVCBpbiBjYXNlIG9mIGEgc2VyaW91cyBlcnJvciBmcm9tIHRoZSBIQUwgZGV2aWNlCisgICAgICovCisgICAgc3RhdHVzX3QgICAgICAgdGVhckRvd24oKTsKKworICAgIC8qKgogICAgICAqIEZpbGwgaW4gdGhlIGNhbWVyYTNfc3RyZWFtX2J1ZmZlciB3aXRoIHRoZSBuZXh0IHZhbGlkIGJ1ZmZlciBmb3IgdGhpcwogICAgICAqIHN0cmVhbSwgdG8gaGFuZCBvdmVyIHRvIHRoZSBIQUwuCiAgICAgICoKQEAgLTIwNCw2ICsyOTksMTAgQEAKICAgICAgKi8KICAgICBzdGF0dXNfdCAgICAgICAgIHJldHVybklucHV0QnVmZmVyKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyKTsKIAorICAgIC8vIGdldCB0aGUgYnVmZmVyIHByb2R1Y2VyIG9mIHRoZSBpbnB1dCBidWZmZXIgcXVldWUuCisgICAgLy8gb25seSBhcHBseSB0byBpbnB1dCBzdHJlYW1zLgorICAgIHN0YXR1c190ICAgICAgICAgZ2V0SW5wdXRCdWZmZXJQcm9kdWNlcihzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqcHJvZHVjZXIpOworCiAgICAgLyoqCiAgICAgICogV2hldGhlciBhbnkgb2YgdGhlIHN0cmVhbSdzIGJ1ZmZlcnMgYXJlIGN1cnJlbnRseSBpbiB1c2UgYnkgdGhlIEhBTCwKICAgICAgKiBpbmNsdWRpbmcgYnVmZmVycyB0aGF0IGhhdmUgYmVlbiByZXR1cm5lZCBidXQgbm90IHlldCBoYWQgdGhlaXIKQEAgLTI1OCwxMyArMzU3LDE1IEBACiAgICAgICAgIFNUQVRFX0NPTlNUUlVDVEVELAogICAgICAgICBTVEFURV9JTl9DT05GSUcsCiAgICAgICAgIFNUQVRFX0lOX1JFQ09ORklHLAotICAgICAgICBTVEFURV9DT05GSUdVUkVECisgICAgICAgIFNUQVRFX0NPTkZJR1VSRUQsCisgICAgICAgIFNUQVRFX1BSRVBBUklORwogICAgIH0gbVN0YXRlOwogCiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKIAogICAgIENhbWVyYTNTdHJlYW0oaW50IGlkLCBjYW1lcmEzX3N0cmVhbV90eXBlIHR5cGUsCi0gICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBzaXplX3QgbWF4U2l6ZSwgaW50IGZvcm1hdCk7CisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBzaXplX3QgbWF4U2l6ZSwgaW50IGZvcm1hdCwKKyAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbik7CiAKICAgICAvKioKICAgICAgKiBJbnRlcmZhY2UgdG8gYmUgaW1wbGVtZW50ZWQgYnkgZGVyaXZlZCBjbGFzc2VzCkBAIC0yODMsNiArMzg0LDkgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybklucHV0QnVmZmVyTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIpOwogICAgIHZpcnR1YWwgYm9vbCAgICAgaGFzT3V0c3RhbmRpbmdCdWZmZXJzTG9ja2VkKCkgY29uc3QgPSAwOworICAgIC8vIEdldCB0aGUgYnVmZmVyIHByb2R1Y2VyIG9mIHRoZSBpbnB1dCBidWZmZXIgcXVldWUuIE9ubHkgYXBwbHkgdG8gaW5wdXQgc3RyZWFtcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyUHJvZHVjZXJMb2NrZWQoc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gKnByb2R1Y2VyKTsKKwogICAgIC8vIENhbiByZXR1cm4gLUVOT1RDT05OIHdoZW4gd2UgYXJlIGFscmVhZHkgZGlzY29ubmVjdGVkIChub3QgYW4gZXJyb3IpCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkaXNjb25uZWN0TG9ja2VkKCkgPSAwOwogCkBAIC0zMDMsMTMgKzQwNywxNyBAQAogCiAgICAgLy8gR2V0IHRoZSB1c2FnZSBmbGFncyBmb3IgdGhlIG90aGVyIGVuZHBvaW50LCBvciByZXR1cm4KICAgICAvLyBJTlZBTElEX09QRVJBVElPTiBpZiB0aGV5IGNhbm5vdCBiZSBvYnRhaW5lZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVuZHBvaW50VXNhZ2UodWludDMyX3QgKnVzYWdlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFbmRwb2ludFVzYWdlKHVpbnQzMl90ICp1c2FnZSkgY29uc3QgPSAwOwogCiAgICAgLy8gVHJhY2tpbmcgZm9yIGlkbGUgc3RhdGUKICAgICB3cDxTdGF0dXNUcmFja2VyPiBtU3RhdHVzVHJhY2tlcjsKICAgICAvLyBTdGF0dXMgdHJhY2tlciBjb21wb25lbnQgSUQKICAgICBpbnQgbVN0YXR1c0lkOwogCisgICAgLy8gVHJhY2tpbmcgZm9yIHN0cmVhbSBwcmVwYXJlIC0gd2hldGhlciB0aGlzIHN0cmVhbSBjYW4gc3RpbGwgaGF2ZQorICAgIC8vIHByZXBhcmVOZXh0QnVmZmVyIGNhbGxlZCBvbiBpdC4KKyAgICBib29sIG1TdHJlYW1VbnByZXBhcmFibGU7CisKICAgcHJpdmF0ZToKICAgICB1aW50MzJfdCBvbGRVc2FnZTsKICAgICB1aW50MzJfdCBvbGRNYXhCdWZmZXJzOwpAQCAtMzI0LDYgKzQzMiwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWNxdWlyZWQsIGJvb2wgb3V0cHV0KTsKICAgICBMaXN0PHdwPENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lcj4gPiBtQnVmZmVyTGlzdGVuZXJMaXN0OwogCisgICAgc3RhdHVzX3QgICAgICAgIGNhbmNlbFByZXBhcmVMb2NrZWQoKTsKKworICAgIC8vIFRyYWNraW5nIGZvciBQUkVQQVJJTkcgc3RhdGUKKworICAgIC8vIFN0YXRlIG9mIGJ1ZmZlciBwcmVhbGxvY2F0aW9uLiBPbmx5IHRydWUgaWYgZWl0aGVyIHByZXBhcmVOZXh0QnVmZmVyCisgICAgLy8gaGFzIGJlZW4gY2FsbGVkIHN1ZmZpY2llbnQgbnVtYmVyIG9mIHRpbWVzLCBvciBzdHJlYW0gY29uZmlndXJhdGlvbgorICAgIC8vIGhhZCB0byByZWdpc3RlciBidWZmZXJzIHdpdGggdGhlIEhBTAorICAgIGJvb2wgbVByZXBhcmVkOworCisgICAgVmVjdG9yPGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90PiBtUHJlcGFyZWRCdWZmZXJzOworICAgIHNpemVfdCBtUHJlcGFyZWRCdWZmZXJJZHg7CisKIH07IC8vIGNsYXNzIENhbWVyYTNTdHJlYW0KIAogfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKaW5kZXggZGE5ODljZC4uYzA4NmVhZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgKQEAgLTQ1LDYgKzQ1LDcgQEAKICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFdpZHRoKCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0SGVpZ2h0KCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgaW50ICAgICAgZ2V0Rm9ybWF0KCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYW5kcm9pZF9kYXRhc3BhY2UgZ2V0RGF0YVNwYWNlKCkgY29uc3QgPSAwOwogCiAgICAgLyoqCiAgICAgICogU3RhcnQgdGhlIHN0cmVhbSBjb25maWd1cmF0aW9uIHByb2Nlc3MuIFJldHVybnMgYSBoYW5kbGUgdG8gdGhlIHN0cmVhbSdzCkBAIC04OSw2ICs5MCw4MiBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FuY2VsQ29uZmlndXJhdGlvbigpID0gMDsKIAogICAgIC8qKgorICAgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBzdHJlYW0gaGFzIGFscmVhZHkgYmVjb21lIGluLXVzZSAoaGFzIHJlY2VpdmVkCisgICAgICogYSB2YWxpZCBmaWxsZWQgYnVmZmVyKSwgd2hpY2ggZGV0ZXJtaW5lcyBpZiBhIHN0cmVhbSBjYW4gc3RpbGwgaGF2ZQorICAgICAqIHByZXBhcmVOZXh0QnVmZmVyIGNhbGxlZCBvbiBpdC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgICAgIGlzVW5wcmVwYXJhYmxlKCkgPSAwOworCisgICAgLyoqCisgICAgICogU3RhcnQgc3RyZWFtIHByZXBhcmF0aW9uLiBNYXkgb25seSBiZSBjYWxsZWQgaW4gdGhlIENPTkZJR1VSRUQgc3RhdGUsCisgICAgICogd2hlbiBubyB2YWxpZCBidWZmZXJzIGhhdmUgeWV0IGJlZW4gcmV0dXJuZWQgdG8gdGhpcyBzdHJlYW0uCisgICAgICoKKyAgICAgKiBJZiBubyBwcmVwYXJ0aW9uIGlzIG5lY2Vzc2FyeSwgcmV0dXJucyBPSyBhbmQgZG9lcyBub3QgdHJhbnNpdGlvbiB0bworICAgICAqIFBSRVBBUklORyBzdGF0ZS4gT3RoZXJ3aXNlLCByZXR1cm5zIE5PVF9FTk9VR0hfREFUQSBhbmQgdHJhbnNpdGlvbnMKKyAgICAgKiB0byBQUkVQQVJJTkcuCisgICAgICoKKyAgICAgKiBSZXR1cm5zOgorICAgICAqICAgIE9LIGlmIG5vIG1vcmUgYnVmZmVycyBuZWVkIHRvIGJlIHByZWFsbG9jYXRlZAorICAgICAqICAgIE5PVF9FTk9VR0hfREFUQSBpZiBjYWxscyB0byBwcmVwYXJlTmV4dEJ1ZmZlciBhcmUgbmVlZGVkIHRvIGZpbmlzaAorICAgICAqICAgICAgICBidWZmZXIgcHJlLWFsbG9jYXRpb24sIGFuZCB0cmFuc2l0aW9ucyB0byB0aGUgUFJFUEFSSU5HIHN0YXRlLgorICAgICAqICAgIE5PX0lOSVQgaW4gY2FzZSBvZiBhIHNlcmlvdXMgZXJyb3IgZnJvbSB0aGUgSEFMIGRldmljZQorICAgICAqICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIGNhbGxlZCB3aGVuIG5vdCBpbiBDT05GSUdVUkVEIHN0YXRlLCBvciBhCisgICAgICogICAgICAgIHZhbGlkIGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIHJldHVybmVkIHRvIHRoaXMgc3RyZWFtLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRQcmVwYXJlKCkgPSAwOworCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIHN0cmVhbSBpcyBtaWQtcHJlcGFyaW5nLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCAgICAgaXNQcmVwYXJpbmcoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDb250aW51ZSBzdHJlYW0gYnVmZmVyIHByZXBhcmF0aW9uIGJ5IGFsbG9jYXRpbmcgdGhlIG5leHQKKyAgICAgKiBidWZmZXIgZm9yIHRoaXMgc3RyZWFtLiAgTWF5IG9ubHkgYmUgY2FsbGVkIGluIHRoZSBQUkVQQVJFRCBzdGF0ZS4KKyAgICAgKgorICAgICAqIFJldHVybnMgT0sgYW5kIHRyYW5zaXRpb25zIHRvIHRoZSBDT05GSUdVUkVEIHN0YXRlIGlmIGFsbCBidWZmZXJzCisgICAgICogYXJlIGFsbG9jYXRlZCBhZnRlciB0aGUgY2FsbCBjb25jbHVkZXMuIE90aGVyd2lzZSByZXR1cm5zIE5PVF9FTk9VR0hfREFUQS4KKyAgICAgKgorICAgICAqIFJldHVybnM6CisgICAgICogICAgT0sgaWYgbm8gbW9yZSBidWZmZXJzIG5lZWQgdG8gYmUgcHJlYWxsb2NhdGVkLCBhbmQgdHJhbnNpdGlvbnMKKyAgICAgKiAgICAgICAgdG8gdGhlIENPTkZJR1VSRUQgc3RhdGUuCisgICAgICogICAgTk9UX0VOT1VHSF9EQVRBIGlmIG1vcmUgY2FsbHMgdG8gcHJlcGFyZU5leHRCdWZmZXIgYXJlIG5lZWRlZCB0byBmaW5pc2gKKyAgICAgKiAgICAgICAgYnVmZmVyIHByZS1hbGxvY2F0aW9uLgorICAgICAqICAgIE5PX0lOSVQgaW4gY2FzZSBvZiBhIHNlcmlvdXMgZXJyb3IgZnJvbSB0aGUgSEFMIGRldmljZQorICAgICAqICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIGNhbGxlZCB3aGVuIG5vdCBpbiBDT05GSUdVUkVEIHN0YXRlLCBvciBhCisgICAgICogICAgICAgIHZhbGlkIGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIHJldHVybmVkIHRvIHRoaXMgc3RyZWFtLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZU5leHRCdWZmZXIoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgc3RyZWFtIHByZXBhcmF0aW9uIGVhcmx5LiBJbiBjYXNlIGFsbG9jYXRpb24gbmVlZHMgdG8gYmUKKyAgICAgKiBzdG9wcGVkLCB0aGlzIG1ldGhvZCB0cmFuc2l0aW9ucyB0aGUgc3RyZWFtIGJhY2sgdG8gdGhlIENPTkZJR1VSRUQgc3RhdGUuCisgICAgICogQnVmZmVycyB0aGF0IGhhdmUgYmVlbiBhbGxvY2F0ZWQgd2l0aCBwcmVwYXJlTmV4dEJ1ZmZlciByZW1haW4gdGhhdCB3YXksCisgICAgICogYnV0IGEgbGF0ZXIgdXNlIG9mIHByZXBhcmVOZXh0QnVmZmVyIHdpbGwgcmVxdWlyZSBqdXN0IGFzIG1hbnkKKyAgICAgKiBjYWxscyBhcyBpZiB0aGUgZWFybGllciBwcmVwYXJlIGF0dGVtcHQgaGFkIG5vdCBleGlzdGVkLgorICAgICAqCisgICAgICogUmV0dXJuczoKKyAgICAgKiAgICBPSyBpZiBjYW5jZWxsYXRpb24gc3VjY2VlZGVkLCBhbmQgdHJhbnNpdGlvbnMgdG8gdGhlIENPTkZJR1VSRUQgc3RhdGUKKyAgICAgKiAgICBJTlZBTElEX09QRVJBVElPTiBpZiBub3QgaW4gdGhlIFBSRVBBUklORyBzdGF0ZQorICAgICAqICAgIE5PX0lOSVQgaW4gY2FzZSBvZiBhIHNlcmlvdXMgZXJyb3IgZnJvbSB0aGUgSEFMIGRldmljZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FuY2VsUHJlcGFyZSgpID0gMDsKKworICAgIC8qKgorICAgICAqIFRlYXIgZG93biBtZW1vcnkgZm9yIHRoaXMgc3RyZWFtLiBUaGlzIGZyZWVzIGFsbCB1bnVzZWQgZ3JhbGxvYyBidWZmZXJzCisgICAgICogYWxsb2NhdGVkIGZvciB0aGlzIHN0cmVhbSwgYnV0IGxlYXZlcyBpdCByZWFkeSBmb3Igb3BlcmF0aW9uIGFmdGVyd2FyZC4KKyAgICAgKgorICAgICAqIE1heSBvbmx5IGJlIGNhbGxlZCBpbiB0aGUgQ09ORklHVVJFRCBzdGF0ZSwgYW5kIGtlZXBzIHRoZSBzdHJlYW0gaW4KKyAgICAgKiB0aGUgQ09ORklHVVJFRCBzdGF0ZS4KKyAgICAgKgorICAgICAqIFJldHVybnM6CisgICAgICogICAgT0sgaWYgdGVhcmRvd24gc3VjY2VlZGVkLgorICAgICAqICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIG5vdCBpbiB0aGUgQ09ORklHVVJFRCBzdGF0ZQorICAgICAqICAgIE5PX0lOSVQgaW4gY2FzZSBvZiBhIHNlcmlvdXMgZXJyb3IgZnJvbSB0aGUgSEFMIGRldmljZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgdGVhckRvd24oKSA9IDA7CisKKyAgICAvKioKICAgICAgKiBGaWxsIGluIHRoZSBjYW1lcmEzX3N0cmVhbV9idWZmZXIgd2l0aCB0aGUgbmV4dCB2YWxpZCBidWZmZXIgZm9yIHRoaXMKICAgICAgKiBzdHJlYW0sIHRvIGhhbmQgb3ZlciB0byB0aGUgSEFMLgogICAgICAqCkBAIC0xMjgsNiArMjA1LDEzIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5JbnB1dEJ1ZmZlcihjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlcikgPSAwOwogCiAgICAgLyoqCisgICAgICogR2V0IHRoZSBidWZmZXIgcHJvZHVjZXIgb2YgdGhlIGlucHV0IGJ1ZmZlciBxdWV1ZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG9ubHkgYXBwbGllcyB0byBpbnB1dCBzdHJlYW1zLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJQcm9kdWNlcihzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqcHJvZHVjZXIpID0gMDsKKworICAgIC8qKgogICAgICAqIFdoZXRoZXIgYW55IG9mIHRoZSBzdHJlYW0ncyBidWZmZXJzIGFyZSBjdXJyZW50bHkgaW4gdXNlIGJ5IHRoZSBIQUwsCiAgICAgICogaW5jbHVkaW5nIGJ1ZmZlcnMgdGhhdCBoYXZlIGJlZW4gcmV0dXJuZWQgYnV0IG5vdCB5ZXQgaGFkIHRoZWlyCiAgICAgICogcmVsZWFzZSBmZW5jZSBzaWduYWxlZC4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNac2xTdHJlYW0uY3BwCmluZGV4IDgxMzMwZWEuLmVlZmNiNDQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1pzbFN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzWnNsU3RyZWFtLmNwcApAQCAtMTE0LDEzICsxMTQsMTUgQEAKICAgICAgICAgaW50IGJ1ZmZlckNvdW50KSA6CiAgICAgICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaWQsIENBTUVSQTNfU1RSRUFNX0JJRElSRUNUSU9OQUwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX1VOS05PV04sIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzApLAogICAgICAgICBtRGVwdGgoYnVmZmVyQ291bnQpIHsKIAogICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOwogICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOwogICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CiAgICAgbVByb2R1Y2VyID0gbmV3IFJpbmdCdWZmZXJDb25zdW1lcihjb25zdW1lciwgR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfWlNMLCBidWZmZXJDb3VudCk7CisgICAgbVByb2R1Y2VyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTItWnNsUmluZ0J1ZmZlckNvbnN1bWVyIikpOwogICAgIG1Db25zdW1lciA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQXV0b0NvbmRpdGlvbkxvY2suY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQXV0b0NvbmRpdGlvbkxvY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZWU5NjUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9BdXRvQ29uZGl0aW9uTG9jay5jcHAKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJBdXRvQ29uZGl0aW9uTG9jay5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1dhaXRhYmxlTXV0ZXhXcmFwcGVyOjpXYWl0YWJsZU11dGV4V3JhcHBlcihNdXRleCogbXV0ZXgpIDogbU11dGV4e211dGV4fSwgbVN0YXRle2ZhbHNlfSB7fQorCitXYWl0YWJsZU11dGV4V3JhcHBlcjo6fldhaXRhYmxlTXV0ZXhXcmFwcGVyKCkge30KKworLy8gTG9ja3MgbWFuYWdlci1vd25lZCBtdXRleAorQXV0b0NvbmRpdGlvbkxvY2s6OkF1dG9Db25kaXRpb25Mb2NrKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxXYWl0YWJsZU11dGV4V3JhcHBlcj4mIG1hbmFnZXIpIDoKKyAgICAgICAgbU1hbmFnZXJ7bWFuYWdlcn0sIG1BdXRvTG9ja3ttYW5hZ2VyLT5tTXV0ZXh9IHt9CisKKy8vIFVubG9ja3MgbWFuYWdlci1vd25lZCBtdXRleAorQXV0b0NvbmRpdGlvbkxvY2s6On5BdXRvQ29uZGl0aW9uTG9jaygpIHsKKyAgICAvLyBVbnNldCB0aGUgY29uZGl0aW9uIGFuZCB3YWtlIGV2ZXJ5b25lIHVwIGJlZm9yZSByZWxlYXNpbmcgbG9jaworICAgIG1NYW5hZ2VyLT5tU3RhdGUgPSBmYWxzZTsKKyAgICBtTWFuYWdlci0+bUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPEF1dG9Db25kaXRpb25Mb2NrPiBBdXRvQ29uZGl0aW9uTG9jazo6d2FpdEFuZEFjcXVpcmUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxXYWl0YWJsZU11dGV4V3JhcHBlcj4mIG1hbmFnZXIsIG5zZWNzX3Qgd2FpdFRpbWUpIHsKKworICAgIGlmIChtYW5hZ2VyID09IG51bGxwdHIgfHwgbWFuYWdlci0+bU11dGV4ID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gQmFkIGlucHV0LCByZXR1cm4gbnVsbAorICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEF1dG9Db25kaXRpb25Mb2NrPntudWxscHRyfTsKKyAgICB9CisKKyAgICAvLyBBY3F1aXJlIHNjb3BlZCBsb2NrCisgICAgc3RkOjp1bmlxdWVfcHRyPEF1dG9Db25kaXRpb25Mb2NrPiBzY29wZWRMb2NrKG5ldyBBdXRvQ29uZGl0aW9uTG9jayhtYW5hZ2VyKSk7CisKKyAgICAvLyBGaWd1cmUgb3V0IHdoYXQgdGltZSBpbiB0aGUgZnV0dXJlIHdlIHNob3VsZCBoaXQgdGhlIHRpbWVvdXQKKyAgICBuc2Vjc190IGZhaWxUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpICsgd2FpdFRpbWU7CisKKyAgICAvLyBXYWl0IHVudGlsIHdlIHRpbWVvdXQsIG9yIHN1Y2Nlc3MKKyAgICB3aGlsZShtYW5hZ2VyLT5tU3RhdGUpIHsKKyAgICAgICAgc3RhdHVzX3QgcmV0ID0gbWFuYWdlci0+bUNvbmRpdGlvbi53YWl0UmVsYXRpdmUoKihtYW5hZ2VyLT5tTXV0ZXgpLCB3YWl0VGltZSk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIC8vIFRpbWVkIG91dCBvciB3aGF0ZXZlciwgcmV0dXJuIG51bGwKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8QXV0b0NvbmRpdGlvbkxvY2s+e251bGxwdHJ9OworICAgICAgICB9CisgICAgICAgIHdhaXRUaW1lID0gZmFpbFRpbWUgLSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CisgICAgfQorCisgICAgLy8gU2V0IHRoZSBjb25kaXRpb24gYW5kIHJldHVybgorICAgIG1hbmFnZXItPm1TdGF0ZSA9IHRydWU7CisgICAgcmV0dXJuIHNjb3BlZExvY2s7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxBdXRvQ29uZGl0aW9uTG9jaz4gQXV0b0NvbmRpdGlvbkxvY2s6OndhaXRBbmRBY3F1aXJlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8V2FpdGFibGVNdXRleFdyYXBwZXI+JiBtYW5hZ2VyKSB7CisKKyAgICBpZiAobWFuYWdlciA9PSBudWxscHRyIHx8IG1hbmFnZXItPm1NdXRleCA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIEJhZCBpbnB1dCwgcmV0dXJuIG51bGwKKyAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxBdXRvQ29uZGl0aW9uTG9jaz57bnVsbHB0cn07CisgICAgfQorCisgICAgLy8gQWNxdWlyZSBzY29wZWQgbG9jaworICAgIHN0ZDo6dW5pcXVlX3B0cjxBdXRvQ29uZGl0aW9uTG9jaz4gc2NvcGVkTG9jayhuZXcgQXV0b0NvbmRpdGlvbkxvY2sobWFuYWdlcikpOworCisgICAgLy8gV2FpdCB1bnRpbCB3ZSB0aW1lb3V0LCBvciBzdWNjZXNzCisgICAgd2hpbGUobWFuYWdlci0+bVN0YXRlKSB7CisgICAgICAgIHN0YXR1c190IHJldCA9IG1hbmFnZXItPm1Db25kaXRpb24ud2FpdCgqKG1hbmFnZXItPm1NdXRleCkpOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAvLyBUaW1lZCBvdXQgb3Igd2hhdGV2ZXIsIHJldHVybiBudWxsCisgICAgICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEF1dG9Db25kaXRpb25Mb2NrPntudWxscHRyfTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNldCB0aGUgY29uZGl0aW9uIGFuZCByZXR1cm4KKyAgICBtYW5hZ2VyLT5tU3RhdGUgPSB0cnVlOworICAgIHJldHVybiBzY29wZWRMb2NrOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQXV0b0NvbmRpdGlvbkxvY2suaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0F1dG9Db25kaXRpb25Mb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEzZWFmYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0F1dG9Db25kaXRpb25Mb2NrLmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBBTkRST0lEX1NFUlZJQ0VfVVRJTFNfU0NPUEVEX0NPTkRJVElPTl9ICisjZGVmaW5lIEFORFJPSURfU0VSVklDRV9VVElMU19TQ09QRURfQ09ORElUSU9OX0gKKworI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBXYWl0YWJsZU11dGV4V3JhcHBlciBjYW4gYmUgdXNlZCB3aXRoIEF1dG9Db25kaXRpb25Mb2NrIHRvIGNvbnN0cnVjdCBzY29wZWQgbG9ja3MgZm9yIHRoZQorICogd3JhcHBlZCBNdXRleCB3aXRoIHRpbWVvdXRzIGZvciBsb2NrIGFjcXVpc2l0aW9uLgorICovCitjbGFzcyBXYWl0YWJsZU11dGV4V3JhcHBlciB7CisgICAgZnJpZW5kIGNsYXNzIEF1dG9Db25kaXRpb25Mb2NrOworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCB0aGUgQ29uZGl0aW9uTWFuZ2VyIHdpdGggdGhlIGdpdmVuIE11dGV4LgorICAgICAqLworICAgIFdhaXRhYmxlTXV0ZXhXcmFwcGVyKE11dGV4KiBtdXRleCk7CisKKyAgICB2aXJ0dWFsIH5XYWl0YWJsZU11dGV4V3JhcHBlcigpOworcHJpdmF0ZToKKyAgICBNdXRleCogbU11dGV4OworICAgIGJvb2wgbVN0YXRlOworICAgIENvbmRpdGlvbiBtQ29uZGl0aW9uOworfTsKKworLyoqCisgKiBBdXRvQ29uZGl0aW9uTG9jayBpcyBhIHNjb3BlZCBsb2NrIHNpbWlsYXIgdG8gTXV0ZXg6OkF1dG9sb2NrLCBidXQgYWxsb3dzIHRpbWVvdXRzIHRvIGJlCisgKiBzcGVjaWZpZWQgZm9yIGxvY2sgYWNxdWlzaXRpb24uCisgKgorICogQXV0b0NvbmRpdGlvbkxvY2sgaXMgdXNlZCB3aXRoIGEgV2FpdGFibGVNdXRleFdyYXBwZXIgdG8gbG9jay91bmxvY2sgdGhlIFdhaXRhYmxlTXV0ZXhXcmFwcGVyJ3MKKyAqIHdyYXBwZWQgTXV0ZXgsIGFuZCB3YWl0L3NldC9zaWduYWwgdGhlIFdhaXRhYmxlTXV0ZXhXcmFwcGVyJ3Mgd3JhcHBlZCBjb25kaXRpb24uIFRvIHVzZSB0aGlzLAorICogY2FsbCBBdXRvQ29uZGl0aW9uTG9jazo6d2FpdEFuZEFjcXVpcmUgdG8gZ2V0IGFuIGluc3RhbmNlLiAgVGhpcyB3aWxsOgorICogICAgICAtIExvY2sgdGhlIGdpdmVuIFdhaXRhYmxlTXV0ZXhXcmFwcGVyJ3MgbXV0ZXguCisgKiAgICAgIC0gV2FpdCBmb3IgdGhlIFdhaXRhYmxlTXV0ZXhXcmFwcGVyJ3MgY29uZGl0aW9uIHRvIGJlY29tZSBmYWxzZSwgb3IgdGltZW91dC4KKyAqICAgICAgLSBTZXQgdGhlIFdhaXRhYmxlTXV0ZXhXcmFwcGVyJ3MgY29uZGl0aW9uIHRvIHRydWUuCisgKgorICogV2hlbiB0aGUgQXV0b0NvbmRpdGlvbkxvY2sgZ29lcyBvdXQgb2Ygc2NvcGUgYW5kIGlzIGRlc3Ryb3llZCwgdGhpcyB3aWxsOgorICogICAgICAtIFNldCB0aGUgV2FpdGFibGVNdXRleFdyYXBwZXIncyBjb25kaXRpb24gdG8gZmFsc2UuCisgKiAgICAgIC0gU2lnbmFsIHRocmVhZHMgd2FpdGluZyBvbiB0aGlzIGNvbmRpdGlvbiB0byB3YWtldXAuCisgKiAgICAgIC0gUmVsZWFzZSBXYWl0YWJsZU11dGV4V3JhcHBlcidzIG11dGV4LgorICovCitjbGFzcyBBdXRvQ29uZGl0aW9uTG9jayBmaW5hbCB7CitwdWJsaWM6CisgICAgQXV0b0NvbmRpdGlvbkxvY2soKSA9IGRlbGV0ZTsKKyAgICBBdXRvQ29uZGl0aW9uTG9jayhjb25zdCBBdXRvQ29uZGl0aW9uTG9jayYgb3RoZXIpID0gZGVsZXRlOworICAgIEF1dG9Db25kaXRpb25Mb2NrICYgb3BlcmF0b3I9KGNvbnN0IEF1dG9Db25kaXRpb25Mb2NrJikgPSBkZWxldGU7CisKKyAgICB+QXV0b0NvbmRpdGlvbkxvY2soKTsKKworICAgIC8qKgorICAgICAqIE1ha2UgYSBuZXcgQXV0b0NvbmRpdGlvbkxvY2sgZnJvbSBhIGdpdmVuIFdhaXRhYmxlTXV0ZXhXcmFwcGVyLCB3YWl0aW5nIHVwIHRvIHdhaXRUaW1lCisgICAgICogbmFub3NlY29uZHMgdG8gYWNxdWlyZSB0aGUgV2FpdGFibGVNdXRleFdyYXBwZXIncyB3cmFwcGVkIGxvY2suCisgICAgICoKKyAgICAgKiBSZXR1cm4gYW4gZW1wdHkgdW5pcXVlX3B0ciBpZiB0aGlzIGZhaWxzLCBvciBhIHRpbWVvdXQgb2NjdXJzLgorICAgICAqLworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QXV0b0NvbmRpdGlvbkxvY2s+IHdhaXRBbmRBY3F1aXJlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFdhaXRhYmxlTXV0ZXhXcmFwcGVyPiYgbWFuYWdlciwgbnNlY3NfdCB3YWl0VGltZSk7CisKKyAgICAvKioKKyAgICAgKiBNYWtlIGEgbmV3IEF1dG9Db25kaXRpb25Mb2NrIGZyb20gYSBnaXZlbiBXYWl0YWJsZU11dGV4V3JhcHBlciwgd2FpdGluZyBpbmRlZmluaXRlbHkgdG8KKyAgICAgKiBhY3F1aXJlIHRoZSBXYWl0YWJsZU11dGV4V3JhcHBlcidzIHdyYXBwZWQgbG9jay4KKyAgICAgKgorICAgICAqIFJldHVybiBhbiBlbXB0eSB1bmlxdWVfcHRyIGlmIHRoaXMgZmFpbHMuCisgICAgICovCisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxBdXRvQ29uZGl0aW9uTG9jaz4gd2FpdEFuZEFjcXVpcmUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8V2FpdGFibGVNdXRleFdyYXBwZXI+JiBtYW5hZ2VyKTsKK3ByaXZhdGU6CisgICAgQXV0b0NvbmRpdGlvbkxvY2soY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFdhaXRhYmxlTXV0ZXhXcmFwcGVyPiYgbWFuYWdlcik7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8V2FpdGFibGVNdXRleFdyYXBwZXI+IG1NYW5hZ2VyOworICAgIE11dGV4OjpBdXRvbG9jayBtQXV0b0xvY2s7Cit9OworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9TRVJWSUNFX1VUSUxTX1NDT1BFRF9DT05ESVRJT05fSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2xpZW50TWFuYWdlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2xpZW50TWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZTU4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DbGllbnRNYW5hZ2VyLmgKQEAgLTAsMCArMSw2NDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VSVklDRV9VVElMU19FVklDVElPTl9QT0xJQ1lfTUFOQUdFUl9ICisjZGVmaW5lIEFORFJPSURfU0VSVklDRV9VVElMU19FVklDVElPTl9QT0xJQ1lfTUFOQUdFUl9ICisKKyNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgcmVzb3VyY2VfcG9saWN5IHsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqCisgKiBUaGUgQ2xpZW50RGVzY3JpcHRvciBjbGFzcyBpcyBhIGNvbnRhaW5lciBmb3IgYSBnaXZlbiBrZXkvdmFsdWUgcGFpciBpZGVudGlmeWluZyBhIHNoYXJlZAorICogcmVzb3VyY2UsIGFuZCB0aGUgY29ycmVzcG9uZGluZyBjb3N0LCBwcmlvcml0eSwgb3duZXIgSUQsIGFuZCBjb25mbGljdGluZyBrZXlzIGxpc3QgdXNlZAorICogaW4gZGV0ZXJtaW5pbmcgZXZpY3Rpb24gYmVoYXZpb3IuCisgKgorICogQXNpZGUgZnJvbSB0aGUgcHJpb3JpdHksIHRoZXNlIHZhbHVlcyBhcmUgaW1tdXRhYmxlIG9uY2UgdGhlIENsaWVudERlc2NyaXB0b3IgaGFzIGJlZW4KKyAqIGNvbnN0cnVjdGVkLgorICovCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFPgorY2xhc3MgQ2xpZW50RGVzY3JpcHRvciBmaW5hbCB7CitwdWJsaWM6CisgICAgQ2xpZW50RGVzY3JpcHRvcihjb25zdCBLRVkmIGtleSwgY29uc3QgVkFMVUUmIHZhbHVlLCBpbnQzMl90IGNvc3QsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxLRVk+JiBjb25mbGljdGluZ0tleXMsIGludDMyX3QgcHJpb3JpdHksIGludDMyX3Qgb3duZXJJZCk7CisgICAgQ2xpZW50RGVzY3JpcHRvcihLRVkmJiBrZXksIFZBTFVFJiYgdmFsdWUsIGludDMyX3QgY29zdCwgc3RkOjpzZXQ8S0VZPiYmIGNvbmZsaWN0aW5nS2V5cywKKyAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksIGludDMyX3Qgb3duZXJJZCk7CisKKyAgICB+Q2xpZW50RGVzY3JpcHRvcigpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBrZXkgZm9yIHRoaXMgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBjb25zdCBLRVkmIGdldEtleSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB2YWx1ZSBmb3IgdGhpcyBkZXNjcmlwdG9yLgorICAgICAqLworICAgIGNvbnN0IFZBTFVFJiBnZXRWYWx1ZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjb3N0IGZvciB0aGlzIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgaW50MzJfdCBnZXRDb3N0KCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHByaW9yaXR5IGZvciB0aGlzIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgaW50MzJfdCBnZXRQcmlvcml0eSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBvd25lciBJRCBmb3IgdGhpcyBkZXNjcmlwdG9yLgorICAgICAqLworICAgIGludDMyX3QgZ2V0T3duZXJJZCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGtleSBpcyBpbiB0aGlzIGRlc2NyaXB0b3IncyBjb25mbGljdGluZyBrZXlzIGxpc3QuCisgICAgICovCisgICAgYm9vbCBpc0NvbmZsaWN0aW5nKGNvbnN0IEtFWSYga2V5KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2V0IG9mIGFsbCBjb25mbGljdGluZyBrZXlzIGZvciB0aGlzIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgc3RkOjpzZXQ8S0VZPiBnZXRDb25mbGljdGluZygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwcm9pcml0eSBmb3IgdGhpcyBkZXNjcmlwdG9yLgorICAgICAqLworICAgIHZvaWQgc2V0UHJpb3JpdHkoaW50MzJfdCBwcmlvcml0eSk7CisKKyAgICAvLyBUaGlzIGNsYXNzIGlzIG9yZGVyZWQgYnkga2V5CisgICAgdGVtcGxhdGU8Y2xhc3MgSywgY2xhc3MgVj4KKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvciA8IChjb25zdCBDbGllbnREZXNjcmlwdG9yPEssIFY+JiBhLCBjb25zdCBDbGllbnREZXNjcmlwdG9yPEssIFY+JiBiKTsKKworcHJpdmF0ZToKKyAgICBLRVkgbUtleTsKKyAgICBWQUxVRSBtVmFsdWU7CisgICAgaW50MzJfdCBtQ29zdDsKKyAgICBzdGQ6OnNldDxLRVk+IG1Db25mbGljdGluZzsKKyAgICBpbnQzMl90IG1Qcmlvcml0eTsKKyAgICBpbnQzMl90IG1Pd25lcklkOworfTsgLy8gY2xhc3MgQ2xpZW50RGVzY3JpcHRvcgorCit0ZW1wbGF0ZTxjbGFzcyBLLCBjbGFzcyBWPgorYm9vbCBvcGVyYXRvciA8IChjb25zdCBDbGllbnREZXNjcmlwdG9yPEssIFY+JiBhLCBjb25zdCBDbGllbnREZXNjcmlwdG9yPEssIFY+JiBiKSB7CisgICAgcmV0dXJuIGEubUtleSA8IGIubUtleTsKK30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRT4KK0NsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT46OkNsaWVudERlc2NyaXB0b3IoY29uc3QgS0VZJiBrZXksIGNvbnN0IFZBTFVFJiB2YWx1ZSwgaW50MzJfdCBjb3N0LAorICAgICAgICBjb25zdCBzdGQ6OnNldDxLRVk+JiBjb25mbGljdGluZ0tleXMsIGludDMyX3QgcHJpb3JpdHksIGludDMyX3Qgb3duZXJJZCkgOiBtS2V5e2tleX0sCisgICAgICAgIG1WYWx1ZXt2YWx1ZX0sIG1Db3N0e2Nvc3R9LCBtQ29uZmxpY3Rpbmd7Y29uZmxpY3RpbmdLZXlzfSwgbVByaW9yaXR5e3ByaW9yaXR5fSwKKyAgICAgICAgbU93bmVySWR7b3duZXJJZH0ge30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRT4KK0NsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT46OkNsaWVudERlc2NyaXB0b3IoS0VZJiYga2V5LCBWQUxVRSYmIHZhbHVlLCBpbnQzMl90IGNvc3QsCisgICAgICAgIHN0ZDo6c2V0PEtFWT4mJiBjb25mbGljdGluZ0tleXMsIGludDMyX3QgcHJpb3JpdHksIGludDMyX3Qgb3duZXJJZCkgOgorICAgICAgICBtS2V5e3N0ZDo6Zm9yd2FyZDxLRVk+KGtleSl9LCBtVmFsdWV7c3RkOjpmb3J3YXJkPFZBTFVFPih2YWx1ZSl9LCBtQ29zdHtjb3N0fSwKKyAgICAgICAgbUNvbmZsaWN0aW5ne3N0ZDo6Zm9yd2FyZDxzdGQ6OnNldDxLRVk+Pihjb25mbGljdGluZ0tleXMpfSwgbVByaW9yaXR5e3ByaW9yaXR5fSwKKyAgICAgICAgbU93bmVySWR7b3duZXJJZH0ge30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRT4KK0NsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT46On5DbGllbnREZXNjcmlwdG9yKCkge30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRT4KK2NvbnN0IEtFWSYgQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPjo6Z2V0S2V5KCkgY29uc3QgeworICAgIHJldHVybiBtS2V5OworfQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFPgorY29uc3QgVkFMVUUmIENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT46OmdldFZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBtVmFsdWU7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUU+CitpbnQzMl90IENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT46OmdldENvc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Db3N0OworfQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFPgoraW50MzJfdCBDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+OjpnZXRQcmlvcml0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVByaW9yaXR5OworfQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFPgoraW50MzJfdCBDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+OjpnZXRPd25lcklkKCkgY29uc3QgeworICAgIHJldHVybiBtT3duZXJJZDsKK30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRT4KK2Jvb2wgQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPjo6aXNDb25mbGljdGluZyhjb25zdCBLRVkmIGtleSkgY29uc3QgeworICAgIGlmIChrZXkgPT0gbUtleSkgcmV0dXJuIHRydWU7CisgICAgZm9yIChjb25zdCBhdXRvJiB4IDogbUNvbmZsaWN0aW5nKSB7CisgICAgICAgIGlmIChrZXkgPT0geCkgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRT4KK3N0ZDo6c2V0PEtFWT4gQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPjo6Z2V0Q29uZmxpY3RpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Db25mbGljdGluZzsKK30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRT4KK3ZvaWQgQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPjo6c2V0UHJpb3JpdHkoaW50MzJfdCBwcmlvcml0eSkgeworICAgIG1Qcmlvcml0eSA9IHByaW9yaXR5OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKioKKyAqIEEgZGVmYXVsdCBjbGFzcyBpbXBsZW1lbnRpbmcgdGhlIExJU1RFTkVSIGludGVyZmFjZSB1c2VkIGJ5IENsaWVudE1hbmFnZXIuCisgKi8KK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUU+CitjbGFzcyBEZWZhdWx0RXZlbnRMaXN0ZW5lciB7CitwdWJsaWM6CisgICAgdm9pZCBvbkNsaWVudEFkZGVkKGNvbnN0IENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4mIGRlc2NyaXB0b3IpOworICAgIHZvaWQgb25DbGllbnRSZW1vdmVkKGNvbnN0IENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4mIGRlc2NyaXB0b3IpOworfTsKKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRT4KK3ZvaWQgRGVmYXVsdEV2ZW50TGlzdGVuZXI8S0VZLCBWQUxVRT46Om9uQ2xpZW50QWRkZWQoCisgICAgICAgIGNvbnN0IENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4mIC8qZGVzY3JpcHRvciovKSB7fQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFPgordm9pZCBEZWZhdWx0RXZlbnRMaXN0ZW5lcjxLRVksIFZBTFVFPjo6b25DbGllbnRSZW1vdmVkKAorICAgICAgICBjb25zdCBDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+JiAvKmRlc2NyaXB0b3IqLykge30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoqCisgKiBUaGUgQ2xpZW50TWFuYWdlciBjbGFzcyB3cmFwcyBhbiBMUlUtb3JkZXJlZCBsaXN0IG9mIGFjdGl2ZSBjbGllbnRzIGFuZCBpbXBsZW1lbnRzIGV2aWN0aW9uCisgKiBiZWhhdmlvciBmb3IgaGFuZGxpbmcgc2hhcmVkIHJlc291cmNlIGFjY2Vzcy4KKyAqCisgKiBXaGVuIGFkZGluZyBhIG5ldyBkZXNjcmlwdG9yLCBldmljdGlvbiBiZWhhdmlvciBpcyBhcyBmb2xsb3dzOgorICogICAtIEtleXMgYXJlIHVuaXF1ZSwgYWRkaW5nIGEgZGVzY3JpcHRvciB3aXRoIHRoZSBzYW1lIGtleSBhcyBhbiBleGlzdGluZyBkZXNjcmlwdG9yIHdpbGwKKyAqICAgICByZXN1bHQgaW4gdGhlIGxvd2VyLXByaW9yaXR5IG9mIHRoZSB0d28gYmVpbmcgcmVtb3ZlZC4gIFByaW9yaXR5IHRpZXMgcmVzdWx0IGluIHRoZQorICogICAgIExSVSBkZXNjcmlwdG9yIGJlaW5nIGV2aWN0ZWQgKHRoaXMgbWVhbnMgdGhlIGluY29taW5nIGRlc2NyaXB0b3IgYmUgYWRkZWQgaW4gdGhpcyBjYXNlKS4KKyAqICAgLSBBbnkgZGVzY3JpcHRvcnMgd2l0aCBrZXlzIHRoYXQgYXJlIGluIHRoZSBpbmNvbWluZyBkZXNjcmlwdG9yJ3MgJ2NvbmZsaWN0aW5nIGtleXMnIGxpc3QKKyAqICAgICB3aWxsIGJlIHJlbW92ZWQgaWYgdGhleSBoYXZlIGFuIGVxdWFsIG9yIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlIGluY29taW5nIGRlc2NyaXB0b3I7CisgKiAgICAgaWYgYW55IGhhdmUgYSBoaWdoZXIgcHJpb3JpdHksIHRoZSBpbmNvbWluZyBkZXNjcmlwdG9yIGlzIHJlbW92ZWQgaW5zdGVhZC4KKyAqICAgLSBJZiB0aGUgc3VtIG9mIGFsbCBkZXNjcmlwdG9ycycgY29zdHMsIGluY2x1ZGluZyB0aGUgaW5jb21pbmcgZGVzY3JpcHRvcidzLCBpcyBtb3JlIHRoYW4KKyAqICAgICB0aGUgbWF4IGNvc3QgYWxsb3dlZCBmb3IgdGhpcyBDbGllbnRNYW5hZ2VyLCBkZXNjcmlwdG9ycyB3aXRoIG5vbi16ZXJvIGNvc3QsIGVxdWFsIG9yIGxvd2VyCisgKiAgICAgcHJpb3JpdHksIGFuZCBhIGRpZmZlcmVudCBvd25lciB3aWxsIGJlIGV2aWN0ZWQgaW4gTFJVIG9yZGVyIHVudGlsIGVpdGhlciB0aGUgY29zdCBpcyBsZXNzCisgKiAgICAgdGhhbiB0aGUgbWF4IGNvc3QsIG9yIGFsbCBkZXNjcmlwdG9ycyBtZWV0aW5nIHRoaXMgY3JpdGVyaWEgaGF2ZSBiZWVuIGV2aWN0ZWQgYW5kIHRoZQorICogICAgIGluY29taW5nIGRlc2NyaXB0b3IgaGFzIHRoZSBoaWdoZXN0IHByaW9yaXR5LiAgT3RoZXJ3aXNlLCB0aGUgaW5jb21pbmcgZGVzY3JpcHRvciBpcworICogICAgIHJlbW92ZWQgaW5zdGVhZC4KKyAqLwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRSwgY2xhc3MgTElTVEVORVI9RGVmYXVsdEV2ZW50TGlzdGVuZXI8S0VZLCBWQUxVRT4+CitjbGFzcyBDbGllbnRNYW5hZ2VyIHsKK3B1YmxpYzoKKyAgICAvLyBUaGUgZGVmYXVsdCBtYXhpbXVtICJjb3N0IiBhbGxvd2VkIGJlZm9yZSBldmljdGluZworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBERUZBVUxUX01BWF9DT1NUID0gMTAwOworCisgICAgQ2xpZW50TWFuYWdlcigpOworICAgIENsaWVudE1hbmFnZXIoaW50MzJfdCB0b3RhbENvc3QpOworCisgICAgLyoqCisgICAgICogQWRkIGEgZ2l2ZW4gQ2xpZW50RGVzY3JpcHRvciB0byB0aGUgbWFuYWdlZCBsaXN0LiAgQ2xpZW50RGVzY3JpcHRvcnMgZm9yIGNsaWVudHMgdGhhdAorICAgICAqIGFyZSBldmljdGVkIGJ5IHRoaXMgYWN0aW9uIGFyZSByZXR1cm5lZCBpbiBhIHZlY3Rvci4KKyAgICAgKgorICAgICAqIFRoaXMgbWF5IHJldHVybiB0aGUgQ2xpZW50RGVzY3JpcHRvciBwYXNzZWQgaW4gaWYgaXQgd291bGQgYmUgZXZpY3RlZC4KKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4+IGFkZEFuZEV2aWN0KAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+JiBjbGllbnQpOworCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBtYXAgY29udGFpbmluZyBvd25lciAocGlkKSAtPiBwcmlvcml0eSBtYXBwaW5ncywgdXBkYXRlIHRoZSBwcmlvcml0eSBvZiBlYWNoCisgICAgICogQ2xpZW50RGVzY3JpcHRvciB3aXRoIGFuIG93bmVyIGluIHRoaXMgbWFwcGluZy4KKyAgICAgKi8KKyAgICB2b2lkIHVwZGF0ZVByaW9yaXRpZXMoY29uc3Qgc3RkOjptYXA8aW50MzJfdCxpbnQzMl90PiYgb3duZXJQcmlvcml0eUxpc3QpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFsbCBDbGllbnREZXNjcmlwdG9ycy4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZUFsbCgpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGFuZCByZXR1cm4gdGhlIENsaWVudERlc2NyaXB0b3Igd2l0aCBhIGdpdmVuIGtleS4KKyAgICAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4gcmVtb3ZlKGNvbnN0IEtFWSYga2V5KTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZSB0aGUgZ2l2ZW4gQ2xpZW50RGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4mIHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHZlY3RvciBvZiB0aGUgQ2xpZW50RGVzY3JpcHRvcnMgdGhhdCB3b3VsZCBiZSBldmljdGVkIGJ5IGFkZGluZyB0aGUgZ2l2ZW4KKyAgICAgKiBDbGllbnREZXNjcmlwdG9yLgorICAgICAqCisgICAgICogVGhpcyBtYXkgcmV0dXJuIHRoZSBDbGllbnREZXNjcmlwdG9yIHBhc3NlZCBpbiBpZiBpdCB3b3VsZCBiZSBldmljdGVkLgorICAgICAqLworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+Pj4gd291bGRFdmljdCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+PiYgY2xpZW50KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHZlY3RvciBvZiBhY3RpdmUgQ2xpZW50RGVzY3JpcHRvcnMgdGhhdCBwcmV2ZW50IHRoaXMgY2xpZW50IGZyb20gYmVpbmcgYWRkZWQuCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+PiBnZXRJbmNvbXBhdGlibGVDbGllbnRzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+JiBjbGllbnQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgdmVjdG9yIGNvbnRhaW5pbmcgYWxsIGN1cnJlbnRseSBhY3RpdmUgQ2xpZW50RGVzY3JpcHRvcnMuCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+PiBnZXRBbGwoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHZlY3RvciBjb250YWluaW5nIGFsbCBrZXlzIG9mIGN1cnJlbnRseSBhY3RpdmUgQ2xpZW50RGVzY3JpcHRvcnMuCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8S0VZPiBnZXRBbGxLZXlzKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSB2ZWN0b3Igb2YgdGhlIG93bmVyIHRhZ3Mgb2YgYWxsIGN1cnJlbnRseSBhY3RpdmUgQ2xpZW50RGVzY3JpcHRvcnMgKGR1cGxpY2F0ZXMKKyAgICAgKiB3aWxsIGJlIHJlbW92ZWQpLgorICAgICAqLworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGdldEFsbE93bmVycygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBDbGllbnREZXNjcmlwdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGtleSwgb3IgYW4gZW1wdHkgc2hhcmVkIHBvaW50ZXIKKyAgICAgKiBpZiBub25lIGV4aXN0cy4KKyAgICAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4gZ2V0KGNvbnN0IEtFWSYga2V5KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEJsb2NrIHVudGlsIHRoZSBnaXZlbiBjbGllbnQgaXMgbm8gbG9uZ2VyIGluIHRoZSBhY3RpdmUgY2xpZW50cyBsaXN0LCBvciB0aGUgdGltZW91dAorICAgICAqIG9jY3VycmVkLgorICAgICAqCisgICAgICogUmV0dXJucyBOT19FUlJPUiBpZiB0aGlzIHN1Y2NlZWRlZCwgLUVUSU1FRE9VVCBvbiBhIHRpbWVvdXQsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbgorICAgICAqIGZhaWx1cmUuCisgICAgICovCisgICAgc3RhdHVzX3Qgd2FpdFVudGlsUmVtb3ZlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4gY2xpZW50LAorICAgICAgICAgICAgbnNlY3NfdCB0aW1lb3V0KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY3VycmVudCBsaXN0ZW5lciBmb3IgY2xpZW50IGFkZC9yZW1vdmUgZXZlbnRzLgorICAgICAqCisgICAgICogVGhlIGxpc3RlbmVyIGluc3RhbmNlIG11c3QgaW5oZXJpdCBmcm9tIHRoZSBMSVNURU5FUiBjbGFzcyBhbmQgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcKKyAgICAgKiBtZXRob2RzOgorICAgICAqICAgIHZvaWQgb25DbGllbnRSZW1vdmVkKGNvbnN0IENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4mIGRlc2NyaXB0b3IpOworICAgICAqICAgIHZvaWQgb25DbGllbnRBZGRlZChjb25zdCBDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+JiBkZXNjcmlwdG9yKTsKKyAgICAgKgorICAgICAqIFRoZXNlIGNhbGxiYWNrIG1ldGhvZHMgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgQ2xpZW50TWFuYWdlcidzIGxvY2sgaGVsZCwgYW5kIHNob3VsZAorICAgICAqIG5vdCBjYWxsIGFueSBmdXJ0aGVyIENsaWVudE1hbmFnZXIgbWV0aG9kcy4KKyAgICAgKgorICAgICAqIFRoZSBvbkNsaWVudFJlbW92ZWQgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGNsaWVudCBoYXMgYmVlbiByZW1vdmVkIG9yIGV2aWN0ZWQKKyAgICAgKiBmcm9tIHRoZSBDbGllbnRNYW5hZ2VyIHRoYXQgdGhpcyBldmVudCBsaXN0ZW5lciBoYXMgYmVlbiBhZGRlZCB0by4gVGhlIG9uQ2xpZW50QWRkZWQKKyAgICAgKiBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgY2xpZW50IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBDbGllbnRNYW5hZ2VyIHRoYXQgdGhpcworICAgICAqIGV2ZW50IGxpc3RlbmVyIGhhcyBiZWVuIGFkZGVkIHRvLgorICAgICAqLworICAgIHZvaWQgc2V0TGlzdGVuZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExJU1RFTkVSPiYgbGlzdGVuZXIpOworCitwcm90ZWN0ZWQ6CisgICAgfkNsaWVudE1hbmFnZXIoKTsKKworcHJpdmF0ZToKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHZlY3RvciBvZiB0aGUgQ2xpZW50RGVzY3JpcHRvcnMgdGhhdCB3b3VsZCBiZSBldmljdGVkIGJ5IGFkZGluZyB0aGUgZ2l2ZW4KKyAgICAgKiBDbGllbnREZXNjcmlwdG9yLiAgSWYgcmV0dXJuSW5jb21wYXRpYmxlQ2xpZW50cyBpcyBzZXQgdG8gdHJ1ZSwgaW5zdGVhZCwgcmV0dXJuIHRoZQorICAgICAqIHZlY3RvciBvZiBDbGllbnREZXNjcmlwdG9ycyB0aGF0IGFyZSBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGUgaW5jb21pbmcgY2xpZW50IGFuZAorICAgICAqIGVpdGhlciBjb25mbGljdCB3aXRoIHRoaXMgY2xpZW50LCBvciBjb250cmlidXRlIHRvIHRoZSByZXNvdXJjZSBjb3N0IGlmIHRoYXQgd291bGQKKyAgICAgKiBwcmV2ZW50IHRoZSBpbmNvbWluZyBjbGllbnQgZnJvbSBiZWluZyBhZGRlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbWF5IHJldHVybiB0aGUgQ2xpZW50RGVzY3JpcHRvciBwYXNzZWQgaW4uCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+PiB3b3VsZEV2aWN0TG9ja2VkKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+JiBjbGllbnQsCisgICAgICAgICAgICBib29sIHJldHVybkluY29tcGF0aWJsZUNsaWVudHMgPSBmYWxzZSkgY29uc3Q7CisKKyAgICBpbnQ2NF90IGdldEN1cnJlbnRDb3N0TG9ja2VkKCkgY29uc3Q7CisKKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworICAgIG11dGFibGUgQ29uZGl0aW9uIG1SZW1vdmVkQ29uZGl0aW9uOworICAgIGludDMyX3QgbU1heENvc3Q7CisgICAgLy8gTFJVIG9yZGVyZWQsIG1vc3QgcmVjZW50IGF0IGVuZAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+Pj4gbUNsaWVudHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPExJU1RFTkVSPiBtTGlzdGVuZXI7Cit9OyAvLyBjbGFzcyBDbGllbnRNYW5hZ2VyCisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUUsIGNsYXNzIExJU1RFTkVSPgorQ2xpZW50TWFuYWdlcjxLRVksIFZBTFVFLCBMSVNURU5FUj46OkNsaWVudE1hbmFnZXIoKSA6CisgICAgICAgIENsaWVudE1hbmFnZXIoREVGQVVMVF9NQVhfQ09TVCkge30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRSwgY2xhc3MgTElTVEVORVI+CitDbGllbnRNYW5hZ2VyPEtFWSwgVkFMVUUsIExJU1RFTkVSPjo6Q2xpZW50TWFuYWdlcihpbnQzMl90IHRvdGFsQ29zdCkgOiBtTWF4Q29zdCh0b3RhbENvc3QpIHt9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUUsIGNsYXNzIExJU1RFTkVSPgorQ2xpZW50TWFuYWdlcjxLRVksIFZBTFVFLCBMSVNURU5FUj46On5DbGllbnRNYW5hZ2VyKCkge30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRSwgY2xhc3MgTElTVEVORVI+CitzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4+CitDbGllbnRNYW5hZ2VyPEtFWSwgVkFMVUUsIExJU1RFTkVSPjo6d291bGRFdmljdCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+JiBjbGllbnQpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgcmV0dXJuIHdvdWxkRXZpY3RMb2NrZWQoY2xpZW50KTsKK30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRSwgY2xhc3MgTElTVEVORVI+CitzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4+CitDbGllbnRNYW5hZ2VyPEtFWSwgVkFMVUUsIExJU1RFTkVSPjo6Z2V0SW5jb21wYXRpYmxlQ2xpZW50cygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+JiBjbGllbnQpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgcmV0dXJuIHdvdWxkRXZpY3RMb2NrZWQoY2xpZW50LCAvKnJldHVybkluY29tcGF0aWJsZUNsaWVudHMqL3RydWUpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFLCBjbGFzcyBMSVNURU5FUj4KK3N0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+Pj4KK0NsaWVudE1hbmFnZXI8S0VZLCBWQUxVRSwgTElTVEVORVI+Ojp3b3VsZEV2aWN0TG9ja2VkKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4mIGNsaWVudCwKKyAgICAgICAgYm9vbCByZXR1cm5JbmNvbXBhdGlibGVDbGllbnRzKSBjb25zdCB7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4+IGV2aWN0TGlzdDsKKworICAgIC8vIERpc2FsbG93IG51bGwgY2xpZW50cywgcmV0dXJuIGlucHV0CisgICAgaWYgKGNsaWVudCA9PSBudWxscHRyKSB7CisgICAgICAgIGV2aWN0TGlzdC5wdXNoX2JhY2soY2xpZW50KTsKKyAgICAgICAgcmV0dXJuIGV2aWN0TGlzdDsKKyAgICB9CisKKyAgICBjb25zdCBLRVkmIGtleSA9IGNsaWVudC0+Z2V0S2V5KCk7CisgICAgaW50MzJfdCBjb3N0ID0gY2xpZW50LT5nZXRDb3N0KCk7CisgICAgaW50MzJfdCBwcmlvcml0eSA9IGNsaWVudC0+Z2V0UHJpb3JpdHkoKTsKKyAgICBpbnQzMl90IG93bmVyID0gY2xpZW50LT5nZXRPd25lcklkKCk7CisKKyAgICBpbnQ2NF90IHRvdGFsQ29zdCA9IGdldEN1cnJlbnRDb3N0TG9ja2VkKCkgKyBjb3N0OworCisgICAgLy8gRGV0ZXJtaW5lIHRoZSBNUlUgb2YgdGhlIG93bmVycyB0aWVkIGZvciBoYXZpbmcgdGhlIGhpZ2hlc3QgcHJpb3JpdHkKKyAgICBpbnQzMl90IGhpZ2hlc3RQcmlvcml0eU93bmVyID0gb3duZXI7CisgICAgaW50MzJfdCBoaWdoZXN0UHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGkgOiBtQ2xpZW50cykgeworICAgICAgICBpbnQzMl90IGN1clByaW9yaXR5ID0gaS0+Z2V0UHJpb3JpdHkoKTsKKyAgICAgICAgaWYgKGN1clByaW9yaXR5ID49IGhpZ2hlc3RQcmlvcml0eSkgeworICAgICAgICAgICAgaGlnaGVzdFByaW9yaXR5ID0gY3VyUHJpb3JpdHk7CisgICAgICAgICAgICBoaWdoZXN0UHJpb3JpdHlPd25lciA9IGktPmdldE93bmVySWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChoaWdoZXN0UHJpb3JpdHkgPT0gcHJpb3JpdHkpIHsKKyAgICAgICAgLy8gU3dpdGNoIGJhY2sgb3duZXIgaWYgdGhlIGluY29taW5nIGNsaWVudCBoYXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHksIGFzIGl0IGlzIE1SVQorICAgICAgICBoaWdoZXN0UHJpb3JpdHlPd25lciA9IG93bmVyOworICAgIH0KKworICAgIC8vIEJ1aWxkIGV2aWN0aW9uIGxpc3Qgb2YgY2xpZW50cyB0byByZW1vdmUKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGkgOiBtQ2xpZW50cykgeworICAgICAgICBjb25zdCBLRVkmIGN1cktleSA9IGktPmdldEtleSgpOworICAgICAgICBpbnQzMl90IGN1ckNvc3QgPSBpLT5nZXRDb3N0KCk7CisgICAgICAgIGludDMyX3QgY3VyUHJpb3JpdHkgPSBpLT5nZXRQcmlvcml0eSgpOworICAgICAgICBpbnQzMl90IGN1ck93bmVyID0gaS0+Z2V0T3duZXJJZCgpOworCisgICAgICAgIGJvb2wgY29uZmxpY3RpbmcgPSAoY3VyS2V5ID09IGtleSB8fCBpLT5pc0NvbmZsaWN0aW5nKGtleSkgfHwKKyAgICAgICAgICAgICAgICBjbGllbnQtPmlzQ29uZmxpY3RpbmcoY3VyS2V5KSk7CisKKyAgICAgICAgaWYgKCFyZXR1cm5JbmNvbXBhdGlibGVDbGllbnRzKSB7CisgICAgICAgICAgICAvLyBGaW5kIGV2aWN0ZWQgY2xpZW50cworCisgICAgICAgICAgICBpZiAoY29uZmxpY3RpbmcgJiYgY3VyUHJpb3JpdHkgPiBwcmlvcml0eSkgeworICAgICAgICAgICAgICAgIC8vIFByZS1leGlzdGluZyBjb25mbGljdGluZyBjbGllbnQgd2l0aCBoaWdoZXIgcHJpb3JpdHkgZXhpc3RzCisgICAgICAgICAgICAgICAgZXZpY3RMaXN0LmNsZWFyKCk7CisgICAgICAgICAgICAgICAgZXZpY3RMaXN0LnB1c2hfYmFjayhjbGllbnQpOworICAgICAgICAgICAgICAgIHJldHVybiBldmljdExpc3Q7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZsaWN0aW5nIHx8ICgodG90YWxDb3N0ID4gbU1heENvc3QgJiYgY3VyQ29zdCA+IDApICYmCisgICAgICAgICAgICAgICAgICAgIChjdXJQcmlvcml0eSA8PSBwcmlvcml0eSkgJiYKKyAgICAgICAgICAgICAgICAgICAgIShoaWdoZXN0UHJpb3JpdHlPd25lciA9PSBvd25lciAmJiBvd25lciA9PSBjdXJPd25lcikpKSB7CisgICAgICAgICAgICAgICAgLy8gQWRkIGEgcHJlLWV4aXN0aW5nIGNsaWVudCB0byB0aGUgZXZpY3Rpb24gbGlzdCBpZjoKKyAgICAgICAgICAgICAgICAvLyAtIFdlIGFyZSBhZGRpbmcgYSBjbGllbnQgd2l0aCBoaWdoZXIgcHJpb3JpdHkgdGhhdCBjb25mbGljdHMgd2l0aCB0aGlzIG9uZS4KKyAgICAgICAgICAgICAgICAvLyAtIFRoZSB0b3RhbCBjb3N0IGluY2x1ZGluZyB0aGUgaW5jb21pbmcgY2xpZW50J3MgaXMgbW9yZSB0aGFuIHRoZSBhbGxvd2FibGUKKyAgICAgICAgICAgICAgICAvLyAgIG1heGltdW0sIGFuZCB0aGUgY2xpZW50IGhhcyBhIG5vbi16ZXJvIGNvc3QsIGxvd2VyIHByaW9yaXR5LCBhbmQgYSBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICAvLyAgIG93bmVyIHRoYW4gdGhlIGluY29taW5nIGNsaWVudCB3aGVuIHRoZSBpbmNvbWluZyBjbGllbnQgaGFzIHRoZQorICAgICAgICAgICAgICAgIC8vICAgaGlnaGVzdCBwcmlvcml0eS4KKyAgICAgICAgICAgICAgICBldmljdExpc3QucHVzaF9iYWNrKGkpOworICAgICAgICAgICAgICAgIHRvdGFsQ29zdCAtPSBjdXJDb3N0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRmluZCBjbGllbnRzIHByZXZlbnRpbmcgdGhlIGluY29taW5nIGNsaWVudCBmcm9tIGJlaW5nIGFkZGVkCisKKyAgICAgICAgICAgIGlmIChjdXJQcmlvcml0eSA+IHByaW9yaXR5ICYmIChjb25mbGljdGluZyB8fCAodG90YWxDb3N0ID4gbU1heENvc3QgJiYgY3VyQ29zdCA+IDApKSkgeworICAgICAgICAgICAgICAgIC8vIFByZS1leGlzdGluZyBjb25mbGljdGluZyBjbGllbnQgd2l0aCBoaWdoZXIgcHJpb3JpdHkgZXhpc3RzCisgICAgICAgICAgICAgICAgZXZpY3RMaXN0LnB1c2hfYmFjayhpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEltbWVkaWF0ZWx5IHJldHVybiB0aGUgaW5jb21wYXRpYmxlIGNsaWVudHMgaWYgd2UgYXJlIGNhbGN1bGF0aW5nIHRoZXNlIGluc3RlYWQKKyAgICBpZiAocmV0dXJuSW5jb21wYXRpYmxlQ2xpZW50cykgeworICAgICAgICByZXR1cm4gZXZpY3RMaXN0OworICAgIH0KKworICAgIC8vIElmIHRoZSB0b3RhbCBjb3N0IGlzIHRvbyBoaWdoLCByZXR1cm4gdGhlIGlucHV0IHVubGVzcyB0aGUgaW5wdXQgaGFzIHRoZSBoaWdoZXN0IHByaW9yaXR5CisgICAgaWYgKHRvdGFsQ29zdCA+IG1NYXhDb3N0ICYmIGhpZ2hlc3RQcmlvcml0eU93bmVyICE9IG93bmVyKSB7CisgICAgICAgIGV2aWN0TGlzdC5jbGVhcigpOworICAgICAgICBldmljdExpc3QucHVzaF9iYWNrKGNsaWVudCk7CisgICAgICAgIHJldHVybiBldmljdExpc3Q7CisgICAgfQorCisgICAgcmV0dXJuIGV2aWN0TGlzdDsKKworfQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFLCBjbGFzcyBMSVNURU5FUj4KK3N0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+Pj4KK0NsaWVudE1hbmFnZXI8S0VZLCBWQUxVRSwgTElTVEVORVI+OjphZGRBbmRFdmljdCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+JiBjbGllbnQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgYXV0byBldmljdGVkID0gd291bGRFdmljdExvY2tlZChjbGllbnQpOworICAgIGF1dG8gaXQgPSBldmljdGVkLmJlZ2luKCk7CisgICAgaWYgKGl0ICE9IGV2aWN0ZWQuZW5kKCkgJiYgKml0ID09IGNsaWVudCkgeworICAgICAgICByZXR1cm4gZXZpY3RlZDsKKyAgICB9CisKKyAgICBhdXRvIGl0ZXIgPSBldmljdGVkLmNiZWdpbigpOworCisgICAgaWYgKGl0ZXIgIT0gZXZpY3RlZC5jZW5kKCkpIHsKKworICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGxwdHIpIG1MaXN0ZW5lci0+b25DbGllbnRSZW1vdmVkKCoqaXRlcik7CisKKyAgICAgICAgLy8gUmVtb3ZlIGV2aWN0ZWQgY2xpZW50cyBmcm9tIGxpc3QKKyAgICAgICAgbUNsaWVudHMuZXJhc2Uoc3RkOjpyZW1vdmVfaWYobUNsaWVudHMuYmVnaW4oKSwgbUNsaWVudHMuZW5kKCksCisgICAgICAgICAgICBbJml0ZXJdIChzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4mIGN1ckNsaWVudFB0cikgeworICAgICAgICAgICAgICAgIGlmIChjdXJDbGllbnRQdHItPmdldEtleSgpID09ICgqaXRlciktPmdldEtleSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGl0ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0pLCBtQ2xpZW50cy5lbmQoKSk7CisgICAgfQorCisgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxscHRyKSBtTGlzdGVuZXItPm9uQ2xpZW50QWRkZWQoKmNsaWVudCk7CisgICAgbUNsaWVudHMucHVzaF9iYWNrKGNsaWVudCk7CisgICAgbVJlbW92ZWRDb25kaXRpb24uYnJvYWRjYXN0KCk7CisKKyAgICByZXR1cm4gZXZpY3RlZDsKK30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRSwgY2xhc3MgTElTVEVORVI+CitzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4+CitDbGllbnRNYW5hZ2VyPEtFWSwgVkFMVUUsIExJU1RFTkVSPjo6Z2V0QWxsKCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbUNsaWVudHM7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUUsIGNsYXNzIExJU1RFTkVSPgorc3RkOjp2ZWN0b3I8S0VZPiBDbGllbnRNYW5hZ2VyPEtFWSwgVkFMVUUsIExJU1RFTkVSPjo6Z2V0QWxsS2V5cygpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgc3RkOjp2ZWN0b3I8S0VZPiBrZXlzKG1DbGllbnRzLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBpIDogbUNsaWVudHMpIHsKKyAgICAgICAga2V5cy5wdXNoX2JhY2soaS0+Z2V0S2V5KCkpOworICAgIH0KKyAgICByZXR1cm4ga2V5czsKK30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRSwgY2xhc3MgTElTVEVORVI+CitzdGQ6OnZlY3RvcjxpbnQzMl90PiBDbGllbnRNYW5hZ2VyPEtFWSwgVkFMVUUsIExJU1RFTkVSPjo6Z2V0QWxsT3duZXJzKCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBzdGQ6OnNldDxpbnQzMl90PiBvd25lcnM7CisgICAgZm9yIChjb25zdCBhdXRvJiBpIDogbUNsaWVudHMpIHsKKyAgICAgICAgb3duZXJzLmVtcGxhY2UoaS0+Z2V0T3duZXJJZCgpKTsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPGludDMyX3Q+KG93bmVycy5iZWdpbigpLCBvd25lcnMuZW5kKCkpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFLCBjbGFzcyBMSVNURU5FUj4KK3ZvaWQgQ2xpZW50TWFuYWdlcjxLRVksIFZBTFVFLCBMSVNURU5FUj46OnVwZGF0ZVByaW9yaXRpZXMoCisgICAgICAgIGNvbnN0IHN0ZDo6bWFwPGludDMyX3QsaW50MzJfdD4mIG93bmVyUHJpb3JpdHlMaXN0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGZvciAoYXV0byYgaSA6IG1DbGllbnRzKSB7CisgICAgICAgIGF1dG8gaiA9IG93bmVyUHJpb3JpdHlMaXN0LmZpbmQoaS0+Z2V0T3duZXJJZCgpKTsKKyAgICAgICAgaWYgKGogIT0gb3duZXJQcmlvcml0eUxpc3QuZW5kKCkpIHsKKyAgICAgICAgICAgIGktPnNldFByaW9yaXR5KGotPnNlY29uZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUUsIGNsYXNzIExJU1RFTkVSPgorc3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+IENsaWVudE1hbmFnZXI8S0VZLCBWQUxVRSwgTElTVEVORVI+OjpnZXQoCisgICAgICAgIGNvbnN0IEtFWSYga2V5KSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGZvciAoY29uc3QgYXV0byYgaSA6IG1DbGllbnRzKSB7CisgICAgICAgIGlmIChpLT5nZXRLZXkoKSA9PSBrZXkpIHJldHVybiBpOworICAgIH0KKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT4+KG51bGxwdHIpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFLCBjbGFzcyBMSVNURU5FUj4KK3ZvaWQgQ2xpZW50TWFuYWdlcjxLRVksIFZBTFVFLCBMSVNURU5FUj46OnJlbW92ZUFsbCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxscHRyKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgaSA6IG1DbGllbnRzKSB7CisgICAgICAgICAgICBtTGlzdGVuZXItPm9uQ2xpZW50UmVtb3ZlZCgqaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUNsaWVudHMuY2xlYXIoKTsKKyAgICBtUmVtb3ZlZENvbmRpdGlvbi5icm9hZGNhc3QoKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRSwgY2xhc3MgTElTVEVORVI+CitzdGQ6OnNoYXJlZF9wdHI8Q2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPj4gQ2xpZW50TWFuYWdlcjxLRVksIFZBTFVFLCBMSVNURU5FUj46OnJlbW92ZSgKKyAgICBjb25zdCBLRVkmIGtleSkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+PiByZXQ7CisKKyAgICAvLyBSZW1vdmUgZXZpY3RlZCBjbGllbnRzIGZyb20gbGlzdAorICAgIG1DbGllbnRzLmVyYXNlKHN0ZDo6cmVtb3ZlX2lmKG1DbGllbnRzLmJlZ2luKCksIG1DbGllbnRzLmVuZCgpLAorICAgICAgICBbdGhpcywgJmtleSwgJnJldF0gKHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+PiYgY3VyQ2xpZW50UHRyKSB7CisgICAgICAgICAgICBpZiAoY3VyQ2xpZW50UHRyLT5nZXRLZXkoKSA9PSBrZXkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGxwdHIpIG1MaXN0ZW5lci0+b25DbGllbnRSZW1vdmVkKCpjdXJDbGllbnRQdHIpOworICAgICAgICAgICAgICAgIHJldCA9IGN1ckNsaWVudFB0cjsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSksIG1DbGllbnRzLmVuZCgpKTsKKworICAgIG1SZW1vdmVkQ29uZGl0aW9uLmJyb2FkY2FzdCgpOworICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUUsIGNsYXNzIExJU1RFTkVSPgorc3RhdHVzX3QgQ2xpZW50TWFuYWdlcjxLRVksIFZBTFVFLCBMSVNURU5FUj46OndhaXRVbnRpbFJlbW92ZWQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+PiBjbGllbnQsCisgICAgICAgIG5zZWNzX3QgdGltZW91dCkgY29uc3QgeworICAgIHN0YXR1c190IHJldCA9IE5PX0VSUk9SOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKworICAgIGJvb2wgaXNSZW1vdmVkID0gZmFsc2U7CisKKyAgICAvLyBGaWd1cmUgb3V0IHdoYXQgdGltZSBpbiB0aGUgZnV0dXJlIHdlIHNob3VsZCBoaXQgdGhlIHRpbWVvdXQKKyAgICBuc2Vjc190IGZhaWxUaW1lID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpICsgdGltZW91dDsKKworICAgIHdoaWxlICghaXNSZW1vdmVkKSB7CisgICAgICAgIGlzUmVtb3ZlZCA9IHRydWU7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgaSA6IG1DbGllbnRzKSB7CisgICAgICAgICAgICBpZiAoaSA9PSBjbGllbnQpIHsKKyAgICAgICAgICAgICAgICBpc1JlbW92ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghaXNSZW1vdmVkKSB7CisgICAgICAgICAgICByZXQgPSBtUmVtb3ZlZENvbmRpdGlvbi53YWl0UmVsYXRpdmUobUxvY2ssIHRpbWVvdXQpOworICAgICAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGltZW91dCA9IGZhaWxUaW1lIC0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRSwgY2xhc3MgTElTVEVORVI+Cit2b2lkIENsaWVudE1hbmFnZXI8S0VZLCBWQUxVRSwgTElTVEVORVI+OjpzZXRMaXN0ZW5lcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TElTVEVORVI+JiBsaXN0ZW5lcikgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKK30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRSwgY2xhc3MgTElTVEVORVI+Cit2b2lkIENsaWVudE1hbmFnZXI8S0VZLCBWQUxVRSwgTElTVEVORVI+OjpyZW1vdmUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+PiYgdmFsdWUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgLy8gUmVtb3ZlIGV2aWN0ZWQgY2xpZW50cyBmcm9tIGxpc3QKKyAgICBtQ2xpZW50cy5lcmFzZShzdGQ6OnJlbW92ZV9pZihtQ2xpZW50cy5iZWdpbigpLCBtQ2xpZW50cy5lbmQoKSwKKyAgICAgICAgW3RoaXMsICZ2YWx1ZV0gKHN0ZDo6c2hhcmVkX3B0cjxDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+PiYgY3VyQ2xpZW50UHRyKSB7CisgICAgICAgICAgICBpZiAoY3VyQ2xpZW50UHRyID09IHZhbHVlKSB7CisgICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxscHRyKSBtTGlzdGVuZXItPm9uQ2xpZW50UmVtb3ZlZCgqY3VyQ2xpZW50UHRyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSksIG1DbGllbnRzLmVuZCgpKTsKKyAgICBtUmVtb3ZlZENvbmRpdGlvbi5icm9hZGNhc3QoKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRSwgY2xhc3MgTElTVEVORVI+CitpbnQ2NF90IENsaWVudE1hbmFnZXI8S0VZLCBWQUxVRSwgTElTVEVORVI+OjpnZXRDdXJyZW50Q29zdExvY2tlZCgpIGNvbnN0IHsKKyAgICBpbnQ2NF90IHRvdGFsQ29zdCA9IDA7CisgICAgZm9yIChjb25zdCBhdXRvJiB4IDogbUNsaWVudHMpIHsKKyAgICAgICAgICAgIHRvdGFsQ29zdCArPSB4LT5nZXRDb3N0KCk7CisgICAgfQorICAgIHJldHVybiB0b3RhbENvc3Q7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK307IC8vIG5hbWVzcGFjZSByZXNvdXJjZV9wb2xpY3kKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX1NFUlZJQ0VfVVRJTFNfRVZJQ1RJT05fUE9MSUNZX01BTkFHRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQubWsKaW5kZXggOTVmMmZlZi4uMDM0MzhiZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLm1rCkBAIC0xMCw0ICsxMCw2IEBACiAKIExPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKIAorTE9DQUxfQ19JTkNMVURFUyA6PSAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCisKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MjIzMGYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjEgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmNwcCBTZXJ2aWNlTG9nLmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYm1lZGlhIGxpYnN0YWdlZnJpZ2h0IGxpYmJpbmRlciBsaWJ1dGlscyBsaWJsb2cKKworTE9DQUxfTU9EVUxFOj0gbGlicmVzb3VyY2VtYW5hZ2Vyc2VydmljZQorCitMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoVE9QRElSKWZyYW1ld29ya3MvYXYvaW5jbHVkZQorCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc5MDc1NAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwCkBAIC0wLDAgKzEsNDY1IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlJlc291cmNlTWFuYWdlclNlcnZpY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUHJvY2Vzc0luZm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgiCisjaW5jbHVkZSAiU2VydmljZUxvZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIFN0cmluZzggZ2V0U3RyaW5nKGNvbnN0IFZlY3RvcjxUPiAmaXRlbXMpIHsKKyAgICBTdHJpbmc4IGl0ZW1zU3RyOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaXRlbXNTdHIuYXBwZW5kRm9ybWF0KCIlcyAiLCBpdGVtc1tpXS50b1N0cmluZygpLnN0cmluZygpKTsKKyAgICB9CisgICAgcmV0dXJuIGl0ZW1zU3RyOworfQorCitzdGF0aWMgYm9vbCBoYXNSZXNvdXJjZVR5cGUoU3RyaW5nOCB0eXBlLCBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKHJlc291cmNlc1tpXS5tVHlwZSA9PSB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGhhc1Jlc291cmNlVHlwZShTdHJpbmc4IHR5cGUsIFJlc291cmNlSW5mb3MgaW5mb3MpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluZm9zLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChoYXNSZXNvdXJjZVR5cGUodHlwZSwgaW5mb3NbaV0ucmVzb3VyY2VzKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgUmVzb3VyY2VJbmZvcyYgZ2V0UmVzb3VyY2VJbmZvc0ZvckVkaXQoCisgICAgICAgIGludCBwaWQsCisgICAgICAgIFBpZFJlc291cmNlSW5mb3NNYXAmIG1hcCkgeworICAgIHNzaXplX3QgaW5kZXggPSBtYXAuaW5kZXhPZktleShwaWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgLy8gbmV3IHBpZAorICAgICAgICBSZXNvdXJjZUluZm9zIGluZm9zRm9yUGlkOworICAgICAgICBtYXAuYWRkKHBpZCwgaW5mb3NGb3JQaWQpOworICAgIH0KKworICAgIHJldHVybiBtYXAuZWRpdFZhbHVlRm9yKHBpZCk7Cit9CisKK3N0YXRpYyBSZXNvdXJjZUluZm8mIGdldFJlc291cmNlSW5mb0ZvckVkaXQoCisgICAgICAgIGludDY0X3QgY2xpZW50SWQsCisgICAgICAgIGNvbnN0IHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudCwKKyAgICAgICAgUmVzb3VyY2VJbmZvcyYgaW5mb3MpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluZm9zLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChpbmZvc1tpXS5jbGllbnRJZCA9PSBjbGllbnRJZCkgeworICAgICAgICAgICAgcmV0dXJuIGluZm9zLmVkaXRJdGVtQXQoaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgUmVzb3VyY2VJbmZvIGluZm87CisgICAgaW5mby5jbGllbnRJZCA9IGNsaWVudElkOworICAgIGluZm8uY2xpZW50ID0gY2xpZW50OworICAgIGluZm9zLnB1c2hfYmFjayhpbmZvKTsKKyAgICByZXR1cm4gaW5mb3MuZWRpdEl0ZW1BdChpbmZvcy5zaXplKCkgLSAxKTsKK30KKworc3RhdHVzX3QgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qIGFyZ3MgKi8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKKworICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpKSA9PSBmYWxzZSkgeworICAgICAgICByZXN1bHQuZm9ybWF0KCJQZXJtaXNzaW9uIERlbmlhbDogIgorICAgICAgICAgICAgICAgICJjYW4ndCBkdW1wIFJlc291cmNlTWFuYWdlclNlcnZpY2UgZnJvbSBwaWQ9JWQsIHVpZD0lZFxuIiwKKyAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKKyAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOiAlcFxuIiwgdGhpcyk7CisgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIHJlc3VsdC5hcHBlbmQoIiAgUG9saWNpZXM6XG4iKTsKKyAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgU3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjczogJWRcbiIsIG1TdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIFN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjOiAlZFxuIiwgbVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjKTsKKyAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICByZXN1bHQuYXBwZW5kKCIgIFByb2Nlc3NlczpcbiIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1hcC5zaXplKCk7ICsraSkgeworICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgUGlkOiAlZFxuIiwgbU1hcC5rZXlBdChpKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgICAgICBjb25zdCBSZXNvdXJjZUluZm9zICZpbmZvcyA9IG1NYXAudmFsdWVBdChpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpbmZvcy5zaXplKCk7ICsraikgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgICAgQ2xpZW50OlxuIik7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgICAgIElkOiAlbGxkXG4iLCAobG9uZyBsb25nKWluZm9zW2pdLmNsaWVudElkKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKworICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICAgICBOYW1lOiAlc1xuIiwgaW5mb3Nbal0uY2xpZW50LT5nZXROYW1lKCkuc3RyaW5nKCkpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgICAgICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzID0gaW5mb3Nbal0ucmVzb3VyY2VzOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgICAgICBSZXNvdXJjZXM6XG4iKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgcmVzb3VyY2VzLnNpemUoKTsgKytrKSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICAgICAgICVzXG4iLCByZXNvdXJjZXNba10udG9TdHJpbmcoKS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJlc3VsdC5hcHBlbmQoIiAgRXZlbnRzIGxvZ3MgKG1vc3QgcmVjZW50IGF0IHRvcCk6XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kKG1TZXJ2aWNlTG9nLT50b1N0cmluZygiICAgICIgLyogbGluZVByZWZpeCAqLykpOworCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgcmV0dXJuIE9LOworfQorCitSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKCkKKyAgICA6IG1Qcm9jZXNzSW5mbyhuZXcgUHJvY2Vzc0luZm8oKSksCisgICAgICBtU2VydmljZUxvZyhuZXcgU2VydmljZUxvZygpKSwKKyAgICAgIG1TdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzKHRydWUpLAorICAgICAgbVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjKHRydWUpIHt9CisKK1Jlc291cmNlTWFuYWdlclNlcnZpY2U6OlJlc291cmNlTWFuYWdlclNlcnZpY2Uoc3A8UHJvY2Vzc0luZm9JbnRlcmZhY2U+IHByb2Nlc3NJbmZvKQorICAgIDogbVByb2Nlc3NJbmZvKHByb2Nlc3NJbmZvKSwKKyAgICAgIG1TZXJ2aWNlTG9nKG5ldyBTZXJ2aWNlTG9nKCkpLAorICAgICAgbVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3ModHJ1ZSksCisgICAgICBtU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWModHJ1ZSkge30KKworUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6flJlc291cmNlTWFuYWdlclNlcnZpY2UoKSB7fQorCit2b2lkIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmNvbmZpZyhjb25zdCBWZWN0b3I8TWVkaWFSZXNvdXJjZVBvbGljeT4gJnBvbGljaWVzKSB7CisgICAgU3RyaW5nOCBsb2cgPSBTdHJpbmc4Ojpmb3JtYXQoImNvbmZpZyglcykiLCBnZXRTdHJpbmcocG9saWNpZXMpLnN0cmluZygpKTsKKyAgICBtU2VydmljZUxvZy0+YWRkKGxvZyk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwb2xpY2llcy5zaXplKCk7ICsraSkgeworICAgICAgICBTdHJpbmc4IHR5cGUgPSBwb2xpY2llc1tpXS5tVHlwZTsKKyAgICAgICAgU3RyaW5nOCB2YWx1ZSA9IHBvbGljaWVzW2ldLm1WYWx1ZTsKKyAgICAgICAgaWYgKHR5cGUgPT0ga1BvbGljeVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3MpIHsKKyAgICAgICAgICAgIG1TdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzID0gKHZhbHVlID09ICJ0cnVlIik7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBrUG9saWN5U3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMpIHsKKyAgICAgICAgICAgIG1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyA9ICh2YWx1ZSA9PSAidHJ1ZSIpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OmFkZFJlc291cmNlKAorICAgICAgICBpbnQgcGlkLAorICAgICAgICBpbnQ2NF90IGNsaWVudElkLAorICAgICAgICBjb25zdCBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnQsCisgICAgICAgIGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiAmcmVzb3VyY2VzKSB7CisgICAgU3RyaW5nOCBsb2cgPSBTdHJpbmc4Ojpmb3JtYXQoImFkZFJlc291cmNlKHBpZCAlZCwgY2xpZW50SWQgJWxsZCwgcmVzb3VyY2VzICVzKSIsCisgICAgICAgICAgICBwaWQsIChsb25nIGxvbmcpIGNsaWVudElkLCBnZXRTdHJpbmcocmVzb3VyY2VzKS5zdHJpbmcoKSk7CisgICAgbVNlcnZpY2VMb2ctPmFkZChsb2cpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIFJlc291cmNlSW5mb3MmIGluZm9zID0gZ2V0UmVzb3VyY2VJbmZvc0ZvckVkaXQocGlkLCBtTWFwKTsKKyAgICBSZXNvdXJjZUluZm8mIGluZm8gPSBnZXRSZXNvdXJjZUluZm9Gb3JFZGl0KGNsaWVudElkLCBjbGllbnQsIGluZm9zKTsKKyAgICAvLyBUT0RPOiBkbyB0aGUgbWVyZ2UgaW5zdGVhZCBvZiBhcHBlbmQuCisgICAgaW5mby5yZXNvdXJjZXMuYXBwZW5kVmVjdG9yKHJlc291cmNlcyk7Cit9CisKK3ZvaWQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6cmVtb3ZlUmVzb3VyY2UoaW50IHBpZCwgaW50NjRfdCBjbGllbnRJZCkgeworICAgIFN0cmluZzggbG9nID0gU3RyaW5nODo6Zm9ybWF0KAorICAgICAgICAgICAgInJlbW92ZVJlc291cmNlKHBpZCAlZCwgY2xpZW50SWQgJWxsZCkiLAorICAgICAgICAgICAgcGlkLCAobG9uZyBsb25nKSBjbGllbnRJZCk7CisgICAgbVNlcnZpY2VMb2ctPmFkZChsb2cpOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIHNzaXplX3QgaW5kZXggPSBtTWFwLmluZGV4T2ZLZXkocGlkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dWKCJyZW1vdmVSZXNvdXJjZTogZGlkbid0IGZpbmQgcGlkICVkIGZvciBjbGllbnRJZCAlbGxkIiwgcGlkLCAobG9uZyBsb25nKSBjbGllbnRJZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIFJlc291cmNlSW5mb3MgJmluZm9zID0gbU1hcC5lZGl0VmFsdWVBdChpbmRleCk7CisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpbmZvcy5zaXplKCk7ICsraikgeworICAgICAgICBpZiAoaW5mb3Nbal0uY2xpZW50SWQgPT0gY2xpZW50SWQpIHsKKyAgICAgICAgICAgIGogPSBpbmZvcy5yZW1vdmVBdChqKTsKKyAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgQUxPR1YoImRpZG4ndCBmaW5kIGNsaWVudCIpOworICAgIH0KK30KKwordm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRDbGllbnRGb3JSZXNvdXJjZV9sKAorICAgICAgICBpbnQgY2FsbGluZ1BpZCwgY29uc3QgTWVkaWFSZXNvdXJjZSAqcmVzLCBWZWN0b3I8c3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4+ICpjbGllbnRzKSB7CisgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50OworICAgIGlmIChnZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnRfbChjYWxsaW5nUGlkLCByZXMtPm1UeXBlLCAmY2xpZW50KSkgeworICAgICAgICBjbGllbnRzLT5wdXNoX2JhY2soY2xpZW50KTsKKyAgICB9Cit9CisKK2Jvb2wgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6cmVjbGFpbVJlc291cmNlKAorICAgICAgICBpbnQgY2FsbGluZ1BpZCwgY29uc3QgVmVjdG9yPE1lZGlhUmVzb3VyY2U+ICZyZXNvdXJjZXMpIHsKKyAgICBTdHJpbmc4IGxvZyA9IFN0cmluZzg6OmZvcm1hdCgicmVjbGFpbVJlc291cmNlKGNhbGxpbmdQaWQgJWQsIHJlc291cmNlcyAlcykiLAorICAgICAgICAgICAgY2FsbGluZ1BpZCwgZ2V0U3RyaW5nKHJlc291cmNlcykuc3RyaW5nKCkpOworICAgIG1TZXJ2aWNlTG9nLT5hZGQobG9nKTsKKworICAgIFZlY3RvcjxzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Pj4gY2xpZW50czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICAgICAgY29uc3QgTWVkaWFSZXNvdXJjZSAqc2VjdXJlQ29kZWMgPSBOVUxMOworICAgICAgICBjb25zdCBNZWRpYVJlc291cmNlICpub25TZWN1cmVDb2RlYyA9IE5VTEw7CisgICAgICAgIGNvbnN0IE1lZGlhUmVzb3VyY2UgKmdyYXBoaWNNZW1vcnkgPSBOVUxMOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgU3RyaW5nOCB0eXBlID0gcmVzb3VyY2VzW2ldLm1UeXBlOworICAgICAgICAgICAgaWYgKHJlc291cmNlc1tpXS5tVHlwZSA9PSBrUmVzb3VyY2VTZWN1cmVDb2RlYykgeworICAgICAgICAgICAgICAgIHNlY3VyZUNvZGVjID0gJnJlc291cmNlc1tpXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBrUmVzb3VyY2VOb25TZWN1cmVDb2RlYykgeworICAgICAgICAgICAgICAgIG5vblNlY3VyZUNvZGVjID0gJnJlc291cmNlc1tpXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBrUmVzb3VyY2VHcmFwaGljTWVtb3J5KSB7CisgICAgICAgICAgICAgICAgZ3JhcGhpY01lbW9yeSA9ICZyZXNvdXJjZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBmaXJzdCBwYXNzIHRvIGhhbmRsZSBzZWN1cmUvbm9uLXNlY3VyZSBjb2RlYyBjb25mbGljdAorICAgICAgICBpZiAoc2VjdXJlQ29kZWMgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFtU3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcykgeworICAgICAgICAgICAgICAgIGlmICghZ2V0QWxsQ2xpZW50c19sKGNhbGxpbmdQaWQsIFN0cmluZzgoa1Jlc291cmNlU2VjdXJlQ29kZWMpLCAmY2xpZW50cykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjKSB7CisgICAgICAgICAgICAgICAgaWYgKCFnZXRBbGxDbGllbnRzX2woY2FsbGluZ1BpZCwgU3RyaW5nOChrUmVzb3VyY2VOb25TZWN1cmVDb2RlYyksICZjbGllbnRzKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChub25TZWN1cmVDb2RlYyAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIW1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYykgeworICAgICAgICAgICAgICAgIGlmICghZ2V0QWxsQ2xpZW50c19sKGNhbGxpbmdQaWQsIFN0cmluZzgoa1Jlc291cmNlU2VjdXJlQ29kZWMpLCAmY2xpZW50cykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbGllbnRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBpZiBubyBzZWN1cmUvbm9uLXNlY3VyZSBjb2RlYyBjb25mbGljdCwgcnVuIHNlY29uZCBwYXNzIHRvIGhhbmRsZSBvdGhlciByZXNvdXJjZXMuCisgICAgICAgICAgICBnZXRDbGllbnRGb3JSZXNvdXJjZV9sKGNhbGxpbmdQaWQsIGdyYXBoaWNNZW1vcnksICZjbGllbnRzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbGllbnRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgaGVyZSwgcnVuIHRoZSB0aGlyZCBwYXNzIHRvIGZyZWUgb25lIGNvZGVjIHdpdGggdGhlIHNhbWUgdHlwZS4KKyAgICAgICAgICAgIGdldENsaWVudEZvclJlc291cmNlX2woY2FsbGluZ1BpZCwgc2VjdXJlQ29kZWMsICZjbGllbnRzKTsKKyAgICAgICAgICAgIGdldENsaWVudEZvclJlc291cmNlX2woY2FsbGluZ1BpZCwgbm9uU2VjdXJlQ29kZWMsICZjbGllbnRzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbGllbnRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgaGVyZSwgcnVuIHRoZSBmb3VydGggcGFzcyB0byBmcmVlIG9uZSBjb2RlYyB3aXRoIHRoZSBkaWZmZXJlbnQgdHlwZS4KKyAgICAgICAgICAgIGlmIChzZWN1cmVDb2RlYyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZSB0ZW1wKFN0cmluZzgoa1Jlc291cmNlTm9uU2VjdXJlQ29kZWMpLCAxKTsKKyAgICAgICAgICAgICAgICBnZXRDbGllbnRGb3JSZXNvdXJjZV9sKGNhbGxpbmdQaWQsICZ0ZW1wLCAmY2xpZW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobm9uU2VjdXJlQ29kZWMgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2UgdGVtcChTdHJpbmc4KGtSZXNvdXJjZVNlY3VyZUNvZGVjKSwgMSk7CisgICAgICAgICAgICAgICAgZ2V0Q2xpZW50Rm9yUmVzb3VyY2VfbChjYWxsaW5nUGlkLCAmdGVtcCwgJmNsaWVudHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNsaWVudHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGZhaWxlZENsaWVudDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNsaWVudHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgbG9nID0gU3RyaW5nODo6Zm9ybWF0KCJyZWNsYWltUmVzb3VyY2UgZnJvbSBjbGllbnQgJXAiLCBjbGllbnRzW2ldLmdldCgpKTsKKyAgICAgICAgbVNlcnZpY2VMb2ctPmFkZChsb2cpOworICAgICAgICBpZiAoIWNsaWVudHNbaV0tPnJlY2xhaW1SZXNvdXJjZSgpKSB7CisgICAgICAgICAgICBmYWlsZWRDbGllbnQgPSBjbGllbnRzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NYXAuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIFJlc291cmNlSW5mb3MgJmluZm9zID0gbU1hcC5lZGl0VmFsdWVBdChpKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5mb3Muc2l6ZSgpOykgeworICAgICAgICAgICAgICAgIGlmIChpbmZvc1tqXS5jbGllbnQgPT0gZmFpbGVkQ2xpZW50KSB7CisgICAgICAgICAgICAgICAgICAgIGogPSBpbmZvcy5yZW1vdmVBdChqKTsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICsrajsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICBBTE9HVigiZGlkbid0IGZpbmQgZmFpbGVkIGNsaWVudCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChmYWlsZWRDbGllbnQgPT0gTlVMTCk7Cit9CisKK2Jvb2wgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6Z2V0QWxsQ2xpZW50c19sKAorICAgICAgICBpbnQgY2FsbGluZ1BpZCwgY29uc3QgU3RyaW5nOCAmdHlwZSwgVmVjdG9yPHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+PiAqY2xpZW50cykgeworICAgIFZlY3RvcjxzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Pj4gdGVtcDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NYXAuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUmVzb3VyY2VJbmZvcyAmaW5mb3MgPSBtTWFwLmVkaXRWYWx1ZUF0KGkpOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGluZm9zLnNpemUoKTsgKytqKSB7CisgICAgICAgICAgICBpZiAoaGFzUmVzb3VyY2VUeXBlKHR5cGUsIGluZm9zW2pdLnJlc291cmNlcykpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzQ2FsbGluZ1ByaW9yaXR5SGlnaGVyX2woY2FsbGluZ1BpZCwgbU1hcC5rZXlBdChpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc29tZSBoaWdoZXIvZXF1YWwgcHJpb3JpdHkgcHJvY2VzcyBvd25zIHRoZSByZXNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyByZXF1ZXN0IGNhbid0IGJlIGZ1bGZpbGxlZC4KKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImdldEFsbENsaWVudHNfbDogY2FuJ3QgcmVjbGFpbSByZXNvdXJjZSAlcyBmcm9tIHBpZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5zdHJpbmcoKSwgbU1hcC5rZXlBdChpKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGVtcC5wdXNoX2JhY2soaW5mb3Nbal0uY2xpZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodGVtcC5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HVigiZ2V0QWxsQ2xpZW50c19sOiBkaWRuJ3QgZmluZCBhbnkgcmVzb3VyY2UgJXMiLCB0eXBlLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNsaWVudHMtPmFwcGVuZFZlY3Rvcih0ZW1wKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnRfbCgKKyAgICAgICAgaW50IGNhbGxpbmdQaWQsIGNvbnN0IFN0cmluZzggJnR5cGUsIHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+ICpjbGllbnQpIHsKKyAgICBpbnQgbG93ZXN0UHJpb3JpdHlQaWQ7CisgICAgaW50IGxvd2VzdFByaW9yaXR5OworICAgIGludCBjYWxsaW5nUHJpb3JpdHk7CisgICAgaWYgKCFtUHJvY2Vzc0luZm8tPmdldFByaW9yaXR5KGNhbGxpbmdQaWQsICZjYWxsaW5nUHJpb3JpdHkpKSB7CisgICAgICAgIEFMT0dFKCJnZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnRfbDogY2FuJ3QgZ2V0IHByb2Nlc3MgcHJpb3JpdHkgZm9yIHBpZCAlZCIsCisgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFnZXRMb3dlc3RQcmlvcml0eVBpZF9sKHR5cGUsICZsb3dlc3RQcmlvcml0eVBpZCwgJmxvd2VzdFByaW9yaXR5KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChsb3dlc3RQcmlvcml0eSA8PSBjYWxsaW5nUHJpb3JpdHkpIHsKKyAgICAgICAgQUxPR0UoImdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudF9sOiBsb3dlc3QgcHJpb3JpdHkgJWQgdnMgY2FsbGVyIHByaW9yaXR5ICVkIiwKKyAgICAgICAgICAgICAgICBsb3dlc3RQcmlvcml0eSwgY2FsbGluZ1ByaW9yaXR5KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghZ2V0QmlnZ2VzdENsaWVudF9sKGxvd2VzdFByaW9yaXR5UGlkLCB0eXBlLCBjbGllbnQpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6Z2V0TG93ZXN0UHJpb3JpdHlQaWRfbCgKKyAgICAgICAgY29uc3QgU3RyaW5nOCAmdHlwZSwgaW50ICpsb3dlc3RQcmlvcml0eVBpZCwgaW50ICpsb3dlc3RQcmlvcml0eSkgeworICAgIGludCBwaWQgPSAtMTsKKyAgICBpbnQgcHJpb3JpdHkgPSAtMTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NYXAuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKG1NYXAudmFsdWVBdChpKS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gbm8gY2xpZW50IG9uIHRoaXMgcHJvY2Vzcy4KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICghaGFzUmVzb3VyY2VUeXBlKHR5cGUsIG1NYXAudmFsdWVBdChpKSkpIHsKKyAgICAgICAgICAgIC8vIGRvZXNuJ3QgaGF2ZSB0aGUgcmVxdWVzdGVkIHJlc291cmNlIHR5cGUKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGludCB0ZW1wUGlkID0gbU1hcC5rZXlBdChpKTsKKyAgICAgICAgaW50IHRlbXBQcmlvcml0eTsKKyAgICAgICAgaWYgKCFtUHJvY2Vzc0luZm8tPmdldFByaW9yaXR5KHRlbXBQaWQsICZ0ZW1wUHJpb3JpdHkpKSB7CisgICAgICAgICAgICBBTE9HVigiZ2V0TG93ZXN0UHJpb3JpdHlQaWRfbDogY2FuJ3QgZ2V0IHByaW9yaXR5IG9mIHBpZCAlZCwgc2tpcHBlZCIsIHRlbXBQaWQpOworICAgICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgcGlkIGZyb20gbU1hcD8KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChwaWQgPT0gLTEgfHwgdGVtcFByaW9yaXR5ID4gcHJpb3JpdHkpIHsKKyAgICAgICAgICAgIC8vIGluaXRpYWwgdGhlIHZhbHVlCisgICAgICAgICAgICBwaWQgPSB0ZW1wUGlkOworICAgICAgICAgICAgcHJpb3JpdHkgPSB0ZW1wUHJpb3JpdHk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBpZCAhPSAtMSkgeworICAgICAgICAqbG93ZXN0UHJpb3JpdHlQaWQgPSBwaWQ7CisgICAgICAgICpsb3dlc3RQcmlvcml0eSA9IHByaW9yaXR5OworICAgIH0KKyAgICByZXR1cm4gKHBpZCAhPSAtMSk7Cit9CisKK2Jvb2wgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6aXNDYWxsaW5nUHJpb3JpdHlIaWdoZXJfbChpbnQgY2FsbGluZ1BpZCwgaW50IHBpZCkgeworICAgIGludCBjYWxsaW5nUGlkUHJpb3JpdHk7CisgICAgaWYgKCFtUHJvY2Vzc0luZm8tPmdldFByaW9yaXR5KGNhbGxpbmdQaWQsICZjYWxsaW5nUGlkUHJpb3JpdHkpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQgcHJpb3JpdHk7CisgICAgaWYgKCFtUHJvY2Vzc0luZm8tPmdldFByaW9yaXR5KHBpZCwgJnByaW9yaXR5KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIChjYWxsaW5nUGlkUHJpb3JpdHkgPCBwcmlvcml0eSk7Cit9CisKK2Jvb2wgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6Z2V0QmlnZ2VzdENsaWVudF9sKAorICAgICAgICBpbnQgcGlkLCBjb25zdCBTdHJpbmc4ICZ0eXBlLCBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiAqY2xpZW50KSB7CisgICAgc3NpemVfdCBpbmRleCA9IG1NYXAuaW5kZXhPZktleShwaWQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR0UoImdldEJpZ2dlc3RDbGllbnRfbDogY2FuJ3QgZmluZCByZXNvdXJjZSBpbmZvIGZvciBwaWQgJWQiLCBwaWQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50VGVtcDsKKyAgICB1aW50NjRfdCBsYXJnZXN0VmFsdWUgPSAwOworICAgIGNvbnN0IFJlc291cmNlSW5mb3MgJmluZm9zID0gbU1hcC52YWx1ZUF0KGluZGV4KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluZm9zLnNpemUoKTsgKytpKSB7CisgICAgICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXMgPSBpbmZvc1tpXS5yZXNvdXJjZXM7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcmVzb3VyY2VzLnNpemUoKTsgKytqKSB7CisgICAgICAgICAgICBpZiAocmVzb3VyY2VzW2pdLm1UeXBlID09IHR5cGUpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VzW2pdLm1WYWx1ZSA+IGxhcmdlc3RWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBsYXJnZXN0VmFsdWUgPSByZXNvdXJjZXNbal0ubVZhbHVlOworICAgICAgICAgICAgICAgICAgICBjbGllbnRUZW1wID0gaW5mb3NbaV0uY2xpZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjbGllbnRUZW1wID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImdldEJpZ2dlc3RDbGllbnRfbDogY2FuJ3QgZmluZCByZXNvdXJjZSB0eXBlICVzIGZvciBwaWQgJWQiLCB0eXBlLnN0cmluZygpLCBwaWQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgKmNsaWVudCA9IGNsaWVudFRlbXA7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzY5MzczCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oCkBAIC0wLDAgKzEsMTE4IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFORFJPSURfUkVTT1VSQ0VNQU5BR0VSU0VSVklDRV9ICisjZGVmaW5lIEFORFJPSURfUkVTT1VSQ0VNQU5BR0VSU0VSVklDRV9ICisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU2VydmljZUxvZzsKK3N0cnVjdCBQcm9jZXNzSW5mb0ludGVyZmFjZTsKKworc3RydWN0IFJlc291cmNlSW5mbyB7CisgICAgaW50NjRfdCBjbGllbnRJZDsKKyAgICBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnQ7CisgICAgVmVjdG9yPE1lZGlhUmVzb3VyY2U+IHJlc291cmNlczsKK307CisKK3R5cGVkZWYgVmVjdG9yPFJlc291cmNlSW5mbz4gUmVzb3VyY2VJbmZvczsKK3R5cGVkZWYgS2V5ZWRWZWN0b3I8aW50LCBSZXNvdXJjZUluZm9zPiBQaWRSZXNvdXJjZUluZm9zTWFwOworCitjbGFzcyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlCisgICAgOiBwdWJsaWMgQmluZGVyU2VydmljZTxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiwKKyAgICAgIHB1YmxpYyBCblJlc291cmNlTWFuYWdlclNlcnZpY2UKK3sKK3B1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBjb25zdCAqZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAibWVkaWEucmVzb3VyY2VfbWFuYWdlciI7IH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworCisgICAgUmVzb3VyY2VNYW5hZ2VyU2VydmljZSgpOworICAgIFJlc291cmNlTWFuYWdlclNlcnZpY2Uoc3A8UHJvY2Vzc0luZm9JbnRlcmZhY2U+IHByb2Nlc3NJbmZvKTsKKworICAgIC8vIElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIGludGVyZmFjZQorICAgIHZpcnR1YWwgdm9pZCBjb25maWcoY29uc3QgVmVjdG9yPE1lZGlhUmVzb3VyY2VQb2xpY3k+ICZwb2xpY2llcyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgYWRkUmVzb3VyY2UoCisgICAgICAgICAgICBpbnQgcGlkLAorICAgICAgICAgICAgaW50NjRfdCBjbGllbnRJZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiAmcmVzb3VyY2VzKTsKKworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVSZXNvdXJjZShpbnQgcGlkLCBpbnQ2NF90IGNsaWVudElkKTsKKworICAgIC8vIFRyaWVzIHRvIHJlY2xhaW0gcmVzb3VyY2UgZnJvbSBwcm9jZXNzZXMgd2l0aCBsb3dlciBwcmlvcml0eSB0aGFuIHRoZSBjYWxsaW5nIHByb2Nlc3MKKyAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIHJlcXVlc3RlZCByZXNvdXJjZXMuCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGFueSByZXNvdXJjZSBoYXMgYmVlbiByZWNsYWltZWQsIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgorICAgIHZpcnR1YWwgYm9vbCByZWNsYWltUmVzb3VyY2UoaW50IGNhbGxpbmdQaWQsIGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiAmcmVzb3VyY2VzKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflJlc291cmNlTWFuYWdlclNlcnZpY2UoKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3Q7CisKKyAgICAvLyBHZXRzIHRoZSBsaXN0IG9mIGFsbCB0aGUgY2xpZW50cyB3aG8gb3duIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgdHlwZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIGFueSBjbGllbnQgYmVsb25ncyB0byBhIHByb2Nlc3Mgd2l0aCBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGUKKyAgICAvLyBjYWxsaW5nIHByb2Nlc3MuIFRoZSBjbGllbnRzIHdpbGwgcmVtYWluIHVuY2hhbmdlZCBpZiByZXR1cm5zIGZhbHNlLgorICAgIGJvb2wgZ2V0QWxsQ2xpZW50c19sKGludCBjYWxsaW5nUGlkLCBjb25zdCBTdHJpbmc4ICZ0eXBlLAorICAgICAgICAgICAgVmVjdG9yPHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+PiAqY2xpZW50cyk7CisKKyAgICAvLyBHZXRzIHRoZSBjbGllbnQgd2hvIG93bnMgc3BlY2lmaWVkIHJlc291cmNlIHR5cGUgZnJvbSBsb3dlc3QgcG9zc2libGUgcHJpb3JpdHkgcHJvY2Vzcy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIHRoZSBjYWxsaW5nIHByb2Nlc3MgcHJpb3JpdHkgaXMgbm90IGhpZ2hlciB0aGFuIHRoZSBsb3dlc3QgcHJvY2VzcworICAgIC8vIHByaW9yaXR5LiBUaGUgY2xpZW50IHdpbGwgcmVtYWluIHVuY2hhbmdlZCBpZiByZXR1cm5zIGZhbHNlLgorICAgIGJvb2wgZ2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50X2woaW50IGNhbGxpbmdQaWQsIGNvbnN0IFN0cmluZzggJnR5cGUsCisgICAgICAgICAgICBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiAqY2xpZW50KTsKKworICAgIC8vIEdldHMgbG93ZXN0IHByaW9yaXR5IHByb2Nlc3MgdGhhdCBoYXMgdGhlIHNwZWNpZmllZCByZXNvdXJjZSB0eXBlLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgZmFpbGVkLiBUaGUgb3V0cHV0IHBhcmFtZXRlcnMgd2lsbCByZW1haW4gdW5jaGFuZ2VkIGlmIGZhaWxlZC4KKyAgICBib29sIGdldExvd2VzdFByaW9yaXR5UGlkX2woY29uc3QgU3RyaW5nOCAmdHlwZSwgaW50ICpwaWQsIGludCAqcHJpb3JpdHkpOworCisgICAgLy8gR2V0cyB0aGUgY2xpZW50IHdobyBvd25zIGJpZ2dlc3QgcGllY2Ugb2Ygc3BlY2lmaWVkIHJlc291cmNlIHR5cGUgZnJvbSBwaWQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBmYWlsZWQuIFRoZSBjbGllbnQgd2lsbCByZW1haW4gdW5jaGFuZ2VkIGlmIGZhaWxlZC4KKyAgICBib29sIGdldEJpZ2dlc3RDbGllbnRfbChpbnQgcGlkLCBjb25zdCBTdHJpbmc4ICZ0eXBlLCBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiAqY2xpZW50KTsKKworICAgIGJvb2wgaXNDYWxsaW5nUHJpb3JpdHlIaWdoZXJfbChpbnQgY2FsbGluZ1BpZCwgaW50IHBpZCk7CisKKyAgICAvLyBBIGhlbHBlciBmdW5jdGlvbiBiYXNpY2FsbHkgY2FsbHMgZ2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50X2wgYW5kIGFkZCB0aGUgcmVzdWx0IGNsaWVudAorICAgIC8vIHRvIHRoZSBnaXZlbiBWZWN0b3IuCisgICAgdm9pZCBnZXRDbGllbnRGb3JSZXNvdXJjZV9sKAorICAgICAgICBpbnQgY2FsbGluZ1BpZCwgY29uc3QgTWVkaWFSZXNvdXJjZSAqcmVzLCBWZWN0b3I8c3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4+ICpjbGllbnRzKTsKKworICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CisgICAgc3A8UHJvY2Vzc0luZm9JbnRlcmZhY2U+IG1Qcm9jZXNzSW5mbzsKKyAgICBzcDxTZXJ2aWNlTG9nPiBtU2VydmljZUxvZzsKKyAgICBQaWRSZXNvdXJjZUluZm9zTWFwIG1NYXA7CisgICAgYm9vbCBtU3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjczsKKyAgICBib29sIG1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYzsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfUkVTT1VSQ0VNQU5BR0VSU0VSVklDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9TZXJ2aWNlTG9nLmNwcCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1NlcnZpY2VMb2cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MWU3OTcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9TZXJ2aWNlTG9nLmNwcApAQCAtMCwwICsxLDYzIEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlNlcnZpY2VMb2ciCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJTZXJ2aWNlTG9nLmgiCisKK3N0YXRpYyBjb25zdCBzaXplX3Qga0RlZmF1bHRNYXhOdW0gPSAxMDA7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworU2VydmljZUxvZzo6U2VydmljZUxvZygpIDogbU1heE51bShrRGVmYXVsdE1heE51bSksIG1Mb2dzKG1NYXhOdW0pIHt9CitTZXJ2aWNlTG9nOjpTZXJ2aWNlTG9nKHNpemVfdCBtYXhOdW0pIDogbU1heE51bShtYXhOdW0pLCBtTG9ncyhtTWF4TnVtKSB7fQorCit2b2lkIFNlcnZpY2VMb2c6OmFkZChjb25zdCBTdHJpbmc4ICZsb2cpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgdGltZV90IG5vdyA9IHRpbWUoMCk7CisgICAgY2hhciBidWZbNjRdOworICAgIHN0cmZ0aW1lKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlbS0lZCAlVCIsIGxvY2FsdGltZSgmbm93KSk7CisgICAgbUxvZ3MuYWRkKFN0cmluZzg6OmZvcm1hdCgiJXMgJXMiLCBidWYsIGxvZy5zdHJpbmcoKSkpOworfQorCitTdHJpbmc4IFNlcnZpY2VMb2c6OnRvU3RyaW5nKGNvbnN0IGNoYXIgKmxpbmVQcmVmaXgpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgZm9yIChjb25zdCBhdXRvJiBsb2cgOiBtTG9ncykgeworICAgICAgICBhZGRMaW5lKGxvZy5zdHJpbmcoKSwgbGluZVByZWZpeCwgJnJlc3VsdCk7CisgICAgfQorICAgIGlmIChtTG9ncy5zaXplKCkgPT0gbU1heE51bSkgeworICAgICAgICBhZGRMaW5lKCIuLi4iLCBsaW5lUHJlZml4LCAmcmVzdWx0KTsKKyAgICB9IGVsc2UgaWYgKG1Mb2dzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIGFkZExpbmUoIltubyBldmVudHMgeWV0XSIsIGxpbmVQcmVmaXgsICZyZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFNlcnZpY2VMb2c6OmFkZExpbmUoY29uc3QgY2hhciAqbG9nLCBjb25zdCBjaGFyICpwcmVmaXgsIFN0cmluZzggKnJlc3VsdCkgY29uc3QgeworICAgIGlmIChwcmVmaXggIT0gTlVMTCkgeworICAgICAgICByZXN1bHQtPmFwcGVuZChwcmVmaXgpOworICAgIH0KKyAgICByZXN1bHQtPmFwcGVuZChsb2cpOworICAgIHJlc3VsdC0+YXBwZW5kKCJcbiIpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9TZXJ2aWNlTG9nLmggYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9TZXJ2aWNlTG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZmMTZlYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1NlcnZpY2VMb2cuaApAQCAtMCwwICsxLDUwIEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE1LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIEFORFJPSURfU0VSVklDRUxPR19ICisjZGVmaW5lIEFORFJPSURfU0VSVklDRUxPR19ICisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSAibWVkaWEvUmluZ0J1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFNlcnZpY2VMb2cgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgU2VydmljZUxvZygpOworICAgIFNlcnZpY2VMb2coc2l6ZV90IG1heE51bSk7CisKKyAgICB2b2lkIGFkZChjb25zdCBTdHJpbmc4ICZsb2cpOworICAgIFN0cmluZzggdG9TdHJpbmcoY29uc3QgY2hhciAqbGluZVByZWZpeCA9IE5VTEwpIGNvbnN0OworCitwcml2YXRlOgorICAgIHNpemVfdCBtTWF4TnVtOworICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CisgICAgUmluZ0J1ZmZlcjxTdHJpbmc4PiBtTG9nczsKKworICAgIHZvaWQgYWRkTGluZShjb25zdCBjaGFyICpsb2csIGNvbnN0IGNoYXIgKnByZWZpeCwgU3RyaW5nOCAqcmVzdWx0KSBjb25zdDsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU0VSVklDRUxPR19ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I0ZWYwZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvQW5kcm9pZC5tawpAQCAtMCwwICsxLDU0IEBACisjIEJ1aWxkIHRoZSB1bml0IHRlc3RzLgorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IFJlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cworCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QuY3BwIFwKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgIGxpYmJpbmRlciBcCisgIGxpYmxvZyBcCisgIGxpYm1lZGlhIFwKKyAgbGlicmVzb3VyY2VtYW5hZ2Vyc2VydmljZSBcCisgIGxpYnV0aWxzIFwKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgIGZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCisgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIgXAorCitMT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAorTE9DQUxfQ0xBTkcgOj0gdHJ1ZQorCitMT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCisKK2luY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBTZXJ2aWNlTG9nX3Rlc3QKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgU2VydmljZUxvZ190ZXN0LmNwcCBcCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICBsaWJsb2cgXAorICBsaWJtZWRpYSBcCisgIGxpYnJlc291cmNlbWFuYWdlcnNlcnZpY2UgXAorICBsaWJ1dGlscyBcCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICBmcmFtZXdvcmtzL2F2L2luY2x1ZGUgXAorICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyIFwKKworTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKK0xPQ0FMX0NMQU5HIDo9IHRydWUKKworTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQorCitpbmNsdWRlICQoQlVJTERfTkFUSVZFX1RFU1QpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdC5jcHAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0OWRkYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0LmNwcApAQCAtMCwwICsxLDU0MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oIgorI2luY2x1ZGUgPG1lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFSZXNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhUmVzb3VyY2VQb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGludDY0X3QgZ2V0SWQoc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50KSB7CisgICAgcmV0dXJuIChpbnQ2NF90KSBjbGllbnQuZ2V0KCk7Cit9CisKK3N0cnVjdCBUZXN0UHJvY2Vzc0luZm8gOiBwdWJsaWMgUHJvY2Vzc0luZm9JbnRlcmZhY2UgeworICAgIFRlc3RQcm9jZXNzSW5mbygpIHt9CisgICAgdmlydHVhbCB+VGVzdFByb2Nlc3NJbmZvKCkge30KKworICAgIHZpcnR1YWwgYm9vbCBnZXRQcmlvcml0eShpbnQgcGlkLCBpbnQgKnByaW9yaXR5KSB7CisgICAgICAgIC8vIEZvciB0ZXN0aW5nLCB1c2UgcGlkIGFzIHByaW9yaXR5LgorICAgICAgICAvLyBMb3dlciB0aGUgdmFsdWUgaGlnaGVyIHRoZSBwcmlvcml0eS4KKyAgICAgICAgKnByaW9yaXR5ID0gcGlkOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGVzdFByb2Nlc3NJbmZvKTsKK307CisKK3N0cnVjdCBUZXN0Q2xpZW50IDogcHVibGljIEJuUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IHsKKyAgICBUZXN0Q2xpZW50KGludCBwaWQsIHNwPFJlc291cmNlTWFuYWdlclNlcnZpY2U+IHNlcnZpY2UpCisgICAgICAgIDogbVJlY2xhaW1lZChmYWxzZSksIG1QaWQocGlkKSwgbVNlcnZpY2Uoc2VydmljZSkge30KKworICAgIHZpcnR1YWwgYm9vbCByZWNsYWltUmVzb3VyY2UoKSB7CisgICAgICAgIHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudCh0aGlzKTsKKyAgICAgICAgbVNlcnZpY2UtPnJlbW92ZVJlc291cmNlKG1QaWQsIChpbnQ2NF90KSBjbGllbnQuZ2V0KCkpOworICAgICAgICBtUmVjbGFpbWVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCBTdHJpbmc4IGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJ0ZXN0X2NsaWVudCIpOworICAgIH0KKworICAgIGJvb2wgcmVjbGFpbWVkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVJlY2xhaW1lZDsKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0KCkgeworICAgICAgICBtUmVjbGFpbWVkID0gZmFsc2U7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+VGVzdENsaWVudCgpIHt9CisKK3ByaXZhdGU6CisgICAgYm9vbCBtUmVjbGFpbWVkOworICAgIGludCBtUGlkOworICAgIHNwPFJlc291cmNlTWFuYWdlclNlcnZpY2U+IG1TZXJ2aWNlOworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRlc3RDbGllbnQpOworfTsKKworc3RhdGljIGNvbnN0IGludCBrVGVzdFBpZDEgPSAzMDsKK3N0YXRpYyBjb25zdCBpbnQga1Rlc3RQaWQyID0gMjA7CisKK3N0YXRpYyBjb25zdCBpbnQga0xvd1ByaW9yaXR5UGlkID0gNDA7CitzdGF0aWMgY29uc3QgaW50IGtNaWRQcmlvcml0eVBpZCA9IDI1Oworc3RhdGljIGNvbnN0IGludCBrSGlnaFByaW9yaXR5UGlkID0gMTA7CisKK2NsYXNzIFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QoKQorICAgICAgICA6IG1TZXJ2aWNlKG5ldyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKG5ldyBUZXN0UHJvY2Vzc0luZm8pKSwKKyAgICAgICAgICBtVGVzdENsaWVudDEobmV3IFRlc3RDbGllbnQoa1Rlc3RQaWQxLCBtU2VydmljZSkpLAorICAgICAgICAgIG1UZXN0Q2xpZW50MihuZXcgVGVzdENsaWVudChrVGVzdFBpZDIsIG1TZXJ2aWNlKSksCisgICAgICAgICAgbVRlc3RDbGllbnQzKG5ldyBUZXN0Q2xpZW50KGtUZXN0UGlkMiwgbVNlcnZpY2UpKSB7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgc3RhdGljIGJvb2wgaXNFcXVhbFJlc291cmNlcyhjb25zdCBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gJnJlc291cmNlczEsCisgICAgICAgICAgICBjb25zdCBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gJnJlc291cmNlczIpIHsKKyAgICAgICAgaWYgKHJlc291cmNlczEuc2l6ZSgpICE9IHJlc291cmNlczIuc2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNvdXJjZXMxLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAocmVzb3VyY2VzMVtpXSAhPSByZXNvdXJjZXMyW2ldKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGV4cGVjdEVxUmVzb3VyY2VJbmZvKGNvbnN0IFJlc291cmNlSW5mbyAmaW5mbywgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50LAorICAgICAgICAgICAgY29uc3QgVmVjdG9yPE1lZGlhUmVzb3VyY2U+ICZyZXNvdXJjZXMpIHsKKyAgICAgICAgRVhQRUNUX0VRKGNsaWVudCwgaW5mby5jbGllbnQpOworICAgICAgICBFWFBFQ1RfVFJVRShpc0VxdWFsUmVzb3VyY2VzKHJlc291cmNlcywgaW5mby5yZXNvdXJjZXMpKTsKKyAgICB9CisKKyAgICB2b2lkIHZlcmlmeUNsaWVudHMoYm9vbCBjMSwgYm9vbCBjMiwgYm9vbCBjMykgeworICAgICAgICBUZXN0Q2xpZW50ICpjbGllbnQxID0gc3RhdGljX2Nhc3Q8VGVzdENsaWVudCo+KG1UZXN0Q2xpZW50MS5nZXQoKSk7CisgICAgICAgIFRlc3RDbGllbnQgKmNsaWVudDIgPSBzdGF0aWNfY2FzdDxUZXN0Q2xpZW50Kj4obVRlc3RDbGllbnQyLmdldCgpKTsKKyAgICAgICAgVGVzdENsaWVudCAqY2xpZW50MyA9IHN0YXRpY19jYXN0PFRlc3RDbGllbnQqPihtVGVzdENsaWVudDMuZ2V0KCkpOworCisgICAgICAgIEVYUEVDVF9FUShjMSwgY2xpZW50MS0+cmVjbGFpbWVkKCkpOworICAgICAgICBFWFBFQ1RfRVEoYzIsIGNsaWVudDItPnJlY2xhaW1lZCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGMzLCBjbGllbnQzLT5yZWNsYWltZWQoKSk7CisKKyAgICAgICAgY2xpZW50MS0+cmVzZXQoKTsKKyAgICAgICAgY2xpZW50Mi0+cmVzZXQoKTsKKyAgICAgICAgY2xpZW50My0+cmVzZXQoKTsKKyAgICB9CisKKyAgICAvLyB0ZXN0IHNldCB1cAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAgcGlkICAgICAgICAgICAgICAgIHByaW9yaXR5ICAgICAgICAgY2xpZW50ICAgICAgICAgICB0eXBlICAgICAgICAgICAgICAgbnVtYmVyCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICBrVGVzdFBpZDEoMzApICAgICAgMzAgICAgICAgICAgICAgICBtVGVzdENsaWVudDEgICAgIHNlY3VyZSBjb2RlYyAgICAgICAxCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoaWMgbWVtb3J5ICAgICAyMDAKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGhpYyBtZW1vcnkgICAgIDIwMAorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vICAga1Rlc3RQaWQyKDIwKSAgICAgIDIwICAgICAgICAgICAgICAgbVRlc3RDbGllbnQyICAgICBub24tc2VjdXJlIGNvZGVjICAgMQorICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaGljIG1lbW9yeSAgICAgMzAwCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGVzdENsaWVudDMgICAgIHNlY3VyZSBjb2RlYyAgICAgICAxCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoaWMgbWVtb3J5ICAgICAxMDAKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB2b2lkIGFkZFJlc291cmNlKCkgeworICAgICAgICAvLyBrVGVzdFBpZDEgbVRlc3RDbGllbnQxCisgICAgICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXMxOworICAgICAgICByZXNvdXJjZXMxLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKFN0cmluZzgoa1Jlc291cmNlU2VjdXJlQ29kZWMpLCAxKSk7CisgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDEsIGdldElkKG1UZXN0Q2xpZW50MSksIG1UZXN0Q2xpZW50MSwgcmVzb3VyY2VzMSk7CisgICAgICAgIHJlc291cmNlczEucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoU3RyaW5nOChrUmVzb3VyY2VHcmFwaGljTWVtb3J5KSwgMjAwKSk7CisgICAgICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXMxMTsKKyAgICAgICAgcmVzb3VyY2VzMTEucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoU3RyaW5nOChrUmVzb3VyY2VHcmFwaGljTWVtb3J5KSwgMjAwKSk7CisgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDEsIGdldElkKG1UZXN0Q2xpZW50MSksIG1UZXN0Q2xpZW50MSwgcmVzb3VyY2VzMTEpOworCisgICAgICAgIC8vIGtUZXN0UGlkMiBtVGVzdENsaWVudDIKKyAgICAgICAgVmVjdG9yPE1lZGlhUmVzb3VyY2U+IHJlc291cmNlczI7CisgICAgICAgIHJlc291cmNlczIucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoU3RyaW5nOChrUmVzb3VyY2VOb25TZWN1cmVDb2RlYyksIDEpKTsKKyAgICAgICAgcmVzb3VyY2VzMi5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShTdHJpbmc4KGtSZXNvdXJjZUdyYXBoaWNNZW1vcnkpLCAzMDApKTsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQyKSwgbVRlc3RDbGllbnQyLCByZXNvdXJjZXMyKTsKKworICAgICAgICAvLyBrVGVzdFBpZDIgbVRlc3RDbGllbnQzCisgICAgICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXMzOworICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa1Rlc3RQaWQyLCBnZXRJZChtVGVzdENsaWVudDMpLCBtVGVzdENsaWVudDMsIHJlc291cmNlczMpOworICAgICAgICByZXNvdXJjZXMzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKFN0cmluZzgoa1Jlc291cmNlU2VjdXJlQ29kZWMpLCAxKSk7CisgICAgICAgIHJlc291cmNlczMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoU3RyaW5nOChrUmVzb3VyY2VHcmFwaGljTWVtb3J5KSwgMTAwKSk7CisgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MyksIG1UZXN0Q2xpZW50MywgcmVzb3VyY2VzMyk7CisKKyAgICAgICAgY29uc3QgUGlkUmVzb3VyY2VJbmZvc01hcCAmbWFwID0gbVNlcnZpY2UtPm1NYXA7CisgICAgICAgIEVYUEVDVF9FUSgydSwgbWFwLnNpemUoKSk7CisgICAgICAgIHNzaXplX3QgaW5kZXgxID0gbWFwLmluZGV4T2ZLZXkoa1Rlc3RQaWQxKTsKKyAgICAgICAgQVNTRVJUX0dFKGluZGV4MSwgMCk7CisgICAgICAgIGNvbnN0IFJlc291cmNlSW5mb3MgJmluZm9zMSA9IG1hcFtpbmRleDFdOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGluZm9zMS5zaXplKCkpOworICAgICAgICBleHBlY3RFcVJlc291cmNlSW5mbyhpbmZvczFbMF0sIG1UZXN0Q2xpZW50MSwgcmVzb3VyY2VzMSk7CisKKyAgICAgICAgc3NpemVfdCBpbmRleDIgPSBtYXAuaW5kZXhPZktleShrVGVzdFBpZDIpOworICAgICAgICBBU1NFUlRfR0UoaW5kZXgyLCAwKTsKKyAgICAgICAgY29uc3QgUmVzb3VyY2VJbmZvcyAmaW5mb3MyID0gbWFwW2luZGV4Ml07CisgICAgICAgIEVYUEVDVF9FUSgydSwgaW5mb3MyLnNpemUoKSk7CisgICAgICAgIGV4cGVjdEVxUmVzb3VyY2VJbmZvKGluZm9zMlswXSwgbVRlc3RDbGllbnQyLCByZXNvdXJjZXMyKTsKKyAgICAgICAgZXhwZWN0RXFSZXNvdXJjZUluZm8oaW5mb3MyWzFdLCBtVGVzdENsaWVudDMsIHJlc291cmNlczMpOworICAgIH0KKworICAgIHZvaWQgdGVzdENvbmZpZygpIHsKKyAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPm1TdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPm1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyk7CisKKyAgICAgICAgVmVjdG9yPE1lZGlhUmVzb3VyY2VQb2xpY3k+IHBvbGljaWVzMTsKKyAgICAgICAgcG9saWNpZXMxLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlUG9saWN5KAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChrUG9saWN5U3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcyksCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCJ0cnVlIikpKTsKKyAgICAgICAgcG9saWNpZXMxLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlUG9saWN5KAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChrUG9saWN5U3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMpLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiZmFsc2UiKSkpOworICAgICAgICBtU2VydmljZS0+Y29uZmlnKHBvbGljaWVzMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5tU3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcyk7CisgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+bVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjKTsKKworICAgICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZVBvbGljeT4gcG9saWNpZXMyOworICAgICAgICBwb2xpY2llczIucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2VQb2xpY3koCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGtQb2xpY3lTdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoImZhbHNlIikpKTsKKyAgICAgICAgcG9saWNpZXMyLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBNZWRpYVJlc291cmNlUG9saWN5KAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChrUG9saWN5U3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMpLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgidHJ1ZSIpKSk7CisgICAgICAgIG1TZXJ2aWNlLT5jb25maWcocG9saWNpZXMyKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5tU3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcyk7CisgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5tU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMpOworICAgIH0KKworICAgIHZvaWQgdGVzdFJlbW92ZVJlc291cmNlKCkgeworICAgICAgICBhZGRSZXNvdXJjZSgpOworCisgICAgICAgIG1TZXJ2aWNlLT5yZW1vdmVSZXNvdXJjZShrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MikpOworCisgICAgICAgIGNvbnN0IFBpZFJlc291cmNlSW5mb3NNYXAgJm1hcCA9IG1TZXJ2aWNlLT5tTWFwOworICAgICAgICBFWFBFQ1RfRVEoMnUsIG1hcC5zaXplKCkpOworICAgICAgICBjb25zdCBSZXNvdXJjZUluZm9zICZpbmZvczEgPSBtYXAudmFsdWVGb3Ioa1Rlc3RQaWQxKTsKKyAgICAgICAgY29uc3QgUmVzb3VyY2VJbmZvcyAmaW5mb3MyID0gbWFwLnZhbHVlRm9yKGtUZXN0UGlkMik7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgaW5mb3MxLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgaW5mb3MyLnNpemUoKSk7CisgICAgICAgIC8vIG1UZXN0Q2xpZW50MiBoYXMgYmVlbiByZW1vdmVkLgorICAgICAgICBFWFBFQ1RfRVEobVRlc3RDbGllbnQzLCBpbmZvczJbMF0uY2xpZW50KTsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RHZXRBbGxDbGllbnRzKCkgeworICAgICAgICBhZGRSZXNvdXJjZSgpOworCisgICAgICAgIFN0cmluZzggdHlwZSA9IFN0cmluZzgoa1Jlc291cmNlU2VjdXJlQ29kZWMpOworICAgICAgICBTdHJpbmc4IHVua25vd1R5cGUgPSBTdHJpbmc4KCJ1bmtub3dUeXBlIik7CisgICAgICAgIFZlY3RvcjxzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiA+IGNsaWVudHM7CisgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+Z2V0QWxsQ2xpZW50c19sKGtMb3dQcmlvcml0eVBpZCwgdHlwZSwgJmNsaWVudHMpKTsKKyAgICAgICAgLy8gc29tZSBoaWdoZXIgcHJpb3JpdHkgcHJvY2VzcyAoZS5nLiBrVGVzdFBpZDIpIG93bnMgdGhlIHJlc291cmNlLCBzbyBnZXRBbGxDbGllbnRzX2wKKyAgICAgICAgLy8gd2lsbCBmYWlsLgorICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPmdldEFsbENsaWVudHNfbChrTWlkUHJpb3JpdHlQaWQsIHR5cGUsICZjbGllbnRzKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5nZXRBbGxDbGllbnRzX2woa0hpZ2hQcmlvcml0eVBpZCwgdW5rbm93VHlwZSwgJmNsaWVudHMpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPmdldEFsbENsaWVudHNfbChrSGlnaFByaW9yaXR5UGlkLCB0eXBlLCAmY2xpZW50cykpOworCisgICAgICAgIEVYUEVDVF9FUSgydSwgY2xpZW50cy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEobVRlc3RDbGllbnQzLCBjbGllbnRzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKG1UZXN0Q2xpZW50MSwgY2xpZW50c1sxXSk7CisgICAgfQorCisgICAgdm9pZCB0ZXN0UmVjbGFpbVJlc291cmNlU2VjdXJlKCkgeworICAgICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzOworICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoU3RyaW5nOChrUmVzb3VyY2VTZWN1cmVDb2RlYyksIDEpKTsKKyAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKFN0cmluZzgoa1Jlc291cmNlR3JhcGhpY01lbW9yeSksIDE1MCkpOworCisgICAgICAgIC8vICMjIyBzZWN1cmUgY29kZWMgY2FuJ3QgY29leGlzdCBhbmQgc2VjdXJlIGNvZGVjIGNhbiBjb2V4aXN0IHdpdGggbm9uLXNlY3VyZSBjb2RlYyAjIyMKKyAgICAgICAgeworICAgICAgICAgICAgYWRkUmVzb3VyY2UoKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5tU3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcyA9IGZhbHNlOworICAgICAgICAgICAgbVNlcnZpY2UtPm1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyA9IHRydWU7CisKKyAgICAgICAgICAgIC8vIHByaW9yaXR5IHRvbyBsb3cKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtMb3dQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrTWlkUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworCisgICAgICAgICAgICAvLyByZWNsYWltIGFsbCBzZWN1cmUgY29kZWNzCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyh0cnVlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgdHJ1ZSAvKiBjMyAqLyk7CisKKyAgICAgICAgICAgIC8vIGNhbGwgYWdhaW4gc2hvdWxkIHJlY2xhaW0gb25lIGxhcmdlc3QgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcworICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIHRydWUgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKworICAgICAgICAgICAgLy8gbm90aGluZyBsZWZ0CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vICMjIyBzZWN1cmUgY29kZWNzIGNhbid0IGNvZXhpc3QgYW5kIHNlY3VyZSBjb2RlYyBjYW4ndCBjb2V4aXN0IHdpdGggbm9uLXNlY3VyZSBjb2RlYyAjIyMKKyAgICAgICAgeworICAgICAgICAgICAgYWRkUmVzb3VyY2UoKTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5tU3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcyA9IGZhbHNlOworICAgICAgICAgICAgbVNlcnZpY2UtPm1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyA9IGZhbHNlOworCisgICAgICAgICAgICAvLyBwcmlvcml0eSB0b28gbG93CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrTG93UHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa01pZFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKworICAgICAgICAgICAgLy8gcmVjbGFpbSBhbGwgc2VjdXJlIGFuZCBub24tc2VjdXJlIGNvZGVjcworICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIHZlcmlmeUNsaWVudHModHJ1ZSAvKiBjMSAqLywgdHJ1ZSAvKiBjMiAqLywgdHJ1ZSAvKiBjMyAqLyk7CisKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgbGVmdAorICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vICMjIyBzZWN1cmUgY29kZWNzIGNhbiBjb2V4aXN0IGJ1dCBzZWN1cmUgY29kZWMgY2FuJ3QgY29leGlzdCB3aXRoIG5vbi1zZWN1cmUgY29kZWMgIyMjCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZFJlc291cmNlKCk7CisgICAgICAgICAgICBtU2VydmljZS0+bVN1cHBvcnRzTXVsdGlwbGVTZWN1cmVDb2RlY3MgPSB0cnVlOworICAgICAgICAgICAgbVNlcnZpY2UtPm1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyA9IGZhbHNlOworCisgICAgICAgICAgICAvLyBwcmlvcml0eSB0b28gbG93CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrTG93UHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa01pZFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKworICAgICAgICAgICAgLy8gcmVjbGFpbSBhbGwgbm9uLXNlY3VyZSBjb2RlY3MKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCB0cnVlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisKKyAgICAgICAgICAgIC8vIGNhbGwgYWdhaW4gc2hvdWxkIHJlY2xhaW0gb25lIGxhcmdlc3QgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcworICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIHZlcmlmeUNsaWVudHModHJ1ZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKworICAgICAgICAgICAgLy8gY2FsbCBhZ2FpbiBzaG91bGQgcmVjbGFpbSBhbm90aGVyIGxhcmdlc3QgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcworICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCB0cnVlIC8qIGMzICovKTsKKworICAgICAgICAgICAgLy8gbm90aGluZyBsZWZ0CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vICMjIyBzZWN1cmUgY29kZWNzIGNhbiBjb2V4aXN0IGFuZCBzZWN1cmUgY29kZWMgY2FuIGNvZXhpc3Qgd2l0aCBub24tc2VjdXJlIGNvZGVjICMjIworICAgICAgICB7CisgICAgICAgICAgICBhZGRSZXNvdXJjZSgpOworICAgICAgICAgICAgbVNlcnZpY2UtPm1TdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzID0gdHJ1ZTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5tU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMgPSB0cnVlOworCisgICAgICAgICAgICAvLyBwcmlvcml0eSB0b28gbG93CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrTG93UHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgLy8gb25lIGxhcmdlc3QgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcyBnb3QgcmVjbGFpbWVkCisgICAgICAgICAgICB2ZXJpZnlDbGllbnRzKHRydWUgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisKKyAgICAgICAgICAgIC8vIGNhbGwgYWdhaW4gc2hvdWxkIHJlY2xhaW0gYW5vdGhlciBncmFwaGljIG1lbW9yeSBmcm9tIGxvd2VzdCBwcm9jZXNzCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgdHJ1ZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworCisgICAgICAgICAgICAvLyBjYWxsIGFnYWluIHNob3VsZCByZWNsYWltIGFub3RoZXIgZ3JhcGhpYyBtZW1vcnkgZnJvbSBsb3dlc3QgcHJvY2VzcworICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCB0cnVlIC8qIGMzICovKTsKKworICAgICAgICAgICAgLy8gbm90aGluZyBsZWZ0CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vICMjIyBzZWN1cmUgY29kZWNzIGNhbiBjb2V4aXN0IGFuZCBzZWN1cmUgY29kZWMgY2FuIGNvZXhpc3Qgd2l0aCBub24tc2VjdXJlIGNvZGVjICMjIworICAgICAgICB7CisgICAgICAgICAgICBhZGRSZXNvdXJjZSgpOworICAgICAgICAgICAgbVNlcnZpY2UtPm1TdXBwb3J0c011bHRpcGxlU2VjdXJlQ29kZWNzID0gdHJ1ZTsKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5tU3VwcG9ydHNTZWN1cmVXaXRoTm9uU2VjdXJlQ29kZWMgPSB0cnVlOworCisgICAgICAgICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzOworICAgICAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKFN0cmluZzgoa1Jlc291cmNlU2VjdXJlQ29kZWMpLCAxKSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICAvLyBzZWN1cmUgY29kZWMgZnJvbSBsb3dlc3QgcHJvY2VzcyBnb3QgcmVjbGFpbWVkCisgICAgICAgICAgICB2ZXJpZnlDbGllbnRzKHRydWUgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisKKyAgICAgICAgICAgIC8vIGNhbGwgYWdhaW4gc2hvdWxkIHJlY2xhaW0gYW5vdGhlciBzZWN1cmUgY29kZWMgZnJvbSBsb3dlc3QgcHJvY2VzcworICAgICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrSGlnaFByaW9yaXR5UGlkLCByZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIHZlcmlmeUNsaWVudHMoZmFsc2UgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCB0cnVlIC8qIGMzICovKTsKKworICAgICAgICAgICAgLy8gbm8gbW9yZSBzZWN1cmUgY29kZWMsIG5vbi1zZWN1cmUgY29kZWMgd2lsbCBiZSByZWNsYWltZWQuCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgdHJ1ZSAvKiBjMiAqLywgZmFsc2UgLyogYzMgKi8pOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0UmVjbGFpbVJlc291cmNlTm9uU2VjdXJlKCkgeworICAgICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzOworICAgICAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoU3RyaW5nOChrUmVzb3VyY2VOb25TZWN1cmVDb2RlYyksIDEpKTsKKyAgICAgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKFN0cmluZzgoa1Jlc291cmNlR3JhcGhpY01lbW9yeSksIDE1MCkpOworCisgICAgICAgIC8vICMjIyBzZWN1cmUgY29kZWMgY2FuJ3QgY29leGlzdCB3aXRoIG5vbi1zZWN1cmUgY29kZWMgIyMjCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZFJlc291cmNlKCk7CisgICAgICAgICAgICBtU2VydmljZS0+bVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjID0gZmFsc2U7CisKKyAgICAgICAgICAgIC8vIHByaW9yaXR5IHRvbyBsb3cKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtMb3dQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPnJlY2xhaW1SZXNvdXJjZShrTWlkUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworCisgICAgICAgICAgICAvLyByZWNsYWltIGFsbCBzZWN1cmUgY29kZWNzCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyh0cnVlIC8qIGMxICovLCBmYWxzZSAvKiBjMiAqLywgdHJ1ZSAvKiBjMyAqLyk7CisKKyAgICAgICAgICAgIC8vIGNhbGwgYWdhaW4gc2hvdWxkIHJlY2xhaW0gb25lIGdyYXBoaWMgbWVtb3J5IGZyb20gbG93ZXN0IHByb2Nlc3MKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCB0cnVlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgbGVmdAorICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vICMjIyBzZWN1cmUgY29kZWMgY2FuIGNvZXhpc3Qgd2l0aCBub24tc2VjdXJlIGNvZGVjICMjIworICAgICAgICB7CisgICAgICAgICAgICBhZGRSZXNvdXJjZSgpOworICAgICAgICAgICAgbVNlcnZpY2UtPm1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyA9IHRydWU7CisKKyAgICAgICAgICAgIC8vIHByaW9yaXR5IHRvbyBsb3cKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtMb3dQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICAvLyBvbmUgbGFyZ2VzdCBncmFwaGljIG1lbW9yeSBmcm9tIGxvd2VzdCBwcm9jZXNzIGdvdCByZWNsYWltZWQKKyAgICAgICAgICAgIHZlcmlmeUNsaWVudHModHJ1ZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKKworICAgICAgICAgICAgLy8gY2FsbCBhZ2FpbiBzaG91bGQgcmVjbGFpbSBhbm90aGVyIGdyYXBoaWMgbWVtb3J5IGZyb20gbG93ZXN0IHByb2Nlc3MKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCB0cnVlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisKKyAgICAgICAgICAgIC8vIGNhbGwgYWdhaW4gc2hvdWxkIHJlY2xhaW0gYW5vdGhlciBncmFwaGljIG1lbW9yeSBmcm9tIGxvd2VzdCBwcm9jZXNzCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgdmVyaWZ5Q2xpZW50cyhmYWxzZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIHRydWUgLyogYzMgKi8pOworCisgICAgICAgICAgICAvLyBub3RoaW5nIGxlZnQKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICB9CisKKyAgICAgICAgLy8gIyMjIHNlY3VyZSBjb2RlYyBjYW4gY29leGlzdCB3aXRoIG5vbi1zZWN1cmUgY29kZWMgIyMjCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZFJlc291cmNlKCk7CisgICAgICAgICAgICBtU2VydmljZS0+bVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjID0gdHJ1ZTsKKworICAgICAgICAgICAgVmVjdG9yPE1lZGlhUmVzb3VyY2U+IHJlc291cmNlczsKKyAgICAgICAgICAgIHJlc291cmNlcy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShTdHJpbmc4KGtSZXNvdXJjZU5vblNlY3VyZUNvZGVjKSwgMSkpOworCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+cmVjbGFpbVJlc291cmNlKGtIaWdoUHJpb3JpdHlQaWQsIHJlc291cmNlcykpOworICAgICAgICAgICAgLy8gb25lIG5vbiBzZWN1cmUgY29kZWMgZnJvbSBsb3dlc3QgcHJvY2VzcyBnb3QgcmVjbGFpbWVkCisgICAgICAgICAgICB2ZXJpZnlDbGllbnRzKGZhbHNlIC8qIGMxICovLCB0cnVlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisKKyAgICAgICAgICAgIC8vIG5vIG1vcmUgbm9uLXNlY3VyZSBjb2RlYywgc2VjdXJlIGNvZGVjIGZyb20gbG93ZXN0IHByaW9yaXR5IHByb2Nlc3Mgd2lsbCBiZSByZWNsYWltZWQKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5yZWNsYWltUmVzb3VyY2Uoa0hpZ2hQcmlvcml0eVBpZCwgcmVzb3VyY2VzKSk7CisgICAgICAgICAgICB2ZXJpZnlDbGllbnRzKHRydWUgLyogYzEgKi8sIGZhbHNlIC8qIGMyICovLCBmYWxzZSAvKiBjMyAqLyk7CisKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIGNsaWVudCAzIHdoaWNoIHN0aWxsIGxlZnQKKyAgICAgICAgICAgIG1TZXJ2aWNlLT5yZW1vdmVSZXNvdXJjZShrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MykpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0ZXN0R2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50KCkgeworICAgICAgICBTdHJpbmc4IHR5cGUgPSBTdHJpbmc4KGtSZXNvdXJjZUdyYXBoaWNNZW1vcnkpOworICAgICAgICBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnQ7CisgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+Z2V0TG93ZXN0UHJpb3JpdHlCaWdnZXN0Q2xpZW50X2woa0hpZ2hQcmlvcml0eVBpZCwgdHlwZSwgJmNsaWVudCkpOworCisgICAgICAgIGFkZFJlc291cmNlKCk7CisKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5nZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnRfbChrTG93UHJpb3JpdHlQaWQsIHR5cGUsICZjbGllbnQpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPmdldExvd2VzdFByaW9yaXR5QmlnZ2VzdENsaWVudF9sKGtIaWdoUHJpb3JpdHlQaWQsIHR5cGUsICZjbGllbnQpKTsKKworICAgICAgICAvLyBrVGVzdFBpZDEgaXMgdGhlIGxvd2VzdCBwcmlvcml0eSBwcm9jZXNzIHdpdGgga1Jlc291cmNlR3JhcGhpY01lbW9yeS4KKyAgICAgICAgLy8gbVRlc3RDbGllbnQxIGhhcyB0aGUgbGFyZ2VzdCBrUmVzb3VyY2VHcmFwaGljTWVtb3J5IHdpdGhpbiBrVGVzdFBpZDEuCisgICAgICAgIEVYUEVDVF9FUShtVGVzdENsaWVudDEsIGNsaWVudCk7CisgICAgfQorCisgICAgdm9pZCB0ZXN0R2V0TG93ZXN0UHJpb3JpdHlQaWQoKSB7CisgICAgICAgIGludCBwaWQ7CisgICAgICAgIGludCBwcmlvcml0eTsKKyAgICAgICAgVGVzdFByb2Nlc3NJbmZvIHByb2Nlc3NJbmZvOworCisgICAgICAgIFN0cmluZzggdHlwZSA9IFN0cmluZzgoa1Jlc291cmNlR3JhcGhpY01lbW9yeSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShtU2VydmljZS0+Z2V0TG93ZXN0UHJpb3JpdHlQaWRfbCh0eXBlLCAmcGlkLCAmcHJpb3JpdHkpKTsKKworICAgICAgICBhZGRSZXNvdXJjZSgpOworCisgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5nZXRMb3dlc3RQcmlvcml0eVBpZF9sKHR5cGUsICZwaWQsICZwcmlvcml0eSkpOworICAgICAgICBFWFBFQ1RfRVEoa1Rlc3RQaWQxLCBwaWQpOworICAgICAgICBpbnQgcHJpb3JpdHkxOworICAgICAgICBwcm9jZXNzSW5mby5nZXRQcmlvcml0eShrVGVzdFBpZDEsICZwcmlvcml0eTEpOworICAgICAgICBFWFBFQ1RfRVEocHJpb3JpdHkxLCBwcmlvcml0eSk7CisKKyAgICAgICAgdHlwZSA9IFN0cmluZzgoa1Jlc291cmNlTm9uU2VjdXJlQ29kZWMpOworICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+Z2V0TG93ZXN0UHJpb3JpdHlQaWRfbCh0eXBlLCAmcGlkLCAmcHJpb3JpdHkpKTsKKyAgICAgICAgRVhQRUNUX0VRKGtUZXN0UGlkMiwgcGlkKTsKKyAgICAgICAgaW50IHByaW9yaXR5MjsKKyAgICAgICAgcHJvY2Vzc0luZm8uZ2V0UHJpb3JpdHkoa1Rlc3RQaWQyLCAmcHJpb3JpdHkyKTsKKyAgICAgICAgRVhQRUNUX0VRKHByaW9yaXR5MiwgcHJpb3JpdHkpOworICAgIH0KKworICAgIHZvaWQgdGVzdEdldEJpZ2dlc3RDbGllbnQoKSB7CisgICAgICAgIFN0cmluZzggdHlwZSA9IFN0cmluZzgoa1Jlc291cmNlR3JhcGhpY01lbW9yeSk7CisgICAgICAgIHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudDsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5nZXRCaWdnZXN0Q2xpZW50X2woa1Rlc3RQaWQyLCB0eXBlLCAmY2xpZW50KSk7CisKKyAgICAgICAgYWRkUmVzb3VyY2UoKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+Z2V0QmlnZ2VzdENsaWVudF9sKGtUZXN0UGlkMiwgdHlwZSwgJmNsaWVudCkpOworICAgICAgICBFWFBFQ1RfRVEobVRlc3RDbGllbnQyLCBjbGllbnQpOworICAgIH0KKworICAgIHZvaWQgdGVzdElzQ2FsbGluZ1ByaW9yaXR5SGlnaGVyKCkgeworICAgICAgICBFWFBFQ1RfRkFMU0UobVNlcnZpY2UtPmlzQ2FsbGluZ1ByaW9yaXR5SGlnaGVyX2woMTAxLCAxMDApKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1TZXJ2aWNlLT5pc0NhbGxpbmdQcmlvcml0eUhpZ2hlcl9sKDEwMCwgMTAwKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5pc0NhbGxpbmdQcmlvcml0eUhpZ2hlcl9sKDk5LCAxMDApKTsKKyAgICB9CisKKyAgICBzcDxSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiBtU2VydmljZTsKKyAgICBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBtVGVzdENsaWVudDE7CisgICAgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gbVRlc3RDbGllbnQyOworICAgIHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IG1UZXN0Q2xpZW50MzsKK307CisKK1RFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwgY29uZmlnKSB7CisgICAgdGVzdENvbmZpZygpOworfQorCitURVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIGFkZFJlc291cmNlKSB7CisgICAgYWRkUmVzb3VyY2UoKTsKK30KKworVEVTVF9GKFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0LCByZW1vdmVSZXNvdXJjZSkgeworICAgIHRlc3RSZW1vdmVSZXNvdXJjZSgpOworfQorCitURVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIHJlY2xhaW1SZXNvdXJjZSkgeworICAgIHRlc3RSZWNsYWltUmVzb3VyY2VTZWN1cmUoKTsKKyAgICB0ZXN0UmVjbGFpbVJlc291cmNlTm9uU2VjdXJlKCk7Cit9CisKK1RFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwgZ2V0QWxsQ2xpZW50c19sKSB7CisgICAgdGVzdEdldEFsbENsaWVudHMoKTsKK30KKworVEVTVF9GKFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0LCBnZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnRfbCkgeworICAgIHRlc3RHZXRMb3dlc3RQcmlvcml0eUJpZ2dlc3RDbGllbnQoKTsKK30KKworVEVTVF9GKFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0LCBnZXRMb3dlc3RQcmlvcml0eVBpZF9sKSB7CisgICAgdGVzdEdldExvd2VzdFByaW9yaXR5UGlkKCk7Cit9CisKK1RFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwgZ2V0QmlnZ2VzdENsaWVudF9sKSB7CisgICAgdGVzdEdldEJpZ2dlc3RDbGllbnQoKTsKK30KKworVEVTVF9GKFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0LCBpc0NhbGxpbmdQcmlvcml0eUhpZ2hlcl9sKSB7CisgICAgdGVzdElzQ2FsbGluZ1ByaW9yaXR5SGlnaGVyKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvU2VydmljZUxvZ190ZXN0LmNwcCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvU2VydmljZUxvZ190ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTcyNDk5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9TZXJ2aWNlTG9nX3Rlc3QuY3BwCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU2VydmljZUxvZ190ZXN0IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgIlNlcnZpY2VMb2cuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTZXJ2aWNlTG9nVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIFNlcnZpY2VMb2dUZXN0KCkgOiBtU2VydmljZUxvZyhuZXcgU2VydmljZUxvZygzKSkgeworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHNwPFNlcnZpY2VMb2c+IG1TZXJ2aWNlTG9nOworfTsKKworVEVTVF9GKFNlcnZpY2VMb2dUZXN0LCBhZGRUaGVuVG9TdHJpbmcpIHsKKyAgICBTdHJpbmc4IGxvZ1N0cmluZzsKKworICAgIG1TZXJ2aWNlTG9nLT5hZGQoU3RyaW5nOCgibG9nMSIpKTsKKyAgICBsb2dTdHJpbmcgPSBtU2VydmljZUxvZy0+dG9TdHJpbmcoKTsKKyAgICBFWFBFQ1RfVFJVRShsb2dTdHJpbmcuY29udGFpbnMoImxvZzEiKSk7CisgICAgQUxPR1YoInRvU3RyaW5nOlxuJXMiLCBsb2dTdHJpbmcuc3RyaW5nKCkpOworCisgICAgc3RhdGljIGNvbnN0IGNoYXIga1Rlc3RMb2dQcmVmaXhbXSA9ICJ0ZXN0bG9ncHJlZml4OiAiOworICAgIGxvZ1N0cmluZyA9IG1TZXJ2aWNlTG9nLT50b1N0cmluZyhrVGVzdExvZ1ByZWZpeCk7CisgICAgRVhQRUNUX1RSVUUobG9nU3RyaW5nLmNvbnRhaW5zKGtUZXN0TG9nUHJlZml4KSk7CisgICAgRVhQRUNUX1RSVUUobG9nU3RyaW5nLmNvbnRhaW5zKCJsb2cxIikpOworICAgIEFMT0dWKCJ0b1N0cmluZzpcbiVzIiwgbG9nU3RyaW5nLnN0cmluZygpKTsKKworICAgIG1TZXJ2aWNlTG9nLT5hZGQoU3RyaW5nOCgibG9nMiIpKTsKKyAgICBsb2dTdHJpbmcgPSBtU2VydmljZUxvZy0+dG9TdHJpbmcoKTsKKyAgICBFWFBFQ1RfVFJVRShsb2dTdHJpbmcuY29udGFpbnMoImxvZzEiKSk7CisgICAgRVhQRUNUX1RSVUUobG9nU3RyaW5nLmNvbnRhaW5zKCJsb2cyIikpOworICAgIEFMT0dWKCJ0b1N0cmluZzpcbiVzIiwgbG9nU3RyaW5nLnN0cmluZygpKTsKKworICAgIG1TZXJ2aWNlTG9nLT5hZGQoU3RyaW5nOCgibG9nMyIpKTsKKyAgICBsb2dTdHJpbmcgPSBtU2VydmljZUxvZy0+dG9TdHJpbmcoKTsKKyAgICBFWFBFQ1RfVFJVRShsb2dTdHJpbmcuY29udGFpbnMoImxvZzEiKSk7CisgICAgRVhQRUNUX1RSVUUobG9nU3RyaW5nLmNvbnRhaW5zKCJsb2cyIikpOworICAgIEVYUEVDVF9UUlVFKGxvZ1N0cmluZy5jb250YWlucygibG9nMyIpKTsKKyAgICBBTE9HVigidG9TdHJpbmc6XG4lcyIsIGxvZ1N0cmluZy5zdHJpbmcoKSk7CisKKyAgICBtU2VydmljZUxvZy0+YWRkKFN0cmluZzgoImxvZzQiKSk7CisgICAgbG9nU3RyaW5nID0gbVNlcnZpY2VMb2ctPnRvU3RyaW5nKCk7CisgICAgRVhQRUNUX0ZBTFNFKGxvZ1N0cmluZy5jb250YWlucygibG9nMSIpKTsKKyAgICBFWFBFQ1RfVFJVRShsb2dTdHJpbmcuY29udGFpbnMoImxvZzIiKSk7CisgICAgRVhQRUNUX1RSVUUobG9nU3RyaW5nLmNvbnRhaW5zKCJsb2czIikpOworICAgIEVYUEVDVF9UUlVFKGxvZ1N0cmluZy5jb250YWlucygibG9nNCIpKTsKKyAgICBBTE9HVigidG9TdHJpbmc6XG4lcyIsIGxvZ1N0cmluZy5zdHJpbmcoKSk7CisKKyAgICBtU2VydmljZUxvZy0+YWRkKFN0cmluZzgoImxvZzUiKSk7CisgICAgbG9nU3RyaW5nID0gbVNlcnZpY2VMb2ctPnRvU3RyaW5nKCk7CisgICAgRVhQRUNUX0ZBTFNFKGxvZ1N0cmluZy5jb250YWlucygibG9nMSIpKTsKKyAgICBFWFBFQ1RfRkFMU0UobG9nU3RyaW5nLmNvbnRhaW5zKCJsb2cyIikpOworICAgIEVYUEVDVF9UUlVFKGxvZ1N0cmluZy5jb250YWlucygibG9nMyIpKTsKKyAgICBFWFBFQ1RfVFJVRShsb2dTdHJpbmcuY29udGFpbnMoImxvZzQiKSk7CisgICAgRVhQRUNUX1RSVUUobG9nU3RyaW5nLmNvbnRhaW5zKCJsb2c1IikpOworICAgIEFMT0dWKCJ0b1N0cmluZzpcbiVzIiwgbG9nU3RyaW5nLnN0cmluZygpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvcmFkaW8vQW5kcm9pZC5tayBiL3NlcnZpY2VzL3JhZGlvL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlNTY2NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3JhZGlvL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzNiBAQAorIyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKKworTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICBcCisgICAgUmFkaW9TZXJ2aWNlLmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTOj0gXAorICAgIGxpYnVpIFwKKyAgICBsaWJsb2cgXAorICAgIGxpYnV0aWxzIFwKKyAgICBsaWJiaW5kZXIgXAorICAgIGxpYmN1dGlscyBcCisgICAgbGlibWVkaWEgXAorICAgIGxpYmhhcmR3YXJlIFwKKyAgICBsaWJyYWRpbyBcCisgICAgbGlicmFkaW9fbWV0YWRhdGEKKworTE9DQUxfTU9EVUxFOj0gbGlicmFkaW9zZXJ2aWNlCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvUmVnaW9ucy5oIGIvc2VydmljZXMvcmFkaW8vUmFkaW9SZWdpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMzNWI4YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL3JhZGlvL1JhZGlvUmVnaW9ucy5oCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1JBRElPX1JFR0lPTlNfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1JBRElPX1JFR0lPTlNfSAorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgUkFESU9fQkFORF9MT1dFUl9GTV9JVFUxICAgIDg3NTAwCisjZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfRk1fSVRVMSAgICAxMDgwMDAKKyNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX0ZNX0lUVTEgIDEwMAorCisjZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfRk1fSVRVMiAgICA4NzkwMAorI2RlZmluZSBSQURJT19CQU5EX1VQUEVSX0ZNX0lUVTIgICAgMTA3OTAwCisjZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19GTV9JVFUyICAyMDAKKworI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX0ZNX0pBUEFOICAgIDc2MDAwCisjZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfRk1fSkFQQU4gICAgOTAwMDAKKyNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX0ZNX0pBUEFOICAxMDAKKworI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX0ZNX09JUlQgICAgNjU4MDAKKyNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9GTV9PSVJUICAgIDc0MDAwCisjZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19GTV9PSVJUICAxMAorCisjZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfTFcgICAgICAgICAxNTMKKyNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9MVyAgICAgICAgIDI3OQorI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfTFcgICAgICAgOQorCisjZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfTVdfSVVUMSAgICA1MzEKKyNkZWZpbmUgUkFESU9fQkFORF9VUFBFUl9NV19JVFUxICAgIDE2MTEKKyNkZWZpbmUgUkFESU9fQkFORF9TUEFDSU5HX01XX0lUVTEgIDkKKworI2RlZmluZSBSQURJT19CQU5EX0xPV0VSX01XX0lVVDIgICAgNTQwCisjZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfTVdfSVRVMiAgICAxNjEwCisjZGVmaW5lIFJBRElPX0JBTkRfU1BBQ0lOR19NV19JVFUyICAxMAorCisjZGVmaW5lIFJBRElPX0JBTkRfTE9XRVJfU1cgICAgICAgICAyMzAwCisjZGVmaW5lIFJBRElPX0JBTkRfVVBQRVJfU1cgICAgICAgICAyNjEwMAorI2RlZmluZSBSQURJT19CQU5EX1NQQUNJTkdfU1cgICAgICAgNQorCisKKyNpZm5kZWYgQVJSQVlfU0laRQorI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKKyNlbmRpZgorCitjb25zdCByYWRpb19iYW5kX2NvbmZpZ190IHNLbm93blJlZ2lvbkNvbmZpZ3NbXSA9IHsKKyAgICB7ICAgLy8gRk0gSVRVIDEKKyAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8xLAorICAgICAgICB7CisgICAgICAgIFJBRElPX0JBTkRfRk0sCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfRk1fSVRVMSwKKyAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfRk1fSVRVMSwKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX0ZNX0lUVTF9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgUkFESU9fREVFTVBIQVNJU181MCwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICBSQURJT19SRFNfV09STEQsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0sCisgICAgeyAgIC8vIEZNIEFtZXJpY2FzCisgICAgICAgIFJBRElPX1JFR0lPTl9JVFVfMiwKKyAgICAgICAgeworICAgICAgICBSQURJT19CQU5EX0ZNLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX0ZNX0lUVTIsCisgICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0ZNX0lUVTIsCisgICAgICAgICAgICAxLAorICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19GTV9JVFUyfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFJBRElPX0RFRU1QSEFTSVNfNzUsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgUkFESU9fUkRTX1VTLAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9LAorICAgIHsgICAvLyBGTSBKYXBhbgorICAgICAgICBSQURJT19SRUdJT05fSkFQQU4sCisgICAgICAgIHsKKyAgICAgICAgUkFESU9fQkFORF9GTSwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9GTV9KQVBBTiwKKyAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfRk1fSkFQQU4sCisgICAgICAgICAgICAxLAorICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19GTV9KQVBBTn0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICBSQURJT19ERUVNUEhBU0lTXzUwLAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIFJBRElPX1JEU19XT1JMRCwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSwKKyAgICB7ICAgLy8gRk0gS29yZWEKKyAgICAgICAgUkFESU9fUkVHSU9OX0tPUkVBLAorICAgICAgICB7CisgICAgICAgIFJBRElPX0JBTkRfRk0sCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfRk1fSVRVMSwKKyAgICAgICAgICAgIFJBRElPX0JBTkRfVVBQRVJfRk1fSVRVMSwKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX0ZNX0lUVTF9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgUkFESU9fREVFTVBIQVNJU183NSwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICBSQURJT19SRFNfV09STEQsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0sCisgICAgeyAgIC8vIEZNIE9JUlQKKyAgICAgICAgUkFESU9fUkVHSU9OX09JUlQsCisgICAgICAgIHsKKyAgICAgICAgUkFESU9fQkFORF9GTSwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgUkFESU9fQkFORF9MT1dFUl9GTV9PSVJULAorICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9GTV9PSVJULAorICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfRk1fT0lSVH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICBSQURJT19ERUVNUEhBU0lTXzUwLAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIFJBRElPX1JEU19XT1JMRCwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSwKKyAgICB7ICAgLy8gRk0gVVMgSEQgcmFkaW8KKyAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8yLAorICAgICAgICB7CisgICAgICAgICAgICBSQURJT19CQU5EX0ZNX0hELAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX0ZNX0lUVTIsCisgICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0ZNX0lUVTIsCisgICAgICAgICAgICAxLAorICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19GTV9JVFUyfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIFJBRElPX0RFRU1QSEFTSVNfNzUsCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgUkFESU9fUkRTX1VTLAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9LAorICAgIHsgICAvLyBBTSBMVworICAgICAgICBSQURJT19SRUdJT05fSVRVXzEsCisgICAgICAgIHsKKyAgICAgICAgICAgIFJBRElPX0JBTkRfQU0sCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgIFJBRElPX0JBTkRfTE9XRVJfTFcsCisgICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX0xXLAorICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIHtSQURJT19CQU5EX1NQQUNJTkdfTFd9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSwKKyAgICB7ICAgLy8gQU0gU1cKKyAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8xLAorICAgICAgICB7CisgICAgICAgICAgICBSQURJT19CQU5EX0FNLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX1NXLAorICAgICAgICAgICAgUkFESU9fQkFORF9VUFBFUl9TVywKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICB7UkFESU9fQkFORF9TUEFDSU5HX1NXfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0sCisgICAgeyAgIC8vIEFNIE1XIElUVTEKKyAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8xLAorICAgICAgICB7CisgICAgICAgICAgICBSQURJT19CQU5EX0FNLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX01XX0lVVDEsCisgICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX01XX0lUVTEsCisgICAgICAgICAgICAxLAorICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19NV19JVFUxfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0sCisgICAgeyAgIC8vIEFNIE1XIElUVTIKKyAgICAgICAgUkFESU9fUkVHSU9OX0lUVV8yLAorICAgICAgICB7CisgICAgICAgICAgICBSQURJT19CQU5EX0FNLAorICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICBSQURJT19CQU5EX0xPV0VSX01XX0lVVDIsCisgICAgICAgICAgICBSQURJT19CQU5EX1VQUEVSX01XX0lUVTIsCisgICAgICAgICAgICAxLAorICAgICAgICAgICAge1JBRElPX0JBTkRfU1BBQ0lOR19NV19JVFUyfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK307CisKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9SQURJT19SRUdJT05TX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3JhZGlvL1JhZGlvU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9yYWRpby9SYWRpb1NlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMGY1ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9yYWRpby9SYWRpb1NlcnZpY2UuY3BwCkBAIC0wLDAgKzEsOTAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJSYWRpb1NlcnZpY2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vcmFkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vcmFkaW9fbWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgorI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL3JhZGlvLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKyNpbmNsdWRlICJSYWRpb1NlcnZpY2UuaCIKKyNpbmNsdWRlICJSYWRpb1JlZ2lvbnMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgY2hhciBrUmFkaW9UdW5lckF1ZGlvRGV2aWNlTmFtZVtdID0gIlJhZGlvIHR1bmVyIHNvdXJjZSI7CisKK1JhZGlvU2VydmljZTo6UmFkaW9TZXJ2aWNlKCkKKyAgICA6IEJuUmFkaW9TZXJ2aWNlKCksIG1OZXh0VW5pcXVlSWQoMSkKK3sKKyAgICBBTE9HSSgiJXMiLCBfX0ZVTkNUSU9OX18pOworfQorCit2b2lkIFJhZGlvU2VydmljZTo6b25GaXJzdFJlZigpCit7CisgICAgY29uc3QgaHdfbW9kdWxlX3QgKm1vZDsKKyAgICBpbnQgcmM7CisgICAgc3RydWN0IHJhZGlvX2h3X2RldmljZSAqZGV2OworCisgICAgQUxPR0koIiVzIiwgX19GVU5DVElPTl9fKTsKKworICAgIHJjID0gaHdfZ2V0X21vZHVsZV9ieV9jbGFzcyhSQURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIFJBRElPX0hBUkRXQVJFX01PRFVMRV9JRF9GTSwgJm1vZCk7CisgICAgaWYgKHJjICE9IDApIHsKKyAgICAgICAgQUxPR0UoImNvdWxkbid0IGxvYWQgcmFkaW8gbW9kdWxlICVzLiVzICglcykiLAorICAgICAgICAgICAgICBSQURJT19IQVJEV0FSRV9NT0RVTEVfSUQsICJwcmltYXJ5Iiwgc3RyZXJyb3IoLXJjKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmMgPSByYWRpb19od19kZXZpY2Vfb3Blbihtb2QsICZkZXYpOworICAgIGlmIChyYyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBvcGVuIHJhZGlvIGh3IGRldmljZSBpbiAlcy4lcyAoJXMpIiwKKyAgICAgICAgICAgICAgUkFESU9fSEFSRFdBUkVfTU9EVUxFX0lELCAicHJpbWFyeSIsIHN0cmVycm9yKC1yYykpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChkZXYtPmNvbW1vbi52ZXJzaW9uICE9IFJBRElPX0RFVklDRV9BUElfVkVSU0lPTl9DVVJSRU5UKSB7CisgICAgICAgIEFMT0dFKCJ3cm9uZyByYWRpbyBodyBkZXZpY2UgdmVyc2lvbiAlMDR4IiwgZGV2LT5jb21tb24udmVyc2lvbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdHJ1Y3QgcmFkaW9faGFsX3Byb3BlcnRpZXMgaGFsUHJvcGVydGllczsKKyAgICByYyA9IGRldi0+Z2V0X3Byb3BlcnRpZXMoZGV2LCAmaGFsUHJvcGVydGllcyk7CisgICAgaWYgKHJjICE9IDApIHsKKyAgICAgICAgQUxPR0UoImNvdWxkIG5vdCByZWFkIGltcGxlbWVudGF0aW9uIHByb3BlcnRpZXMiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJhZGlvX3Byb3BlcnRpZXNfdCBwcm9wZXJ0aWVzOworICAgIHByb3BlcnRpZXMuaGFuZGxlID0KKyAgICAgICAgICAgIChyYWRpb19oYW5kbGVfdClhbmRyb2lkX2F0b21pY19pbmMoJm1OZXh0VW5pcXVlSWQpOworCisgICAgQUxPR0koImxvYWRlZCBkZWZhdWx0IG1vZHVsZSAlcywgaGFuZGxlICVkIiwgcHJvcGVydGllcy5wcm9kdWN0LCBwcm9wZXJ0aWVzLmhhbmRsZSk7CisKKyAgICBjb252ZXJ0UHJvcGVydGllcygmcHJvcGVydGllcywgJmhhbFByb3BlcnRpZXMpOworICAgIHNwPE1vZHVsZT4gbW9kdWxlID0gbmV3IE1vZHVsZShkZXYsIHByb3BlcnRpZXMpOworICAgIG1Nb2R1bGVzLmFkZChwcm9wZXJ0aWVzLmhhbmRsZSwgbW9kdWxlKTsKK30KKworUmFkaW9TZXJ2aWNlOjp+UmFkaW9TZXJ2aWNlKCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHJhZGlvX2h3X2RldmljZV9jbG9zZShtTW9kdWxlcy52YWx1ZUF0KGkpLT5od0RldmljZSgpKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFJhZGlvU2VydmljZTo6bGlzdE1vZHVsZXMoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKQoreworICAgIEFMT0dWKCJsaXN0TW9kdWxlcyIpOworCisgICAgQXV0b011dGV4IGxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICBpZiAobnVtTW9kdWxlcyA9PSBOVUxMIHx8ICgqbnVtTW9kdWxlcyAhPSAwICYmIHByb3BlcnRpZXMgPT0gTlVMTCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc2l6ZV90IG1heE1vZHVsZXMgPSAqbnVtTW9kdWxlczsKKyAgICAqbnVtTW9kdWxlcyA9IG1Nb2R1bGVzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Nb2R1bGVzLnNpemUoKSAmJiBpIDwgbWF4TW9kdWxlczsgaSsrKSB7CisgICAgICAgIHByb3BlcnRpZXNbaV0gPSBtTW9kdWxlcy52YWx1ZUF0KGkpLT5wcm9wZXJ0aWVzKCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjphdHRhY2gocmFkaW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVJhZGlvQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdpdGhBdWRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPElSYWRpbz4mIHJhZGlvKQoreworICAgIEFMT0dWKCIlcyAlZCBjb25maWcgJXAgd2l0aEF1ZGlvICVkIiwgX19GVU5DVElPTl9fLCBoYW5kbGUsIGNvbmZpZywgd2l0aEF1ZGlvKTsKKworICAgIEF1dG9NdXRleCBsb2NrKG1TZXJ2aWNlTG9jayk7CisgICAgcmFkaW8uY2xlYXIoKTsKKyAgICBpZiAoY2xpZW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3NpemVfdCBpbmRleCA9IG1Nb2R1bGVzLmluZGV4T2ZLZXkoaGFuZGxlKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNwPE1vZHVsZT4gbW9kdWxlID0gbU1vZHVsZXMudmFsdWVBdChpbmRleCk7CisKKyAgICBpZiAoY29uZmlnID09IE5VTEwpIHsKKyAgICAgICAgY29uZmlnID0gbW9kdWxlLT5nZXREZWZhdWx0Q29uZmlnKCk7CisgICAgICAgIGlmIChjb25maWcgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCIlcyByZWdpb24gJWQgdHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgY29uZmlnLT5yZWdpb24sIGNvbmZpZy0+YmFuZC50eXBlKTsKKworICAgIHJhZGlvID0gbW9kdWxlLT5hZGRDbGllbnQoY2xpZW50LCBjb25maWcsIHdpdGhBdWRpbyk7CisKKyAgICBpZiAocmFkaW8gPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKK3N0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrUmV0cmllcyA9IDUwOworc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tTbGVlcCA9IDYwMDAwOworCitzdGF0aWMgYm9vbCB0cnlMb2NrKE11dGV4JiBtdXRleCkKK3sKKyAgICBib29sIGxvY2tlZCA9IGZhbHNlOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0R1bXBMb2NrUmV0cmllczsgKytpKSB7CisgICAgICAgIGlmIChtdXRleC50cnlMb2NrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGxvY2tlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB1c2xlZXAoa0R1bXBMb2NrU2xlZXApOworICAgIH0KKyAgICByZXR1cm4gbG9ja2VkOworfQorCitzdGF0dXNfdCBSYWRpb1NlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSB7CisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgaWYgKGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIikpID09IGZhbHNlKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIFJhZGlvU2VydmljZSIpOworICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBib29sIGxvY2tlZCA9IHRyeUxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICAgICAgLy8gZmFpbGVkIHRvIGxvY2sgLSBSYWRpb1NlcnZpY2UgaXMgcHJvYmFibHkgZGVhZGxvY2tlZAorICAgICAgICBpZiAoIWxvY2tlZCkgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiUmFkaW9TZXJ2aWNlIG1heSBiZSBkZWFkbG9ja2VkXG4iKTsKKyAgICAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvY2tlZCkgbVNlcnZpY2VMb2NrLnVubG9jaygpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IFJhZGlvU2VydmljZTo6b25UcmFuc2FjdCgKKyAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzKSB7CisgICAgcmV0dXJuIEJuUmFkaW9TZXJ2aWNlOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Cit9CisKKworLy8gc3RhdGljCit2b2lkIFJhZGlvU2VydmljZTo6Y2FsbGJhY2socmFkaW9faGFsX2V2ZW50X3QgKmhhbEV2ZW50LCB2b2lkICpjb29raWUpCit7CisgICAgQ2FsbGJhY2tUaHJlYWQgKmNhbGxiYWNrVGhyZWFkID0gKENhbGxiYWNrVGhyZWFkICopY29va2llOworICAgIGlmIChjYWxsYmFja1RocmVhZCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FsbGJhY2tUaHJlYWQtPnNlbmRFdmVudChoYWxFdmVudCk7Cit9CisKKy8qIHN0YXRpYyAqLwordm9pZCBSYWRpb1NlcnZpY2U6OmNvbnZlcnRQcm9wZXJ0aWVzKHJhZGlvX3Byb3BlcnRpZXNfdCAqcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYWRpb19oYWxfcHJvcGVydGllc190ICpoYWxQcm9wZXJ0aWVzKQoreworICAgIG1lbXNldChwcm9wZXJ0aWVzLCAwLCBzaXplb2Yoc3RydWN0IHJhZGlvX3Byb3BlcnRpZXMpKTsKKyAgICBwcm9wZXJ0aWVzLT5jbGFzc19pZCA9IGhhbFByb3BlcnRpZXMtPmNsYXNzX2lkOworICAgIHN0cmxjcHkocHJvcGVydGllcy0+aW1wbGVtZW50b3IsIGhhbFByb3BlcnRpZXMtPmltcGxlbWVudG9yLAorICAgICAgICAgICAgUkFESU9fU1RSSU5HX0xFTl9NQVgpOworICAgIHN0cmxjcHkocHJvcGVydGllcy0+cHJvZHVjdCwgaGFsUHJvcGVydGllcy0+cHJvZHVjdCwKKyAgICAgICAgICAgIFJBRElPX1NUUklOR19MRU5fTUFYKTsKKyAgICBzdHJsY3B5KHByb3BlcnRpZXMtPnZlcnNpb24sIGhhbFByb3BlcnRpZXMtPnZlcnNpb24sCisgICAgICAgICAgICBSQURJT19TVFJJTkdfTEVOX01BWCk7CisgICAgc3RybGNweShwcm9wZXJ0aWVzLT5zZXJpYWwsIGhhbFByb3BlcnRpZXMtPnNlcmlhbCwKKyAgICAgICAgICAgIFJBRElPX1NUUklOR19MRU5fTUFYKTsKKyAgICBwcm9wZXJ0aWVzLT5udW1fdHVuZXJzID0gaGFsUHJvcGVydGllcy0+bnVtX3R1bmVyczsKKyAgICBwcm9wZXJ0aWVzLT5udW1fYXVkaW9fc291cmNlcyA9IGhhbFByb3BlcnRpZXMtPm51bV9hdWRpb19zb3VyY2VzOworICAgIHByb3BlcnRpZXMtPnN1cHBvcnRzX2NhcHR1cmUgPSBoYWxQcm9wZXJ0aWVzLT5zdXBwb3J0c19jYXB0dXJlOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNLbm93blJlZ2lvbkNvbmZpZ3MpOyBpKyspIHsKKyAgICAgICAgY29uc3QgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgKmJhbmQgPSAmc0tub3duUmVnaW9uQ29uZmlnc1tpXS5iYW5kOworICAgICAgICBzaXplX3QgajsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGhhbFByb3BlcnRpZXMtPm51bV9iYW5kczsgaisrKSB7CisgICAgICAgICAgICBjb25zdCByYWRpb19oYWxfYmFuZF9jb25maWdfdCAqaGFsQmFuZCA9ICZoYWxQcm9wZXJ0aWVzLT5iYW5kc1tqXTsKKyAgICAgICAgICAgIHNpemVfdCBrOworICAgICAgICAgICAgaWYgKGJhbmQtPnR5cGUgIT0gaGFsQmFuZC0+dHlwZSkgY29udGludWU7CisgICAgICAgICAgICBpZiAoYmFuZC0+bG93ZXJfbGltaXQgPCBoYWxCYW5kLT5sb3dlcl9saW1pdCkgY29udGludWU7CisgICAgICAgICAgICBpZiAoYmFuZC0+dXBwZXJfbGltaXQgPiBoYWxCYW5kLT51cHBlcl9saW1pdCkgY29udGludWU7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgaGFsQmFuZC0+bnVtX3NwYWNpbmdzOyBrKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYmFuZC0+c3BhY2luZ3NbMF0gPT0gaGFsQmFuZC0+c3BhY2luZ3Nba10pIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGsgPT0gaGFsQmFuZC0+bnVtX3NwYWNpbmdzKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChiYW5kLT50eXBlID09IFJBRElPX0JBTkRfQU0pIGJyZWFrOworICAgICAgICAgICAgaWYgKChiYW5kLT5mbS5kZWVtcGhhc2lzICYgaGFsQmFuZC0+Zm0uZGVlbXBoYXNpcykgPT0gMCkgY29udGludWU7CisgICAgICAgICAgICBpZiAoaGFsQmFuZC0+Zm0ucmRzID09IDApIGJyZWFrOworICAgICAgICAgICAgaWYgKChiYW5kLT5mbS5yZHMgJiBoYWxCYW5kLT5mbS5yZHMpICE9IDApIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChqID09IGhhbFByb3BlcnRpZXMtPm51bV9iYW5kcykgY29udGludWU7CisKKyAgICAgICAgQUxPR0koImNvbnZlcnRQcm9wZXJ0aWVzKCkgQWRkaW5nIGJhbmQgdHlwZSAlZCByZWdpb24gJWQiLAorICAgICAgICAgICAgICBzS25vd25SZWdpb25Db25maWdzW2ldLmJhbmQudHlwZSAsIHNLbm93blJlZ2lvbkNvbmZpZ3NbaV0ucmVnaW9uKTsKKworICAgICAgICBtZW1jcHkoJnByb3BlcnRpZXMtPmJhbmRzW3Byb3BlcnRpZXMtPm51bV9iYW5kcysrXSwKKyAgICAgICAgICAgICAgICZzS25vd25SZWdpb25Db25maWdzW2ldLAorICAgICAgICAgICAgICAgc2l6ZW9mKHJhZGlvX2JhbmRfY29uZmlnX3QpKTsKKyAgICB9Cit9CisKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIlJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQiCisKK1JhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6OkNhbGxiYWNrVGhyZWFkKGNvbnN0IHdwPE1vZHVsZUNsaWVudD4mIG1vZHVsZUNsaWVudCkKKyAgICA6IG1Nb2R1bGVDbGllbnQobW9kdWxlQ2xpZW50KSwgbU1lbW9yeURlYWxlcihuZXcgTWVtb3J5RGVhbGVyKDEwMjQgKiAxMDI0LCAiUmFkaW9TZXJ2aWNlIikpCit7Cit9CisKK1JhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6On5DYWxsYmFja1RocmVhZCgpCit7CisgICAgbUV2ZW50UXVldWUuY2xlYXIoKTsKK30KKwordm9pZCBSYWRpb1NlcnZpY2U6OkNhbGxiYWNrVGhyZWFkOjpvbkZpcnN0UmVmKCkKK3sKKyAgICBydW4oIlJhZGlvU2VydmljZSBjYmsiLCBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTyk7Cit9CisKK2Jvb2wgUmFkaW9TZXJ2aWNlOjpDYWxsYmFja1RocmVhZDo6dGhyZWFkTG9vcCgpCit7CisgICAgd2hpbGUgKCFleGl0UGVuZGluZygpKSB7CisgICAgICAgIHNwPElNZW1vcnk+IGV2ZW50TWVtb3J5OworICAgICAgICBzcDxNb2R1bGVDbGllbnQ+IG1vZHVsZUNsaWVudDsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYWxsYmFja0xvY2spOworICAgICAgICAgICAgd2hpbGUgKG1FdmVudFF1ZXVlLmlzRW1wdHkoKSAmJiAhZXhpdFBlbmRpbmcoKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJDYWxsYmFja1RocmVhZDo6dGhyZWFkTG9vcCgpIHNsZWVwIik7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrQ29uZC53YWl0KG1DYWxsYmFja0xvY2spOworICAgICAgICAgICAgICAgIEFMT0dWKCJDYWxsYmFja1RocmVhZDo6dGhyZWFkTG9vcCgpIHdha2UgdXAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChleGl0UGVuZGluZygpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBldmVudE1lbW9yeSA9IG1FdmVudFF1ZXVlWzBdOworICAgICAgICAgICAgbUV2ZW50UXVldWUucmVtb3ZlQXQoMCk7CisgICAgICAgICAgICBtb2R1bGVDbGllbnQgPSBtTW9kdWxlQ2xpZW50LnByb21vdGUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobW9kdWxlQ2xpZW50ICE9IDApIHsKKyAgICAgICAgICAgIG1vZHVsZUNsaWVudC0+b25DYWxsYmFja0V2ZW50KGV2ZW50TWVtb3J5KTsKKyAgICAgICAgICAgIGV2ZW50TWVtb3J5LmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6OmV4aXQoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FsbGJhY2tMb2NrKTsKKyAgICByZXF1ZXN0RXhpdCgpOworICAgIG1DYWxsYmFja0NvbmQuYnJvYWRjYXN0KCk7Cit9CisKK3NwPElNZW1vcnk+IFJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6OnByZXBhcmVFdmVudChyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpCit7CisgICAgc3A8SU1lbW9yeT4gZXZlbnRNZW1vcnk7CisKKyAgICBzaXplX3QgaGVhZGVyU2l6ZSA9CisgICAgICAgICAgICAoc2l6ZW9mKHN0cnVjdCByYWRpb19ldmVudCkgKyBzaXplb2YodW5zaWduZWQgaW50KSAtIDEpIC9zaXplb2YodW5zaWduZWQgaW50KTsKKyAgICBzaXplX3QgbWV0YWRhdGFTaXplID0gMDsKKyAgICBzd2l0Y2ggKGhhbEV2ZW50LT50eXBlKSB7CisgICAgY2FzZSBSQURJT19FVkVOVF9UVU5FRDoKKyAgICBjYXNlIFJBRElPX0VWRU5UX0FGX1NXSVRDSDoKKyAgICAgICAgaWYgKHJhZGlvX21ldGFkYXRhX2NoZWNrKGhhbEV2ZW50LT5pbmZvLm1ldGFkYXRhKSA9PSAwKSB7CisgICAgICAgICAgICBtZXRhZGF0YVNpemUgPSByYWRpb19tZXRhZGF0YV9nZXRfc2l6ZShoYWxFdmVudC0+aW5mby5tZXRhZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSQURJT19FVkVOVF9NRVRBREFUQToKKyAgICAgICAgaWYgKHJhZGlvX21ldGFkYXRhX2NoZWNrKGhhbEV2ZW50LT5tZXRhZGF0YSkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGV2ZW50TWVtb3J5OworICAgICAgICB9CisgICAgICAgIG1ldGFkYXRhU2l6ZSA9IHJhZGlvX21ldGFkYXRhX2dldF9zaXplKGhhbEV2ZW50LT5tZXRhZGF0YSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBzaXplX3Qgc2l6ZSA9IGhlYWRlclNpemUgKyBtZXRhZGF0YVNpemU7CisgICAgZXZlbnRNZW1vcnkgPSBtTWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShzaXplKTsKKyAgICBpZiAoZXZlbnRNZW1vcnkgPT0gMCB8fCBldmVudE1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwpIHsKKyAgICAgICAgZXZlbnRNZW1vcnkuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIGV2ZW50TWVtb3J5OworICAgIH0KKyAgICBzdHJ1Y3QgcmFkaW9fZXZlbnQgKmV2ZW50ID0gKHN0cnVjdCByYWRpb19ldmVudCAqKWV2ZW50TWVtb3J5LT5wb2ludGVyKCk7CisgICAgZXZlbnQtPnR5cGUgPSBoYWxFdmVudC0+dHlwZTsKKyAgICBldmVudC0+c3RhdHVzID0gaGFsRXZlbnQtPnN0YXR1czsKKworICAgIHN3aXRjaCAoZXZlbnQtPnR5cGUpIHsKKyAgICBjYXNlIFJBRElPX0VWRU5UX0NPTkZJRzoKKyAgICAgICAgZXZlbnQtPmNvbmZpZy5iYW5kID0gaGFsRXZlbnQtPmNvbmZpZzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSQURJT19FVkVOVF9UVU5FRDoKKyAgICBjYXNlIFJBRElPX0VWRU5UX0FGX1NXSVRDSDoKKyAgICAgICAgZXZlbnQtPmluZm8gPSBoYWxFdmVudC0+aW5mbzsKKyAgICAgICAgaWYgKG1ldGFkYXRhU2l6ZSAhPSAwKSB7CisgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKilldmVudCArIGhlYWRlclNpemUsIGhhbEV2ZW50LT5pbmZvLm1ldGFkYXRhLCBtZXRhZGF0YVNpemUpOworICAgICAgICAgICAgLy8gcmVwbGFjZSBtZXRhIGRhdGEgcG9pbnRlciBieSBvZmZzZXQgd2hpbGUgaW4gc2hhcmVkIG1lbW9yeSBzbyB0aGF0IHJlY2VpdmluZyBzaWRlCisgICAgICAgICAgICAvLyBjYW4gcmVzdG9yZSB0aGUgcG9pbnRlciBpbiBkZXN0aW5hdGlvbiBwcm9jZXNzLgorICAgICAgICAgICAgZXZlbnQtPmluZm8ubWV0YWRhdGEgPSAocmFkaW9fbWV0YWRhdGFfdCAqKWhlYWRlclNpemU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSQURJT19FVkVOVF9UQToKKyAgICBjYXNlIFJBRElPX0VWRU5UX0FOVEVOTkE6CisgICAgY2FzZSBSQURJT19FVkVOVF9DT05UUk9MOgorICAgICAgICBldmVudC0+b24gPSBoYWxFdmVudC0+b247CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkFESU9fRVZFTlRfTUVUQURBVEE6CisgICAgICAgIG1lbWNweSgoY2hhciAqKWV2ZW50ICsgaGVhZGVyU2l6ZSwgaGFsRXZlbnQtPm1ldGFkYXRhLCBtZXRhZGF0YVNpemUpOworICAgICAgICAvLyByZXBsYWNlIG1ldGEgZGF0YSBwb2ludGVyIGJ5IG9mZnNldCB3aGlsZSBpbiBzaGFyZWQgbWVtb3J5IHNvIHRoYXQgcmVjZWl2aW5nIHNpZGUKKyAgICAgICAgLy8gY2FuIHJlc3RvcmUgdGhlIHBvaW50ZXIgaW4gZGVzdGluYXRpb24gcHJvY2Vzcy4KKyAgICAgICAgZXZlbnQtPm1ldGFkYXRhID0gKHJhZGlvX21ldGFkYXRhX3QgKiloZWFkZXJTaXplOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJBRElPX0VWRU5UX0hXX0ZBSUxVUkU6CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGV2ZW50TWVtb3J5OworfQorCit2b2lkIFJhZGlvU2VydmljZTo6Q2FsbGJhY2tUaHJlYWQ6OnNlbmRFdmVudChyYWRpb19oYWxfZXZlbnRfdCAqZXZlbnQpCisgeworICAgICBzcDxJTWVtb3J5PiBldmVudE1lbW9yeSA9IHByZXBhcmVFdmVudChldmVudCk7CisgICAgIGlmIChldmVudE1lbW9yeSA9PSAwKSB7CisgICAgICAgICByZXR1cm47CisgICAgIH0KKworICAgICBBdXRvTXV0ZXggbG9jayhtQ2FsbGJhY2tMb2NrKTsKKyAgICAgbUV2ZW50UXVldWUuYWRkKGV2ZW50TWVtb3J5KTsKKyAgICAgbUNhbGxiYWNrQ29uZC5zaWduYWwoKTsKKyAgICAgQUxPR1YoIiVzIERPTkUiLCBfX0ZVTkNUSU9OX18pOworfQorCisKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIlJhZGlvU2VydmljZTo6TW9kdWxlIgorCitSYWRpb1NlcnZpY2U6Ok1vZHVsZTo6TW9kdWxlKHJhZGlvX2h3X2RldmljZSogaHdEZXZpY2UsIHJhZGlvX3Byb3BlcnRpZXMgcHJvcGVydGllcykKKyA6IG1Id0RldmljZShod0RldmljZSksIG1Qcm9wZXJ0aWVzKHByb3BlcnRpZXMpLCBtTXV0ZSh0cnVlKQoreworfQorCitSYWRpb1NlcnZpY2U6Ok1vZHVsZTo6fk1vZHVsZSgpIHsKKyAgICBtTW9kdWxlQ2xpZW50cy5jbGVhcigpOworfQorCitzdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZTo6ZHVtcChpbnQgZmQgX191bnVzZWQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpIHsKKyAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3NwPFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50PiBSYWRpb1NlcnZpY2U6Ok1vZHVsZTo6YWRkQ2xpZW50KGNvbnN0IHNwPElSYWRpb0NsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdWRpbykKK3sKKyAgICBBTE9HVigiYWRkQ2xpZW50KCkgJXAgY29uZmlnICVwIHByb2R1Y3QgJXMiLCB0aGlzLCBjb25maWcsIG1Qcm9wZXJ0aWVzLnByb2R1Y3QpOworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBzcDxNb2R1bGVDbGllbnQ+IG1vZHVsZUNsaWVudDsKKyAgICBpbnQgcmV0OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlQ2xpZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobU1vZHVsZUNsaWVudHNbaV0tPmNsaWVudCgpID09IGNsaWVudCkgeworICAgICAgICAgICAgLy8gY2xpZW50IGFscmVhZHkgY29ubmVjdGVkOiByZWplY3QKKyAgICAgICAgICAgIHJldHVybiBtb2R1bGVDbGllbnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgbW9kdWxlQ2xpZW50ID0gbmV3IE1vZHVsZUNsaWVudCh0aGlzLCBjbGllbnQsIGNvbmZpZywgYXVkaW8pOworCisgICAgc3RydWN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZyBoYWxDb25maWc7CisgICAgaGFsQ29uZmlnID0gY29uZmlnLT5iYW5kOworCisgICAgLy8gVHVuZXIgcHJlZW1wdGlvbiBsb2dpYzoKKyAgICAvLyBUaGVyZSBpcyBhIGxpbWl0ZWQgYW1vdW50IG9mIHR1bmVycyBhbmQgYSBsaW1pdGVkIGFtb3VudCBvZiByYWRpbyBhdWRpbyBzb3VyY2VzIHBlciBtb2R1bGUuCisgICAgLy8gVGhlIG1pbmltdW0gaXMgb25lIHR1bmVyIGFuZCBvbmUgYXVkaW8gc291cmNlLgorICAgIC8vIFRoZSBudW1iZXJzIG9mIHR1bmVycyBhbmQgc291cmNlcyBhcmUgaW5kaWNhdGVkIGluIHRoZSBtb2R1bGUgcHJvcGVydGllcy4KKyAgICAvLyBOT1RFOiBjdXJyZW50IGZyYW1ld29yayBpbXBsZW1lbnRhdGlvbiBvbmx5IHN1cHBvcnRzIG9uZSByYWRpbyBhdWRpbyBzb3VyY2UuCisgICAgLy8gSXQgaXMgcG9zc2libGUgdG8gb3BlbiBtb3JlIHRoYW4gb25lIHR1bmVyIGF0IGEgdGltZSBidXQgb25seSBvbmUgdHVuZXIgY2FuIGJlIGNvbm5lY3RlZAorICAgIC8vIHRvIHRoZSByYWRpbyBhdWRpbyBzb3VyY2UgKEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUikuCisgICAgLy8gVGhlIGJhc2UgcnVsZSBpcyB0aGF0IGEgbmV3bHkgY29ubmVjdGVkIHR1bmVyIGFsd2F5cyB3aW5zLCBpLmUuIGFsd2F5cyBnZXRzIGEgdHVuZXIKKyAgICAvLyBhbmQgY2FuIHVzZSB0aGUgYXVkaW8gc291cmNlIGlmIHJlcXVlc3RlZC4KKyAgICAvLyBJZiBhbm90aGVyIGNsaWVudCBpcyBwcmVlbXB0ZWQsIGl0IGlzIG5vdGlmaWVkIGJ5IGEgY2FsbGJhY2sgd2l0aCBSQURJT19FVkVOVF9DT05UUk9MCisgICAgLy8gaW5kaWNhdGluZyBsb3NzIG9mIGNvbnRyb2wuCisgICAgLy8gLSBJZiB0aGUgbmV3bHkgY29ubmVjdGVkIGNsaWVudCByZXF1ZXN0cyB0aGUgYXVkaW8gc291cmNlIChhdWRpbyA9PSB0cnVlKToKKyAgICAvLyAgICAtIGlmIGFuIGF1ZGlvIHNvdXJjZSBpcyBhdmFpbGFibGUKKyAgICAvLyAgICAgICAgICBubyBwcm9ibGVtCisgICAgLy8gICAgLSBpZiBub3Q6CisgICAgLy8gICAgICAgICAgdGhlIG9sZGVzdCBjbGllbnQgaW4gdGhlIGxpc3QgdXNpbmcgYXVkaW8gaXMgcHJlZW1wdGVkLgorICAgIC8vIC0gSWYgdGhlIG5ld2x5IGNvbm5lY3RlZCBjbGllbnQgZG9lcyBub3QgcmVxdWVzdCB0aGUgYXVkaW8gc291cmNlIChhdWRpbyA9PSBmYWxzZSk6CisgICAgLy8gICAgLSBpZiBhIHR1bmVyIGlzIGF2YWlsYWJsZQorICAgIC8vICAgICAgICAgIG5vIHByb2JsZW0KKyAgICAvLyAgICAtIGlmIG5vdDoKKyAgICAvLyAgICAgICAgICBUaGUgb2xkZXN0IGNsaWVudCBub3QgdXNpbmcgYXVkaW8gaXMgcHJlZW1wdGVkIGZpcnN0IGFuZCBpZiBub25lIGlzIGZvdW5kIHRoZQorICAgIC8vICAgICAgICAgIHRoZSBvbGRlc3QgY2xpZW50IHVzaW5nIGF1ZGlvIGlzIHByZWVtcHRlZC4KKyAgICAvLyBFYWNoIHRpbWUgYSB0dW5lciB1c2luZyB0aGUgYXVkaW8gc291cmNlIGlzIG9wZW5lZCBvciBjbG9zZWQsIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciBpcworICAgIC8vIG5vdGlmaWVkIG9mIHRoZSBjb25uZWN0aW9uIG9yIGRpc2Nvbm5lY3Rpb24gb2YgQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSLgorCisgICAgc3A8TW9kdWxlQ2xpZW50PiBvbGRlc3RUdW5lcjsKKyAgICBzcDxNb2R1bGVDbGllbnQ+IG9sZGVzdEF1ZGlvOworICAgIHNpemVfdCBhbGxvY2F0ZWRUdW5lcnMgPSAwOworICAgIHNpemVfdCBhbGxvY2F0ZWRBdWRpbyA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlQ2xpZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobU1vZHVsZUNsaWVudHNbaV0tPmdldFR1bmVyKCkgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldLT5hdWRpbygpKSB7CisgICAgICAgICAgICAgICAgaWYgKG9sZGVzdEF1ZGlvID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb2xkZXN0QXVkaW8gPSBtTW9kdWxlQ2xpZW50c1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWxsb2NhdGVkQXVkaW8rKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKG9sZGVzdFR1bmVyID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb2xkZXN0VHVuZXIgPSBtTW9kdWxlQ2xpZW50c1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWxsb2NhdGVkVHVuZXJzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fdHVuZXIgKmhhbFR1bmVyOworICAgIHNwPE1vZHVsZUNsaWVudD4gcHJlZW10ZWRDbGllbnQ7CisgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgIGlmIChhbGxvY2F0ZWRBdWRpbyA+PSBtUHJvcGVydGllcy5udW1fYXVkaW9fc291cmNlcykgeworICAgICAgICAgICAgQUxPR19BU1NFUlQob2xkZXN0QXVkaW8gIT0gMCwgImFkZENsaWVudCgpIGFsbG9jYXRlZEF1ZGlvL29sZGVzdEF1ZGlvIG1pc21hdGNoIik7CisgICAgICAgICAgICBwcmVlbXRlZENsaWVudCA9IG9sZGVzdEF1ZGlvOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGFsbG9jYXRlZEF1ZGlvICsgYWxsb2NhdGVkVHVuZXJzID49IG1Qcm9wZXJ0aWVzLm51bV90dW5lcnMpIHsKKyAgICAgICAgICAgIGlmIChhbGxvY2F0ZWRUdW5lcnMgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG9sZGVzdFR1bmVyICE9IDAsICJhZGRDbGllbnQoKSBhbGxvY2F0ZWRUdW5lcnMvb2xkZXN0VHVuZXIgbWlzbWF0Y2giKTsKKyAgICAgICAgICAgICAgICBwcmVlbXRlZENsaWVudCA9IG9sZGVzdFR1bmVyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChvbGRlc3RBdWRpbyAhPSAwLCAiYWRkQ2xpZW50KCkgYWxsb2NhdGVkQXVkaW8vb2xkZXN0QXVkaW8gbWlzbWF0Y2giKTsKKyAgICAgICAgICAgICAgICBwcmVlbXRlZENsaWVudCA9IG9sZGVzdEF1ZGlvOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChwcmVlbXRlZENsaWVudCAhPSAwKSB7CisgICAgICAgIGhhbFR1bmVyID0gcHJlZW10ZWRDbGllbnQtPmdldFR1bmVyKCk7CisgICAgICAgIHByZWVtdGVkQ2xpZW50LT5zZXRUdW5lcihOVUxMKTsKKyAgICAgICAgbUh3RGV2aWNlLT5jbG9zZV90dW5lcihtSHdEZXZpY2UsIGhhbFR1bmVyKTsKKyAgICAgICAgaWYgKHByZWVtdGVkQ2xpZW50LT5hdWRpbygpKSB7CisgICAgICAgICAgICBub3RpZnlEZXZpY2VDb25uZWN0aW9uKGZhbHNlLCAiIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXQgPSBtSHdEZXZpY2UtPm9wZW5fdHVuZXIobUh3RGV2aWNlLCAmaGFsQ29uZmlnLCBhdWRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9TZXJ2aWNlOjpjYWxsYmFjaywgbW9kdWxlQ2xpZW50LT5jYWxsYmFja1RocmVhZCgpLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFsVHVuZXIpOworICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICBBTE9HVigiYWRkQ2xpZW50KCkgc2V0VHVuZXIgJXAiLCBoYWxUdW5lcik7CisgICAgICAgIG1vZHVsZUNsaWVudC0+c2V0VHVuZXIoaGFsVHVuZXIpOworICAgICAgICBtTW9kdWxlQ2xpZW50cy5hZGQobW9kdWxlQ2xpZW50KTsKKyAgICAgICAgaWYgKGF1ZGlvKSB7CisgICAgICAgICAgICBub3RpZnlEZXZpY2VDb25uZWN0aW9uKHRydWUsICIiKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiYWRkQ2xpZW50KCkgRE9ORSBtb2R1bGVDbGllbnQgJXAiLCBtb2R1bGVDbGllbnQuZ2V0KCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCIlcyBvcGVuX3R1bmVyIGZhaWxlZCB3aXRoIGVycm9yICVkIiwgX19GVU5DVElPTl9fLCByZXQpOworICAgICAgICBtb2R1bGVDbGllbnQuY2xlYXIoKTsKKyAgICB9CisKKyAgICByZXR1cm4gbW9kdWxlQ2xpZW50OworfQorCit2b2lkIFJhZGlvU2VydmljZTo6TW9kdWxlOjpyZW1vdmVDbGllbnQoY29uc3Qgc3A8TW9kdWxlQ2xpZW50PiYgbW9kdWxlQ2xpZW50KSB7CisgICAgQUxPR1YoInJlbW92ZUNsaWVudCgpIik7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIGludCByZXQ7CisgICAgc3NpemVfdCBpbmRleCA9IC0xOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW9kdWxlQ2xpZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobU1vZHVsZUNsaWVudHNbaV0gPT0gbW9kdWxlQ2xpZW50KSB7CisgICAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5kZXggPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1Nb2R1bGVDbGllbnRzLnJlbW92ZUF0KGluZGV4KTsKKyAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fdHVuZXIgKmhhbFR1bmVyID0gbW9kdWxlQ2xpZW50LT5nZXRUdW5lcigpOworICAgIGlmIChoYWxUdW5lciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtSHdEZXZpY2UtPmNsb3NlX3R1bmVyKG1Id0RldmljZSwgaGFsVHVuZXIpOworICAgIGlmIChtb2R1bGVDbGllbnQtPmF1ZGlvKCkpIHsKKyAgICAgICAgbm90aWZ5RGV2aWNlQ29ubmVjdGlvbihmYWxzZSwgIiIpOworICAgIH0KKworICAgIG1NdXRlID0gdHJ1ZTsKKworICAgIGlmIChtTW9kdWxlQ2xpZW50cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFR1bmVyIHJlYWxsb2NhdGlvbiBsb2dpYzoKKyAgICAvLyBXaGVuIGEgY2xpZW50IGlzIHJlbW92ZWQgYW5kIHdhcyBjb250cm9sbGluZyBhIHR1bmVyLCB0aGlzIHR1bmVyIHdpbGwgYmUgYWxsb2NhdGVkIHRvIGEKKyAgICAvLyBwcmV2aW91c2x5IHByZWVtcHRlZCBjbGllbnQuIFRoaXMgY2xpZW50IHdpbGwgYmUgbm90aWZpZWQgYnkgYSBjYWxsYmFjayB3aXRoCisgICAgLy8gUkFESU9fRVZFTlRfQ09OVFJPTCBpbmRpY2F0aW5nIGdhaW4gb2YgY29udHJvbC4KKyAgICAvLyAtIElmIGEgcHJlZW1wdGVkIGNsaWVudCBpcyB3YWl0aW5nIGZvciBhbiBhdWRpbyBzb3VyY2UgYW5kIG9uZSBiZWNvbWVzIGF2YWlsYWJsZToKKyAgICAvLyAgICBBbGxvY2F0ZSB0aGUgdHVuZXIgdG8gdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgY2xpZW50IHdhaXRpbmcgZm9yIGFuIGF1ZGlvIHNvdXJjZQorICAgIC8vIC0gSWYgbm90OgorICAgIC8vICAgIEFsbG9jYXRlIHRoZSB0dW5lciB0byB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBjbGllbnQuCisgICAgLy8gRWFjaCB0aW1lIGEgdHVuZXIgdXNpbmcgdGhlIGF1ZGlvIHNvdXJjZSBpcyBvcGVuZWQgb3IgY2xvc2VkLCB0aGUgYXVkaW8gcG9saWN5IG1hbmFnZXIgaXMKKyAgICAvLyBub3RpZmllZCBvZiB0aGUgY29ubmVjdGlvbiBvciBkaXNjb25uZWN0aW9uIG9mIEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUi4KKworICAgIHNwPE1vZHVsZUNsaWVudD4geW91bmdlc3RDbGllbnQ7CisgICAgc3A8TW9kdWxlQ2xpZW50PiB5b3VuZ2VzdENsaWVudEF1ZGlvOworICAgIHNpemVfdCBhbGxvY2F0ZWRUdW5lcnMgPSAwOworICAgIHNpemVfdCBhbGxvY2F0ZWRBdWRpbyA9IDA7CisgICAgZm9yIChzc2l6ZV90IGkgPSBtTW9kdWxlQ2xpZW50cy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBpZiAobU1vZHVsZUNsaWVudHNbaV0tPmdldFR1bmVyKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKG1Nb2R1bGVDbGllbnRzW2ldLT5hdWRpbygpKSB7CisgICAgICAgICAgICAgICAgaWYgKHlvdW5nZXN0Q2xpZW50QXVkaW8gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICB5b3VuZ2VzdENsaWVudEF1ZGlvID0gbU1vZHVsZUNsaWVudHNbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoeW91bmdlc3RDbGllbnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICB5b3VuZ2VzdENsaWVudCA9IG1Nb2R1bGVDbGllbnRzW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtTW9kdWxlQ2xpZW50c1tpXS0+YXVkaW8oKSkgeworICAgICAgICAgICAgICAgIGFsbG9jYXRlZEF1ZGlvKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFsbG9jYXRlZFR1bmVycysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQUxPR19BU1NFUlQoYWxsb2NhdGVkVHVuZXJzICsgYWxsb2NhdGVkQXVkaW8gPCBtUHJvcGVydGllcy5udW1fdHVuZXJzLAorICAgICAgICAgICAgICAgICJyZW1vdmVDbGllbnQoKSByZW1vdmVkIGNsaWVudCBidXQgbm8gdHVuZXIgYXZhaWxhYmxlIik7CisKKyAgICBBTE9HX0FTU0VSVCghbW9kdWxlQ2xpZW50LT5hdWRpbygpIHx8IGFsbG9jYXRlZEF1ZGlvIDwgbVByb3BlcnRpZXMubnVtX2F1ZGlvX3NvdXJjZXMsCisgICAgICAgICAgICAgICAgInJlbW92ZUNsaWVudCgpIHJlbW92ZWQgYXVkaW8gY2xpZW50IGJ1dCBubyB0dW5lciB3aXRoIGF1ZGlvIGF2YWlsYWJsZSIpOworCisgICAgaWYgKGFsbG9jYXRlZEF1ZGlvIDwgbVByb3BlcnRpZXMubnVtX2F1ZGlvX3NvdXJjZXMgJiYgeW91bmdlc3RDbGllbnRBdWRpbyAhPSAwKSB7CisgICAgICAgIHlvdW5nZXN0Q2xpZW50ID0geW91bmdlc3RDbGllbnRBdWRpbzsKKyAgICB9CisKKyAgICBBTE9HX0FTU0VSVCh5b3VuZ2VzdENsaWVudCAhPSAwLCAicmVtb3ZlQ2xpZW50KCkgcmVtb3ZlZCBjbGllbnQgbm8gY2FuZGlkYXRlIGZvdW5kIGZvciB0dW5lciIpOworCisgICAgc3RydWN0IHJhZGlvX2hhbF9iYW5kX2NvbmZpZyBoYWxDb25maWcgPSB5b3VuZ2VzdENsaWVudC0+aGFsQ29uZmlnKCk7CisgICAgcmV0ID0gbUh3RGV2aWNlLT5vcGVuX3R1bmVyKG1Id0RldmljZSwgJmhhbENvbmZpZywgeW91bmdlc3RDbGllbnQtPmF1ZGlvKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhZGlvU2VydmljZTo6Y2FsbGJhY2ssIG1vZHVsZUNsaWVudC0+Y2FsbGJhY2tUaHJlYWQoKS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhhbFR1bmVyKTsKKworICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICB5b3VuZ2VzdENsaWVudC0+c2V0VHVuZXIoaGFsVHVuZXIpOworICAgICAgICBpZiAoeW91bmdlc3RDbGllbnQtPmF1ZGlvKCkpIHsKKyAgICAgICAgICAgIG5vdGlmeURldmljZUNvbm5lY3Rpb24odHJ1ZSwgIiIpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZTo6c2V0TXV0ZShib29sIG11dGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobXV0ZSAhPSBtTXV0ZSkgeworICAgICAgICBtTXV0ZSA9IG11dGU7CisgICAgICAgIC8vVE9ETyBub3RpZmlmeSBhdWRpbyBwb2xpY3kgbWFuYWdlciBvZiBtZWRpYSBhY3Rpdml0eSBvbiByYWRpbyBhdWRpbyBkZXZpY2UKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZTo6Z2V0TXV0ZShib29sICptdXRlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgKm11dGUgPSBtTXV0ZTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKKworY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpSYWRpb1NlcnZpY2U6Ok1vZHVsZTo6Z2V0RGVmYXVsdENvbmZpZygpIGNvbnN0Cit7CisgICAgaWYgKG1Qcm9wZXJ0aWVzLm51bV9iYW5kcyA9PSAwKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gJm1Qcm9wZXJ0aWVzLmJhbmRzWzBdOworfQorCit2b2lkIFJhZGlvU2VydmljZTo6TW9kdWxlOjpub3RpZnlEZXZpY2VDb25uZWN0aW9uKGJvb2wgY29ubmVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzKSB7CisgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgQXVkaW9TeXN0ZW06OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0ZWQgPyBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCBrUmFkaW9UdW5lckF1ZGlvRGV2aWNlTmFtZSk7CisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7Cit9CisKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIlJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50IgorCitSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6TW9kdWxlQ2xpZW50KGNvbnN0IHNwPE1vZHVsZT4mIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVJhZGlvQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdWRpbykKKyA6IG1Nb2R1bGUobW9kdWxlKSwgbUNsaWVudChjbGllbnQpLCBtQ29uZmlnKCpjb25maWcpLCBtQXVkaW8oYXVkaW8pLCBtVHVuZXIoTlVMTCkKK3sKK30KKwordm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6b25GaXJzdFJlZigpCit7CisgICAgbUNhbGxiYWNrVGhyZWFkID0gbmV3IENhbGxiYWNrVGhyZWFkKHRoaXMpOworICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1DbGllbnQpLT5saW5rVG9EZWF0aCh0aGlzKTsKK30KKworUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6On5Nb2R1bGVDbGllbnQoKSB7CisgICAgaWYgKG1DbGllbnQgIT0gMCkgeworICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQ2xpZW50KS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICAgICAgbUNsaWVudC5jbGVhcigpOworICAgIH0KKyAgICBpZiAobUNhbGxiYWNrVGhyZWFkICE9IDApIHsKKyAgICAgICAgbUNhbGxiYWNrVGhyZWFkLT5leGl0KCk7CisgICAgfQorfQorCitzdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6ZHVtcChpbnQgZmQgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSB7CisgICAgU3RyaW5nOCByZXN1bHQ7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpkZXRhY2goKSB7CisgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBzcDxNb2R1bGVDbGllbnQ+IHN0cm9uZ01lID0gdGhpczsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKG1DbGllbnQgIT0gMCkgeworICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUNsaWVudCktPnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgICAgICAgICBtQ2xpZW50LmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBtTW9kdWxlLnByb21vdGUoKTsKKyAgICBpZiAobW9kdWxlID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtb2R1bGUtPnJlbW92ZUNsaWVudCh0aGlzKTsKK30KKworcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmhhbENvbmZpZygpIGNvbnN0Cit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOworICAgIHJldHVybiBtQ29uZmlnLmJhbmQ7Cit9CisKK2NvbnN0IHN0cnVjdCByYWRpb190dW5lciAqUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmdldFR1bmVyKCkgY29uc3QKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIG1UdW5lcjsKK30KKwordm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6c2V0VHVuZXIoY29uc3Qgc3RydWN0IHJhZGlvX3R1bmVyICp0dW5lcikKK3sKKyAgICBBTE9HVigiJXMgJXAiLCBfX0ZVTkNUSU9OX18sIHRoaXMpOworCisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIG1UdW5lciA9IHR1bmVyOworICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOworCisgICAgcmFkaW9faGFsX2V2ZW50X3QgZXZlbnQ7CisgICAgZXZlbnQudHlwZSA9IFJBRElPX0VWRU5UX0NPTlRST0w7CisgICAgZXZlbnQuc3RhdHVzID0gMDsKKyAgICBldmVudC5vbiA9IG1UdW5lciAhPSBOVUxMOworICAgIG1DYWxsYmFja1RocmVhZC0+c2VuZEV2ZW50KCZldmVudCk7CisgICAgQUxPR1YoIiVzIERPTkUiLCBfX0ZVTkNUSU9OX18pOworCit9CisKK3N0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpzZXRDb25maWd1cmF0aW9uKGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKQoreworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKKworICAgIGlmIChtVHVuZXIgIT0gTlVMTCkgeworICAgICAgICBzdHJ1Y3QgcmFkaW9faGFsX2JhbmRfY29uZmlnIGhhbENvbmZpZzsKKyAgICAgICAgaGFsQ29uZmlnID0gY29uZmlnLT5iYW5kOworICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT5zZXRfY29uZmlndXJhdGlvbihtVHVuZXIsICZoYWxDb25maWcpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBtQ29uZmlnID0gKmNvbmZpZzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1Db25maWcgPSAqY29uZmlnOworICAgICAgICBzdGF0dXMgPT0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmdldENvbmZpZ3VyYXRpb24oc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcpCit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOworCisgICAgaWYgKG1UdW5lciAhPSBOVUxMKSB7CisgICAgICAgIHN0cnVjdCByYWRpb19oYWxfYmFuZF9jb25maWcgaGFsQ29uZmlnOworICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT5nZXRfY29uZmlndXJhdGlvbihtVHVuZXIsICZoYWxDb25maWcpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBtQ29uZmlnLmJhbmQgPSBoYWxDb25maWc7CisgICAgICAgIH0KKyAgICB9CisgICAgKmNvbmZpZyA9IG1Db25maWc7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6c2V0TXV0ZShib29sIG11dGUpCit7CisgICAgc3A8TW9kdWxlPiBtb2R1bGU7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgaWYgKG1UdW5lciA9PSBOVUxMIHx8ICFtQXVkaW8pIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBtb2R1bGUgPSBtTW9kdWxlLnByb21vdGUoKTsKKyAgICAgICAgaWYgKG1vZHVsZSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgIH0KKyAgICBtb2R1bGUtPnNldE11dGUobXV0ZSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6Z2V0TXV0ZShib29sICptdXRlKQoreworICAgIHNwPE1vZHVsZT4gbW9kdWxlOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIG1vZHVsZSA9IG1Nb2R1bGUucHJvbW90ZSgpOworICAgICAgICBpZiAobW9kdWxlID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtb2R1bGUtPmdldE11dGUobXV0ZSk7Cit9CisKK3N0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpzY2FuKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCkKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmIChtVHVuZXIgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT5zY2FuKG1UdW5lciwgZGlyZWN0aW9uLCBza2lwU3ViQ2hhbm5lbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCkKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmIChtVHVuZXIgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT5zdGVwKG1UdW5lciwgZGlyZWN0aW9uLCBza2lwU3ViQ2hhbm5lbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50Ojp0dW5lKHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3ViQ2hhbm5lbCkKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmIChtVHVuZXIgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpbVR1bmVyLT50dW5lKG1UdW5lciwgY2hhbm5lbCwgc3ViQ2hhbm5lbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IFJhZGlvU2VydmljZTo6TW9kdWxlQ2xpZW50OjpjYW5jZWwoKQoreworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMgbG9ja2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKG1UdW5lciAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCltVHVuZXItPmNhbmNlbChtVHVuZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6Z2V0UHJvZ3JhbUluZm9ybWF0aW9uKHN0cnVjdCByYWRpb19wcm9ncmFtX2luZm8gKmluZm8pCit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyBsb2NrZWQiLCBfX0ZVTkNUSU9OX18pOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAobVR1bmVyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KW1UdW5lci0+Z2V0X3Byb2dyYW1faW5mb3JtYXRpb24obVR1bmVyLCBpbmZvKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6Omhhc0NvbnRyb2woYm9vbCAqaGFzQ29udHJvbCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgKmhhc0NvbnRyb2wgPSBtVHVuZXIgIT0gTlVMTDsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgUmFkaW9TZXJ2aWNlOjpNb2R1bGVDbGllbnQ6Om9uQ2FsbGJhY2tFdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpCit7CisgICAgaWYgKGV2ZW50TWVtb3J5ID09IDAgfHwgZXZlbnRNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxJUmFkaW9DbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgQUxPR1YoIiVzIGxvY2tlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJhZGlvX2V2ZW50X3QgKmV2ZW50ID0gKHJhZGlvX2V2ZW50X3QgKilldmVudE1lbW9yeS0+cG9pbnRlcigpOworICAgICAgICBzd2l0Y2ggKGV2ZW50LT50eXBlKSB7CisgICAgICAgIGNhc2UgUkFESU9fRVZFTlRfQ09ORklHOgorICAgICAgICAgICAgbUNvbmZpZy5iYW5kID0gZXZlbnQtPmNvbmZpZy5iYW5kOworICAgICAgICAgICAgZXZlbnQtPmNvbmZpZy5yZWdpb24gPSBtQ29uZmlnLnJlZ2lvbjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjbGllbnQgPSBtQ2xpZW50OworICAgIH0KKyAgICBpZiAoY2xpZW50ICE9IDApIHsKKyAgICAgICAgY2xpZW50LT5vbkV2ZW50KGV2ZW50TWVtb3J5KTsKKyAgICB9Cit9CisKKwordm9pZCBSYWRpb1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6YmluZGVyRGllZCgKKyAgICBjb25zdCB3cDxJQmluZGVyPiAmd2hvIF9fdW51c2VkKSB7CisgICAgQUxPR1coImNsaWVudCBiaW5kZXIgZGllZCBmb3IgY2xpZW50ICVwIiwgdGhpcyk7CisgICAgZGV0YWNoKCk7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9yYWRpby9SYWRpb1NlcnZpY2UuaCBiL3NlcnZpY2VzL3JhZGlvL1JhZGlvU2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZmVkYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9yYWRpby9SYWRpb1NlcnZpY2UuaApAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19TRVJWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9SQURJT19TRVJWSUNFX0gKKworI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorLy8jaW5jbHVkZSA8YmluZGVyL0FwcE9wc01hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUFwcE9wc0NhbGxiYWNrLmg+CisjaW5jbHVkZSA8cmFkaW8vSVJhZGlvU2VydmljZS5oPgorI2luY2x1ZGUgPHJhZGlvL0lSYWRpby5oPgorI2luY2x1ZGUgPHJhZGlvL0lSYWRpb0NsaWVudC5oPgorI2luY2x1ZGUgPHN5c3RlbS9yYWRpby5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL3JhZGlvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVtb3J5SGVhcEJhc2U7CisKK2NsYXNzIFJhZGlvU2VydmljZSA6CisgICAgcHVibGljIEJpbmRlclNlcnZpY2U8UmFkaW9TZXJ2aWNlPiwKKyAgICBwdWJsaWMgQm5SYWRpb1NlcnZpY2UKK3sKKyAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxSYWRpb1NlcnZpY2U+OworCitwdWJsaWM6CisgICAgY2xhc3MgTW9kdWxlQ2xpZW50OworICAgIGNsYXNzIE1vZHVsZTsKKworICAgIHN0YXRpYyBjaGFyIGNvbnN0KiBnZXRTZXJ2aWNlTmFtZSgpIHsgcmV0dXJuICJtZWRpYS5yYWRpbyI7IH0KKworICAgICAgICAgICAgICAgICAgICAgICAgUmFkaW9TZXJ2aWNlKCk7CisgICAgdmlydHVhbCAgICAgICAgICAgICB+UmFkaW9TZXJ2aWNlKCk7CisKKyAgICAvLyBJUmFkaW9TZXJ2aWNlCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyAqcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYXR0YWNoKHJhZGlvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3aXRoQXVkaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVJhZGlvPiYgcmFkaW8pOworCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKKworICAgIGNsYXNzIE1vZHVsZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgeworICAgIHB1YmxpYzoKKworICAgICAgIE1vZHVsZShyYWRpb19od19kZXZpY2UqIGh3RGV2aWNlLAorICAgICAgICAgICAgICBzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyBwcm9wZXJ0aWVzKTsKKworICAgICAgIHZpcnR1YWwgfk1vZHVsZSgpOworCisgICAgICAgICAgICAgICBzcDxNb2R1bGVDbGllbnQ+IGFkZENsaWVudChjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2JhbmRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhdWRpbyk7CisKKyAgICAgICAgICAgICAgIHZvaWQgcmVtb3ZlQ2xpZW50KGNvbnN0IHNwPE1vZHVsZUNsaWVudD4mIG1vZHVsZUNsaWVudCk7CisKKyAgICAgICAgICAgICAgIHN0YXR1c190IHNldE11dGUoYm9vbCBtdXRlKTsKKworICAgICAgICAgICAgICAgc3RhdHVzX3QgZ2V0TXV0ZShib29sICptdXRlKTsKKworICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworCisgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX2h3X2RldmljZSAqaHdEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtSHdEZXZpY2U7IH0KKyAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fcHJvcGVydGllcyBwcm9wZXJ0aWVzKCkgY29uc3QgeyByZXR1cm4gbVByb3BlcnRpZXM7IH0KKyAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmdldERlZmF1bHRDb25maWcoKSBjb25zdCA7CisKKyAgICBwcml2YXRlOgorCisgICAgICAgdm9pZCBub3RpZnlEZXZpY2VDb25uZWN0aW9uKGJvb2wgY29ubmVjdGVkLCBjb25zdCBjaGFyICphZGRyZXNzKTsKKworICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsgICAgICAgICAgLy8gcHJvdGVjdHMgIG1Nb2R1bGVDbGllbnRzCisgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19od19kZXZpY2UgICptSHdEZXZpY2U7ICAgICAvLyBIQUwgaGFyZHdhcmUgZGV2aWNlCisgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19wcm9wZXJ0aWVzIG1Qcm9wZXJ0aWVzOyAgICAvLyBjYWNoZWQgaGFyZHdhcmUgbW9kdWxlIHByb3BlcnRpZXMKKyAgICAgICAgVmVjdG9yPCBzcDxNb2R1bGVDbGllbnQ+ID4gICAgbU1vZHVsZUNsaWVudHM7IC8vIGxpc3Qgb2YgYXR0YWNoZWQgY2xpZW50cworICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICBtTXV0ZTsgICAgICAgICAgLy8gcmFkaW8gYXVkaW8gc291cmNlIHN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHVubXV0ZWQsIGF1ZGlvIGlzIHJvdXRlZCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dHB1dCBkZXZpY2Ugc2VsZWN0ZWQgZm9yIG1lZGlhIHVzZSBjYXNlLgorICAgIH07IC8vIGNsYXNzIE1vZHVsZQorCisgICAgY2xhc3MgQ2FsbGJhY2tUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgQ2FsbGJhY2tUaHJlYWQoY29uc3Qgd3A8TW9kdWxlQ2xpZW50PiYgbW9kdWxlQ2xpZW50KTsKKworICAgICAgICB2aXJ0dWFsIH5DYWxsYmFja1RocmVhZCgpOworCisKKyAgICAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCisgICAgICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7CisKKyAgICAgICAgLy8gUmVmQmFzZQorICAgICAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpOworCisgICAgICAgICAgICAgICAgdm9pZCBleGl0KCk7CisKKyAgICAgICAgICAgICAgICB2b2lkIHNlbmRFdmVudChyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpOworICAgICAgICAgICAgICAgIHNwPElNZW1vcnk+IHByZXBhcmVFdmVudChyYWRpb19oYWxfZXZlbnRfdCAqaGFsRXZlbnQpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgd3A8TW9kdWxlQ2xpZW50PiAgICAgIG1Nb2R1bGVDbGllbnQ7ICAgIC8vIGNsaWVudCBtb2R1bGUgdGhlIHRocmVhZCBiZWxvbmdzIHRvCisgICAgICAgIENvbmRpdGlvbiAgICAgICAgICAgICBtQ2FsbGJhY2tDb25kOyAgICAvLyBjb25kaXRpb24gc2lnbmFsZWQgd2hlbiBhIG5ldyBldmVudCBpcyBwb3N0ZWQKKyAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgIG1DYWxsYmFja0xvY2s7ICAgIC8vIHByb3RlY3RzIG1FdmVudFF1ZXVlCisgICAgICAgIFZlY3Rvcjwgc3A8SU1lbW9yeT4gPiBtRXZlbnRRdWV1ZTsgICAgICAvLyBwZW5kaW5nIGNhbGxiYWNrIGV2ZW50cworICAgICAgICBzcDxNZW1vcnlEZWFsZXI+ICAgICAgbU1lbW9yeURlYWxlcjsgICAgLy8gc2hhcmVkIG1lbW9yeSBmb3IgY2FsbGJhY2sgZXZlbnQKKyAgICB9OyAvLyBjbGFzcyBDYWxsYmFja1RocmVhZAorCisgICAgY2xhc3MgTW9kdWxlQ2xpZW50IDogcHVibGljIEJuUmFkaW8sCisgICAgICAgICAgICAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKKyAgICBwdWJsaWM6CisKKyAgICAgICBNb2R1bGVDbGllbnQoY29uc3Qgc3A8TW9kdWxlPiYgbW9kdWxlLAorICAgICAgICAgICAgICBjb25zdCBzcDxJUmFkaW9DbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICBib29sIGF1ZGlvKTsKKworICAgICAgIHZpcnR1YWwgfk1vZHVsZUNsaWVudCgpOworCisgICAgICAgLy8gSVJhZGlvCisgICAgICAgdmlydHVhbCB2b2lkIGRldGFjaCgpOworCisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDb25maWd1cmF0aW9uKGNvbnN0IHN0cnVjdCByYWRpb19iYW5kX2NvbmZpZyAqY29uZmlnKTsKKworICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q29uZmlndXJhdGlvbihzdHJ1Y3QgcmFkaW9fYmFuZF9jb25maWcgKmNvbmZpZyk7CisKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE11dGUoYm9vbCBtdXRlKTsKKworICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TXV0ZShib29sICptdXRlKTsKKworICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2NhbihyYWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGJvb2wgc2tpcFN1YkNoYW5uZWwpOworCisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGVwKHJhZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgYm9vbCBza2lwU3ViQ2hhbm5lbCk7CisKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IHR1bmUodW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBzdWJDaGFubmVsKTsKKworICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2FuY2VsKCk7CisKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2dyYW1JbmZvcm1hdGlvbihzdHJ1Y3QgcmFkaW9fcHJvZ3JhbV9pbmZvICppbmZvKTsKKworICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFzQ29udHJvbChib29sICpoYXNDb250cm9sKTsKKworICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOworCisgICAgICAgICAgICAgICBzcDxJUmFkaW9DbGllbnQ+IGNsaWVudCgpIGNvbnN0IHsgcmV0dXJuIG1DbGllbnQ7IH0KKyAgICAgICAgICAgICAgIHdwPE1vZHVsZT4gbW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbU1vZHVsZTsgfQorICAgICAgICAgICAgICAgcmFkaW9faGFsX2JhbmRfY29uZmlnX3QgaGFsQ29uZmlnKCkgY29uc3Q7CisgICAgICAgICAgICAgICBzcDxDYWxsYmFja1RocmVhZD4gY2FsbGJhY2tUaHJlYWQoKSBjb25zdCB7IHJldHVybiBtQ2FsbGJhY2tUaHJlYWQ7IH0KKyAgICAgICAgICAgICAgIHZvaWQgc2V0VHVuZXIoY29uc3Qgc3RydWN0IHJhZGlvX3R1bmVyICp0dW5lcik7CisgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcmFkaW9fdHVuZXIgKmdldFR1bmVyKCkgY29uc3Q7CisgICAgICAgICAgICAgICBib29sIGF1ZGlvKCkgY29uc3QgeyByZXR1cm4gbUF1ZGlvOyB9CisKKyAgICAgICAgICAgICAgIHZvaWQgb25DYWxsYmFja0V2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudCk7CisKKyAgICAgICB2aXJ0dWFsIHZvaWQgb25GaXJzdFJlZigpOworCisKKyAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCBpbXBsZW1lbnRhdGlvbgorICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmd2hvKTsKKworICAgIHByaXZhdGU6CisKKyAgICAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgICAgIG1Mb2NrOyAgICAgICAgICAgLy8gcHJvdGVjdHMgbUNsaWVudCwgbUNvbmZpZyBhbmQgbVR1bmVyCisgICAgICAgIHdwPE1vZHVsZT4gICAgICAgICAgICAgICAgICBtTW9kdWxlOyAgICAgICAgIC8vIFRoZSBtb2R1bGUgdGhpcyBjbGllbnQgaXMgYXR0YWNoZWQgdG8KKyAgICAgICAgc3A8SVJhZGlvQ2xpZW50PiAgICAgICAgICAgIG1DbGllbnQ7ICAgICAgICAgLy8gZXZlbnQgY2FsbGJhY2sgYmluZGVyIGludGVyZmFjZQorICAgICAgICByYWRpb19iYW5kX2NvbmZpZ190ICAgICAgICAgbUNvbmZpZzsgICAgICAgICAvLyBjdXJyZW50IGJhbmQgY29uZmlndXJhdGlvbgorICAgICAgICBzcDxDYWxsYmFja1RocmVhZD4gICAgICAgICAgbUNhbGxiYWNrVGhyZWFkOyAvLyBldmVudCBjYWxsYmFjayB0aHJlYWQKKyAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1BdWRpbzsKKyAgICAgICAgY29uc3Qgc3RydWN0IHJhZGlvX3R1bmVyICAgICptVHVuZXI7ICAgICAgICAvLyBIQUwgdHVuZXIgaW50ZXJmYWNlLiBOVUxMIGluZGljYXRlcyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjbGllbnQgZG9lcyBub3QgaGF2ZSBjb250cm9sIG9uIGFueQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR1bmVyCisgICAgfTsgLy8gY2xhc3MgTW9kdWxlQ2xpZW50CisKKworICAgIHN0YXRpYyB2b2lkIGNhbGxiYWNrKHJhZGlvX2hhbF9ldmVudF90ICpoYWxFdmVudCwgdm9pZCAqY29va2llKTsKKworcHJpdmF0ZToKKworICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0UmVmKCk7CisKKyAgICBzdGF0aWMgdm9pZCBjb252ZXJ0UHJvcGVydGllcyhyYWRpb19wcm9wZXJ0aWVzX3QgKnByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmFkaW9faGFsX3Byb3BlcnRpZXNfdCAqaGFsUHJvcGVydGllcyk7CisgICAgTXV0ZXggICAgICAgICAgICAgICBtU2VydmljZUxvY2s7ICAgLy8gcHJvdGVjdHMgbU1vZHVsZXMKKyAgICB2b2xhdGlsZSBpbnQzMl90ICAgIG1OZXh0VW5pcXVlSWQ7ICAvLyBmb3IgbW9kdWxlIElEIGFsbG9jYXRpb24KKyAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IHJhZGlvX2hhbmRsZV90LCBzcDxNb2R1bGU+ID4gbU1vZHVsZXM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1JBRElPX1NFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAppbmRleCAxMjJiMDA3Li5lNDI4Mzg4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcApAQCAtODA5LDYgKzgwOSw3IEBACiAgICAgICAgICAgICAgICAgbUh3RGV2aWNlLT5zdG9wX3JlY29nbml0aW9uKG1Id0RldmljZSwgbW9kZWwtPm1IYW5kbGUpOwogICAgICAgICAgICAgICAgIC8vIGtlZXAgbW9kZWwgaW4gQUNUSVZFIHN0YXRlIHNvIHRoYXQgZXZlbnQgaXMgcHJvY2Vzc2VkIGJ5IG9uQ2FsbGJhY2tFdmVudCgpCiAgICAgICAgICAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcGhyYXNlX3JlY29nbml0aW9uX2V2ZW50IHBocmFzZUV2ZW50OworICAgICAgICAgICAgICAgIG1lbXNldCgmcGhyYXNlRXZlbnQsIDAsIHNpemVvZihzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9waHJhc2VfcmVjb2duaXRpb25fZXZlbnQpKTsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1vZGVsLT5tVHlwZSkgewogICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTU9ERUxfVFlQRV9LRVlQSFJBU0U6CiAgICAgICAgICAgICAgICAgICAgIHBocmFzZUV2ZW50Lm51bV9waHJhc2VzID0gbW9kZWwtPm1Db25maWcubnVtX3BocmFzZXM7CmRpZmYgLS1naXQgYS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKaW5kZXggNzVmNjhiOC4uZTE0YTc3MSAxMDA2NDQKLS0tIGEvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCisrKyBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcApAQCAtNDAsNiArNDAsOCBAQAogICAgIFNFVF9DQVBUVVJFX1NUQVRFLAogfTsKIAorI2RlZmluZSBNQVhfSVRFTVNfUEVSX0xJU1QgMTAyNAorCiBjbGFzcyBCcFNvdW5kVHJpZ2dlckh3U2VydmljZTogcHVibGljIEJwSW50ZXJmYWNlPElTb3VuZFRyaWdnZXJId1NlcnZpY2U+CiB7CiBwdWJsaWM6CkBAIC0xMTYsMTAgKzExOCwxOCBAQAogICAgICAgICBjYXNlIExJU1RfTU9EVUxFUzogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXJId1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1Nb2R1bGVzUmVxID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChudW1Nb2R1bGVzUmVxID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7CisgICAgICAgICAgICAgICAgbnVtTW9kdWxlc1JlcSA9IE1BWF9JVEVNU19QRVJfTElTVDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1Nb2R1bGVzID0gbnVtTW9kdWxlc1JlcTsKICAgICAgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzID0KICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICopY2FsbG9jKG51bU1vZHVsZXNSZXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IpKTsKKyAgICAgICAgICAgIGlmIChtb2R1bGVzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihOT19NRU1PUlkpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxpc3RNb2R1bGVzKG1vZHVsZXMsICZudW1Nb2R1bGVzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihudW1Nb2R1bGVzKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Jlc2FtcGxlcl90b29scy9BbmRyb2lkLm1rIGIvdG9vbHMvcmVzYW1wbGVyX3Rvb2xzL0FuZHJvaWQubWsKaW5kZXggZThjYmUzOS4uYjU4ZTRjZCAxMDA2NDQKLS0tIGEvdG9vbHMvcmVzYW1wbGVyX3Rvb2xzL0FuZHJvaWQubWsKKysrIGIvdG9vbHMvcmVzYW1wbGVyX3Rvb2xzL0FuZHJvaWQubWsKQEAgLTEsNiArMSw2IEBACiAjIENvcHlyaWdodCAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICMKLSMgQW5kcm9pZC5tayBmb3IgcmVzYW1wbGVyX3Rvb2xzIAorIyBBbmRyb2lkLm1rIGZvciByZXNhbXBsZXJfdG9vbHMKICMKIAogCmRpZmYgLS1naXQgYS90b29scy9yZXNhbXBsZXJfdG9vbHMvZmlyLmNwcCBiL3Rvb2xzL3Jlc2FtcGxlcl90b29scy9maXIuY3BwCmluZGV4IDYyZWRkY2EuLmZlNGQyMTIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Jlc2FtcGxlcl90b29scy9maXIuY3BwCisrKyBiL3Rvb2xzL3Jlc2FtcGxlcl90b29scy9maXIuY3BwCkBAIC02NiwxOSArNjYsMjAgQEAKIAogc3RhdGljIHZvaWQgdXNhZ2UoY2hhciogbmFtZSkgewogICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgInVzYWdlOiAlcyBbLWhdIFstZF0gWy1zIHNhbXBsZV9yYXRlXSBbLWMgY3V0LW9mZl9mcmVxdWVuY3ldIFstbiBoYWxmX3plcm9fY3Jvc3NpbmdzXSIKKyAgICAgICAgICAgICJ1c2FnZTogJXMgWy1oXSBbLWRdIFstRF0gWy1zIHNhbXBsZV9yYXRlXSBbLWMgY3V0LW9mZl9mcmVxdWVuY3ldIFstbiBoYWxmX3plcm9fY3Jvc3NpbmdzXSIKICAgICAgICAgICAgICIgWy1mIHtmbG9hdHxmaXhlZHxmaXhlZDE2fV0gWy1iIGJldGFdIFstdiBkQkZTXSBbLWwgbGVycF1cbiIKLSAgICAgICAgICAgICIgICAgICAgJXMgWy1oXSBbLWRdIFstcyBzYW1wbGVfcmF0ZV0gWy1jIGN1dC1vZmZfZnJlcXVlbmN5XSBbLW4gaGFsZl96ZXJvX2Nyb3NzaW5nc10iCisgICAgICAgICAgICAiICAgICAgICVzIFstaF0gWy1kXSBbLURdIFstcyBzYW1wbGVfcmF0ZV0gWy1jIGN1dC1vZmZfZnJlcXVlbmN5XSBbLW4gaGFsZl96ZXJvX2Nyb3NzaW5nc10iCiAgICAgICAgICAgICAiIFstZiB7ZmxvYXR8Zml4ZWR8Zml4ZWQxNn1dIFstYiBiZXRhXSBbLXYgZEJGU10gLXAgTS9OXG4iCiAgICAgICAgICAgICAiICAgIC1oICAgIHRoaXMgaGVscCBtZXNzYWdlXG4iCiAgICAgICAgICAgICAiICAgIC1kICAgIGRlYnVnLCBwcmludCBjb21tYS1zZXBhcmF0ZWQgY29lZmZpY2llbnQgdGFibGVcbiIKKyAgICAgICAgICAgICIgICAgLUQgICAgZ2VuZXJhdGUgZXh0cmEgZGVjbGFyYXRpb25zXG4iCiAgICAgICAgICAgICAiICAgIC1wICAgIGdlbmVyYXRlIHBvbHktcGhhc2UgZmlsdGVyIGNvZWZmaWNpZW50cywgd2l0aCBzYW1wbGUgaW5jcmVtZW50IE0vTlxuIgogICAgICAgICAgICAgIiAgICAtcyAgICBzYW1wbGUgcmF0ZSAoNDgwMDApXG4iCiAgICAgICAgICAgICAiICAgIC1jICAgIGN1dC1vZmYgZnJlcXVlbmN5ICgyMDQ3OClcbiIKICAgICAgICAgICAgICIgICAgLW4gICAgbnVtYmVyIG9mIHplcm8tY3Jvc3NpbmdzIG9uIG9uZSBzaWRlICg4KVxuIgogICAgICAgICAgICAgIiAgICAtbCAgICBudW1iZXIgb2YgbGVycGluZyBiaXRzICg0KVxuIgogICAgICAgICAgICAgIiAgICAtbSAgICBudW1iZXIgb2YgcG9seXBoYXNlcyAocmVsYXRlZCB0byAtbCwgZGVmYXVsdCAxNilcbiIKLSAgICAgICAgICAgICIgICAgLWYgICAgb3V0cHV0IGZvcm1hdCwgY2FuIGJlIGZpeGVkLXBvaW50IG9yIGZsb2F0aW5nLXBvaW50IChmaXhlZClcbiIKKyAgICAgICAgICAgICIgICAgLWYgICAgb3V0cHV0IGZvcm1hdCwgY2FuIGJlIGZpeGVkLCBmaXhlZDE2LCBvciBmbG9hdCAoZml4ZWQpXG4iCiAgICAgICAgICAgICAiICAgIC1iICAgIGthaXNlciB3aW5kb3cgcGFyYW1ldGVyIGJldGEgKDcuODY1IFstODBkQl0pXG4iCiAgICAgICAgICAgICAiICAgIC12ICAgIGF0dGVudWF0aW9uIGluIGRCRlMgKDApXG4iLAogICAgICAgICAgICAgbmFtZSwgbmFtZQpAQCAtOTcsNyArOTgsOCBAQAogICAgIGRvdWJsZSBGcyA9IDQ4MDAwOwogICAgIGRvdWJsZSBGYyA9IDIwNDc4OwogICAgIGRvdWJsZSBhdHRlbiA9IDE7Ci0gICAgaW50IGZvcm1hdCA9IDA7CisgICAgaW50IGZvcm1hdCA9IDA7ICAgICAvLyAwPWZpeGVkLCAxPWZsb2F0CisgICAgYm9vbCBkZWNsYXJhdGlvbnMgPSBmYWxzZTsKIAogICAgIC8vIGluIG9yZGVyIHRvIGtlZXAgdGhlIGVycm9ycyBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmVhcgogICAgIC8vIGludGVycG9sYXRpb24gb2YgdGhlIGNvZWZmaWNpZW50cyBiZWxvdyB0aGUgcXVhbnRpemF0aW9uIGVycm9yCkBAIC0xNTgsMTEgKzE2MCwxNCBAQAogCiAgICAgaW50IE0gPSAxIDw8IDQ7IC8vIG51bWJlciBvZiBwaGFzZXMgZm9yIGludGVycG9sYXRpb24KICAgICBpbnQgY2g7Ci0gICAgd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiOmhkczpjOm46ZjpsOm06YjpwOnY6ejoiKSkgIT0gLTEpIHsKKyAgICB3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICI6aGRzOmM6bjpmOmw6bTpiOnA6djp6OkQiKSkgIT0gLTEpIHsKICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgICAgICAgZGVidWcgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnRCc6CisgICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgJ3AnOgogICAgICAgICAgICAgICAgIGlmIChzc2NhbmYob3B0YXJnLCAiJXUvJXUiLCAmcG9seU0sICZwb2x5TikgIT0gMikgewogICAgICAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKQEAgLTIyNSwyNCArMjMwLDI2IEBACiAgICAgZm9yIChpbnQgaSA9IE0tMSA7IGk7IGk+Pj0xLCBueisrKTsKICAgICAvLyBnZW5lcmF0ZSB0aGUgcmlnaHQgaGFsZiBvZiB0aGUgZmlsdGVyCiAgICAgaWYgKCFkZWJ1ZykgewotICAgICAgICBwcmludGYoIi8vIGNtZC1saW5lOiAiKTsKLSAgICAgICAgZm9yIChpbnQgaT0xIDsgaTxhcmdjIDsgaSsrKSB7Ci0gICAgICAgICAgICBwcmludGYoIiVzICIsIGFyZ3ZbaV0pOworICAgICAgICBwcmludGYoIi8vIGNtZC1saW5lOiIpOworICAgICAgICBmb3IgKGludCBpPTAgOyBpPGFyZ2MgOyBpKyspIHsKKyAgICAgICAgICAgIHByaW50ZigiICVzIiwgYXJndltpXSk7CiAgICAgICAgIH0KICAgICAgICAgcHJpbnRmKCJcbiIpOwotICAgICAgICBpZiAoIXBvbHlwaGFzZSkgewotICAgICAgICAgICAgcHJpbnRmKCJjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9TSVpFICAgICAgICAgICA9ICVkO1xuIiwgTik7Ci0gICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX0lOVF9QSEFTRVMgICAgID0gJWQ7XG4iLCBNKTsKLSAgICAgICAgICAgIHByaW50ZigiY29uc3QgaW50MzJfdCBSRVNBTVBMRV9GSVJfTlVNX0NPRUYgICAgICAgPSAlZDtcbiIsIG56Yyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX1NJWkUgICAgICAgICAgID0gJWQ7XG4iLCAyKm56Yypwb2x5Tik7Ci0gICAgICAgICAgICBwcmludGYoImNvbnN0IGludDMyX3QgUkVTQU1QTEVfRklSX05VTV9DT0VGICAgICAgID0gJWQ7XG4iLCAyKm56Yyk7CisgICAgICAgIGlmIChkZWNsYXJhdGlvbnMpIHsKKyAgICAgICAgICAgIGlmICghcG9seXBoYXNlKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9TSVpFICAgICAgICAgICA9ICVkO1xuIiwgTik7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9JTlRfUEhBU0VTICAgICA9ICVkO1xuIiwgTSk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9OVU1fQ09FRiAgICAgICA9ICVkO1xuIiwgbnpjKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9TSVpFICAgICAgICAgICA9ICVkO1xuIiwgMipuemMqcG9seU4pOworICAgICAgICAgICAgICAgIHByaW50ZigiY29uc3QgaW50MzJfdCBSRVNBTVBMRV9GSVJfTlVNX0NPRUYgICAgICAgPSAlZDtcbiIsIDIqbnpjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZm9ybWF0KSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJjb25zdCBpbnQzMl90IFJFU0FNUExFX0ZJUl9DT0VGX0JJVFMgICAgICA9ICVkO1xuIiwgbmMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICAgICAgcHJpbnRmKCJzdGF0aWMgJXMgcmVzYW1wbGVGSVJbXSA9IHsiLCAhZm9ybWF0ID8gImludDMyX3QiIDogImZsb2F0Iik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFmb3JtYXQpIHsKLSAgICAgICAgICAgIHByaW50ZigiY29uc3QgaW50MzJfdCBSRVNBTVBMRV9GSVJfQ09FRl9CSVRTICAgICAgPSAlZDtcbiIsIG5jKTsKLSAgICAgICAgfQotICAgICAgICBwcmludGYoIlxuIik7Ci0gICAgICAgIHByaW50Zigic3RhdGljICVzIHJlc2FtcGxlRklSW10gPSB7IiwgIWZvcm1hdCA/ICJpbnQzMl90IiA6ICJmbG9hdCIpOwogICAgIH0KIAogICAgIGlmICghcG9seXBoYXNlKSB7CkBAIC0yNjAsMTIgKzI2NywxNSBAQAogICAgICAgICAgICAgICAgIGlmICghZm9ybWF0KSB7CiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgeWkgPSB0b2ludCh5LCAxVUxMPDwobmMtMSkpOwogICAgICAgICAgICAgICAgICAgICBpZiAobmMgPiAxNikgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwOHgsICIsIGludDMyX3QoeWkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiMHglMDh4LCIsIGludDMyX3QoeWkpKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiMHglMDR4LCAiLCBpbnQzMl90KHlpKSYweGZmZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwNHgsIiwgaW50MzJfdCh5aSkmMHhmZmZmKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiJS45ZyVzICIsIHksIGRlYnVnID8gIiwiIDogImYsIik7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJS45ZyVzIiwgeSwgZGVidWcgPyAiLCIgOiAiZiwiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGogIT0gbnpjLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yODMsMjMgKzI5MywyMiBAQAogICAgICAgICAgICAgICAgIGlmICghZm9ybWF0KSB7CiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgeWkgPSB0b2ludCh5LCAxVUxMPDwobmMtMSkpOwogICAgICAgICAgICAgICAgICAgICBpZiAobmMgPiAxNikgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwOHgsICIsIGludDMyX3QoeWkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiMHglMDh4LCIsIGludDMyX3QoeWkpKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiMHglMDR4LCAiLCBpbnQzMl90KHlpKSYweGZmZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIweCUwNHgsIiwgaW50MzJfdCh5aSkmMHhmZmZmKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiJS45ZyVzIiwgeSwgZGVidWcgPyAiIiA6ICJmIik7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJS45ZyVzIiwgeSwgZGVidWcgPyAiLCIgOiAiZiwiKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoZGVidWcgJiYgKGk9PW56Yy0xKSkgewotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiLCAiKTsKKyAgICAgICAgICAgICAgICBpZiAoaSAhPSBuemMtMSkgeworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAiKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIWRlYnVnKSB7CisgICAgaWYgKCFkZWJ1ZyAmJiBkZWNsYXJhdGlvbnMpIHsKICAgICAgICAgcHJpbnRmKCJcbn07Iik7CiAgICAgfQogICAgIHByaW50ZigiXG4iKTsK